AnalysisInfo.cc
Go to the documentation of this file.00001 #include "Rivet/Rivet.hh"
00002 #include "Rivet/RivetBoost.hh"
00003 #include "Rivet/AnalysisInfo.hh"
00004 #include "Rivet/Tools/Utils.hh"
00005 #include "Rivet/Tools/RivetPaths.hh"
00006 #include "Rivet/Tools/Logging.hh"
00007 #include "yaml-cpp/yaml.h"
00008 #include <iostream>
00009 #include <fstream>
00010 #include <unistd.h>
00011
00012 namespace Rivet {
00013
00014
00015 namespace {
00016 Log& getLog() {
00017 return Log::getLog("Rivet.AnalysisInfo");
00018 }
00019 }
00020
00021
00022
00023 AnalysisInfo* AnalysisInfo::make(const std::string& ananame) {
00024
00025 AnalysisInfo* ai = new AnalysisInfo();
00026 ai->_beams += make_pair(ANY, ANY);
00027 ai->_name = ananame;
00028
00029
00030 const string datapath = findAnalysisInfoFile(ananame + ".info");
00031 if (datapath.empty()) {
00032 MSG_DEBUG("No datafile " << ananame + ".info found");
00033 return ai;
00034 }
00035
00036
00037 MSG_DEBUG("Reading analysis data from " << datapath);
00038 std::ifstream io(datapath.c_str());
00039 YAML::Parser parser(io);
00040 YAML::Node doc;
00041 try {
00042 parser.GetNextDocument(doc);
00043
00044 } catch (const YAML::ParserException& ex) {
00045 MSG_ERROR("Parse error when reading analysis data from " << datapath);
00046 return ai;
00047 }
00048
00049 for (YAML::Iterator it = doc.begin(); it != doc.end(); ++it) {
00050 string key;
00051 it.first() >> key;
00052 stringstream sec;
00053
00054
00055
00056 try {
00057 if (key == "Name") {
00058 it.second() >> ai->_name;
00059 } else if (key == "Summary") {
00060 it.second() >> ai->_summary;
00061 } else if (key == "Experiment") {
00062 it.second() >> ai->_experiment;
00063 } else if (key == "Beams") {
00064 const YAML::Node& beampairs = it.second();
00065 vector<PdgIdPair> beam_pairs;
00066 if (beampairs.size() == 2 &&
00067 beampairs[0].GetType() == YAML::CT_SCALAR &&
00068 beampairs[1].GetType() == YAML::CT_SCALAR) {
00069 string bstr0, bstr1;
00070 beampairs[0] >> bstr0;
00071 beampairs[1] >> bstr1;
00072 beam_pairs += make_pdgid_pair(bstr0, bstr1);
00073 } else {
00074 for (YAML::Iterator bpi = beampairs.begin(); bpi != beampairs.end(); ++bpi) {
00075 const YAML::Node& bp = *bpi;
00076 if (bp.size() == 2 &&
00077 bp[0].GetType() == YAML::CT_SCALAR &&
00078 bp[1].GetType() == YAML::CT_SCALAR) {
00079 string bstr0, bstr1;
00080 bp[0] >> bstr0;
00081 bp[1] >> bstr1;
00082 beam_pairs += make_pdgid_pair(bstr0, bstr1);
00083 } else {
00084 assert(0 && "Beam ID pairs have to be either a 2-tuple or a list of 2-tuples of particle names");
00085 }
00086 }
00087 }
00088 ai->_beams = beam_pairs;
00089 }
00090 else if (key == "Energies") {
00091 const YAML::Node& energies = it.second();
00092 vector<pair<double,double> > beam_energy_pairs;
00093 for (YAML::Iterator be = energies.begin(); be != energies.end(); ++be) {
00094 if (be->GetType() == YAML::CT_SCALAR) {
00095
00096 double sqrts;
00097 *be >> sqrts;
00098 beam_energy_pairs += make_pair(sqrts/2.0, sqrts/2.0);
00099 } else if (be->GetType() == YAML::CT_SEQUENCE) {
00100 const YAML::Node& beseq = *be;
00101
00102 if (beseq.size() == 1) {
00103 double sqrts;
00104 (*be)[0] >> sqrts;
00105 beam_energy_pairs += make_pair(sqrts/2.0, sqrts/2.0);
00106 } else if (beseq.size() == 2) {
00107 vector<double> beamenergies;
00108 double beamenergy0, beamenergy1;
00109 beseq[0] >> beamenergy0;
00110 beseq[1] >> beamenergy1;
00111 beam_energy_pairs += make_pair(beamenergy0, beamenergy1);
00112 } else {
00113 assert(0 && "Beam energies have to be a list of either numbers or pairs of numbers");
00114 }
00115 } else {
00116 assert(0 && "Beam energies have to be a list of either numbers or pairs of numbers");
00117 }
00118 }
00119 ai->_energies = beam_energy_pairs;
00120 } else if (key == "Collider") {
00121 it.second() >> ai->_collider;
00122 } else if (key == "SpiresID") {
00123 it.second() >> ai->_spiresId;
00124 } else if (key == "BibKey") {
00125 it.second() >> ai->_bibKey;
00126 } else if (key == "BibTeX") {
00127 it.second() >> ai->_bibTeX;
00128 } else if (key == "Status") {
00129 it.second() >> ai->_status;
00130 } else if (key == "ToDo") {
00131 const YAML::Node& todos = it.second();
00132 for (YAML::Iterator todo = todos.begin(); todo != todos.end(); ++todo) {
00133 string s;
00134 *todo >> s;
00135 ai->_todos += s;
00136 }
00137 } else if (key == "NeedCrossSection" || key == "NeedsCrossSection") {
00138 it.second() >> ai->_needsCrossSection;
00139 } else if (key == "RunInfo") {
00140 it.second() >> ai->_runInfo;
00141 } else if (key == "Description") {
00142 it.second() >> ai->_description;
00143 } else if (key == "Year") {
00144 it.second() >> ai->_year;
00145 } else if (key == "Authors") {
00146 const YAML::Node& authors = it.second();
00147 for (YAML::Iterator a = authors.begin(); a != authors.end(); ++a) {
00148 string astr;
00149 *a >> astr;
00150 ai->_authors += astr;
00151 }
00152 } else if (key == "References") {
00153 const YAML::Node& refs = it.second();
00154 for (YAML::Iterator r = refs.begin(); r != refs.end(); ++r) {
00155 string rstr;
00156 *r >> rstr;
00157 ai->_references += rstr;
00158 }
00159 }
00160 } catch (const YAML::RepresentationException& ex) {
00161 Log::getLog("Rivet.Analysis")
00162 << Log::WARN << "Type error when reading analysis data '"
00163 << key << "' from " << datapath << endl;
00164 }
00165 }
00166 MSG_TRACE("AnalysisInfo pointer = " << ai);
00167 return ai;
00168 }
00169
00170
00171 string toString(const AnalysisInfo& ai) {
00172 stringstream ss;
00173 ss << ai.name();
00174 ss << " - " << ai.summary();
00175
00176
00177 ss << " (" << ai.status() << ")";
00178 return ss.str();
00179 }
00180
00181
00182 }