CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HLTTauDQMPath.cc
Go to the documentation of this file.
3 
5 
10 
11 #include<cstdio>
12 #include<sstream>
13 #include<algorithm>
14 
15 namespace {
16  // Used as a helper only in this file
17  class HLTPath {
18  public:
19  HLTPath(const std::string& name):
20  name_(name)
21  {}
22 
23  typedef HLTTauDQMPath::FilterIndex FilterIndex;
26  bool> FilterIndexSave;
27 
28  constexpr static size_t kName = HLTTauDQMPath::kName;
29  constexpr static size_t kModuleIndex = HLTTauDQMPath::kModuleIndex;
30  constexpr static size_t kSaveTags = 2;
31 
32  std::vector<FilterIndex> interestingFilters(const HLTConfigProvider& HLTCP, bool doRefAnalysis) {
33  const std::vector<std::string>& moduleLabels = HLTCP.moduleLabels(name_);
34  std::vector<std::string> leptonTauFilters;
35  allInterestingFilters_.clear();
36 
37  // Ignore all "Selector"s, for ref-analysis keep only those with saveTags=True
38  // Also record HLT2(Electron|Muon)(PF)?Tau module names
39  LogTrace("HLTTauDQMOffline") << "Path " << name_ << ", list of all filters (preceded by the module index in the path)";
40  for(std::vector<std::string>::const_iterator iLabel = moduleLabels.begin(); iLabel != moduleLabels.end(); ++iLabel) {
41  if(HLTCP.moduleEDMType(*iLabel) != "EDFilter")
42  continue;
43  const std::string type = HLTCP.moduleType(*iLabel);
44  LogTrace("HLTTauDQMOffline") << " " << std::distance(moduleLabels.begin(), iLabel) << " " << *iLabel << " " << type << " saveTags " << HLTCP.saveTags(*iLabel);
45  if(type.find("Selector") != std::string::npos)
46  continue;
47  if(type == "HLTTriggerTypeFilter" || type == "HLTBool")
48  continue;
49  if(type == "HLT2PhotonPFTau" || type == "HLT2ElectronPFTau" || type == "HLT2MuonPFTau" || type == "HLT2PhotonTau" || type == "HLT2ElectronTau" || type == "HLT2MuonTau")
50  leptonTauFilters.emplace_back(*iLabel);
51  else if(type.find("Electron") != std::string::npos || type.find("Egamma") != std::string::npos || type.find("Muon") != std::string::npos)
52  continue;
53  allInterestingFilters_.emplace_back(*iLabel, iLabel-moduleLabels.begin(), HLTCP.saveTags(*iLabel));
54  }
55 
56  // Insert the last filters of lepton legs
57  for(const std::string& leptonTauLabel: leptonTauFilters) {
58  const edm::ParameterSet& pset = HLTCP.modulePSet(leptonTauLabel);
59  std::string input1 = pset.getParameter<edm::InputTag>("inputTag1").label();
60  std::string input2 = pset.getParameter<edm::InputTag>("inputTag2").label();
61  unsigned idx1 = HLTCP.moduleIndex(name_, input1);
62  unsigned idx2 = HLTCP.moduleIndex(name_, input2);
63 
64  auto func = [&](const FilterIndexSave& a, unsigned idxb) {
65  return std::get<kModuleIndex>(a) < idxb;
66  };
67  std::vector<FilterIndexSave>::iterator found = std::lower_bound(allInterestingFilters_.begin(), allInterestingFilters_.end(), idx1, func);
68  if(found == allInterestingFilters_.end() || std::get<kModuleIndex>(*found) != idx1)
69  allInterestingFilters_.emplace(found, input1, idx1, HLTCP.saveTags(input1));
70  found = std::lower_bound(allInterestingFilters_.begin(), allInterestingFilters_.end(), idx2, func);
71  if(found == allInterestingFilters_.end() || std::get<kModuleIndex>(*found) != idx2)
72  allInterestingFilters_.emplace(found, input2, idx2, HLTCP.saveTags(input1));
73  }
74 
75  std::vector<FilterIndex> selectedFilters;
76  // For reference-matched case exclude filters with saveTags=False.
77  // However, they are needed a bit later to find the position of the
78  // first L3 tau filter.
79  for(const auto& item: allInterestingFilters_) {
80  if(!doRefAnalysis || (doRefAnalysis && std::get<kSaveTags>(item)))
81  selectedFilters.emplace_back(std::get<kName>(item), std::get<kModuleIndex>(item));
82  }
83 
84  return selectedFilters;
85  }
86 
87  bool isL3TauProducer(const HLTConfigProvider& HLTCP, const std::string& producerLabel) const {
88  const std::string type = HLTCP.moduleType(producerLabel);
89  if(type == "PFRecoTauProducer" || type == "RecoTauPiZeroUnembedder") {
90  LogDebug("HLTTauDQMOffline") << "Found tau producer " << type << " with label " << producerLabel << " from path " << name_;
91  return true;
92  }
93  return false;
94  }
95 
96  bool isL3TauFilter(const HLTConfigProvider& HLTCP, const std::string& filterLabel) const {
97  const edm::ParameterSet& pset = HLTCP.modulePSet(filterLabel);
98  if(pset.exists("inputTag"))
99  return isL3TauProducer(HLTCP, pset.getParameter<edm::InputTag>("inputTag").label());
100  if(pset.exists("inputTag1"))
101  return isL3TauProducer(HLTCP, pset.getParameter<edm::InputTag>("inputTag1").label());
102  if(pset.exists("inputTag2"))
103  return isL3TauProducer(HLTCP, pset.getParameter<edm::InputTag>("inputTag2").label());
104  return false;
105  }
106 
107  size_t firstL3TauFilterIndex(const HLTConfigProvider& HLTCP) const {
108  // Loop over filters and check if a filter uses L3 tau producer
109  // output.
110  for(const auto& filter: allInterestingFilters_) {
111  if(isL3TauFilter(HLTCP, std::get<kName>(filter)))
112  return std::get<kModuleIndex>(filter);
113  }
115  }
116 
117  const std::string& name() const { return name_; }
118 
119  private:
120  std::string name_;
121 
122  std::vector<FilterIndexSave> allInterestingFilters_;
123  };
124 
125  int getParameterSafe(const HLTConfigProvider& HLTCP, const std::string& filterName, const std::string& parameterName) {
126  const edm::ParameterSet& pset = HLTCP.modulePSet(filterName);
127  if(pset.existsAs<int>(parameterName))
128  return pset.getParameter<int>(parameterName);
129  else {
130  edm::LogWarning("HLTTauDQMOfflineSource") << "No parameter '" << parameterName << "' in configuration of filter " << filterName << " pset " << pset.dump() << std::endl;
131  return 0;
132  }
133  }
134 
135  struct TauLeptonMultiplicity {
136  TauLeptonMultiplicity(): tau(0), electron(0), muon(0) {}
137  int tau;
138  int electron;
139  int muon;
140  };
141  TauLeptonMultiplicity inferTauLeptonMultiplicity(const HLTConfigProvider& HLTCP, const std::string& filterName, const std::string& moduleType, const std::string& pathName) {
142  TauLeptonMultiplicity n;
143 
144  if(moduleType == "HLTLevel1GTSeed") {
145  if(filterName.find("Single") != std::string::npos) {
146  if(filterName.find("Mu") != std::string::npos) {
147  n.muon = 1;
148  }
149  else if(filterName.find("EG") != std::string::npos) {
150  n.electron = 1;
151  }
152  }
153  else if(filterName.find("Double") != std::string::npos && filterName.find("Tau") != std::string::npos) {
154  n.tau = 2;
155  }
156  else if(filterName.find("Mu") != std::string::npos && filterName.find("Tau") != std::string::npos) {
157  n.muon = 1;
158  //n.tau = 1;
159  }
160  else if(filterName.find("EG") != std::string::npos && filterName.find("Tau") != std::string::npos) {
161  n.electron = 1;
162  //n.tau = 1;
163  }
164  }
165  else if(moduleType == "HLT1CaloJet" || moduleType == "HLT1PFJet") {
166  //const edm::ParameterSet& pset = HLTCP.modulePSet(filterName);
167  //pset.getParameter<int>("triggerType") == trigger::TriggerTau) {
168  if(getParameterSafe(HLTCP, filterName, "triggerType") == trigger::TriggerTau) {
169  //n.tau = pset.getParameter<int>("MinN");
170  n.tau = getParameterSafe(HLTCP, filterName, "MinN");
171  }
172  }
173  else if(moduleType == "HLTCaloJetTag") {
174  //const edm::ParameterSet& pset = HLTCP.modulePSet(filterName);
175  //if(pset.getParameter<int>("triggerType") == trigger::TriggerTau) {
176  if(getParameterSafe(HLTCP, filterName, "TriggerType") == trigger::TriggerTau) {
177  //n.tau = pset.getParameter<int>("MinJets");
178  n.tau = getParameterSafe(HLTCP, filterName, "MinJets");
179  }
180  }
181  else if(moduleType == "HLT1Tau" || moduleType == "HLT1PFTau") {
182  //n.tau = HLTCP.modulePSet(filterName).getParameter<int>("MinN");
183  n.tau = getParameterSafe(HLTCP, filterName, "MinN");
184  }
185  else if(moduleType == "HLTPFTauPairDzMatchFilter") {
186  n.tau = 2;
187  }
188  else if(moduleType == "HLTElectronGenericFilter" || moduleType == "HLTEgammaGenericFilter") {
189  //n.electron = HLTCP.modulePSet(filterName).getParameter<int>("ncandcut");
190  n.electron = getParameterSafe(HLTCP, filterName, "ncandcut");
191  }
192  else if(moduleType == "HLTMuonIsoFilter" || moduleType == "HLTMuonL3PreFilter") {
193  //n.muon = HLTCP.modulePSet(filterName).getParameter<int>("MinN");
194  n.muon = getParameterSafe(HLTCP, filterName, "MinN");
195  }
196  else if(moduleType == "HLT2ElectronTau" || moduleType == "HLT2ElectronPFTau" || moduleType == "HLT2PhotonTau" || moduleType == "HLT2PhotonPFTau") {
197  //int num = HLTCP.modulePSet(filterName).getParameter<int>("MinN");
198  int num = getParameterSafe(HLTCP, filterName, "MinN");
199  n.tau = num;
200  n.electron = num;
201  }
202  else if(moduleType == "HLT2MuonTau" || moduleType == "HLT2MuonPFTau") {
203  //int num = HLTCP.modulePSet(filterName).getParameter<int>("MinN");
204  int num = getParameterSafe(HLTCP, filterName, "MinN");
205  n.tau = num;
206  n.muon = num;
207  }
208  else if(moduleType == "HLTPrescaler" || moduleType == "HLT1CaloMET") {
209  // ignore
210  }
211  else {
212  edm::LogWarning("HLTTauDQMOfflineSource") << "HLTTauDQMPath.cc, inferTauLeptonMultiplicity(): module type '" << moduleType << "' not recognized, filter '" << filterName << "' in path '" << pathName << "' will be ignored for offline matching." << std::endl;
213  }
214 
215  return n;
216  }
217 
218  template <typename T1, typename T2>
219  bool deltaRmatch(const T1& obj, const std::vector<T2>& refColl, double dR, std::vector<bool>& refMask, std::vector<T2>& matchedRefs) {
220  double minDr = 2*dR;
221  size_t found = refColl.size();
222  //std::cout << "Matching with DR " << dR << ", obj eta " << obj.eta() << " phi " << obj.phi() << std::endl;
223  for(size_t i=0; i<refColl.size(); ++i) {
224  if(!refMask[i])
225  continue;
226 
227  double dr = reco::deltaR(obj, refColl[i]);
228  //std::cout << " " << i << " ref eta " << refColl[i].eta() << " phi " << refColl[i].phi() << " dr " << dr << std::endl;
229  if(dr < minDr) {
230  minDr = dr;
231  found = i;
232  }
233  }
234  if(found < refColl.size()) {
235  matchedRefs.emplace_back(refColl[found]);
236  refMask[found] = false;
237  return true;
238  }
239  return false;
240  }
241 }
242 
243 
244 HLTTauDQMPath::HLTTauDQMPath(const std::string& pathName, const std::string& hltProcess, bool doRefAnalysis, const HLTConfigProvider& HLTCP):
245  hltProcess_(hltProcess),
246  doRefAnalysis_(doRefAnalysis),
247  pathName_(pathName),
248  pathIndex_(HLTCP.triggerIndex(pathName_)),
249  lastFilterBeforeL2TauIndex_(0), lastL2TauFilterIndex_(0),
250  lastFilterBeforeL3TauIndex_(0), lastL3TauFilterIndex_(0),
251  isFirstL1Seed_(false),
252  isValid_(false)
253 {
254 #ifdef EDM_ML_DEBUG
255  std::stringstream ss;
256  ss << "HLTTauDQMPath: " << pathName_ << "\n";
257 #endif
258 
259  // Get the filters
260  HLTPath thePath(pathName_);
261  filterIndices_ = thePath.interestingFilters(HLTCP, doRefAnalysis_);
262  if(filterIndices_.empty()) {
263  edm::LogInfo("HLTTauDQMOffline") << "HLTTauDQMPath: " << pathName_ << " no interesting filters found";
264  return;
265  }
266  isFirstL1Seed_ = HLTCP.moduleType(std::get<kName>(filterIndices_[0])) == "HLTLevel1GTSeed";
267 #ifdef EDM_ML_DEBUG
268  ss << " Interesting filters (preceded by the module index in the path)";
269 #endif
270  // Set the filter multiplicity counts
271  filterTauN_.clear();
272  filterElectronN_.clear();
273  filterMuonN_.clear();
274  filterTauN_.reserve(filterIndices_.size());
275  filterElectronN_.reserve(filterIndices_.size());
276  filterMuonN_.reserve(filterIndices_.size());
277  for(size_t i=0; i<filterIndices_.size(); ++i) {
278  const std::string& filterName = std::get<kName>(filterIndices_[i]);
279  const std::string& moduleType = HLTCP.moduleType(filterName);
280 
281  TauLeptonMultiplicity n = inferTauLeptonMultiplicity(HLTCP, filterName, moduleType, pathName_);
282  filterTauN_.push_back(n.tau);
283  filterElectronN_.push_back(n.electron);
284  filterMuonN_.push_back(n.muon);
285 
286 #ifdef EDM_ML_DEBUG
287  ss << "\n " << std::get<kModuleIndex>(filterIndices_[i])
288  << " " << filterName
289  << " " << moduleType
290  << " ntau " << n.tau
291  << " nele " << n.electron
292  << " nmu " << n.muon;
293 #endif
294 
295  }
296 #ifdef EDM_ML_DEBUG
297  LogDebug("HLTTauDQMOffline") << ss.str();
298 #endif
299 
300 
301  // Find the position of tau producer, use filters with taus before
302  // it for L2 tau efficiency, and filters with taus after it for L3
303  // tau efficiency. Here we have to take into account that for
304  // reference-matched case filterIndices_ contains only those filters
305  // that have saveTags=True, while for searching the first L3 tau
306  // filter we have to consider all filters
307  const size_t firstL3TauFilterIndex = thePath.firstL3TauFilterIndex(HLTCP);
308  if(firstL3TauFilterIndex == kInvalidIndex) {
309  edm::LogInfo("HLTTauDQMOffline") << "Did not find a filter with L3 tau producer as input in path " << pathName_;
310  }
311 
316  size_t i = 0;
317  for(; i<filtersSize() && getFilterIndex(i) < firstL3TauFilterIndex; ++i) {
320  if(getFilterNTaus(i) > 0 && getFilterNElectrons(i) == 0 && getFilterNMuons(i) == 0)
322  }
324  for(; i<filtersSize(); ++i) {
327  if(getFilterNTaus(i) > 0 && getFilterNElectrons(i) == 0 && getFilterNMuons(i) == 0)
329  }
330  LogDebug("HLTTauDQMOffline") << "lastFilterBeforeL2 " << lastFilterBeforeL2TauIndex_
331  << " lastL2TauFilter " << lastL2TauFilterIndex_
332  << " lastFilterBeforeL3 " << lastFilterBeforeL3TauIndex_
333  << " lastL3TauFilter " << lastL3TauFilterIndex_;
334  isValid_ = true;
335 }
336 
338 
339 
341  return triggerResults.accept(pathIndex_);
342 }
343 
345  if(fired(triggerResults)) {
346  //std::cout << "Event passed" << std::endl;
347  return filterIndices_.size()-1;
348  }
349 
350  unsigned int firstFailedFilter = triggerResults.index(pathIndex_);
351  int lastPassedFilter = -1;
352  for(size_t i=0; i<filterIndices_.size(); ++i) {
353  if(std::get<kModuleIndex>(filterIndices_[i]) < firstFailedFilter) {
354  lastPassedFilter = i;
355  }
356  else {
357  //std::cout << "Decision-making filter " << firstFailedFilter << " this " << std::get<kModuleIndex>(filterIndices_[i]) << std::endl;
358  break;
359  }
360  }
361  return lastPassedFilter;
362 }
363 
364 void HLTTauDQMPath::getFilterObjects(const trigger::TriggerEvent& triggerEvent, size_t i, std::vector<Object>& retval) const {
365  trigger::size_type filterIndex = triggerEvent.filterIndex(edm::InputTag(getFilterName(i), "", hltProcess_));
366  if(filterIndex != triggerEvent.sizeFilters()) {
367  const trigger::Keys& keys = triggerEvent.filterKeys(filterIndex);
368  const trigger::Vids& ids = triggerEvent.filterIds(filterIndex);
369  const trigger::TriggerObjectCollection& triggerObjects = triggerEvent.getObjects();
370  //std::cout << "Filter name " << getFilterName(i) << std::endl;
371  for(size_t i=0; i<keys.size(); ++i) {
372  const trigger::TriggerObject& object = triggerObjects[keys[i]];
373  retval.emplace_back(Object{object, ids[i]});
374  //std::cout << " object id " << object.id() << std::endl;
375  }
376  }
377 }
378 
379 bool HLTTauDQMPath::offlineMatching(size_t i, const std::vector<Object>& triggerObjects, const HLTTauDQMOfflineObjects& offlineObjects, double dR, std::vector<Object>& matchedTriggerObjects, HLTTauDQMOfflineObjects& matchedOfflineObjects) const {
380  bool isL1 = (i==0 && isFirstL1Seed_);
381  std::vector<bool> offlineMask;
382  if(filterTauN_[i] > 0) {
383  int matchedObjects = 0;
384  offlineMask.resize(offlineObjects.taus.size());
385  std::fill(offlineMask.begin(), offlineMask.end(), true);
386  for(const Object& trgObj: triggerObjects) {
387  //std::cout << "trigger object id " << trgObj.id << std::endl;
388  if(! ((isL1 && (trgObj.id == trigger::TriggerL1TauJet || trgObj.id == trigger::TriggerL1CenJet))
389  || trgObj.id == trigger::TriggerTau) )
390  continue;
391  if(deltaRmatch(trgObj.object, offlineObjects.taus, dR, offlineMask, matchedOfflineObjects.taus)) {
392  ++matchedObjects;
393  matchedTriggerObjects.emplace_back(trgObj);
394  }
395  }
396  if(matchedObjects < filterTauN_[i])
397  return false;
398  }
399  if(filterElectronN_[i] > 0) {
400  int matchedObjects = 0;
401  offlineMask.resize(offlineObjects.electrons.size());
402  std::fill(offlineMask.begin(), offlineMask.end(), true);
403  for(const Object& trgObj: triggerObjects) {
404  //std::cout << "trigger object id " << trgObj.id << std::endl;
405  if(! ((isL1 && (trgObj.id == trigger::TriggerL1NoIsoEG || trgObj.id == trigger::TriggerL1IsoEG))
406  || trgObj.id == trigger::TriggerElectron || trgObj.id == trigger::TriggerPhoton) )
407  continue;
408  if(deltaRmatch(trgObj.object, offlineObjects.electrons, dR, offlineMask, matchedOfflineObjects.electrons)) {
409  ++matchedObjects;
410  matchedTriggerObjects.emplace_back(trgObj);
411  }
412  }
413  if(matchedObjects < filterElectronN_[i])
414  return false;
415  }
416  if(filterMuonN_[i] > 0) {
417  int matchedObjects = 0;
418  offlineMask.resize(offlineObjects.muons.size());
419  std::fill(offlineMask.begin(), offlineMask.end(), true);
420  for(const Object& trgObj: triggerObjects) {
421  //std::cout << "trigger object id " << trgObj.id << std::endl;
422  if(! ((isL1 && trgObj.id == trigger::TriggerL1Mu)
423  || trgObj.id == trigger::TriggerMuon) )
424  continue;
425  if(deltaRmatch(trgObj.object, offlineObjects.muons, dR, offlineMask, matchedOfflineObjects.muons)) {
426  ++matchedObjects;
427  matchedTriggerObjects.emplace_back(trgObj);
428  }
429  }
430  if(matchedObjects < filterMuonN_[i])
431  return false;
432  }
433  // Sort offline objects by pt
434  std::sort(matchedOfflineObjects.taus.begin(), matchedOfflineObjects.taus.end(), [](const LV& a, const LV&b) { return a.pt() > b.pt();});
435  std::sort(matchedOfflineObjects.electrons.begin(), matchedOfflineObjects.electrons.end(), [](const LV& a, const LV&b) { return a.pt() > b.pt();});
436  std::sort(matchedOfflineObjects.muons.begin(), matchedOfflineObjects.muons.end(), [](const LV& a, const LV&b) { return a.pt() > b.pt();});
437 
438  return true;
439 }
440 
441 bool HLTTauDQMPath::goodOfflineEvent(size_t i, const HLTTauDQMOfflineObjects& offlineObjects) const {
442  return (static_cast<size_t>(getFilterNTaus(i)) <= offlineObjects.taus.size() &&
443  static_cast<size_t>(getFilterNElectrons(i)) <= offlineObjects.electrons.size() &&
444  static_cast<size_t>(getFilterNMuons(i)) <= offlineObjects.muons.size());
445 }
#define LogDebug(id)
type
Definition: HCALResponse.h:21
T getParameter(std::string const &) const
const std::string pathName_
Definition: HLTTauDQMPath.h:86
int i
Definition: DBlmapReader.cc:9
std::tuple< std::string, size_t > FilterIndex
Definition: HLTTauDQMPath.h:26
bool saveTags(const std::string &module) const
Is module an L3 filter (ie, tracked saveTags=true)
bool goodOfflineEvent(size_t i, const HLTTauDQMOfflineObjects &offlineObjects) const
string fill
Definition: lumiContext.py:319
const std::string moduleType(const std::string &module) const
C++ class name of module.
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:184
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
std::vector< LV > taus
std::string dump(unsigned int indent=0) const
enum start value shifted to 81 so as to avoid clashes with PDG codes
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
bool exists(std::string const &parameterName) const
checks if a parameter exists
const std::string moduleEDMType(const std::string &module) const
C++ base class name of module.
int lastPassedFilter(const edm::TriggerResults &triggerResults) const
double deltaR(const T1 &t1, const T2 &t2)
Definition: deltaR.h:48
const edm::ParameterSet & modulePSet(const std::string &module) const
ParameterSet of module.
int getFilterNElectrons(size_t i) const
Definition: HLTTauDQMPath.h:54
bool isValid_(value_type const &hash)
Definition: Hash.cc:72
int getFilterNTaus(size_t i) const
Definition: HLTTauDQMPath.h:53
uint16_t size_type
#define constexpr
#define input2
Definition: AMPTWrapper.h:149
const std::string hltProcess_
Definition: HLTTauDQMPath.h:79
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
void getFilterObjects(const trigger::TriggerEvent &triggerEvent, size_t i, std::vector< Object > &retval) const
unsigned int moduleIndex(unsigned int trigger, const std::string &module) const
slot position of module on trigger path (0 to size-1)
int getFilterNMuons(size_t i) const
Definition: HLTTauDQMPath.h:55
const unsigned int pathIndex_
Definition: HLTTauDQMPath.h:87
size_t lastFilterBeforeL2TauIndex_
Definition: HLTTauDQMPath.h:88
const TriggerObjectCollection & getObjects() const
Definition: TriggerEvent.h:98
static constexpr size_t kName
Definition: HLTTauDQMPath.h:28
unsigned int index(const unsigned int i) const
Get index (slot position) of module giving the decision of the ith path.
size_t filtersSize() const
Definition: HLTTauDQMPath.h:51
#define input1
Definition: AMPTWrapper.h:129
size_t lastFilterBeforeL3TauIndex_
Definition: HLTTauDQMPath.h:90
static std::string const triggerResults
Definition: EdmProvDump.cc:41
#define LogTrace(id)
bool offlineMatching(size_t i, const std::vector< Object > &triggerObjects, const HLTTauDQMOfflineObjects &offlineObjects, double dR, std::vector< Object > &matchedTriggerObjects, HLTTauDQMOfflineObjects &matchedOfflineObjects) const
std::vector< int > filterTauN_
Definition: HLTTauDQMPath.h:83
math::XYZTLorentzVectorD LV
Definition: HLTTauDQMPath.h:24
std::vector< FilterIndex > filterIndices_
Definition: HLTTauDQMPath.h:82
const std::vector< std::string > & moduleLabels(unsigned int trigger) const
label(s) of module(s) on a trigger path
std::vector< TriggerObject > TriggerObjectCollection
collection of trigger physics objects (e.g., all isolated muons)
Definition: TriggerObject.h:81
size_t getFilterIndex(size_t i) const
Definition: HLTTauDQMPath.h:68
const bool doRefAnalysis_
Definition: HLTTauDQMPath.h:80
std::vector< size_type > Keys
const std::string & getFilterName(size_t i) const
Definition: HLTTauDQMPath.h:52
size_t lastL3TauFilterIndex_
Definition: HLTTauDQMPath.h:91
double b
Definition: hdecay.h:120
bool fired(const edm::TriggerResults &triggerResults) const
list object
Definition: dbtoconf.py:77
std::string const & label() const
Definition: InputTag.h:42
size_t lastL2TauFilterIndex_
Definition: HLTTauDQMPath.h:89
HLTTauDQMPath(const std::string &pathName, const std::string &hltProcess, bool doRefAnalysis, const HLTConfigProvider &HLTCP)
double a
Definition: hdecay.h:121
std::vector< int > filterElectronN_
Definition: HLTTauDQMPath.h:84
volatile std::atomic< bool > shutdown_flag false
std::vector< int > filterMuonN_
Definition: HLTTauDQMPath.h:85
static constexpr size_t kModuleIndex
Definition: HLTTauDQMPath.h:29
std::vector< int > Vids
std::vector< LV > muons
static constexpr size_t kInvalidIndex
Definition: HLTTauDQMPath.h:30