From f8d0801c43ea9bc57cf97bc8ac3e92f09267f47f Mon Sep 17 00:00:00 2001 From: Anton Piccardo-Selg <anton.piccardo-selg@tessella.com> Date: Thu, 24 Sep 2015 14:44:25 +0100 Subject: [PATCH] Refs #12832 Add normalization to some MDAlgorithims --- .../API/inc/MantidAPI/IMDHistoWorkspace.h | 2 + .../inc/MantidDataObjects/MDHistoWorkspace.h | 2 + .../DataObjects/src/MDHistoWorkspace.cpp | 4 ++ .../Framework/MDAlgorithms/src/BinMD.cpp | 3 ++ .../src/IntegrateMDHistoWorkspace.cpp | 1 + .../MDAlgorithms/src/MDNormDirectSC.cpp | 3 ++ .../Framework/MDAlgorithms/src/SliceMD.cpp | 7 ++- .../Framework/MDAlgorithms/test/BinMDTest.h | 6 ++- .../Framework/MDAlgorithms/test/CutMDTest.h | 45 ++++++++++++++++++- .../test/IntegrateMDHistoWorkspaceTest.h | 7 ++- .../MDAlgorithms/test/MDNormDirectSCTest.h | 1 - .../Framework/MDAlgorithms/test/SliceMDTest.h | 9 +++- 12 files changed, 84 insertions(+), 6 deletions(-) diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/IMDHistoWorkspace.h b/Code/Mantid/Framework/API/inc/MantidAPI/IMDHistoWorkspace.h index 3f9dd4549f9..9c5c55b5045 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 712bc267acf..fe7f8511213 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 3cac232b355..b842deb0be1 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 233f9969e46..f914d8e5b0c 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 d8b7faabba3..4aad8905a15 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 df1dcf13a34..d4cab12b4a2 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 ba99b4778f9..04cce85346c 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 68385b65956..9ef28274728 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 ac87a7dba8f..1f2b761e5ff 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 54ad6af8eea..b15eacf5f41 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 2af9465dfc8..02e65af9935 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 686d1d946cc..c095dedf71e 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"); -- GitLab