Skip to content
Snippets Groups Projects
Commit 2dec4557 authored by Zhou, Wenduo's avatar Zhou, Wenduo
Browse files

Refs #11190. Completed unit tests and corrected IDF.

parent 859d160c
No related merge requests found
...@@ -519,6 +519,7 @@ void LoadSpiceXML2DDet::setupSampleLogFromSpiceTable( ...@@ -519,6 +519,7 @@ void LoadSpiceXML2DDet::setupSampleLogFromSpiceTable(
// FIXME - Shouldn't give a better value? // FIXME - Shouldn't give a better value?
Kernel::DateAndTime anytime(1000); Kernel::DateAndTime anytime(1000);
bool foundlog = false;
for (size_t ir = 0; ir < numrows; ++ir) { for (size_t ir = 0; ir < numrows; ++ir) {
int localpt = spicetablews->cell<int>(ir, 0); int localpt = spicetablews->cell<int>(ir, 0);
if (localpt != ptnumber) if (localpt != ptnumber)
...@@ -533,9 +534,16 @@ void LoadSpiceXML2DDet::setupSampleLogFromSpiceTable( ...@@ -533,9 +534,16 @@ void LoadSpiceXML2DDet::setupSampleLogFromSpiceTable(
matrixws->mutableRun().addProperty(newlogproperty); matrixws->mutableRun().addProperty(newlogproperty);
} }
// Break as the experiment pointer is found
foundlog = true;
break; break;
} }
if (!foundlog)
g_log.warning() << "Pt. " << ptnumber
<< " is not found. Log is not loaded to output workspace."
<< "\n";
return; return;
} }
......
...@@ -102,11 +102,19 @@ public: ...@@ -102,11 +102,19 @@ public:
AnalysisDataService::Instance().remove("Exp0335_S0038"); AnalysisDataService::Instance().remove("Exp0335_S0038");
} }
//----------------------------------------------------------------------------------------------
/** Test algorithm with loading HB3A
* @brief test_LoadHB3AXML2InstrumentedWS
* Testing include
* (1) 2theta = -15 degree (15 degree in SPICE): distance of 4 corners should
* be same. scattering
* angles should be paired;
* (2) 2theta = 0 degree: scattering angle of all 4 corners should be same;
* (3) 2theta = 15 degree: scattering angles should be symmetric to case 1
*/
void test_LoadHB3AXML2InstrumentedWS() { void test_LoadHB3AXML2InstrumentedWS() {
std::string idffname(
"/home/wzz/Mantid/Code/Mantid/instrument/HB3A_Definition.xml");
// Table workspace // Set up Spice table workspace for log value
ITableWorkspace_sptr datatablews = ITableWorkspace_sptr datatablews =
boost::dynamic_pointer_cast<ITableWorkspace>( boost::dynamic_pointer_cast<ITableWorkspace>(
boost::make_shared<DataObjects::TableWorkspace>()); boost::make_shared<DataObjects::TableWorkspace>());
...@@ -117,8 +125,11 @@ public: ...@@ -117,8 +125,11 @@ public:
TableRow row0 = datatablews->appendRow(); TableRow row0 = datatablews->appendRow();
row0 << 1 << 15.0; row0 << 1 << 15.0;
TableRow row1 = datatablews->appendRow(); TableRow row1 = datatablews->appendRow();
row1 << 2 << 42.709750; row1 << 2 << -15.0;
TableRow row2 = datatablews->appendRow();
row2 << 3 << 0.0;
// Test 2theta = 15 degree
LoadSpiceXML2DDet loader; LoadSpiceXML2DDet loader;
loader.initialize(); loader.initialize();
...@@ -131,8 +142,8 @@ public: ...@@ -131,8 +142,8 @@ public:
sizelist[1] = 256; sizelist[1] = 256;
loader.setProperty("DetectorGeometry", sizelist); loader.setProperty("DetectorGeometry", sizelist);
loader.setProperty("LoadInstrument", true); loader.setProperty("LoadInstrument", true);
// loader.setProperty("InstrumentFilename", idffname);
loader.setProperty("SpiceTableWorkspace", "SpiceDataTable"); loader.setProperty("SpiceTableWorkspace", "SpiceDataTable");
loader.setProperty("PtNumber", 1);
loader.execute(); loader.execute();
TS_ASSERT(loader.isExecuted()); TS_ASSERT(loader.isExecuted());
...@@ -143,23 +154,175 @@ public: ...@@ -143,23 +154,175 @@ public:
TS_ASSERT(outws); TS_ASSERT(outws);
TS_ASSERT_EQUALS(outws->getNumberHistograms(), 256 * 256); TS_ASSERT_EQUALS(outws->getNumberHistograms(), 256 * 256);
// Value
TS_ASSERT_DELTA(outws->readY(255)[0], 1.0, 0.0001);
TS_ASSERT_DELTA(outws->readY(253 * 256 + 9)[0], 1.0, 0.00001);
// Instrument // Instrument
TS_ASSERT(outws->getInstrument()); TS_ASSERT(outws->getInstrument());
// Detector distance Kernel::V3D source = outws->getInstrument()->getSource()->getPos();
Kernel::V3D sample = outws->getInstrument()->getSample()->getPos(); Kernel::V3D sample = outws->getInstrument()->getSample()->getPos();
Kernel::V3D det0pos = outws->getDetector(0)->getPos(); Kernel::V3D det0pos = outws->getDetector(0)->getPos();
Kernel::V3D det255pos = outws->getDetector(255)->getPos(); Kernel::V3D det255pos = outws->getDetector(255)->getPos();
Kernel::V3D detlast0 = outws->getDetector(256 * 255)->getPos();
Kernel::V3D detlast = outws->getDetector(256 * 256 - 1)->getPos(); Kernel::V3D detlast = outws->getDetector(256 * 256 - 1)->getPos();
Kernel::V3D detmiddle =
outws->getDetector(256 / 2 * 256 + 256 / 2)->getPos();
// center of the detector must be negative
TS_ASSERT_LESS_THAN(detmiddle.X(), 0.0);
// detector distance
double dist0 = sample.distance(det0pos); double dist0 = sample.distance(det0pos);
double dist255 = sample.distance(det255pos); double dist255 = sample.distance(det255pos);
double distlast = sample.distance(detlast); double distlast = sample.distance(detlast);
double distlast0 = sample.distance(detlast0);
double distmiddle = sample.distance(detmiddle);
TS_ASSERT_DELTA(dist0, dist255, 0.0001); TS_ASSERT_DELTA(dist0, dist255, 0.0001);
TS_ASSERT_DELTA(dist0, distlast, 0.0001); TS_ASSERT_DELTA(dist0, distlast, 0.0001);
TS_ASSERT_DELTA(dist0, distlast0, 0.0001);
TS_ASSERT_DELTA(distmiddle, 0.3518, 0.000001);
TS_ASSERT_DELTA(outws->readY(255)[0], 1.0, 0.0001); // 2theta value
TS_ASSERT_DELTA(outws->readY(253 * 256 + 9)[0], 1.0, 0.00001); Kernel::V3D sample_source = sample - source;
Kernel::V3D det0_sample = det0pos - sample;
double twotheta0 = det0_sample.angle(sample_source) * 180. / 3.14159265;
// FIXME - Verify this with Huibo!
TS_ASSERT_DELTA(twotheta0, 11.6252, 0.0001);
Kernel::V3D detTL_sample = detlast0 - sample;
double twotheta_tl = detTL_sample.angle(sample_source) * 180. / 3.14159265;
TS_ASSERT_DELTA(twotheta0, twotheta_tl, 0.00001);
Kernel::V3D det255_sample = det255pos - sample;
double twotheta255 = det255_sample.angle(sample_source) * 180. / 3.14159265;
Kernel::V3D detlast_sample = detlast - sample;
double twothetalast =
detlast_sample.angle(sample_source) * 180. / 3.14159265;
TS_ASSERT_DELTA(twotheta255, twothetalast, 0.00001);
Kernel::V3D detmid_sample = detmiddle - sample;
double twotheta_middle =
detmid_sample.angle(sample_source) * 180. / 3.1415926;
TS_ASSERT_DELTA(twotheta_middle, 15.0, 0.02);
TS_ASSERT_LESS_THAN(twotheta0, twotheta_middle);
TS_ASSERT_LESS_THAN(twotheta_middle, twothetalast);
// Case: 2theta = 0
LoadSpiceXML2DDet loader2;
loader2.initialize();
TS_ASSERT_THROWS_NOTHING(loader2.setProperty("Filename", filename));
TS_ASSERT_THROWS_NOTHING(
loader2.setProperty("OutputWorkspace", "Exp0335_S0038B"));
loader2.setProperty("DetectorGeometry", sizelist);
loader2.setProperty("LoadInstrument", true);
loader2.setProperty("SpiceTableWorkspace", "SpiceDataTable");
loader2.setProperty("PtNumber", 3);
loader2.execute();
TS_ASSERT(loader2.isExecuted());
// Get data
MatrixWorkspace_sptr outws2 = boost::dynamic_pointer_cast<MatrixWorkspace>(
AnalysisDataService::Instance().retrieve("Exp0335_S0038B"));
TS_ASSERT(outws2);
// Check instrument
Kernel::V3D source2 = outws2->getInstrument()->getSource()->getPos();
Kernel::V3D sample2 = outws2->getInstrument()->getSample()->getPos();
Kernel::V3D det0pos2 = outws2->getDetector(0)->getPos();
Kernel::V3D det255pos2 = outws2->getDetector(255)->getPos();
Kernel::V3D detlast0_2 = outws2->getDetector(256 * 255)->getPos();
Kernel::V3D detlast2 = outws2->getDetector(256 * 256 - 1)->getPos();
Kernel::V3D detmiddle2 =
outws2->getDetector(256 / 2 * 256 + 256 / 2)->getPos();
// detector distance
double dist0b = sample2.distance(det0pos2);
double dist255b = sample2.distance(det255pos2);
double distlastb = sample2.distance(detlast2);
// double distlast0b = sample2.distance(detlast0_2);
double distmiddleb = sample2.distance(detmiddle2);
TS_ASSERT_DELTA(dist0b, dist0, 0.000001);
TS_ASSERT_DELTA(distmiddleb, distmiddle, 0.00001);
TS_ASSERT_DELTA(distlastb, distlast, 0.00001);
TS_ASSERT_DELTA(dist255b, dist255, 0.00001);
// 2theta
sample_source = sample2 - source2;
detmid_sample = detmiddle2 - sample2;
twotheta_middle = detmid_sample.angle(sample_source) * 180. / 3.1415926;
// FIXME - Justify with Huibo
TS_ASSERT_DELTA(twotheta_middle, 0.00, 0.03);
det0_sample = det0pos2 - sample2;
double twotheta0_2 = det0_sample.angle(sample_source) * 180. / 3.14159265;
detTL_sample = detlast0_2 - sample2;
twotheta_tl = detTL_sample.angle(sample_source) * 180. / 3.14159265;
det255_sample = det255pos2 - sample2;
double twotheta255_2 =
det255_sample.angle(sample_source) * 180. / 3.14159265;
detlast_sample = detlast2 - sample2;
twothetalast = detlast_sample.angle(sample_source) * 180. / 3.14159265;
TS_ASSERT_DELTA(twotheta0_2, twothetalast, 0.00001);
TS_ASSERT_DELTA(twotheta0_2, twotheta_tl, 0.00001);
TS_ASSERT_DELTA(twotheta0_2, twotheta255_2, 0.00001);
// Case 3: symmetry test
LoadSpiceXML2DDet loader3;
loader3.initialize();
TS_ASSERT_THROWS_NOTHING(loader3.setProperty("Filename", filename));
TS_ASSERT_THROWS_NOTHING(
loader3.setProperty("OutputWorkspace", "Exp0335_S0038C"));
loader3.setProperty("DetectorGeometry", sizelist);
loader3.setProperty("LoadInstrument", true);
loader3.setProperty("SpiceTableWorkspace", "SpiceDataTable");
loader3.setProperty("PtNumber", 2);
loader3.execute();
TS_ASSERT(loader3.isExecuted());
// Get data
MatrixWorkspace_sptr outws3 = boost::dynamic_pointer_cast<MatrixWorkspace>(
AnalysisDataService::Instance().retrieve("Exp0335_S0038C"));
TS_ASSERT(outws3);
// Check instrument
Kernel::V3D source3 = outws3->getInstrument()->getSource()->getPos();
Kernel::V3D sample3 = outws3->getInstrument()->getSample()->getPos();
Kernel::V3D det0pos3 = outws3->getDetector(0)->getPos();
Kernel::V3D det255pos3 = outws3->getDetector(255)->getPos();
// 2theta
sample_source = sample3 - source3;
det0_sample = det0pos3 - sample3;
double twotheta0_3 = det0_sample.angle(sample_source) * 180. / 3.14159265;
TS_ASSERT_DELTA(twotheta0_3, twotheta255, 0.00001);
det255_sample = det255pos3 - sample3;
double twotheta255_3 =
det255_sample.angle(sample_source) * 180. / 3.14159265;
TS_ASSERT_DELTA(twotheta255_3, twotheta0, 0.00001);
// Clean
AnalysisDataService::Instance().remove("SpiceDataTable");
AnalysisDataService::Instance().remove("Exp0335_S0038B");
AnalysisDataService::Instance().remove("Exp0335_S0038");
} }
}; };
......
<?xml version='1.0' encoding='ASCII'?> <?xml version='1.0' encoding='ASCII'?>
<instrument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.mantidproject.org/IDF/1.0" last-modified="2015-05-14 09:49:45.211024" name="HB3A" valid-from="2015-05-14 09:49:45" valid-to="2100-01-31 23:59:59" xsi:schemaLocation="http://www.mantidproject.org/IDF/1.0 http://schema.mantidproject.org/IDF/1.0/IDFSchema.xsd"> <instrument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.mantidproject.org/IDF/1.0" last-modified="2015-05-18 10:35:21.877396" name="HB3A" valid-from="2015-05-18 10:35:21" valid-to="2100-01-31 23:59:59" xsi:schemaLocation="http://www.mantidproject.org/IDF/1.0 http://schema.mantidproject.org/IDF/1.0/IDFSchema.xsd">
<!--Created by Wenduo Zhou--> <!--Created by Wenduo Zhou-->
<!--SOURCE--> <!--SOURCE-->
<component type="moderator"> <component type="moderator">
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<component idfillbyfirst="x" idstart="1" idstepbyrow="256" type="panel"> <component idfillbyfirst="x" idstart="1" idstepbyrow="256" type="panel">
<location name="bank1"> <location name="bank1">
<parameter name="r-position"> <parameter name="r-position">
<value val="1.0"/> <value val="0.3518"/>
</parameter> </parameter>
<parameter name="t-position"> <parameter name="t-position">
<logfile eq="-1.0*value+0.0" id="2theta"/> <logfile eq="-1.0*value+0.0" id="2theta"/>
...@@ -28,13 +28,13 @@ ...@@ -28,13 +28,13 @@
</parameter> </parameter>
</location> </location>
</component> </component>
<type is="rectangular_detector" name="panel" type="pixel" xpixels="256" xstart="0.078795" xstep="-0.000618" ypixels="256" ystart="-0.078795" ystep="0.000618"/> <type is="rectangular_detector" name="panel" type="pixel" xpixels="256" xstart="0.02530078125" xstep="-0.0001984375" ypixels="256" ystart="0.02530078125" ystep="-0.0001984375"/>
<type is="detector" name="pixel"> <type is="detector" name="pixel">
<cuboid id="pixel-shape"> <cuboid id="pixel-shape">
<left-front-bottom-point x="-0.000309" y="-0.000309" z="0.0"/> <left-front-bottom-point x="-9.921875e-05" y="-9.921875e-05" z="0.0"/>
<left-front-top-point x="-0.000309" y="0.000309" z="0.0"/> <left-front-top-point x="-9.921875e-05" y="9.921875e-05" z="0.0"/>
<left-back-bottom-point x="-0.000309" y="-0.000309" z="-0.0001"/> <left-back-bottom-point x="-9.921875e-05" y="-9.921875e-05" z="-0.0001"/>
<right-front-bottom-point x="0.000309" y="-0.000309" z="0.0"/> <right-front-bottom-point x="9.921875e-05" y="-9.921875e-05" z="0.0"/>
</cuboid> </cuboid>
<algebra val="pixel-shape"/> <algebra val="pixel-shape"/>
</type> </type>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment