CMS 3D CMS Logo

RivetHarvesting.cc
Go to the documentation of this file.
2 
6 
10 
11 #include "Rivet/AnalysisHandler.hh"
12 #include "Rivet/Analysis.hh"
13 #include "Rivet/Tools/RivetYODA.hh"
14 #include "tinyxml.h"
15 
16 #include <string>
17 #include <vector>
18 #include <iostream>
19 #include <cstdlib>
20 #include <cstring>
21 
22 using namespace Rivet;
23 using namespace edm;
24 using namespace std;
25 
27 _analysisHandler(),
28 _fileNames(pset.getParameter<std::vector<std::string> >("FilesToHarvest")),
29 _sumOfWeights(pset.getParameter<std::vector<double> >("VSumOfWeights")),
30 _crossSections(pset.getParameter<std::vector<double> >("VCrossSections")),
31 _outFileName(pset.getParameter<std::string>("OutputFile")),
32 _isFirstEvent(true),
33 _hepmcCollection(pset.getParameter<edm::InputTag>("HepMCCollection")),
34 _analysisNames(pset.getParameter<std::vector<std::string> >("AnalysisNames"))
35 {
36 
37  if (_sumOfWeights.size() != _fileNames.size() ||
38  _sumOfWeights.size() != _crossSections.size() ||
39  _fileNames.size() != _crossSections.size()){
40  throw cms::Exception("RivetHarvesting") << "Mismatch in vector sizes: FilesToHarvest: " << _sumOfWeights.size() << ", VSumOfWeights: " << _sumOfWeights.size() << ", VCrossSections: " << _crossSections.size();
41  }
42 
43 
44  //get the analyses
45  _analysisHandler.addAnalyses(_analysisNames);
46 
47  //go through the analyses and check those that need the cross section
48  const std::set< AnaHandle, CmpAnaHandle > & analyses = _analysisHandler.analyses();
49 
50  std::set< AnaHandle, CmpAnaHandle >::const_iterator ibeg = analyses.begin();
51  std::set< AnaHandle, CmpAnaHandle >::const_iterator iend = analyses.end();
52  std::set< AnaHandle, CmpAnaHandle >::const_iterator iana;
53  double xsection = -1.;
54  xsection = pset.getParameter<double>("CrossSection");
55  for (iana = ibeg; iana != iend; ++iana){
56  if ((*iana)->needsCrossSection())
57  (*iana)->setCrossSection(xsection);
58  }
59 
60  double totalSumOfWeights = _sumOfWeights[0];
61  _lumis.push_back(_sumOfWeights[0]/_crossSections[0]);
62  for (unsigned int i = 1; i < _sumOfWeights.size(); ++i){
63  _lumis.push_back(_sumOfWeights[i]/_crossSections[i]);
64  totalSumOfWeights += _sumOfWeights[i]*_lumis[0]/_lumis[i];
65  }
66  _analysisHandler.setSumOfWeights(totalSumOfWeights);
67 
68 
69 }
70 
72 }
73 
75  //set the environment, very ugly but rivet is monolithic when it comes to paths
76  char * cmsswbase = getenv("CMSSW_BASE");
77  char * cmsswrelease = getenv("CMSSW_RELEASE_BASE");
78  std::string rivetref, rivetinfo;
79  rivetref = "RIVET_REF_PATH=" + string(cmsswbase) + "/src/GeneratorInterface/RivetInterface/data:" + string(cmsswrelease) + "/src/GeneratorInterface/RivetInterface/data";
80  rivetinfo = "RIVET_INFO_PATH=" + string(cmsswbase) + "/src/GeneratorInterface/RivetInterface/data:" + string(cmsswrelease) + "/src/GeneratorInterface/RivetInterface/data";
81  char *rivetrefCstr = strdup(rivetref.c_str());
82  putenv(rivetrefCstr);
83  free(rivetrefCstr);
84  char *rivetinfoCstr = strdup(rivetinfo.c_str());
85  putenv(rivetinfoCstr);
86  free(rivetinfoCstr);
87 }
88 
89 void RivetHarvesting::beginRun(const edm::Run& iRun,const edm::EventSetup& iSetup){
90  return;
91 }
92 
94  if (!_isFirstEvent)
95  return;
96 
97  //initialize the analysis handles, all histograms are booked
98  //we need at least one event to get the handler initialized
100  iEvent.getByLabel(_hepmcCollection, evt);
101 
102  // get HepMC GenEvent
103  const HepMC::GenEvent *myGenEvent = evt->GetEvent();
104  _analysisHandler.init(*myGenEvent);
105  //gain access to the histogram factory and change the histograms
106  /*
107  AIDA::ITree & tree = _analysisHandler.tree();
108  tree.ls(".", true);
109 
110  //from Analysis.hh (cls 18Feb2014)
112  //const vector<AnalysisObjectPtr>& analysisObjects() const {
113  //return _analysisobjects;
114  //}
115 
116 
117 
118  for (std::vector<std::string>::const_iterator iAna = _analysisNames.begin(); iAna != _analysisNames.end(); ++iAna){
119  std::vector<std::string> listOfNames = tree.listObjectNames("./"+(*iAna), true);
120  std::vector<std::string>::const_iterator iNameBeg = listOfNames.begin();
121  std::vector<std::string>::const_iterator iNameEnd = listOfNames.end();
122  for (std::vector<std::string>::const_iterator iName = iNameBeg; iName != iNameEnd; ++iName ){
123  AIDA::IManagedObject * iObj = tree.find(*iName);
124  if (!iObj){
125  std::cout << *iName << " not found; SKIPPING!" << std::endl;
126  continue;
127  }
128 
129  std::cout << *iName << " FOUND!" << std::endl;
130  vector<string>::const_iterator iFile;
131  vector<string>::const_iterator iFileBeg = _fileNames.begin();
132  vector<string>::const_iterator iFileEnd = _fileNames.end();
133  AIDA::IHistogram1D* histo = dynamic_cast<AIDA::IHistogram1D*>(iObj);
134  AIDA::IProfile1D* prof = dynamic_cast<AIDA::IProfile1D*>(iObj);
135  string tmpdir = "/tmpdir";
136  tree.mkdir(tmpdir);
137  unsigned int ifc = 0;
138  for (iFile = iFileBeg; iFile != iFileEnd; ++iFile) {
139  std::cout << "opening file " << *iFile << std::endl;
140  string name = *iName;
141  string tostrip = *iAna+'/';
142  name.replace(name.find(tostrip),tostrip.length(),"");
143  name.replace(name.find("/"),1,"");
144  cout << name << endl;
145  //vector<DPSXYPoint> original = getDPSXYValsErrs(*iFile, *iAna, name);
146  vector<Point2D> original = getPoint2DValsErrs(*iFile, *iAna, name);
147  if (histo){
148  const string tmppath = tmpdir + "/" + name;
149  cout << tmppath << endl;
150  IHistogram1D* tmphisto = _analysisHandler.histogramFactory().createCopy(tmppath, *histo);
151  tmphisto->reset();
152  for (unsigned int i = 0; i < original.size(); ++i){
153  tmphisto->fill(original[i].xval, original[i].yval);
154  }
155  tmphisto->scale(_lumis[ifc]);
156  histo->add(*tmphisto);
157  //iObj = new AIDA::IHistogram1D(*(_analysisHandler.histogramFactory().add(*iName, *histo, *tmphisto)));
158  tree.rm(tmppath);
159  //delete tmphisto;
160  } else if (prof) {
161  std::cout << *iName << "is a profile, doing nothing " << std::endl;
162  } else {
163  std::cout << *iName << " is neither a IHistogram1D neither a IProfile1D. Doing nothing with it." << std::endl;
164  }
165  ++ifc;
166  }
167  cout << iObj << endl;
168  }
169  }
170 
171  tree.ls(".", true);
172  */
173  _isFirstEvent = false;
174 }
175 
176 
177 void RivetHarvesting::endRun(const edm::Run& iRun,const edm::EventSetup& iSetup){
178  return;
179 }
180 
182  _analysisHandler.finalize();
183  _analysisHandler.writeData(_outFileName);
184 }
185 
187 
188  // Open YODA XML file
189  TiXmlDocument doc(filename);
190  doc.LoadFile();
191  if (doc.Error()) {
192  string err = "Error in " + string(doc.Value());
193  err += ": " + string(doc.ErrorDesc());
194  cerr << err << endl;
195  throw cms::Exception("RivetHarvesting") << "Cannot open " << filename;
196  }
197 
198  // Return value, to be populated
199  vector<Point2D> rtn;
200 
201  try {
202  // Walk down tree to get to the <paper> element
203  const TiXmlNode* yodaN = doc.FirstChild("yoda");
204  if (!yodaN) throw cms::Exception("RivetHarvesting") << "Couldn't get <yoda> root element";
205  for (const TiXmlNode* dpsN = yodaN->FirstChild("dataPointSet"); dpsN; dpsN = dpsN->NextSibling()) {
206  const TiXmlElement* dpsE = dpsN->ToElement();
207  const string plotname = dpsE->Attribute("name");
208  const string plotpath = dpsE->Attribute("path");
209  if (plotpath != path && plotname != name)
210  continue;
212  //if (plotpath.find("/REF") != 0) {
213  // cerr << "Skipping non-reference histogram " << plotname << endl;
214  // continue;
215  //}
216 
218  vector<Point2D> points;
219  for (const TiXmlNode* dpN = dpsN->FirstChild("dataPoint"); dpN; dpN = dpN->NextSibling()) {
220  const TiXmlNode* xMeasN = dpN->FirstChild("measurement");
221  const TiXmlNode* yMeasN = xMeasN->NextSibling();
222  if (xMeasN && yMeasN) {
223  const TiXmlElement* xMeasE = xMeasN->ToElement();
224  const TiXmlElement* yMeasE = yMeasN->ToElement();
225  const string xcentreStr = xMeasE->Attribute("value");
226  const string xerrplusStr = xMeasE->Attribute("errorPlus");
227  const string xerrminusStr = xMeasE->Attribute("errorMinus");
228  const string ycentreStr = yMeasE->Attribute("value");
229  const string yerrplusStr = yMeasE->Attribute("errorPlus");
230  const string yerrminusStr = yMeasE->Attribute("errorMinus");
231  //if (!centreStr) throw Error("Couldn't get a valid bin centre");
232  //if (!errplusStr) throw Error("Couldn't get a valid bin err+");
233  //if (!errminusStr) throw Error("Couldn't get a valid bin err-");
234  istringstream xssC(xcentreStr);
235  istringstream xssP(xerrplusStr);
236  istringstream xssM(xerrminusStr);
237  istringstream yssC(ycentreStr);
238  istringstream yssP(yerrplusStr);
239  istringstream yssM(yerrminusStr);
240  double xcentre, xerrplus, xerrminus, ycentre, yerrplus, yerrminus;
241  xssC >> xcentre; xssP >> xerrplus; xssM >> xerrminus;
242  yssC >> ycentre; yssP >> yerrplus; yssM >> yerrminus;
243  //cout << " " << centre << " + " << errplus << " - " << errminus << endl;
244  Point2D pt(xcentre, xerrminus, xerrplus, ycentre, yerrminus, yerrplus);
245  points.push_back(pt);
246  } else {
247  cerr << "Couldn't get <measurement> tag" << endl;
249  }
250  }
251 
252  return points;
253  }
254 
255  }
256  // Write out the error
258  catch (std::exception& e) {
259  cerr << e.what() << endl;
260  throw;
261  }
262 
263  throw cms::Exception("RivetHarvesting") << "could not find " << path << "/" << name << " in file " << filename;
264 
265  return rtn;
266 
267 }
268 
T getParameter(std::string const &) const
std::vector< double > _lumis
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
void analyze(const edm::Event &, const edm::EventSetup &) override
std::vector< YODA::Point2D > getPoint2DValsErrs(std::string filename, std::string path, std::string name)
edm::InputTag _hepmcCollection
std::vector< double > _crossSections
int iEvent
Definition: GenABIO.cc:230
~RivetHarvesting() override
RivetHarvesting(const edm::ParameterSet &)
std::vector< std::string > _fileNames
void endJob() override
std::vector< double > _sumOfWeights
Rivet::AnalysisHandler _analysisHandler
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:535
std::string _outFileName
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:38
void endRun(const edm::Run &, const edm::EventSetup &) override
void beginJob() override
HLT enums.
void beginRun(const edm::Run &, const edm::EventSetup &) override
std::vector< std::string > _analysisNames
Definition: Run.h:44