Newer
Older
Ronald Fowler
committed
#ifndef SAVENEXUSPROCESSEDTEST_H_
#define SAVENEXUSPROCESSEDTEST_H_
// These includes seem to make the difference between initialization of the
// workspace names (workspace2D/1D etc), instrument classes and not for this test case.
#include "MantidDataObjects/WorkspaceSingleValue.h"
#include "MantidDataHandling/LoadInstrument.h"
#include "MantidAPI/FrameworkManager.h"
#include "MantidAPI/WorkspaceFactory.h"
#include "MantidAPI/TableRow.h"
#include "MantidAPI/ScopedWorkspace.h"
Ronald Fowler
committed
#include "MantidDataObjects/Workspace2D.h"
#include "MantidDataObjects/TableWorkspace.h"
#include "MantidDataHandling/LoadEventPreNexus.h"
Ronald Fowler
committed
#include "MantidAPI/AnalysisDataService.h"
Campbell, Stuart
committed
#include "MantidDataHandling/SaveNexusProcessed.h"
#include "MantidDataHandling/LoadMuonNexus.h"
#include "MantidDataHandling/LoadNexus.h"
Ronald Fowler
committed
#include "MantidKernel/UnitFactory.h"
Sofia Antony
committed
#include "MantidDataHandling/LoadRaw3.h"
Janik Zikovsky
committed
#include "MantidTestHelpers/WorkspaceCreationHelper.h"
Ronald Fowler
committed
#include <nexus/NeXusFile.hpp>
#include <boost/lexical_cast.hpp>
#include <fstream>
#include <cxxtest/TestSuite.h>
Ronald Fowler
committed
using namespace Mantid::API;
using namespace Mantid::Kernel;
Campbell, Stuart
committed
using namespace Mantid::DataHandling;
Ronald Fowler
committed
using namespace Mantid::DataObjects;
Campbell, Stuart
committed
using namespace Mantid::NeXus;
Ronald Fowler
committed
class SaveNexusProcessedTest : public CxxTest::TestSuite
{
public:
Russell Taylor
committed
// This pair of boilerplate methods prevent the suite being created statically
// This means the constructor isn't called when running other tests
static SaveNexusProcessedTest *createSuite() { return new SaveNexusProcessedTest(); }
static void destroySuite( SaveNexusProcessedTest *suite ) { delete suite; }
Ronald Fowler
committed
Janik Zikovsky
committed
SaveNexusProcessedTest()
Ronald Fowler
committed
{
// clearfiles - make true for SVN as dont want to leave on build server.
// Unless the file "KEEP_NXS_FILES" exists, then clear up nxs files
Gigg, Martyn Anthony
committed
Poco::File file("KEEP_NXS_FILES");
clearfiles = !file.exists();
Janik Zikovsky
committed
}
Janik Zikovsky
committed
void setUp()
{
Ronald Fowler
committed
Janik Zikovsky
committed
}
void tearDown()
{
}
Ronald Fowler
committed
Ronald Fowler
committed
{
Janik Zikovsky
committed
SaveNexusProcessed algToBeTested;
Ronald Fowler
committed
TS_ASSERT_THROWS_NOTHING(algToBeTested.initialize());
TS_ASSERT( algToBeTested.isInitialized() );
}
Ronald Fowler
committed
{
Janik Zikovsky
committed
SaveNexusProcessed algToBeTested;
Ronald Fowler
committed
if ( !algToBeTested.isInitialized() ) algToBeTested.initialize();
// Should fail because mandatory parameter has not been set
TS_ASSERT_THROWS(algToBeTested.execute(),std::runtime_error);
Janik Zikovsky
committed
// create dummy 2D-workspace
Workspace2D_sptr localWorkspace2D = boost::dynamic_pointer_cast<Workspace2D>
Janik Zikovsky
committed
(WorkspaceFactory::Instance().create("Workspace2D",1,10,10));
Janik Zikovsky
committed
localWorkspace2D->getAxis(0)->unit() = UnitFactory::Instance().create("TOF");
double d = 0.0;
for(int i = 0; i<10; ++i,d+=0.1)
{
localWorkspace2D->dataX(0)[i] = d;
localWorkspace2D->dataY(0)[i] = d;
localWorkspace2D->dataE(0)[i] = d;
}
AnalysisDataService::Instance().addOrReplace("testSpace", localWorkspace2D);
Ronald Fowler
committed
// Now set it...
// specify name of file to save workspace to
algToBeTested.setPropertyValue("InputWorkspace", "testSpace");
Janik Zikovsky
committed
outputFile = "SaveNexusProcessedTest_testExec.nxs";
//entryName = "test";
Ronald Fowler
committed
dataName = "spectra";
title = "A simple workspace saved in Processed Nexus format";
TS_ASSERT_THROWS_NOTHING(algToBeTested.setPropertyValue("Filename", outputFile));
outputFile = algToBeTested.getPropertyValue("Filename");
//algToBeTested.setPropertyValue("EntryName", entryName);
Ronald Fowler
committed
algToBeTested.setPropertyValue("Title", title);
if( Poco::File(outputFile).exists() ) Poco::File(outputFile).remove();
Ronald Fowler
committed
std::string result;
TS_ASSERT_THROWS_NOTHING( result = algToBeTested.getPropertyValue("Filename") );
Ronald Fowler
committed
TS_ASSERT( ! result.compare(outputFile));
//TS_ASSERT_THROWS_NOTHING( result = algToBeTested.getPropertyValue("EntryName") )
//TS_ASSERT( ! result.compare(entryName));
Ronald Fowler
committed
Gigg, Martyn Anthony
committed
// changed so that 1D workspaces are no longer written.
Ronald Fowler
committed
TS_ASSERT_THROWS_NOTHING(algToBeTested.execute());
TS_ASSERT( algToBeTested.isExecuted() );
if(clearfiles) Poco::File(outputFile).remove();
Ronald Fowler
committed
Janik Zikovsky
committed
AnalysisDataService::Instance().remove("testSpace");
Ronald Fowler
committed
}
Janik Zikovsky
committed
Ronald Fowler
committed
{
Janik Zikovsky
committed
SaveNexusProcessed algToBeTested;
Robert Whitley
committed
std::string inputFile = "LOQ48127.raw";
Janik Zikovsky
committed
TS_ASSERT_THROWS_NOTHING( loader.initialize());
TS_ASSERT( loader.isInitialized() );
loader.setPropertyValue("Filename", inputFile);
outputSpace = "outer4";
loader.setPropertyValue("OutputWorkspace", outputSpace);
TS_ASSERT_THROWS_NOTHING(loader.execute());
TS_ASSERT( loader.isExecuted() );
Sofia Antony
committed
Ronald Fowler
committed
//
// get workspace
//
Workspace_sptr output;
TS_ASSERT_THROWS_NOTHING(output = AnalysisDataService::Instance().retrieve(outputSpace));
Workspace2D_sptr output2D = boost::dynamic_pointer_cast<Workspace2D>(output);
//
if ( !algToBeTested.isInitialized() ) algToBeTested.initialize();
algToBeTested.setPropertyValue("InputWorkspace", outputSpace);
// specify name of file to save workspace to
Janik Zikovsky
committed
outputFile = "SaveNexusProcessedTest_testExecOnLoadraw.nxs";
if( Poco::File(outputFile).exists() ) Poco::File(outputFile).remove();
//entryName = "entry4";
Ronald Fowler
committed
dataName = "spectra";
Janik Zikovsky
committed
title = "A save of a workspace from Loadraw file";
algToBeTested.setPropertyValue("Filename", outputFile);
Janik Zikovsky
committed
//algToBeTested.setPropertyValue("EntryName", entryName);
Ronald Fowler
committed
algToBeTested.setPropertyValue("Title", title);
Janik Zikovsky
committed
algToBeTested.setPropertyValue("Append", "0");
Janik Zikovsky
committed
outputFile = algToBeTested.getPropertyValue("Filename");
Ronald Fowler
committed
std::string result;
TS_ASSERT_THROWS_NOTHING( result = algToBeTested.getPropertyValue("Filename") );
TS_ASSERT( ! result.compare(outputFile));
//TS_ASSERT_THROWS_NOTHING( result = algToBeTested.getPropertyValue("EntryName") );
//TS_ASSERT( ! result.compare(entryName));
Ronald Fowler
committed
TS_ASSERT_THROWS_NOTHING(algToBeTested.execute());
TS_ASSERT( algToBeTested.isExecuted() );
Janik Zikovsky
committed
if(clearfiles) remove(outputFile.c_str());
Ronald Fowler
committed
TS_ASSERT_THROWS_NOTHING(AnalysisDataService::Instance().remove(outputSpace));
}
Janik Zikovsky
committed
{
SaveNexusProcessed algToBeTested;
Janik Zikovsky
committed
LoadNexus nxLoad;
std::string outputSpace,inputFile;
nxLoad.initialize();
// Now set required filename and output workspace name
inputFile = "emu00006473.nxs";
nxLoad.setPropertyValue("Filename", inputFile);
outputSpace="outer";
nxLoad.setPropertyValue("OutputWorkspace", outputSpace);
//
// Test execute to read file and populate workspace
//
TS_ASSERT_THROWS_NOTHING(nxLoad.execute());
TS_ASSERT( nxLoad.isExecuted() );
Ronald Fowler
committed
//
// get workspace
//
Workspace_sptr output;
TS_ASSERT_THROWS_NOTHING(output = AnalysisDataService::Instance().retrieve(outputSpace));
Workspace2D_sptr output2D = boost::dynamic_pointer_cast<Workspace2D>(output);
Janik Zikovsky
committed
// this would make all X's separate
// output2D->dataX(22)[3]=0.55;
Ronald Fowler
committed
//
if ( !algToBeTested.isInitialized() ) algToBeTested.initialize();
algToBeTested.setPropertyValue("InputWorkspace", outputSpace);
// specify name of file to save workspace to
Janik Zikovsky
committed
outputFile = "SaveNexusProcessedTest_testExecOnMuon.nxs";
if( Poco::File(outputFile).exists() ) Poco::File(outputFile).remove();
//entryName = "entry4";
Ronald Fowler
committed
dataName = "spectra";
Janik Zikovsky
committed
title = "A save of a 2D workspace from Muon file";
algToBeTested.setPropertyValue("Filename", outputFile);
Janik Zikovsky
committed
outputFile = algToBeTested.getPropertyValue("Filename");
if( Poco::File(outputFile).exists() ) Poco::File(outputFile).remove();
Janik Zikovsky
committed
//algToBeTested.setPropertyValue("EntryName", entryName);
Ronald Fowler
committed
algToBeTested.setPropertyValue("Title", title);
algToBeTested.setPropertyValue("Append", "0");
Janik Zikovsky
committed
Ronald Fowler
committed
std::string result;
TS_ASSERT_THROWS_NOTHING( result = algToBeTested.getPropertyValue("Filename") );
TS_ASSERT( ! result.compare(outputFile));
//TS_ASSERT_THROWS_NOTHING( result = algToBeTested.getPropertyValue("EntryName") );
//TS_ASSERT( ! result.compare(entryName));
Ronald Fowler
committed
TS_ASSERT_THROWS_NOTHING(algToBeTested.execute());
Ronald Fowler
committed
TS_ASSERT( algToBeTested.isExecuted() );
Russell Taylor
committed
// Nice idea, but confusing (seg-faulted) if algorithm doesn't clean its state
// In reality out algorithms are only call once
// // try writing data again
// TS_ASSERT_THROWS_NOTHING(algToBeTested.execute());
// TS_ASSERT( algToBeTested.isExecuted() );
if(clearfiles) Poco::File(outputFile).remove();
Ronald Fowler
committed
TS_ASSERT_THROWS_NOTHING(AnalysisDataService::Instance().remove(outputSpace));
Janik Zikovsky
committed
}
/**
*
* @param filename_root :: base of the file to save
* @param type :: event type to create
* @param outputFile[out] :: returns the output file
* @param makeDifferentTypes :: mix event types
* @param clearfiles :: clear files after saving
* @param PreserveEvents :: save as event list
* @param CompressNexus :: compress
* @return
*/
Janik Zikovsky
committed
static EventWorkspace_sptr do_testExec_EventWorkspaces(std::string filename_root, EventType type,
std::string & outputFile, bool makeDifferentTypes, bool clearfiles,
bool PreserveEvents=true, bool CompressNexus=false)
Janik Zikovsky
committed
std::vector< std::vector<int> > groups(5);
groups[0].push_back(10);
groups[0].push_back(11);
groups[0].push_back(12);
groups[1].push_back(20);
groups[2].push_back(30);
Janik Zikovsky
committed
groups[3].push_back(40);
groups[4].push_back(50);
EventWorkspace_sptr WS = WorkspaceCreationHelper::CreateGroupedEventWorkspace(groups, 100, 1.0);
WS->getEventList(3).clear(false);
Janik Zikovsky
committed
// Switch the event type
if (makeDifferentTypes)
{
WS->getEventList(0).switchTo(TOF);
WS->getEventList(1).switchTo(WEIGHTED);
WS->getEventList(2).switchTo(WEIGHTED_NOTIME);
WS->getEventList(4).switchTo(WEIGHTED);
}
else
{
for (size_t wi=0; wi < WS->getNumberHistograms(); wi++)
Janik Zikovsky
committed
WS->getEventList(wi).switchTo(type);
}
Janik Zikovsky
committed
Janik Zikovsky
committed
SaveNexusProcessed alg;
alg.initialize();
Janik Zikovsky
committed
Janik Zikovsky
committed
// Now set it...
alg.setProperty("InputWorkspace", boost::dynamic_pointer_cast<Workspace>(WS));
Janik Zikovsky
committed
Janik Zikovsky
committed
// specify name of file to save workspace to
std::ostringstream mess;
mess << filename_root << static_cast<int>(type) << ".nxs";
outputFile = mess.str();
Janik Zikovsky
committed
std::string dataName = "spectra";
std::string title = "A simple workspace saved in Processed Nexus format";
Janik Zikovsky
committed
Janik Zikovsky
committed
alg.setPropertyValue("Filename", outputFile);
outputFile = alg.getPropertyValue("Filename");
alg.setPropertyValue("Title", title);
alg.setProperty("PreserveEvents", PreserveEvents);
alg.setProperty("CompressNexus", CompressNexus);
Janik Zikovsky
committed
Janik Zikovsky
committed
// Clear the existing file, if any
if( Poco::File(outputFile).exists() ) Poco::File(outputFile).remove();
alg.execute();
TS_ASSERT( alg.isExecuted() );
Janik Zikovsky
committed
Janik Zikovsky
committed
TS_ASSERT( Poco::File(outputFile).exists() );
Janik Zikovsky
committed
Janik Zikovsky
committed
if(clearfiles) Poco::File(outputFile).remove();
Janik Zikovsky
committed
Janik Zikovsky
committed
return WS;
}
Janik Zikovsky
committed
void testExec_EventWorkspace_TofEvent()
Janik Zikovsky
committed
{
std::string outputFile;
do_testExec_EventWorkspaces("SaveNexusProcessed_", TOF, outputFile, false, clearfiles);
Janik Zikovsky
committed
}
void testExec_EventWorkspace_WeightedEvent()
Janik Zikovsky
committed
{
std::string outputFile;
do_testExec_EventWorkspaces("SaveNexusProcessed_", WEIGHTED, outputFile, false, clearfiles);
Janik Zikovsky
committed
}
void testExec_EventWorkspace_WeightedEventNoTime()
Janik Zikovsky
committed
{
std::string outputFile;
do_testExec_EventWorkspaces("SaveNexusProcessed_", WEIGHTED_NOTIME, outputFile, false, clearfiles);
Janik Zikovsky
committed
}
void testExec_EventWorkspace_DifferentTypes()
Janik Zikovsky
committed
{
std::string outputFile;
do_testExec_EventWorkspaces("SaveNexusProcessed_DifferentTypes_", WEIGHTED_NOTIME, outputFile, true, clearfiles);
Janik Zikovsky
committed
}
void testExec_EventWorkspace_DontPreserveEvents()
{
std::string outputFile;
do_testExec_EventWorkspaces("SaveNexusProcessed_EventTo2D", TOF, outputFile, false, clearfiles, false /* DONT preserve events */);
}
void testExec_EventWorkspace_CompressNexus()
{
std::string outputFile;
do_testExec_EventWorkspaces("SaveNexusProcessed_EventTo2D", TOF, outputFile, false, clearfiles, true /* DONT preserve events */, true /* Compress */);
}
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
{
SaveNexusProcessed alg;
if ( !alg.isInitialized() ) alg.initialize();
// create dummy 2D-workspace
Workspace2D_sptr localWorkspace2D = boost::dynamic_pointer_cast<Workspace2D>
(WorkspaceFactory::Instance().create("Workspace2D",1,10,10));
//set units to be a label
localWorkspace2D->getAxis(0)->unit() = UnitFactory::Instance().create("Label");
auto label = boost::dynamic_pointer_cast<Mantid::Kernel::Units::Label>(localWorkspace2D->getAxis(0)->unit());
label->setLabel("Temperature","K");
double d = 0.0;
for(int i = 0; i<10; ++i,d+=0.1)
{
localWorkspace2D->dataX(0)[i] = d;
localWorkspace2D->dataY(0)[i] = d;
localWorkspace2D->dataE(0)[i] = d;
}
AnalysisDataService::Instance().addOrReplace("testSpace", localWorkspace2D);
// Now set it...
// specify name of file to save workspace to
alg.setPropertyValue("InputWorkspace", "testSpace");
outputFile = "SaveNexusProcessedTest_testExec.nxs";
//entryName = "test";
dataName = "spectra";
title = "A simple workspace saved in Processed Nexus format";
TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("Filename", outputFile));
outputFile = alg.getPropertyValue("Filename");
//alg.setPropertyValue("EntryName", entryName);
alg.setPropertyValue("Title", title);
if( Poco::File(outputFile).exists() ) Poco::File(outputFile).remove();
std::string result;
TS_ASSERT_THROWS_NOTHING( result = alg.getPropertyValue("Filename") );
TS_ASSERT( ! result.compare(outputFile));
// changed so that 1D workspaces are no longer written.
TS_ASSERT_THROWS_NOTHING(alg.execute());
TS_ASSERT( alg.isExecuted() );
if(clearfiles) Poco::File(outputFile).remove();
AnalysisDataService::Instance().remove("testSpace");
}
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
const std::string output_filename = "SaveNexusProcessedTest_GroupWorkspaceFile.nxs";
// Clean out any previous instances.
bool doesFileExist = Poco::File(output_filename).exists();
if (doesFileExist)
{
Poco::File(output_filename).remove();
}
const int nEntries = 3;
const int nHist = 1;
const int nBins = 1;
const std::string stem = "test_group_ws";
Mantid::API::WorkspaceGroup_sptr group_ws = WorkspaceCreationHelper::CreateWorkspaceGroup(nEntries,
nHist, nBins, stem);
SaveNexusProcessed alg;
alg.setRethrows(true);
alg.setChild(true);
alg.initialize();
alg.setProperty("Filename", output_filename);
alg.setProperty("InputWorkspace", group_ws);
alg.execute();
doesFileExist = Poco::File(output_filename).exists();
TSM_ASSERT("File should have been created", doesFileExist);
if (doesFileExist)
{
Poco::File(output_filename).remove();
}
void testSaveTableVectorColumn()
{
std::string outputFileName = "SaveNexusProcessedTest_testSaveTableVectorColumn.nxs";
// Create a table which we will save
ITableWorkspace_sptr table = WorkspaceFactory::Instance().createTable();
table->addColumn("vector_int", "IntVectorColumn");
table->addColumn("vector_double", "DoubleVectorColumn");
std::vector<double> d1, d2, d3;
d1.push_back(0.5);
d2.push_back(1.0); d2.push_back(2.5);
d3.push_back(4.0);
// Add some rows of different sizes
TableRow row1 = table->appendRow(); row1 << Strings::parseRange("1")<< d1;
TableRow row2 = table->appendRow(); row2 << Strings::parseRange("2,3") << d2;
TableRow row3 = table->appendRow(); row3 << Strings::parseRange("4,5,6,7") << d3;
ScopedWorkspace inputWsEntry(table);
SaveNexusProcessed alg;
alg.initialize();
alg.setPropertyValue("InputWorkspace", inputWsEntry.name());
alg.setPropertyValue("Filename", outputFileName);
TS_ASSERT_THROWS_NOTHING( alg.execute() );
TS_ASSERT( alg.isExecuted() );
if ( ! alg.isExecuted() )
return; // Nothing to check
Janik Zikovsky
committed
// Get full output file path
outputFileName = alg.getPropertyValue("Filename");
try
{
NeXus::File savedNexus(outputFileName);
savedNexus.openGroup("mantid_workspace_1", "NXentry");
savedNexus.openGroup("table_workspace", "NXdata");
// -- Checking int column -----
savedNexus.openData("column_1");
NeXus::Info columnInfo1 = savedNexus.getInfo();
TS_ASSERT_EQUALS( columnInfo1.dims.size(), 2 );
TS_ASSERT_EQUALS( columnInfo1.dims[0], 3 );
TS_ASSERT_EQUALS( columnInfo1.dims[1], 4 );
TS_ASSERT_EQUALS( columnInfo1.type, NX_INT32 );
std::vector<int> data1;
savedNexus.getData<int>(data1);
TS_ASSERT_EQUALS( data1.size(), 12 );
TS_ASSERT_EQUALS( data1[0], 1 );
TS_ASSERT_EQUALS( data1[3], 0 );
TS_ASSERT_EQUALS( data1[5], 3 );
TS_ASSERT_EQUALS( data1[8], 4 );
TS_ASSERT_EQUALS( data1[11], 7 );
std::vector<NeXus::AttrInfo> attrInfos1 = savedNexus.getAttrInfos();
TS_ASSERT_EQUALS( attrInfos1.size(), 6 );
if ( attrInfos1.size() == 6 )
TS_ASSERT_EQUALS( attrInfos1[0].name, "row_size_0");
TS_ASSERT_EQUALS( savedNexus.getAttr<int>(attrInfos1[0]), 1 );
TS_ASSERT_EQUALS( attrInfos1[2].name, "row_size_2");
TS_ASSERT_EQUALS( savedNexus.getAttr<int>(attrInfos1[2]), 4 );
TS_ASSERT_EQUALS( attrInfos1[4].name, "interpret_as");
TS_ASSERT_EQUALS( savedNexus.getStrAttr(attrInfos1[4]), "" );
TS_ASSERT_EQUALS( attrInfos1[5].name, "name");
TS_ASSERT_EQUALS( savedNexus.getStrAttr(attrInfos1[5]), "IntVectorColumn" );
// -- Checking double column -----
savedNexus.openData("column_2");
NeXus::Info columnInfo2 = savedNexus.getInfo();
TS_ASSERT_EQUALS( columnInfo2.dims.size(), 2 );
TS_ASSERT_EQUALS( columnInfo2.dims[0], 3 );
TS_ASSERT_EQUALS( columnInfo2.dims[1], 2 );
TS_ASSERT_EQUALS( columnInfo2.type, NX_FLOAT64 );
std::vector<double> data2;
savedNexus.getData<double>(data2);
TS_ASSERT_EQUALS( data2.size(), 6 );
TS_ASSERT_EQUALS( data2[0], 0.5 );
TS_ASSERT_EQUALS( data2[3], 2.5 );
TS_ASSERT_EQUALS( data2[5], 0.0 );
std::vector<NeXus::AttrInfo> attrInfos2 = savedNexus.getAttrInfos();
TS_ASSERT_EQUALS( attrInfos2.size(), 6 );
if ( attrInfos2.size() == 6 )
TS_ASSERT_EQUALS( attrInfos2[0].name, "row_size_0");
TS_ASSERT_EQUALS( savedNexus.getAttr<int>(attrInfos2[0]), 1 );
TS_ASSERT_EQUALS( attrInfos2[1].name, "row_size_1");
TS_ASSERT_EQUALS( savedNexus.getAttr<int>(attrInfos2[1]), 2 );
TS_ASSERT_EQUALS( attrInfos2[4].name, "interpret_as");
TS_ASSERT_EQUALS( savedNexus.getStrAttr(attrInfos2[4]), "" );
TS_ASSERT_EQUALS( attrInfos2[5].name, "name");
TS_ASSERT_EQUALS( savedNexus.getStrAttr(attrInfos2[5]), "DoubleVectorColumn" );
}
catch(std::exception& e)
{
TS_FAIL( e.what() );
}
Poco::File(outputFileName).remove();
}
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
void testSaveTableColumn()
{
std::string outputFileName = "SaveNexusProcessedTest_testSaveTable.nxs";
// Create a table which we will save
auto table = boost::dynamic_pointer_cast<Mantid::DataObjects::TableWorkspace>(WorkspaceFactory::Instance().createTable());
table->setRowCount(3);
table->addColumn("int", "IntColumn");
{
auto& data = table->getColVector<int>("IntColumn");
data[0] = 5;
data[1] = 2;
data[2] = 3;
}
table->addColumn("double", "DoubleColumn");
{
auto& data = table->getColVector<double>("DoubleColumn");
data[0] = 0.5;
data[1] = 0.2;
data[2] = 0.3;
}
table->addColumn("float", "FloatColumn");
{
auto& data = table->getColVector<float>("FloatColumn");
data[0] = 10.5f;
data[1] = 10.2f;
data[2] = 10.3f;
}
table->addColumn("uint", "UInt32Column");
{
auto& data = table->getColVector<uint32_t>("UInt32Column");
data[0] = 15;
data[1] = 12;
data[2] = 13;
}
table->addColumn("long64", "Int64Column");
{
auto& data = table->getColVector<int64_t>("Int64Column");
data[0] = 25;
data[1] = 22;
data[2] = 23;
}
table->addColumn("size_t", "SizeColumn");
auto& data = table->getColVector<size_t>("SizeColumn");
data[0] = 35;
data[1] = 32;
data[2] = 33;
}
table->addColumn("bool", "BoolColumn");
{
auto& data = table->getColVector<Boolean>("BoolColumn");
data[0] = true;
data[1] = false;
data[2] = true;
}
table->addColumn("V3D", "V3DColumn");
{
auto& data = table->getColVector<V3D>("V3DColumn");
data[0] = V3D(1,2,3);
data[1] = V3D(4,5,6);
data[2] = V3D(7,8,9);
}
table->addColumn("str", "StringColumn");
{
auto& data = table->getColVector<std::string>("StringColumn");
data[0] = "First row";
data[1] = "2";
data[2] = "";
}
SaveNexusProcessed alg;
alg.initialize();
alg.setProperty("InputWorkspace", table);
alg.setPropertyValue("Filename", outputFileName);
TS_ASSERT_THROWS_NOTHING( alg.execute() );
TS_ASSERT( alg.isExecuted() );
if ( ! alg.isExecuted() )
return; // Nothing to check
// Get full output file path
outputFileName = alg.getPropertyValue("Filename");
NeXus::File savedNexus(outputFileName);
savedNexus.openGroup("mantid_workspace_1", "NXentry");
savedNexus.openGroup("table_workspace", "NXdata");
{
savedNexus.openData("column_1");
doTestColumnInfo( savedNexus, NX_INT32, "", "IntColumn" );
int32_t expectedData[] = { 5, 2, 3 };
doTestColumnData( "IntColumn", savedNexus, expectedData );
}
{
savedNexus.openData("column_2");
doTestColumnInfo( savedNexus, NX_FLOAT64, "", "DoubleColumn" );
double expectedData[] = { 0.5, 0.2, 0.3 };
doTestColumnData( "DoubleColumn", savedNexus, expectedData );
}
{
savedNexus.openData("column_3");
doTestColumnInfo( savedNexus, NX_FLOAT32, "", "FloatColumn" );
float expectedData[] = { 10.5f, 10.2f, 10.3f };
doTestColumnData( "FloatColumn", savedNexus, expectedData );
{
savedNexus.openData("column_4");
doTestColumnInfo( savedNexus, NX_UINT32, "", "UInt32Column" );
uint32_t expectedData[] = { 15, 12, 13 };
doTestColumnData( "UInt32Column", savedNexus, expectedData );
}
{
savedNexus.openData("column_5");
doTestColumnInfo( savedNexus, NX_INT64, "", "Int64Column" );
int64_t expectedData[] = { 25, 22, 23 };
doTestColumnData( "Int64Column", savedNexus, expectedData );
{
savedNexus.openData("column_6");
doTestColumnInfo( savedNexus, NX_UINT64, "", "SizeColumn" );
uint64_t expectedData[] = { 35, 32, 33 };
doTestColumnData( "SizeColumn", savedNexus, expectedData );
}
{
savedNexus.openData("column_7");
doTestColumnInfo( savedNexus, NX_UINT8, "", "BoolColumn" );
unsigned char expectedData[] = { 1, 0, 1 };
doTestColumnData( "BoolColumn", savedNexus, expectedData );
}
{
savedNexus.openData("column_8");
doTestColumnInfo2( savedNexus, NX_FLOAT64, "V3D", "V3DColumn", 3 );
double expectedData[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 };
doTestColumnData( "V3DColumn",savedNexus, expectedData, 9 );
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
{
savedNexus.openData("column_9");
NeXus::Info columnInfo = savedNexus.getInfo();
TS_ASSERT_EQUALS( columnInfo.dims.size(), 2 );
TS_ASSERT_EQUALS( columnInfo.dims[0], 3 );
TS_ASSERT_EQUALS( columnInfo.dims[1], 9 );
TS_ASSERT_EQUALS( columnInfo.type, NX_CHAR );
std::vector<NeXus::AttrInfo> attrInfos = savedNexus.getAttrInfos();
TS_ASSERT_EQUALS( attrInfos.size(), 3 );
if ( attrInfos.size() == 3 )
{
TS_ASSERT_EQUALS( attrInfos[1].name, "interpret_as");
TS_ASSERT_EQUALS( savedNexus.getStrAttr(attrInfos[1]), "A string" );
TS_ASSERT_EQUALS( attrInfos[2].name, "name");
TS_ASSERT_EQUALS( savedNexus.getStrAttr(attrInfos[2]), "StringColumn" );
TS_ASSERT_EQUALS( attrInfos[0].name, "units");
TS_ASSERT_EQUALS( savedNexus.getStrAttr(attrInfos[0]), "N/A" );
}
std::vector<char> data;
savedNexus.getData(data);
TS_ASSERT_EQUALS( data.size(), 9 * 3 );
std::string first( data.begin(), data.begin() + 9 );
TS_ASSERT_EQUALS( first, "First row" );
std::string second( data.begin() + 9, data.begin() + 18 );
TS_ASSERT_EQUALS( second, "2 " );
std::string third( data.begin() + 18, data.end() );
TS_ASSERT_EQUALS( third, " " );
}
savedNexus.close();
Poco::File(outputFileName).remove();
AnalysisDataService::Instance().clear();
}
Ronald Fowler
committed
private:
void doTestColumnInfo(NeXus::File& file, int type, const std::string& interpret_as, const std::string& name )
{
NeXus::Info columnInfo = file.getInfo();
TSM_ASSERT_EQUALS( name, columnInfo.dims.size(), 1 );
TSM_ASSERT_EQUALS( name, columnInfo.dims[0], 3 );
TSM_ASSERT_EQUALS( name, columnInfo.type, type );
std::vector<NeXus::AttrInfo> attrInfos = file.getAttrInfos();
TSM_ASSERT_EQUALS( name, attrInfos.size(), 3 );
if ( attrInfos.size() == 3 )
{
TSM_ASSERT_EQUALS( name, attrInfos[1].name, "interpret_as");
TSM_ASSERT_EQUALS( name, file.getStrAttr(attrInfos[1]), interpret_as );
TSM_ASSERT_EQUALS( name, attrInfos[2].name, "name");
TSM_ASSERT_EQUALS( name, file.getStrAttr(attrInfos[2]), name );
TSM_ASSERT_EQUALS( name, attrInfos[0].name, "units");
TSM_ASSERT_EQUALS( name, file.getStrAttr(attrInfos[0]), "Not known" );
void doTestColumnInfo2(NeXus::File& file, int type, const std::string& interpret_as, const std::string& name, int dim1 )
{
NeXus::Info columnInfo = file.getInfo();
TSM_ASSERT_EQUALS( name, columnInfo.dims.size(), 2 );
TSM_ASSERT_EQUALS( name, columnInfo.dims[0], 3 );
TSM_ASSERT_EQUALS( name, columnInfo.dims[1], dim1 );
TSM_ASSERT_EQUALS( name, columnInfo.type, type );
std::vector<NeXus::AttrInfo> attrInfos = file.getAttrInfos();
TSM_ASSERT_EQUALS( name, attrInfos.size(), 6 );
if ( attrInfos.size() == 6 )
{
TSM_ASSERT_EQUALS( name, attrInfos[4].name, "interpret_as");
TSM_ASSERT_EQUALS( name, file.getStrAttr(attrInfos[4]), interpret_as );
TSM_ASSERT_EQUALS( name, attrInfos[5].name, "name");
TSM_ASSERT_EQUALS( name, file.getStrAttr(attrInfos[5]), name );
TSM_ASSERT_EQUALS( name, attrInfos[3].name, "units");
TSM_ASSERT_EQUALS( name, file.getStrAttr(attrInfos[3]), "Not known" );
}
}
void doTestColumnData( const std::string& name, NeXus::File& file, const T expectedData[], size_t len = 3 )
{
std::vector<T> data;
file.getData(data);
TSM_ASSERT_EQUALS( name, data.size(), len );
for(size_t i = 0; i < len; ++i)
{
std::string mess = name + ", item #" + boost::lexical_cast<std::string>(i);
TSM_ASSERT_EQUALS( mess, data[i], expectedData[i] );
};
Ronald Fowler
committed
std::string outputFile;
std::string entryName;
std::string dataName;
std::string title;
Workspace2D myworkspace;
Sofia Antony
committed
Mantid::DataHandling::LoadRaw3 loader;
Ronald Fowler
committed
std::string inputFile;
std::string outputSpace;
Ronald Fowler
committed
};
#endif /*SAVENEXUSPROCESSEDTEST_H_*/