/** * Add a sample environment log for the proton chage (charge of the pulse in *picoCoulombs) * and set the scalar value (total proton charge, microAmps*hours, on the *sample) * * @param workspace :: Event workspace to set the proton charge on */ void LoadEventPreNexus::setProtonCharge( DataObjects::EventWorkspace_sptr &workspace) { if (this->proton_charge.empty()) // nothing to do return; Run &run = workspace->mutableRun(); // Add the proton charge entries. TimeSeriesProperty<double> *log = new TimeSeriesProperty<double>("proton_charge"); log->setUnits("picoCoulombs"); // Add the time and associated charge to the log log->addValues(this->pulsetimes, this->proton_charge); /// TODO set the units for the log run.addLogData(log); // Force re-integration run.integrateProtonCharge(); double integ = run.getProtonCharge(); this->g_log.information() << "Total proton charge of " << integ << " microAmp*hours found by integrating.\n"; }
/** * Check if the file is SNS text; load it if it is, return false otherwise. * @return true if the file was a SNS style; false otherwise. */ bool LoadLog::LoadSNSText() { // Get the SNS-specific parameter std::vector<std::string> names = getProperty("Names"); std::vector<std::string> units = getProperty("Units"); // Get the input workspace and retrieve run from workspace. // the log file(s) will be loaded into the run object of the workspace const MatrixWorkspace_sptr localWorkspace = getProperty("Workspace"); // open log file std::ifstream inLogFile(m_filename.c_str()); // Get the first line std::string aLine; if (!Mantid::Kernel::Strings::extractToEOL(inLogFile,aLine)) return false; std::vector<double> cols; bool ret = SNSTextFormatColumns(aLine, cols); // Any error? if (!ret || cols.size() < 2) return false; size_t numCols = static_cast<size_t>(cols.size()-1); if (names.size() != numCols) throw std::invalid_argument("The Names parameter should have one fewer entry as the number of columns in a SNS-style text log file."); if ((!units.empty()) && (units.size() != numCols)) throw std::invalid_argument("The Units parameter should have either 0 entries or one fewer entry as the number of columns in a SNS-style text log file."); // Ok, create all the logs std::vector<TimeSeriesProperty<double>*> props; for(size_t i=0; i < numCols; i++) { TimeSeriesProperty<double>* p = new TimeSeriesProperty<double>(names[i]); if (units.size() == numCols) p->setUnits(units[i]); props.push_back(p); } // Go back to start inLogFile.seekg(0); while(Mantid::Kernel::Strings::extractToEOL(inLogFile,aLine)) { if (aLine.size() == 0) break; if (SNSTextFormatColumns(aLine, cols)) { if (cols.size() == numCols+1) { DateAndTime time(cols[0], 0.0); for(size_t i=0; i<numCols; i++) props[i]->addValue(time, cols[i+1]); } else throw std::runtime_error("Inconsistent number of columns while reading SNS-style text file."); } else throw std::runtime_error("Error while reading columns in SNS-style text file."); } // Now add all the full logs to the workspace for(size_t i=0; i < numCols; i++) { std::string name = props[i]->name(); if (localWorkspace->mutableRun().hasProperty(name)) { localWorkspace->mutableRun().removeLogData(name); g_log.information() << "Log data named " << name << " already existed and was overwritten.\n"; } localWorkspace->mutableRun().addLogData(props[i]); } return true; }