Skip to content
Snippets Groups Projects
SaveNexusProcessedTest.h 13.2 KiB
Newer Older
#ifndef SAVENEXUSPROCESSEDTEST_H_
#define SAVENEXUSPROCESSEDTEST_H_

Nick Draper's avatar
Nick Draper committed

//TODO: Remove this before checking in the test
//#define _WIN64



#include <fstream>
#include <cxxtest/TestSuite.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 "MantidDataHandling/LoadRaw.h"
#include "MantidAPI/FrameworkManager.h"
#include "MantidAPI/WorkspaceFactory.h"
#include "MantidDataObjects/Workspace2D.h"
#include "MantidDataHandling/LoadEventPreNeXus.h"
#include "MantidAPI/AnalysisDataService.h"
#include "MantidNexus/SaveNexusProcessed.h"
#include "MantidNexus/LoadMuonNexus.h"
#include "MantidNexus/LoadNeXus.h"
#include "MantidNexus/LoadSNSEventNexus.h"
#include "MantidKernel/UnitFactory.h"
#include "MantidDataHandling/LoadRaw3.h"
#include "MantidTestHelpers/WorkspaceCreationHelper.h"
Campbell, Stuart's avatar
Campbell, Stuart committed
#include <Poco/File.h>
#include <Poco/Path.h>

using namespace Mantid::API;
using namespace Mantid::Kernel;
using namespace Mantid::NeXus;
using namespace Mantid::DataObjects;

class SaveNexusProcessedTest : public CxxTest::TestSuite
{
public:

  SaveNexusProcessedTest()
  {
    // 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
    Poco::File file("KEEP_NXS_FILES");
    clearfiles = !file.exists();
    Workspace2D_sptr localWorkspace2D = boost::dynamic_pointer_cast<Workspace2D>
                 (WorkspaceFactory::Instance().create("Workspace2D",1,10,10));
    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().add("testSpace", localWorkspace2D);
}


  void testInit()
  {
    TS_ASSERT_THROWS_NOTHING(algToBeTested.initialize());
    TS_ASSERT( algToBeTested.isInitialized() );
  }


  void testExec()
  {

    if ( !algToBeTested.isInitialized() ) algToBeTested.initialize();

    // Should fail because mandatory parameter has not been set
    TS_ASSERT_THROWS(algToBeTested.execute(),std::runtime_error);


    // Now set it...
    // specify name of file to save workspace to
    algToBeTested.setPropertyValue("InputWorkspace", "testSpace");
    outputFile = "testOfSaveNexusProcessed.nxs";
    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);
    algToBeTested.setPropertyValue("Title", title);
Gigg, Martyn Anthony's avatar
Gigg, Martyn Anthony committed
    if( Poco::File(outputFile).exists() ) Poco::File(outputFile).remove();
    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));
    // changed so that 1D workspaces are no longer written.
    TS_ASSERT_THROWS_NOTHING(algToBeTested.execute());
    TS_ASSERT( algToBeTested.isExecuted() );

Gigg, Martyn Anthony's avatar
Gigg, Martyn Anthony committed
    if(clearfiles) Poco::File(outputFile).remove();
Nick Draper's avatar
Nick Draper committed
//This test does not compile on Windows64 as is does not support HDF4 files
#ifndef _WIN64
    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() );
    //
    // get workspace
    //
    Workspace_sptr output;
    TS_ASSERT_THROWS_NOTHING(output = AnalysisDataService::Instance().retrieve(outputSpace));
    Workspace2D_sptr output2D = boost::dynamic_pointer_cast<Workspace2D>(output);
    // this would make all X's separate
    // output2D->dataX(22)[3]=0.55;
    //
    if ( !algToBeTested.isInitialized() ) algToBeTested.initialize();

    algToBeTested.setPropertyValue("InputWorkspace", outputSpace);
    // specify name of file to save workspace to
    outputFile = "testOfSaveNexusProcessed2.nxs";
