diff --git a/Framework/Algorithms/src/ScaleX.cpp b/Framework/Algorithms/src/ScaleX.cpp index d0ea8c9c6f4d1c08c408a653a0f57e8f98576ce7..b6a9e6e3d11fea378320fb0a3239a6cef05d04c3 100644 --- a/Framework/Algorithms/src/ScaleX.cpp +++ b/Framework/Algorithms/src/ScaleX.cpp @@ -199,13 +199,14 @@ void ScaleX::execEvent() { PARALLEL_START_INTERUPT_REGION // Do the offsetting if ((i >= m_wi_min) && (i <= m_wi_max)) { + auto factor = getScaleFactor(inputWS, i); if (op == "Multiply") { - outputWS->getEventList(i).scaleTof(getScaleFactor(inputWS, i)); - if (m_algFactor < 0) { + outputWS->getEventList(i).scaleTof(factor); + if (factor < 0) { outputWS->getEventList(i).reverse(); } } else if (op == "Add") { - outputWS->getEventList(i).addTof(getScaleFactor(inputWS, i)); + outputWS->getEventList(i).addTof(factor); } } m_progress->report("Scaling X"); diff --git a/Framework/Algorithms/test/ScaleXTest.h b/Framework/Algorithms/test/ScaleXTest.h index f6173453e1f42025c86e576d59a962cb98739e66..0d415af03560636b133509579f8ce9fc79417607 100644 --- a/Framework/Algorithms/test/ScaleXTest.h +++ b/Framework/Algorithms/test/ScaleXTest.h @@ -88,7 +88,7 @@ public: pmap.addDouble(det1->getComponentID(), parname, det1Factor); auto det2 = inputWS->getDetector(1); - const double det2Factor(10); + const double det2Factor(-10); pmap.addDouble(det2->getComponentID(), parname, det2Factor); const double instFactor(100); @@ -108,10 +108,22 @@ public: factor = instFactor; for (size_t j = 0; j < xsize; ++j) { - TS_ASSERT_DELTA(result->readX(i)[j], factor * inputWS->readX(i)[j], - 1e-12); - TS_ASSERT_EQUALS(result->readY(i)[j], inputWS->readY(i)[j]); - TS_ASSERT_EQUALS(result->readE(i)[j], inputWS->readE(i)[j]); + if (factor > 0) { + TS_ASSERT_DELTA(result->readX(i)[j], factor * inputWS->readX(i)[j], + 1e-12); + TS_ASSERT_EQUALS(result->readY(i)[j], inputWS->readY(i)[j]); + TS_ASSERT_EQUALS(result->readE(i)[j], inputWS->readE(i)[j]); + } else { + // ScaleX reverses the histogram if the factor is negative + // X vector has length xsize+1 + TS_ASSERT_DELTA(result->readX(i)[j], + factor * inputWS->readX(i)[xsize - j], 1e-12); + // Y and E have length xsize + TS_ASSERT_EQUALS(result->readY(i)[j], + inputWS->readY(i)[xsize - 1 - j]); + TS_ASSERT_EQUALS(result->readE(i)[j], + inputWS->readE(i)[xsize - 1 - j]); + } } } } @@ -131,7 +143,7 @@ public: pmap.addDouble(det1->getComponentID(), parname, det1Factor); auto det2 = inputWS->getDetector(1); - const double det2Factor(10); + const double det2Factor(-10); pmap.addDouble(det2->getComponentID(), parname, det2Factor); const double instFactor(100); @@ -143,6 +155,7 @@ public: boost::dynamic_pointer_cast<Mantid::API::IEventWorkspace>(result); TS_ASSERT(resultEventWS); + const size_t xsize = result->blocksize(); for (size_t i = 0; i < resultEventWS->getNumberHistograms(); ++i) { double factor(1.0); if (i == 0) @@ -163,6 +176,25 @@ public: for (size_t j = 0; i < inTOFs.size(); ++j) { TS_ASSERT_DELTA(outTOFs[j], factor * inTOFs[j], 1e-12); } + + for (size_t j = 0; j < xsize; ++j) { + if (factor > 0) { + TS_ASSERT_DELTA(result->readX(i)[j], factor * inputWS->readX(i)[j], + 1e-12); + TS_ASSERT_EQUALS(result->readY(i)[j], inputWS->readY(i)[j]); + TS_ASSERT_EQUALS(result->readE(i)[j], inputWS->readE(i)[j]); + } else { + // ScaleX reverses the histogram if the factor is negative + // X vector has length xsize+1 + TS_ASSERT_DELTA(result->readX(i)[j], + factor * inputWS->readX(i)[xsize - j], 1e-12); + // Y and E have length xsize + TS_ASSERT_EQUALS(result->readY(i)[j], + inputWS->readY(i)[xsize - 1 - j]); + TS_ASSERT_EQUALS(result->readE(i)[j], + inputWS->readE(i)[xsize - 1 - j]); + } + } } }