CMS 3D CMS Logo

HLTTauDQMTagAndProbePlotter.cc
Go to the documentation of this file.
5 
6 #include <boost/algorithm/string.hpp>
7 #include "Math/GenVector/VectorUtil.h"
8 
9 namespace {
10  std::string stripVersion(const std::string& pathName) {
11  size_t versionStart = pathName.rfind("_v");
12  if(versionStart == std::string::npos)
13  return pathName;
14  return pathName.substr(0, versionStart);
15  }
16 }
17 
18 //HLTTauDQMTagAndProbePlotter::HLTTauDQMTagAndProbePlotter(const edm::ParameterSet& iConfig, std::unique_ptr<GenericTriggerEventFlag> numFlag, std::unique_ptr<GenericTriggerEventFlag> denFlag, const std::string& dqmBaseFolder) :
19 HLTTauDQMTagAndProbePlotter::HLTTauDQMTagAndProbePlotter(const edm::ParameterSet& iConfig, const std::vector<std::string>& modLabels, const std::string& dqmBaseFolder) :
20  HLTTauDQMPlotter(stripVersion(iConfig.getParameter<std::string>("name")), dqmBaseFolder),
21  nbinsPt_(iConfig.getParameter<int>("nPtBins")),
22  ptmin_(iConfig.getParameter<double>("ptmin")),
23  ptmax_(iConfig.getParameter<double>("ptmax")),
24  nbinsPhi_(iConfig.getParameter<int>("nPhiBins")),
25  phimin_(iConfig.getParameter<double>("phimin")),
26  phimax_(iConfig.getParameter<double>("phimax")),
27  xvariable(iConfig.getParameter<std::string>("xvariable"))
28 {
29  numTriggers = iConfig.getParameter<edm::ParameterSet>("numerator").getParameter<std::vector<std::string> >("hltPaths");
30  denTriggers = iConfig.getParameter<edm::ParameterSet>("denominator").getParameter<std::vector<std::string> >("hltPaths");
31 
32  moduleLabels = modLabels;
33 
34  boost::algorithm::to_lower(xvariable);
35 
36  if(xvariable!="met"){
37  nbinsEta_ = iConfig.getParameter<int>("nEtaBins");
38  etamin_ = iConfig.getParameter<double>("etamin");
39  etamax_ = iConfig.getParameter<double>("etamax");
40  }
41 
42  nOfflineObjs = iConfig.getUntrackedParameter<unsigned int>("nOfflObjs",1);
43 }
44 
45 #include <algorithm>
47  if(!isValid())
48  return;
49 
50  // Efficiency helpers
51  iBooker.setCurrentFolder(triggerTag()+"/helpers");
52  h_num_pt = iBooker.book1D(xvariable+"EtEffNum", "", nbinsPt_, ptmin_, ptmax_);
53  h_den_pt = iBooker.book1D(xvariable+"EtEffDenom", "", nbinsPt_, ptmin_, ptmax_);
54 
55  if(xvariable != "met"){
56  h_num_eta = iBooker.book1D(xvariable+"EtaEffNum", "", nbinsEta_, etamin_, etamax_);
57  h_den_eta = iBooker.book1D(xvariable+"EtaEffDenom", "", nbinsEta_, etamin_, etamax_);
58 
59  h_num_etaphi = iBooker.book2D(xvariable+"EtaPhiEffNum", "", nbinsEta_, etamin_, etamax_, nbinsPhi_, phimin_, phimax_);
60  h_den_etaphi = iBooker.book2D(xvariable+"EtaPhiEffDenom", "", nbinsEta_, etamin_, etamax_, nbinsPhi_, phimin_, phimax_);
61  h_den_etaphi->getTH2F()->SetOption("COL");
62  }
63 
64  h_num_phi = iBooker.book1D(xvariable+"PhiEffNum", "", nbinsPhi_, phimin_, phimax_);
65  h_den_phi = iBooker.book1D(xvariable+"PhiEffDenom", "", nbinsPhi_, phimin_, phimax_);
66 
67  iBooker.setCurrentFolder(triggerTag());
68 }
69 
70 
72 
75  const unsigned moduleIndex = moduleLabels.size()-2;
76 
77  const unsigned hltFilterIndex = triggerEvent.filterIndex(edm::InputTag(moduleLabels[moduleIndex],"","HLT"));
78 
79  if (hltFilterIndex < triggerEvent.sizeFilters()) {
80  const trigger::Keys& triggerKeys(triggerEvent.filterKeys(hltFilterIndex));
81  const trigger::Vids& triggerVids(triggerEvent.filterIds(hltFilterIndex));
82 
83  const unsigned nTriggers = triggerVids.size();
84  for (size_t iTrig = 0; iTrig < nTriggers; ++iTrig) {
85  const trigger::TriggerObject trigObject = trigObjs[triggerKeys[iTrig]];
86 // std::cout << " trigger objs pt,eta,phi: " << triggerKeys[iTrig] << " "
87 // << trigObject.pt() << " " << trigObject.eta() << " " << trigObject.phi() << " " << trigObject.id() << std::endl;
88  return LV(trigObject.px(),trigObject.py(),trigObject.pz(),trigObject.energy());
89  }
90  }
91  return LV(0,0,0,0);
92 }
93 
95  std::vector<LV> offlineObjects;
96  if(xvariable == "tau") offlineObjects = refCollection.taus;
97  if(xvariable == "muon") offlineObjects = refCollection.muons;
98  if(xvariable == "electron") offlineObjects = refCollection.electrons;
99  if(xvariable == "met") offlineObjects = refCollection.met;
100 
101  if(offlineObjects.size() < nOfflineObjs) return;
102 
103  const edm::TriggerNames& trigNames = iEvent.triggerNames(triggerResults);
104 
105  for(const LV& offlineObject: offlineObjects) {
106  // Filter out events if Trigger Filtering is requested
107  bool passTrigger = false;
108  bool hltMatched = false;
109  for ( size_t i = 0; i < denTriggers.size(); ++i){
110  LV trgObject = findTrgObject(denTriggers[i],triggerEvent);
111 
112  for ( unsigned int hltIndex = 0; hltIndex < trigNames.size(); ++hltIndex){
113  passTrigger = (trigNames.triggerName(hltIndex).find(denTriggers[i]) != std::string::npos && triggerResults.wasrun(hltIndex) && triggerResults.accept(hltIndex));
114 
115  if (passTrigger) {
116  double dr = ROOT::Math::VectorUtil::DeltaR(trgObject,offlineObject);
117  if(dr < 0.4) hltMatched = true;
118  break;
119  }
120  }
121  if (passTrigger) break;
122  }
123  if(!passTrigger) return;
124  if(hltMatched) return; // do not consider offline objects which match the tag trigger
125 
126  h_den_pt->Fill(offlineObject.pt());
127  if(xvariable != "met"){
128  h_den_eta->Fill(offlineObject.eta());
129  h_den_etaphi->Fill(offlineObject.eta(),offlineObject.phi());
130  }
131  h_den_phi->Fill(offlineObject.phi());
132 
133  // applying selection for numerator
134  passTrigger = false;
135  for ( size_t i = 0; i < numTriggers.size(); ++i){
136  for ( unsigned int hltIndex = 0; hltIndex < trigNames.size(); ++hltIndex){
137  passTrigger = (trigNames.triggerName(hltIndex).find(numTriggers[i]) != std::string::npos && triggerResults.wasrun(hltIndex) && triggerResults.accept(hltIndex));
138  if (passTrigger) break;
139  }
140  if (passTrigger) break;
141  }
142  if(!passTrigger) return;
143 
144  h_num_pt->Fill(offlineObject.pt());
145  if(xvariable != "met"){
146  h_num_eta->Fill(offlineObject.eta());
147  h_num_etaphi->Fill(offlineObject.eta(),offlineObject.phi());
148  }
149  h_num_phi->Fill(offlineObject.phi());
150 
151 
152  }
153 }
bool isValid() const
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
std::vector< std::string > moduleLabels
bool wasrun() const
Was at least one path run?
std::vector< LV > electrons
The single EDProduct to be saved for each event (AOD case)
Definition: TriggerEvent.h:25
trigger::size_type sizeFilters() const
Definition: TriggerEvent.h:135
LV findTrgObject(std::string, const trigger::TriggerEvent &)
std::vector< LV > taus
void bookHistograms(DQMStore::IBooker &iBooker, edm::Run const &iRun, edm::EventSetup const &iSetup)
math::XYZTLorentzVectorD LV
std::vector< std::string > numTriggers
bool accept() const
Has at least one path accepted the event?
const Keys & filterKeys(trigger::size_type index) const
Definition: TriggerEvent.h:111
trigger::size_type filterIndex(const edm::InputTag &filterTag) const
find index of filter in data-member vector from filter tag
Definition: TriggerEvent.h:123
const std::string & triggerTag() const
float energy() const
Definition: TriggerObject.h:65
Strings::size_type size() const
Definition: TriggerNames.cc:31
void Fill(long long x)
Single trigger physics object (e.g., an isolated muon)
Definition: TriggerObject.h:22
const Vids & filterIds(trigger::size_type index) const
Definition: TriggerEvent.h:110
int iEvent
Definition: GenABIO.cc:224
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:268
const TriggerObjectCollection & getObjects() const
Definition: TriggerEvent.h:98
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:106
static std::string const triggerResults
Definition: EdmProvDump.cc:45
std::vector< LV > met
TH2F * getTH2F() const
std::vector< TriggerObject > TriggerObjectCollection
collection of trigger physics objects (e.g., all isolated muons)
Definition: TriggerObject.h:81
static const char *const trigNames[]
Definition: EcalDumpRaw.cc:74
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:109
std::string const & triggerName(unsigned int index) const
Definition: TriggerNames.cc:22
std::vector< size_type > Keys
HLTTauDQMTagAndProbePlotter(const edm::ParameterSet &iConfig, const std::vector< std::string > &modLabels, const std::string &dqmBaseFolder)
std::vector< std::string > denTriggers
void analyze(edm::Event const &iEvent, const edm::TriggerResults &triggerResults, const trigger::TriggerEvent &triggerEvent, const HLTTauDQMOfflineObjects &refCollection)
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
Definition: Event.cc:256
std::vector< int > Vids
Definition: Run.h:45
std::vector< LV > muons