CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Member Functions | Private Attributes
RivetHarvesting Class Reference

#include <RivetHarvesting.h>

Inheritance diagram for RivetHarvesting:
edm::EDAnalyzer edm::EDConsumerBase

Public Member Functions

virtual void analyze (const edm::Event &, const edm::EventSetup &)
 
virtual void beginJob ()
 
virtual void beginRun (const edm::Run &, const edm::EventSetup &)
 
virtual void endJob ()
 
virtual void endRun (const edm::Run &, const edm::EventSetup &)
 
 RivetHarvesting (const edm::ParameterSet &)
 
virtual ~RivetHarvesting ()
 
- Public Member Functions inherited from edm::EDAnalyzer
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
 EDAnalyzer ()
 
ModuleDescription const & moduleDescription () const
 
std::string workerType () const
 
virtual ~EDAnalyzer ()
 
- Public Member Functions inherited from edm::EDConsumerBase
 EDConsumerBase ()
 
ProductHolderIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
std::vector
< ProductHolderIndexAndSkipBit >
const & 
itemsToGetFromEvent () const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesDependentUpon (const std::string &iProcessName, std::vector< const char * > &oModuleLabels) const
 
bool registeredToConsume (ProductHolderIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
void updateLookup (BranchType iBranchType, ProductHolderIndexHelper const &)
 
virtual ~EDConsumerBase ()
 

Private Member Functions

std::vector< Rivet::DPSXYPoint > getDPSXYValsErrs (std::string filename, std::string path, std::string name)
 

Private Attributes

Rivet::AnalysisHandler _analysisHandler
 
std::vector< std::string > _analysisNames
 
std::vector< double > _crossSections
 
std::vector< std::string > _fileNames
 
edm::InputTag _hepmcCollection
 
bool _isFirstEvent
 
std::vector< double > _lumis
 
std::string _outFileName
 
std::vector< double > _sumOfWeights
 

Additional Inherited Members

- Public Types inherited from edm::EDAnalyzer
typedef EDAnalyzer ModuleType
 
- Static Public Member Functions inherited from edm::EDAnalyzer
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &)
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ProductType , BranchType B = InEvent>
void consumesMany ()
 
void consumesMany (const TypeToGet &id)
 
template<BranchType B>
void consumesMany (const TypeToGet &id)
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 

Detailed Description

Definition at line 18 of file RivetHarvesting.h.

Constructor & Destructor Documentation

RivetHarvesting::RivetHarvesting ( const edm::ParameterSet pset)

Definition at line 27 of file RivetHarvesting.cc.

References _analysisHandler, _analysisNames, _crossSections, _fileNames, _lumis, _sumOfWeights, edm::hlt::Exception, edm::ParameterSet::getParameter(), and i.

