CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RivetAnalyzer.cc
Go to the documentation of this file.
2 
5 
8 
9 #include "Rivet/AnalysisHandler.hh"
10 #include "Rivet/Analysis.hh"
11 
12 using namespace Rivet;
13 using namespace edm;
14 
16 _analysisHandler(),
17 _isFirstEvent(true),
18 _outFileName(pset.getParameter<std::string>("OutputFile")),
19 //decide whether to finlaize tthe plots or not.
20 //deciding not to finalize them can be useful for further harvesting of many jobs
21 _doFinalize(pset.getParameter<bool>("DoFinalize")),
22 _produceDQM(pset.getParameter<bool>("ProduceDQMOutput"))
23 {
24  //retrive the analysis name from paarmeter set
25  std::vector<std::string> analysisNames = pset.getParameter<std::vector<std::string> >("AnalysisNames");
26 
27  _hepmcCollection = consumes<HepMCProduct>(pset.getParameter<edm::InputTag>("HepMCCollection"));
28 
29  _useExternalWeight = pset.getParameter<bool>("UseExternalWeight");
30  if (_useExternalWeight) {
31  if (!pset.exists("GenEventInfoCollection")){
32  throw cms::Exception("RivetAnalyzer") << "when using an external event weight you have to specify the GenEventInfoProduct collection from which the weight has to be taken " ;
33  }
34  _genEventInfoCollection = consumes<GenEventInfoProduct>(pset.getParameter<edm::InputTag>("GenEventInfoCollection"));
35  _LHECollection = consumes<LHEEventProduct>(pset.getParameter<edm::InputTag>("LHECollection"));
36  _useLHEweights = pset.getParameter<bool>("useLHEweights");
37  _LHEweightNumber = pset.getParameter<int>("LHEweightNumber");
38 
39  }
40 
41  //get the analyses
42  _analysisHandler.addAnalyses(analysisNames);
43 
44  //go through the analyses and check those that need the cross section
45  const std::set< AnaHandle, CmpAnaHandle > & analyses = _analysisHandler.analyses();
46 
47  std::set< AnaHandle, CmpAnaHandle >::const_iterator ibeg = analyses.begin();
48  std::set< AnaHandle, CmpAnaHandle >::const_iterator iend = analyses.end();
49  std::set< AnaHandle, CmpAnaHandle >::const_iterator iana;
50  double xsection = -1.;
51  xsection = pset.getParameter<double>("CrossSection");
52  for (iana = ibeg; iana != iend; ++iana){
53  if ((*iana)->needsCrossSection())
54  (*iana)->setCrossSection(xsection);
55  }
56  if (_produceDQM){
57  // book stuff needed for DQM
58  dbe = 0;
60  dbe->setVerbose(50);
61  }
62 
63 }
64 
66 }
67 
69  //set the environment, very ugly but rivet is monolithic when it comes to paths
70  char * cmsswbase = getenv("CMSSW_BASE");
71  char * cmsswrelease = getenv("CMSSW_RELEASE_BASE");
72  std::string rivetref, rivetinfo;
73  rivetref = "RIVET_REF_PATH=" + string(cmsswbase) + "/src/GeneratorInterface/RivetInterface/data:" + string(cmsswrelease) + "/src/GeneratorInterface/RivetInterface/data";
74  rivetinfo = "RIVET_INFO_PATH=" + string(cmsswbase) + "/src/GeneratorInterface/RivetInterface/data:" + string(cmsswrelease) + "/src/GeneratorInterface/RivetInterface/data";
75  putenv(strdup(rivetref.c_str()));
76  putenv(strdup(rivetinfo.c_str()));
77 }
78 
79 void RivetAnalyzer::beginRun(const edm::Run& iRun,const edm::EventSetup& iSetup){
80  return;
81 }
82 
84 
85  //get the hepmc product from the event
87  iEvent.getByToken(_hepmcCollection, evt);
88 
89  // get HepMC GenEvent
90  const HepMC::GenEvent *myGenEvent = evt->GetEvent();
91 
92  //if you want to use an external weight we have to clone the GenEvent and change the weight
93  if ( _useExternalWeight ){
94 
95  HepMC::GenEvent * tmpGenEvtPtr = new HepMC::GenEvent( *(evt->GetEvent()) );
96  if (tmpGenEvtPtr->weights().size() == 0) {
97  throw cms::Exception("RivetAnalyzer") << "Original weight container has 0 size ";
98  }
99  if (tmpGenEvtPtr->weights().size() > 1) {
100  edm::LogWarning("RivetAnalyzer") << "Original event weight size is " << tmpGenEvtPtr->weights().size() << ". Will change only the first one ";
101  }
102 
103  if(!_useLHEweights){
104  edm::Handle<GenEventInfoProduct> genEventInfoProduct;
105  iEvent.getByToken(_genEventInfoCollection, genEventInfoProduct);
106  tmpGenEvtPtr->weights()[0] = genEventInfoProduct->weight();
107  }else{
108  edm::Handle<LHEEventProduct> lheEventHandle;
109  iEvent.getByToken(_LHECollection,lheEventHandle);
110  const LHEEventProduct::WGT& wgt = lheEventHandle->weights().at(_LHEweightNumber);
111  tmpGenEvtPtr->weights()[0] = wgt.wgt;
112  }
113  myGenEvent = tmpGenEvtPtr;
114 
115  }
116 
117 
118  //aaply the beams initialization on the first event
119  if (_isFirstEvent){
120  _analysisHandler.init(*myGenEvent);
121  _isFirstEvent = false;
122  }
123 
124  //run the analysis
125  _analysisHandler.analyze(*myGenEvent);
126 
127  //if we have cloned the GenEvent, we delete it
128  if ( _useExternalWeight )
129  delete myGenEvent;
130 }
131 
132 
133 void RivetAnalyzer::endRun(const edm::Run& iRun,const edm::EventSetup& iSetup){
134  if (_doFinalize)
135  _analysisHandler.finalize();
136  else {
137  //if we don't finalize we just want to do the transformation from histograms to DPS
139  //normalizeTree();
140 
141  }
142  _analysisHandler.writeData(_outFileName);
143 
144  return;
145 }
146 
147 
148 
149 //from Rivet 2.X: Analysis.hh (cls 18Feb2014)
151 //const vector<AnalysisObjectPtr>& analysisObjects() const {
152 //return _analysisobjects;
153 //}
154 
155 
156 
158 }
159 
160 
162  using namespace YODA;
163  std::vector<string> analyses = _analysisHandler.analysisNames();
164 
165  //tree.ls(".", true);
166  const string tmpdir = "/RivetNormalizeTmp";
167  //tree.mkdir(tmpdir);
168  foreach (const string& analysis, analyses) {
169  if (_produceDQM){
170  dbe->setCurrentFolder(("Rivet/"+analysis).c_str());
171  //global variables that are always present
172  //sumOfWeights
173  TH1F nevent("nEvt", "n analyzed Events", 1, 0., 1.);
174  nevent.SetBinContent(1,_analysisHandler.sumOfWeights());
175  _mes.push_back(dbe->book1D("nEvt",&nevent));
176  }
177  //cross section
178  //TH1F xsection("xSection", "Cross Section", 1, 0., 1.);
179  //xsection.SetBinContent(1,_analysisHandler.crossSection());
180  //_mes.push_back(dbe->book1D("xSection",&xsection));
181  //now loop over the histograms
182 
183  /*
184  const vector<string> paths = tree.listObjectNames("/"+analysis, true); // args set recursive listing
185  std::cout << "Number of objects in YODA tree for analysis " << analysis << " = " << paths.size() << std::endl;
186  foreach (const string& path, paths) {
187  IManagedObject* hobj = tree.find(path);
188  if (hobj) {
189  // Weird seg fault on SLC4 when trying to dyn cast an IProfile ptr to a IHistogram
190  // Fix by attempting to cast to IProfile first, only try IHistogram if it fails.
191  IHistogram1D* histo = 0;
192  IProfile1D* prof = dynamic_cast<IProfile1D*>(hobj);
193  if (!prof) histo = dynamic_cast<IHistogram1D*>(hobj);
194 
195  std::cout << "Converting histo " << path << " to DPS" << std::endl;
196  tree.mv(path, tmpdir);
197  const size_t lastslash = path.find_last_of("/");
198  const string basename = path.substr(lastslash+1, path.length() - (lastslash+1));
199  const string tmppath = tmpdir + "/" + basename;
200 
201  // If it's a normal histo:
202  if (histo) {
203  IHistogram1D* tmphisto = dynamic_cast<IHistogram1D*>(tree.find(tmppath));
204  if (tmphisto) {
205  _analysisHandler.datapointsetFactory().create(path, *tmphisto);
206  }
207  //now convert to root and then ME
208  //need aida2flat (from Rivet 1.X) & flat2root here
209  TH1F* h = aida2root<IHistogram1D, TH1F>(histo, basename);
210  if (_produceDQM)
211  _mes.push_back(dbe->book1D(h->GetName(), h));
212  delete h;
213  tree.rm(tmppath);
214  }
215  // If it's a profile histo:
216  else if (prof) {
217  IProfile1D* tmpprof = dynamic_cast<IProfile1D*>(tree.find(tmppath));
218  if (tmpprof) {
219  _analysisHandler.datapointsetFactory().create(path, *tmpprof);
220  }
221  //now convert to root and then ME
222  //need aida2flat (from Rivet 1.X) & flat2root here
223  TProfile* p = aida2root<IProfile1D, TProfile>(prof, basename);
224  if (_produceDQM)
225  _mes.push_back(dbe->bookProfile(p->GetName(), p));
226  delete p;
227  tree.rm(tmppath);
228  }
229  }
230  }
231  */
232  }
233  //tree.rmdir(tmpdir);
234 
235 }
236 
237 
238 
virtual void analyze(const edm::Event &, const edm::EventSetup &) override
T getParameter(std::string const &) const
virtual void endRun(const edm::Run &, const edm::EventSetup &) override
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:462
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
bool exists(std::string const &parameterName) const
checks if a parameter exists
int nevent
Definition: AMPTWrapper.h:74
Rivet::AnalysisHandler _analysisHandler
Definition: RivetAnalyzer.h:48
int iEvent
Definition: GenABIO.cc:230
virtual void beginJob() override
virtual void beginRun(const edm::Run &, const edm::EventSetup &) override
RivetAnalyzer(const edm::ParameterSet &)
edm::EDGetTokenT< edm::HepMCProduct > _hepmcCollection
Definition: RivetAnalyzer.h:42
DQMStore * dbe
Definition: RivetAnalyzer.h:54
std::string _outFileName
Definition: RivetAnalyzer.h:50
virtual void endJob() override
List of registered analysis data objects.
edm::EDGetTokenT< LHEEventProduct > _LHECollection
Definition: RivetAnalyzer.h:46
bool _useExternalWeight
Definition: RivetAnalyzer.h:43
virtual ~RivetAnalyzer()
edm::EDGetTokenT< GenEventInfoProduct > _genEventInfoCollection
Definition: RivetAnalyzer.h:47
void normalizeTree()
Definition: Run.h:43
std::vector< MonitorElement * > _mes
Definition: RivetAnalyzer.h:55