/* * Write a certain number of log entries (from beginning) to file */ void ProcessDasNexusLog::writeLogtoFile(API::MatrixWorkspace_sptr ws, std::string logname, size_t numentriesoutput, std::string outputfilename) { // 1. Get log Kernel::Property *log = ws->run().getProperty(logname); Kernel::TimeSeriesProperty<double> *tslog = dynamic_cast<Kernel::TimeSeriesProperty<double> *>(log); if (!tslog) throw std::runtime_error("Invalid time series log: it could not be cast " "(interpreted) as a time series property"); std::vector<Kernel::DateAndTime> times = tslog->timesAsVector(); std::vector<double> values = tslog->valuesAsVector(); // 2. Write out std::ofstream ofs; ofs.open(outputfilename.c_str(), std::ios::out); ofs << "# Absolute Time (nanosecond)\tPulse Time (nanosecond)\tTOF (ms)\n"; Kernel::DateAndTime prevtime(0); std::vector<double> tofs; for (size_t i = 0; i < numentriesoutput; i++) { Kernel::DateAndTime tnow = times[i]; if (tnow > prevtime) { // (a) Process previous logs std::sort(tofs.begin(), tofs.end()); for (double tof : tofs) { Kernel::DateAndTime temptime = prevtime + static_cast<int64_t>(tof * 100); ofs << temptime.totalNanoseconds() << "\t" << tnow.totalNanoseconds() << "\t" << tof * 0.1 << '\n'; } // (b) Clear tofs.clear(); // (c) Update time prevtime = tnow; } // (d) Push the current value tofs.push_back(values[i]); } // ENDFOR // Clear the last if (!tofs.empty()) { // (a) Process previous logs: note value is in unit of 100 nano-second std::sort(tofs.begin(), tofs.end()); for (double tof : tofs) { Kernel::DateAndTime temptime = prevtime + static_cast<int64_t>(tof * 100); ofs << temptime.totalNanoseconds() << "\t" << prevtime.totalNanoseconds() << "\t" << tof * 0.1 << '\n'; } } else { throw std::runtime_error("Impossible for this to happen!"); } ofs.close(); } // END Function
/** Set up an Event workspace * @param numentries :: number of log entries to output * @param times :: vector of Kernel::DateAndTime * @param values :: vector of log value in double */ void ExportTimeSeriesLog::setupEventWorkspace(int numentries, vector<DateAndTime> ×, vector<double> values) { Kernel::DateAndTime runstart( m_dataWS->run().getProperty("run_start")->value()); // Get some stuff from the input workspace const size_t numberOfSpectra = 1; const int YLength = static_cast<int>(m_dataWS->blocksize()); // Make a brand new EventWorkspace EventWorkspace_sptr outEventWS = boost::dynamic_pointer_cast<EventWorkspace>( API::WorkspaceFactory::Instance().create( "EventWorkspace", numberOfSpectra, YLength + 1, YLength)); // Copy geometry over. API::WorkspaceFactory::Instance().initializeFromParent(m_dataWS, outEventWS, false); m_outWS = boost::dynamic_pointer_cast<MatrixWorkspace>(outEventWS); if (!m_outWS) throw runtime_error( "Output workspace cannot be casted to a MatrixWorkspace."); g_log.debug("[DBx336] An output workspace is generated.!"); // Create the output event list (empty) EventList &outEL = outEventWS->getOrAddEventList(0); outEL.switchTo(WEIGHTED_NOTIME); // Allocate all the required memory outEL.reserve(numentries); outEL.clearDetectorIDs(); for (size_t i = 0; i < static_cast<size_t>(numentries); i++) { Kernel::DateAndTime tnow = times[i]; int64_t dt = tnow.totalNanoseconds() - runstart.totalNanoseconds(); // convert to microseconds double dtmsec = static_cast<double>(dt) / 1000.0; outEL.addEventQuickly(WeightedEventNoTime(dtmsec, values[i], values[i])); } // Ensure thread-safety outEventWS->sortAll(TOF_SORT, NULL); // Now, create a default X-vector for histogramming, with just 2 bins. Kernel::cow_ptr<MantidVec> axis; MantidVec &xRef = axis.access(); xRef.resize(2); std::vector<WeightedEventNoTime> &events = outEL.getWeightedEventsNoTime(); xRef[0] = events.begin()->tof(); xRef[1] = events.rbegin()->tof(); // Set the binning axis using this. outEventWS->setX(0, axis); return; }