From e98ffba7da011e7389cc85c8ba1d9b9b1f9bf017 Mon Sep 17 00:00:00 2001 From: Raquel Alvarez <raquel.alvarez-banos@stfc.ac.uk> Date: Thu, 27 Oct 2016 08:33:13 +0100 Subject: [PATCH] Re #17429 Changes to unit tests + fix to algorithm --- .../src/ReflectometryReductionOne2.cpp | 89 ++++---- .../test/ReflectometryReductionOne2Test.h | 196 +++++++++++------- 2 files changed, 163 insertions(+), 122 deletions(-) diff --git a/Framework/Algorithms/src/ReflectometryReductionOne2.cpp b/Framework/Algorithms/src/ReflectometryReductionOne2.cpp index 97a36d3ee33..95faf4066cf 100644 --- a/Framework/Algorithms/src/ReflectometryReductionOne2.cpp +++ b/Framework/Algorithms/src/ReflectometryReductionOne2.cpp @@ -371,8 +371,8 @@ void ReflectometryReductionOne2::exec() { } // Transmission correction - Property *transmissionProperty = getProperty("FirstTransmissionRun"); - if (!transmissionProperty->isDefault()) { + MatrixWorkspace_sptr transRun = getProperty("FirstTransmissionRun"); + if (transRun) { IvsLam = transmissionCorrection(IvsLam); } else if (getPropertyValue("CorrectionAlgorithm") != "None") { IvsLam = algorithmicCorrection(IvsLam); @@ -448,7 +448,7 @@ MatrixWorkspace_sptr ReflectometryReductionOne2::makeDetectorWS( auto groupDirectBeamAlg = this->createChildAlgorithm("GroupDetectors"); groupDirectBeamAlg->initialize(); groupDirectBeamAlg->setProperty("GroupingPattern", processingCommands); - groupDirectBeamAlg->setProperty("InputWorkspace", detectorWS); + groupDirectBeamAlg->setProperty("InputWorkspace", inputWS); groupDirectBeamAlg->execute(); MatrixWorkspace_sptr directBeamWS = groupDirectBeamAlg->getProperty("OutputWorkspace"); @@ -527,55 +527,58 @@ ReflectometryReductionOne2::makeMonitorWS(MatrixWorkspace_sptr inputWS) { MatrixWorkspace_sptr ReflectometryReductionOne2::transmissionCorrection( MatrixWorkspace_sptr detectorWS) { - auto alg = this->createChildAlgorithm("CreateTransmissionWorkspace"); - alg->initialize(); - alg->setPropertyValue("FirstTransmissionRun", - getPropertyValue("FirstTransmissionRun")); - alg->setPropertyValue("SecondTransmissionRun", - getPropertyValue("SecondTransmissionRun")); - alg->setPropertyValue("Params", getPropertyValue("Params")); - alg->setPropertyValue("StartOverlap", getPropertyValue("StartOverlap")); - alg->setPropertyValue("EndOverlap", getPropertyValue("EndOverlap")); - alg->setPropertyValue("I0MonitorIndex", getPropertyValue("I0MonitorIndex")); - alg->setPropertyValue("WavelengthMin", getPropertyValue("WavelengthMin")); - alg->setPropertyValue("WavelengthMax", getPropertyValue("WavelengthMax")); - alg->setPropertyValue("MonitorBackgroundWavelengthMin", - getPropertyValue("MonitorBackgroundWavelengthMin")); - alg->setPropertyValue("MonitorBackgroundWavelengthMax", - getPropertyValue("MonitorBackgroundWavelengthMax")); - alg->setPropertyValue("MonitorIntegrationWavelengthMin", - getPropertyValue("MonitorIntegrationWavelengthMin")); - alg->setPropertyValue("MonitorIntegrationWavelengthMax", - getPropertyValue("MonitorIntegrationWavelengthMax")); - - // Processing instructions for transmission workspace - std::string transmissionCommands = getProperty("ProcessingInstructions"); const bool strictSpectrumChecking = getProperty("StrictSpectrumChecking"); - if (strictSpectrumChecking) { - // If we have strict spectrum checking, the processing commands need to be - // made from the - // numerator workspace AND the transmission workspace based on matching - // spectrum numbers. - MatrixWorkspace_sptr firstTransmissonWS = - getProperty("FirstTransmissionRun"); - transmissionCommands = - createProcessingCommandsFromDetectorWS(detectorWS, firstTransmissonWS); - } + MatrixWorkspace_sptr transmissionWS = getProperty("FirstTransmissionRun"); + Unit_const_sptr xUnit = transmissionWS->getAxis(0)->unit(); + + if (xUnit->unitID() == "TOF") { - alg->setProperty("ProcessingInstructions", transmissionCommands); - alg->execute(); - MatrixWorkspace_sptr transWS = alg->getProperty("OutputWorkspace"); + // Processing instructions for transmission workspace + std::string transmissionCommands = getProperty("ProcessingInstructions"); + if (strictSpectrumChecking) { + // If we have strict spectrum checking, the processing commands need to be + // made from the + // numerator workspace AND the transmission workspace based on matching + // spectrum numbers. + transmissionCommands = + createProcessingCommandsFromDetectorWS(detectorWS, transmissionWS); + } + + MatrixWorkspace_sptr secondTransmissionWS = + getProperty("SecondTransmissionRun"); + auto alg = this->createChildAlgorithm("CreateTransmissionWorkspace"); + alg->initialize(); + alg->setProperty("FirstTransmissionRun", transmissionWS); + alg->setProperty("SecondTransmissionRun", secondTransmissionWS); + alg->setPropertyValue("Params", getPropertyValue("Params")); + alg->setPropertyValue("StartOverlap", getPropertyValue("StartOverlap")); + alg->setPropertyValue("EndOverlap", getPropertyValue("EndOverlap")); + alg->setPropertyValue("I0MonitorIndex", getPropertyValue("I0MonitorIndex")); + alg->setPropertyValue("WavelengthMin", getPropertyValue("WavelengthMin")); + alg->setPropertyValue("WavelengthMax", getPropertyValue("WavelengthMax")); + alg->setPropertyValue("MonitorBackgroundWavelengthMin", + getPropertyValue("MonitorBackgroundWavelengthMin")); + alg->setPropertyValue("MonitorBackgroundWavelengthMax", + getPropertyValue("MonitorBackgroundWavelengthMax")); + alg->setPropertyValue("MonitorIntegrationWavelengthMin", + getPropertyValue("MonitorIntegrationWavelengthMin")); + alg->setPropertyValue("MonitorIntegrationWavelengthMax", + getPropertyValue("MonitorIntegrationWavelengthMax")); + alg->setProperty("ProcessingInstructions", transmissionCommands); + alg->execute(); + transmissionWS = alg->getProperty("OutputWorkspace"); + } // Rebin the transmission run to be the same as the input. auto rebinToWorkspaceAlg = this->createChildAlgorithm("RebinToWorkspace"); rebinToWorkspaceAlg->initialize(); rebinToWorkspaceAlg->setProperty("WorkspaceToMatch", detectorWS); - rebinToWorkspaceAlg->setProperty("WorkspaceToRebin", transWS); + rebinToWorkspaceAlg->setProperty("WorkspaceToRebin", transmissionWS); rebinToWorkspaceAlg->execute(); - transWS = rebinToWorkspaceAlg->getProperty("OutputWorkspace"); + transmissionWS = rebinToWorkspaceAlg->getProperty("OutputWorkspace"); - const bool match = verifySpectrumMaps(detectorWS, transWS); + const bool match = verifySpectrumMaps(detectorWS, transmissionWS); if (!match) { std::string message = "Spectrum maps between workspaces do NOT match up."; if (strictSpectrumChecking) { @@ -585,7 +588,7 @@ MatrixWorkspace_sptr ReflectometryReductionOne2::transmissionCorrection( } } - MatrixWorkspace_sptr normalized = divide(detectorWS, transWS); + MatrixWorkspace_sptr normalized = divide(detectorWS, transmissionWS); return normalized; } diff --git a/Framework/Algorithms/test/ReflectometryReductionOne2Test.h b/Framework/Algorithms/test/ReflectometryReductionOne2Test.h index 812009165c9..bec3d0a9c75 100644 --- a/Framework/Algorithms/test/ReflectometryReductionOne2Test.h +++ b/Framework/Algorithms/test/ReflectometryReductionOne2Test.h @@ -9,6 +9,7 @@ #include "MantidAPI/MatrixWorkspace.h" #include "MantidHistogramData/HistogramY.h" #include "MantidTestHelpers/WorkspaceCreationHelper.h" + #include <algorithm> using namespace Mantid::API; @@ -36,10 +37,9 @@ public: m_multiDetectorWS = create2DWorkspaceWithReflectometryInstrumentMultiDetector(); // A workspace in wavelength - m_wavelengthWS = Create2DWorkspace154(1, 10, true); - m_wavelengthWS->setInstrument(m_multiDetectorWS->getInstrument()); + m_wavelengthWS = + create2DWorkspaceWithReflectometryInstrumentMultiDetector(); m_wavelengthWS->getAxis(0)->setUnit("Wavelength"); - } void test_IvsLam() { @@ -63,8 +63,8 @@ public: TS_ASSERT(outLam); TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1); TS_ASSERT_EQUALS(outLam->blocksize(), 8); - TS_ASSERT(outLam->readX(0)[0] >= 1.5); - TS_ASSERT(outLam->readX(0)[7] <= 15.0); + TS_ASSERT(outLam->x(0)[0] >= 1.5); + TS_ASSERT(outLam->x(0)[7] <= 15.0); TS_ASSERT_DELTA(outLam->y(0)[0], 3.1530, 0.0001); TS_ASSERT_DELTA(outLam->y(0)[7], 3.1530, 0.0001); } @@ -90,14 +90,14 @@ public: TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1); TS_ASSERT_EQUALS(outLam->blocksize(), 8); - TS_ASSERT(outLam->readX(0)[0] >= 1.5); - TS_ASSERT(outLam->readX(0)[7] <= 15.0); + TS_ASSERT(outLam->x(0)[0] >= 1.5); + TS_ASSERT(outLam->x(0)[7] <= 15.0); // Y counts, should be 3.1530 * 2 TS_ASSERT_DELTA(outLam->y(0)[0], 6.3060, 0.0001); TS_ASSERT_DELTA(outLam->y(0)[7], 6.3060, 0.0001); } - void test_IvsLam_processing_instructions_1to3(){ + void test_IvsLam_processing_instructions_1to3() { // Test IvsLam workspace // No monitor normalization // No direct beam normalization @@ -118,14 +118,14 @@ public: TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1); TS_ASSERT_EQUALS(outLam->blocksize(), 8); - TS_ASSERT(outLam->readX(0)[0] >= 1.5); - TS_ASSERT(outLam->readX(0)[7] <= 15.0); + TS_ASSERT(outLam->x(0)[0] >= 1.5); + TS_ASSERT(outLam->x(0)[7] <= 15.0); // Y counts, should be 3.1530 * 3 TS_ASSERT_DELTA(outLam->y(0)[0], 9.4590, 0.0001); TS_ASSERT_DELTA(outLam->y(0)[7], 9.4590, 0.0001); } - void xtest_bad_processing_instructions() { + void test_bad_processing_instructions() { // Processing instructions : 5+6 auto alg = AlgorithmManager::Instance().create("ReflectometryReductionOne"); @@ -136,12 +136,12 @@ public: alg->setProperty("WavelengthMax", 15.0); alg->setPropertyValue("OutputWorkspace", "IvsQ"); alg->setPropertyValue("OutputWorkspaceWavelength", "IvsLam"); - alg->setPropertyValue("ProcessingInstructions", "1+2"); + alg->setPropertyValue("ProcessingInstructions", "5+6"); // Must throw as spectrum 2 is not defined TS_ASSERT_THROWS_ANYTHING(alg->execute()); } - void xtest_IvsLam_direct_beam() { + void test_IvsLam_direct_beam() { // Test IvsLam workspace // No monitor normalization // Direct beam normalization: 2-3 @@ -163,14 +163,11 @@ public: TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1); TS_ASSERT_EQUALS(outLam->blocksize(), 8); - TS_ASSERT(outLam->readX(0)[0] >= 1.5); - TS_ASSERT(outLam->readX(0)[7] <= 15.0); // Y counts, should be 0.5 = 1 (from detector ws) / 2 (from direct beam) TS_ASSERT_DELTA(outLam->y(0)[0], 0.5, 0.0001); - TS_ASSERT_DELTA(outLam->y(0)[7], 0.5, 0.0001); } - void xtest_bad_direct_beam() { + void test_bad_direct_beam() { // Direct beam : 4-5 auto alg = AlgorithmManager::Instance().create("ReflectometryReductionOne"); @@ -179,14 +176,10 @@ public: alg->setProperty("InputWorkspace", m_multiDetectorWS); alg->setProperty("WavelengthMin", 1.5); alg->setProperty("WavelengthMax", 15.0); - alg->setProperty("MomentumTransferStep", 0.1); - alg->setProperty("AnalysisMode", "PointDetectorAnalysis"); - alg->setProperty("NormalizeByIntegratedMonitors", "0"); alg->setPropertyValue("ProcessingInstructions", "1"); alg->setPropertyValue("OutputWorkspace", "IvsQ"); alg->setPropertyValue("OutputWorkspaceWavelength", "IvsLam"); alg->setPropertyValue("RegionOfDirectBeam", "4-5"); - // Must throw region of interest is incompatible with point detector TS_ASSERT_THROWS_ANYTHING(alg->execute()); } @@ -216,8 +209,8 @@ public: TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1); TS_ASSERT_EQUALS(outLam->blocksize(), 8); - TS_ASSERT(outLam->readX(0)[0] >= 1.5); - TS_ASSERT(outLam->readX(0)[7] <= 15.0); + TS_ASSERT(outLam->x(0)[0] >= 1.5); + TS_ASSERT(outLam->x(0)[7] <= 15.0); // No monitors considered because MonitorBackgroundWavelengthMin // and MonitorBackgroundWavelengthMax were not set // Y counts must be 3.1530 @@ -225,7 +218,7 @@ public: TS_ASSERT_DELTA(outLam->y(0)[7], 3.1530, 0.0001); } - void xtest_IvsLam_monitor_normalization() { + void test_IvsLam_monitor_normalization() { // Test IvsLam workspace // Monitor normalization // No direct beam normalization @@ -241,14 +234,13 @@ public: // Modify counts only for range that will be fitted auto inputWS = m_multiDetectorWS; auto &Y = inputWS->mutableY(0); - Y = 1.0; - //std::fill(Y.begin(), Y.begin()+2, 1.0); + std::fill(Y.begin(), Y.begin() + 2, 1.0); ReflectometryReductionOne2 alg; alg.setChild(true); alg.initialize(); alg.setProperty("InputWorkspace", inputWS); - alg.setProperty("WavelengthMin", 1.5); + alg.setProperty("WavelengthMin", 0.0); alg.setProperty("WavelengthMax", 15.0); alg.setProperty("I0MonitorIndex", "0"); alg.setProperty("MonitorBackgroundWavelengthMin", 0.5); @@ -261,15 +253,16 @@ public: MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength"); TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1); - TS_ASSERT_EQUALS(outLam->blocksize(), 8); - TS_ASSERT(outLam->readX(0)[0] >= 1.5); - TS_ASSERT(outLam->readX(0)[7] <= 15.0); + TS_ASSERT_EQUALS(outLam->blocksize(), 10); + TS_ASSERT(outLam->x(0)[0] >= 0.0); + TS_ASSERT(outLam->x(0)[7] <= 15.0); // Expected values are 2.4996 = 3.15301 (detectors) / 1.26139 (monitors) - TS_ASSERT_DELTA(outLam->y(0)[0], 2.4996, 0.0001); + TS_ASSERT_DELTA(outLam->y(0)[2], 2.4996, 0.0001); + TS_ASSERT_DELTA(outLam->y(0)[4], 2.4996, 0.0001); TS_ASSERT_DELTA(outLam->y(0)[7], 2.4996, 0.0001); } - void xtest_IvsLam_integrated_monitors() { + void test_IvsLam_integrated_monitors() { // Test IvsLam workspace // Monitor normalization // No direct beam normalization @@ -285,19 +278,20 @@ public: // Modify counts only for range that will be fitted auto inputWS = m_multiDetectorWS; auto &Y = inputWS->mutableY(0); - Y = 1.0; - //std::fill(Y.begin(), Y.begin()+2, 1.0); + std::fill(Y.begin(), Y.begin() + 2, 1.0); ReflectometryReductionOne2 alg; alg.setChild(true); alg.initialize(); alg.setProperty("InputWorkspace", inputWS); - alg.setProperty("WavelengthMin", 1.5); + alg.setProperty("WavelengthMin", 0.0); alg.setProperty("WavelengthMax", 15.0); alg.setProperty("I0MonitorIndex", "0"); alg.setProperty("MonitorBackgroundWavelengthMin", 0.5); alg.setProperty("MonitorBackgroundWavelengthMax", 3.0); alg.setProperty("NormalizeByIntegratedMonitors", "1"); + alg.setProperty("MonitorIntegrationWavelengthMin", 1.5); + alg.setProperty("MonitorIntegrationWavelengthMax", 15.0); alg.setPropertyValue("ProcessingInstructions", "1"); alg.setPropertyValue("OutputWorkspace", "IvsQ"); alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam"); @@ -305,15 +299,15 @@ public: MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength"); TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1); - TS_ASSERT_EQUALS(outLam->blocksize(), 8); - TS_ASSERT(outLam->readX(0)[0] >= 1.5); - TS_ASSERT(outLam->readX(0)[7] <= 15.0); + TS_ASSERT_EQUALS(outLam->blocksize(), 10); + TS_ASSERT(outLam->x(0)[0] >= 0.0); + TS_ASSERT(outLam->x(0)[7] <= 15.0); // Expected values are 0.3124 = 3.15301 (detectors) / (1.26139*8) (monitors) TS_ASSERT_DELTA(outLam->y(0)[0], 0.3124, 0.0001); TS_ASSERT_DELTA(outLam->y(0)[7], 0.3124, 0.0001); } - void xtest_transmission_correction_run() { + void test_transmission_correction_run() { // Transmission run is the same as input run ReflectometryReductionOne2 alg; @@ -329,24 +323,50 @@ public: alg.execute(); MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength"); + TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 4); + TS_ASSERT_EQUALS(outLam->blocksize(), 20); + // Expected values are 1 = m_wavelength / m_wavelength + TS_ASSERT_DELTA(outLam->y(0)[0], 1.0000, 0.0001); + TS_ASSERT_DELTA(outLam->y(0)[7], 1.0000, 0.0001); + } + + void test_transmission_correction_two_runs() { + // Transmission run is the same as input run + + ReflectometryReductionOne2 alg; + alg.setChild(true); + alg.initialize(); + alg.setProperty("InputWorkspace", m_multiDetectorWS); + alg.setProperty("FirstTransmissionRun", m_multiDetectorWS); + alg.setProperty("SecondTransmissionRun", m_multiDetectorWS); + alg.setProperty("StartOverlap", 2.5); + alg.setProperty("EndOverlap", 3.0); + alg.setProperty("Params", "0.1"); + alg.setProperty("WavelengthMin", 1.5); + alg.setProperty("WavelengthMax", 15.0); + alg.setProperty("ProcessingInstructions", "1"); + alg.setPropertyValue("OutputWorkspace", "IvsQ"); + alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam"); + alg.execute(); + MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength"); + TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1); - TS_ASSERT_EQUALS(outLam->blocksize(), 10); + TS_ASSERT_EQUALS(outLam->blocksize(), 8); // Expected values are 1 = m_wavelength / m_wavelength TS_ASSERT_DELTA(outLam->y(0)[0], 1.0000, 0.0001); TS_ASSERT_DELTA(outLam->y(0)[7], 1.0000, 0.0001); } - void xtest_exponential_correction() { + void test_exponential_correction() { // CorrectionAlgorithm: ExponentialCorrection - + ReflectometryReductionOne2 alg; alg.setChild(true); alg.initialize(); - alg.setProperty("InputWorkspace", m_wavelengthWS); + alg.setProperty("InputWorkspace", m_multiDetectorWS); alg.setProperty("WavelengthMin", 1.5); alg.setProperty("WavelengthMax", 15.0); - alg.setProperty("ProcessingInstructions", "100"); - alg.setProperty("CorrectDetectorPositions", false); + alg.setProperty("ProcessingInstructions", "1"); alg.setProperty("CorrectionAlgorithm", "ExponentialCorrection"); alg.setProperty("C0", 0.2); alg.setProperty("C1", 0.1); @@ -356,10 +376,10 @@ public: MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength"); TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1); - TS_ASSERT_EQUALS(outLam->blocksize(), 10); + TS_ASSERT_EQUALS(outLam->blocksize(), 8); // Expected values are 29.0459 and 58.4912 - TS_ASSERT_DELTA(outLam->y(0)[0], 29.0459, 0.0001); - TS_ASSERT_DELTA(outLam->y(0)[7], 58.4912, 0.0001); + TS_ASSERT_DELTA(outLam->y(0)[0], 22.4437, 0.0001); + TS_ASSERT_DELTA(outLam->y(0)[7], 60.3415, 0.0001); } void test_polynomial_correction() { @@ -368,10 +388,10 @@ public: ReflectometryReductionOne2 alg; alg.setChild(true); alg.initialize(); - alg.setProperty("InputWorkspace", m_wavelengthWS); + alg.setProperty("InputWorkspace", m_multiDetectorWS); alg.setProperty("WavelengthMin", 1.5); alg.setProperty("WavelengthMax", 15.0); - alg.setProperty("ProcessingInstructions", "100"); + alg.setProperty("ProcessingInstructions", "1"); alg.setProperty("CorrectionAlgorithm", "PolynomialCorrection"); alg.setProperty("Polynomial", "0.1,0.3,0.5"); alg.setPropertyValue("OutputWorkspace", "IvsQ"); @@ -380,59 +400,66 @@ public: MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength"); TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1); - TS_ASSERT_EQUALS(outLam->blocksize(), 10); - // Expected values are 2.9851 and 0.1289 - TS_ASSERT_DELTA(outLam->y(0)[0], 2.9851, 0.0001); - TS_ASSERT_DELTA(outLam->y(0)[7], 0.1289, 0.0001); + TS_ASSERT_EQUALS(outLam->blocksize(), 8); + TS_ASSERT_DELTA(outLam->y(0)[0], 0.4262, 0.0001); + TS_ASSERT_DELTA(outLam->y(0)[7], 0.0334, 0.0001); } - void xtest_IvsQ_no_rebin() { + void test_IvsQ_no_rebin() { ReflectometryReductionOne2 alg; alg.setChild(true); alg.initialize(); - alg.setProperty("InputWorkspace", m_wavelengthWS); + alg.setProperty("InputWorkspace", m_multiDetectorWS); alg.setProperty("WavelengthMin", 1.5); alg.setProperty("WavelengthMax", 15.0); - alg.setProperty("ProcessingInstructions", "100"); + alg.setProperty("ProcessingInstructions", "1"); alg.setPropertyValue("OutputWorkspace", "IvsQ"); alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam"); alg.execute(); MatrixWorkspace_sptr outQ = alg.getProperty("OutputWorkspace"); - // TODO: test some values + TS_ASSERT_EQUALS(outQ->getNumberHistograms(), 1); + TS_ASSERT_EQUALS(outQ->blocksize(), 8); + // X range in outQ + TS_ASSERT_DELTA(outQ->x(0)[0], 0.3403, 0.0001); + TS_ASSERT_DELTA(outQ->x(0)[7], 1.1345, 0.0001); } - void xtest_IvsQ_linear_binning() { + void test_IvsQ_linear_binning() { ReflectometryReductionOne2 alg; alg.setChild(true); alg.initialize(); - alg.setProperty("InputWorkspace", m_wavelengthWS); + alg.setProperty("InputWorkspace", m_multiDetectorWS); alg.setProperty("WavelengthMin", 1.5); alg.setProperty("WavelengthMax", 15.0); - alg.setProperty("ProcessingInstructions", "100"); + alg.setProperty("ProcessingInstructions", "1"); alg.setProperty("MomentumTransferMin", 1.0); alg.setProperty("MomentumTransferMax", 10.0); - alg.setProperty("MomentumTransferStep", 0.04); + alg.setProperty("MomentumTransferStep", -0.04); alg.setPropertyValue("OutputWorkspace", "IvsQ"); alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam"); alg.execute(); MatrixWorkspace_sptr outQ = alg.getProperty("OutputWorkspace"); - // TODO: choose appropriate values for MomentumTransferMin, MomentumTransferMax, MomentumTransferStep - // TODO: test some values + std::cout << m_multiDetectorWS->blocksize() << "\n"; + TS_ASSERT_EQUALS(outQ->getNumberHistograms(), 1); + // blocksize = (10.0 - 1.0) / 0.04 + TS_ASSERT_EQUALS(outQ->blocksize(), 225); + TS_ASSERT_DELTA(outQ->x(0)[1] - outQ->x(0)[0], 0.04, 1e-6); + TS_ASSERT_DELTA(outQ->x(0)[2] - outQ->x(0)[1], 0.04, 1e-6); } - void xtest_IvsQ_logarithmic_binning() { + void test_IvsQ_logarithmic_binning() { ReflectometryReductionOne2 alg; alg.setChild(true); alg.initialize(); - alg.setProperty("InputWorkspace", m_wavelengthWS); + alg.setProperty("InputWorkspace", m_multiDetectorWS); alg.setProperty("WavelengthMin", 1.5); alg.setProperty("WavelengthMax", 15.0); - alg.setProperty("ProcessingInstructions", "100"); + alg.setProperty("ProcessingInstructions", "1"); alg.setProperty("MomentumTransferMin", 1.0); alg.setProperty("MomentumTransferMax", 10.0); alg.setProperty("MomentumTransferStep", 0.04); @@ -441,48 +468,59 @@ public: alg.execute(); MatrixWorkspace_sptr outQ = alg.getProperty("OutputWorkspace"); - // TODO: choose appropriate values for MomentumTransferMin, MomentumTransferMax, MomentumTransferStep - // TODO: test some values + TS_ASSERT_EQUALS(outQ->getNumberHistograms(), 1); + TS_ASSERT_DIFFERS(outQ->blocksize(), 8); + TS_ASSERT_DELTA(outQ->x(0)[1] - outQ->x(0)[0], 0.04, 1e-6); + TS_ASSERT(outQ->x(0)[7] - outQ->x(0)[6] > 0.05); } - void xtest_IvsQ_q_range() { + void test_IvsQ_q_range() { ReflectometryReductionOne2 alg; alg.setChild(true); alg.initialize(); - alg.setProperty("InputWorkspace", m_wavelengthWS); + alg.setProperty("InputWorkspace", m_multiDetectorWS); alg.setProperty("WavelengthMin", 1.5); alg.setProperty("WavelengthMax", 15.0); - alg.setProperty("ProcessingInstructions", "100"); + alg.setProperty("ProcessingInstructions", "2"); alg.setPropertyValue("OutputWorkspace", "IvsQ"); alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam"); alg.execute(); MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength"); MatrixWorkspace_sptr outQ = alg.getProperty("OutputWorkspace"); - // TODO: check that q = 4 * pi / lambda * sin(theta) + TS_ASSERT_EQUALS(outQ->getNumberHistograms(), 1); + TS_ASSERT_EQUALS(outQ->blocksize(), 8); + // X range in outLam + TS_ASSERT_DELTA(outLam->x(0)[0], 2.8257, 0.0001); + TS_ASSERT_DELTA(outLam->x(0)[7], 12.7158, 0.0001); + // X range in outQ + TS_ASSERT_DELTA(outQ->x(0)[0], 0.3403, 0.0001); + TS_ASSERT_DELTA(outQ->x(0)[7], 1.1345, 0.0001); } - void xtest_IvsQ_scale() { + void test_IvsQ_scale() { ReflectometryReductionOne2 alg; alg.setChild(true); alg.initialize(); - alg.setProperty("InputWorkspace", m_wavelengthWS); + alg.setProperty("InputWorkspace", m_multiDetectorWS); alg.setProperty("WavelengthMin", 1.5); alg.setProperty("WavelengthMax", 15.0); - alg.setProperty("ProcessingInstructions", "100"); + alg.setProperty("ProcessingInstructions", "1"); + alg.setProperty("ScaleFactor", 2.); alg.setPropertyValue("OutputWorkspace", "IvsQ"); alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam"); alg.execute(); MatrixWorkspace_sptr outQ = alg.getProperty("OutputWorkspace"); TS_ASSERT_EQUALS(outQ->getNumberHistograms(), 1); - TS_ASSERT_EQUALS(outQ->blocksize(), 10); + TS_ASSERT_EQUALS(outQ->blocksize(), 8); - // TODO: test some values + // Output should be 3.1530 / scaleFactor + TS_ASSERT_DELTA(outQ->y(0)[0], 1.5765, 1e-4); + TS_ASSERT_DELTA(outQ->y(0)[7], 1.5765, 1e-4); } - }; #endif /* ALGORITHMS_TEST_REFLECTOMETRYREDUCTIONONE2TEST_H_ */ -- GitLab