Newer
Older
#ifndef SOFQWCUTTEST_H_
#define SOFQWCUTTEST_H_
#include <cxxtest/TestSuite.h>
#include "MantidAlgorithms/SofQW.h"
#include "MantidAlgorithms/SofQWPolygon.h"
#include "MantidAlgorithms/SofQWNormalisedPolygon.h"
#include "MantidAPI/AnalysisDataService.h"
#include "MantidAPI/Axis.h"
#include "MantidAPI/MatrixWorkspace.h"
#include "MantidAPI/WorkspaceHistory.h"
#include "MantidAPI/WorkspaceGroup.h"
#include "MantidKernel/Unit.h"
#include "MantidDataHandling/LoadNexusProcessed.h"
#include "MantidDataHandling/CreateSimulationWorkspace.h"
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <boost/make_shared.hpp>
using namespace Mantid::API;
class SofQWCutTest : public CxxTest::TestSuite {
public:
template <typename SQWType> WorkspaceGroup_sptr runSQW() {
Mantid::DataHandling::LoadNexusProcessed loader;
loader.initialize();
loader.setChild(true);
loader.setProperty("Filename", "MAR21335_Ei60meV.nxs");
loader.setPropertyValue("OutputWorkspace", "__unused");
loader.execute();
Workspace_sptr loadedWS = loader.getProperty("OutputWorkspace");
auto inWS = boost::dynamic_pointer_cast<MatrixWorkspace>(loadedWS);
// First make a cut along |Q|
SQWType sqw_q;
sqw_q.initialize();
// Cannot be marked as child or history is not recorded
TS_ASSERT_THROWS_NOTHING(sqw_q.setProperty("InputWorkspace", inWS));
std::ostringstream wsname_q;
wsname_q << "_tmp_q_" << loadedWS;
TS_ASSERT_THROWS_NOTHING(
sqw_q.setPropertyValue("OutputWorkspace", wsname_q.str()));
TS_ASSERT_THROWS_NOTHING(
sqw_q.setPropertyValue("QAxisBinning", "0,0.0125,10"));
TS_ASSERT_THROWS_NOTHING(sqw_q.setPropertyValue("EMode", "Direct"));
TS_ASSERT_THROWS_NOTHING(
sqw_q.setPropertyValue("EAxisBinning", "-1.5,3,1.5"));
TS_ASSERT_THROWS_NOTHING(sqw_q.execute());
TS_ASSERT(sqw_q.isExecuted());
// Now make a cut along E
SQWType sqw_e;
sqw_e.initialize();
// Cannot be marked as child or history is not recorded
TS_ASSERT_THROWS_NOTHING(sqw_e.setProperty("InputWorkspace", inWS));
std::ostringstream wsname_e;
wsname_e << "_tmp_e_" << loadedWS;
TS_ASSERT_THROWS_NOTHING(
sqw_e.setPropertyValue("OutputWorkspace", wsname_e.str()));
TS_ASSERT_THROWS_NOTHING(sqw_e.setPropertyValue("QAxisBinning", "5,5,10"));
TS_ASSERT_THROWS_NOTHING(sqw_e.setPropertyValue("EMode", "Direct"));
TS_ASSERT_THROWS_NOTHING(
sqw_e.setPropertyValue("EAxisBinning", "-5,0.5,55"));
TS_ASSERT_THROWS_NOTHING(sqw_e.execute());
TS_ASSERT(sqw_e.isExecuted());
auto &dataStore = AnalysisDataService::Instance();
auto ws_q = dataStore.retrieveWS<MatrixWorkspace>(wsname_q.str());
auto ws_e = dataStore.retrieveWS<MatrixWorkspace>(wsname_e.str());
WorkspaceGroup_sptr result = boost::make_shared<WorkspaceGroup>();
result->addWorkspace(ws_q);
result->addWorkspace(ws_e);
dataStore.remove(wsname_q.str());
dataStore.remove(wsname_e.str());
return result;
}
void test_sofqw1() {
auto result = runSQW<Mantid::Algorithms::SofQW>();
const double delta(1e-08);
auto ws_q =
boost::dynamic_pointer_cast<MatrixWorkspace>(result->getItem(0));
TS_ASSERT_EQUALS(ws_q->getAxis(0)->length(), 2);
TS_ASSERT_EQUALS(ws_q->getAxis(0)->unit()->unitID(), "DeltaE");
TS_ASSERT_EQUALS((*(ws_q->getAxis(0)))(0), -1.5);
TS_ASSERT_EQUALS((*(ws_q->getAxis(0)))(1), 1.5);
TS_ASSERT_EQUALS(ws_q->getAxis(1)->length(), 801);
TS_ASSERT_EQUALS(ws_q->getAxis(1)->unit()->unitID(), "MomentumTransfer");
TS_ASSERT_EQUALS((*(ws_q->getAxis(1)))(0), 0.0);
TS_ASSERT_DELTA((*(ws_q->getAxis(1)))(400), 5.0, delta);
TS_ASSERT_EQUALS((*(ws_q->getAxis(1)))(800), 10.);
TS_ASSERT_DELTA(ws_q->readY(44)[0], 957.651473192, delta);
TS_ASSERT_DELTA(ws_q->readE(44)[0], 11.170620862, delta);
TS_ASSERT_DELTA(ws_q->readY(231)[0], 398.376497999, delta);
TS_ASSERT_DELTA(ws_q->readE(231)[0], 62.100406977, delta);
TS_ASSERT_DELTA(ws_q->readY(377)[0], 232.378738932, delta);
TS_ASSERT_DELTA(ws_q->readE(377)[0], 14.249051816, delta);
TS_ASSERT_DELTA(ws_q->readY(536)[0], 1832.305224868, delta);
TS_ASSERT_DELTA(ws_q->readE(536)[0], 30.518095107, delta);
TS_ASSERT_DELTA(ws_q->readY(575)[0], 453.761721652, delta);
TS_ASSERT_DELTA(ws_q->readE(575)[0], 13.114162862, delta);
auto ws_e =
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
boost::dynamic_pointer_cast<MatrixWorkspace>(result->getItem(1));
TS_ASSERT_EQUALS(ws_e->getAxis(0)->length(), 121);
TS_ASSERT_EQUALS(ws_e->getAxis(0)->unit()->unitID(), "DeltaE");
TS_ASSERT_EQUALS((*(ws_e->getAxis(0)))(0), -5.);
TS_ASSERT_DELTA((*(ws_e->getAxis(0)))(60), 25.0, delta);
TS_ASSERT_EQUALS((*(ws_e->getAxis(0)))(120), 55.);
TS_ASSERT_EQUALS(ws_e->getAxis(1)->length(), 2);
TS_ASSERT_EQUALS(ws_e->getAxis(1)->unit()->unitID(), "MomentumTransfer");
TS_ASSERT_EQUALS((*(ws_e->getAxis(1)))(0), 5.);
TS_ASSERT_EQUALS((*(ws_e->getAxis(1)))(1), 10.);
TS_ASSERT_DELTA(ws_e->readY(0)[29], 9.254559817, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[29], 0.030174342, delta);
TS_ASSERT_DELTA(ws_e->readY(0)[87], 13.447772682, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[87], 0.051154627, delta);
TS_ASSERT_DELTA(ws_e->readY(0)[88], 10.455499052, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[88], 0.044293372, delta);
TS_ASSERT_DELTA(ws_e->readY(0)[93], 3.587987494, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[93], 0.026975541, delta);
TS_ASSERT_DELTA(ws_e->readY(0)[113], 1.038679349, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[113], 0.044564335, delta);
}
void test_sofqw2() {
auto result = runSQW<Mantid::Algorithms::SofQWPolygon>();
const double delta(1e-08);
auto ws_q =
boost::dynamic_pointer_cast<MatrixWorkspace>(result->getItem(0));
TS_ASSERT_EQUALS(ws_q->getAxis(0)->length(), 2);
TS_ASSERT_EQUALS(ws_q->getAxis(0)->unit()->unitID(), "DeltaE");
TS_ASSERT_EQUALS((*(ws_q->getAxis(0)))(0), -1.5);
TS_ASSERT_EQUALS((*(ws_q->getAxis(0)))(1), 1.5);
TS_ASSERT_EQUALS(ws_q->getAxis(1)->length(), 801);
TS_ASSERT_EQUALS(ws_q->getAxis(1)->unit()->unitID(), "MomentumTransfer");
TS_ASSERT_EQUALS((*(ws_q->getAxis(1)))(0), 0.0);
TS_ASSERT_DELTA((*(ws_q->getAxis(1)))(400), 5.0, delta);
TS_ASSERT_EQUALS((*(ws_q->getAxis(1)))(800), 10.);
TS_ASSERT_DELTA(ws_q->readY(46)[0], 0.577055734, delta);
TS_ASSERT_DELTA(ws_q->readE(46)[0], 0.037384333, delta);
TS_ASSERT_DELTA(ws_q->readY(461)[0], 0.642083585, delta);
TS_ASSERT_DELTA(ws_q->readE(461)[0], 0.050139186, delta);
TS_ASSERT_DELTA(ws_q->readY(703)[0], 8.619229199, delta);
TS_ASSERT_DELTA(ws_q->readE(703)[0], 0.188331444, delta);
TS_ASSERT_DELTA(ws_q->readY(727)[0], 1.212655693, delta);
TS_ASSERT_DELTA(ws_q->readE(727)[0], 0.071437133, delta);
TS_ASSERT_DELTA(ws_q->readY(787)[0], 12.280788436, delta);
TS_ASSERT_DELTA(ws_q->readE(787)[0], 0.338125386, delta);
auto ws_e =
boost::dynamic_pointer_cast<MatrixWorkspace>(result->getItem(1));
TS_ASSERT_EQUALS(ws_e->getAxis(0)->length(), 121);
TS_ASSERT_EQUALS(ws_e->getAxis(0)->unit()->unitID(), "DeltaE");
TS_ASSERT_EQUALS((*(ws_e->getAxis(0)))(0), -5.);
TS_ASSERT_DELTA((*(ws_e->getAxis(0)))(60), 25.0, delta);
TS_ASSERT_EQUALS((*(ws_e->getAxis(0)))(120), 55.);
TS_ASSERT_EQUALS(ws_e->getAxis(1)->length(), 2);
TS_ASSERT_EQUALS(ws_e->getAxis(1)->unit()->unitID(), "MomentumTransfer");
TS_ASSERT_EQUALS((*(ws_e->getAxis(1)))(0), 5.);
TS_ASSERT_EQUALS((*(ws_e->getAxis(1)))(1), 10.);
TS_ASSERT_DELTA(ws_e->readY(0)[5], 1120.875680688, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[5], 5.269885974, delta);
TS_ASSERT_DELTA(ws_e->readY(0)[16], 171.212246850, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[16], 2.134947683, delta);
TS_ASSERT_DELTA(ws_e->readY(0)[28], 40.854749824, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[28], 1.055504462, delta);
TS_ASSERT_DELTA(ws_e->readY(0)[36], 54.655069317, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[36], 1.225166860, delta);
TS_ASSERT_DELTA(ws_e->readY(0)[113], 3.724579351, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[113], 0.494593697, delta);
}
void test_sofqw3() {
auto result = runSQW<Mantid::Algorithms::SofQWNormalisedPolygon>();
const double delta(1e-08);
auto ws_q =
boost::dynamic_pointer_cast<MatrixWorkspace>(result->getItem(0));
TS_ASSERT_EQUALS(ws_q->getAxis(0)->length(), 2);
TS_ASSERT_EQUALS(ws_q->getAxis(0)->unit()->unitID(), "DeltaE");
TS_ASSERT_EQUALS((*(ws_q->getAxis(0)))(0), -1.5);
TS_ASSERT_EQUALS((*(ws_q->getAxis(0)))(1), 1.5);
TS_ASSERT_EQUALS(ws_q->getAxis(1)->length(), 801);
TS_ASSERT_EQUALS(ws_q->getAxis(1)->unit()->unitID(), "MomentumTransfer");
TS_ASSERT_EQUALS((*(ws_q->getAxis(1)))(0), 0.0);
TS_ASSERT_DELTA((*(ws_q->getAxis(1)))(400), 5.0, delta);
TS_ASSERT_EQUALS((*(ws_q->getAxis(1)))(800), 10.);
TS_ASSERT_DELTA(ws_q->readY(64)[0], 1.447154208, delta);
TS_ASSERT_DELTA(ws_q->readE(64)[0], 0.079813500, delta);
TS_ASSERT_DELTA(ws_q->readY(345)[0], 6.586783859, delta);
TS_ASSERT_DELTA(ws_q->readE(345)[0], 0.293715678, delta);
TS_ASSERT_DELTA(ws_q->readY(595)[0], 1.595635453, delta);
TS_ASSERT_DELTA(ws_q->readE(595)[0], 0.120461583, delta);
TS_ASSERT_DELTA(ws_q->readY(683)[0], 1.781082246, delta);
TS_ASSERT_DELTA(ws_q->readE(683)[0], 0.191192978, delta);
TS_ASSERT_DELTA(ws_q->readY(745)[0], 20.862377605, delta);
TS_ASSERT_DELTA(ws_q->readE(745)[0], 0.488375031, delta);
auto ws_e =
boost::dynamic_pointer_cast<MatrixWorkspace>(result->getItem(1));
TS_ASSERT_EQUALS(ws_e->getAxis(0)->length(), 121);
TS_ASSERT_EQUALS(ws_e->getAxis(0)->unit()->unitID(), "DeltaE");
TS_ASSERT_EQUALS((*(ws_e->getAxis(0)))(0), -5.);
TS_ASSERT_DELTA((*(ws_e->getAxis(0)))(60), 25.0, delta);
TS_ASSERT_EQUALS((*(ws_e->getAxis(0)))(120), 55.);
TS_ASSERT_EQUALS(ws_e->getAxis(1)->length(), 2);
TS_ASSERT_EQUALS(ws_e->getAxis(1)->unit()->unitID(), "MomentumTransfer");
TS_ASSERT_EQUALS((*(ws_e->getAxis(1)))(0), 5.);
TS_ASSERT_EQUALS((*(ws_e->getAxis(1)))(1), 10.);
TS_ASSERT_DELTA(ws_e->readY(0)[3], 3.339142136, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[3], 0.022877849, delta);
TS_ASSERT_DELTA(ws_e->readY(0)[20], 0.228241794, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[20], 0.006279856, delta);
TS_ASSERT_DELTA(ws_e->readY(0)[27], 0.263928319, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[27], 0.006856371, delta);
TS_ASSERT_DELTA(ws_e->readY(0)[78], 0.328734767, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[78], 0.009076805, delta);
TS_ASSERT_DELTA(ws_e->readY(0)[119], 0.045373095, delta);
TS_ASSERT_DELTA(ws_e->readE(0)[119], 0.005462714, delta);
void test_sofqw3_zerobinwidth() {
// This test sets up a workspace which can yield a bin with zero width
// to check the code FractionalRebinning code handles this correctly
const double delta(1e-08);
Mantid::DataHandling::CreateSimulationWorkspace create_ws;
create_ws.initialize();
create_ws.setChild(true);
create_ws.setPropertyValue("Instrument", "MARI");
create_ws.setPropertyValue("BinParams", "-5,0.5,24");
create_ws.setPropertyValue("OutputWorkspace", "__unused");
create_ws.execute();
MatrixWorkspace_sptr createdWS = create_ws.getProperty("OutputWorkspace");
auto inWS = boost::dynamic_pointer_cast<MatrixWorkspace>(createdWS);
// Sets one spectrum to zero so final value is not unity.
inWS->setCounts(300, std::vector<double>(58, 0.));
Mantid::Algorithms::SofQWNormalisedPolygon sqw;
sqw.initialize();
sqw.setChild(true);
TS_ASSERT_THROWS_NOTHING(sqw.setProperty("InputWorkspace", inWS));
TS_ASSERT_THROWS_NOTHING(
sqw.setPropertyValue("OutputWorkspace", "__unused"));
TS_ASSERT_THROWS_NOTHING(sqw.setPropertyValue("QAxisBinning", "0,10,10"));
TS_ASSERT_THROWS_NOTHING(sqw.setPropertyValue("EMode", "Direct"));
TS_ASSERT_THROWS_NOTHING(sqw.setPropertyValue("EFixed", "25"));
TS_ASSERT_THROWS_NOTHING(
sqw.setPropertyValue("EAxisBinning", "-1.5,3,1.5"));
TS_ASSERT_THROWS_NOTHING(sqw.execute());
TS_ASSERT(sqw.isExecuted());
MatrixWorkspace_sptr ws = sqw.getProperty("OutputWorkspace");
TS_ASSERT_EQUALS(ws->getAxis(0)->length(), 2);
TS_ASSERT_EQUALS(ws->getAxis(0)->unit()->unitID(), "DeltaE");
TS_ASSERT_EQUALS((*(ws->getAxis(0)))(0), -1.5);
TS_ASSERT_EQUALS((*(ws->getAxis(0)))(1), 1.5);
TS_ASSERT_EQUALS(ws->getAxis(1)->length(), 2);
TS_ASSERT_EQUALS(ws->getAxis(1)->unit()->unitID(), "MomentumTransfer");
TS_ASSERT_DELTA(ws->readY(0)[0], 0.998910675, delta);
}
};
#endif /*SOFQWCUTTEST_H_*/