DESY Hbb Analysis Framework
Analysis.cc
Go to the documentation of this file.
2 // system include files
3 #include <iostream>
4 #include <fstream>
5 #include <cstdlib>
6 //
7 // user include files
8 #include "TKey.h"
9 #include <boost/algorithm/string.hpp>
10 #include <boost/filesystem.hpp>
11 #include <boost/property_tree/ptree.hpp>
12 #include <boost/property_tree/json_parser.hpp>
13 
14 //
15 // class declaration
16 //
17 
18 using namespace analysis;
19 using namespace analysis::tools;
20 
21 //
22 // constructors and destructor
23 //
24 
25 Analysis::Analysis(const std::string & inputFilelist, const std::string & evtinfo)
26 {
27  inputFilelist_ = inputFilelist;
28  fileCollection_ = new TFileCollection("fileCollection","",inputFilelist.c_str());
29  fileList_ = (TCollection*) fileCollection_->GetList();
30 
31  // event info (must be in the tree always)
32  t_event_ = new TChain(evtinfo.c_str());
33  t_event_ -> AddFileInfoList(fileList_);
34 
35  std::vector<std::string> branches;
36  TObjArray * treeBranches = t_event_->GetListOfBranches();
37  for ( int i = 0 ; i < treeBranches->GetEntries() ; ++i )
38  branches.push_back(treeBranches->At(i)->GetName());
39 
40  t_event_ -> SetBranchAddress("event", &event_);
41  t_event_ -> SetBranchAddress("run", &run_);
42  t_event_ -> SetBranchAddress("lumisection", &lumi_);
43 
44  // For backward compatibility
45  std::vector<std::string>::iterator it;
46  it = std::find(branches.begin(),branches.end(),"nPileup"); if ( it != branches.end() ) t_event_ -> SetBranchAddress( (*it).c_str(), &n_pu_);
47  it = std::find(branches.begin(),branches.end(),"nTruePileup"); if ( it != branches.end() ) t_event_ -> SetBranchAddress( (*it).c_str(), &n_true_pu_);
48 
49  it = std::find(branches.begin(),branches.end(),"lumiPileup"); if ( it != branches.end() ) t_event_ -> SetBranchAddress( (*it).c_str(), &lumi_pu_);
50  it = std::find(branches.begin(),branches.end(),"instantLumi"); if ( it != branches.end() ) t_event_ -> SetBranchAddress( (*it).c_str(), &inst_lumi_);
51 
52  it = std::find(branches.begin(),branches.end(),"genWeight"); if ( it != branches.end() ) t_event_ -> SetBranchAddress( (*it).c_str(), &genWeight_);
53  it = std::find(branches.begin(),branches.end(),"genScale"); if ( it != branches.end() ) t_event_ -> SetBranchAddress( (*it).c_str(), &genScale_);
54  it = std::find(branches.begin(),branches.end(),"pdfid1"); if ( it != branches.end() ) t_event_ -> SetBranchAddress( (*it).c_str(), &pdf_.id.first);
55  it = std::find(branches.begin(),branches.end(),"pdfid2"); if ( it != branches.end() ) t_event_ -> SetBranchAddress( (*it).c_str(), &pdf_.id.second);
56  it = std::find(branches.begin(),branches.end(),"pdfx1"); if ( it != branches.end() ) t_event_ -> SetBranchAddress( (*it).c_str(), &pdf_.x.first);
57  it = std::find(branches.begin(),branches.end(),"pdfx2"); if ( it != branches.end() ) t_event_ -> SetBranchAddress( (*it).c_str(), &pdf_.x.second);
58 
59  it = std::find(branches.begin(),branches.end(),"rho"); if ( it != branches.end() ) t_event_ -> SetBranchAddress( (*it).c_str(), &rho_);
60 
61 // t_event_ -> SetBranchAddress("nPileup", &n_pu_);
62 // t_event_ -> SetBranchAddress("nTruePileup", &n_true_pu_);
63 
64  nevents_ = t_event_ -> GetEntries();
65 
66  t_event_ -> GetEntry(1); // Check whether it's mc simulation
67  if (run_ == 1) { // A bit stupid, but it's only solution that I found for the moment
68  is_mc_ = true;
69  } else {
70  is_mc_ = false;
71  }
72 
73  btageff_algo_ = "";
74  btageff_flavour_ = "";
75 
76  mylumi_= -1.;
77 
78 
79  //if(is_mc_) crossSection();
80 
81 }
82 
84 {
85  // do anything here that needs to be done at desctruction time
86  // (e.g. close files, deallocate resources etc.)
87 }
88 
89 
90 //
91 // member functions
92 //
93 // ------------ method called for each event ------------
94 void Analysis::event(const int & event, const bool & addCollections)
95 {
96  // Initialisation for backward compatibility
97  n_pu_ = -1;
98  n_true_pu_ = -1;
99 
100  genWeight_ = -1.;
101  genScale_ = -1.;
102  pdf_.id.first = 0;
103  pdf_.id.second = 0;
104  pdf_.x.first = -1.;
105  pdf_.x.second = -1.;
106 
107  t_event_ -> GetEntry(event);
108  if ( !addCollections) return;
109 
110  for ( auto & tree : t_any_ )
111  {
112  std::string name = tree.first;
113  std::string type = t_type_[name];
114  if ( type == "Jet" ) this->addCollection<Jet>(name);
115  if ( type == "Muon" ) this->addCollection<Muon>(name);
116  if ( type == "GenJet" ) this->addCollection<GenJet>(name);
117  if ( type == "MET" ) this->addCollection<MET>(name);
118  if ( type == "Vertex" ) this->addCollection<Vertex>(name);
119  if ( type == "TriggerObject" ) this->addCollection<TriggerObject>(name);
120  if ( type == "GenParticle" ) this->addCollection<GenParticle>(name);
121  if ( type == "Candidate" ) this->addCollection<Candidate>(name);
122  if ( type == "JetTag" ) this->addCollection<JetTag>(name);
123  if ( type == "L1TMuon" ) this->addCollection<L1TMuon>(name);
124  if ( type == "L1TJet" ) this->addCollection<L1TJet>(name);
125  if ( type == "RecoMuon" ) this->addCollection<RecoMuon>(name);
126  if ( type == "RecoTrack" ) this->addCollection<RecoTrack>(name);
127  }
128 
129 }
130 
131 
132 
133 // ===========================================================
134 // =============== Trees =================
135 // ===========================================================
136 void Analysis::treeInit_(const std::string & unique_name, const std::string & path)
137 {
138  std::string treeTitle = ((TTree*) t_event_->GetFile()->Get(path.c_str())) -> GetTitle();
139  tree_[unique_name] = new TChain(path.c_str(),treeTitle.c_str());
140  tree_[unique_name] -> AddFileInfoList(fileList_);
141  t_event_ -> AddFriend(tree_[unique_name]);
142 
143  treeTitle.erase(std::remove(treeTitle.begin(),treeTitle.end(),' '),treeTitle.end());
144  std::string classname = treeTitle.substr(0,treeTitle.find_first_of("|"));
145  std::string inputTag = treeTitle.substr(treeTitle.find_first_of("|")+1);
146 
147 }
148 // See Analysis.h for the implementations related to template trees
149 
150 
151 // ===========================================================
152 // =============== Collections =================
153 // ===========================================================
154 
155 // See also Analysis.h for the implementations related to template collections
156 
157 //}
158 // ===========================================================
159 // =============== Method for Trigger Results=================
160 // ===========================================================
161 
162 bool Analysis::triggerResults(const std::string & path)
163 {
164  t_triggerResults_ = new TChain(path.c_str());
165  int ok = t_triggerResults_ -> AddFileInfoList(fileList_);
166  t_event_ -> AddFriend(t_triggerResults_);
167  if ( ok == 0 )
168  {
169  std::cout << "tree does not exist" << std::endl;
170  return false;
171  }
172  TObjArray * triggerBranches = t_triggerResults_ -> GetListOfBranches();
173  for ( int i = 0 ; i < triggerBranches->GetEntries() ; ++i )
174  {
175  std::string branch = triggerBranches->At(i)->GetName();
176  if ( TString(branch).BeginsWith("ps") )
177  {
178  triggerResultsPS_[branch] = 1;
179  t_triggerResults_ -> SetBranchAddress(branch.c_str(), &triggerResultsPS_[branch]);
180  }
181  else
182  {
183  triggerResults_[branch] = 0;
184  t_triggerResults_ -> SetBranchAddress(branch.c_str(), &triggerResults_[branch]);
185  }
186  }
187  return true;
188 }
189 
190 bool Analysis::triggerResult(const std::string & trig)
191 {
192  if ( trig == "" ) return true;
193  if ( t_triggerResults_ == NULL ) return false;
194  return triggerResults_[trig];
195 }
196 
197 int Analysis::triggerPrescale(const std::string & trig)
198 {
199 // if ( t_triggerResults_ == NULL ) return -1.;
200  return triggerResultsPS_["ps_"+trig];
201 }
202 
203 std::map<std::string,int> Analysis::triggerPrescale(const std::vector<std::string> & trigs)
204 {
205  std::map<std::string,int> ps;
206  for ( auto & trig : trigs )
207  {
208  ps[trig] = triggerPrescale(trig);
209  }
210  return ps;
211 }
212 
213 
214 // ===========================================================
215 // ================= METADATA ============================
216 // ===========================================================
217 // ===========================================================
218 // ------------ methods called for metadata ------------
219 int Analysis::crossSections(const std::string & path)
220 {
221  if ( path == "" ) return -2;
222  t_xsection_ = new TChain(path.c_str());
223  int ok = t_xsection_ -> AddFileInfoList(fileList_);
224  if ( ok == 0 )
225  {
226  std::cout << "tree does not exist" << std::endl;
227  return -1;
228  }
229  TObjArray * xsecBranches = t_xsection_->GetListOfBranches();
230  for ( int i = 0 ; i < xsecBranches->GetEntries() ; ++i )
231  {
232  std::string branch = xsecBranches->At(i)->GetName();
233  if ( branch == "run" ) continue;
234  xsections_[branch] = 0;
235  t_xsection_ -> SetBranchAddress(branch.c_str(), &xsections_[branch]);
236  }
237  t_xsection_ -> GetEntry(0);
238  return 0;
239 }
240 
242 {
243  return this -> crossSection("crossSection");
244 }
245 double Analysis::crossSection(const std::string & xs)
246 {
247  if ( t_xsection_ == NULL ) return -1.;
248  return xsections_[xs];
249 }
250 
252 {
253  return (nevents_ / this -> crossSection() );
254 }
255 
256 double Analysis::luminosity(const std::string & xs)
257 {
258  if ( t_xsection_ == NULL ) return -1.;
259  return (nevents_ / this -> crossSection(xs));
260 }
261 
262 float Analysis::scaleLuminosity(const float & lumi)
263 {
264  float lumiScale = 1.;
265  mylumi_ = lumi;
266  if ( mylumi_ < 0 ) return lumiScale;
267 
268  lumiScale = mylumi_/this->luminosity();
269  return lumiScale;
270 
271 }
272 
274 {
275  std::cout << "=======================================================" << std::endl;
276  std::cout << " CROSS SECTIONS" << std::endl;
277  std::cout << "=======================================================" << std::endl;
278  if ( t_xsection_ == NULL )
279  {
280  std::cout << "No cross section tree has been declared." << std::endl;
281  std::cout << "=======================================================" << std::endl;
282  std::cout << std::endl;
283  std::cout << std::endl;
284  return;
285  }
286 
287  for ( auto& xs : xsections_ )
288  {
289  std::cout << xs.first << " = " << xs.second << " pb " << std::endl;
290  }
291  std::cout << "=======================================================" << std::endl;
292  std::cout << std::endl;
293  std::cout << std::endl;
294 }
295 
296 FilterResults Analysis::generatorFilter(const std::string & path)
297 {
298  t_genfilter_ = new TChain(path.c_str());
299  t_genfilter_ -> AddFileInfoList(fileList_);
300 
301  unsigned int ntotal;
302  unsigned int nfiltered;
303  unsigned int sumtotal = 0;
304  unsigned int sumfiltered = 0;
305 
306  t_genfilter_ -> SetBranchAddress("nEventsTotal", &ntotal);
307  t_genfilter_ -> SetBranchAddress("nEventsFiltered", &nfiltered);
308 
309  for ( int i = 0; i < t_genfilter_->GetEntries(); ++i )
310  {
311  t_genfilter_ -> GetEntry(i);
312  sumtotal += ntotal;
313  sumfiltered += nfiltered;
314  }
315 
316 
317  genfilter_.total = sumtotal;
318  genfilter_.filtered = sumfiltered;
319  genfilter_.efficiency = float(sumfiltered)/sumtotal;
320 
321  return genfilter_;
322 }
323 
325 {
326  std::cout << "=======================================================" << std::endl;
327  std::cout << " GENERATOR FILTER" << std::endl;
328  std::cout << "=======================================================" << std::endl;
329  if ( t_genfilter_ == NULL )
330  {
331  std::cout << "No generator tree has been declared." << std::endl;
332  std::cout << "=======================================================" << std::endl;
333  std::cout << std::endl;
334  std::cout << std::endl;
335  return;
336  }
337  std::cout << "Total generated events = " << genfilter_.total << std::endl;
338  std::cout << "Filtered generated events = " << genfilter_.filtered << std::endl;
339  std::cout << "Generator Filter Efficiency = " << genfilter_.efficiency << std::endl;
340 
341  std::cout << "=======================================================" << std::endl;
342  std::cout << std::endl;
343  std::cout << std::endl;
344 
345 
346 }
347 
348 FilterResults Analysis::eventFilter(const std::string & path)
349 {
350  t_evtfilter_ = new TChain(path.c_str());
351  t_evtfilter_ -> AddFileInfoList(fileList_);
352 
353  unsigned int ntotal;
354  unsigned int nfiltered;
355  unsigned int sumtotal = 0;
356  unsigned int sumfiltered = 0;
357 
358  t_evtfilter_ -> SetBranchAddress("nEventsTotal", &ntotal);
359  t_evtfilter_ -> SetBranchAddress("nEventsFiltered", &nfiltered);
360 
361  for ( int i = 0; i < t_evtfilter_->GetEntries(); ++i )
362  {
363  t_evtfilter_ -> GetEntry(i);
364  sumtotal += ntotal;
365  sumfiltered += nfiltered;
366  }
367 
368 
369  evtfilter_.total = sumtotal;
370  evtfilter_.filtered = sumfiltered;
371  evtfilter_.efficiency = float(sumfiltered)/sumtotal;
372 
373  return evtfilter_;
374 }
375 
376 
377 
378 int Analysis::processJsonFile(const std::string & fileName)
379 {
380  using boost::property_tree::ptree;
381  ptree pt;
382  read_json(fileName , pt);
383 
384  for (auto & element: pt)
385  {
386  int run = std::stoi(element.first);
387  std::vector<int> lumiranges;
388  for ( auto & property_array : element.second )
389  {
390  for ( auto & property : property_array.second )
391  {
392  lumiranges.push_back(property.second.get_value<int>());
393  }
394  }
395  if ( lumiranges.size()%2 != 0 ) return -1;
396 // std::sort(lumiranges.begin(), lumiranges.end()); // not really needed
397 
398  json_[run] = lumiranges;
399  }
400  return 0;
401 }
402 
404 {
405  bool isGood = false;
406 
407  std::vector<int> lumiranges = json_[run_];
408  for ( size_t i = 0 ; i< lumiranges.size() ; i += 2 )
409  {
410  if ( lumi_ >= lumiranges.at(i) && lumi_ <= lumiranges.at(i+1) ) isGood = true;
411  }
412  return isGood;
413 }
414 
415 
416 void Analysis::addBtagEfficiencies(const std::string & filename)
417 {
418  fileBtagEff_ = new TFile(filename.c_str(),"OLD");
419  std::string ftitle = fileBtagEff_->GetTitle();
420  std::vector<std::string> field;
421  if ( ftitle != "" )
422  {
423  boost::split(field, ftitle, boost::is_any_of(":"));
424  btageff_flavour_ = field[0];
425  btageff_algo_ = field[1];
426  }
427 
428  TList * mylist = fileBtagEff_->GetListOfKeys();
429  for ( int i = 0 ; i < mylist->GetSize() ; ++i )
430  {
431  std::string className = ((TKey*) mylist -> At(i)) -> GetClassName();
432  std::string objName = ((TKey*) mylist -> At(i)) -> GetName();
433  if ( className == "TH2F" )
434  h2_btageff_[objName] = (TH2F*) fileBtagEff_->Get(objName.c_str());
435 // if ( className == "TH2D" )
436 // h2_btageff_[objName] = (TH2D*) fileBtagEff_->Get(objName.c_str());
437  }
438 
439 }
440 
441 float Analysis::btagEfficiency(const analysis::tools::Jet & jet, const int & rank)
442 {
443  float eff = 0.;
444  std::string flav;
445  std::string srank;
446  if ( rank < 1 ) srank = "";
447  else srank = Form("%i",rank);
448  if ( btageff_flavour_ == "Extended" || btageff_flavour_ == "extended" )
449  {
450  flav = jet.extendedFlavour();
451  if ( flav == "udsg" ) flav = "l";
452  }
453  else
454  {
455  int iflav = jet.flavour(btageff_flavour_);
456  if ( abs(iflav) == 5 ) flav = "b";
457  if ( abs(iflav) == 4 ) flav = "c";
458  if ( abs(iflav) < 4 || iflav == 21 ) flav = "l";
459  }
460  float pt = jet.pt();
461  float eta = fabs(jet.eta());
462 
463  std::string hname = Form("h_%sjet%s_eff_pt_eta",flav.c_str(),srank.c_str());
464 
465  int bin = h2_btageff_[hname] -> FindBin(pt,eta);
466 
467  eff = h2_btageff_[hname] -> GetBinContent(bin);
468 
469  return eff;
470 }
471 
472 // Way to get the Trigger names independent of Run period
473 /*
474 void triggerNames(std::string &trueTriggerNames,const char *myTriggerNames, TTree * t_Trig)
475 {
476  TObjArray *mycopy = (TObjArray *)t_Trig->GetListOfBranches()->Clone();
477  TString names;
478 
479  for (int i = 0; i < mycopy -> GetEntries(); ++i)
480  {
481  names = mycopy->At(i)->GetName();
482  if( names.Contains(myTriggerNames) ) trueTriggerNames = (std::string)mycopy->At(i)->GetName();
483  std::cout<<"name = "<<names<<std::endl;
484  }
485 
486 }
487 */
488 
489 std::shared_ptr<JetResolutionInfo> Analysis::jetResolutionInfo(const std::string & f_jer, const std::string & f_jersf)
490 {
491  JetResolution res = JetResolution(f_jer);
493  jerinfo_ = std::make_shared<JetResolutionInfo>(JetResolutionInfo{res,sf});
494  return jerinfo_;
495 }
496 
497 std::shared_ptr<PileupWeight> Analysis::pileupWeights(const std::string & f_pu)
498 {
499  puweights_ = std::make_shared<PileupWeight>(PileupWeight(f_pu));
500  return puweights_;
501 }
502 
503 
504 std::shared_ptr<MuonIdWeight> Analysis::muonIDWeights(const std::string & f_muID )
505 {
506  muonIDweights_ = std::make_shared<MuonIdWeight>(MuonIdWeight(f_muID));
507  return muonIDweights_;
508 }
509 
510 
511 std::shared_ptr<BTagCalibrationReader> Analysis::btagCalibration(const std::string & tagger,
512  const std::string & filename,
513  const std::string & wp,
514  const std::string & sysType,
515  const std::vector<std::string> & otherSysTypes)
516 {
517  std::string wps = wp;
518  std::transform(wps.begin(), wps.end(), wps.begin(), ::tolower);
519 
521  if ( wps == "loose" ) op = BTagEntry::OP_LOOSE;
522  if ( wps == "medium" ) op = BTagEntry::OP_MEDIUM;
523  if ( wps == "tight" ) op = BTagEntry::OP_TIGHT;
524  if ( wps == "reshape" ) op = BTagEntry::OP_RESHAPING;
525 
526  btagcalib_ = std::shared_ptr<BTagCalibration> ( new BTagCalibration(tagger,filename));
527  btagcalibread_ = std::shared_ptr<BTagCalibrationReader>( new BTagCalibrationReader(op,sysType,otherSysTypes) );
528 
529 
530  btagcalibread_ -> load(*btagcalib_, // calibration instance
531  BTagEntry::FLAV_B, // btag flavour - B
532  "comb"); // measurement type
533 
534  btagcalibread_ -> load(*btagcalib_, // calibration instance
535  BTagEntry::FLAV_C, // btag flavour - C
536  "comb"); // measurement type
537 
538  btagcalibread_ -> load(*btagcalib_, // calibration instance
539  BTagEntry::FLAV_UDSG, // btag flavour - UDSG
540  "incl"); // measurement type
541 
542 
543  return btagcalibread_;
544 
545 }
546 
547 
548 std::shared_ptr<BTagCalibrationReader> Analysis::btagCalibration()
549 {
550  return btagcalibread_;
551 }
552 
553 std::string Analysis::fileName()
554 {
555  std::string filename;
556  filename = boost::filesystem::basename(this->fileFullName())+boost::filesystem::extension(this->fileFullName());
557  return filename ;
558 }
559 
560 
561 int Analysis::seed(const std::string & name)
562 {
563  int seed = 1;
564  std::ifstream f(name.c_str(),std::ios_base::in);
565  if ( ! f.good() ) return -1;
566 
567  f >> seed;
568  f.close();
569  if ( seed < 1 ) return -1;
570 
571  return seed;
572 }
float eta() const
returns the pseudorapidity
Definition: Candidate.cc:134
std::shared_ptr< PileupWeight > puweights_
Definition: Analysis.h:197
std::map< std::string, double > xsections_
Definition: Analysis.h:203
std::shared_ptr< JetResolutionInfo > jerinfo_
Definition: Analysis.h:194
std::string fileName()
Definition: Analysis.cc:553
std::shared_ptr< BTagCalibrationReader > btagcalibread_
Definition: Analysis.h:192
int crossSections(const std::string &path)
Definition: Analysis.cc:219
int seed(const std::string &)
seed for random number generator read from a txt file given as a parameter
Definition: Analysis.cc:561
std::string fileFullName()
Definition: Analysis.h:397
FilterResults eventFilter(const std::string &path)
Definition: Analysis.cc:348
std::string extendedFlavour() const
returns the extended flavour definition
Definition: Jet.cc:66
FilterResults generatorFilter(const std::string &path)
Definition: Analysis.cc:296
std::map< std::string, TH2F * > h2_btageff_
Definition: Analysis.h:187
std::shared_ptr< PhysicsObjectTree< Object > > tree(const std::string &unique_name)
Definition: Analysis.h:286
std::pair< double, double > x
std::map< std::string, std::string > t_type_
Definition: Analysis.h:246
int triggerPrescale(const std::string &trig)
Definition: Analysis.cc:197
std::shared_ptr< MuonIdWeight > muonIDweights_
Definition: Analysis.h:200
std::map< std::string, TChain * > tree_
Definition: Analysis.h:242
std::string inputFilelist_
Definition: Analysis.h:180
Analysis(const std::string &inputFilelist, const std::string &evtinfo="MssmHbb/Events/EventInfo")
Definition: Analysis.cc:25
std::map< int, std::vector< int > > json_
Definition: Analysis.h:255
int flavour() const
returns the flavour with the Hadron definition (=0 for data)
Definition: Jet.cc:58
std::shared_ptr< BTagCalibration > btagcalib_
Definition: Analysis.h:191
int processJsonFile(const std::string &fileName="goodJson.txt")
Definition: Analysis.cc:378
bool triggerResult(const std::string &trig)
Definition: Analysis.cc:190
std::string btageff_algo_
Definition: Analysis.h:189
std::string btageff_flavour_
Definition: Analysis.h:188
std::pair< int, int > id
float pt() const
returns the transverse momentum
Definition: Candidate.cc:133
bool triggerResults(const std::string &path)
Definition: Analysis.cc:162
FilterResults evtfilter_
Definition: Analysis.h:208
TCollection * fileList_
Definition: Analysis.h:179
TFile * f[10]
Definition: PlotsCompare.cc:24
std::shared_ptr< PileupWeight > pileupWeights(const std::string &)
Definition: Analysis.cc:497
std::map< std::string, int > triggerResultsPS_
Definition: Analysis.h:205
float scaleLuminosity(const float &lumi)
Definition: Analysis.cc:262
std::map< std::string, std::any > t_any_
Definition: Analysis.h:245
std::shared_ptr< JetResolutionInfo > jetResolutionInfo(const std::string &, const std::string &)
Definition: Analysis.cc:489
std::shared_ptr< BTagCalibrationReader > btagCalibration()
Definition: Analysis.cc:548
std::shared_ptr< MuonIdWeight > muonIDWeights(const std::string &)
Definition: Analysis.cc:504
void treeInit_(const std::string &unique_name, const std::string &path)
Definition: Analysis.cc:136
void addBtagEfficiencies(const std::string &)
Definition: Analysis.cc:416
float btagEfficiency(const analysis::tools::Jet &, const int &rank=0)
Definition: Analysis.cc:441
TFileCollection * fileCollection_
Definition: Analysis.h:178
FilterResults genfilter_
Definition: Analysis.h:207
std::map< std::string, bool > triggerResults_
Definition: Analysis.h:204