/** * Init names of sample logs based on instrument specific NeXus file * entries * * @param entry :: the NeXus file entry */ void LoadILLReflectometry::initNames(NeXus::NXEntry &entry) { std::string instrumentNamePath = m_loader.findInstrumentNexusPath(entry); std::string instrumentName = entry.getString(instrumentNamePath.append("/name")); if (instrumentName.empty()) throw std::runtime_error( "Cannot set the instrument name from the Nexus file!"); boost::to_lower(instrumentName); if (instrumentName == "d17") { m_instrument = Supported::D17; } else if (instrumentName == "figaro") { m_instrument = Supported::Figaro; } else { std::ostringstream str; str << "Unsupported instrument: " << instrumentName << '.'; throw std::runtime_error(str.str()); } g_log.debug() << "Instrument name: " << instrumentName << '\n'; if (m_instrument == Supported::D17) { m_detectorDistanceName = "det"; m_detectorAngleName = "dan.value"; m_sampleAngleName = "san.value"; m_offsetFrom = "VirtualChopper"; m_offsetName = "open_offset"; m_chopper1Name = "Chopper1"; m_chopper2Name = "Chopper2"; } else if (m_instrument == Supported::Figaro) { // For Figaro, the DTR field contains the sample-to-detector distance // when the detector is at the horizontal position (angle = 0). m_detectorDistanceName = "DTR"; m_detectorAngleName = "VirtualAxis.DAN_actual_angle"; m_sampleAngleName = "CollAngle.actual_coll_angle"; m_offsetFrom = "CollAngle"; m_offsetName = "openOffset"; // Figaro: find out which of the four choppers are used NXFloat firstChopper = entry.openNXFloat("instrument/ChopperSetting/firstChopper"); firstChopper.load(); NXFloat secondChopper = entry.openNXFloat("instrument/ChopperSetting/secondChopper"); secondChopper.load(); m_chopper1Name = "CH" + std::to_string(int(firstChopper[0])); m_chopper2Name = "CH" + std::to_string(int(secondChopper[0])); } // get acquisition mode NXInt acqMode = entry.openNXInt("acquisition_mode"); acqMode.load(); m_acqMode = acqMode[0]; m_acqMode ? g_log.debug("TOF mode") : g_log.debug("Monochromatic Mode"); }
/* * Loads metadata present in the nexus file */ void LoadILLSANS::loadMetaData(const NeXus::NXEntry &entry, const std::string &instrumentNamePath) { g_log.debug("Loading metadata..."); 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'; if (wavelength <= 0) { g_log.debug() << "Mode = " << entry.getFloat("mode") << '\n'; g_log.information("The wavelength present in the NeXus file <= 0."); if (entry.getFloat("mode") == 0.0) { // Not TOF throw std::runtime_error("Working in Non TOF mode and the wavelength in " "the file is <=0 !!! Check with the instrument " "scientist!"); } } else { double wavelengthRes = entry.getFloat(instrumentNamePath + "/selector/wavelength_res"); runDetails.addProperty<double>("wavelength", wavelength); double ei = m_loader.calculateEnergy(wavelength); runDetails.addProperty<double>("Ei", ei, true); // wavelength m_defaultBinning[0] = wavelength - wavelengthRes * wavelength * 0.01 / 2; m_defaultBinning[1] = wavelength + wavelengthRes * wavelength * 0.01 / 2; } // Put the detector distances: // std::string detectorPath(instrumentNamePath + "/detector"); // // Just for Sample - RearDetector // double sampleDetectorDistance = // m_loader.getDoubleFromNexusPath(entry,detectorPath + "/det2_calc"); // runDetails.addProperty("sample_detector_distance", // sampleDetectorDistance); }