/** * Load data about the run * @param local_workspace :: The workspace to load the run information in to * @param entry :: The Nexus entry */ void LoadISISNexus2::loadRunDetails(DataObjects::Workspace2D_sptr local_workspace, NXEntry & entry) { API::Run & runDetails = local_workspace->mutableRun(); // Charge is stored as a float m_proton_charge = static_cast<double>(entry.getFloat("proton_charge")); runDetails.setProtonCharge(m_proton_charge); std::string run_num = boost::lexical_cast<std::string>(entry.getInt("run_number")); runDetails.addProperty("run_number", run_num); // // Some details are only stored in the VMS compatability block so we'll pull everything from there // for consistency NXClass vms_compat = entry.openNXGroup("isis_vms_compat"); // Run header NXChar char_data = vms_compat.openNXChar("HDR"); char_data.load(); runDetails.addProperty("run_header", std::string(char_data(),80)); // Data details on run not the workspace runDetails.addProperty("nspectra", static_cast<int>(m_numberOfSpectraInFile)); runDetails.addProperty("nchannels", static_cast<int>(m_numberOfChannelsInFile)); runDetails.addProperty("nperiods", static_cast<int>(m_numberOfPeriodsInFile)); // RPB struct info NXInt rpb_int = vms_compat.openNXInt("IRPB"); rpb_int.load(); runDetails.addProperty("dur", rpb_int[0]); // actual run duration runDetails.addProperty("durunits", rpb_int[1]); // scaler for above (1=seconds) runDetails.addProperty("dur_freq", rpb_int[2]); // testinterval for above (seconds) runDetails.addProperty("dmp", rpb_int[3]); // dump interval runDetails.addProperty("dmp_units", rpb_int[4]); // scaler for above runDetails.addProperty("dmp_freq", rpb_int[5]); // interval for above runDetails.addProperty("freq", rpb_int[6]); // 2**k where source frequency = 50 / 2**k // Now double data NXFloat rpb_dbl = vms_compat.openNXFloat("RRPB"); rpb_dbl.load(); runDetails.addProperty("gd_prtn_chrg", static_cast<double>(rpb_dbl[7])); // good proton charge (uA.hour) runDetails.addProperty("tot_prtn_chrg", static_cast<double>(rpb_dbl[8])); // total proton charge (uA.hour) runDetails.addProperty("goodfrm",rpb_int[9]); // good frames runDetails.addProperty("rawfrm", rpb_int[10]); // raw frames runDetails.addProperty("dur_wanted", rpb_int[11]); // requested run duration (units as for "duration" above) runDetails.addProperty("dur_secs", rpb_int[12]); // actual run duration in seconds runDetails.addProperty("mon_sum1", rpb_int[13]); // monitor sum 1 runDetails.addProperty("mon_sum2", rpb_int[14]); // monitor sum 2 runDetails.addProperty("mon_sum3",rpb_int[15]); // monitor sum 3 // End date and time is stored separately in ISO format in the "raw_data1/endtime" class char_data = entry.openNXChar("end_time"); char_data.load(); std::string end_time_iso = std::string(char_data(), 19); runDetails.addProperty("run_end", end_time_iso); char_data = entry.openNXChar("start_time"); char_data.load(); std::string start_time_iso = std::string(char_data(), 19); runDetails.addProperty("run_start", start_time_iso); runDetails.addProperty("rb_proposal",rpb_int[21]); // RB (proposal) number vms_compat.close(); }
/** * Load data about the run * @param local_workspace :: The workspace to load the run information in to * @param entry :: The Nexus entry */ void LoadISISNexus2::loadRunDetails(DataObjects::Workspace2D_sptr &local_workspace, NXEntry &entry) { API::Run &runDetails = local_workspace->mutableRun(); // Charge is stored as a float m_proton_charge = static_cast<double>(entry.getFloat("proton_charge")); runDetails.setProtonCharge(m_proton_charge); std::string run_num = boost::lexical_cast<std::string>(entry.getInt("run_number")); runDetails.addProperty("run_number", run_num); // // Some details are only stored in the VMS comparability block so we'll pull // everything from there // for consistency NXClass vms_compat = entry.openNXGroup("isis_vms_compat"); // Run header NXChar char_data = vms_compat.openNXChar("HDR"); char_data.load(); // Space-separate the fields char *nxsHdr = char_data(); char header[86] = {}; const size_t byte = sizeof(char); const char fieldSep(' '); size_t fieldWidths[7] = {3, 5, 20, 24, 12, 8, 8}; char *srcStart = nxsHdr; char *destStart = header; for (size_t i = 0; i < 7; ++i) { size_t width = fieldWidths[i]; memcpy(destStart, srcStart, width * byte); if (i < 6) // no space after last field { srcStart += width; destStart += width; memset(destStart, fieldSep, byte); // insert separator destStart += 1; } } runDetails.addProperty("run_header", std::string(header, header + 86)); // Data details on run not the workspace runDetails.addProperty("nspectra", static_cast<int>(m_loadBlockInfo.numberOfSpectra)); runDetails.addProperty("nchannels", static_cast<int>(m_loadBlockInfo.numberOfChannels)); runDetails.addProperty("nperiods", static_cast<int>(m_loadBlockInfo.numberOfPeriods)); // RPB struct info NXInt rpb_int = vms_compat.openNXInt("IRPB"); rpb_int.load(); runDetails.addProperty("dur", rpb_int[0]); // actual run duration runDetails.addProperty("durunits", rpb_int[1]); // scaler for above (1=seconds) runDetails.addProperty("dur_freq", rpb_int[2]); // testinterval for above (seconds) runDetails.addProperty("dmp", rpb_int[3]); // dump interval runDetails.addProperty("dmp_units", rpb_int[4]); // scaler for above runDetails.addProperty("dmp_freq", rpb_int[5]); // interval for above runDetails.addProperty("freq", rpb_int[6]); // 2**k where source frequency = 50 / 2**k // Now double data NXFloat rpb_dbl = vms_compat.openNXFloat("RRPB"); rpb_dbl.load(); runDetails.addProperty( "gd_prtn_chrg", static_cast<double>(rpb_dbl[7])); // good proton charge (uA.hour) runDetails.addProperty( "tot_prtn_chrg", static_cast<double>(rpb_dbl[8])); // total proton charge (uA.hour) runDetails.addProperty("goodfrm", rpb_int[9]); // good frames runDetails.addProperty("rawfrm", rpb_int[10]); // raw frames runDetails.addProperty( "dur_wanted", rpb_int[11]); // requested run duration (units as for "duration" above) runDetails.addProperty("dur_secs", rpb_int[12]); // actual run duration in seconds runDetails.addProperty("mon_sum1", rpb_int[13]); // monitor sum 1 runDetails.addProperty("mon_sum2", rpb_int[14]); // monitor sum 2 runDetails.addProperty("mon_sum3", rpb_int[15]); // monitor sum 3 // End date and time is stored separately in ISO format in the // "raw_data1/endtime" class char_data = entry.openNXChar("end_time"); char_data.load(); std::string end_time_iso = std::string(char_data(), 19); runDetails.addProperty("run_end", end_time_iso); char_data = entry.openNXChar("start_time"); char_data.load(); std::string start_time_iso = std::string(char_data(), 19); runDetails.addProperty("run_start", start_time_iso); runDetails.addProperty("rb_proposal", rpb_int[21]); // RB (proposal) number vms_compat.close(); }