diff --git a/Framework/DataHandling/CMakeLists.txt b/Framework/DataHandling/CMakeLists.txt index ca5ee47b5d52480e6bb0055518f1b1251efe52de..09cac14ac80039c9b886aff58a5947b93a703066 100644 --- a/Framework/DataHandling/CMakeLists.txt +++ b/Framework/DataHandling/CMakeLists.txt @@ -459,6 +459,7 @@ set ( TEST_FILES LoadParameterFileTest.h LoadPreNexusMonitorsTest.h LoadPreNexusTest.h + LoadPSIMuonBinTest.h LoadQKKTest.h LoadRKHTest.h LoadRaw3Test.h diff --git a/Framework/DataHandling/src/LoadPSIMuonBin.cpp b/Framework/DataHandling/src/LoadPSIMuonBin.cpp index b72df32bb7a2521c18d64c098f222c4e0c610641..142846c96ac56583051e3c27c725e49b337b512a 100644 --- a/Framework/DataHandling/src/LoadPSIMuonBin.cpp +++ b/Framework/DataHandling/src/LoadPSIMuonBin.cpp @@ -40,19 +40,13 @@ const std::string LoadPSIMuonBin::category() const { int LoadPSIMuonBin::confidence(Kernel::FileDescriptor &descriptor) const { auto &stream = descriptor.data(); - // 85th character is a space & 89th character is a ~ - stream.seekg(0, std::ios::beg); - int c = stream.get(); - int confidence(0); - // Checks if postion 0 is a 1 - if (c == 49) { - stream.seekg(1, std::ios::cur); - int c = stream.get(); - // Checks if position 1 is N - if (c == 78) - confidence = 90; + Mantid::Kernel::BinaryStreamReader streamReader(stream); + std::string fileFormat; + streamReader.read(fileFormat, 2); + if (fileFormat != "1N"){ + return 0; } - return confidence; + return 90; } // version 1 however there is an issue open to create a version which @@ -377,7 +371,7 @@ void LoadPSIMuonBin::assignOutputWorkspaceParticulars( sizeof(m_header.temperatures) / sizeof(*m_header.temperatures); for (auto tempNum = 1u; tempNum < sizeOfTemps + 1; ++tempNum) { if (m_header.temperatures[tempNum - 1] != 0) { - logAlg->setProperty("LogType", "Number"); + logAlg->setProperty("LogType", "String"); logAlg->setProperty("LogName", "Actual Temperature" + std::to_string(tempNum)); logAlg->setProperty("LogText", @@ -385,7 +379,7 @@ void LoadPSIMuonBin::assignOutputWorkspaceParticulars( logAlg->executeAsChildAlg(); // Temperature deviation - logAlg->setProperty("LogType", "Number"); + logAlg->setProperty("LogType", "String"); logAlg->setProperty("LogName", "Temperature Deviation" + std::to_string(tempNum)); logAlg->setProperty( @@ -453,9 +447,9 @@ void LoadPSIMuonBin::assignOutputWorkspaceParticulars( } // total events - logAlg->setProperty("LogType", "Number"); + logAlg->setProperty("LogType", "String"); logAlg->setProperty("LogName", "Total Number of Events"); - logAlg->setProperty("LogText", m_header.totalEvents); + logAlg->setProperty("LogText", std::to_string(m_header.totalEvents)); logAlg->executeAsChildAlg(); } diff --git a/Framework/DataHandling/test/LoadPSIMuonBinTest.h b/Framework/DataHandling/test/LoadPSIMuonBinTest.h new file mode 100644 index 0000000000000000000000000000000000000000..9210a4c6d3d28a38a4681bbd2dec3f5d1cc91fee --- /dev/null +++ b/Framework/DataHandling/test/LoadPSIMuonBinTest.h @@ -0,0 +1,125 @@ +#ifndef MANTID_DATAHANDLING_LOADPSIMUONBINTEST_H_ +#define MANTID_DATAHANDLING_LOADPSIMUONBINTEST_H_ + +#include <cxxtest/TestSuite.h> + +#include "MantidDataHandling/LoadPSIMuonBin.h" +#include "MantidAPI/AnalysisDataService.h" +#include "MantidAPI/FileFinder.h" +#include "MantidAPI/MatrixWorkspace.h" +#include "MantidAPI/Sample.h" +#include "MantidDataObjects/Workspace2D.h" +#include "MantidKernel/FileDescriptor.h" + + +using namespace Mantid; +using namespace Mantid::DataHandling; +using namespace Mantid::API; +using namespace Mantid::Kernel; + +class LoadPSIMuonBinTest : public CxxTest::TestSuite { + +public: + // This pair of boilerplate methods prevent the suite being created statically + // This means the constructor isn't called when running other tests + static LoadPSIMuonBinTest *createSuite() { return new LoadPSIMuonBinTest(); } + static void destroySuite(LoadPSIMuonBinTest *suite) { delete suite; } + + void test_Init() { + LoadPSIMuonBin alg; + TS_ASSERT_THROWS_NOTHING(alg.initialize()) + TS_ASSERT(alg.isInitialized()) + + TS_ASSERT_THROWS_NOTHING(alg.setProperty( + "Filename", getTestFilePath("deltat_tdc_dolly_1529.bin"))); + TS_ASSERT_THROWS_NOTHING(alg.setProperty("OutputWorkspace", "ws")); + } + + void test_exec() { + LoadPSIMuonBin alg; + TS_ASSERT_THROWS_NOTHING(alg.initialize()); + TS_ASSERT(alg.isInitialized()); + + TS_ASSERT_THROWS_NOTHING(alg.setProperty( + "Filename", getTestFilePath("deltat_tdc_dolly_1529.bin"))); + TS_ASSERT_THROWS_NOTHING(alg.setProperty("OutputWorkspace", "ws")); + TS_ASSERT_THROWS_NOTHING(alg.execute()); + + MatrixWorkspace_sptr ws; + TS_ASSERT_THROWS_NOTHING( + ws = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>( + "ws")); + TS_ASSERT(ws); + + TS_ASSERT_EQUALS(ws->getTitle(), "BNFSO - Run:1529"); + TS_ASSERT_EQUALS(ws->getLog("Field")->value(), "0.000G"); + TS_ASSERT_EQUALS(ws->getComment(), "Ba3NbFe3Si2O14, crystal "); + TS_ASSERT_EQUALS(ws->getLog("Actual Temperature1")->value(), + "4.999610"); + TS_ASSERT_EQUALS(ws->getLog("Actual Temperature2")->value(), + "5.197690"); + TS_ASSERT_EQUALS(ws->getLog("end_time")->value(), "2011-07-04T11:56:24"); + TS_ASSERT_EQUALS(ws->getLog("start_time")->value(), "2011-07-04T10:40:23"); + TS_ASSERT_EQUALS(ws->getLog("Spectra0 label and scalar")->value(), + "Forw - 14493858"); + TS_ASSERT_EQUALS(ws->getLog("Spectra3 label and scalar")->value(), + "Rite - 38247601"); + TS_ASSERT_EQUALS(ws->getLog("Length of Run")->value(), + "10.000000MicroSeconds"); + TS_ASSERT_EQUALS(ws->getLog("Set Temperature")->value(), "5.000K"); + + TS_ASSERT_EQUALS(ws->x(0).size(), 10241); + TS_ASSERT_EQUALS(ws->y(0).size(), 10240); + TS_ASSERT_EQUALS(ws->e(0).size(), 10240); + + TS_ASSERT_EQUALS(ws->x(0)[0], 0); + TS_ASSERT_EQUALS(ws->x(0)[10240], 10); + TS_ASSERT_EQUALS(ws->y(0)[0], 24); + TS_ASSERT_EQUALS(ws->y(0)[10239], 44); + TS_ASSERT_EQUALS(ws->e(0)[0], std::sqrt(ws->y(0)[0])); + TS_ASSERT_EQUALS(ws->e(0)[10239], std::sqrt(ws->y(0)[10239])); + + TS_ASSERT_EQUALS(ws->getNumberHistograms(), 4); + + TS_ASSERT_THROWS_NOTHING(AnalysisDataService::Instance().remove("ws")); + } + + void test_fileCheck() { + LoadPSIMuonBin alg; + TS_ASSERT_THROWS_NOTHING(alg.initialize()); + TS_ASSERT(alg.isInitialized()); + + TS_ASSERT_THROWS_NOTHING(alg.setProperty( + "Filename", getTestFilePath("pid_offset_vulcan_new.dat.bin"))); + TS_ASSERT_THROWS_NOTHING(alg.setProperty("OutputWorkspace", "ws")); + TS_ASSERT_THROWS_NOTHING(alg.execute()); + + // If algorithm was successful there will be one, we are assuming it won't have been + TS_ASSERT_THROWS_ANYTHING(MatrixWorkspace_sptr ws = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>( + "ws")); + + TS_ASSERT_THROWS_NOTHING(AnalysisDataService::Instance().remove("ws")); + } + + void test_confidence(){ + LoadPSIMuonBin alg; + TS_ASSERT_THROWS_NOTHING(alg.initialize()); + TS_ASSERT(alg.isInitialized()); + + FileDescriptor descriptor(getTestFilePath("deltat_tdc_dolly_1529.bin")); + TS_ASSERT_EQUALS(alg.confidence(descriptor), 90); + + FileDescriptor descriptor1(getTestFilePath("pid_offset_vulcan_new.dat.bin")); + TS_ASSERT_EQUALS(alg.confidence(descriptor1), 0); + } + + private: + std::string getTestFilePath(const std::string &filename) { + const std::string filepath = + Mantid::API::FileFinder::Instance().getFullPath(filename); + TS_ASSERT_DIFFERS(filepath, ""); + return filepath; + } +}; + +#endif /* MANTID_DATAHANDLING_LOADPSIMUONBINTEST_H_ */ \ No newline at end of file diff --git a/Testing/Data/UnitTest/deltat_tdc_dolly_1529.bin.md5 b/Testing/Data/UnitTest/deltat_tdc_dolly_1529.bin.md5 new file mode 100644 index 0000000000000000000000000000000000000000..6446f95b4313ba99b4bce69956dbb0f9d606972f --- /dev/null +++ b/Testing/Data/UnitTest/deltat_tdc_dolly_1529.bin.md5 @@ -0,0 +1 @@ +8f167ecdc9e5e862520b19eab0a362be