Skip to content

Commit

Permalink
Refs #11190. Completed unit tests and corrected IDF.
Browse files Browse the repository at this point in the history
  • Loading branch information
wdzhou committed May 18, 2015
1 parent 859d160 commit 2dec455
Show file tree
Hide file tree
Showing 3 changed files with 186 additions and 15 deletions.
8 changes: 8 additions & 0 deletions Code/Mantid/Framework/DataHandling/src/LoadSpiceXML2DDet.cpp
Expand Up @@ -519,6 +519,7 @@ void LoadSpiceXML2DDet::setupSampleLogFromSpiceTable(
// FIXME - Shouldn't give a better value?
Kernel::DateAndTime anytime(1000);

bool foundlog = false;
for (size_t ir = 0; ir < numrows; ++ir) {
int localpt = spicetablews->cell<int>(ir, 0);
if (localpt != ptnumber)
Expand All @@ -533,9 +534,16 @@ void LoadSpiceXML2DDet::setupSampleLogFromSpiceTable(
matrixws->mutableRun().addProperty(newlogproperty);
}

// Break as the experiment pointer is found
foundlog = true;
break;
}

if (!foundlog)
g_log.warning() << "Pt. " << ptnumber
<< " is not found. Log is not loaded to output workspace."
<< "\n";

return;
}

Expand Down
179 changes: 171 additions & 8 deletions Code/Mantid/Framework/DataHandling/test/LoadSpiceXML2DDetTest.h
Expand Up @@ -102,11 +102,19 @@ class LoadSpiceXML2DDetTest : public CxxTest::TestSuite {
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() {
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 =
boost::dynamic_pointer_cast<ITableWorkspace>(
boost::make_shared<DataObjects::TableWorkspace>());
Expand All @@ -117,8 +125,11 @@ class LoadSpiceXML2DDetTest : public CxxTest::TestSuite {
TableRow row0 = datatablews->appendRow();
row0 << 1 << 15.0;
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;
loader.initialize();

Expand All @@ -131,8 +142,8 @@ class LoadSpiceXML2DDetTest : public CxxTest::TestSuite {
sizelist[1] = 256;
loader.setProperty("DetectorGeometry", sizelist);
loader.setProperty("LoadInstrument", true);
// loader.setProperty("InstrumentFilename", idffname);
loader.setProperty("SpiceTableWorkspace", "SpiceDataTable");
loader.setProperty("PtNumber", 1);

loader.execute();
TS_ASSERT(loader.isExecuted());
Expand All @@ -143,23 +154,175 @@ class LoadSpiceXML2DDetTest : public CxxTest::TestSuite {
TS_ASSERT(outws);
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
TS_ASSERT(outws->getInstrument());

// Detector distance
Kernel::V3D source = outws->getInstrument()->getSource()->getPos();
Kernel::V3D sample = outws->getInstrument()->getSample()->getPos();
Kernel::V3D det0pos = outws->getDetector(0)->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 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 dist255 = sample.distance(det255pos);
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, 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);
TS_ASSERT_DELTA(outws->readY(253 * 256 + 9)[0], 1.0, 0.00001);
// 2theta value
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");
}
};

Expand Down
14 changes: 7 additions & 7 deletions Code/Mantid/instrument/HB3A_Definition.xml
@@ -1,5 +1,5 @@
<?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-->
<!--SOURCE-->
<component type="moderator">
Expand All @@ -15,7 +15,7 @@
<component idfillbyfirst="x" idstart="1" idstepbyrow="256" type="panel">
<location name="bank1">
<parameter name="r-position">
<value val="1.0"/>
<value val="0.3518"/>
</parameter>
<parameter name="t-position">
<logfile eq="-1.0*value+0.0" id="2theta"/>
Expand All @@ -28,13 +28,13 @@
</parameter>
</location>
</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">
<cuboid id="pixel-shape">
<left-front-bottom-point x="-0.000309" y="-0.000309" z="0.0"/>
<left-front-top-point x="-0.000309" y="0.000309" z="0.0"/>
<left-back-bottom-point x="-0.000309" y="-0.000309" z="-0.0001"/>
<right-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="-9.921875e-05" y="9.921875e-05" z="0.0"/>
<left-back-bottom-point x="-9.921875e-05" y="-9.921875e-05" z="-0.0001"/>
<right-front-bottom-point x="9.921875e-05" y="-9.921875e-05" z="0.0"/>
</cuboid>
<algebra val="pixel-shape"/>
</type>
Expand Down

0 comments on commit 2dec455

Please sign in to comment.