Gigg, Martyn Anthony's avatar
Gigg, Martyn Anthony committed
    if( Poco::File(outputFile).exists() ) Poco::File(outputFile).remove();
    //entryName = "entry4";
    dataName = "spectra";
    title = "A save of a 2D workspace from Muon file";
    algToBeTested.setPropertyValue("Filename", outputFile);
    outputFile = algToBeTested.getPropertyValue("Filename");
    //algToBeTested.setPropertyValue("EntryName", entryName);
    algToBeTested.setPropertyValue("Title", title);
    algToBeTested.setPropertyValue("Append", "0");

    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));

    TS_ASSERT_THROWS_NOTHING(algToBeTested.execute());
    TS_ASSERT( algToBeTested.isExecuted() );

    // try writing data again
    TS_ASSERT_THROWS_NOTHING(algToBeTested.execute());
    TS_ASSERT( algToBeTested.isExecuted() );
Gigg, Martyn Anthony's avatar
Gigg, Martyn Anthony committed
    if(clearfiles) Poco::File(outputFile).remove();
    TS_ASSERT_THROWS_NOTHING(AnalysisDataService::Instance().remove(outputSpace));

Nick Draper's avatar
Nick Draper committed
#endif /*_WIN64*/
    std::string inputFile = "HET15869.raw";
    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() );

    //
    // 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
    outputFile = "testSaveFromLoadraw.nxs";
Gigg, Martyn Anthony's avatar
Gigg, Martyn Anthony committed
    if( Poco::File(outputFile).exists() ) Poco::File(outputFile).remove();
    //entryName = "entry4";
    dataName = "spectra";
    title = "A save of a workspace from Loadraw file";
    algToBeTested.setPropertyValue("Filename", outputFile);
    //algToBeTested.setPropertyValue("EntryName", entryName);
    algToBeTested.setPropertyValue("Title", title);
    algToBeTested.setPropertyValue("Append", "0");
    outputFile = algToBeTested.getPropertyValue("Filename");
    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));

    TS_ASSERT_THROWS_NOTHING(algToBeTested.execute());
    TS_ASSERT( algToBeTested.isExecuted() );

    if(clearfiles) remove(outputFile.c_str());
    TS_ASSERT_THROWS_NOTHING(AnalysisDataService::Instance().remove(outputSpace));

}

void testExecOnMuonXml()
  {
Nick Draper's avatar
Nick Draper committed
  
//This test does not compile on Windows64 as is does not support HDF4 files
#ifndef _WIN64
Nick Draper's avatar
Nick Draper committed
	//  std::string s;
   //std::getline(std::cin,s);
    std::string outputSpace,inputFile;
    nxLoad.initialize();
    // Now set required filename and output workspace name
    inputFile = "emu00006473.nxs";
    nxLoad.setPropertyValue("Filename", inputFile);
    inputFile = nxLoad.getPropertyValue("Filename"); //Get the absolute path
    outputSpace="outer";
    nxLoad.setPropertyValue("OutputWorkspace", outputSpace);
    //
    // Test execute to read file and populate workspace
    //
    TS_ASSERT_THROWS_NOTHING(nxLoad.execute());
    TS_ASSERT( nxLoad.isExecuted() );
    //
    // 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
    outputFile = "./testOfSaveNexusProcessed2.xml";
Gigg, Martyn Anthony's avatar
Gigg, Martyn Anthony committed
    if( Poco::File(outputFile).exists() ) Poco::File(outputFile).remove();
    //entryName = "entry4";
    dataName = "spectra";
    title = "A save of a 2D workspace from Muon file";
    algToBeTested.setPropertyValue("Filename", outputFile);
    //algToBeTested.setPropertyValue("EntryName", entryName);
    algToBeTested.setPropertyValue("Title", title);
    outputFile = algToBeTested.getPropertyValue("Filename");
    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));

    TS_ASSERT_THROWS_NOTHING(algToBeTested.execute());
    TS_ASSERT( algToBeTested.isExecuted() );

    TS_ASSERT_THROWS_NOTHING(algToBeTested.execute());
    TS_ASSERT( algToBeTested.isExecuted() );
    if(clearfiles)
    {
      if( Poco::File(outputFile).exists() ) Poco::File(outputFile).remove();
    }
    TS_ASSERT_THROWS_NOTHING(AnalysisDataService::Instance().remove(outputSpace));

