From 399ffe621219b9c420eff3d752ce128fb31cef12 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Thu, 9 Feb 2017 12:14:52 +0000 Subject: [PATCH 01/22] Re #18722 Add facility to rotate detectors There is a new property, 'CorrectionType', which specifies whether detectors should be shifted vertically or rotated around the sample position. --- .../SpecularReflectionPositionCorrect2.cpp | 57 +++++++++++++++++-- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp b/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp index c45b91c16a5d..33c623d4d6f6 100644 --- a/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp +++ b/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp @@ -4,12 +4,19 @@ #include "MantidGeometry/Instrument/ReferenceFrame.h" #include "MantidKernel/BoundedValidator.h" #include "MantidKernel/CompositeValidator.h" +#include "MantidKernel/ListValidator.h" #include "MantidKernel/MandatoryValidator.h" using namespace Mantid::API; using namespace Mantid::Geometry; using namespace Mantid::Kernel; +// anonymous namespace +namespace { +#define VERTICAL "VerticalShift" +#define ROTATION "RotateAroundSample" +} // anonymous namespace + namespace Mantid { namespace Algorithms { @@ -24,7 +31,7 @@ const std::string SpecularReflectionPositionCorrect2::name() const { /// Algorithm's summary. @see Algorithm::summary const std::string SpecularReflectionPositionCorrect2::summary() const { - return "Corrects a detector component vertically based on TwoTheta."; + return "Corrects a detector component's position based on TwoTheta."; } /// Algorithm's version for identification. @see Algorithm::version @@ -55,6 +62,18 @@ void SpecularReflectionPositionCorrect2::init() { thetaValidator, Direction::Input), "Angle used to correct the detector component."); + const std::vector correctionType{VERTICAL, ROTATION}; + auto correctionTypeValidator = boost::make_shared(); + correctionTypeValidator->add( + boost::make_shared>()); + correctionTypeValidator->add( + boost::make_shared(correctionType)); + declareProperty( + "CorrectionType", correctionType[0], correctionTypeValidator, + "Whether detectors should be shifted vertically or rotated around the " + "sample position.", + Direction::Input); + declareProperty( Mantid::Kernel::make_unique>( "DetectorComponentName", "", @@ -103,6 +122,9 @@ void SpecularReflectionPositionCorrect2::exec() { IComponent_const_sptr sample = inst->getComponentByName(sampleName); const V3D samplePosition = sample->getPos(); + // Type of movement (vertical shift or rotation around the sample) + const std::string correctionType = getProperty("CorrectionType"); + // Sample-to-detector const V3D sampleToDetector = detectorPosition - samplePosition; // Reference frame @@ -111,19 +133,42 @@ void SpecularReflectionPositionCorrect2::exec() { auto horizontalAxis = referenceFrame->pointingHorizontalAxis(); auto upAxis = referenceFrame->pointingUpAxis(); - // We just recalculate beam offset. - const double beamOffset = + // Get the offset from the sample in the beam direction + double beamOffset = 0.0; + const double beamOffsetOld = sampleToDetector.scalar_prod(referenceFrame->vecPointingAlongBeam()); - // We only correct vertical position + + if (correctionType == VERTICAL) { + // Only shifting vertically, so the beam offset remains the same + beamOffset = beamOffsetOld; + } else if (correctionType == ROTATION) { + // The radius for the rotation is the distance from the sample to + // the detector in the Beam-Vertical plane + const double upOffsetOld = + sampleToDetector.scalar_prod(referenceFrame->vecPointingUp()); + const double radius = + std::sqrt(beamOffsetOld * beamOffsetOld + upOffsetOld * upOffsetOld); + beamOffset = radius * std::cos(twoThetaInRad); + } else { + // Shouldn't get here unless there's been a coding error + std::ostringstream message; + message << "Invalid correction type '" << correctionType; + throw std::runtime_error(message.str()); + } + + // Calculate the offset in the vertical direction, and the total + // offset in the beam direction const double upOffset = (beamOffset * std::tan(twoThetaInRad)); + const double beamOffsetFromOrigin = + beamOffset + + samplePosition.scalar_prod(referenceFrame->vecPointingAlongBeam()); auto moveAlg = createChildAlgorithm("MoveInstrumentComponent"); moveAlg->initialize(); moveAlg->setProperty("Workspace", outWS); moveAlg->setProperty("ComponentName", detectorName); moveAlg->setProperty("RelativePosition", false); - moveAlg->setProperty(beamAxis, detectorPosition.scalar_prod( - referenceFrame->vecPointingAlongBeam())); + moveAlg->setProperty(beamAxis, beamOffsetFromOrigin); moveAlg->setProperty(horizontalAxis, 0.0); moveAlg->setProperty(upAxis, upOffset); moveAlg->execute(); From d1f986b172f1270c44150879488742490e60f493 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Thu, 9 Feb 2017 15:40:30 +0000 Subject: [PATCH 02/22] Re #18722 Update documentation and doc tests --- .../SpecularReflectionPositionCorrect-v2.rst | 68 ++++++++++++------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/docs/source/algorithms/SpecularReflectionPositionCorrect-v2.rst b/docs/source/algorithms/SpecularReflectionPositionCorrect-v2.rst index be5f1de144aa..804e07c1438e 100644 --- a/docs/source/algorithms/SpecularReflectionPositionCorrect-v2.rst +++ b/docs/source/algorithms/SpecularReflectionPositionCorrect-v2.rst @@ -9,9 +9,10 @@ Description ----------- -Moves the specified detector component vertically so that the angle between the beam and +Moves the specified detector component so that the angle between the beam and the sample-to-detector vector is :literal:`TwoTheta`. The detector component is moved as a -block. The rest of the instrument components remain in the original position. +block. The rest of the instrument components remain in the original position. The component +can be shifted vertically (default), or rotated around the sample position. Previous Versions ----------------- @@ -27,64 +28,85 @@ Usage .. testcode:: SpecularReflectionPositionCorrectPointDetector + print 'point-detector' polref = Load(Filename=r'POLREF00004699.raw', PeriodList=1) polref = polref[0] instr = polref.getInstrument() - print instr.getComponentByName('point-detector').getPos() + print 'Original position: ' + str(instr.getComponentByName('point-detector').getPos()) - polref = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='point-detector') - instr = polref.getInstrument() - print instr.getComponentByName('point-detector').getPos() + polref_vert = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='point-detector', CorrectionType='VerticalShift') + instr = polref_vert.getInstrument() + print 'Vertical shift: ' + str(instr.getComponentByName('point-detector').getPos()) + + polref_rot = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='point-detector', CorrectionType='RotateAroundSample') + instr = polref_rot.getInstrument() + print 'Rotated: ' + str(instr.getComponentByName('point-detector').getPos()) Output: .. testoutput:: SpecularReflectionPositionCorrectPointDetector - - [25.6,0,0.0444961] - [25.6,0,0.0444753] + + point-detector + Original position: [25.6,0,0.0444961] + Vertical shift: [25.6,0,0.0444753] + Rotated: [25.6,0,0.0444753] **Example - Correct 'lineardetector'** .. testcode:: SpecularReflectionPositionCorrectLinearDetector + print 'lineardetector' polref = Load(Filename=r'POLREF00004699.raw', PeriodList=1) polref = polref[0] instr = polref.getInstrument() - print instr.getComponentByName('lineardetector').getPos() + print 'Original position: ' + str(instr.getComponentByName('lineardetector').getPos()) - polref = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='lineardetector') - instr = polref.getInstrument() - print instr.getComponentByName('lineardetector').getPos() + polref_vert = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='lineardetector') + instr = polref_vert.getInstrument() + print 'Vertical shift: ' + str(instr.getComponentByName('lineardetector').getPos()) + + polref_rot = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='lineardetector', CorrectionType='RotateAroundSample') + instr = polref_rot.getInstrument() + print 'Rotated: ' + str(instr.getComponentByName('lineardetector').getPos()) Output: .. testoutput:: SpecularReflectionPositionCorrectLinearDetector - - [26,0,0] - [26,0,0.0513177] + + lineardetector + Original position: [26,0,0] + Vertical shift: [26,0,0.0513177] + Rotated: [25.9996,0,0.0513102] **Example - Correct 'OSMOND'** .. testcode:: SpecularReflectionPositionCorrectOSMONDDetector + print 'OSMOND' polref = Load(Filename=r'POLREF00004699.raw', PeriodList=1) polref = polref[0] instr = polref.getInstrument() - print instr.getComponentByName('OSMOND').getPos() + print 'Original position: ' + str(instr.getComponentByName('OSMOND').getPos()) - polref = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='OSMOND') - instr = polref.getInstrument() - print instr.getComponentByName('OSMOND').getPos() + polref_vert = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='OSMOND') + instr = polref_vert.getInstrument() + print 'Vertical shift: ' + str(instr.getComponentByName('OSMOND').getPos()) + + polref_rot = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='OSMOND', CorrectionType='RotateAroundSample') + instr = polref_rot.getInstrument() + print 'Rotated: ' + str(instr.getComponentByName('OSMOND').getPos()) Output: .. testoutput:: SpecularReflectionPositionCorrectOSMONDDetector - - [26,0,0] - [26,0,0.0513177] + + OSMOND + Original position: [26,0,0] + Vertical shift: [26,0,0.0513177] + Rotated: [25.9996,0,0.0513102] .. categories:: From 157b1308ecc4c525a42f94caf4c0b58a60c98e9e Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Thu, 9 Feb 2017 16:57:11 +0000 Subject: [PATCH 03/22] Re #18722 Add unit tests for rotate detectors --- .../SpecularReflectionPositionCorrect2Test.h | 69 ++++++++++++++++++- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/Framework/Algorithms/test/SpecularReflectionPositionCorrect2Test.h b/Framework/Algorithms/test/SpecularReflectionPositionCorrect2Test.h index a2ed9a1c272b..3fe66196139b 100644 --- a/Framework/Algorithms/test/SpecularReflectionPositionCorrect2Test.h +++ b/Framework/Algorithms/test/SpecularReflectionPositionCorrect2Test.h @@ -77,7 +77,9 @@ class SpecularReflectionPositionCorrect2Test : public CxxTest::TestSuite { TS_ASSERT_THROWS_ANYTHING(alg.execute()); } - void test_correct_point_detector() { + void test_correct_point_detector_vertical_shift_default() { + // Omit the CorrectionType property to check that a vertical shift + // is done by default SpecularReflectionPositionCorrect2 alg; alg.initialize(); alg.setChild(true); @@ -105,12 +107,43 @@ class SpecularReflectionPositionCorrect2Test : public CxxTest::TestSuite { TS_ASSERT_DELTA(detOut.Y(), 0.06508, 1e-5); } - void test_correct_linear_detector() { + void test_correct_point_detector_rotation() { SpecularReflectionPositionCorrect2 alg; alg.initialize(); alg.setChild(true); alg.setProperty("InputWorkspace", m_interWS); alg.setProperty("TwoTheta", 1.4); + alg.setProperty("CorrectionType", "RotateAroundSample"); + alg.setProperty("DetectorComponentName", "point-detector"); + alg.setPropertyValue("OutputWorkspace", "test_out"); + TS_ASSERT_THROWS_NOTHING(alg.execute()); + MatrixWorkspace_sptr outWS = alg.getProperty("OutputWorkspace"); + + TS_ASSERT(outWS); + + auto instrIn = m_interWS->getInstrument(); + auto instrOut = outWS->getInstrument(); + + // Sample should not have moved + auto sampleIn = instrIn->getSample()->getPos(); + auto sampleOut = instrOut->getSample()->getPos(); + TS_ASSERT_EQUALS(sampleIn, sampleOut); + // 'point-detector' should have been moved both vertically and in + // the beam direction + auto detIn = instrIn->getComponentByName("point-detector")->getPos(); + auto detOut = instrOut->getComponentByName("point-detector")->getPos(); + TS_ASSERT_EQUALS(detIn.X(), detOut.X()); + TS_ASSERT_DELTA(detOut.Z(), 19.69921, 1e-5); + TS_ASSERT_DELTA(detOut.Y(), 0.06506, 1e-5); + } + + void test_correct_linear_detector_vertical_shift() { + SpecularReflectionPositionCorrect2 alg; + alg.initialize(); + alg.setChild(true); + alg.setProperty("InputWorkspace", m_interWS); + alg.setProperty("TwoTheta", 1.4); + alg.setProperty("CorrectionType", "VerticalShift"); alg.setProperty("DetectorComponentName", "linear-detector"); alg.setPropertyValue("OutputWorkspace", "test_out"); TS_ASSERT_THROWS_NOTHING(alg.execute()); @@ -125,13 +158,43 @@ class SpecularReflectionPositionCorrect2Test : public CxxTest::TestSuite { auto sampleIn = instrIn->getSample()->getPos(); auto sampleOut = instrOut->getSample()->getPos(); TS_ASSERT_EQUALS(sampleIn, sampleOut); - // 'point-detector' should have been moved vertically only + // 'linear-detector' should have been moved vertically only auto detIn = instrIn->getComponentByName("linear-detector")->getPos(); auto detOut = instrOut->getComponentByName("linear-detector")->getPos(); TS_ASSERT_EQUALS(detIn.X(), detOut.X()); TS_ASSERT_EQUALS(detIn.Z(), detOut.Z()); TS_ASSERT_DELTA(detOut.Y(), 0.07730, 1e-5); } + + void test_correct_linear_detector_rotation() { + SpecularReflectionPositionCorrect2 alg; + alg.initialize(); + alg.setChild(true); + alg.setProperty("InputWorkspace", m_interWS); + alg.setProperty("TwoTheta", 1.4); + alg.setProperty("CorrectionType", "RotateAroundSample"); + alg.setProperty("DetectorComponentName", "linear-detector"); + alg.setPropertyValue("OutputWorkspace", "test_out"); + TS_ASSERT_THROWS_NOTHING(alg.execute()); + MatrixWorkspace_sptr outWS = alg.getProperty("OutputWorkspace"); + + TS_ASSERT(outWS); + + auto instrIn = m_interWS->getInstrument(); + auto instrOut = outWS->getInstrument(); + + // Sample should not have moved + auto sampleIn = instrIn->getSample()->getPos(); + auto sampleOut = instrOut->getSample()->getPos(); + TS_ASSERT_EQUALS(sampleIn, sampleOut); + // 'linear-detector' should have been moved both vertically and in + // the beam direction + auto detIn = instrIn->getComponentByName("linear-detector")->getPos(); + auto detOut = instrOut->getComponentByName("linear-detector")->getPos(); + TS_ASSERT_EQUALS(detIn.X(), detOut.X()); + TS_ASSERT_DELTA(detOut.Z(), 20.19906, 1e-5); + TS_ASSERT_DELTA(detOut.Y(), 0.07728, 1e-5); + } }; #endif /* MANTID_ALGORITHMS_SPECULARREFLECTIONPOSITIONCORRECT2TEST_H_ */ From 5b47b2da8397571be68253e1a0f7d87baa6caf17 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Thu, 9 Feb 2017 17:34:50 +0000 Subject: [PATCH 04/22] Re #18722 Reduce duplicated code in unit tests --- .../SpecularReflectionPositionCorrect2Test.h | 76 ++++++++----------- 1 file changed, 33 insertions(+), 43 deletions(-) diff --git a/Framework/Algorithms/test/SpecularReflectionPositionCorrect2Test.h b/Framework/Algorithms/test/SpecularReflectionPositionCorrect2Test.h index 3fe66196139b..c99c0ff09af3 100644 --- a/Framework/Algorithms/test/SpecularReflectionPositionCorrect2Test.h +++ b/Framework/Algorithms/test/SpecularReflectionPositionCorrect2Test.h @@ -17,6 +17,31 @@ class SpecularReflectionPositionCorrect2Test : public CxxTest::TestSuite { private: MatrixWorkspace_sptr m_interWS; + // Initialise the algorithm and set the properties + void setupAlgorithm(SpecularReflectionPositionCorrect2 &alg, + const double twoTheta, const std::string &correctionType, + const std::string &detectorName) { + if (!alg.isInitialized()) + alg.initialize(); + alg.setChild(true); + alg.setProperty("InputWorkspace", m_interWS); + alg.setProperty("TwoTheta", twoTheta); + if (!correctionType.empty()) + alg.setProperty("CorrectionType", correctionType); + if (!detectorName.empty()) + alg.setProperty("DetectorComponentName", detectorName); + alg.setPropertyValue("OutputWorkspace", "test_out"); + } + + // Run the algorithm and do some basic checks. Returns the output workspace. + MatrixWorkspace_const_sptr + runAlgorithm(SpecularReflectionPositionCorrect2 &alg) { + TS_ASSERT_THROWS_NOTHING(alg.execute()); + MatrixWorkspace_sptr outWS = alg.getProperty("OutputWorkspace"); + TS_ASSERT(outWS); + return outWS; + } + public: // This pair of boilerplate methods prevent the suite being created statically // This means the constructor isn't called when running other tests @@ -81,16 +106,8 @@ class SpecularReflectionPositionCorrect2Test : public CxxTest::TestSuite { // Omit the CorrectionType property to check that a vertical shift // is done by default SpecularReflectionPositionCorrect2 alg; - alg.initialize(); - alg.setChild(true); - alg.setProperty("InputWorkspace", m_interWS); - alg.setProperty("TwoTheta", 1.4); - alg.setProperty("DetectorComponentName", "point-detector"); - alg.setPropertyValue("OutputWorkspace", "test_out"); - TS_ASSERT_THROWS_NOTHING(alg.execute()); - MatrixWorkspace_sptr outWS = alg.getProperty("OutputWorkspace"); - - TS_ASSERT(outWS); + setupAlgorithm(alg, 1.4, "", "point-detector"); + MatrixWorkspace_const_sptr outWS = runAlgorithm(alg); auto instrIn = m_interWS->getInstrument(); auto instrOut = outWS->getInstrument(); @@ -109,17 +126,8 @@ class SpecularReflectionPositionCorrect2Test : public CxxTest::TestSuite { void test_correct_point_detector_rotation() { SpecularReflectionPositionCorrect2 alg; - alg.initialize(); - alg.setChild(true); - alg.setProperty("InputWorkspace", m_interWS); - alg.setProperty("TwoTheta", 1.4); - alg.setProperty("CorrectionType", "RotateAroundSample"); - alg.setProperty("DetectorComponentName", "point-detector"); - alg.setPropertyValue("OutputWorkspace", "test_out"); - TS_ASSERT_THROWS_NOTHING(alg.execute()); - MatrixWorkspace_sptr outWS = alg.getProperty("OutputWorkspace"); - - TS_ASSERT(outWS); + setupAlgorithm(alg, 1.4, "RotateAroundSample", "point-detector"); + MatrixWorkspace_const_sptr outWS = runAlgorithm(alg); auto instrIn = m_interWS->getInstrument(); auto instrOut = outWS->getInstrument(); @@ -139,17 +147,8 @@ class SpecularReflectionPositionCorrect2Test : public CxxTest::TestSuite { void test_correct_linear_detector_vertical_shift() { SpecularReflectionPositionCorrect2 alg; - alg.initialize(); - alg.setChild(true); - alg.setProperty("InputWorkspace", m_interWS); - alg.setProperty("TwoTheta", 1.4); - alg.setProperty("CorrectionType", "VerticalShift"); - alg.setProperty("DetectorComponentName", "linear-detector"); - alg.setPropertyValue("OutputWorkspace", "test_out"); - TS_ASSERT_THROWS_NOTHING(alg.execute()); - MatrixWorkspace_sptr outWS = alg.getProperty("OutputWorkspace"); - - TS_ASSERT(outWS); + setupAlgorithm(alg, 1.4, "VerticalShift", "linear-detector"); + MatrixWorkspace_const_sptr outWS = runAlgorithm(alg); auto instrIn = m_interWS->getInstrument(); auto instrOut = outWS->getInstrument(); @@ -168,17 +167,8 @@ class SpecularReflectionPositionCorrect2Test : public CxxTest::TestSuite { void test_correct_linear_detector_rotation() { SpecularReflectionPositionCorrect2 alg; - alg.initialize(); - alg.setChild(true); - alg.setProperty("InputWorkspace", m_interWS); - alg.setProperty("TwoTheta", 1.4); - alg.setProperty("CorrectionType", "RotateAroundSample"); - alg.setProperty("DetectorComponentName", "linear-detector"); - alg.setPropertyValue("OutputWorkspace", "test_out"); - TS_ASSERT_THROWS_NOTHING(alg.execute()); - MatrixWorkspace_sptr outWS = alg.getProperty("OutputWorkspace"); - - TS_ASSERT(outWS); + setupAlgorithm(alg, 1.4, "RotateAroundSample", "linear-detector"); + MatrixWorkspace_const_sptr outWS = runAlgorithm(alg); auto instrIn = m_interWS->getInstrument(); auto instrOut = outWS->getInstrument(); From c9ff0d8f6d80ea957cdb6ab06b295fc5ac368947 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Fri, 10 Feb 2017 12:26:28 +0000 Subject: [PATCH 05/22] Re #18722 Expose CorrectionType in ReflectometryReductionOneAuto2 --- .../src/ReflectometryReductionOneAuto2.cpp | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp b/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp index 390a518b096e..20975c38c22b 100644 --- a/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp +++ b/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp @@ -3,8 +3,16 @@ #include "MantidAPI/WorkspaceGroup.h" #include "MantidAlgorithms/BoostOptionalToAlgorithmProperty.h" #include "MantidKernel/ArrayProperty.h" +#include "MantidKernel/CompositeValidator.h" #include "MantidKernel/ListValidator.h" #include "MantidKernel/make_unique.h" +#include "MantidKernel/MandatoryValidator.h" + +// anonymous namespace +namespace { +#define VERTICAL "VerticalShift" +#define ROTATION "RotateAroundSample" +} // anonymous namespace namespace Mantid { namespace Algorithms { @@ -130,6 +138,19 @@ void ReflectometryReductionOneAuto2::init() { declareProperty("ThetaIn", Mantid::EMPTY_DBL(), "Angle in degrees", Direction::Input); + // Detector position correction type + const std::vector correctionType{VERTICAL, ROTATION}; + auto correctionTypeValidator = boost::make_shared(); + correctionTypeValidator->add( + boost::make_shared>()); + correctionTypeValidator->add( + boost::make_shared(correctionType)); + declareProperty( + "CorrectionType", correctionType[0], correctionTypeValidator, + "Whether detectors should be shifted vertically or rotated around the " + "sample position.", + Direction::Input); + // Wavelength limits declareProperty("WavelengthMin", Mantid::EMPTY_DBL(), "Wavelength Min in angstroms", Direction::Input); @@ -304,7 +325,8 @@ std::vector ReflectometryReductionOneAuto2::getDetectorNames( return detectors; } -/** Correct an instrument component vertically. +/** Correct an instrument component by shifting it vertically or +* rotating it around the sample. * * @param instructions :: processing instructions defining the detectors of * interest @@ -326,6 +348,7 @@ MatrixWorkspace_sptr ReflectometryReductionOneAuto2::correctDetectorPositions( detectorsOfInterest.end()); const double theta = getProperty("ThetaIn"); + const std::string correctionType = getProperty("CorrectionType"); MatrixWorkspace_sptr corrected = inputWS; @@ -334,6 +357,7 @@ MatrixWorkspace_sptr ReflectometryReductionOneAuto2::correctDetectorPositions( createChildAlgorithm("SpecularReflectionPositionCorrect"); alg->setProperty("InputWorkspace", corrected); alg->setProperty("TwoTheta", theta * 2); + alg->setProperty("CorrectionType", correctionType); alg->setProperty("DetectorComponentName", detector); alg->execute(); corrected = alg->getProperty("OutputWorkspace"); From 3280fe0d20a9574a3b80166a929695cfa055ec29 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Fri, 10 Feb 2017 18:10:25 +0000 Subject: [PATCH 06/22] Re #18722 Remove define statements --- .../src/ReflectometryReductionOneAuto2.cpp | 8 +------- .../src/SpecularReflectionPositionCorrect2.cpp | 12 +++--------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp b/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp index 20975c38c22b..d8f80f20a084 100644 --- a/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp +++ b/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp @@ -8,12 +8,6 @@ #include "MantidKernel/make_unique.h" #include "MantidKernel/MandatoryValidator.h" -// anonymous namespace -namespace { -#define VERTICAL "VerticalShift" -#define ROTATION "RotateAroundSample" -} // anonymous namespace - namespace Mantid { namespace Algorithms { @@ -139,7 +133,7 @@ void ReflectometryReductionOneAuto2::init() { Direction::Input); // Detector position correction type - const std::vector correctionType{VERTICAL, ROTATION}; + const std::vector correctionType{"VerticalShift", "RotateAroundSample"}; auto correctionTypeValidator = boost::make_shared(); correctionTypeValidator->add( boost::make_shared>()); diff --git a/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp b/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp index 33c623d4d6f6..a79fed042016 100644 --- a/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp +++ b/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp @@ -11,12 +11,6 @@ using namespace Mantid::API; using namespace Mantid::Geometry; using namespace Mantid::Kernel; -// anonymous namespace -namespace { -#define VERTICAL "VerticalShift" -#define ROTATION "RotateAroundSample" -} // anonymous namespace - namespace Mantid { namespace Algorithms { @@ -62,7 +56,7 @@ void SpecularReflectionPositionCorrect2::init() { thetaValidator, Direction::Input), "Angle used to correct the detector component."); - const std::vector correctionType{VERTICAL, ROTATION}; + const std::vector correctionType{"VerticalShift", "RotateAroundSample"}; auto correctionTypeValidator = boost::make_shared(); correctionTypeValidator->add( boost::make_shared>()); @@ -138,10 +132,10 @@ void SpecularReflectionPositionCorrect2::exec() { const double beamOffsetOld = sampleToDetector.scalar_prod(referenceFrame->vecPointingAlongBeam()); - if (correctionType == VERTICAL) { + if (correctionType == "VerticalShift") { // Only shifting vertically, so the beam offset remains the same beamOffset = beamOffsetOld; - } else if (correctionType == ROTATION) { + } else if (correctionType == "RotateAroundSample") { // The radius for the rotation is the distance from the sample to // the detector in the Beam-Vertical plane const double upOffsetOld = From 0f5226de375c6ae142776f17a8ab14e368b7a01d Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Mon, 13 Feb 2017 10:15:25 +0000 Subject: [PATCH 07/22] Re #18722 Add CorrectionType to unit tests --- .../test/ReflectometryReductionOneAuto2Test.h | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Framework/Algorithms/test/ReflectometryReductionOneAuto2Test.h b/Framework/Algorithms/test/ReflectometryReductionOneAuto2Test.h index 385831b625f2..282d0bc9a20b 100644 --- a/Framework/Algorithms/test/ReflectometryReductionOneAuto2Test.h +++ b/Framework/Algorithms/test/ReflectometryReductionOneAuto2Test.h @@ -233,6 +233,7 @@ class ReflectometryReductionOneAuto2Test : public CxxTest::TestSuite { void test_correct_detector_position_INTER() { auto inter = loadRun("INTER00013460.nxs"); + // Use the default correction type, which is a vertical shift ReflectometryReductionOneAuto2 alg; alg.initialize(); alg.setChild(true); @@ -282,15 +283,17 @@ class ReflectometryReductionOneAuto2Test : public CxxTest::TestSuite { std::tan(0.7 * 2 * M_PI / 180), 1e-4); } - void test_correct_detector_position_POLREF() { + void test_correct_detector_position_rotation_POLREF() { // Histograms in this run correspond to 'OSMOND' component auto polref = loadRun("POLREF00014966.raw"); + // Correct by rotating detectors around the sample ReflectometryReductionOneAuto2 alg; alg.initialize(); alg.setChild(true); alg.setProperty("InputWorkspace", polref); alg.setProperty("ThetaIn", 1.5); + alg.setProperty("CorrectionType", "RotateAroundSample"); alg.setProperty("AnalysisMode", "MultiDetectorAnalysis"); alg.setProperty("CorrectionAlgorithm", "None"); alg.setProperty("MomentumTransferStep", 0.01); @@ -316,27 +319,28 @@ class ReflectometryReductionOneAuto2Test : public CxxTest::TestSuite { TS_ASSERT_EQUALS(instIn->getComponentByName("lineardetector")->getPos(), instOut->getComponentByName("lineardetector")->getPos()); - // Only 'OSMOND' should have been moved vertically (along Z) + // Only 'OSMOND' should have been moved both vertically and in the beam + // direction (along X and Z) auto detectorIn = instIn->getComponentByName("OSMOND")->getPos(); auto detectorOut = instOut->getComponentByName("OSMOND")->getPos(); - TS_ASSERT_EQUALS(detectorIn.X(), detectorOut.X()); + TS_ASSERT_DELTA(detectorOut.X(), 25.99589, 1e-5); TS_ASSERT_EQUALS(detectorIn.Y(), detectorOut.Y()); - TS_ASSERT_DELTA(detectorOut.Z() / - (detectorOut.X() - instOut->getSample()->getPos().X()), - std::tan(1.5 * 2 * M_PI / 180), 1e-4); + TS_ASSERT_DELTA(detectorOut.Z(), 0.1570, 1e-5); } - void test_correct_detector_position_CRISP() { + void test_correct_detector_position_vertical_CRISP() { // Histogram in this run corresponds to 'point-detector' component auto polref = loadRun("CSP79590.raw"); + // Correct by shifting detectors vertically ReflectometryReductionOneAuto2 alg; alg.initialize(); alg.setChild(true); alg.setProperty("InputWorkspace", polref); alg.setProperty("ThetaIn", 0.25); + alg.setProperty("CorrectionType", "VerticalShift"); alg.setProperty("CorrectionAlgorithm", "None"); alg.setProperty("MomentumTransferStep", 0.01); alg.setProperty("OutputWorkspace", "IvsQ"); From 189b2f9514878dff1981e18a670e0708928e4f9a Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Mon, 13 Feb 2017 10:40:00 +0000 Subject: [PATCH 08/22] Re #18722 Update docs with new CorrectionType arg --- .../algorithms/ReflectometryReductionOneAuto-v2.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/source/algorithms/ReflectometryReductionOneAuto-v2.rst b/docs/source/algorithms/ReflectometryReductionOneAuto-v2.rst index c8532e04dea0..3e2d613a03b2 100644 --- a/docs/source/algorithms/ReflectometryReductionOneAuto-v2.rst +++ b/docs/source/algorithms/ReflectometryReductionOneAuto-v2.rst @@ -21,7 +21,7 @@ detectors of interest. Only the detectors of interest will be corrected, the res will remain in the original position. Note that when :literal:`ProcessingInstructions` is not set, its value is inferred from other properties, depending on the value of :literal:`AnalysisMode`: -* If :literal:`AnalysisMode = PointDetectorAnalaysis` the algorithm will search for :literal:`PointDetectorStart` and :literal:`PointDetectorStep` in the parameter file, and :literal:`ProcessingInstructions` will be set to :literal:`PointDetectorStart:PointDetectorEnd`. +* If :literal:`AnalysisMode = PointDetectorAnalaysis` the algorithm will search for :literal:`PointDetectorStart` and :literal:`PointDetectorStop` in the parameter file, and :literal:`ProcessingInstructions` will be set to :literal:`PointDetectorStart:PointDetectorEnd`. * If :literal:`AnalysisMode = MultiDetectorAnalaysis` the algorithm will search for :literal:`MultiDetectorStart` in the parameter file and all of the spectra from this value onwards will be used. Note that ProcessingInstructions are workspace indices, not detector IDs. The first few workspaces may correspond @@ -186,7 +186,7 @@ Output: .. testcode:: ExReflRedOneAutoOverload run = Load(Filename='INTER00013460.nxs') - IvsQ, IvsQ_unbinned, IvsLam = ReflectometryReductionOneAuto(InputWorkspace=run, ThetaIn=0.7, MonitorBackgroundWavelengthMin=0.0, MonitorBackgroundWavelengthMax=1.0) + IvsQ, IvsQ_unbinned, IvsLam = ReflectometryReductionOneAuto(InputWorkspace=run, ThetaIn=0.7, CorrectionType="RotateAroundSample", MonitorBackgroundWavelengthMin=0.0, MonitorBackgroundWavelengthMax=1.0) print "%.5f" % (IvsLam.readY(0)[175]) print "%.5f" % (IvsLam.readY(0)[176]) @@ -201,10 +201,10 @@ Output: 0.00441 0.00462 - 0.64231 - 0.41456 + 0.64241 + 0.41453 0.51028 - 0.52242 + 0.52241 .. categories:: From 28dbf01fe0973b7115ca1f65b58642cd62f951c7 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Tue, 14 Feb 2017 15:32:19 +0000 Subject: [PATCH 09/22] Re #18722 Expose CorrectionType in reflectometry GUI --- .../Reflectometry/IReflSettingsView.h | 1 + .../Reflectometry/QtReflSettingsView.h | 2 ++ .../Reflectometry/ReflSettingsWidget.ui | 23 ++++++++++++++++++- .../src/Reflectometry/QtReflSettingsView.cpp | 15 ++++++++++++ .../Reflectometry/ReflSettingsPresenter.cpp | 9 +++++++- 5 files changed, 48 insertions(+), 2 deletions(-) diff --git a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/IReflSettingsView.h b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/IReflSettingsView.h index 655992dab252..eec7630d7ed6 100644 --- a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/IReflSettingsView.h +++ b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/IReflSettingsView.h @@ -65,6 +65,7 @@ class DLLExport IReflSettingsView { virtual std::string getCPp() const = 0; virtual std::string getMomentumTransferStep() const = 0; virtual std::string getScaleFactor() const = 0; + virtual std::string getCorrectionType() const = 0; /// Instrument settings virtual std::string getIntMonCheck() const = 0; virtual std::string getMonitorIntegralMin() const = 0; diff --git a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/QtReflSettingsView.h b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/QtReflSettingsView.h index 92210ad1448d..523e93b17fb1 100644 --- a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/QtReflSettingsView.h +++ b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/QtReflSettingsView.h @@ -70,6 +70,8 @@ class QtReflSettingsView : public QWidget, public IReflSettingsView { std::string getMomentumTransferStep() const override; /// Return scale factor std::string getScaleFactor() const override; + /// Return selected correction type + std::string getCorrectionType() const override; /// Return integrated monitors option std::string getIntMonCheck() const override; /// Return monitor integral wavelength min diff --git a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/ReflSettingsWidget.ui b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/ReflSettingsWidget.ui index ce85e5f7ca84..6a5a69ba5183 100644 --- a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/ReflSettingsWidget.ui +++ b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/ReflSettingsWidget.ui @@ -289,6 +289,27 @@ + + + + CorrectionType + + + + + + + + VerticalShift + + + + + RotateAroundSample + + + + @@ -542,4 +563,4 @@ - \ No newline at end of file + diff --git a/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp b/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp index 020a107f029f..2567ab68ad67 100644 --- a/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp +++ b/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp @@ -78,6 +78,13 @@ void QtReflSettingsView::setExpDefaults( m_ui.CAlphaEdit->setText(QString::fromStdString(defaults[3])); m_ui.CApEdit->setText(QString::fromStdString(defaults[4])); m_ui.CPpEdit->setText(QString::fromStdString(defaults[5])); + + int ctIndex = + m_ui.correctionTypeComboBox->findText(QString::fromStdString(defaults[6])); + if (ctIndex != -1) + m_ui.correctionTypeComboBox->setCurrentIndex(ctIndex); + + } /* Sets default values for all instrument settings given a list of default @@ -236,6 +243,14 @@ std::string QtReflSettingsView::getScaleFactor() const { return m_ui.scaleFactorEdit->text().toStdString(); } +/** Return selected correction type +* @return :: selected correction type +*/ +std::string QtReflSettingsView::getCorrectionType() const { + + return m_ui.correctionTypeComboBox->currentText().toStdString(); +} + /** Return integrated monitors option * @return :: integrated monitors check */ diff --git a/MantidQt/CustomInterfaces/src/Reflectometry/ReflSettingsPresenter.cpp b/MantidQt/CustomInterfaces/src/Reflectometry/ReflSettingsPresenter.cpp index 806ed0229baa..87dc1da80fb9 100644 --- a/MantidQt/CustomInterfaces/src/Reflectometry/ReflSettingsPresenter.cpp +++ b/MantidQt/CustomInterfaces/src/Reflectometry/ReflSettingsPresenter.cpp @@ -220,6 +220,11 @@ std::string ReflSettingsPresenter::getReductionOptions() const { if (!scaleFactor.empty()) options.push_back("ScaleFactor=" + scaleFactor); + // Add correction type + auto correctionType = m_view->getCorrectionType(); + if (!correctionType.empty()) + options.push_back("CorrectionType=" + correctionType); + // Add momentum transfer limits auto qTransStep = m_view->getMomentumTransferStep(); if (!qTransStep.empty()) { @@ -319,7 +324,7 @@ void ReflSettingsPresenter::getExpDefaults() { auto inst = createEmptyInstrument(m_currentInstrumentName); // Collect all default values and set them in view - std::vector defaults(6); + std::vector defaults(7); defaults[0] = alg->getPropertyValue("AnalysisMode"); defaults[1] = alg->getPropertyValue("PolarizationAnalysis"); @@ -339,6 +344,8 @@ void ReflSettingsPresenter::getExpDefaults() { if (!cPp.empty()) defaults[5] = cPp[0]; + defaults[6] = alg->getPropertyValue("CorrectionType"); + m_view->setExpDefaults(defaults); } From ffc956d5ad81970aaeb8a4840d4913ee6a684997 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Tue, 14 Feb 2017 15:40:10 +0000 Subject: [PATCH 10/22] Re# 18722 clang-format --- Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp | 3 ++- .../Algorithms/src/SpecularReflectionPositionCorrect2.cpp | 3 ++- .../src/Reflectometry/QtReflSettingsView.cpp | 6 ++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp b/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp index d8f80f20a084..864163aa09fe 100644 --- a/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp +++ b/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp @@ -133,7 +133,8 @@ void ReflectometryReductionOneAuto2::init() { Direction::Input); // Detector position correction type - const std::vector correctionType{"VerticalShift", "RotateAroundSample"}; + const std::vector correctionType{"VerticalShift", + "RotateAroundSample"}; auto correctionTypeValidator = boost::make_shared(); correctionTypeValidator->add( boost::make_shared>()); diff --git a/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp b/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp index a79fed042016..96834f44032f 100644 --- a/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp +++ b/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp @@ -56,7 +56,8 @@ void SpecularReflectionPositionCorrect2::init() { thetaValidator, Direction::Input), "Angle used to correct the detector component."); - const std::vector correctionType{"VerticalShift", "RotateAroundSample"}; + const std::vector correctionType{"VerticalShift", + "RotateAroundSample"}; auto correctionTypeValidator = boost::make_shared(); correctionTypeValidator->add( boost::make_shared>()); diff --git a/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp b/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp index 2567ab68ad67..3cabc6aa0f9f 100644 --- a/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp +++ b/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp @@ -79,12 +79,10 @@ void QtReflSettingsView::setExpDefaults( m_ui.CApEdit->setText(QString::fromStdString(defaults[4])); m_ui.CPpEdit->setText(QString::fromStdString(defaults[5])); - int ctIndex = - m_ui.correctionTypeComboBox->findText(QString::fromStdString(defaults[6])); + int ctIndex = m_ui.correctionTypeComboBox->findText( + QString::fromStdString(defaults[6])); if (ctIndex != -1) m_ui.correctionTypeComboBox->setCurrentIndex(ctIndex); - - } /* Sets default values for all instrument settings given a list of default From d82bc13734990cd4bd5be73b32a9af8ee951a410 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Tue, 14 Feb 2017 16:27:46 +0000 Subject: [PATCH 11/22] Re #18722 Add CorrectionType to GUI unit tests --- .../CustomInterfaces/test/ReflMockObjects.h | 1 + .../test/ReflSettingsPresenterTest.h | 26 ++++++++++++------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/MantidQt/CustomInterfaces/test/ReflMockObjects.h b/MantidQt/CustomInterfaces/test/ReflMockObjects.h index c53579a72bae..f9ae733cc56d 100644 --- a/MantidQt/CustomInterfaces/test/ReflMockObjects.h +++ b/MantidQt/CustomInterfaces/test/ReflMockObjects.h @@ -98,6 +98,7 @@ class MockSettingsView : public IReflSettingsView { MOCK_CONST_METHOD1(setPolarisationOptionsEnabled, void(bool)); MOCK_CONST_METHOD1(setExpDefaults, void(const std::vector &)); MOCK_CONST_METHOD1(setInstDefaults, void(const std::vector &)); + MOCK_CONST_METHOD0(getCorrectionType, std::string()); // Calls we don't care about void createStitchHints(const std::map &hints) override { diff --git a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h index c6c7694def92..964ccb79e86b 100644 --- a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h +++ b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h @@ -83,6 +83,8 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { .WillOnce(Return("12")); auto options = presenter.getTransmissionOptions(); + std::string s; + std::getline(std::cin, s); std::vector optionsVec; boost::split(optionsVec, options, split_q()); TS_ASSERT_EQUALS(optionsVec.size(), 11); @@ -153,6 +155,9 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { EXPECT_CALL(mockView, getScaleFactor()) .Times(Exactly(1)) .WillOnce(Return("2")); + EXPECT_CALL(mockView, getCorrectionType()) + .Times(Exactly(1)) + .WillOnce(Return("VerticalShift")); EXPECT_CALL(mockView, getMomentumTransferStep()) .Times(Exactly(1)) .WillOnce(Return("-0.02")); @@ -172,7 +177,7 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { std::vector optionsVec; boost::split(optionsVec, options, split_q()); - TS_ASSERT_EQUALS(optionsVec.size(), 22); + TS_ASSERT_EQUALS(optionsVec.size(), 23); TS_ASSERT_EQUALS(optionsVec[0], "AnalysisMode=MultiDetectorAnalysis"); TS_ASSERT_EQUALS(optionsVec[1], "CRho=\"2.5,0.4,1.1\""); TS_ASSERT_EQUALS(optionsVec[2], "CAlpha=\"0.6,0.9,1.2\""); @@ -189,13 +194,14 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { TS_ASSERT_EQUALS(optionsVec[13], "WavelengthMax=15"); TS_ASSERT_EQUALS(optionsVec[14], "I0MonitorIndex=2"); TS_ASSERT_EQUALS(optionsVec[15], "ScaleFactor=2"); - TS_ASSERT_EQUALS(optionsVec[16], "MomentumTransferStep=-0.02"); - TS_ASSERT_EQUALS(optionsVec[17], "ProcessingInstructions=\"3,4\""); - TS_ASSERT_EQUALS(optionsVec[18], "StartOverlap=10"); - TS_ASSERT_EQUALS(optionsVec[19], "EndOverlap=12"); - TS_ASSERT_EQUALS(optionsVec[20], - "FirstTransmissionRun=TRANS_INTER00013463"); + TS_ASSERT_EQUALS(optionsVec[16], "CorrectionType=VerticalShift"); + TS_ASSERT_EQUALS(optionsVec[17], "MomentumTransferStep=-0.02"); + TS_ASSERT_EQUALS(optionsVec[18], "ProcessingInstructions=\"3,4\""); + TS_ASSERT_EQUALS(optionsVec[19], "StartOverlap=10"); + TS_ASSERT_EQUALS(optionsVec[20], "EndOverlap=12"); TS_ASSERT_EQUALS(optionsVec[21], + "FirstTransmissionRun=TRANS_INTER00013463"); + TS_ASSERT_EQUALS(optionsVec[22], "SecondTransmissionRun=TRANS_INTER00013464"); TS_ASSERT(AnalysisDataService::Instance().doesExist("TRANS_INTER00013463")); @@ -237,11 +243,13 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { presenter.setInstrumentName("POLREF"); std::vector defaults = { - "PointDetectorAnalysis", "None", + "PointDetectorAnalysis", + "None", "1.006831,-0.011467,0.002244,-0.000095", "1.017526,-0.017183,0.003136,-0.000140", "0.917940,0.038265,-0.006645,0.000282", - "0.972762,0.001828,-0.000261,0.0"}; + "0.972762,0.001828,-0.000261,0.0", + "VerticalShift"}; EXPECT_CALL(mockView, setExpDefaults(defaults)).Times(1); presenter.notify(IReflSettingsPresenter::ExpDefaultsFlag); From 41fdee9f5938b887789ecf00c1315e8dcc49a35a Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Thu, 16 Feb 2017 10:31:33 +0000 Subject: [PATCH 12/22] Re #18722 Remove temp debug code --- MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h index 964ccb79e86b..916cb73f427c 100644 --- a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h +++ b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h @@ -83,8 +83,6 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { .WillOnce(Return("12")); auto options = presenter.getTransmissionOptions(); - std::string s; - std::getline(std::cin, s); std::vector optionsVec; boost::split(optionsVec, options, split_q()); TS_ASSERT_EQUALS(optionsVec.size(), 11); From 0ad41e5da33f42a8980a419917d065da5a49fb72 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Thu, 16 Feb 2017 10:53:08 +0000 Subject: [PATCH 13/22] Re #18722 Update docs with new CorrectionType property --- .../ISISReflectometryPolref_settings_tab.png | Bin 83039 -> 41244 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/source/images/ISISReflectometryPolref_settings_tab.png b/docs/source/images/ISISReflectometryPolref_settings_tab.png index 5a1e49e2ca53962259f6303065728bd583662a0f..4b39534c367277c07769f14c1773c9bdc692fe19 100644 GIT binary patch literal 41244 zcmafac|4Tu`!-r6SyHIPP*hL0Le^o3k|neV*^)HMnsvr9BYT8Os4!!x$eN|Gn~;Pu z_GQM>WEuMmV}>zi=Dj`7^ZovQ??3PR`B*;pbU)yWPxDSWdrjU+m5w0Aq%cN__}9QT7Y z5?t+aPD*{2bnSLY={TKqWkB|7y5dv!kR#%RylYWXW0kTm6uti(jQHKmy;tynFqgsd zUi|~z+%5aw%O)IV%%r8+rKP1=PlVSOHPqua6SgP;Hg1ZJ1=?>Rw*%2VbH6f&YMN<^ z)9Lo!H#8<;`P&R<)=6NvTwKNdNDi6fNMnXili91}L9d#LkJ`bL@Phj3WSzl`<_$R- z6-(Em6{A^_w5T|=71?1s=Lz&>ZLJ?vsoA-B;M1mv_!%mOyfbf+v}oLucJr)p;A(>Q zVVMCcb;@g4hg>wBRChAaJS#h9HpahN32OQcZ*d-z4JS1r#H)2_#MkTK87K&(E{rz8oDA}ou5wa!NFbRgAQ7#s!? zX@c!NJCu7XW3WeK>ISYEQ6z@bVrJDOL052DENhDtsI%h+#_Wg3o6)6b&^x~$g*)5| z?OvfEKBlW!DrP??_+Rz{-6wcIX}niV{-V+`nA+@!?{Qt^TUs0J`&Mi`l;0zd@BS0N zcI|hZo6~wzT8M4q8`zKOk8)I@rAKYLTdkRkEu^X2LM5Xzw6FeggDioqmMUH|fp4mR z^ru(-Q9+aLgH8E(;&OR=x{0o}%rHVE#%tLu9P3SxxHpo$QWGvor_CZYCduFzS*o3k zx7k&l%+nlHANefYa(2>{&D`>xjWrK1KvoET*PPGh*;u6OhM?Ns+4I%0D(`!uany_`vv6T0g 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 LNkvXXu0mjf2@dFv literal 83039 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

