/** * Load Data details (number of tubes, channels, etc) * * @param entry First entry of nexus file */ void LoadILLReflectometry::loadDataDetails(NeXus::NXEntry &entry) { // PSD data D17 256 x 1 x 1000 // PSD data Figaro 1 x 256 x 1000 if (m_acqMode) { NXFloat timeOfFlight = entry.openNXFloat("instrument/PSD/time_of_flight"); timeOfFlight.load(); m_channelWidth = static_cast<double>(timeOfFlight[0]); m_numberOfChannels = size_t(timeOfFlight[1]); m_tofDelay = timeOfFlight[2]; if (m_instrument == Supported::Figaro) { NXFloat eDelay = entry.openNXFloat("instrument/Theta/edelay_delay"); eDelay.load(); m_tofDelay += static_cast<double>(eDelay[0]); } } else { // monochromatic mode m_numberOfChannels = 1; } NXInt nChannels = entry.openNXInt("instrument/PSD/detsize"); nChannels.load(); m_numberOfHistograms = nChannels[0]; g_log.debug() << "Please note that ILL reflectometry instruments have " "several tubes, after integration one " "tube remains in the Nexus file.\n Number of tubes (banks): 1\n"; g_log.debug() << "Number of pixels per tube (number of detectors and number " "of histograms): " << m_numberOfHistograms << '\n'; g_log.debug() << "Number of time channels: " << m_numberOfChannels << '\n'; g_log.debug() << "Channel width: " << m_channelWidth << " 1e-6 sec\n"; g_log.debug() << "TOF delay: " << m_tofDelay << '\n'; }
/** * 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"); }