27  :
29 _fileNames(pset.getParameter<std::vector<std::string> >("FilesToHarvest")),
30 _sumOfWeights(pset.getParameter<std::vector<double> >("VSumOfWeights")),
31 _crossSections(pset.getParameter<std::vector<double> >("VCrossSections")),
32 _outFileName(pset.getParameter<std::string>("OutputFile")),
33 _isFirstEvent(true),
34 _hepmcCollection(pset.getParameter<edm::InputTag>("HepMCCollection")),
35 _analysisNames(pset.getParameter<std::vector<std::string> >("AnalysisNames"))
36 {
37 
38  if (_sumOfWeights.size() != _fileNames.size() ||
39  _sumOfWeights.size() != _crossSections.size() ||
40  _fileNames.size() != _crossSections.size()){
41  throw cms::Exception("RivetHarvesting") << "Mismatch in vector sizes: FilesToHarvest: " << _sumOfWeights.size() << ", VSumOfWeights: " << _sumOfWeights.size() << ", VCrossSections: " << _crossSections.size();
42  }
43 
44 
45  //get the analyses
46  _analysisHandler.addAnalyses(_analysisNames);
47 
48  //go through the analyses and check those that need the cross section
49  const std::set< AnaHandle, AnaHandleLess > & analyses = _analysisHandler.analyses();
50 
51  std::set< AnaHandle, AnaHandleLess >::const_iterator ibeg = analyses.begin();
52  std::set< AnaHandle, AnaHandleLess >::const_iterator iend = analyses.end();
53  std::set< AnaHandle, AnaHandleLess >::const_iterator iana;
54  double xsection = -1.;
55  xsection = pset.getParameter<double>("CrossSection");
56  for (iana = ibeg; iana != iend; ++iana){
57  if ((*iana)->needsCrossSection())
58  (*iana)->setCrossSection(xsection);
59  }
60 
61  double totalSumOfWeights = _sumOfWeights[0];
62  _lumis.push_back(_sumOfWeights[0]/_crossSections[0]);
63  for (unsigned int i = 1; i < _sumOfWeights.size(); ++i){
64  _lumis.push_back(_sumOfWeights[i]/_crossSections[i]);
65  totalSumOfWeights += _sumOfWeights[i]*_lumis[0]/_lumis[i];
66  }
67  _analysisHandler.setSumOfWeights(totalSumOfWeights);
68 
69 
70 }
T getParameter(std::string const &) const
std::vector< double > _lumis
int i
Definition: DBlmapReader.cc:9
edm::InputTag _hepmcCollection
std::vector< double > _crossSections
std::vector< std::string > _fileNames
std::vector< double > _sumOfWeights
Rivet::AnalysisHandler _analysisHandler
std::string _outFileName
std::vector< std::string > _analysisNames
RivetHarvesting::~RivetHarvesting ( )
virtual

Definition at line 72 of file RivetHarvesting.cc.

72  {
73 }

Member Function Documentation

void RivetHarvesting::analyze ( const edm::Event iEvent,
const edm::EventSetup iSetup 
)
virtual

Implements edm::EDAnalyzer.

Definition at line 90 of file RivetHarvesting.cc.

References _analysisHandler, _analysisNames, _fileNames, _hepmcCollection, _isFirstEvent, _lumis, gather_cfg::cout, edm::Event::getByLabel(), getDPSXYValsErrs(), timingPdfMaker::histo, i, mergeVDriftHistosByStation::name, definitions::original, and MainPageGenerator::tree.

