Skip to content

Commit

Permalink
Refs #4729: Fix to MDGeometry copy constructor
Browse files Browse the repository at this point in the history
which should fix CloneMDWorkspace. Also, fix to BinMD to strip spaces from dimension names.
  • Loading branch information
Janik Zikovsky committed Feb 3, 2012
1 parent 65f1bd7 commit 08956f9
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 6 deletions.
30 changes: 27 additions & 3 deletions Code/Mantid/Framework/API/src/MDGeometry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,13 @@ namespace API
/** Copy Constructor
*/
MDGeometry::MDGeometry(const MDGeometry & other) :
m_originalWorkspaces(other.m_originalWorkspaces),
m_transforms_FromOriginal(NULL), m_transforms_ToOriginal(NULL),
m_originalWorkspaces(),
m_basisVectors(other.m_basisVectors),
m_origin(other.m_origin),
m_transforms_FromOriginal(), m_transforms_ToOriginal(),
m_delete_observer(*this, &MDGeometry::deleteNotificationReceived),
m_observingDelete(false)
{
//TODO: How to copy the coordinate transformations?
// Perform a deep copy of the dimensions
std::vector<Mantid::Geometry::IMDDimension_sptr> dimensions;
for (size_t d=0; d < other.getNumDims(); d++)
Expand All @@ -44,6 +45,29 @@ namespace API
dimensions.push_back(dim);
}
this->initGeometry(dimensions);

// Perform a deep copy of the coordinate transformations
std::vector<CoordTransform*>::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());
else
m_transforms_FromOriginal.push_back(NULL);
}

for (it = other.m_transforms_ToOriginal.begin(); it != other.m_transforms_ToOriginal.end(); it++)
{
if (*it)
m_transforms_ToOriginal.push_back((*it)->clone());
else
m_transforms_ToOriginal.push_back(NULL);
}

// Copy the references to the original workspaces
// This will also set up the delete observer to listen to those workspaces being deleted.
for (size_t i=0; i<other.m_originalWorkspaces.size(); i++)
this->setOriginalWorkspace(other.m_originalWorkspaces[i], i);
}


Expand Down
56 changes: 54 additions & 2 deletions Code/Mantid/Framework/API/test/MDGeometryTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "MantidKernel/VMD.h"
#include "MantidAPI/IMDWorkspace.h"
#include "MantidTestHelpers/FakeObjects.h"
#include "MantidAPI/NullCoordTransform.h"

using namespace Mantid;
using namespace Mantid::Kernel;
Expand All @@ -29,11 +30,12 @@ class MDGeometryTest : public CxxTest::TestSuite
{
MDGeometry g;
std::vector<IMDDimension_sptr> dims;
IMDDimension_sptr dim(new MDHistoDimension("Qx", "Qx", "Ang", -1, +1, 0));
IMDDimension_sptr dim1(new MDHistoDimension("Qx", "Qx", "Ang", -1, +1, 0));
IMDDimension_sptr dim2(new MDHistoDimension("Qy", "Qy", "Ang", -1, +1, 0));
dims.push_back(dim);
dims.push_back(dim1);
dims.push_back(dim2);
g.initGeometry(dims);

TS_ASSERT_EQUALS( g.getNumDims(), 2);
TS_ASSERT_EQUALS( g.getDimension(0)->getName(), "Qx");
TS_ASSERT_EQUALS( g.getDimension(1)->getName(), "Qy");
Expand All @@ -46,6 +48,56 @@ class MDGeometryTest : public CxxTest::TestSuite
TS_ASSERT_EQUALS( g.getBasisVector(1), VMD(1.2, 3.4));
}


