/** * Load the detector mapping from a NeXus file. Throws if the file does not * provide the mapping tables * @param filename :: The name of the ISIS raw NeXus file to pull the UDET/SPEC * tables from */ void CreateSimulationWorkspace::loadMappingFromISISNXS(const std::string &filename) { ::NeXus::File nxsFile(filename); try { nxsFile.openPath("/raw_data_1/isis_vms_compat"); } catch (::NeXus::Exception &) { throw std::runtime_error( "Cannot find path to isis_vms_compat. Is the file an ISIS NeXus file?"); } typedef boost::scoped_ptr<std::vector<int32_t>> NXIntArray; nxsFile.openData("NDET"); NXIntArray ndets(nxsFile.getData<int32_t>()); nxsFile.closeData(); nxsFile.openData("SPEC"); NXIntArray specTable(nxsFile.getData<int32_t>()); nxsFile.closeData(); nxsFile.openData("UDET"); NXIntArray udetTable(nxsFile.getData<int32_t>()); nxsFile.closeData(); createGroupingsFromTables(specTable->data(), udetTable->data(), (*ndets)[0]); }
/** * * @param filename filename A full path to the input RAW file */ void LoadDetectorInfo::loadFromIsisNXS(const std::string &filename) { ::NeXus::File nxsFile(filename, NXACC_READ); // will throw if file can't be opened // two types of file: // - new type entry per detector // - old libisis with single pressure, thickness entry for whole file // hold data read from file DetectorInfo detInfo; std::map<std::string, std::string> entries; nxsFile.getEntries(entries); if (entries.find("full_reference_detector") != entries.end()) { nxsFile.openGroup("full_reference_detector", "NXIXTdetector"); readLibisisNxs(nxsFile, detInfo); nxsFile.closeGroup(); } else if (entries.find("detectors.dat") != entries.end()) { nxsFile.openGroup("detectors.dat", "NXEntry"); readNXSDotDat(nxsFile, detInfo); nxsFile.closeGroup(); } else { throw std::invalid_argument("Unknown NeXus file type"); } nxsFile.close(); // Start loop over detectors auto &pmap = m_workspace->instrumentParameters(); auto &wsDetInfo = m_workspace->mutableDetectorInfo(); int numDets = static_cast<int>(detInfo.ids.size()); for (int i = 0; i < numDets; ++i) { detid_t detID = detInfo.ids[i]; int code = detInfo.codes[i]; try { size_t index = wsDetInfo.indexOf(detID); if (wsDetInfo.isMonitor(index) || code == 1) continue; // Positions double l2 = detInfo.l2[i]; double theta = detInfo.theta[i]; double phi = detInfo.phi[i]; // Parameters double delta = detInfo.delays[i]; // offset value is be subtracted so store negative delta *= -1.0; // pressure, wall thickness double pressure = detInfo.pressures[i]; double thickness = detInfo.thicknesses[i]; updateParameterMap(wsDetInfo, index, pmap, l2, theta, phi, delta, pressure, thickness); } catch (std::out_of_range &) { continue; } } }