diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/CoordTransform.h b/Code/Mantid/Framework/API/inc/MantidAPI/CoordTransform.h index e4dcc3d251e14cfbabe51af5dd3bcba089237934..4ceb2d99e06088924f8bb037bc80f24e25504f99 100644 --- a/Code/Mantid/Framework/API/inc/MantidAPI/CoordTransform.h +++ b/Code/Mantid/Framework/API/inc/MantidAPI/CoordTransform.h @@ -7,6 +7,7 @@ #include "MantidKernel/Matrix.h" #include "MantidKernel/System.h" #include "MantidKernel/VMD.h" +#include <boost/shared_ptr.hpp> namespace Mantid { namespace API { @@ -57,6 +58,12 @@ protected: size_t outD; }; +// Helper typedef for a shared pointer of this type. +typedef boost::shared_ptr<CoordTransform> CoordTransform_sptr; + +// Helper typdef for a const shared pointer of this type. +typedef boost::shared_ptr<const CoordTransform> CoordTransform_const_sptr; + } // namespace Mantid } // namespace API diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/MDGeometry.h b/Code/Mantid/Framework/API/inc/MantidAPI/MDGeometry.h index 77cec04739c2581fe62bd33fe28aee89a4fcd152..33a0804517ca1b926ee94e8994fd8db42154dd4f 100644 --- a/Code/Mantid/Framework/API/inc/MantidAPI/MDGeometry.h +++ b/Code/Mantid/Framework/API/inc/MantidAPI/MDGeometry.h @@ -6,6 +6,7 @@ #include "MantidGeometry/MDGeometry/IMDDimension.h" #include "MantidAPI/AnalysisDataService.h" #include <Poco/NObserver.h> +#include <boost/shared_ptr.hpp> namespace Mantid { namespace API { @@ -85,10 +86,10 @@ public: size_t numOriginalWorkspaces() const; boost::shared_ptr<Workspace> getOriginalWorkspace(size_t index = 0) const; void setOriginalWorkspace(boost::shared_ptr<Workspace> ws, size_t index = 0); - Mantid::API::CoordTransform *getTransformFromOriginal(size_t index = 0) const; + Mantid::API::CoordTransform const *getTransformFromOriginal(size_t index = 0) const; void setTransformFromOriginal(Mantid::API::CoordTransform *transform, size_t index = 0); - Mantid::API::CoordTransform *getTransformToOriginal(size_t index = 0) const; + Mantid::API::CoordTransform const *getTransformToOriginal(size_t index = 0) const; void setTransformToOriginal(Mantid::API::CoordTransform *transform, size_t index = 0); @@ -120,6 +121,11 @@ public: /// plane const Kernel::DblMatrix &getWTransf() const { return m_Wtransf; } + /// Clear transforms + void clearTransforms(); + /// Clear original workspaces + void clearOriginalWorkspaces(); + protected: /// Function called when observer objects recieves a notification void deleteNotificationReceived( @@ -138,11 +144,11 @@ protected: /// Coordinate Transformation that goes from the original workspace to this /// workspace's coordinates. - std::vector<Mantid::API::CoordTransform *> m_transforms_FromOriginal; + std::vector<boost::shared_ptr<const Mantid::API::CoordTransform> > m_transforms_FromOriginal; /// Coordinate Transformation that goes from this workspace's coordinates to /// the original workspace coordinates. - std::vector<Mantid::API::CoordTransform *> m_transforms_ToOriginal; + std::vector<boost::shared_ptr<const Mantid::API::CoordTransform> > m_transforms_ToOriginal; /// Poco delete notification observer object Poco::NObserver<MDGeometry, Mantid::API::WorkspacePreDeleteNotification> diff --git a/Code/Mantid/Framework/API/src/MDGeometry.cpp b/Code/Mantid/Framework/API/src/MDGeometry.cpp index f2038971accb25c43412e56bf1b94bcbfb24d696..5b303f3405054fdc605c265591f6a5a045d11d37 100644 --- a/Code/Mantid/Framework/API/src/MDGeometry.cpp +++ b/Code/Mantid/Framework/API/src/MDGeometry.cpp @@ -41,21 +41,21 @@ MDGeometry::MDGeometry(const MDGeometry &other) this->initGeometry(dimensions); // Perform a deep copy of the coordinate transformations - std::vector<CoordTransform *>::const_iterator it; + std::vector<CoordTransform_const_sptr>::const_iterator it; for (it = other.m_transforms_FromOriginal.begin(); it != other.m_transforms_FromOriginal.end(); ++it) { if (*it) - m_transforms_FromOriginal.push_back((*it)->clone()); + m_transforms_FromOriginal.push_back(CoordTransform_const_sptr((*it)->clone())); else - m_transforms_FromOriginal.push_back(NULL); + m_transforms_FromOriginal.push_back(CoordTransform_const_sptr()); } for (it = other.m_transforms_ToOriginal.begin(); it != other.m_transforms_ToOriginal.end(); ++it) { if (*it) - m_transforms_ToOriginal.push_back((*it)->clone()); + m_transforms_ToOriginal.push_back(CoordTransform_const_sptr((*it)->clone())); else - m_transforms_ToOriginal.push_back(NULL); + m_transforms_ToOriginal.push_back(CoordTransform_const_sptr()); } // Copy the references to the original workspaces @@ -65,14 +65,26 @@ MDGeometry::MDGeometry(const MDGeometry &other) this->setOriginalWorkspace(other.m_originalWorkspaces[i], i); } +/** + * Clear all transforms to and from original workspaces. + */ +void MDGeometry::clearTransforms() { + m_transforms_ToOriginal.clear(); + m_transforms_FromOriginal.clear(); +} + +/** + * Clear the original workspaces + */ +void MDGeometry::clearOriginalWorkspaces() { + m_originalWorkspaces.clear(); +} + //---------------------------------------------------------------------------------------------- /** Destructor */ MDGeometry::~MDGeometry() { - for (size_t i = 0; i < m_transforms_FromOriginal.size(); i++) - delete m_transforms_FromOriginal[i]; - for (size_t i = 0; i < m_transforms_ToOriginal.size(); i++) - delete m_transforms_ToOriginal[i]; + if (m_observingDelete) { // Stop watching once object is deleted API::AnalysisDataService::Instance().notificationCenter.removeObserver( @@ -400,12 +412,12 @@ void MDGeometry::deleteNotificationReceived( * @return CoordTransform pointer * @param index :: index into the array of original workspaces */ -Mantid::API::CoordTransform * +Mantid::API::CoordTransform const * MDGeometry::getTransformFromOriginal(size_t index) const { if (index >= m_transforms_FromOriginal.size()) throw std::runtime_error( "MDGeometry::getTransformFromOriginal(): invalid index."); - return m_transforms_FromOriginal[index]; + return m_transforms_FromOriginal[index].get(); } //--------------------------------------------------------------------------------------------------- @@ -422,11 +434,10 @@ MDGeometry::getTransformFromOriginal(size_t index) const { void MDGeometry::setTransformFromOriginal(Mantid::API::CoordTransform *transform, size_t index) { - if (index >= m_transforms_FromOriginal.size()) + if (index >= m_transforms_FromOriginal.size()) { m_transforms_FromOriginal.resize(index + 1); - if (m_transforms_FromOriginal[index]) - delete m_transforms_FromOriginal[index]; - m_transforms_FromOriginal[index] = transform; + } + m_transforms_FromOriginal[index] = CoordTransform_const_sptr(transform); } //--------------------------------------------------------------------------------------------------- @@ -441,12 +452,12 @@ MDGeometry::setTransformFromOriginal(Mantid::API::CoordTransform *transform, * @return CoordTransform pointer * @param index :: index into the array of original workspaces */ -Mantid::API::CoordTransform * +Mantid::API::CoordTransform const * MDGeometry::getTransformToOriginal(size_t index) const { if (index >= m_transforms_ToOriginal.size()) throw std::runtime_error( "MDGeometry::getTransformFromOriginal(): invalid index."); - return m_transforms_ToOriginal[index]; + return m_transforms_ToOriginal[index].get(); } //--------------------------------------------------------------------------------------------------- @@ -463,11 +474,10 @@ MDGeometry::getTransformToOriginal(size_t index) const { */ void MDGeometry::setTransformToOriginal(Mantid::API::CoordTransform *transform, size_t index) { - if (index >= m_transforms_ToOriginal.size()) + if (index >= m_transforms_ToOriginal.size()) { m_transforms_ToOriginal.resize(index + 1); - if (m_transforms_ToOriginal[index]) - delete m_transforms_ToOriginal[index]; - m_transforms_ToOriginal[index] = transform; + } + m_transforms_ToOriginal[index] = CoordTransform_const_sptr(transform); } //--------------------------------------------------------------------------------------------------- diff --git a/Code/Mantid/Framework/API/test/MDGeometryTest.h b/Code/Mantid/Framework/API/test/MDGeometryTest.h index 0763cb7250d5f53d377917a53525e5f439fb2f6e..15f35676ff5c379e2ff2ef012438e86d3176f9ab 100644 --- a/Code/Mantid/Framework/API/test/MDGeometryTest.h +++ b/Code/Mantid/Framework/API/test/MDGeometryTest.h @@ -54,6 +54,37 @@ public: TS_ASSERT_DELTA( binSizes[1], 0.1, 1e-6); } + void test_clear_transforms_to_original() + { + MDGeometry geometry; + geometry.setTransformToOriginal(new NullCoordTransform, 0); + geometry.setTransformToOriginal(new NullCoordTransform, 1); + TS_ASSERT_EQUALS(2, geometry.getNumberTransformsToOriginal()); + TS_ASSERT_THROWS_NOTHING(geometry.clearTransforms()); + TSM_ASSERT_EQUALS("Should have no transforms", 0, geometry.getNumberTransformsToOriginal()); + } + + void test_clear_transforms_from_original() + { + MDGeometry geometry; + geometry.setTransformFromOriginal(new NullCoordTransform, 0); + geometry.setTransformFromOriginal(new NullCoordTransform, 1); + TS_ASSERT_EQUALS(2, geometry.getNumberTransformsFromOriginal()); + TS_ASSERT_THROWS_NOTHING(geometry.clearTransforms()); + TSM_ASSERT_EQUALS("Should have no transforms", 0, geometry.getNumberTransformsFromOriginal()); + } + + void test_clear_original_workspaces() + { + MDGeometry geometry; + boost::shared_ptr<WorkspaceTester> ws0(new WorkspaceTester()); + boost::shared_ptr<WorkspaceTester> ws1(new WorkspaceTester()); + geometry.setOriginalWorkspace(ws0, 0); + geometry.setOriginalWorkspace(ws1, 1); + TS_ASSERT_EQUALS(2, geometry.numOriginalWorkspaces()); + TS_ASSERT_THROWS_NOTHING(geometry.clearOriginalWorkspaces()); + TS_ASSERT_EQUALS(0, geometry.numOriginalWorkspaces()); + } void test_copy_constructor() { diff --git a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/MDBoxFlatTree.h b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/MDBoxFlatTree.h index 12b0106eb095d6508ce10638b32fc77377d72b0e..5c6c076cfb9ef63a225b49c0c0290344e6fee761 100644 --- a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/MDBoxFlatTree.h +++ b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/MDBoxFlatTree.h @@ -144,7 +144,7 @@ public: static void saveAffineTransformMatricies(::NeXus::File *const file, API::IMDWorkspace_const_sptr ws); static void saveAffineTransformMatrix(::NeXus::File *const file, - API::CoordTransform *transform, + API::CoordTransform const *transform, std::string entry_name); static void saveWSGenericInfo(::NeXus::File *const file, diff --git a/Code/Mantid/Framework/DataObjects/src/MDBoxFlatTree.cpp b/Code/Mantid/Framework/DataObjects/src/MDBoxFlatTree.cpp index 152bc6ff62fe6a306bf270bc4ac68501f13eccfe..3ff70adccbb15a821235e11dd5bfbfdbac8a03fb 100644 --- a/Code/Mantid/Framework/DataObjects/src/MDBoxFlatTree.cpp +++ b/Code/Mantid/Framework/DataObjects/src/MDBoxFlatTree.cpp @@ -798,7 +798,7 @@ MDBoxFlatTree::saveAffineTransformMatricies(::NeXus::File *const file, * @param entry_name : the tag in the NeXus file to save under */ void MDBoxFlatTree::saveAffineTransformMatrix(::NeXus::File *const file, - API::CoordTransform *transform, + API::CoordTransform const *transform, std::string entry_name) { Kernel::Matrix<coord_t> matrix = transform->makeAffineMatrix(); g_log.debug() << "TRFM: " << matrix.str() << std::endl; diff --git a/Code/Mantid/Framework/MDAlgorithms/src/BinMD.cpp b/Code/Mantid/Framework/MDAlgorithms/src/BinMD.cpp index 25772e258465cd89adab2cf7a22e137605b6b035..051cfa50c9fa267fcdb4afbf65fee35ff78de5ce 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/BinMD.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/BinMD.cpp @@ -408,6 +408,17 @@ void BinMD::exec() { IterateEvents = true; } + /* + We should fail noisily here. CALL_MDEVENT_FUNCTION will silently allow IMDHistoWorkspaces to cascade through to the end + and result in an empty output. The only way we allow InputWorkspaces to be IMDHistoWorkspaces is if they also happen to contain original workspaces + that are MDEventWorkspaces. + */ + if(boost::dynamic_pointer_cast<IMDHistoWorkspace>(m_inWS)) + { + throw std::runtime_error("Cannot rebin a workspace that is histogrammed and has no original workspace that is an MDEventWorkspace. " + "Reprocess the input so that it contains full MDEvents."); + } + CALL_MDEVENT_FUNCTION(this->binByIterating, m_inWS); // Copy the diff --git a/Code/Mantid/Framework/MDAlgorithms/src/ConvertMDHistoToMatrixWorkspace.cpp b/Code/Mantid/Framework/MDAlgorithms/src/ConvertMDHistoToMatrixWorkspace.cpp index 5967cd572d6e40c35c7a533cc9250ac3b51a8c8b..c4fc75c346c13e51ee0ef66861cf45d8f95cce8a 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/ConvertMDHistoToMatrixWorkspace.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/ConvertMDHistoToMatrixWorkspace.cpp @@ -197,11 +197,11 @@ void ConvertMDHistoToMatrixWorkspace::make1DWorkspace() { const size_t numberTransformsToOriginal = inputWorkspace->getNumberTransformsToOriginal(); - boost::shared_ptr<CoordTransform> transform = + CoordTransform_const_sptr transform = boost::make_shared<NullCoordTransform>(inputWorkspace->getNumDims()); if (numberTransformsToOriginal > 0) { const size_t indexToLastTransform = numberTransformsToOriginal - 1; - transform = boost::shared_ptr<CoordTransform>( + transform = CoordTransform_const_sptr( inputWorkspace->getTransformToOriginal(indexToLastTransform), NullDeleter()); } diff --git a/Code/Mantid/Framework/MDAlgorithms/src/CutMD.cpp b/Code/Mantid/Framework/MDAlgorithms/src/CutMD.cpp index 3acef97437ba3a95d5f8d131bc388df7a2fa726c..3deac2121dfc386f33aea1c3bac8969deeb9d612 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/CutMD.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/CutMD.cpp @@ -379,7 +379,13 @@ void CutMD::exec() { true); } - // Done! + auto geometry = boost::dynamic_pointer_cast<Mantid::API::MDGeometry>(sliceWS); + + /* Original workspace and transformation information does not make sense for self-contained Horace-style + * cuts, so clear it out. */ + geometry->clearTransforms(); + geometry->clearOriginalWorkspaces(); + setProperty("OutputWorkspace", sliceWS); } diff --git a/Code/Mantid/Framework/MDAlgorithms/src/QueryMDWorkspace.cpp b/Code/Mantid/Framework/MDAlgorithms/src/QueryMDWorkspace.cpp index 6590cf97bf0b72b3504ee3708249577e2d3c0043..284bbe1edddd12298b87d0cbdf35cab95fd1f9a9 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/QueryMDWorkspace.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/QueryMDWorkspace.cpp @@ -103,6 +103,8 @@ void QueryMDWorkspace::init() { " volume: Normalise by the volume.\n" " number of events: Normalise by the number of events."); + declareProperty("TransformCoordsToOriginal", true, "Output box coordinates in terms of original workspace coordinates"); + declareProperty( new WorkspaceProperty<ITableWorkspace>( "BoxDataTable", "", Direction::Output, @@ -191,6 +193,9 @@ void QueryMDWorkspace::exec() { MDNormalization requestedNormalisation = whichNormalisation(strNormalisation); IMDWorkspace_sptr input = getProperty("InputWorkspace"); + + const bool transformCoordsToOriginal = getProperty("TransformCoordsToOriginal"); + // Define a table workspace with a specific column schema. ITableWorkspace_sptr output = WorkspaceFactory::Instance().createTable(); const std::string signalColumnName = "Signal/" + strNormalisation; @@ -234,9 +239,9 @@ void QueryMDWorkspace::exec() { output->cell<int>(rowCounter, cellIndex++) = int(it->getNumEvents()); VMD center = it->getCenter(); const size_t numberOriginal = input->getNumberTransformsToOriginal(); - if (numberOriginal > 0) { + if (transformCoordsToOriginal && numberOriginal > 0) { const size_t index = numberOriginal - 1; - CoordTransform *transform = input->getTransformToOriginal(index); + CoordTransform const *transform = input->getTransformToOriginal(index); VMD temp = transform->applyVMD(center); center = temp; } diff --git a/Code/Mantid/Framework/MDAlgorithms/src/SlicingAlgorithm.cpp b/Code/Mantid/Framework/MDAlgorithms/src/SlicingAlgorithm.cpp index 91dec0e942120bf8871144bf4a2a8150154b90fd..3e3057530fd1b0c4609e60dd86776d21cddc877f 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/SlicingAlgorithm.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/SlicingAlgorithm.cpp @@ -219,7 +219,7 @@ void SlicingAlgorithm::makeBasisVectorFromString(const std::string &str) { VMD basis0(this->m_inWS->getNumDims()); VMD basis1 = basis; // Convert the points to the original coordinates (from inWS to originalWS) - CoordTransform *toOrig = m_inWS->getTransformToOriginal(); + CoordTransform const *toOrig = m_inWS->getTransformToOriginal(); VMD origBasis0 = toOrig->applyVMD(basis0); VMD origBasis1 = toOrig->applyVMD(basis1); // New basis vector, now in the original workspace @@ -378,7 +378,7 @@ void SlicingAlgorithm::createGeneralTransform() { // Now, convert the original vector to the coordinates of the ORIGNAL ws, if // any if (m_originalWS) { - CoordTransform *toOrig = m_inWS->getTransformToOriginal(); + CoordTransform const*toOrig = m_inWS->getTransformToOriginal(); m_translation = toOrig->applyVMD(m_translation); } @@ -686,7 +686,7 @@ void SlicingAlgorithm::createTransform() { if (m_originalWS) { // The intermediate workspace is the MDHistoWorkspace being BINNED m_intermediateWS = m_inWS; - CoordTransform *originalToIntermediate = + CoordTransform const *originalToIntermediate = m_intermediateWS->getTransformFromOriginal(); if (originalToIntermediate && (m_originalWS->getNumDims() == m_intermediateWS->getNumDims())) { diff --git a/Code/Mantid/Framework/MDAlgorithms/test/BinMDTest.h b/Code/Mantid/Framework/MDAlgorithms/test/BinMDTest.h index 41efb7d551f77af1dc3f14b7e77b0236e0fa2bd3..70cfe7ea0628ba2a783c376a361a87a8d447acf6 100644 --- a/Code/Mantid/Framework/MDAlgorithms/test/BinMDTest.h +++ b/Code/Mantid/Framework/MDAlgorithms/test/BinMDTest.h @@ -174,7 +174,7 @@ public: TS_ASSERT_EQUALS( out->getBasisVector(0), expectBasisX); if (out->getNumDims() > 1) { TS_ASSERT_EQUALS( out->getBasisVector(1), expectBasisY); } if (out->getNumDims() > 2) { TS_ASSERT_EQUALS( out->getBasisVector(2), expectBasisZ); } - const CoordTransform * ctFrom = out->getTransformFromOriginal(); + CoordTransform const * ctFrom = out->getTransformFromOriginal(); TS_ASSERT(ctFrom); // Experiment Infos were copied TS_ASSERT_EQUALS( out->getNumExperimentInfo(), in_ws->getNumExperimentInfo()); @@ -459,9 +459,9 @@ public: { TS_ASSERT_EQUALS( out->getBasisVector(1), baseY); TS_ASSERT_EQUALS( out->getBasisVector(2), baseZ); } - const CoordTransform * ctFrom = out->getTransformFromOriginal(); + CoordTransform const * ctFrom = out->getTransformFromOriginal(); TS_ASSERT(ctFrom); - const CoordTransform * ctTo = out->getTransformToOriginal(); + CoordTransform const * ctTo = out->getTransformToOriginal(); TS_ASSERT(ctTo); if (!ctTo) return; @@ -594,8 +594,8 @@ public: TS_ASSERT_EQUALS( binned1->numOriginalWorkspaces(), 2); TS_ASSERT_EQUALS( binned1->getOriginalWorkspace(1)->name(), "binned0"); // Transforms to/from the INTERMEDIATE workspace exist - CoordTransform * toIntermediate = binned1->getTransformToOriginal(1); - CoordTransform * fromIntermediate = binned1->getTransformFromOriginal(1); + CoordTransform const * toIntermediate = binned1->getTransformToOriginal(1); + CoordTransform const * fromIntermediate = binned1->getTransformFromOriginal(1); TS_ASSERT( toIntermediate); TS_ASSERT( fromIntermediate ); @@ -642,14 +642,14 @@ public: TS_ASSERT_EQUALS( binned1->numOriginalWorkspaces(), 2); TS_ASSERT_EQUALS( binned1->getOriginalWorkspace(1)->name(), "binned0"); // Transforms to/from the INTERMEDIATE workspace exist - CoordTransform * toIntermediate = binned1->getTransformToOriginal(1); - CoordTransform * fromIntermediate = binned1->getTransformFromOriginal(1); + CoordTransform const * toIntermediate = binned1->getTransformToOriginal(1); + CoordTransform const * fromIntermediate = binned1->getTransformFromOriginal(1); TS_ASSERT( toIntermediate); TS_ASSERT( fromIntermediate ); // Transforms to/from the REALLY ORIGINAL workspace exist - CoordTransform * toOriginal = binned1->getTransformToOriginal(0); - CoordTransform * fromOriginal = binned1->getTransformFromOriginal(0); + CoordTransform const * toOriginal = binned1->getTransformToOriginal(0); + CoordTransform const * fromOriginal = binned1->getTransformFromOriginal(0); TS_ASSERT( toOriginal); TS_ASSERT( fromOriginal ); @@ -720,14 +720,14 @@ public: TS_ASSERT_EQUALS( binned1->numOriginalWorkspaces(), 2); TS_ASSERT_EQUALS( binned1->getOriginalWorkspace(1)->name(), "binned0"); // Transforms to/from the INTERMEDIATE workspace exist - CoordTransform * toIntermediate = binned1->getTransformToOriginal(1); - CoordTransform * fromIntermediate = binned1->getTransformFromOriginal(1); + CoordTransform const * toIntermediate = binned1->getTransformToOriginal(1); + CoordTransform const * fromIntermediate = binned1->getTransformFromOriginal(1); TS_ASSERT( toIntermediate); TS_ASSERT( fromIntermediate ); // Transforms to/from the REALLY ORIGINAL workspace exist - CoordTransform * toOriginal = binned1->getTransformToOriginal(0); - CoordTransform * fromOriginal = binned1->getTransformFromOriginal(0); + CoordTransform const * toOriginal = binned1->getTransformToOriginal(0); + CoordTransform const * fromOriginal = binned1->getTransformFromOriginal(0); TS_ASSERT( toOriginal); TS_ASSERT( fromOriginal ); @@ -944,12 +944,12 @@ public: VMD out; // Check the mapping of coordinates from C to B - CoordTransform * transf_C_to_B = C->getTransformToOriginal(1); + CoordTransform const * transf_C_to_B = C->getTransformToOriginal(1); out = transf_C_to_B->applyVMD(VMD(-1.5, -1.5)); TS_ASSERT_EQUALS( out, VMD(-4, -4) ); // And this is the mapping to the A workspace - CoordTransform * transf_C_to_A = C->getTransformToOriginal(0); + CoordTransform const * transf_C_to_A = C->getTransformToOriginal(0); out = transf_C_to_A->applyVMD(VMD(-1.5, -1.5)); TS_ASSERT_EQUALS( out, VMD(-10, -10) ); } @@ -988,6 +988,23 @@ public: "OutputBins", "10,10"); TSM_ASSERT( "Algorithm threw an error, as expected", !alg->isExecuted()) } + + void test_throws_if_InputWorkspace_pure_IMDHistWorkspace() + { + BinMD alg; + alg.setChild(true); + alg.setRethrows(true); + alg.initialize(); + // Histoworkspace with no original workspace or transforms + IMDHistoWorkspace_sptr inWS = MDEventsTestHelper::makeFakeMDHistoWorkspace(1 /*signal*/, 2 /*numDims*/, 10 /*numBins*/); + + alg.setProperty("InputWorkspace", inWS); // Input workspace - Pure histogram + alg.setProperty("AlignedDim0", "x,0,10,10"); // Values not relevant to this test + alg.setProperty("AlignedDim1", "y,0,10,10"); // Values not relevant to this test + alg.setPropertyValue("OutputWorkspace", "dummy"); + TSM_ASSERT_THROWS("Cannot allow BinMD on a pure MDHistoWorkspace. Should throw.", alg.execute(), std::runtime_error&); + } + }; @@ -1054,7 +1071,7 @@ public: for (size_t i=0; i<1; i++) do_test("2.0,8.0, 1", true); } -private: + }; diff --git a/Code/Mantid/Framework/MDAlgorithms/test/QueryMDWorkspaceTest.h b/Code/Mantid/Framework/MDAlgorithms/test/QueryMDWorkspaceTest.h index e2e8992c482d67d477fb87b07c1b3de4db7f22ec..607893fe75af0be13bef6b6de57e86c833f38d75 100644 --- a/Code/Mantid/Framework/MDAlgorithms/test/QueryMDWorkspaceTest.h +++ b/Code/Mantid/Framework/MDAlgorithms/test/QueryMDWorkspaceTest.h @@ -198,25 +198,32 @@ public: TSM_ASSERT_EQUALS("Wrong number of rows", 3, table->rowCount()); } + IMDWorkspace_sptr createSlice() { + + auto in_ws = MDEventsTestHelper::makeMDEW<2>(2, -10.0, 10, 3); + + // Create a line slice at 45 degrees to the original workspace. + IAlgorithm_sptr binMDAlg = AlgorithmManager::Instance().create("BinMD"); + binMDAlg->setRethrows(true); + binMDAlg->initialize(); + binMDAlg->setChild(true); + binMDAlg->setProperty("InputWorkspace", in_ws); + binMDAlg->setProperty("AxisAligned", false); + binMDAlg->setPropertyValue("BasisVector0", "X,units,0.7071,0.7071"); // cos 45 to in_ws x-axis (consistent with a 45 degree anti-clockwise rotation) + binMDAlg->setPropertyValue("BasisVector1", "Y,units,-0.7071,0.7071"); // cos 45 to in_ws y-axis (consistent with a 45 degree anti-clockwise rotation) + binMDAlg->setPropertyValue("OutputExtents", "0,28.284,-1,1"); // 0 to sqrt((-10-10)^2 + (-10-10)^2), -1 to 1 (in new coordinate axes) + binMDAlg->setPropertyValue("OutputBins", "10,1"); + binMDAlg->setPropertyValue("OutputWorkspace", "temp"); + binMDAlg->execute(); + Workspace_sptr temp = binMDAlg->getProperty("OutputWorkspace"); + auto slice = boost::dynamic_pointer_cast<IMDWorkspace>(temp); + return slice; + } + void testOnSlice() { - auto in_ws = MDEventsTestHelper::makeMDEW<2>(2, -10.0, 10, 3); - - // Create a line slice at 45 degrees to the original workspace. - IAlgorithm_sptr binMDAlg = AlgorithmManager::Instance().create("BinMD"); - binMDAlg->setRethrows(true); - binMDAlg->initialize(); - binMDAlg->setChild(true); - binMDAlg->setProperty("InputWorkspace", in_ws); - binMDAlg->setProperty("AxisAligned", false); - binMDAlg->setPropertyValue("BasisVector0", "X,units,0.7071,0.7071"); // cos 45 to in_ws x-axis (consistent with a 45 degree anti-clockwise rotation) - binMDAlg->setPropertyValue("BasisVector1", "Y,units,-0.7071,0.7071"); // cos 45 to in_ws y-axis (consistent with a 45 degree anti-clockwise rotation) - binMDAlg->setPropertyValue("OutputExtents", "0,28.284,-1,1"); // 0 to sqrt((-10-10)^2 + (-10-10)^2), -1 to 1 (in new coordinate axes) - binMDAlg->setPropertyValue("OutputBins", "10,1"); - binMDAlg->setPropertyValue("OutputWorkspace", "temp"); - binMDAlg->execute(); - Workspace_sptr temp = binMDAlg->getProperty("OutputWorkspace"); - auto slice = boost::dynamic_pointer_cast<IMDWorkspace>(temp); + + IMDWorkspace_sptr slice = createSlice(); QueryMDWorkspace query; query.setRethrows(true); @@ -228,7 +235,7 @@ public: ITableWorkspace_sptr table = query.getProperty("OutputWorkspace"); TSM_ASSERT("Workspace output is not an ITableWorkspace", table !=NULL); - size_t expectedCount = 3 + in_ws->getNumDims(); //3 fixed columns are Signal, Error, nEvents + size_t expectedCount = 3 + 2; //3 fixed columns are Signal, Error, nEvents and then data is 2D TSM_ASSERT_EQUALS("Six columns expected", expectedCount, table->columnCount()); TSM_ASSERT_EQUALS("Wrong number of rows", 10, table->rowCount()); @@ -250,6 +257,50 @@ public: } + void testOnSlice_without_transform_to_original() + { + IMDWorkspace_sptr slice = createSlice(); + + QueryMDWorkspace query; + query.setRethrows(true); + query.setChild(true); + query.initialize(); + query.setProperty("TransformCoordsToOriginal", false); // DO NOT, use the original workspace coordinates. + query.setProperty("InputWorkspace", slice); + query.setPropertyValue("OutputWorkspace", "QueryWS"); + query.execute(); + ITableWorkspace_sptr table = query.getProperty("OutputWorkspace"); + + TSM_ASSERT("Workspace output is not an ITableWorkspace", table !=NULL); + size_t expectedCount = 3 + 2; //3 fixed columns are Signal, Error, nEvents and then data is 2D + TSM_ASSERT_EQUALS("Six columns expected", expectedCount, table->columnCount()); + TSM_ASSERT_EQUALS("Wrong number of rows", 10, table->rowCount()); + + /* + Since we were displaying the results in the new coordinate system + then y == 0 and x would increment from 0 to sqrt((-10-10)^2 + (-10-10)^2). + + Note that what we do in the following is to check that the y and x coordinates are NOT the same. They will ONLY be the same in the + original coordinate system owing to the way that they have been rotated. + */ + const double xMax = std::sqrt( 20 * 20 * 2); + const double xMin = 0; + + auto xColumn = table->getColumn(3); + auto yColumn = table->getColumn(4); + + + TS_ASSERT_EQUALS(0, yColumn->toDouble(0));// Always zero + TS_ASSERT_EQUALS(0, yColumn->toDouble(table->rowCount()-1)); + + + const double binHalfWidth = 1.5; + TSM_ASSERT_DELTA("From zero", xMin, xColumn->toDouble(0), binHalfWidth /*account for bin widths*/); + TSM_ASSERT_DELTA("To max", xMax, xColumn->toDouble(table->rowCount()-1), binHalfWidth /*account for bin widths*/); + + + } + }; diff --git a/Code/Mantid/MantidQt/API/src/MantidQwtIMDWorkspaceData.cpp b/Code/Mantid/MantidQt/API/src/MantidQwtIMDWorkspaceData.cpp index 88a8f408b313a41071281e46736b7fce89b511b3..1212cf2cb5fab46b2bdc95e6adf562b5ae86d28f 100644 --- a/Code/Mantid/MantidQt/API/src/MantidQwtIMDWorkspaceData.cpp +++ b/Code/Mantid/MantidQt/API/src/MantidQwtIMDWorkspaceData.cpp @@ -348,7 +348,7 @@ void MantidQwtIMDWorkspaceData::setPreviewMode(bool preview) else { const size_t indexOfTransform = nTransformsToOriginal-1; // Get the last transform - CoordTransform * temp = m_workspace->getTransformToOriginal(indexOfTransform); + CoordTransform const * temp = m_workspace->getTransformToOriginal(indexOfTransform); if (temp) m_transform = temp->clone(); } diff --git a/Code/Mantid/MantidQt/SliceViewer/src/SliceViewer.cpp b/Code/Mantid/MantidQt/SliceViewer/src/SliceViewer.cpp index 9650d810c0c03bfe8715ee14d154aae00e801fba..facd7c614295268a10843406af5671d486025864 100644 --- a/Code/Mantid/MantidQt/SliceViewer/src/SliceViewer.cpp +++ b/Code/Mantid/MantidQt/SliceViewer/src/SliceViewer.cpp @@ -667,7 +667,7 @@ void SliceViewer::setWorkspace(Mantid::API::IMDWorkspace_sptr ws) { if (m_ws->hasOriginalWorkspace()) { IMDWorkspace_sptr origWS = boost::dynamic_pointer_cast<IMDWorkspace>(m_ws->getOriginalWorkspace()); - CoordTransform *toOrig = m_ws->getTransformToOriginal(); + auto toOrig = m_ws->getTransformToOriginal(); if (toOrig) { ui.frmMouseInfo->setVisible(true); ui.lblOriginalWorkspace->setText( @@ -1335,7 +1335,7 @@ void SliceViewer::showInfoAt(double x, double y) { if (m_ws->hasOriginalWorkspace()) { IMDWorkspace_sptr origWS = boost::dynamic_pointer_cast<IMDWorkspace>(m_ws->getOriginalWorkspace()); - CoordTransform *toOrig = m_ws->getTransformToOriginal(); + auto toOrig = m_ws->getTransformToOriginal(); if (toOrig) { // Transform the coordinates VMD orig = toOrig->applyVMD(coords); diff --git a/Code/Mantid/Vates/VatesAPI/src/vtkDataSetToNonOrthogonalDataSet.cpp b/Code/Mantid/Vates/VatesAPI/src/vtkDataSetToNonOrthogonalDataSet.cpp index eb769d1ed4decd5beb93b1157e131492d4b0120d..e75428c6a6c31f74a8d3c299b32c32c2cb92896c 100644 --- a/Code/Mantid/Vates/VatesAPI/src/vtkDataSetToNonOrthogonalDataSet.cpp +++ b/Code/Mantid/Vates/VatesAPI/src/vtkDataSetToNonOrthogonalDataSet.cpp @@ -114,7 +114,7 @@ void vtkDataSetToNonOrthogonalDataSet::execute() wMatArr = run.getPropertyValueAsType<std::vector<double > >("W_MATRIX"); try { - API::CoordTransform *transform = infoWs->getTransformToOriginal(); + API::CoordTransform const *transform = infoWs->getTransformToOriginal(); affMat = transform->makeAffineMatrix(); } catch (std::runtime_error &) @@ -149,7 +149,7 @@ void vtkDataSetToNonOrthogonalDataSet::execute() wMatArr = run.getPropertyValueAsType<std::vector<double > >("W_MATRIX"); try { - API::CoordTransform *transform = infoWs->getTransformToOriginal(); + API::CoordTransform const *transform = infoWs->getTransformToOriginal(); affMat = transform->makeAffineMatrix(); } catch (std::runtime_error &) diff --git a/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoHexFactory.cpp b/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoHexFactory.cpp index a9e5bf239d39e1164ec917ac8e5825400863b6fc..542279787b5bf392132c36c340e52080a7b5ef20 100644 --- a/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoHexFactory.cpp +++ b/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoHexFactory.cpp @@ -181,7 +181,7 @@ namespace VATES std::cout << tim << " to check all the signal values." << std::endl; // Get the transformation that takes the points in the TRANSFORMED space back into the ORIGINAL (not-rotated) space. - Mantid::API::CoordTransform* transform = NULL; + Mantid::API::CoordTransform const * transform = NULL; if (m_useTransform) transform = m_workspace->getTransformToOriginal(); diff --git a/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoQuadFactory.cpp b/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoQuadFactory.cpp index 7f31e7343cf5a079a9d6011187485a828b264d12..dd30c422155a5aff6963394b795dca1f8de572ab 100644 --- a/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoQuadFactory.cpp +++ b/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoQuadFactory.cpp @@ -142,7 +142,7 @@ namespace Mantid std::cout << tim << " to check all the signal values." << std::endl; // Get the transformation that takes the points in the TRANSFORMED space back into the ORIGINAL (not-rotated) space. - Mantid::API::CoordTransform* transform = NULL; + Mantid::API::CoordTransform const* transform = NULL; if (m_useTransform) transform = m_workspace->getTransformToOriginal(); diff --git a/Code/Mantid/Vates/VatesAPI/src/vtkMDLineFactory.cpp b/Code/Mantid/Vates/VatesAPI/src/vtkMDLineFactory.cpp index fdf2398d98deec07734dfa0e24a514a70f7c0ebc..d6b392cc3b06635aa21d80a7d2bc6b650616b00f 100644 --- a/Code/Mantid/Vates/VatesAPI/src/vtkMDLineFactory.cpp +++ b/Code/Mantid/Vates/VatesAPI/src/vtkMDLineFactory.cpp @@ -86,7 +86,7 @@ namespace Mantid vtkIdList * linePointList = vtkIdList::New(); linePointList->SetNumberOfIds(2); - Mantid::API::CoordTransform* transform = NULL; + Mantid::API::CoordTransform const* transform = NULL; if (m_useTransform) { transform = imdws->getTransformToOriginal(); diff --git a/Code/Mantid/Vates/VatesAPI/src/vtkMDQuadFactory.cpp b/Code/Mantid/Vates/VatesAPI/src/vtkMDQuadFactory.cpp index e894c7ac25ec3c5aa301c2063a96bf766fb2e8b5..b1a096fa9597155d821045b414a1f57c68201623 100644 --- a/Code/Mantid/Vates/VatesAPI/src/vtkMDQuadFactory.cpp +++ b/Code/Mantid/Vates/VatesAPI/src/vtkMDQuadFactory.cpp @@ -82,7 +82,7 @@ namespace Mantid vtkIdList * quadPointList = vtkIdList::New(); quadPointList->SetNumberOfIds(4); - Mantid::API::CoordTransform* transform = NULL; + Mantid::API::CoordTransform const* transform = NULL; if (m_useTransform) { transform = imdws->getTransformToOriginal(); diff --git a/Code/Mantid/Vates/VatesAPI/src/vtkSplatterPlotFactory.cpp b/Code/Mantid/Vates/VatesAPI/src/vtkSplatterPlotFactory.cpp index 0182401e60d7e2de6f3b0f3a89ea9b844b6eb83e..16838694fe3716bf71bbd285c263ae4e20bd736b 100644 --- a/Code/Mantid/Vates/VatesAPI/src/vtkSplatterPlotFactory.cpp +++ b/Code/Mantid/Vates/VatesAPI/src/vtkSplatterPlotFactory.cpp @@ -379,7 +379,7 @@ namespace VATES bool do4D = doMDHisto4D(workspace); // Get the transformation that takes the points in the TRANSFORMED space back into the ORIGINAL (not-rotated) space. - Mantid::API::CoordTransform* transform = NULL; + Mantid::API::CoordTransform const* transform = NULL; if (m_useTransform) { transform = workspace->getTransformToOriginal();