diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/IMDHistoWorkspace.h b/Code/Mantid/Framework/API/inc/MantidAPI/IMDHistoWorkspace.h index 3f9dd4549f9d36ebc464abbf2d83df7f4b9635a8..9c5c55b504522f00c1ed8bf914332f7c264ece7c 100644 --- a/Code/Mantid/Framework/API/inc/MantidAPI/IMDHistoWorkspace.h +++ b/Code/Mantid/Framework/API/inc/MantidAPI/IMDHistoWorkspace.h @@ -96,6 +96,8 @@ public: virtual void setCoordinateSystem( const Kernel::SpecialCoordinateSystem coordinateSystem) = 0; + virtual void setDisplayNormalization( + const Mantid::API::MDNormalization &preferredNormalization) = 0; protected: /// Protected copy constructor. May be used by childs for cloning. diff --git a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/MDHistoWorkspace.h b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/MDHistoWorkspace.h index 712bc267acf31e9ed5f222e6460755334e020a1f..fe7f85112132ec008f042285c305905c866bddec 100644 --- a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/MDHistoWorkspace.h +++ b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/MDHistoWorkspace.h @@ -393,6 +393,8 @@ public: /// Preferred visual normalization method. virtual Mantid::API::MDNormalization displayNormalizationHisto() const; + virtual void setDisplayNormalization(const Mantid::API::MDNormalization& preferredNormalization); + private: virtual MDHistoWorkspace *doClone() const { return new MDHistoWorkspace(*this); diff --git a/Code/Mantid/Framework/DataObjects/src/MDHistoWorkspace.cpp b/Code/Mantid/Framework/DataObjects/src/MDHistoWorkspace.cpp index 3cac232b35581c6f5c2d0b62221949c44e5ad924..b842deb0be1addd99c1f85e78e3c4b5ca07ef0f2 100644 --- a/Code/Mantid/Framework/DataObjects/src/MDHistoWorkspace.cpp +++ b/Code/Mantid/Framework/DataObjects/src/MDHistoWorkspace.cpp @@ -1247,5 +1247,9 @@ MDNormalization MDHistoWorkspace::displayNormalizationHisto() const { return displayNormalization();// Normalize by the number of events. } +void MDHistoWorkspace::setDisplayNormalization(const Mantid::API::MDNormalization& preferredNormalization) { + m_displayNormalization = preferredNormalization; +} + } // namespace Mantid } // namespace DataObjects diff --git a/Code/Mantid/Framework/MDAlgorithms/src/BinMD.cpp b/Code/Mantid/Framework/MDAlgorithms/src/BinMD.cpp index 233f9969e462ece5f60fa6e72cf4727e97cbad83..f914d8e5b0c3d939ef2a99dc1803fbf3ad8a9fac 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/BinMD.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/BinMD.cpp @@ -437,6 +437,9 @@ void BinMD::exec() { outWS->copyExperimentInfos(*inEWS); } + // Pass on the display normalization from the input workspace + outWS->setDisplayNormalization(m_inWS->displayNormalizationHisto()); + outWS->updateSum(); // Save the output setProperty("OutputWorkspace", boost::dynamic_pointer_cast<Workspace>(outWS)); diff --git a/Code/Mantid/Framework/MDAlgorithms/src/IntegrateMDHistoWorkspace.cpp b/Code/Mantid/Framework/MDAlgorithms/src/IntegrateMDHistoWorkspace.cpp index d8b7faabba3636648d640aa24fbca08801e4e0fa..4aad8905a1516b2ab794f98520ae78e70bf426d9 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/IntegrateMDHistoWorkspace.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/IntegrateMDHistoWorkspace.cpp @@ -353,6 +353,7 @@ void IntegrateMDHistoWorkspace::exec() { PARALLEL_END_INTERUPT_REGION } PARALLEL_CHECK_INTERUPT_REGION + outWS->setDisplayNormalization(inWS->displayNormalizationHisto()); this->setProperty("OutputWorkspace", outWS); } } diff --git a/Code/Mantid/Framework/MDAlgorithms/src/MDNormDirectSC.cpp b/Code/Mantid/Framework/MDAlgorithms/src/MDNormDirectSC.cpp index df1dcf13a34e8cef3773929f16f3cb0eeac7ef88..d4cab12b4a2f41081b5dbe6d3bd143d2608f0fa1 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/MDNormDirectSC.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/MDNormDirectSC.cpp @@ -122,6 +122,9 @@ void MDNormDirectSC::exec() { g_log.warning("Binning limits are outside the limits of the MDWorkspace. " "Not applying normalization."); } + + // Set the display normalization based on the input workspace + outputWS->setDisplayNormalization(m_inputWS->displayNormalizationHisto()); } /** diff --git a/Code/Mantid/Framework/MDAlgorithms/src/SliceMD.cpp b/Code/Mantid/Framework/MDAlgorithms/src/SliceMD.cpp index ba99b4778f9be5073d0c9c815e38566392df9de9..04cce85346c22cdbb41114dd83013bda81cc98fd 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/SliceMD.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/SliceMD.cpp @@ -280,10 +280,15 @@ void SliceMD::slice(typename MDEventWorkspace<MDE, nd>::sptr ws) { alg->setProperty("InputWorkspace", outWS); alg->executeAsChildAlg(); } + + // Pass on the display normalization from the input event workspace to the output event workspace + IMDEventWorkspace_sptr outEvent = boost::dynamic_pointer_cast<IMDEventWorkspace>(outWS); + outEvent->setDisplayNormalization(ws->displayNormalization()); + outEvent->setDisplayNormalizationHisto(ws->displayNormalizationHisto()); // return the size of the input workspace write buffer to its initial value // bc->setCacheParameters(sizeof(MDE),writeBufSize); this->setProperty("OutputWorkspace", - boost::dynamic_pointer_cast<IMDEventWorkspace>(outWS)); + outEvent); delete prog; } diff --git a/Code/Mantid/Framework/MDAlgorithms/test/BinMDTest.h b/Code/Mantid/Framework/MDAlgorithms/test/BinMDTest.h index 68385b6595606a0f28832fda6abc7632189186a6..9ef2827472803f9c68511b4bf255f7cdb53f087c 100644 --- a/Code/Mantid/Framework/MDAlgorithms/test/BinMDTest.h +++ b/Code/Mantid/Framework/MDAlgorithms/test/BinMDTest.h @@ -128,6 +128,10 @@ public: IMDEventWorkspace_sptr in_ws = MDEventsTestHelper::makeMDEW<3>(10, 0.0, 10.0, numEventsPerBox); Mantid::Kernel::SpecialCoordinateSystem appliedCoord = Mantid::Kernel::QSample; in_ws->setCoordinateSystem(appliedCoord); + auto eventNorm = Mantid::API::MDNormalization::VolumeNormalization; + auto histoNorm = Mantid::API::MDNormalization::NumEventsNormalization; + in_ws->setDisplayNormalization(eventNorm); + in_ws->setDisplayNormalizationHisto(histoNorm); AnalysisDataService::Instance().addOrReplace("BinMDTest_ws", in_ws); // 1000 boxes with 1 event each @@ -179,7 +183,7 @@ public: TS_ASSERT(ctFrom); // Experiment Infos were copied TS_ASSERT_EQUALS( out->getNumExperimentInfo(), in_ws->getNumExperimentInfo()); - + TSM_ASSERT_EQUALS("Should have num events normalization", out->displayNormalization(), histoNorm); AnalysisDataService::Instance().remove("BinMDTest_ws"); } diff --git a/Code/Mantid/Framework/MDAlgorithms/test/CutMDTest.h b/Code/Mantid/Framework/MDAlgorithms/test/CutMDTest.h index ac87a7dba8fc07a436374030e4fb46d3950c957e..1f2b761e5ff76085f480859b03fa30766bfa1726 100644 --- a/Code/Mantid/Framework/MDAlgorithms/test/CutMDTest.h +++ b/Code/Mantid/Framework/MDAlgorithms/test/CutMDTest.h @@ -20,12 +20,26 @@ using namespace Mantid::Kernel; namespace { const std::string sharedWSName = "__CutMDTest_dataWS"; +const Mantid::API::MDNormalization eventNorm = Mantid::API::MDNormalization::VolumeNormalization; +const Mantid::API::MDNormalization histoNorm = Mantid::API::MDNormalization::NumEventsNormalization; } class CutMDTest : public CxxTest::TestSuite { private: IMDWorkspace_sptr m_inWS; + void addNormalization(std::string wsName) { + auto ws = AnalysisDataService::Instance().retrieveWS<IMDWorkspace>(wsName); + auto eventWS = boost::dynamic_pointer_cast<IMDEventWorkspace>(ws); + auto histoWS = boost::dynamic_pointer_cast<IMDHistoWorkspace>(ws); + if (eventWS) { + eventWS->setDisplayNormalization(eventNorm); + eventWS->setDisplayNormalizationHisto(histoNorm); + } else { + eventWS->setDisplayNormalization(histoNorm); + } + } + public: CutMDTest() { FrameworkManager::Instance().exec("CreateMDWorkspace", 10, @@ -54,6 +68,9 @@ public: m_inWS = AnalysisDataService::Instance().retrieveWS<IMDWorkspace>(sharedWSName); + auto eventWS = boost::dynamic_pointer_cast<IMDEventWorkspace>(m_inWS); + eventWS->setDisplayNormalization(eventNorm); + eventWS->setDisplayNormalizationHisto(histoNorm); } virtual ~CutMDTest() { AnalysisDataService::Instance().remove(sharedWSName); } @@ -82,7 +99,6 @@ public: FrameworkManager::Instance().exec("SetSpecialCoordinates", 4, "InputWorkspace", wsName.c_str(), "SpecialCoordinates", "HKL"); - auto algCutMD = FrameworkManager::Instance().createAlgorithm("CutMD"); algCutMD->initialize(); algCutMD->setRethrows(true); @@ -138,6 +154,9 @@ public: TS_ASSERT_EQUALS("[0, 'eta', 0]", outWS->getDimension(1)->getName()); TS_ASSERT_EQUALS("[0, 0, 'xi']", outWS->getDimension(2)->getName()); + TSM_ASSERT_EQUALS("Should have num events normalization", + outWS->displayNormalizationHisto(), histoNorm); + AnalysisDataService::Instance().remove(wsName); } @@ -164,6 +183,9 @@ public: TS_ASSERT_DELTA(outWS->getDimension(0)->getMaximum(), 0.6, 1E-6); TS_ASSERT_EQUALS(outWS->getDimension(0)->getNBins(), 2); + TSM_ASSERT_EQUALS("Should have num events normalization", + outWS->displayNormalizationHisto(), histoNorm); + AnalysisDataService::Instance().remove(wsName); } @@ -189,6 +211,9 @@ public: TS_ASSERT_EQUALS(outWS->getDimension(0)->getNBins(), 1); TS_ASSERT_EQUALS(outWS->getDimension(1)->getNBins(), 1); + TSM_ASSERT_EQUALS("Should have num events normalization", + outWS->displayNormalizationHisto(), histoNorm); + AnalysisDataService::Instance().remove(wsName); } @@ -224,6 +249,8 @@ public: vRow << "v" << V3D(0,1,0) << 0.0 << "r"; wRow << "w" << V3D(0,0,1) << 0.0 << "r"; + addNormalization(wsName); + auto algCutMD = FrameworkManager::Instance().createAlgorithm("CutMD"); algCutMD->initialize(); algCutMD->setRethrows(true); @@ -251,6 +278,9 @@ public: TS_ASSERT_EQUALS("[0, 'eta', 0]", outWS->getDimension(1)->getName()); TS_ASSERT_EQUALS("[0, 0, 'xi']", outWS->getDimension(2)->getName()); + TSM_ASSERT_EQUALS("Should have num events normalization", + outWS->displayNormalizationHisto(), histoNorm); + AnalysisDataService::Instance().remove(wsName); } @@ -286,6 +316,8 @@ public: vRow << "v" << V3D(-1,1,0) << 0.0 << "r"; wRow << "w" << V3D(0,0,1) << 0.0 << "r"; + addNormalization(wsName); + auto algCutMD = FrameworkManager::Instance().createAlgorithm("CutMD"); algCutMD->initialize(); algCutMD->setRethrows(true); @@ -313,6 +345,9 @@ public: TS_ASSERT_EQUALS("['-eta', 'eta', 0]", outWS->getDimension(1)->getName()); TS_ASSERT_EQUALS("[0, 0, 'xi']", outWS->getDimension(2)->getName()); + TSM_ASSERT_EQUALS("Should have num events normalization", + outWS->displayNormalizationHisto(), histoNorm); + AnalysisDataService::Instance().remove(wsName); } @@ -348,6 +383,8 @@ public: vRow << "v" << V3D(0,1,0) << 0.0 << "r"; wRow << "w" << V3D(0,0,1) << 0.0 << "r"; + addNormalization(wsName); + auto algCutMD = FrameworkManager::Instance().createAlgorithm("CutMD"); algCutMD->initialize(); algCutMD->setRethrows(true); @@ -375,6 +412,8 @@ public: TS_ASSERT_EQUALS("[0, 'eta', 0]", outWS->getDimension(1)->getName()); TS_ASSERT_EQUALS("[0, 0, 'xi']", outWS->getDimension(2)->getName()); + TSM_ASSERT_EQUALS("Should have num events normalization", + outWS->displayNormalizationHisto(), histoNorm); AnalysisDataService::Instance().remove(wsName); } @@ -398,6 +437,8 @@ public: "InputWorkspace", wsName.c_str(), "SpecialCoordinates", "HKL"); + addNormalization(wsName); + auto algCutMD = FrameworkManager::Instance().createAlgorithm("CutMD"); algCutMD->initialize(); algCutMD->setRethrows(true); @@ -439,6 +480,8 @@ public: AnalysisDataService::Instance().retrieveWS<IMDHistoWorkspace>(wsOutName); TS_ASSERT_EQUALS(16, outWS->getDimension(3)->getNBins()); + TSM_ASSERT_EQUALS("Should have num events normalization", + outWS->displayNormalizationHisto(), histoNorm); AnalysisDataService::Instance().remove(wsName); AnalysisDataService::Instance().remove(wsOutName); } diff --git a/Code/Mantid/Framework/MDAlgorithms/test/IntegrateMDHistoWorkspaceTest.h b/Code/Mantid/Framework/MDAlgorithms/test/IntegrateMDHistoWorkspaceTest.h index 54ad6af8eea1365dde91df51054c36150082432f..b15eacf5f4194490f8980f19d92fe0ecee5e40ba 100644 --- a/Code/Mantid/Framework/MDAlgorithms/test/IntegrateMDHistoWorkspaceTest.h +++ b/Code/Mantid/Framework/MDAlgorithms/test/IntegrateMDHistoWorkspaceTest.h @@ -112,7 +112,8 @@ public: { using namespace Mantid::DataObjects; MDHistoWorkspace_sptr ws = MDEventsTestHelper::makeFakeMDHistoWorkspace(1.0, 1 /*nd*/, 10); - + auto histNorm = Mantid::API::MDNormalization::NumEventsNormalization; + ws->setDisplayNormalization(histNorm); IntegrateMDHistoWorkspace alg; alg.setChild(true); alg.setRethrows(true); @@ -127,6 +128,7 @@ public: TS_ASSERT_EQUALS(outWS->getNumDims(), ws->getNumDims()); TS_ASSERT_EQUALS(outWS->getSignalAt(0), ws->getSignalAt(0)); TS_ASSERT_EQUALS(outWS->getSignalAt(1), ws->getSignalAt(1)); + TSM_ASSERT_EQUALS("Should have a num events normalization", outWS->displayNormalization(), histNorm); } void test_1D_integration_exact_binning() @@ -147,6 +149,8 @@ public: using namespace Mantid::DataObjects; MDHistoWorkspace_sptr ws = MDEventsTestHelper::makeFakeMDHistoWorkspace(1.0 /*signal*/, 1 /*nd*/, 10 /*nbins*/, 10 /*max*/, 1.0 /*error sq*/); + auto histNorm = Mantid::API::MDNormalization::NumEventsNormalization; + ws->setDisplayNormalization(histNorm); IntegrateMDHistoWorkspace alg; alg.setChild(true); @@ -169,6 +173,7 @@ public: // Check the data. TSM_ASSERT_DELTA("Wrong integrated value", 5.0, outWS->getSignalAt(0), 1e-4); TSM_ASSERT_DELTA("Wrong error value", std::sqrt(5 * (ws->getErrorAt(0) * ws->getErrorAt(0))), outWS->getErrorAt(0), 1e-4); + TSM_ASSERT_EQUALS("Should have a num events normalization", outWS->displayNormalization(), histNorm); } diff --git a/Code/Mantid/Framework/MDAlgorithms/test/MDNormDirectSCTest.h b/Code/Mantid/Framework/MDAlgorithms/test/MDNormDirectSCTest.h index 2af9465dfc8b848414b47287eb1715fc9701f934..02e65af99359af41cf90670eb1b020473d9056e5 100644 --- a/Code/Mantid/Framework/MDAlgorithms/test/MDNormDirectSCTest.h +++ b/Code/Mantid/Framework/MDAlgorithms/test/MDNormDirectSCTest.h @@ -20,7 +20,6 @@ public: static MDNormDirectSCTest *createSuite() { return new MDNormDirectSCTest(); } static void destroySuite( MDNormDirectSCTest *suite ) { delete suite; } - void test_Init() { MDNormDirectSC alg; diff --git a/Code/Mantid/Framework/MDAlgorithms/test/SliceMDTest.h b/Code/Mantid/Framework/MDAlgorithms/test/SliceMDTest.h index 686d1d946cca71cc33101472628ad5e434b4e526..c095dedf71e103d0c8539da3cffe880e3259eddc 100644 --- a/Code/Mantid/Framework/MDAlgorithms/test/SliceMDTest.h +++ b/Code/Mantid/Framework/MDAlgorithms/test/SliceMDTest.h @@ -36,6 +36,10 @@ private: alg.initialize(); IMDEventWorkspace_sptr in_ws = MDEventsTestHelper::makeAnyMDEW<MDEvent<3>,3>(10, 0.0, 10.0, 1); + auto eventNorm = Mantid::API::MDNormalization::VolumeNormalization; + auto histoNorm = Mantid::API::MDNormalization::NumEventsNormalization; + in_ws->setDisplayNormalization(eventNorm); + in_ws->setDisplayNormalizationHisto(histoNorm); AnalysisDataService::Instance().addOrReplace("SliceMDTest_ws", in_ws); alg.setPropertyValue("InputWorkspace", "SliceMDTest_ws"); @@ -66,7 +70,10 @@ private: TSM_ASSERT_EQUALS("MaxRecusionDepth property should be enabled", true, p->getSettings()->isEnabled(&alg)); TSM_ASSERT_EQUALS("Should have passed the maxium depth onto the ouput workspace from the input workspace.", size_t(maxDepth), out->getBoxController()->getMaxDepth()); } - + + TSM_ASSERT_EQUALS("Should show volume normalization", out->displayNormalization(), eventNorm); + TSM_ASSERT_EQUALS("Should show num event normalization", out->displayNormalizationHisto(), histoNorm); + //Clean up test objects AnalysisDataService::Instance().remove("SliceMDTest_ws"); AnalysisDataService::Instance().remove("SliceMDTest_outWS");