Skip to content

Commit

Permalink
refs #6449 unit test for serialize/deserialize events
Browse files Browse the repository at this point in the history
also minor changes to algorithms, disabling parts which are not yet supported.
  • Loading branch information
abuts committed Apr 5, 2013
1 parent 5e152c4 commit 21c5663
Show file tree
Hide file tree
Showing 7 changed files with 241 additions and 49 deletions.
60 changes: 30 additions & 30 deletions Code/Mantid/Framework/MDAlgorithms/src/MergeMDFiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -377,36 +377,36 @@ namespace MDAlgorithms
//}


////----------------------------------------------------------------------------------------------
///** Execute the algorithm.
// */
//void MergeMDFiles::exec()
//{
// // clear disk buffer which can remain from previous runs
// // the existance/ usage of the buffer idicates if the algorithm works with file based or memory based target workspaces;
// pDiskBuffer = NULL;
// MultipleFileProperty * multiFileProp = dynamic_cast<MultipleFileProperty*>(getPointerToProperty("Filenames"));
// m_Filenames = MultipleFileProperty::flattenFileNames(multiFileProp->operator()());
// if (m_Filenames.size() == 0)
// throw std::invalid_argument("Must specify at least one filename.");
// std::string firstFile = m_Filenames[0];

// // Start by loading the first file but just the box structure, no events, and not file-backed
// IAlgorithm_sptr loader = createChildAlgorithm("LoadMD", 0.0, 0.05, false);
// loader->setPropertyValue("Filename", firstFile);
// loader->setProperty("MetadataOnly", false);
// loader->setProperty("BoxStructureOnly", true);
// loader->setProperty("FileBackEnd", false);
// loader->setPropertyValue("OutputWorkspace", this->getPropertyValue("OutputWorkspace") );
// loader->executeAsChildAlg();
// IMDWorkspace_sptr firstWS = loader->getProperty("OutputWorkspace");


// // Call the templated method
// CALL_MDEVENT_FUNCTION( this->doExecByCloning, firstWS);

// setProperty("OutputWorkspace", m_OutIWS);
//}
//----------------------------------------------------------------------------------------------
/** Execute the algorithm.
*/
void MergeMDFiles::exec()
{
//// clear disk buffer which can remain from previous runs
//// the existance/ usage of the buffer idicates if the algorithm works with file based or memory based target workspaces;
//pDiskBuffer = NULL;
//MultipleFileProperty * multiFileProp = dynamic_cast<MultipleFileProperty*>(getPointerToProperty("Filenames"));
//m_Filenames = MultipleFileProperty::flattenFileNames(multiFileProp->operator()());
//if (m_Filenames.size() == 0)
// throw std::invalid_argument("Must specify at least one filename.");
//std::string firstFile = m_Filenames[0];

//// Start by loading the first file but just the box structure, no events, and not file-backed
//IAlgorithm_sptr loader = createChildAlgorithm("LoadMD", 0.0, 0.05, false);
//loader->setPropertyValue("Filename", firstFile);
//loader->setProperty("MetadataOnly", false);
//loader->setProperty("BoxStructureOnly", true);
//loader->setProperty("FileBackEnd", false);
//loader->setPropertyValue("OutputWorkspace", this->getPropertyValue("OutputWorkspace") );
//loader->executeAsChildAlg();
//IMDWorkspace_sptr firstWS = loader->getProperty("OutputWorkspace");


//// Call the templated method
//CALL_MDEVENT_FUNCTION( this->doExecByCloning, firstWS);

//setProperty("OutputWorkspace", m_OutIWS);
}