void test_copy_constructor()
{
MDGeometry g;
std::vector<IMDDimension_sptr> dims;
IMDDimension_sptr dim0(new MDHistoDimension("Qx", "Qx", "Ang", -1, +1, 0));
IMDDimension_sptr dim1(new MDHistoDimension("Qy", "Qy", "Ang", -1, +1, 0));
dims.push_back(dim0);
dims.push_back(dim1);
g.initGeometry(dims);
g.setBasisVector(0, VMD(1.2, 3.4));
g.setBasisVector(1, VMD(1.2, 3.4));
g.setOrigin(VMD(4,5));
boost::shared_ptr<WorkspaceTester> ws0(new WorkspaceTester());
boost::shared_ptr<WorkspaceTester> ws1(new WorkspaceTester());
g.setOriginalWorkspace(ws0, 0);
g.setOriginalWorkspace(ws1, 1);
g.setTransformFromOriginal(new NullCoordTransform(5), 0);
g.setTransformFromOriginal(new NullCoordTransform(6), 1);
g.setTransformToOriginal(new NullCoordTransform(7), 0);
g.setTransformToOriginal(new NullCoordTransform(8), 1);

// Perform the copy
MDGeometry g2(g);

TS_ASSERT_EQUALS( g2.getNumDims(), 2);
TS_ASSERT_EQUALS( g2.getBasisVector(0), VMD(1.2, 3.4));
TS_ASSERT_EQUALS( g2.getBasisVector(1), VMD(1.2, 3.4));
TS_ASSERT_EQUALS( g2.getOrigin(), VMD(4,5));
TS_ASSERT_EQUALS( g2.getDimension(0)->getName(), "Qx");
TS_ASSERT_EQUALS( g2.getDimension(1)->getName(), "Qy");
// Dimensions are deep copies
TS_ASSERT_DIFFERS( g2.getDimension(0), dim0);
TS_ASSERT_DIFFERS( g2.getDimension(1), dim1);
// Workspaces are not deep-copied, just references
TS_ASSERT_EQUALS( g2.getOriginalWorkspace(0), ws0);
TS_ASSERT_EQUALS( g2.getOriginalWorkspace(1), ws1);
// But transforms are deep-copied
TS_ASSERT_DIFFERS( g2.getTransformFromOriginal(0), g.getTransformFromOriginal(0));
TS_ASSERT_DIFFERS( g2.getTransformFromOriginal(1), g.getTransformFromOriginal(1));
TS_ASSERT_DIFFERS( g2.getTransformToOriginal(0), g.getTransformToOriginal(0));
TS_ASSERT_DIFFERS( g2.getTransformToOriginal(1), g.getTransformToOriginal(1));
TS_ASSERT( g2.getTransformFromOriginal(0) != NULL);
TS_ASSERT( g2.getTransformFromOriginal(1) != NULL);
TS_ASSERT( g2.getTransformToOriginal(0) != NULL);
TS_ASSERT( g2.getTransformToOriginal(1) != NULL);

}


/** Adding dimension info and searching for it back */
void test_addDimension_getDimension()
{
Expand Down
1 change: 1 addition & 0 deletions Code/Mantid/Framework/MDEvents/src/SlicingAlgorithm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ namespace MDEvents
}
// The name is everything before the 3rd comma from the end
std::string name = input.substr(0, n+1);
name=Strings::strip(name);

// And split the rest of it
input = input.substr(n+2);
Expand Down
2 changes: 1 addition & 1 deletion Code/Mantid/Framework/MDEvents/test/SlicingAlgorithmTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ class SlicingAlgorithmTest : public CxxTest::TestSuite
void test_makeAlignedDimensionFromString_SpecifyDimensionID()
{
SlicingAlgorithmImpl alg; alg.m_inWS = ws_names;
TSM_ASSERT_THROWS_NOTHING("", alg.makeAlignedDimensionFromString("Q2, 1.0, 9.0, 10"));
TSM_ASSERT_THROWS_NOTHING("", alg.makeAlignedDimensionFromString("Q2 , 1.0, 9.0, 10"));
TS_ASSERT_EQUALS( alg.m_dimensionToBinFrom.size(), 1);
TS_ASSERT_EQUALS( alg.m_binDimensions.size(), 1);
if (alg.m_binDimensions.size() < 1) return;
Expand Down

0 comments on commit 08956f9

Please sign in to comment.