90  {
91  if (!_isFirstEvent)
92  return;
93 
94  //initialize the analysis handles, all histograms are booked
95  //we need at least one event to get the handler initialized
97  iEvent.getByLabel(_hepmcCollection, evt);
98 
99  // get HepMC GenEvent
100  const HepMC::GenEvent *myGenEvent = evt->GetEvent();
101  _analysisHandler.init(*myGenEvent);
102  //gain access to the histogram factory and change the histograms
103  AIDA::ITree & tree = _analysisHandler.tree();
104  tree.ls(".", true);
105 
106  /*
107  map<string, vector<DPSXYPoint> > existingHistos;
108  vector<string>::const_iterator iFile;
109  vector<string>::const_iterator iFileBeg = _fileNames.begin();
110  vector<string>::const_iterator iFileEnd = _fileNames.end();
111  for (iFile = iFileBeg; iFile != iFileEnd; ++iFile) {
112  map<string, vector<DPSXYPoint> > thisFileHistos = getDPSXYValsErrs(*iFile);
113  map<string, vector<DPSXYPoint> >::const_iterator iMap;
114  map<string, vector<DPSXYPoint> >::const_iterator iMapBeg = thisFileHistos.begin();
115  map<string, vector<DPSXYPoint> >::const_iterator iMapEnd = thisFileHistos.end();
116  for (iMap = iMapBeg; iMap != iMapEnd; ++iMap){
117  std::cout << iMap->first << " found in the original file " << *iFile << std::endl;
118  existingHistos[iMap->first] = iMap->second;
119  }
120  //existingHistos.insert(existingHistos.end(), thisFileHistos.begin(), thisFileHistos.end());
121  }
122  */
123 
124  for (std::vector<std::string>::const_iterator iAna = _analysisNames.begin(); iAna != _analysisNames.end(); ++iAna){
125  std::vector<std::string> listOfNames = tree.listObjectNames("./"+(*iAna), true);
126  std::vector<std::string>::const_iterator iNameBeg = listOfNames.begin();
127  std::vector<std::string>::const_iterator iNameEnd = listOfNames.end();
128  for (std::vector<std::string>::const_iterator iName = iNameBeg; iName != iNameEnd; ++iName ){
129  AIDA::IManagedObject * iObj = tree.find(*iName);
130  if (!iObj){
131  std::cout << *iName << " not found; SKIPPING!" << std::endl;
132  continue;
133  }
134 
135  std::cout << *iName << " FOUND!" << std::endl;
136  vector<string>::const_iterator iFile;
137  vector<string>::const_iterator iFileBeg = _fileNames.begin();
138  vector<string>::const_iterator iFileEnd = _fileNames.end();
139  AIDA::IHistogram1D* histo = dynamic_cast<AIDA::IHistogram1D*>(iObj);
140  AIDA::IProfile1D* prof = dynamic_cast<AIDA::IProfile1D*>(iObj);
141  string tmpdir = "/tmpdir";
142  tree.mkdir(tmpdir);
143  unsigned int ifc = 0;
144  for (iFile = iFileBeg; iFile != iFileEnd; ++iFile) {
145  std::cout << "opening file " << *iFile << std::endl;
146  string name = *iName;
147  string tostrip = *iAna+'/';
148  name.replace(name.find(tostrip),tostrip.length(),"");
149  name.replace(name.find("/"),1,"");
150  cout << name << endl;
151  vector<DPSXYPoint> original = getDPSXYValsErrs(*iFile, *iAna, name);
152  if (histo){
153  const string tmppath = tmpdir + "/" + name;
154  cout << tmppath << endl;
155  IHistogram1D* tmphisto = _analysisHandler.histogramFactory().createCopy(tmppath, *histo);
156  tmphisto->reset();
157  for (unsigned int i = 0; i < original.size(); ++i){
158  tmphisto->fill(original[i].xval, original[i].yval);
159  }
160  tmphisto->scale(_lumis[ifc]);
161  histo->add(*tmphisto);
162  //iObj = new AIDA::IHistogram1D(*(_analysisHandler.histogramFactory().add(*iName, *histo, *tmphisto)));
163  tree.rm(tmppath);
164  //delete tmphisto;
165  } else if (prof) {
166  std::cout << *iName << "is a profile, doing nothing " << std::endl;
167  } else {
168  std::cout << *iName << " is neither a IHistogram1D neither a IProfile1D. Doing nothing with it." << std::endl;
169  }
170  ++ifc;
171  }
172  cout << iObj << endl;
173  }
174  }
175 
176  tree.ls(".", true);
177 
178  _isFirstEvent = false;
179 }
std::vector< double > _lumis
int i
Definition: DBlmapReader.cc:9
list original
Definition: definitions.py:57
edm::InputTag _hepmcCollection
std::vector< std::string > _fileNames
Rivet::AnalysisHandler _analysisHandler
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:390
std::vector< Rivet::DPSXYPoint > getDPSXYValsErrs(std::string filename, std::string path, std::string name)
tuple cout
Definition: gather_cfg.py:121
std::vector< std::string > _analysisNames
void RivetHarvesting::beginJob ( void  )
virtual

Reimplemented from edm::EDAnalyzer.

Definition at line 75 of file RivetHarvesting.cc.

References AlCaHLTBitMon_QueryRunRegistry::string.

75  {
76  //set the environment, very ugly but rivet is monolithic when it comes to paths
77  char * cmsswbase = getenv("CMSSW_BASE");
78  char * cmsswrelease = getenv("CMSSW_RELEASE_BASE");
79  std::string rivetref, rivetinfo;
80  rivetref = "RIVET_REF_PATH=" + string(cmsswbase) + "/src/GeneratorInterface/RivetInterface/data:" + string(cmsswrelease) + "/src/GeneratorInterface/RivetInterface/data";
81  rivetinfo = "RIVET_INFO_PATH=" + string(cmsswbase) + "/src/GeneratorInterface/RivetInterface/data:" + string(cmsswrelease) + "/src/GeneratorInterface/RivetInterface/data";
82  putenv(strdup(rivetref.c_str()));
83  putenv(strdup(rivetinfo.c_str()));
84 }
void RivetHarvesting::beginRun ( const edm::Run iRun,
const edm::EventSetup iSetup 
)
virtual

