Newer
Older
#ifndef EXTRACTSINGLESPECTRUMTEST_H_
#define EXTRACTSINGLESPECTRUMTEST_H_
Gigg, Martyn Anthony
committed
#include "CropWorkspaceTest.h" // Use the test label functionality as it should do the same thing
#include "MantidAlgorithms/ExtractSingleSpectrum.h"
Gigg, Martyn Anthony
committed
#include "MantidTestHelpers/WorkspaceCreationHelper.h"
Gigg, Martyn Anthony
committed
using Mantid::detid_t;
class ExtractSingleSpectrumTest : public CxxTest::TestSuite {
public:
Gigg, Martyn Anthony
committed
IAlgorithm *nameTester = createExtractSingleSpectrum();
TS_ASSERT_EQUALS(nameTester->name(), "ExtractSingleSpectrum");
}
Gigg, Martyn Anthony
committed
IAlgorithm *versionTester = createExtractSingleSpectrum();
TS_ASSERT_EQUALS(versionTester->version(), 1);
}
Gigg, Martyn Anthony
committed
IAlgorithm *initTester = createExtractSingleSpectrum();
TS_ASSERT_THROWS_NOTHING(initTester->initialize());
TS_ASSERT(initTester->isInitialized());
TS_ASSERT_EQUALS(initTester->getProperties().size(), 3);
}
using namespace Mantid::API;
Gigg, Martyn Anthony
committed
const int nbins(5);
MatrixWorkspace_sptr inputWS =
WorkspaceCreationHelper::create2DWorkspaceWithFullInstrument(5, nbins);
Gigg, Martyn Anthony
committed
const int wsIndex = 2;
for (int i = 0; i < nbins + 1; ++i) {
Gigg, Martyn Anthony
committed
inputWS->dataX(wsIndex)[i] = i;
if (i < nbins) {
inputWS->dataY(wsIndex)[i] = 20 - i;
Gigg, Martyn Anthony
committed
inputWS->dataE(wsIndex)[i] = 7;
}
}
Gigg, Martyn Anthony
committed
MatrixWorkspace_sptr outputWS = runAlgorithm(inputWS, wsIndex);
TS_ASSERT(outputWS);
TS_ASSERT_EQUALS(outputWS->blocksize(), 5);
TS_ASSERT_EQUALS(outputWS->readX(0).size(), nbins + 1);
TS_ASSERT_EQUALS(outputWS->getAxis(1)->spectraNo(0), wsIndex + 1);
for (int j = 0; j < nbins + 1; ++j) {
TS_ASSERT_EQUALS(outputWS->readX(0)[j], j);
if (j < nbins) {
TS_ASSERT_EQUALS(outputWS->readY(0)[j], 20 - j);
TS_ASSERT_EQUALS(outputWS->readE(0)[j], 7);
Gigg, Martyn Anthony
committed
}
}
Gigg, Martyn Anthony
committed
do_Spectrum_Tests(outputWS, 3, 3);
}
Gigg, Martyn Anthony
committed
void test_Input_With_TextAxis() {
Gigg, Martyn Anthony
committed
Algorithm *extractorWithText = new ExtractSingleSpectrum;
extractorWithText->initialize();
extractorWithText->setPropertyValue("WorkspaceIndex", "1");
CropWorkspaceTest::doTestWithTextAxis(extractorWithText); // Takes ownership
Gigg, Martyn Anthony
committed
}
void test_Input_With_Event_Workspace() {
Gigg, Martyn Anthony
committed
// Create and input event workspace
const int eventsPerPixel(25);
const int numPixels(10);
EventWorkspace_sptr eventWS = WorkspaceCreationHelper::CreateEventWorkspace(
numPixels, 50, eventsPerPixel, 0.0, 1.0, 1 /*EventPattern=1*/);
Gigg, Martyn Anthony
committed
TS_ASSERT(eventWS);
const int wsIndex(4);
MatrixWorkspace_sptr output = runAlgorithm(eventWS, wsIndex);
EventWorkspace_sptr outputWS =
boost::dynamic_pointer_cast<EventWorkspace>(output);
TSM_ASSERT("Output should be an event workspace", outputWS);
Gigg, Martyn Anthony
committed
const size_t numEvents = outputWS->getNumberEvents();
TS_ASSERT_EQUALS(numEvents, eventsPerPixel);
do_Spectrum_Tests(outputWS, 4, 4);
TS_ASSERT_EQUALS(eventWS->blocksize(), 50);
TS_ASSERT_DELTA(outputWS->getEventList(0).getTofMin(), 4.5, 1e-08);
TS_ASSERT_DELTA(outputWS->getEventList(0).getTofMax(), 28.5, 1e-08);
}
private:
ExtractSingleSpectrum *createExtractSingleSpectrum() {
Gigg, Martyn Anthony
committed
return new ExtractSingleSpectrum();
}
MatrixWorkspace_sptr runAlgorithm(MatrixWorkspace_sptr inputWS,
const int index) {
Gigg, Martyn Anthony
committed
Algorithm *extractor = createExtractSingleSpectrum();
extractor->initialize();
extractor->setChild(true); // Don't add the output to the ADS, then we don't
// have to clear it
TS_ASSERT_THROWS_NOTHING(extractor->setProperty("InputWorkspace", inputWS));
TS_ASSERT_THROWS_NOTHING(
extractor->setPropertyValue("OutputWorkspace", "child_algorithm"));
TS_ASSERT_THROWS_NOTHING(extractor->setProperty("WorkspaceIndex", index));
Gigg, Martyn Anthony
committed
TS_ASSERT_THROWS_NOTHING(extractor->execute());
TS_ASSERT(extractor->isExecuted());
Gigg, Martyn Anthony
committed
TS_FAIL("Error running algorithm");
}
return extractor->getProperty("OutputWorkspace");
}
void do_Spectrum_Tests(MatrixWorkspace_sptr outputWS, const specid_t specID,
const detid_t detID) {
Gigg, Martyn Anthony
committed
TS_ASSERT_EQUALS(outputWS->getNumberHistograms(), 1);
Gigg, Martyn Anthony
committed
const Mantid::API::ISpectrum *spectrum(NULL);
TS_ASSERT_THROWS_NOTHING(spectrum = outputWS->getSpectrum(0));
Gigg, Martyn Anthony
committed
TS_ASSERT_EQUALS(spectrum->getSpectrumNo(), specID);
Gigg, Martyn Anthony
committed
std::set<detid_t> detids = spectrum->getDetectorIDs();
TS_ASSERT_EQUALS(detids.size(), 1);
const detid_t id = *(detids.begin());
Gigg, Martyn Anthony
committed
TS_ASSERT_EQUALS(id, detID);
Gigg, Martyn Anthony
committed
TS_FAIL("No spectra/detectors associated with extracted histogram.");
}
}
};
#endif /*EXTRACTSINGLESPECTRUMTEST_H_*/