/** * Updates the map from run number to GoniometerMatrix * * @param Peaks The PeaksWorkspace whose peaks contain the run numbers * along with the corresponding GoniometerMatrix * * @param OptRuns A '/' separated "list" of run numbers to include in the * map. This string must also start and end with a '/' * * @param Res The resultant map. */ void PeakHKLErrors::getRun2MatMap( PeaksWorkspace_sptr &Peaks, const std::string &OptRuns, std::map<int, Mantid::Kernel::Matrix<double>> &Res) const { for (int i = 0; i < Peaks->getNumberPeaks(); ++i) { Geometry::IPeak &peak_old = Peaks->getPeak(i); int runNum = peak_old.getRunNumber(); std::string runNumStr = std::to_string(runNum); size_t N = OptRuns.find("/" + runNumStr + "/"); if (N < OptRuns.size()) { double chi = getParameter("chi" + boost::lexical_cast<std::string>(runNumStr)); double phi = getParameter("phi" + boost::lexical_cast<std::string>(runNumStr)); double omega = getParameter("omega" + boost::lexical_cast<std::string>(runNumStr)); Mantid::Geometry::Goniometer uniGonio; uniGonio.makeUniversalGoniometer(); uniGonio.setRotationAngle("phi", phi); uniGonio.setRotationAngle("chi", chi); uniGonio.setRotationAngle("omega", omega); Res[runNum] = uniGonio.getR(); } } }
/** Append the peaks from a .peaks file into the workspace * @param outWS :: the workspace in which to place the information * @param filename :: path to the .peaks file */ void LoadIsawPeaks::appendFile( PeaksWorkspace_sptr outWS, std::string filename ) { // Open the file std::ifstream in( filename.c_str() ); // Read the header, load the instrument double T0; std::string s = readHeader( outWS, in , T0); // set T0 in the run parameters API::Run & m_run = outWS->mutableRun(); m_run.addProperty<double>("T0", T0, true); if( !in.good() || s.length() < 1 ) throw std::runtime_error( "End of Peaks file before peaks" ); if( s.compare( std::string( "0" ) ) != 0 ) throw std::logic_error( "No header for Peak segments" ); readToEndOfLine( in , true ); s = getWord( in , false ); int run, bankNum; double chi , phi , omega , monCount; // Build the universal goniometer that will build the rotation matrix. Mantid::Geometry::Goniometer uniGonio; uniGonio.makeUniversalGoniometer(); // TODO: Can we find the number of peaks to get better progress reporting? Progress prog(this, 0.0, 1.0, 100); while( in.good() ) { // Read the header if necessary s = readPeakBlockHeader( s , in , run , bankNum , chi , phi , omega , monCount ); // Build the Rotation matrix using phi,chi,omega uniGonio.setRotationAngle("phi", phi); uniGonio.setRotationAngle("chi", chi); uniGonio.setRotationAngle("omega", omega); //Put goniometer into peaks workspace outWS->mutableRun().setGoniometer(uniGonio, false); std::ostringstream oss; std::string bankString = "bank"; if (outWS->getInstrument()->getName() == "WISH") bankString = "WISHpanel0"; oss << bankString << bankNum; std::string bankName = oss.str(); int seqNum = -1; try { // Read the peak Peak peak = readPeak(outWS, s, in, seqNum, bankName); // Get the calculated goniometer matrix Matrix<double> gonMat = uniGonio.getR(); peak.setGoniometerMatrix(gonMat); peak.setRunNumber(run); peak.setMonitorCount( monCount ); double tof = peak.getTOF(); Kernel::Units::Wavelength wl; wl.initialize(peak.getL1(), peak.getL2(), peak.getScattering(), 0, peak.getInitialEnergy(), 0.0); peak.setWavelength(wl.singleFromTOF( tof)); // Add the peak to workspace outWS->addPeak(peak); } catch (std::runtime_error & e) { g_log.warning() << "Error reading peak SEQN " << seqNum << " : " << e.what() << std::endl; } prog.report(); } }