Nick Draper's avatar
Nick Draper committed
#endif /*_WIN64*/
Janik Zikovsky's avatar
Janik Zikovsky committed
void do_testExec_EventWorkspaces(EventType type, bool makeDifferentTypes=false)
{
  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);
  groups[2].push_back(31);
  groups[3].push_back(40);
  groups[4].push_back(50);

  EventWorkspace_sptr WS = WorkspaceCreationHelper::CreateGroupedEventWorkspace(groups, 100, 1.0);
  WS->getEventList(3).clear();
  // Switch the event type
Janik Zikovsky's avatar
Janik Zikovsky committed
  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++)
      WS->getEventList(wi).switchTo(type);
  }

  SaveNexusProcessed alg;
  alg.initialize();

  // Now set it...
  alg.setProperty("InputWorkspace", boost::dynamic_pointer_cast<MatrixWorkspace>(WS));

  // specify name of file to save workspace to
  std::ostringstream mess;
  mess << "SaveNexusProcessed_ExecEvent_" << static_cast<int>(type) << ".nxs";
  outputFile = mess.str();
  dataName = "spectra";
  title = "A simple workspace saved in Processed Nexus format";

  alg.setPropertyValue("Filename", outputFile);
  outputFile = alg.getPropertyValue("Filename");
  alg.setPropertyValue("Title", title);
  // Clear the existing file, if any
  if( Poco::File(outputFile).exists() ) Poco::File(outputFile).remove();

  alg.execute();
  TS_ASSERT( alg.isExecuted() );

  TS_ASSERT( Poco::File(outputFile).exists() );

  if(clearfiles) Poco::File(outputFile).remove();

}


void testExec_EventWorkspace_TofEvent()
{
  do_testExec_EventWorkspaces(TOF);
}

void testExec_EventWorkspace_WeightedEvent()
{
  do_testExec_EventWorkspaces(WEIGHTED);
}

void testExec_EventWorkspace_WeightedEventNoTime()
{
  do_testExec_EventWorkspaces(WEIGHTED_NOTIME);
}

Janik Zikovsky's avatar
Janik Zikovsky committed
void testExec_EventWorkspace_DifferentTypes()
{
  do_testExec_EventWorkspaces(WEIGHTED_NOTIME, true);
}

{

  //----- Now we re-load with precounting and compare memory use ----
  LoadSNSEventNexus ld2;
  std::string outws_name = "SaveNexusProcessed_Loaded";
  ld2.initialize();
  ld2.setPropertyValue("Filename","CNCS_7860_event.nxs");
  ld2.setPropertyValue("OutputWorkspace",outws_name);
  ld2.setPropertyValue("Precount", "1");
  ld2.execute();
  TS_ASSERT( ld2.isExecuted() );

  SaveNexusProcessed alg;
  alg.initialize();
  alg.setPropertyValue("InputWorkspace", outws_name);
  outputFile = "SaveNexusProcessed_Loaded.nxs";
  dataName = "spectra";
  title = "A simple workspace saved in Processed Nexus format";
  alg.setPropertyValue("Filename", outputFile);
  outputFile = alg.getPropertyValue("Filename");
  alg.setPropertyValue("Title", title);

  // Clear the existing file, if any
  if( Poco::File(outputFile).exists() ) Poco::File(outputFile).remove();
  alg.execute();
  TS_ASSERT( alg.isExecuted() );

  TS_ASSERT( Poco::File(outputFile).exists() );
}


private:
  SaveNexusProcessed algToBeTested;
  std::string outputFile;
  std::string entryName;
  std::string dataName;
  std::string title;
  Workspace2D myworkspace;

  std::string inputFile;
  std::string outputSpace;