Reimplemented from edm::EDAnalyzer.

Definition at line 86 of file RivetHarvesting.cc.

86  {
87  return;
88 }
void RivetHarvesting::endJob ( void  )
virtual

Reimplemented from edm::EDAnalyzer.

Definition at line 186 of file RivetHarvesting.cc.

References _analysisHandler, and _outFileName.

186  {
187  _analysisHandler.finalize();
188  _analysisHandler.writeData(_outFileName);
189 }
Rivet::AnalysisHandler _analysisHandler
std::string _outFileName
void RivetHarvesting::endRun ( const edm::Run iRun,
const edm::EventSetup iSetup 
)
virtual

Reimplemented from edm::EDAnalyzer.

Definition at line 182 of file RivetHarvesting.cc.

182  {
183  return;
184 }
vector< DPSXYPoint > RivetHarvesting::getDPSXYValsErrs ( std::string  filename,
std::string  path,
std::string  name 
)
private

Check path to make sure that this is a reference histogram.

Definition at line 191 of file RivetHarvesting.cc.

References TiXmlElement::Attribute(), dtNoiseDBValidation_cfg::cerr, asciidump::doc, alignCSCRings::e, TiXmlDocument::Error(), TiXmlDocument::ErrorDesc(), cppFunctionSkipper::exception, edm::hlt::Exception, lut2db_cfg::filename, TiXmlNode::FirstChild(), TiXmlDocument::LoadFile(), TiXmlNode::NextSibling(), RecoTauCleanerPlugins::pt, AlCaHLTBitMon_QueryRunRegistry::string, TiXmlNode::ToElement(), TiXmlElement::ToElement(), and TiXmlNode::Value().

Referenced by analyze().