98IaMmBIdKw+J1(jC@b221%u~Y5U!EH4 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 Date: Thu, 16 Feb 2017 11:58:39 +0000 Subject: [PATCH 14/22] Re #18722 Add new CorrectionType property to release notes --- docs/source/release/v3.10.0/reflectometry.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/source/release/v3.10.0/reflectometry.rst b/docs/source/release/v3.10.0/reflectometry.rst index 4e63c2008936..07d534088576 100644 --- a/docs/source/release/v3.10.0/reflectometry.rst +++ b/docs/source/release/v3.10.0/reflectometry.rst @@ -5,6 +5,10 @@ Reflectometry Changes .. contents:: Table of Contents :local: +Algorithms +---------- +* The :ref:`algm-SpecularReflectionPositionCorrect` algorithm has a new property, ``CorrectionType``, which specifies whether detector positions should be corrected by a vertical shift (default) or by a rotation around the sample position. + ConvertToReflectometryQ ----------------------- From 33457a27e7efaa2e91d7f4c73b56cca5341400f7 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Thu, 16 Feb 2017 13:12:29 +0000 Subject: [PATCH 15/22] Re #18722 clang-format --- MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h index 916cb73f427c..b5065dd050fb 100644 --- a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h +++ b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h @@ -241,13 +241,11 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { presenter.setInstrumentName("POLREF"); std::vector defaults = { - "PointDetectorAnalysis", - "None", + "PointDetectorAnalysis", "None", "1.006831,-0.011467,0.002244,-0.000095", "1.017526,-0.017183,0.003136,-0.000140", "0.917940,0.038265,-0.006645,0.000282", - "0.972762,0.001828,-0.000261,0.0", - "VerticalShift"}; + "0.972762,0.001828,-0.000261,0.0", "VerticalShift"}; EXPECT_CALL(mockView, setExpDefaults(defaults)).Times(1); presenter.notify(IReflSettingsPresenter::ExpDefaultsFlag); From 024fd764d9e3695ba2a29da086ec27c0c56e9734 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Wed, 22 Feb 2017 12:27:52 +0000 Subject: [PATCH 16/22] Re #18722 Rename CorrectionType to DetectorCorrectionType --- .../Algorithms/src/ReflectometryReductionOneAuto2.cpp | 6 +++--- .../src/SpecularReflectionPositionCorrect2.cpp | 4 ++-- .../test/ReflectometryReductionOneAuto2Test.h | 4 ++-- .../test/SpecularReflectionPositionCorrect2Test.h | 4 ++-- .../Reflectometry/IReflSettingsView.h | 2 +- .../Reflectometry/QtReflSettingsView.h | 4 ++-- .../Reflectometry/ReflSettingsWidget.ui | 6 +++--- .../src/Reflectometry/QtReflSettingsView.cpp | 8 ++++---- .../src/Reflectometry/ReflSettingsPresenter.cpp | 6 +++--- .../CustomInterfaces/test/ReflSettingsPresenterTest.h | 10 ++++++---- .../algorithms/ReflectometryReductionOneAuto-v2.rst | 2 +- .../SpecularReflectionPositionCorrect-v2.rst | 8 ++++---- docs/source/release/v3.10.0/reflectometry.rst | 2 +- 13 files changed, 34 insertions(+), 32 deletions(-) diff --git a/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp b/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp index 864163aa09fe..5aa995141a2a 100644 --- a/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp +++ b/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp @@ -141,7 +141,7 @@ void ReflectometryReductionOneAuto2::init() { correctionTypeValidator->add( boost::make_shared(correctionType)); declareProperty( - "CorrectionType", correctionType[0], correctionTypeValidator, + "DetectorCorrectionType", correctionType[0], correctionTypeValidator, "Whether detectors should be shifted vertically or rotated around the " "sample position.", Direction::Input); @@ -343,7 +343,7 @@ MatrixWorkspace_sptr ReflectometryReductionOneAuto2::correctDetectorPositions( detectorsOfInterest.end()); const double theta = getProperty("ThetaIn"); - const std::string correctionType = getProperty("CorrectionType"); + const std::string correctionType = getProperty("DetectorCorrectionType"); MatrixWorkspace_sptr corrected = inputWS; @@ -352,7 +352,7 @@ MatrixWorkspace_sptr ReflectometryReductionOneAuto2::correctDetectorPositions( createChildAlgorithm("SpecularReflectionPositionCorrect"); alg->setProperty("InputWorkspace", corrected); alg->setProperty("TwoTheta", theta * 2); - alg->setProperty("CorrectionType", correctionType); + alg->setProperty("DetectorCorrectionType", correctionType); alg->setProperty("DetectorComponentName", detector); alg->execute(); corrected = alg->getProperty("OutputWorkspace"); diff --git a/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp b/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp index 96834f44032f..132142934496 100644 --- a/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp +++ b/Framework/Algorithms/src/SpecularReflectionPositionCorrect2.cpp @@ -64,7 +64,7 @@ void SpecularReflectionPositionCorrect2::init() { correctionTypeValidator->add( boost::make_shared(correctionType)); declareProperty( - "CorrectionType", correctionType[0], correctionTypeValidator, + "DetectorCorrectionType", correctionType[0], correctionTypeValidator, "Whether detectors should be shifted vertically or rotated around the " "sample position.", Direction::Input); @@ -118,7 +118,7 @@ void SpecularReflectionPositionCorrect2::exec() { const V3D samplePosition = sample->getPos(); // Type of movement (vertical shift or rotation around the sample) - const std::string correctionType = getProperty("CorrectionType"); + const std::string correctionType = getProperty("DetectorCorrectionType"); // Sample-to-detector const V3D sampleToDetector = detectorPosition - samplePosition; diff --git a/Framework/Algorithms/test/ReflectometryReductionOneAuto2Test.h b/Framework/Algorithms/test/ReflectometryReductionOneAuto2Test.h index 282d0bc9a20b..663ad33dc651 100644 --- a/Framework/Algorithms/test/ReflectometryReductionOneAuto2Test.h +++ b/Framework/Algorithms/test/ReflectometryReductionOneAuto2Test.h @@ -293,7 +293,7 @@ class ReflectometryReductionOneAuto2Test : public CxxTest::TestSuite { alg.setChild(true); alg.setProperty("InputWorkspace", polref); alg.setProperty("ThetaIn", 1.5); - alg.setProperty("CorrectionType", "RotateAroundSample"); + alg.setProperty("DetectorCorrectionType", "RotateAroundSample"); alg.setProperty("AnalysisMode", "MultiDetectorAnalysis"); alg.setProperty("CorrectionAlgorithm", "None"); alg.setProperty("MomentumTransferStep", 0.01); @@ -340,7 +340,7 @@ class ReflectometryReductionOneAuto2Test : public CxxTest::TestSuite { alg.setChild(true); alg.setProperty("InputWorkspace", polref); alg.setProperty("ThetaIn", 0.25); - alg.setProperty("CorrectionType", "VerticalShift"); + alg.setProperty("DetectorCorrectionType", "VerticalShift"); alg.setProperty("CorrectionAlgorithm", "None"); alg.setProperty("MomentumTransferStep", 0.01); alg.setProperty("OutputWorkspace", "IvsQ"); diff --git a/Framework/Algorithms/test/SpecularReflectionPositionCorrect2Test.h b/Framework/Algorithms/test/SpecularReflectionPositionCorrect2Test.h index c99c0ff09af3..5af6215086b7 100644 --- a/Framework/Algorithms/test/SpecularReflectionPositionCorrect2Test.h +++ b/Framework/Algorithms/test/SpecularReflectionPositionCorrect2Test.h @@ -27,7 +27,7 @@ class SpecularReflectionPositionCorrect2Test : public CxxTest::TestSuite { alg.setProperty("InputWorkspace", m_interWS); alg.setProperty("TwoTheta", twoTheta); if (!correctionType.empty()) - alg.setProperty("CorrectionType", correctionType); + alg.setProperty("DetectorCorrectionType", correctionType); if (!detectorName.empty()) alg.setProperty("DetectorComponentName", detectorName); alg.setPropertyValue("OutputWorkspace", "test_out"); @@ -103,7 +103,7 @@ class SpecularReflectionPositionCorrect2Test : public CxxTest::TestSuite { } void test_correct_point_detector_vertical_shift_default() { - // Omit the CorrectionType property to check that a vertical shift + // Omit the DetectorCorrectionType property to check that a vertical shift // is done by default SpecularReflectionPositionCorrect2 alg; setupAlgorithm(alg, 1.4, "", "point-detector"); diff --git a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/IReflSettingsView.h b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/IReflSettingsView.h index eec7630d7ed6..32b67b7f8417 100644 --- a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/IReflSettingsView.h +++ b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/IReflSettingsView.h @@ -65,7 +65,7 @@ class DLLExport IReflSettingsView { virtual std::string getCPp() const = 0; virtual std::string getMomentumTransferStep() const = 0; virtual std::string getScaleFactor() const = 0; - virtual std::string getCorrectionType() const = 0; + virtual std::string getDetectorCorrectionType() const = 0; /// Instrument settings virtual std::string getIntMonCheck() const = 0; virtual std::string getMonitorIntegralMin() const = 0; diff --git a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/QtReflSettingsView.h b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/QtReflSettingsView.h index 523e93b17fb1..28db01910a04 100644 --- a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/QtReflSettingsView.h +++ b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/QtReflSettingsView.h @@ -70,8 +70,8 @@ class QtReflSettingsView : public QWidget, public IReflSettingsView { std::string getMomentumTransferStep() const override; /// Return scale factor std::string getScaleFactor() const override; - /// Return selected correction type - std::string getCorrectionType() const override; + /// Return selected detector correction type + std::string getDetectorCorrectionType() const override; /// Return integrated monitors option std::string getIntMonCheck() const override; /// Return monitor integral wavelength min diff --git a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/ReflSettingsWidget.ui b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/ReflSettingsWidget.ui index 6a5a69ba5183..13e71ef21825 100644 --- a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/ReflSettingsWidget.ui +++ b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/ReflSettingsWidget.ui @@ -290,14 +290,14 @@ - + - CorrectionType + DetectorCorrectionType - + VerticalShift diff --git a/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp b/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp index 3cabc6aa0f9f..805b69d84509 100644 --- a/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp +++ b/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp @@ -79,10 +79,10 @@ void QtReflSettingsView::setExpDefaults( m_ui.CApEdit->setText(QString::fromStdString(defaults[4])); m_ui.CPpEdit->setText(QString::fromStdString(defaults[5])); - int ctIndex = m_ui.correctionTypeComboBox->findText( + int ctIndex = m_ui.detectorCorrectionTypeComboBox->findText( QString::fromStdString(defaults[6])); if (ctIndex != -1) - m_ui.correctionTypeComboBox->setCurrentIndex(ctIndex); + m_ui.detectorCorrectionTypeComboBox->setCurrentIndex(ctIndex); } /* Sets default values for all instrument settings given a list of default @@ -244,9 +244,9 @@ std::string QtReflSettingsView::getScaleFactor() const { /** Return selected correction type * @return :: selected correction type */ -std::string QtReflSettingsView::getCorrectionType() const { +std::string QtReflSettingsView::getDetectorCorrectionType() const { - return m_ui.correctionTypeComboBox->currentText().toStdString(); + return m_ui.detectorCorrectionTypeComboBox->currentText().toStdString(); } /** Return integrated monitors option diff --git a/MantidQt/CustomInterfaces/src/Reflectometry/ReflSettingsPresenter.cpp b/MantidQt/CustomInterfaces/src/Reflectometry/ReflSettingsPresenter.cpp index 87dc1da80fb9..61f7258093b8 100644 --- a/MantidQt/CustomInterfaces/src/Reflectometry/ReflSettingsPresenter.cpp +++ b/MantidQt/CustomInterfaces/src/Reflectometry/ReflSettingsPresenter.cpp @@ -221,9 +221,9 @@ std::string ReflSettingsPresenter::getReductionOptions() const { options.push_back("ScaleFactor=" + scaleFactor); // Add correction type - auto correctionType = m_view->getCorrectionType(); + auto correctionType = m_view->getDetectorCorrectionType(); if (!correctionType.empty()) - options.push_back("CorrectionType=" + correctionType); + options.push_back("DetectorCorrectionType=" + correctionType); // Add momentum transfer limits auto qTransStep = m_view->getMomentumTransferStep(); @@ -344,7 +344,7 @@ void ReflSettingsPresenter::getExpDefaults() { if (!cPp.empty()) defaults[5] = cPp[0]; - defaults[6] = alg->getPropertyValue("CorrectionType"); + defaults[6] = alg->getPropertyValue("DetectorCorrectionType"); m_view->setExpDefaults(defaults); } diff --git a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h index b5065dd050fb..0f9c0f929f49 100644 --- a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h +++ b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h @@ -153,7 +153,7 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { EXPECT_CALL(mockView, getScaleFactor()) .Times(Exactly(1)) .WillOnce(Return("2")); - EXPECT_CALL(mockView, getCorrectionType()) + EXPECT_CALL(mockView, getDetectorCorrectionType()) .Times(Exactly(1)) .WillOnce(Return("VerticalShift")); EXPECT_CALL(mockView, getMomentumTransferStep()) @@ -192,7 +192,7 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { TS_ASSERT_EQUALS(optionsVec[13], "WavelengthMax=15"); TS_ASSERT_EQUALS(optionsVec[14], "I0MonitorIndex=2"); TS_ASSERT_EQUALS(optionsVec[15], "ScaleFactor=2"); - TS_ASSERT_EQUALS(optionsVec[16], "CorrectionType=VerticalShift"); + TS_ASSERT_EQUALS(optionsVec[16], "DetectorCorrectionType=VerticalShift"); TS_ASSERT_EQUALS(optionsVec[17], "MomentumTransferStep=-0.02"); TS_ASSERT_EQUALS(optionsVec[18], "ProcessingInstructions=\"3,4\""); TS_ASSERT_EQUALS(optionsVec[19], "StartOverlap=10"); @@ -241,11 +241,13 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { presenter.setInstrumentName("POLREF"); std::vector defaults = { - "PointDetectorAnalysis", "None", + "PointDetectorAnalysis", + "None", "1.006831,-0.011467,0.002244,-0.000095", "1.017526,-0.017183,0.003136,-0.000140", "0.917940,0.038265,-0.006645,0.000282", - "0.972762,0.001828,-0.000261,0.0", "VerticalShift"}; + "0.972762,0.001828,-0.000261,0.0", + "VerticalShift"}; EXPECT_CALL(mockView, setExpDefaults(defaults)).Times(1); presenter.notify(IReflSettingsPresenter::ExpDefaultsFlag); diff --git a/docs/source/algorithms/ReflectometryReductionOneAuto-v2.rst b/docs/source/algorithms/ReflectometryReductionOneAuto-v2.rst index 3e2d613a03b2..cc72b7197c16 100644 --- a/docs/source/algorithms/ReflectometryReductionOneAuto-v2.rst +++ b/docs/source/algorithms/ReflectometryReductionOneAuto-v2.rst @@ -186,7 +186,7 @@ Output: .. testcode:: ExReflRedOneAutoOverload run = Load(Filename='INTER00013460.nxs') - IvsQ, IvsQ_unbinned, IvsLam = ReflectometryReductionOneAuto(InputWorkspace=run, ThetaIn=0.7, CorrectionType="RotateAroundSample", MonitorBackgroundWavelengthMin=0.0, MonitorBackgroundWavelengthMax=1.0) + IvsQ, IvsQ_unbinned, IvsLam = ReflectometryReductionOneAuto(InputWorkspace=run, ThetaIn=0.7, DetectorCorrectionType="RotateAroundSample", MonitorBackgroundWavelengthMin=0.0, MonitorBackgroundWavelengthMax=1.0) print "%.5f" % (IvsLam.readY(0)[175]) print "%.5f" % (IvsLam.readY(0)[176]) diff --git a/docs/source/algorithms/SpecularReflectionPositionCorrect-v2.rst b/docs/source/algorithms/SpecularReflectionPositionCorrect-v2.rst index 804e07c1438e..a6bd8e49c82b 100644 --- a/docs/source/algorithms/SpecularReflectionPositionCorrect-v2.rst +++ b/docs/source/algorithms/SpecularReflectionPositionCorrect-v2.rst @@ -35,11 +35,11 @@ Usage instr = polref.getInstrument() print 'Original position: ' + str(instr.getComponentByName('point-detector').getPos()) - polref_vert = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='point-detector', CorrectionType='VerticalShift') + polref_vert = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='point-detector', DetectorCorrectionType='VerticalShift') instr = polref_vert.getInstrument() print 'Vertical shift: ' + str(instr.getComponentByName('point-detector').getPos()) - polref_rot = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='point-detector', CorrectionType='RotateAroundSample') + polref_rot = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='point-detector', DetectorCorrectionType='RotateAroundSample') instr = polref_rot.getInstrument() print 'Rotated: ' + str(instr.getComponentByName('point-detector').getPos()) @@ -67,7 +67,7 @@ Output: instr = polref_vert.getInstrument() print 'Vertical shift: ' + str(instr.getComponentByName('lineardetector').getPos()) - polref_rot = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='lineardetector', CorrectionType='RotateAroundSample') + polref_rot = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='lineardetector', DetectorCorrectionType='RotateAroundSample') instr = polref_rot.getInstrument() print 'Rotated: ' + str(instr.getComponentByName('lineardetector').getPos()) @@ -95,7 +95,7 @@ Output: instr = polref_vert.getInstrument() print 'Vertical shift: ' + str(instr.getComponentByName('OSMOND').getPos()) - polref_rot = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='OSMOND', CorrectionType='RotateAroundSample') + polref_rot = SpecularReflectionPositionCorrect(polref, TwoTheta = 2*0.49, DetectorComponentName='OSMOND', DetectorCorrectionType='RotateAroundSample') instr = polref_rot.getInstrument() print 'Rotated: ' + str(instr.getComponentByName('OSMOND').getPos()) diff --git a/docs/source/release/v3.10.0/reflectometry.rst b/docs/source/release/v3.10.0/reflectometry.rst index 07d534088576..90f3ab9a83f2 100644 --- a/docs/source/release/v3.10.0/reflectometry.rst +++ b/docs/source/release/v3.10.0/reflectometry.rst @@ -7,7 +7,7 @@ Reflectometry Changes Algorithms ---------- -* The :ref:`algm-SpecularReflectionPositionCorrect` algorithm has a new property, ``CorrectionType``, which specifies whether detector positions should be corrected by a vertical shift (default) or by a rotation around the sample position. +* The :ref:`algm-SpecularReflectionPositionCorrect` algorithm has a new property, ``DetectorCorrectionType``, which specifies whether detector positions should be corrected by a vertical shift (default) or by a rotation around the sample position. ConvertToReflectometryQ ----------------------- From bb078799f19840131ffaeb77cb79fe5328c4236a Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Wed, 22 Feb 2017 13:12:38 +0000 Subject: [PATCH 17/22] Re #18722 Move DetectorCorrectionType to instrument settings --- .../Reflectometry/IReflSettingsView.h | 5 +- .../Reflectometry/QtReflSettingsView.h | 7 +-- .../Reflectometry/ReflSettingsWidget.ui | 42 ++++++++--------- .../src/Reflectometry/QtReflSettingsView.cpp | 46 ++++++++++--------- .../Reflectometry/ReflSettingsPresenter.cpp | 39 ++++++++-------- .../CustomInterfaces/test/ReflMockObjects.h | 5 +- .../test/ReflSettingsPresenterTest.h | 10 ++-- 7 files changed, 81 insertions(+), 73 deletions(-) diff --git a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/IReflSettingsView.h b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/IReflSettingsView.h index 32b67b7f8417..742f0c678929 100644 --- a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/IReflSettingsView.h +++ b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/IReflSettingsView.h @@ -65,7 +65,6 @@ class DLLExport IReflSettingsView { virtual std::string getCPp() const = 0; virtual std::string getMomentumTransferStep() const = 0; virtual std::string getScaleFactor() const = 0; - virtual std::string getDetectorCorrectionType() const = 0; /// Instrument settings virtual std::string getIntMonCheck() const = 0; virtual std::string getMonitorIntegralMin() const = 0; @@ -76,10 +75,12 @@ class DLLExport IReflSettingsView { virtual std::string getLambdaMax() const = 0; virtual std::string getI0MonitorIndex() const = 0; virtual std::string getProcessingInstructions() const = 0; + virtual std::string getDetectorCorrectionType() const = 0; /// Set default values for settings virtual void setExpDefaults(const std::vector &) const = 0; - virtual void setInstDefaults(const std::vector &) const = 0; + virtual void setInstDefaults(const std::vector &, + const std::vector &) const = 0; /// Set polarisation corrections and parameters enabled/disabled virtual void setPolarisationOptionsEnabled(bool enable) const = 0; diff --git a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/QtReflSettingsView.h b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/QtReflSettingsView.h index 28db01910a04..f659951591fc 100644 --- a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/QtReflSettingsView.h +++ b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/QtReflSettingsView.h @@ -70,8 +70,6 @@ class QtReflSettingsView : public QWidget, public IReflSettingsView { std::string getMomentumTransferStep() const override; /// Return scale factor std::string getScaleFactor() const override; - /// Return selected detector correction type - std::string getDetectorCorrectionType() const override; /// Return integrated monitors option std::string getIntMonCheck() const override; /// Return monitor integral wavelength min @@ -90,9 +88,12 @@ class QtReflSettingsView : public QWidget, public IReflSettingsView { std::string getI0MonitorIndex() const override; /// Return processing instructions std::string getProcessingInstructions() const override; + /// Return selected detector correction type + std::string getDetectorCorrectionType() const override; /// Set default values for experiment and instrument settings void setExpDefaults(const std::vector &) const override; - void setInstDefaults(const std::vector &) const override; + void setInstDefaults(const std::vector &, + const std::vector &) const override; /// Creates hints for 'Stitch1DMany' void diff --git a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/ReflSettingsWidget.ui b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/ReflSettingsWidget.ui index 13e71ef21825..40c0eafa1815 100644 --- a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/ReflSettingsWidget.ui +++ b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Reflectometry/ReflSettingsWidget.ui @@ -289,27 +289,6 @@ - - - - DetectorCorrectionType - - - - - - - - VerticalShift - - - - - RotateAroundSample - - - - @@ -520,6 +499,27 @@ + + + + DetectorCorrectionType + + + + + + + + VerticalShift + + + + + RotateAroundSample + + + + diff --git a/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp b/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp index 805b69d84509..3ac2a8314398 100644 --- a/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp +++ b/MantidQt/CustomInterfaces/src/Reflectometry/QtReflSettingsView.cpp @@ -78,29 +78,31 @@ void QtReflSettingsView::setExpDefaults( m_ui.CAlphaEdit->setText(QString::fromStdString(defaults[3])); m_ui.CApEdit->setText(QString::fromStdString(defaults[4])); m_ui.CPpEdit->setText(QString::fromStdString(defaults[5])); - - int ctIndex = m_ui.detectorCorrectionTypeComboBox->findText( - QString::fromStdString(defaults[6])); - if (ctIndex != -1) - m_ui.detectorCorrectionTypeComboBox->setCurrentIndex(ctIndex); } /* Sets default values for all instrument settings given a list of default * values. */ void QtReflSettingsView::setInstDefaults( - const std::vector &defaults) const { + const std::vector &defaults_double, + const std::vector &defaults_str) const { - auto intMonCheckState = (defaults[0] != 0) ? Qt::Checked : Qt::Unchecked; + auto intMonCheckState = + (defaults_double[0] != 0) ? Qt::Checked : Qt::Unchecked; m_ui.intMonCheckBox->setCheckState(intMonCheckState); - m_ui.monIntMinEdit->setText(QString::number(defaults[1])); - m_ui.monIntMaxEdit->setText(QString::number(defaults[2])); - m_ui.monBgMinEdit->setText(QString::number(defaults[3])); - m_ui.monBgMaxEdit->setText(QString::number(defaults[4])); - m_ui.lamMinEdit->setText(QString::number(defaults[5])); - m_ui.lamMaxEdit->setText(QString::number(defaults[6])); - m_ui.I0MonIndexEdit->setText(QString::number(defaults[7])); + m_ui.monIntMinEdit->setText(QString::number(defaults_double[1])); + m_ui.monIntMaxEdit->setText(QString::number(defaults_double[2])); + m_ui.monBgMinEdit->setText(QString::number(defaults_double[3])); + m_ui.monBgMaxEdit->setText(QString::number(defaults_double[4])); + m_ui.lamMinEdit->setText(QString::number(defaults_double[5])); + m_ui.lamMaxEdit->setText(QString::number(defaults_double[6])); + m_ui.I0MonIndexEdit->setText(QString::number(defaults_double[7])); + + int ctIndex = m_ui.detectorCorrectionTypeComboBox->findText( + QString::fromStdString(defaults_str[0])); + if (ctIndex != -1) + m_ui.detectorCorrectionTypeComboBox->setCurrentIndex(ctIndex); } /* Sets the enabled status of polarisation corrections and parameters @@ -241,14 +243,6 @@ std::string QtReflSettingsView::getScaleFactor() const { return m_ui.scaleFactorEdit->text().toStdString(); } -/** Return selected correction type -* @return :: selected correction type -*/ -std::string QtReflSettingsView::getDetectorCorrectionType() const { - - return m_ui.detectorCorrectionTypeComboBox->currentText().toStdString(); -} - /** Return integrated monitors option * @return :: integrated monitors check */ @@ -321,5 +315,13 @@ std::string QtReflSettingsView::getProcessingInstructions() const { return m_ui.procInstEdit->text().toStdString(); } +/** Return selected correction type +* @return :: selected correction type +*/ +std::string QtReflSettingsView::getDetectorCorrectionType() const { + + return m_ui.detectorCorrectionTypeComboBox->currentText().toStdString(); +} + } // namespace CustomInterfaces } // namespace Mantid diff --git a/MantidQt/CustomInterfaces/src/Reflectometry/ReflSettingsPresenter.cpp b/MantidQt/CustomInterfaces/src/Reflectometry/ReflSettingsPresenter.cpp index 61f7258093b8..234412108e9b 100644 --- a/MantidQt/CustomInterfaces/src/Reflectometry/ReflSettingsPresenter.cpp +++ b/MantidQt/CustomInterfaces/src/Reflectometry/ReflSettingsPresenter.cpp @@ -220,11 +220,6 @@ std::string ReflSettingsPresenter::getReductionOptions() const { if (!scaleFactor.empty()) options.push_back("ScaleFactor=" + scaleFactor); - // Add correction type - auto correctionType = m_view->getDetectorCorrectionType(); - if (!correctionType.empty()) - options.push_back("DetectorCorrectionType=" + correctionType); - // Add momentum transfer limits auto qTransStep = m_view->getMomentumTransferStep(); if (!qTransStep.empty()) { @@ -238,6 +233,11 @@ std::string ReflSettingsPresenter::getReductionOptions() const { options.push_back("ProcessingInstructions=" + procInst); } + // Add correction type + auto correctionType = m_view->getDetectorCorrectionType(); + if (!correctionType.empty()) + options.push_back("DetectorCorrectionType=" + correctionType); + // Add start overlap auto startOv = m_view->getStartOverlap(); if (!startOv.empty()) @@ -324,7 +324,7 @@ void ReflSettingsPresenter::getExpDefaults() { auto inst = createEmptyInstrument(m_currentInstrumentName); // Collect all default values and set them in view - std::vector defaults(7); + std::vector defaults(6); defaults[0] = alg->getPropertyValue("AnalysisMode"); defaults[1] = alg->getPropertyValue("PolarizationAnalysis"); @@ -344,8 +344,6 @@ void ReflSettingsPresenter::getExpDefaults() { if (!cPp.empty()) defaults[5] = cPp[0]; - defaults[6] = alg->getPropertyValue("DetectorCorrectionType"); - m_view->setExpDefaults(defaults); } @@ -367,18 +365,21 @@ void ReflSettingsPresenter::getInstDefaults() { auto inst = createEmptyInstrument(m_currentInstrumentName); // Collect all default values - std::vector defaults(8); - defaults[0] = boost::lexical_cast( + std::vector defaults_double(8); + defaults_double[0] = boost::lexical_cast( alg->getPropertyValue("NormalizeByIntegratedMonitors")); - defaults[1] = inst->getNumberParameter("MonitorIntegralMin")[0]; - defaults[2] = inst->getNumberParameter("MonitorIntegralMax")[0]; - defaults[3] = inst->getNumberParameter("MonitorBackgroundMin")[0]; - defaults[4] = inst->getNumberParameter("MonitorBackgroundMax")[0]; - defaults[5] = inst->getNumberParameter("LambdaMin")[0]; - defaults[6] = inst->getNumberParameter("LambdaMax")[0]; - defaults[7] = inst->getNumberParameter("I0MonitorIndex")[0]; - - m_view->setInstDefaults(defaults); + defaults_double[1] = inst->getNumberParameter("MonitorIntegralMin")[0]; + defaults_double[2] = inst->getNumberParameter("MonitorIntegralMax")[0]; + defaults_double[3] = inst->getNumberParameter("MonitorBackgroundMin")[0]; + defaults_double[4] = inst->getNumberParameter("MonitorBackgroundMax")[0]; + defaults_double[5] = inst->getNumberParameter("LambdaMin")[0]; + defaults_double[6] = inst->getNumberParameter("LambdaMax")[0]; + defaults_double[7] = inst->getNumberParameter("I0MonitorIndex")[0]; + + std::vector defaults_str(1); + defaults_str[0] = alg->getPropertyValue("DetectorCorrectionType"); + + m_view->setInstDefaults(defaults_double, defaults_str); } /** Generates and returns an instance of the ReflectometryReductionOneAuto diff --git a/MantidQt/CustomInterfaces/test/ReflMockObjects.h b/MantidQt/CustomInterfaces/test/ReflMockObjects.h index f9ae733cc56d..29115c6f27c1 100644 --- a/MantidQt/CustomInterfaces/test/ReflMockObjects.h +++ b/MantidQt/CustomInterfaces/test/ReflMockObjects.h @@ -97,8 +97,9 @@ class MockSettingsView : public IReflSettingsView { MOCK_CONST_METHOD0(getTransmissionRuns, std::string()); MOCK_CONST_METHOD1(setPolarisationOptionsEnabled, void(bool)); MOCK_CONST_METHOD1(setExpDefaults, void(const std::vector &)); - MOCK_CONST_METHOD1(setInstDefaults, void(const std::vector &)); - MOCK_CONST_METHOD0(getCorrectionType, std::string()); + MOCK_CONST_METHOD1(setInstDefaults, void(const std::vector &), + void(const std::vector &)); + MOCK_CONST_METHOD0(getDetectorCorrectionType, std::string()); // Calls we don't care about void createStitchHints(const std::map &hints) override { diff --git a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h index 0f9c0f929f49..4107a94bf906 100644 --- a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h +++ b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h @@ -246,8 +246,7 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { "1.006831,-0.011467,0.002244,-0.000095", "1.017526,-0.017183,0.003136,-0.000140", "0.917940,0.038265,-0.006645,0.000282", - "0.972762,0.001828,-0.000261,0.0", - "VerticalShift"}; + "0.972762,0.001828,-0.000261,0.0"}; EXPECT_CALL(mockView, setExpDefaults(defaults)).Times(1); presenter.notify(IReflSettingsPresenter::ExpDefaultsFlag); @@ -264,9 +263,12 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { .Times(Exactly(1)); presenter.setInstrumentName("INTER"); - std::vector defaults = {1., 4.0, 10., 17., 18., 1.5, 17., 2.0}; + std::vector defaults_double = {1., 4.0, 10., 17., + 18., 1.5, 17., 2.0}; + std::vector defaults_str = {"VerticalShift"}; - EXPECT_CALL(mockView, setInstDefaults(defaults)).Times(1); + EXPECT_CALL(mockView, setInstDefaults(defaults_double, defaults_str)) + .Times(1); presenter.notify(IReflSettingsPresenter::InstDefaultsFlag); TS_ASSERT(Mock::VerifyAndClearExpectations(&mockView)); } From 0cd7e23cb027f7a1c44d31389183ff3685d3c0cb Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Wed, 22 Feb 2017 14:27:30 +0000 Subject: [PATCH 18/22] Re #18722 Add DetectorCorrectionType to docs --- .../source/algorithms/ReflectometryReductionOneAuto-v2.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/source/algorithms/ReflectometryReductionOneAuto-v2.rst b/docs/source/algorithms/ReflectometryReductionOneAuto-v2.rst index cc72b7197c16..bd7dd86f593d 100644 --- a/docs/source/algorithms/ReflectometryReductionOneAuto-v2.rst +++ b/docs/source/algorithms/ReflectometryReductionOneAuto-v2.rst @@ -28,9 +28,10 @@ Note that ProcessingInstructions are workspace indices, not detector IDs. The fi to monitors, rather than detectors of interest. For the syntax of this property, see :ref:`algm-GroupDetectors`. Once the algorithm determines the detectors of interest it corrects their positions according to :literal:`ThetaIn`, -if given, for which it runs :ref:`algm-SpecularReflectionPositionCorrect`. If :literal:`ThetaIn` is not set, detectors -will not be corrected. However, it is recommended to use this option to ensure that :ref:`algm-ReflectometryReductionOne` -is able to convert from wavelength to momentum transfer properly. +if given, for which it runs :ref:`algm-SpecularReflectionPositionCorrect`. The detectors are moved either by shifting them +vertically, or by rotating them around the sample position, as specified by :literal:`DetectorCorrectionType`. +If :literal:`ThetaIn` is not set, detectors will not be corrected. However, it is recommended to use this option to +ensure that :ref:`algm-ReflectometryReductionOne` is able to convert from wavelength to momentum transfer properly. Next, the algorithm will try to populate input properties which have not been set. Specifically, it will search for :literal:`LambdaMin`, :literal:`LambdaMax`, :literal:`I0MonitorIndex`, :literal:`MonitorBackgroundMin`, :literal:`MonitorBackgroundMax`, From 601c6259f7d46e21e63e391138c01785a42b89b1 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Wed, 22 Feb 2017 14:34:51 +0000 Subject: [PATCH 19/22] Re #18722 Add note to usage example --- docs/source/algorithms/SpecularReflectionPositionCorrect-v2.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/algorithms/SpecularReflectionPositionCorrect-v2.rst b/docs/source/algorithms/SpecularReflectionPositionCorrect-v2.rst index a6bd8e49c82b..7e4715f9c444 100644 --- a/docs/source/algorithms/SpecularReflectionPositionCorrect-v2.rst +++ b/docs/source/algorithms/SpecularReflectionPositionCorrect-v2.rst @@ -45,6 +45,8 @@ Usage Output: +Note that in this case the difference between shifting the detectors vertically or rotating them is negligible. + .. testoutput:: SpecularReflectionPositionCorrectPointDetector point-detector From c2ff85ef9e104d8e4d8dee46240556bff77d759c Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Wed, 22 Feb 2017 15:03:25 +0000 Subject: [PATCH 20/22] Re #18722 clang-format --- MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h index 4107a94bf906..19e1749facea 100644 --- a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h +++ b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h @@ -241,8 +241,7 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { presenter.setInstrumentName("POLREF"); std::vector defaults = { - "PointDetectorAnalysis", - "None", + "PointDetectorAnalysis", "None", "1.006831,-0.011467,0.002244,-0.000095", "1.017526,-0.017183,0.003136,-0.000140", "0.917940,0.038265,-0.006645,0.000282", From 674f9a38afbeb6cb0f0b65c538c8129af3beaaa1 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Wed, 22 Feb 2017 16:07:48 +0000 Subject: [PATCH 21/22] Re #18722 Fix compile error --- MantidQt/CustomInterfaces/test/ReflMockObjects.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MantidQt/CustomInterfaces/test/ReflMockObjects.h b/MantidQt/CustomInterfaces/test/ReflMockObjects.h index 29115c6f27c1..a4710201ab37 100644 --- a/MantidQt/CustomInterfaces/test/ReflMockObjects.h +++ b/MantidQt/CustomInterfaces/test/ReflMockObjects.h @@ -97,8 +97,8 @@ class MockSettingsView : public IReflSettingsView { MOCK_CONST_METHOD0(getTransmissionRuns, std::string()); MOCK_CONST_METHOD1(setPolarisationOptionsEnabled, void(bool)); MOCK_CONST_METHOD1(setExpDefaults, void(const std::vector &)); - MOCK_CONST_METHOD1(setInstDefaults, void(const std::vector &), - void(const std::vector &)); + MOCK_CONST_METHOD2(setInstDefaults, void(const std::vector &, + const std::vector &)); MOCK_CONST_METHOD0(getDetectorCorrectionType, std::string()); // Calls we don't care about void From caa322e24d8bb359e7f98b32cdb171fa29c2a6e1 Mon Sep 17 00:00:00 2001 From: Gemma Guest Date: Wed, 22 Feb 2017 16:15:11 +0000 Subject: [PATCH 22/22] Re #18722 Fix test failure --- .../test/ReflSettingsPresenterTest.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h index 19e1749facea..bbb57d693aa5 100644 --- a/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h +++ b/MantidQt/CustomInterfaces/test/ReflSettingsPresenterTest.h @@ -153,15 +153,15 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { EXPECT_CALL(mockView, getScaleFactor()) .Times(Exactly(1)) .WillOnce(Return("2")); - EXPECT_CALL(mockView, getDetectorCorrectionType()) - .Times(Exactly(1)) - .WillOnce(Return("VerticalShift")); EXPECT_CALL(mockView, getMomentumTransferStep()) .Times(Exactly(1)) .WillOnce(Return("-0.02")); EXPECT_CALL(mockView, getProcessingInstructions()) .Times(Exactly(1)) .WillOnce(Return("3,4")); + EXPECT_CALL(mockView, getDetectorCorrectionType()) + .Times(Exactly(1)) + .WillOnce(Return("VerticalShift")); EXPECT_CALL(mockView, getTransmissionRuns()) .Times(Exactly(1)) .WillOnce(Return("INTER00013463,INTER00013464")); @@ -192,9 +192,9 @@ class ReflSettingsPresenterTest : public CxxTest::TestSuite { TS_ASSERT_EQUALS(optionsVec[13], "WavelengthMax=15"); TS_ASSERT_EQUALS(optionsVec[14], "I0MonitorIndex=2"); TS_ASSERT_EQUALS(optionsVec[15], "ScaleFactor=2"); - TS_ASSERT_EQUALS(optionsVec[16], "DetectorCorrectionType=VerticalShift"); - TS_ASSERT_EQUALS(optionsVec[17], "MomentumTransferStep=-0.02"); - TS_ASSERT_EQUALS(optionsVec[18], "ProcessingInstructions=\"3,4\""); + TS_ASSERT_EQUALS(optionsVec[16], "MomentumTransferStep=-0.02"); + TS_ASSERT_EQUALS(optionsVec[17], "ProcessingInstructions=\"3,4\""); + TS_ASSERT_EQUALS(optionsVec[18], "DetectorCorrectionType=VerticalShift"); TS_ASSERT_EQUALS(optionsVec[19], "StartOverlap=10"); TS_ASSERT_EQUALS(optionsVec[20], "EndOverlap=12"); TS_ASSERT_EQUALS(optionsVec[21],