diff --git a/Framework/DataHandling/inc/MantidDataHandling/LoadILLSANS.h b/Framework/DataHandling/inc/MantidDataHandling/LoadILLSANS.h index 0abf3070efc5d8720835831c20ba611fd6bb9217..dff73d9c14d3a3c0eb0e95c4c2253573af79bd06 100644 --- a/Framework/DataHandling/inc/MantidDataHandling/LoadILLSANS.h +++ b/Framework/DataHandling/inc/MantidDataHandling/LoadILLSANS.h @@ -97,17 +97,18 @@ private: Kernel::V3D getComponentPosition(const std::string &componentName); void loadMetaData(const NeXus::NXEntry &, const std::string &); std::string getInstrumentFilePath(const std::string &) const; + void rotateD22(double, const std::string &); LoadHelper m_loader; std::string m_instrumentName; ///< Name of the instrument std::vector<std::string> m_supportedInstruments; API::MatrixWorkspace_sptr m_localWorkspace; std::vector<double> m_defaultBinning; - std::string m_resMode; ///< Resolution mode for D11 + std::string m_resMode; ///< Resolution mode for D11 and D22 double calculateQ(const double lambda, const double twoTheta) const; std::pair<double, double> calculateQMaxQMin(); - void setFinalProperties(); + void setFinalProperties(const std::string& filename); }; } // namespace DataHandling diff --git a/Framework/DataHandling/src/LoadILLSANS.cpp b/Framework/DataHandling/src/LoadILLSANS.cpp index f1f079fcd6dee197df24a05116fbd3980bfbc456..a9f01557803a1e02271b60946043faacea6b2787 100644 --- a/Framework/DataHandling/src/LoadILLSANS.cpp +++ b/Framework/DataHandling/src/LoadILLSANS.cpp @@ -101,9 +101,17 @@ void LoadILLSANS::exec() { double distance = m_loader.getDoubleFromNexusPath( firstEntry, instrumentPath + "/detector/det_calc"); moveDetectorDistance(distance, "detector"); + if (m_instrumentName == "D22") { + double offset = m_loader.getDoubleFromNexusPath( + firstEntry, instrumentPath + "/detector/dtr_actual"); + moveDetectorHorizontal(offset / 1000, "detector"); // mm to meter + double angle = m_loader.getDoubleFromNexusPath( + firstEntry, instrumentPath + "/detector/dan_actual"); + rotateD22(angle, "detector"); + } } - setFinalProperties(); + setFinalProperties(filename); // Set the output workspace property setProperty("OutputWorkspace", m_localWorkspace); } @@ -184,7 +192,7 @@ void LoadILLSANS::initWorkSpace(NeXus::NXEntry &firstEntry, size_t nextIndex = loadDataIntoWorkspaceFromVerticalTubes(data, m_defaultBinning, 0); nextIndex = loadDataIntoWorkspaceFromMonitors(firstEntry, nextIndex); - if (data.dim0() == 128 && m_instrumentName == "D11") { + if (data.dim1() == 128) { m_resMode = "low"; } } @@ -441,7 +449,7 @@ void LoadILLSANS::runLoadInstrument() { IAlgorithm_sptr loadInst = createChildAlgorithm("LoadInstrument"); if (m_resMode == "nominal") { loadInst->setPropertyValue("InstrumentName", m_instrumentName); - } else if (m_resMode == "low" && m_instrumentName == "D11") { + } else if (m_resMode == "low") { loadInst->setPropertyValue("Filename", getInstrumentFilePath(m_instrumentName + "lr")); } @@ -492,6 +500,21 @@ void LoadILLSANS::moveDetectorDistance(double distance, } } +void LoadILLSANS::rotateD22(double angle, const ::std::string &componentName) { + API::IAlgorithm_sptr rotater = + createChildAlgorithm("RotateInstrumentComponent"); + rotater->setProperty<MatrixWorkspace_sptr>("Workspace", m_localWorkspace); + rotater->setProperty("ComponentName", componentName); + rotater->setProperty("X", 0.); + rotater->setProperty("Y", 1.); + rotater->setProperty("Z", 0.); + rotater->setProperty("Angle", angle); + rotater->setProperty("RelativeRotation", false); + rotater->executeAsChildAlg(); + g_log.debug() << "Rotating component '" << componentName + << "' to angle = " << angle << " degrees.\n"; +} + /** * Move detectors in X */ @@ -560,31 +583,12 @@ void LoadILLSANS::loadMetaData(const NeXus::NXEntry &entry, API::Run &runDetails = m_localWorkspace->mutableRun(); - int runNum = entry.getInt("run_number"); - std::string run_num = std::to_string(runNum); - runDetails.addProperty("run_number", run_num); - if (entry.getFloat("mode") == 0.0) { // Not TOF runDetails.addProperty<std::string>("tof_mode", "Non TOF"); } else { runDetails.addProperty<std::string>("tof_mode", "TOF"); } - std::string desc = - m_loader.getStringFromNexusPath(entry, "sample_description"); - runDetails.addProperty("sample_description", desc); - - std::string start_time = entry.getString("start_time"); - start_time = m_loader.dateTimeInIsoFormat(start_time); - runDetails.addProperty("run_start", start_time); - - std::string end_time = entry.getString("end_time"); - end_time = m_loader.dateTimeInIsoFormat(end_time); - runDetails.addProperty("run_end", end_time); - - double duration = entry.getFloat("duration"); - runDetails.addProperty("timer", duration); - double wavelength = entry.getFloat(instrumentNamePath + "/selector/wavelength"); g_log.debug() << "Wavelength found in the nexus file: " << wavelength << '\n'; @@ -660,13 +664,18 @@ std::pair<double, double> LoadILLSANS::calculateQMaxQMin() { return std::pair<double, double>(min, max); } -void LoadILLSANS::setFinalProperties() { +void LoadILLSANS::setFinalProperties(const std::string &filename) { API::Run &runDetails = m_localWorkspace->mutableRun(); runDetails.addProperty("is_frame_skipping", 0); - std::pair<double, double> minmax = LoadILLSANS::calculateQMaxQMin(); runDetails.addProperty("qmin", minmax.first); runDetails.addProperty("qmax", minmax.second); + NXhandle nxHandle; + NXstatus nxStat = NXopen(filename.c_str(), NXACC_READ, &nxHandle); + if (nxStat != NX_ERROR) { + m_loader.addNexusFieldsToWsRun(nxHandle, runDetails); + nxStat = NXclose(&nxHandle); + } } } // namespace DataHandling diff --git a/instrument/D11_Definition.xml b/instrument/D11_Definition.xml index c6d93ac8ab5d8c65cc86b8700e2e759ef4ef4425..417408aff6568d0c4e671831f1a58ef6d993cc0b 100644 --- a/instrument/D11_Definition.xml +++ b/instrument/D11_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="2018-04-06 09:44:22.868716" name="D11" valid-from="2017-10-01 23:59:59" 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="2018-04-26 11:25:14.536260" name="D11" valid-from="2017-10-01 23:59:59" 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"> <!-- This is the instrument definition file of the D11 Lowest momentum transfer & lowest background small-angle neutron scattering instrument at the ILL. Generated file, PLEASE DO NOT EDIT THIS FILE! @@ -101,3 +101,4 @@ <algebra val="pixel-shape"/> </type> </instrument> + diff --git a/instrument/D11lr_Definition.xml b/instrument/D11lr_Definition.xml index 9976720cee26975af171d9262f829ccf2cd33070..cfb10c0357fbc6852fe91776fb219cf0c08c2b20 100644 --- a/instrument/D11lr_Definition.xml +++ b/instrument/D11lr_Definition.xml @@ -1,9 +1,9 @@ <?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="2018-04-06 09:47:30.244021" name="D11" valid-from="2017-10-01 23:59:59" 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="2018-04-26 11:25:32.985566" name="D11lr" valid-from="2017-10-01 23:59:59" 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"> <!-- This is the instrument definition file of the D11 Lowest momentum transfer & lowest background small-angle neutron scattering instrument at the ILL. Generated file, PLEASE DO NOT EDIT THIS FILE! - This file was automatically generated by mantidgeometry/ILL/IDF/d11_generateIDF.py choosing factor = 1! + This file was automatically generated by mantidgeometry/ILL/IDF/d11_generateIDF.py z axis defines the direction of the beam y axis will be the axis used for rotation @@ -101,3 +101,4 @@ <algebra val="pixel-shape"/> </type> </instrument> + diff --git a/instrument/D22_Definition.xml b/instrument/D22_Definition.xml index b666f3d1261514a1a327b5f86d4e6c5d9b7397c1..bfd1aa865f3b9cbdd66b1066f4ded9c908033e47 100644 --- a/instrument/D22_Definition.xml +++ b/instrument/D22_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="2018-04-06 09:43:30.732495" name="D22" valid-from="2017-10-01 23:59:59" 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="2018-04-26 11:23:20.975212" name="D22" valid-from="2017-10-01 23:59:59" 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"> <!-- This is the instrument definition file of the D22 Large dynamic range small-angle diffractometer at the ILL. Generated file, PLEASE DO NOT EDIT THIS FILE! @@ -24,8 +24,13 @@ Default sample dimension is 10 mm x 300 mm Multi-detector: - Size 1024 mm x 980 mm - Pixel size 8 x 8 mm^2 ( 128 x 122 pixels ) + Size 1024 mm x 1024 mm + Nominal resolution: + 128 x 256 + Pixel size 8 x 4 mm2 + Low resolution: + 128 x 128 + Pixel size 8 x 8 mm2 For more information, please visit https://www.ill.eu/instruments-support/instruments-groups/instruments/d22/characteristics/ @@ -76,18 +81,19 @@ <id val="100001"/> </idlist> <!--DETECTOR--> - <component idfillbyfirst="y" idstart="0" idstepbyrow="122" type="detector"> + <component idfillbyfirst="y" idstart="0" idstepbyrow="256" type="detector"> <location x="0.0" y="0.0" z="12.8"/> </component> - <type is="rectangular_detector" name="detector" type="pixel" xpixels="128" xstart="-0.508" xstep="0.008" ypixels="122" ystart="-0.484" ystep="0.008"/> + <type is="rectangular_detector" name="detector" type="pixel" xpixels="128" xstart="-0.508" xstep="0.008" ypixels="256" ystart="-0.51" ystep="0.004"/> <!--PIXEL, EACH PIXEL IS A DETECTOR--> <type is="detector" name="pixel"> <cuboid id="pixel-shape"> - <left-front-bottom-point x="-0.004" y="-0.004" z="0.0"/> - <left-front-top-point x="0.004" y="0.004" z="0.0"/> - <left-back-bottom-point x="-0.004" y="-0.004" z="-0.0001"/> - <right-front-bottom-point x="0.004" y="-0.004" z="0.0"/> + <left-front-bottom-point x="-0.004" y="-0.002" z="0.0"/> + <left-front-top-point x="0.004" y="0.002" z="0.0"/> + <left-back-bottom-point x="-0.004" y="-0.002" z="-0.0001"/> + <right-front-bottom-point x="0.004" y="-0.002" z="0.0"/> </cuboid> <algebra val="pixel-shape"/> </type> </instrument> + diff --git a/instrument/D22lr_Definition.xml b/instrument/D22lr_Definition.xml new file mode 100644 index 0000000000000000000000000000000000000000..4c7d901bc53a7404031411398b367141e90b2b14 --- /dev/null +++ b/instrument/D22lr_Definition.xml @@ -0,0 +1,99 @@ +<?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="2018-04-26 11:23:43.832671" name="D22lr" valid-from="2017-10-01 23:59:59" 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"> + <!-- This is the instrument definition file of the D22 Large dynamic range small-angle diffractometer + at the ILL. + Generated file, PLEASE DO NOT EDIT THIS FILE! + This file was automatically generated by mantidgeometry/ILL/IDF/d22_generateIDF.py + + z axis defines the direction of the beam + y axis will be the axis used for rotation + coordinate system is right-handed + + y axis rotation defined by theta + x axis rotation defined by phi + z axis rotation defined by chi + + width x direction, height y direction + + Collimation + 8 guide sections of 55 mm x 40 mm + Source-to-sample distances are 1.4 m; 2.0 m; 2.8 m; 4.0 m; 5.6 m; 8.0 m; 11.2 m; 14.4 m; 17.6 m + Variable apertures at 19.1 m + + Sample + Default sample dimension is 10 mm x 300 mm + + Multi-detector: + Size 1024 mm x 1024 mm + Nominal resolution: + 128 x 256 + Pixel size 8 x 4 mm2 + Low resolution: + 128 x 128 + Pixel size 8 x 8 mm2 + + For more information, please visit + https://www.ill.eu/instruments-support/instruments-groups/instruments/d22/characteristics/ + --> + <defaults> + <length unit="metre"/> + <angle unit="degree"/> + <reference-frame> + <along-beam axis="z"/> + <pointing-up axis="y"/> + <handedness val="right"/> + </reference-frame> + </defaults> + <!--SOURCE--> + <component type="moderator"> + <location x="0.0" y="0.0" z="-2.0"/> + </component> + <type is="Source" name="moderator"/> + <!--Sample position--> + <component type="sample_position"> + <location x="0.0" y="0.0" z="0.0"/> + </component> + <type is="SamplePos" name="sample_position"/> + <!--MONITORS--> + <component idlist="monitors" type="monitors"> + <location/> + </component> + <type name="monitors"> + <component type="monitor"> + <location name="monitor1" z="-16.7"/> + <location name="monitor2" z="-1.2"/> + </component> + </type> + <!--MONITOR SHAPE--> + <!--FIXME: Do something real here.--> + <type is="monitor" name="monitor"> + <cylinder id="cyl-approx"> + <centre-of-bottom-base p="0.0" r="0.0" t="0.0"/> + <axis x="0.0" y="0.0" z="1.0"/> + <radius val="0.01"/> + <height val="0.03"/> + </cylinder> + <algebra val="cyl-approx"/> + </type> + <!--MONITOR IDs--> + <idlist idname="monitors"> + <id val="100000"/> + <id val="100001"/> + </idlist> + <!--DETECTOR--> + <component idfillbyfirst="y" idstart="0" idstepbyrow="128" type="detector"> + <location x="0.0" y="0.0" z="12.8"/> + </component> + <type is="rectangular_detector" name="detector" type="pixel" xpixels="128" xstart="-0.508" xstep="0.008" ypixels="128" ystart="-0.508" ystep="0.008"/> + <!--PIXEL, EACH PIXEL IS A DETECTOR--> + <type is="detector" name="pixel"> + <cuboid id="pixel-shape"> + <left-front-bottom-point x="-0.004" y="-0.004" z="0.0"/> + <left-front-top-point x="0.004" y="0.004" z="0.0"/> + <left-back-bottom-point x="-0.004" y="-0.004" z="-0.0001"/> + <right-front-bottom-point x="0.004" y="-0.004" z="0.0"/> + </cuboid> + <algebra val="pixel-shape"/> + </type> +</instrument> +