Expand Down
16 changes: 8 additions & 8 deletions Code/Mantid/Framework/MDAlgorithms/src/SaveMD.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -400,11 +400,11 @@ namespace MDAlgorithms
// }
//
//
// //----------------------------------------------------------------------------------------------
// /** Execute the algorithm.
// */
// void SaveMD::exec()
// {
//----------------------------------------------------------------------------------------------
/** Execute the algorithm.
*/
void SaveMD::exec()
{
// IMDWorkspace_sptr ws = getProperty("InputWorkspace");
// IMDEventWorkspace_sptr eventWS = boost::dynamic_pointer_cast<IMDEventWorkspace>(ws);
// MDHistoWorkspace_sptr histoWS = boost::dynamic_pointer_cast<MDHistoWorkspace>(ws);
Expand All @@ -420,9 +420,9 @@ namespace MDAlgorithms
// }
// else
// throw std::runtime_error("SaveMD can only save MDEventWorkspaces and MDHistoWorkspaces.\nPlease use SaveNexus or another algorithm appropriate for this workspace type.");
// }
//
//
}



} // namespace Mantid
} // namespace MDEvents
Expand Down
4 changes: 2 additions & 2 deletions Code/Mantid/Framework/MDAlgorithms/test/TransformMDTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,11 @@ class TransformMDTest : public CxxTest::TestSuite
TS_ASSERT_DELTA( ws2->getDimension(d)->getMinimum(), 21.0, 1e-5);
TS_ASSERT_DELTA( ws2->getDimension(d)->getMaximum(), 41.0, 1e-5);
}
std::vector<MDBoxBase3Lean*> boxes;
std::vector<API::IMDNode *> boxes;
ws2->getBox()->getBoxes(boxes, 1000, true);
for (size_t i=0; i<boxes.size(); i++)
{
MDBoxBase3Lean* box = boxes[i];
API::IMDNode * box = boxes[i];
TSM_ASSERT_LESS_THAN( "Box extents was offset", 20.0, box->getExtents(0).getMin() );
// More detailed tests are in MDBox, MDBoxBase and MDGridBox.
}
Expand Down
10 changes: 6 additions & 4 deletions Code/Mantid/Framework/MDEvents/inc/MantidMDEvents/MDEvent.h
Original file line number Diff line number Diff line change
Expand Up @@ -245,13 +245,15 @@ namespace MDEvents
*/
static inline void dataToEvents(const std::vector<coord_t> &data, std::vector<MDEvent<nd> > & events)
{
// Number of columns = number of dimensions + 2 (signal/error)
// Number of columns = number of dimensions + 4 (signal/error)+detId+runID
size_t numColumns = nd+4;
size_t numEvents = data.size()/numColumns;
if(numEvents*numColumns!=events.size())
throw(std::invalid_argument("wrong input array of data to convert to lean events "));
if(numEvents*numColumns!=data.size())
throw(std::invalid_argument("wrong input array of data to convert to lean events, suspected column data for different dimensions/(type of) events "));

// Reserve the amount of space needed. Significant speed up (~30% thanks to this)

// Reserve the amount of space needed. Significant speed up (~30% thanks to this)
events.clear();
events.reserve(numEvents);
for (size_t i=0; i<numEvents; i++)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,11 +325,13 @@ namespace MDEvents
{
// Number of columns = number of dimensions + 2 (signal/error)
size_t numColumns = nd+2;
size_t numEvents = events.size()/numColumns;
if(numEvents*numColumns!=events.size())
throw(std::invalid_argument("wrong input array of data to convert to lean events "));
size_t numEvents = coord.size()/numColumns;
if(numEvents*numColumns!=coord.size())
throw(std::invalid_argument("wrong input array of data to convert to lean events, suspected column data for different dimensions/(type of) events "));


// Reserve the amount of space needed. Significant speed up (~30% thanks to this)
events.clear();
events.reserve(numEvents);
for (size_t i=0; i<numEvents; i++)
{
Expand Down
2 changes: 0 additions & 2 deletions Code/Mantid/Framework/MDEvents/test/MDBoxTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ static MDBoxTest *createSuite() { return new MDBoxTest(); }
static void destroySuite(MDBoxTest * suite) { delete suite; }



public:
void test_default_constructor()
{
MDBox<MDLeanEvent<3>,3> b3(sc.get());
Expand Down
190 changes: 190 additions & 0 deletions Code/Mantid/Framework/MDEvents/test/MDEventTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ using namespace Mantid::MDEvents;
class MDEventTest : public CxxTest::TestSuite
{
public:
static MDEventTest *createSuite() { return new MDEventTest(); }
static void destroySuite(MDEventTest * suite) { delete suite; }


void test_simple_constructors()
Expand Down Expand Up @@ -80,6 +82,124 @@ class MDEventTest : public CxxTest::TestSuite
TS_ASSERT_EQUALS( a.getDetectorID(), 456789);
}

void test_serialize_deserializeLean()
{
size_t nPoints=99; // the number should not be nPoints%4=0 to hold test TS_ASSERT_THROWS below
std::vector<MDLeanEvent<3> > events(nPoints);
double sumGuess(0),errGuess(0);
for(size_t i=0;i<nPoints;i++)
{

events[i].setSignal(static_cast<float>(i));
events[i].setErrorSquared(static_cast<float>(i*i));
sumGuess+=i;
errGuess+=i*i;
events[i].setCenter(0,0.1*static_cast<double>(i));
events[i].setCenter(1,static_cast<double>(i));
events[i].setCenter(2,10*static_cast<double>(i));

}

std::vector<coord_t> data;
size_t ncols;
double totalSignal;
double totalErrSq;
TS_ASSERT_THROWS_NOTHING(MDLeanEvent<3>::eventsToData(events,data,ncols,totalSignal,totalErrSq));
TS_ASSERT_EQUALS(3+2,ncols);
TS_ASSERT_EQUALS((3+2)*nPoints,data.size());
TS_ASSERT_DELTA(sumGuess,totalSignal,1.e-7);
TS_ASSERT_DELTA(errGuess,totalErrSq,1.e-7);

for(size_t i=0;i<nPoints;i++)
{
TS_ASSERT_DELTA(events[i].getSignal(),data[ncols*i+0],1.e-6);
TS_ASSERT_DELTA(events[i].getErrorSquared(),data[ncols*i+1],1.e-6);
TS_ASSERT_DELTA(events[i].getCenter(0),data[ncols*i+2],1.e-6);
TS_ASSERT_DELTA(events[i].getCenter(1),data[ncols*i+3],1.e-6);
TS_ASSERT_DELTA(events[i].getCenter(2),data[ncols*i+4],1.e-6);
}


std::vector<MDLeanEvent<4> > transfEvents4;
TS_ASSERT_THROWS(MDLeanEvent<4>::dataToEvents(data,transfEvents4),std::invalid_argument);

std::vector<MDLeanEvent<3> > transfEvents;
TS_ASSERT_THROWS_NOTHING(MDLeanEvent<3>::dataToEvents(data,transfEvents));
for(size_t i=0;i<nPoints;i++)
{
TS_ASSERT_DELTA(events[i].getSignal(),transfEvents[i].getSignal(),1.e-6);
TS_ASSERT_DELTA(events[i].getErrorSquared(),transfEvents[i].getErrorSquared(),1.e-6);
TS_ASSERT_DELTA(events[i].getCenter(0),transfEvents[i].getCenter(0),1.e-6);
TS_ASSERT_DELTA(events[i].getCenter(1),transfEvents[i].getCenter(1),1.e-6);
TS_ASSERT_DELTA(events[i].getCenter(2),transfEvents[i].getCenter(2),1.e-6);
}

}
void test_serialize_deserializeFat()
{
size_t nPoints=100; // the number should not be nPoints%3=0 to hold test TS_ASSERT_THROWS below
std::vector<MDEvent<4> > events(nPoints);
double sumGuess(0),errGuess(0);
for(size_t i=0;i<nPoints;i++)
{

events[i].setSignal(static_cast<float>(i));
events[i].setErrorSquared(static_cast<float>(i*i));
events[i].setDetectorId(uint32_t(i));
events[i].setRunIndex(uint16_t(i/10));
sumGuess+=i;
errGuess+=i*i;
events[i].setCenter(0,0.1*static_cast<double>(i));
events[i].setCenter(1,static_cast<double>(i));
events[i].setCenter(2,10*static_cast<double>(i));
events[i].setCenter(3,100*static_cast<double>(i));

}

std::vector<coord_t> data;
size_t ncols;
double totalSignal;
double totalErrSq;
TS_ASSERT_THROWS_NOTHING(MDEvent<4>::eventsToData(events,data,ncols,totalSignal,totalErrSq));
TS_ASSERT_EQUALS(4+4,ncols);
TS_ASSERT_EQUALS((4+4)*nPoints,data.size());
TS_ASSERT_DELTA(sumGuess,totalSignal,1.e-7);
TS_ASSERT_DELTA(errGuess,totalErrSq,1.e-7);

for(size_t i=0;i<nPoints;i++)
{
TS_ASSERT_DELTA(events[i].getSignal(),data[ncols*i+0],1.e-6);
TS_ASSERT_DELTA(events[i].getErrorSquared(),data[ncols*i+1],1.e-6);
TS_ASSERT_EQUALS(events[i].getRunIndex(),uint16_t(data[ncols*i+2]));
TS_ASSERT_EQUALS(events[i].getDetectorID(),uint32_t(data[ncols*i+3]));

TS_ASSERT_DELTA(events[i].getCenter(0),data[ncols*i+4],1.e-6);
TS_ASSERT_DELTA(events[i].getCenter(1),data[ncols*i+5],1.e-6);
TS_ASSERT_DELTA(events[i].getCenter(2),data[ncols*i+6],1.e-6);
TS_ASSERT_DELTA(events[i].getCenter(3),data[ncols*i+7],1.e-6);
}


std::vector<MDEvent<3> > transfEvents3;
TS_ASSERT_THROWS(MDEvent<3>::dataToEvents(data,transfEvents3),std::invalid_argument);

std::vector<MDEvent<4> > transfEvents;
TS_ASSERT_THROWS_NOTHING(MDEvent<4>::dataToEvents(data,transfEvents));
for(size_t i=0;i<nPoints;i++)
{
TS_ASSERT_DELTA(events[i].getSignal(),transfEvents[i].getSignal(),1.e-6);
TS_ASSERT_DELTA(events[i].getErrorSquared(),transfEvents[i].getErrorSquared(),1.e-6);
TS_ASSERT_EQUALS(events[i].getRunIndex(),transfEvents[i].getRunIndex());
TS_ASSERT_EQUALS(events[i].getDetectorID(),transfEvents[i].getDetectorID());

TS_ASSERT_DELTA(events[i].getCenter(0),transfEvents[i].getCenter(0),1.e-6);
TS_ASSERT_DELTA(events[i].getCenter(1),transfEvents[i].getCenter(1),1.e-6);
TS_ASSERT_DELTA(events[i].getCenter(2),transfEvents[i].getCenter(2),1.e-6);
TS_ASSERT_DELTA(events[i].getCenter(3),transfEvents[i].getCenter(3),1.e-6);
}

}


};

Expand Down Expand Up @@ -142,6 +262,76 @@ class MDEventTestPerformance : public CxxTest::TestSuite
lean_events4.push_back( MDLeanEvent<4>(signal, error, center) );
}


void test_serialize_deserializeLean()
{
size_t nPoints=num; // the number should not be nPoints%4=0 to hold test TS_ASSERT_THROWS below
std::vector<MDLeanEvent<3> > events(nPoints);
double sumGuess(0),errGuess(0);
for(size_t i=0;i<nPoints;i++)
{

events[i].setSignal(static_cast<float>(i));
events[i].setErrorSquared(static_cast<float>(i*i));
sumGuess+=i;
errGuess+=i*i;
events[i].setCenter(0,0.1*static_cast<double>(i));
events[i].setCenter(1,static_cast<double>(i));
events[i].setCenter(2,10*static_cast<double>(i));

}

std::vector<coord_t> data;
size_t ncols;
double totalSignal;
double totalErrSq;
TS_ASSERT_THROWS_NOTHING(MDLeanEvent<3>::eventsToData(events,data,ncols,totalSignal,totalErrSq));
TS_ASSERT_EQUALS(3+2,ncols);
TS_ASSERT_EQUALS((3+2)*nPoints,data.size());
TS_ASSERT_DELTA(sumGuess,totalSignal,1.e-7);
TS_ASSERT_DELTA(errGuess,totalErrSq,1.e-7);


std::vector<MDLeanEvent<3> > transfEvents;
TS_ASSERT_THROWS_NOTHING(MDLeanEvent<3>::dataToEvents(data,transfEvents));
}
void test_serialize_deserializeFat()
{
size_t nPoints=num; // the number should not be nPoints%3=0 to hold test TS_ASSERT_THROWS below
std::vector<MDEvent<4> > events(nPoints);
double sumGuess(0),errGuess(0);
for(size_t i=0;i<nPoints;i++)
{

events[i].setSignal(static_cast<float>(i));
events[i].setErrorSquared(static_cast<float>(i*i));
events[i].setDetectorId(uint32_t(i));
events[i].setRunIndex(uint16_t(i/10));
sumGuess+=i;
errGuess+=i*i;
events[i].setCenter(0,0.1*static_cast<double>(i));
events[i].setCenter(1,static_cast<double>(i));
events[i].setCenter(2,10*static_cast<double>(i));
events[i].setCenter(3,100*static_cast<double>(i));

}

std::vector<coord_t> data;
size_t ncols;
double totalSignal;
double totalErrSq;
TS_ASSERT_THROWS_NOTHING(MDEvent<4>::eventsToData(events,data,ncols,totalSignal,totalErrSq));
TS_ASSERT_EQUALS(4+4,ncols);
TS_ASSERT_EQUALS((4+4)*nPoints,data.size());
TS_ASSERT_DELTA(sumGuess,totalSignal,1.e-7);
TS_ASSERT_DELTA(errGuess,totalErrSq,1.e-7);

std::vector<MDEvent<4> > transfEvents;
TS_ASSERT_THROWS_NOTHING(MDEvent<4>::dataToEvents(data,transfEvents));

}


};

#endif

0 comments on commit 21c5663

Please sign in to comment.