191  {
192  // Open AIDA XML file
194  doc.LoadFile();
195  if (doc.Error()) {
196  string err = "Error in " + string(doc.Value());
197  err += ": " + string(doc.ErrorDesc());
198  cerr << err << endl;
199  throw cms::Exception("RivetHarvesting") << "Cannot open " << filename;
200  }
201 
202  // Return value, to be populated
203  vector<DPSXYPoint> rtn;
204 
205  try {
206  // Walk down tree to get to the <paper> element
207  const TiXmlNode* aidaN = doc.FirstChild("aida");
208  if (!aidaN) throw cms::Exception("RivetHarvesting") << "Couldn't get <aida> root element";
209  for (const TiXmlNode* dpsN = aidaN->FirstChild("dataPointSet"); dpsN; dpsN = dpsN->NextSibling()) {
210  const TiXmlElement* dpsE = dpsN->ToElement();
211  const string plotname = dpsE->Attribute("name");
212  const string plotpath = dpsE->Attribute("path");
213  if (plotpath != path && plotname != name)
214  continue;
216  //if (plotpath.find("/REF") != 0) {
217  // cerr << "Skipping non-reference histogram " << plotname << endl;
218  // continue;
219  //}
220 
222  vector<DPSXYPoint> points;
223  for (const TiXmlNode* dpN = dpsN->FirstChild("dataPoint"); dpN; dpN = dpN->NextSibling()) {
224  const TiXmlNode* xMeasN = dpN->FirstChild("measurement");
225  const TiXmlNode* yMeasN = xMeasN->NextSibling();
226  if (xMeasN && yMeasN) {
227  const TiXmlElement* xMeasE = xMeasN->ToElement();
228  const TiXmlElement* yMeasE = yMeasN->ToElement();
229  const string xcentreStr = xMeasE->Attribute("value");
230  const string xerrplusStr = xMeasE->Attribute("errorPlus");
231  const string xerrminusStr = xMeasE->Attribute("errorMinus");
232  const string ycentreStr = yMeasE->Attribute("value");
233  const string yerrplusStr = yMeasE->Attribute("errorPlus");
234  const string yerrminusStr = yMeasE->Attribute("errorMinus");
235  //if (!centreStr) throw Error("Couldn't get a valid bin centre");
236  //if (!errplusStr) throw Error("Couldn't get a valid bin err+");
237  //if (!errminusStr) throw Error("Couldn't get a valid bin err-");
238  istringstream xssC(xcentreStr);
239  istringstream xssP(xerrplusStr);
240  istringstream xssM(xerrminusStr);
241  istringstream yssC(ycentreStr);
242  istringstream yssP(yerrplusStr);
243  istringstream yssM(yerrminusStr);
244  double xcentre, xerrplus, xerrminus, ycentre, yerrplus, yerrminus;
245  xssC >> xcentre; xssP >> xerrplus; xssM >> xerrminus;
246  yssC >> ycentre; yssP >> yerrplus; yssM >> yerrminus;
247  //cout << " " << centre << " + " << errplus << " - " << errminus << endl;
248  DPSXYPoint pt(xcentre, xerrminus, xerrplus, ycentre, yerrminus, yerrplus);
249  points.push_back(pt);
250  } else {
251  cerr << "Couldn't get <measurement> tag" << endl;
253  }
254  }
255 
256  return points;
257  }
258 
259  }
260  // Write out the error
262  catch (std::exception& e) {
263  cerr << e.what() << endl;
264  throw;
265  }
266 
267  throw cms::Exception("RivetHarvesting") << "could not find " << path << "/" << name << " in file " << filename;
268  return rtn;
269 }
virtual const TiXmlElement * ToElement() const
Cast to a more defined type. Will return null not of the requested type.
Definition: tinyxml.h:1127
tuple path
else: Piece not in the list, fine.
const TiXmlNode * FirstChild() const
The first child of this node. Will be null if there are no children.
Definition: tinyxml.h:526
tuple doc
Definition: asciidump.py:381
const TiXmlNode * NextSibling(const std::string &_value) const
STL std::string form.
Definition: tinyxml.h:630
virtual const TiXmlElement * ToElement() const
Cast to a more defined type. Will return null if not of the requested type.
Definition: tinyxml.h:702
tuple filename
Definition: lut2db_cfg.py:20
const char * Attribute(const char *name) const
Definition: tinyxml.cc:564

Member Data Documentation

Rivet::AnalysisHandler RivetHarvesting::_analysisHandler
private

Definition at line 39 of file RivetHarvesting.h.

Referenced by analyze(), endJob(), and RivetHarvesting().

std::vector<std::string> RivetHarvesting::_analysisNames
private

Definition at line 47 of file RivetHarvesting.h.

Referenced by analyze(), and RivetHarvesting().

std::vector<double> RivetHarvesting::_crossSections
private

Definition at line 42 of file RivetHarvesting.h.

Referenced by RivetHarvesting().

std::vector<std::string> RivetHarvesting::_fileNames
private

Definition at line 40 of file RivetHarvesting.h.

Referenced by analyze(), and RivetHarvesting().

edm::InputTag RivetHarvesting::_hepmcCollection
private

Definition at line 46 of file RivetHarvesting.h.

Referenced by analyze().

bool RivetHarvesting::_isFirstEvent
private

Definition at line 45 of file RivetHarvesting.h.

Referenced by analyze().

std::vector<double> RivetHarvesting::_lumis
private

Definition at line 43 of file RivetHarvesting.h.

Referenced by analyze(), and RivetHarvesting().

std::string RivetHarvesting::_outFileName
private

Definition at line 44 of file RivetHarvesting.h.

Referenced by endJob().

std::vector<double> RivetHarvesting::_sumOfWeights
private

Definition at line 41 of file RivetHarvesting.h.

Referenced by RivetHarvesting().