CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TopDiLeptonOfflineDQM.cc
Go to the documentation of this file.
1 //#include <algorithm>
11 
12 namespace TopDiLeptonOffline {
13 
15  const edm::ParameterSet& cfg,
17  : label_(label),
18  eidCutValue_(0.),
19  elecIso_(0),
20  elecSelect_(0),
21  muonIso_(0),
22  muonSelect_(0),
23  jetIDSelect_(0),
24  lowerEdge_(-1.),
25  upperEdge_(-1.),
26  elecMuLogged_(0),
27  diMuonLogged_(0),
28  diElecLogged_(0) {
29  // sources have to be given; this PSet is not optional
30  edm::ParameterSet sources = cfg.getParameter<edm::ParameterSet>("sources");
31  muons_ = iC.consumes<edm::View<reco::PFCandidate> >(
32  sources.getParameter<edm::InputTag>("muons"));
33  elecs_ = iC.consumes<edm::View<reco::PFCandidate> >(
34  sources.getParameter<edm::InputTag>("elecs"));
35  jets_ = iC.consumes<edm::View<reco::Jet> >(
36  sources.getParameter<edm::InputTag>("jets"));
37  for (edm::InputTag const& tag :
38  sources.getParameter<std::vector<edm::InputTag> >("mets"))
39  mets_.push_back(iC.consumes<edm::View<reco::MET> >(tag));
40 
41  // elecExtras are optional; they may be omitted or empty
42  if (cfg.existsAs<edm::ParameterSet>("elecExtras")) {
43  edm::ParameterSet elecExtras =
44  cfg.getParameter<edm::ParameterSet>("elecExtras");
45  // select is optional; in case it's not found no
46  // selection will be applied
47  if (elecExtras.existsAs<std::string>("select")) {
49  elecExtras.getParameter<std::string>("select"));
50  }
51  // isolation is optional; in case it's not found no
52  // isolation will be applied
53  if (elecExtras.existsAs<std::string>("isolation")) {
55  elecExtras.getParameter<std::string>("isolation"));
56  }
57  // electronId is optional; in case it's not found the
58  // InputTag will remain empty
59  if (elecExtras.existsAs<edm::ParameterSet>("electronId")) {
60  edm::ParameterSet elecId =
61  elecExtras.getParameter<edm::ParameterSet>("electronId");
62  electronId_ = iC.consumes<edm::ValueMap<float> >(
63  elecId.getParameter<edm::InputTag>("src"));
64  eidCutValue_ = elecId.getParameter<double>("cutValue");
65  // eidPattern_= elecId.getParameter<int>("pattern");
66  }
67  }
68  // muonExtras are optional; they may be omitted or empty
69  if (cfg.existsAs<edm::ParameterSet>("muonExtras")) {
70  edm::ParameterSet muonExtras =
71  cfg.getParameter<edm::ParameterSet>("muonExtras");
72  // select is optional; in case it's not found no
73  // selection will be applied
74  if (muonExtras.existsAs<std::string>("select")) {
76  muonExtras.getParameter<std::string>("select"));
77  }
78  // isolation is optional; in case it's not found no
79  // isolation will be applied
80  if (muonExtras.existsAs<std::string>("isolation")) {
82  muonExtras.getParameter<std::string>("isolation"));
83  }
84  }
85  // jetExtras are optional; they may be omitted or empty
86  if (cfg.existsAs<edm::ParameterSet>("jetExtras")) {
87  edm::ParameterSet jetExtras =
88  cfg.getParameter<edm::ParameterSet>("jetExtras");
89  // jetCorrector is optional; in case it's not found
90  // the InputTag will remain empty
91  if (jetExtras.existsAs<std::string>("jetCorrector")) {
92  jetCorrector_ = jetExtras.getParameter<std::string>("jetCorrector");
93  }
94  // read jetID information if it exists
95  if (jetExtras.existsAs<edm::ParameterSet>("jetID")) {
97  jetExtras.getParameter<edm::ParameterSet>("jetID");
98  jetIDLabel_ = iC.consumes<reco::JetIDValueMap>(
99  jetID.getParameter<edm::InputTag>("label"));
101  jetID.getParameter<std::string>("select"));
102  }
103  // select is optional; in case it's not found no
104  // selection will be applied (only implemented for
105  // CaloJets at the moment)
106  if (jetExtras.existsAs<std::string>("select")) {
107  jetSelect_ = jetExtras.getParameter<std::string>("select");
108  }
109  }
110  // triggerExtras are optional; they may be omitted or empty
111  if (cfg.existsAs<edm::ParameterSet>("triggerExtras")) {
112  edm::ParameterSet triggerExtras =
113  cfg.getParameter<edm::ParameterSet>("triggerExtras");
114  triggerTable_ = iC.consumes<edm::TriggerResults>(
115  triggerExtras.getParameter<edm::InputTag>("src"));
116  elecMuPaths_ =
117  triggerExtras.getParameter<std::vector<std::string> >("pathsELECMU");
118  diMuonPaths_ =
119  triggerExtras.getParameter<std::vector<std::string> >("pathsDIMUON");
120  }
121  // massExtras is optional; in case it's not found no mass
122  // window cuts are applied for the same flavor monitor
123  // histograms
124  if (cfg.existsAs<edm::ParameterSet>("massExtras")) {
125  edm::ParameterSet massExtras =
126  cfg.getParameter<edm::ParameterSet>("massExtras");
127  lowerEdge_ = massExtras.getParameter<double>("lowerEdge");
128  upperEdge_ = massExtras.getParameter<double>("upperEdge");
129  }
130 
131  // setup the verbosity level for booking histograms;
132  // per default the verbosity level will be set to
133  // STANDARD. This will also be the chosen level in
134  // the case when the monitoring PSet is not found
136  if (cfg.existsAs<edm::ParameterSet>("monitoring")) {
137  edm::ParameterSet monitoring =
138  cfg.getParameter<edm::ParameterSet>("monitoring");
139  if (monitoring.getParameter<std::string>("verbosity") == "DEBUG")
140  verbosity_ = DEBUG;
141  if (monitoring.getParameter<std::string>("verbosity") == "VERBOSE")
143  if (monitoring.getParameter<std::string>("verbosity") == "STANDARD")
145  }
146  // and don't forget to do the histogram booking
147  book(cfg.getParameter<std::string>("directory"));
148 }
149 
151  // set up the current directory path
152  std::string current(directory);
153  current += label_;
155  store_->setCurrentFolder(current);
156 
157  // determine number of bins for trigger monitoring
158  unsigned int nElecMu = elecMuPaths_.size();
159  unsigned int nDiMuon = diMuonPaths_.size();
160 
161  // --- [STANDARD] --- //
162  // Run Number
163  hists_["RunNumb_"] =
164  store_->book1D("RunNumber", "Run Nr.", 1.e4, 1.5e5, 3.e5);
165  // invariant mass of opposite charge lepton pair (only filled for same flavor)
166  hists_["invMass_"] = store_->book1D("InvMass", "M(lep1, lep2)", 80, 0., 320.);
167  // invariant mass of opposite charge lepton pair (only filled for same flavor)
168  hists_["invMassLog_"] =
169  store_->book1D("InvMassLog", "log_{10}(M(lep1, lep2))", 80, .1, 2.5);
170  // invariant mass of same charge lepton pair (log10 for low mass region, only
171  // filled for same flavor)
172  hists_["invMassWC_"] =
173  store_->book1D("InvMassWC", "M_{WC}(L1, L2)", 80, 0., 320.);
174  // invariant mass of same charge lepton pair (log10 for low mass region, only
175  // filled for same flavor)
176  hists_["invMassWCLog_"] =
177  store_->book1D("InvMassLogWC", "log_{10}(M_{WC})", 80, .1, 2.5);
178  // decay channel [1]: muon/muon, [2]:elec/elec, [3]:elec/muon
179  hists_["decayChannel_"] =
180  store_->book1D("DecayChannel", "Decay Channel", 3, 0, 3);
181  // trigger efficiency estimates for the electron muon channel
182  hists_["elecMuEff_"] =
183  store_->book1D("ElecMuEff", "Eff(e/#mu paths)", nElecMu, 0., nElecMu);
184  // monitored trigger occupancy for the electron muon channel
185  hists_["elecMuMon_"] =
186  store_->book1D("ElecMuMon", "Mon(e/#mu paths)", nElecMu, 0., nElecMu);
187  // trigger efficiency estimates for the di muon channel
188  hists_["diMuonEff_"] =
189  store_->book1D("DiMuonEff", "Eff(#mu/#mu paths)", nDiMuon, 0., nDiMuon);
190  // monitored trigger occupancy for the di muon channel
191  hists_["diMuonMon_"] =
192  store_->book1D("DiMuonMon", "Mon(#mu/#mu paths)", nDiMuon, 0., nDiMuon);
193  // pt of the leading lepton
194  hists_["lep1Pt_"] = store_->book1D("Lep1Pt", "pt(lep1)", 50, 0., 200.);
195  // pt of the 2. leading lepton
196  hists_["lep2Pt_"] = store_->book1D("Lep2Pt", "pt(lep2)", 50, 0., 200.);
197  // multiplicity of jets with pt>30 (corrected to L2+L3)
198  hists_["jetMult_"] = store_->book1D("JetMult", "N_{30}(jet)", 21, -0.5, 20.5);
199  // MET (calo)
200  hists_["metCalo_"] = store_->book1D("METCalo", "MET_{Calo}", 50, 0., 200.);
201 
202  // set bin labels for trigger monitoring
205  // set bin labels for decayChannel_
206  hists_["decayChannel_"]->setBinLabel(1, "#mu e", 1);
207  hists_["decayChannel_"]->setBinLabel(2, "#mu #mu", 1);
208  hists_["decayChannel_"]->setBinLabel(3, "e e", 1);
209 
210  if (verbosity_ == STANDARD) return;
211 
212  // --- [VERBOSE] --- //
213  // mean eta of the candidate leptons
214  hists_["sumEtaL1L2_"] =
215  store_->book1D("SumEtaL1L2", "<#eta>(lep1, lep2)", 100, -5., 5.);
216  // deltaEta between the 2 candidate leptons
217  hists_["dEtaL1L2_"] =
218  store_->book1D("DEtaL1L2", "#Delta#eta(lep1,lep2)", 80, -4., 4.);
219  // deltaPhi between the 2 candidate leptons
220  hists_["dPhiL1L2_"] =
221  store_->book1D("DPhiL1L2", "#Delta#phi(lep1,lep2)", 64, -3.2, 3.2);
222  // pt of the candidate electron (depending on the decay channel)
223  hists_["elecPt_"] = store_->book1D("ElecPt", "pt(e)", 50, 0., 200.);
224  // relative isolation of the candidate electron (depending on the decay
225  // channel)
226  hists_["elecRelIso_"] =
227  store_->book1D("ElecRelIso", "Iso_{Rel}(e)", 50, 0., 1.);
228  // pt of the canddiate muon (depending on the decay channel)
229  hists_["muonPt_"] = store_->book1D("MuonPt", "pt(#mu)", 50, 0., 200.);
230  // relative isolation of the candidate muon (depending on the decay channel)
231  hists_["muonRelIso_"] = store_->book1D(
232  "MuonRelIso", "Iso_{Rel}(#mu) (#Delta#beta Corrected)", 50, 0., 1.);
233  // pt of the 1. leading jet (corrected to L2+L3)
234  hists_["jet1Pt_"] = store_->book1D("Jet1Pt", "pt_{L2L3}(jet1)", 60, 0., 300.);
235  // pt of the 2. leading jet (corrected to L2+L3)
236  hists_["jet2Pt_"] = store_->book1D("Jet2Pt", "pt_{L2L3}(jet2)", 60, 0., 300.);
237  // MET (PF)
238  hists_["metPflow_"] = store_->book1D("METPflow", "MET_{Pflow}", 50, 0., 200.);
239  // MET (TC)
240  hists_["metTC_"] = store_->book1D("METTC", "MET_{TC}", 50, 0., 200.);
241  // dz for muons (to suppress cosmis)
242  hists_["muonDelZ_"] = store_->book1D("MuonDelZ", "d_{z}(#mu)", 50, -25., 25.);
243  // dxy for muons (to suppress cosmics)
244  hists_["muonDelXY_"] =
245  store_->book2D("MuonDelXY", "d_{xy}(#mu)", 50, -1., 1., 50, -1., 1.);
246  // lepton multiplicity after std isolation
247  hists_["lepMultIso_"] = store_->book2D(
248  "LepMultIso", "N_{Iso}(e) vs N_{Iso}(#mu)", 5, 0., 5., 5, 0., 5.);
249 
250  // set axes titles for dxy for muons
251  hists_["muonDelXY_"]->setAxisTitle("x [cm]", 1);
252  hists_["muonDelXY_"]->setAxisTitle("y [cm]", 2);
253  // set axes titles for lepton multiplicity after std isolation
254  hists_["lepMultIso_"]->setAxisTitle("N_{Iso}(#mu)", 1);
255  hists_["lepMultIso_"]->setAxisTitle("N_{Iso}(elec)", 2);
256 
257  if (verbosity_ == VERBOSE) return;
258 
259  // --- [DEBUG] --- //
260  // electron multiplicity after std isolation
261  hists_["elecMultIso_"] =
262  store_->book1D("ElecMultIso", "N_{Iso}(e)", 11, -0.5, 10.5);
263  // muon multiplicity after std isolation
264  hists_["muonMultIso_"] =
265  store_->book1D("MuonMultIso", "N_{Iso}(#mu)", 11, -0.5, 10.5);
266  // charged hadron isolation component of the candidate muon (depending on the
267  // decay channel)
268  hists_["muonChHadIso_"] = store_->book1D(
269  "MuonChHadIsoComp", "ChHad_{IsoComponent}(#mu)", 50, 0., 5.);
270  // neutral hadron isolation component of the candidate muon (depending on the
271  // decay channel)
272  hists_["muonNeHadIso_"] = store_->book1D(
273  "MuonNeHadIsoComp", "NeHad_{IsoComponent}(#mu)", 50, 0., 5.);
274  // photon isolation component of the candidate muon (depending on the decay
275  // channel)
276  hists_["muonPhIso_"] =
277  store_->book1D("MuonPhIsoComp", "Photon_{IsoComponent}(#mu)", 50, 0., 5.);
278  // charged hadron isolation component of the candidate electron (depending on
279  // the decay channel)
280  hists_["elecChHadIso_"] = store_->book1D(
281  "ElectronChHadIsoComp", "ChHad_{IsoComponent}(e)", 50, 0., 5.);
282  // neutral hadron isolation component of the candidate electron (depending on
283  // the decay channel)
284  hists_["elecNeHadIso_"] = store_->book1D(
285  "ElectronNeHadIsoComp", "NeHad_{IsoComponent}(e)", 50, 0., 5.);
286  // photon isolation component of the candidate electron (depending on the
287  // decay channel)
288  hists_["elecPhIso_"] = store_->book1D("ElectronPhIsoComp",
289  "Photon_{IsoComponent}(e)", 50, 0., 5.);
290  // eta of the leading jet
291  hists_["jet1Eta_"] = store_->book1D("Jet1Eta", "#eta(jet1)", 30, -5., 5.);
292  // eta of the 2. leading jet
293  hists_["jet2Eta_"] = store_->book1D("Jet2Eta", "#eta(jet2)", 30, -5., 5.);
294  // pt of the 1. leading jet (not corrected)
295  hists_["jet1PtRaw_"] =
296  store_->book1D("Jet1PtRaw", "pt_{Raw}(jet1)", 60, 0., 300.);
297  // pt of the 2. leading jet (not corrected)
298  hists_["jet2PtRaw_"] =
299  store_->book1D("Jet2PtRaw", "pt_{Raw}(jet2)", 60, 0., 300.);
300  // deltaEta between the 2 leading jets
301  hists_["dEtaJet1Jet2_"] =
302  store_->book1D("DEtaJet1Jet2", "#Delta#eta(jet1,jet2)", 80, -4., 4.);
303  // deltaEta between the lepton and the leading jet
304  hists_["dEtaJet1Lep1_"] =
305  store_->book1D("DEtaJet1Lep1", "#Delta#eta(jet1,lep1)", 80, -4., 4.);
306  // deltaEta between the lepton and MET
307  hists_["dEtaLep1MET_"] =
308  store_->book1D("DEtaLep1MET", "#Delta#eta(lep1,MET)", 80, -4., 4.);
309  // deltaEta between leading jet and MET
310  hists_["dEtaJet1MET_"] =
311  store_->book1D("DEtaJet1MET", "#Delta#eta(jet1,MET)", 80, -4., 4.);
312  // deltaPhi of 2 leading jets
313  hists_["dPhiJet1Jet2_"] =
314  store_->book1D("DPhiJet1Jet2", "#Delta#phi(jet1,jet2)", 64, -3.2, 3.2);
315  // deltaPhi of 1. lepton and 1. jet
316  hists_["dPhiJet1Lep1_"] =
317  store_->book1D("DPhiJet1Lep1", "#Delta#phi(jet1,lep1)", 64, -3.2, 3.2);
318  // deltaPhi of 1. lepton and MET
319  hists_["dPhiLep1MET_"] =
320  store_->book1D("DPhiLep1MET", "#Delta#phi(lep1,MET)", 64, -3.2, 3.2);
321  // deltaPhi of 1. jet and MET
322  hists_["dPhiJet1MET_"] =
323  store_->book1D("DPhiJet1MET", "#Delta#phi(jet1,MET)", 64, -3.2, 3.2);
324  // selected dimuon events
325  hists_["diMuonLogger_"] = store_->book2D(
326  "DiMuonLogger", "Logged DiMuon Events", 8, 0., 8., 10, 0., 10.);
327  // selected dielec events
328  hists_["diElecLogger_"] = store_->book2D(
329  "DiElecLogger", "Logged DiElec Events", 8, 0., 8., 10, 0., 10.);
330  // selected elemu events
331  hists_["elecMuLogger_"] = store_->book2D(
332  "ElecMuLogger", "Logged ElecMu Events", 8, 0., 8., 10, 0., 10.);
333 
334  // set bin labels for trigger monitoring
335  loggerBinLabels(std::string("diMuonLogger_"));
336  loggerBinLabels(std::string("diElecLogger_"));
337  loggerBinLabels(std::string("elecMuLogger_"));
338  return;
339 }
340 
342  const edm::EventSetup& setup) {
343  // fetch trigger event if configured such
346  if (!event.getByToken(triggerTable_, triggerTable)) return;
347  }
348  /*
349  ------------------------------------------------------------
350 
351  Run and Inst. Luminosity information (Inst. Lumi. filled now with a dummy
352  value=5.0)
353 
354  ------------------------------------------------------------
355  */
356 
357  if (!event.eventAuxiliary().run()) return;
358  fill("RunNumb_", event.eventAuxiliary().run());
359 
360  double dummy = 5.;
361  fill("InstLumi_", dummy);
362 
363  /*
364  ------------------------------------------------------------
365 
366  Muon Selection
367 
368  ------------------------------------------------------------
369  */
370 
371  std::vector<const reco::PFCandidate*> isoMuons;
372 
375 
376  if (!event.getByToken(muons_, muons)) return;
377 
378  for (edm::View<reco::PFCandidate>::const_iterator muonit = muons->begin();
379  muonit != muons->end(); ++muonit) {
380 
381  if (muonit->muonRef().isNull()) continue;
382  reco::MuonRef muon = muonit->muonRef();
383 
384  if (muon->innerTrack().isNull()) continue;
385 
386  if (muon->isGlobalMuon()) {
387  fill("muonDelZ_", muon->innerTrack()->vz()); // CB using inner track!
388  fill("muonDelXY_", muon->innerTrack()->vx(), muon->innerTrack()->vy());
389 
390  // apply selection
391  if (!muonSelect_ || (*muonSelect_)(*muonit)) {
392 
393  double chHadPt = muon->pfIsolationR04().sumChargedHadronPt;
394  double neHadEt = muon->pfIsolationR04().sumNeutralHadronEt;
395  double phoEt = muon->pfIsolationR04().sumPhotonEt;
396 
397  double pfRelIso =
398  (chHadPt +
399  max(0., neHadEt + phoEt - 0.5 * muon->pfIsolationR04().sumPUPt)) /
400  muon->pt(); // CB dBeta corrected iso!
401 
402  fill("muonRelIso_", pfRelIso);
403 
404  fill("muonChHadIso_", chHadPt);
405  fill("muonNeHadIso_", neHadEt);
406  fill("muonPhIso_", phoEt);
407 
408  if (!muonIso_ || (*muonIso_)(*muonit)) isoMuons.push_back(&(*muonit));
409  }
410  }
411  }
412 
413  fill("muonMultIso_", isoMuons.size());
414 
415  /*
416  ------------------------------------------------------------
417 
418  Electron Selection
419 
420  ------------------------------------------------------------
421  */
422 
423  // buffer isolated electronss
424  std::vector<const reco::PFCandidate*> isoElecs;
426  if (!electronId_.isUninitialized()) {
427  if (!event.getByToken(electronId_, electronId)) return;
428  }
430  if (!event.getByToken(elecs_, elecs)) return;
431 
432  for (edm::View<reco::PFCandidate>::const_iterator elec = elecs->begin();
433  elec != elecs->end(); ++elec) {
434  if (elec->gsfElectronRef().isNull()) {
435  continue;
436  }
437  reco::GsfElectronRef gsf_el = elec->gsfElectronRef();
438  // restrict to electrons with good electronId
439  if (electronId_.isUninitialized() ? true : ((double)(*electronId)[gsf_el] >=
440  eidCutValue_)) {
441  // apply preselection
442  if (!elecSelect_ || (*elecSelect_)(*elec)) {
443  double el_ChHadIso = gsf_el->pfIsolationVariables().sumChargedHadronPt;
444  double el_NeHadIso = gsf_el->pfIsolationVariables().sumNeutralHadronEt;
445  double el_PhIso = gsf_el->pfIsolationVariables().sumPhotonEt;
446  double el_pfRelIso =
447  (el_ChHadIso +
448  max(0., el_NeHadIso + el_PhIso -
449  0.5 * gsf_el->pfIsolationVariables().sumPUPt)) /
450  gsf_el->pt();
451  fill("elecRelIso_", el_pfRelIso);
452  fill("elecChHadIso_", el_ChHadIso);
453  fill("elecNeHadIso_", el_NeHadIso);
454  fill("elecPhIso_", el_PhIso);
455  if (!elecIso_ || (*elecIso_)(*elec)) isoElecs.push_back(&(*elec));
456  }
457  }
458  }
459  fill("elecMultIso_", isoElecs.size());
460 
461  /*
462  ------------------------------------------------------------
463 
464  Jet Selection
465 
466  ------------------------------------------------------------
467  */
468 
469  const JetCorrector* corrector = 0;
470  if (!jetCorrector_.empty()) {
471  // check whether a jet correcto is in the event setup or not
473  JetCorrectionsRecord>())) {
474  corrector = JetCorrector::getJetCorrector(jetCorrector_, setup);
475  } else {
476  edm::LogVerbatim("TopDiLeptonOfflineDQM")
477  << "\n"
478  << "-----------------------------------------------------------------"
479  "-------------------- \n"
480  << " No JetCorrectionsRecord available from EventSetup: "
481  " \n"
482  << " - Jets will not be corrected. "
483  " \n"
484  << " - If you want to change this add the following lines to your "
485  "cfg file: \n"
486  << " "
487  " \n"
488  << " ## load jet corrections "
489  " \n"
490  << " "
491  "process.load(\"JetMETCorrections.Configuration."
492  "JetCorrectionServicesAllAlgos_cff\") \n"
493  << " process.prefer(\"ak5CaloL2L3\") "
494  " \n"
495  << " "
496  " \n"
497  << "-----------------------------------------------------------------"
498  "-------------------- \n";
499  }
500  }
501 
502  unsigned int mult = 0;
503  // buffer leadingJets
504  std::vector<reco::Jet> leadingJets;
506  if (!event.getByToken(jets_, jets)) return;
507 
509  if (jetIDSelect_) {
510  if (!event.getByToken(jetIDLabel_, jetID)) return;
511  }
512 
513  for (edm::View<reco::Jet>::const_iterator jet = jets->begin();
514  jet != jets->end(); ++jet) {
515  unsigned int idx = jet - jets->begin();
516  if (jetIDSelect_ &&
517  dynamic_cast<const reco::CaloJet*>(jets->refAt(idx).get())) {
518  if (!(*jetIDSelect_)((*jetID)[jets->refAt(idx)])) continue;
519  }
520  // chekc additional jet selection for calo, pf and bare reco jets
521  if (dynamic_cast<const reco::CaloJet*>(&*jet)) {
522  reco::CaloJet sel = dynamic_cast<const reco::CaloJet&>(*jet);
523  sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
525  if (!jetSelect(sel)) {
526  continue;
527  }
528  } else if (dynamic_cast<const reco::PFJet*>(&*jet)) {
529  reco::PFJet sel = dynamic_cast<const reco::PFJet&>(*jet);
530  sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
532  if (!jetSelect(sel)) continue;
533  } else {
534  reco::Jet sel = *jet;
535  sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
537  if (!jetSelect(sel)) continue;
538  }
539  // check for overlaps
540  bool overlap = false;
541  for (std::vector<const reco::PFCandidate*>::const_iterator elec =
542  isoElecs.begin();
543  elec != isoElecs.end(); ++elec) {
544  if (reco::deltaR((*elec)->eta(), (*elec)->phi(), jet->eta(), jet->phi()) <
545  0.4) {
546  overlap = true;
547  break;
548  }
549  }
550  if (overlap) {
551  continue;
552  }
553  // prepare jet to fill monitor histograms
554  reco::Jet monitorJet = *jet;
555  monitorJet.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
556  ++mult; // determine jet multiplicity
557  if (idx == 0) {
558  leadingJets.push_back(monitorJet);
559  fill("jet1Pt_", monitorJet.pt());
560  fill("jet1PtRaw_", jet->pt());
561  fill("jet1Eta_", jet->eta());
562  }
563  if (idx == 1) {
564  leadingJets.push_back(monitorJet);
565  fill("jet2Pt_", monitorJet.pt());
566  fill("jet2PtRaw_", jet->pt());
567  fill("jet2Eta_", jet->eta());
568  }
569  }
570  if (leadingJets.size() > 1) {
571  fill("dEtaJet1Jet2_", leadingJets[0].eta() - leadingJets[1].eta());
572  fill("dPhiJet1Jet2_",
573  reco::deltaPhi(leadingJets[0].phi(), leadingJets[1].phi()));
574  if (!isoMuons.empty()) {
575  if (isoElecs.empty() || isoMuons[0]->pt() > isoElecs[0]->pt()) {
576  fill("dEtaJet1Lep1_", isoMuons[0]->eta() - leadingJets[0].eta());
577  fill("dPhiJet1Lep1_",
578  reco::deltaPhi(isoMuons[0]->phi(), leadingJets[0].phi()));
579  }
580  }
581  if (!isoElecs.empty()) {
582  if (isoMuons.empty() || isoElecs[0]->pt() > isoMuons[0]->pt()) {
583  fill("dEtaJet1Lep1_", isoElecs[0]->eta() - leadingJets[0].eta());
584  fill("dPhiJet1Lep1_",
585  reco::deltaPhi(isoElecs[0]->phi(), leadingJets[0].phi()));
586  }
587  }
588  }
589  fill("jetMult_", mult);
590 
591  /*
592  ------------------------------------------------------------
593 
594  MET Selection
595 
596  ------------------------------------------------------------
597  */
598 
599  // buffer for event logging
600  reco::MET caloMET;
601  for (std::vector<edm::EDGetTokenT<edm::View<reco::MET> > >::const_iterator
602  met_ = mets_.begin();
603  met_ != mets_.end(); ++met_) {
604 
606  if (!event.getByToken(*met_, met)) continue;
607 
608  if (met->begin() != met->end()) {
609  unsigned int idx = met_ - mets_.begin();
610  if (idx == 0) {
611  caloMET = *met->begin();
612  fill("metCalo_", met->begin()->et());
613  if (!leadingJets.empty()) {
614  fill("dEtaJet1MET_", leadingJets[0].eta() - met->begin()->eta());
615  fill("dPhiJet1MET_",
616  reco::deltaPhi(leadingJets[0].phi(), met->begin()->phi()));
617  }
618  if (!isoMuons.empty()) {
619  if (isoElecs.empty() || isoMuons[0]->pt() > isoElecs[0]->pt()) {
620  fill("dEtaLep1MET_", isoMuons[0]->eta() - met->begin()->eta());
621  fill("dPhiLep1MET_",
622  reco::deltaPhi(isoMuons[0]->phi(), met->begin()->phi()));
623  }
624  }
625  if (!isoElecs.empty()) {
626  if (isoMuons.empty() || isoElecs[0]->pt() > isoMuons[0]->pt()) {
627  fill("dEtaLep1MET_", isoElecs[0]->eta() - met->begin()->eta());
628  fill("dPhiLep1MET_",
629  reco::deltaPhi(isoElecs[0]->phi(), met->begin()->phi()));
630  }
631  }
632  }
633  if (idx == 1) {
634  fill("metTC_", met->begin()->et());
635  }
636  if (idx == 2) {
637  fill("metPflow_", met->begin()->et());
638  }
639  }
640  }
641 
642  /*
643  ------------------------------------------------------------
644 
645  Event Monitoring
646 
647  ------------------------------------------------------------
648  */
649 
650  // check number of isolated leptons
651  fill("lepMultIso_", isoMuons.size(), isoElecs.size());
652  // ELECMU channel
653  if (decayChannel(isoMuons, isoElecs) == ELECMU) {
654  fill("decayChannel_", 0.5);
655  double mass = (isoElecs[0]->p4() + isoMuons[0]->p4()).mass();
656  if ((lowerEdge_ == -1. && upperEdge_ == -1.) ||
657  (lowerEdge_ < mass && mass < upperEdge_)) {
658 
659  fill("dEtaL1L2_", isoElecs[0]->eta() - isoMuons[0]->eta());
660  fill("sumEtaL1L2_", (isoElecs[0]->eta() + isoMuons[0]->eta()) / 2);
661  fill("dPhiL1L2_", reco::deltaPhi(isoElecs[0]->phi(), isoMuons[0]->eta()));
662  fill("elecPt_", isoElecs[0]->pt());
663  fill("muonPt_", isoMuons[0]->pt());
664  fill("lep1Pt_", isoElecs[0]->pt() > isoMuons[0]->pt()
665  ? isoElecs[0]->pt()
666  : isoMuons[0]->pt());
667  fill("lep2Pt_", isoElecs[0]->pt() > isoMuons[0]->pt()
668  ? isoMuons[0]->pt()
669  : isoElecs[0]->pt());
670  // fill plots for trigger monitoring
672  fill(event, *triggerTable, "elecMu", elecMuPaths_);
673  if (elecMuLogged_ <= hists_.find("elecMuLogger_")->second->getNbinsY()) {
674  // log runnumber, lumi block, event number & some
675  // more pysics infomation for interesting events
676  fill("elecMuLogger_", 0.5, elecMuLogged_ + 0.5,
677  event.eventAuxiliary().run());
678  fill("elecMuLogger_", 1.5, elecMuLogged_ + 0.5,
679  event.eventAuxiliary().luminosityBlock());
680  fill("elecMuLogger_", 2.5, elecMuLogged_ + 0.5,
681  event.eventAuxiliary().event());
682  fill("elecMuLogger_", 3.5, elecMuLogged_ + 0.5, isoMuons[0]->pt());
683  fill("elecMuLogger_", 4.5, elecMuLogged_ + 0.5, isoElecs[0]->pt());
684  if (leadingJets.size() > 0)
685  fill("elecMuLogger_", 5.5, elecMuLogged_ + 0.5, leadingJets[0].pt());
686  if (leadingJets.size() > 1)
687  fill("elecMuLogger_", 6.5, elecMuLogged_ + 0.5, leadingJets[1].pt());
688  fill("elecMuLogger_", 7.5, elecMuLogged_ + 0.5, caloMET.et());
689  ++elecMuLogged_;
690  }
691  }
692  }
693 
694  // DIMUON channel
695  if (decayChannel(isoMuons, isoElecs) == DIMUON) {
696  fill("decayChannel_", 1.5);
697  int charge = isoMuons[0]->charge() * isoMuons[1]->charge();
698  double mass = (isoMuons[0]->p4() + isoMuons[1]->p4()).mass();
699 
700  fill(charge < 0 ? "invMass_" : "invMassWC_", mass);
701  fill(charge < 0 ? "invMassLog_" : "invMassWCLog_", log10(mass));
702  if ((lowerEdge_ == -1. && upperEdge_ == -1.) ||
703  (lowerEdge_ < mass && mass < upperEdge_)) {
704  fill("dEtaL1L2_", isoMuons[0]->eta() - isoMuons[1]->eta());
705  fill("sumEtaL1L2_", (isoMuons[0]->eta() + isoMuons[1]->eta()) / 2);
706  fill("dPhiL1L2_", reco::deltaPhi(isoMuons[0]->phi(), isoMuons[1]->phi()));
707  fill("muonPt_", isoMuons[0]->pt());
708  fill("muonPt_", isoMuons[1]->pt());
709  fill("lep1Pt_", isoMuons[0]->pt());
710  fill("lep2Pt_", isoMuons[1]->pt());
711  // fill plots for trigger monitoring
713  fill(event, *triggerTable, "diMuon", diMuonPaths_);
714  if (diMuonLogged_ <= hists_.find("diMuonLogger_")->second->getNbinsY()) {
715  // log runnumber, lumi block, event number & some
716  // more pysics infomation for interesting events
717  fill("diMuonLogger_", 0.5, diMuonLogged_ + 0.5,
718  event.eventAuxiliary().run());
719  fill("diMuonLogger_", 1.5, diMuonLogged_ + 0.5,
720  event.eventAuxiliary().luminosityBlock());
721  fill("diMuonLogger_", 2.5, diMuonLogged_ + 0.5,
722  event.eventAuxiliary().event());
723  fill("diMuonLogger_", 3.5, diMuonLogged_ + 0.5, isoMuons[0]->pt());
724  fill("diMuonLogger_", 4.5, diMuonLogged_ + 0.5, isoMuons[1]->pt());
725  if (leadingJets.size() > 0)
726  fill("diMuonLogger_", 5.5, diMuonLogged_ + 0.5, leadingJets[0].pt());
727  if (leadingJets.size() > 1)
728  fill("diMuonLogger_", 6.5, diMuonLogged_ + 0.5, leadingJets[1].pt());
729  fill("diMuonLogger_", 7.5, diMuonLogged_ + 0.5, caloMET.et());
730  ++diMuonLogged_;
731  }
732  }
733  }
734 
735  // DIELEC channel
736  if (decayChannel(isoMuons, isoElecs) == DIELEC) {
737  fill("decayChannel_", 2.5);
738  int charge = isoElecs[0]->charge() * isoElecs[1]->charge();
739  double mass = (isoElecs[0]->p4() + isoElecs[1]->p4()).mass();
740  fill(charge < 0 ? "invMass_" : "invMassWC_", mass);
741  fill(charge < 0 ? "invMassLog_" : "invMassWCLog_", log10(mass));
742  if ((lowerEdge_ == -1. && upperEdge_ == -1.) ||
743  (lowerEdge_ < mass && mass < upperEdge_)) {
744  fill("dEtaL1L2_", isoElecs[0]->eta() - isoElecs[1]->eta());
745  fill("sumEtaL1L2_", (isoElecs[0]->eta() + isoElecs[1]->eta()) / 2);
746  fill("dPhiL1L2_", reco::deltaPhi(isoElecs[0]->phi(), isoElecs[1]->phi()));
747  fill("elecPt_", isoElecs[0]->pt());
748  fill("elecPt_", isoElecs[1]->pt());
749  fill("lep1Pt_", isoElecs[0]->pt());
750  fill("lep2Pt_", isoElecs[1]->pt());
751  if (diElecLogged_ <= hists_.find("diElecLogger_")->second->getNbinsY()) {
752  // log runnumber, lumi block, event number & some
753  // more pysics infomation for interesting events
754  fill("diElecLogger_", 0.5, diElecLogged_ + 0.5,
755  event.eventAuxiliary().run());
756  fill("diElecLogger_", 1.5, diElecLogged_ + 0.5,
757  event.eventAuxiliary().luminosityBlock());
758  fill("diElecLogger_", 2.5, diElecLogged_ + 0.5,
759  event.eventAuxiliary().event());
760  fill("diElecLogger_", 3.5, diElecLogged_ + 0.5, isoElecs[0]->pt());
761  fill("diElecLogger_", 4.5, diElecLogged_ + 0.5, isoElecs[1]->pt());
762  if (leadingJets.size() > 0)
763  fill("diElecLogger_", 5.5, diElecLogged_ + 0.5, leadingJets[0].pt());
764  if (leadingJets.size() > 1)
765  fill("diElecLogger_", 6.5, diElecLogged_ + 0.5, leadingJets[1].pt());
766  fill("diElecLogger_", 7.5, diElecLogged_ + 0.5, caloMET.et());
767  ++diElecLogged_;
768  }
769  }
770  }
771 }
772 }
773 
775  : vertexSelect_(0),
776  beamspotSelect_(0),
777  MuonStep(0),
778  ElectronStep(0),
779  PvStep(0),
780  METStep(0) {
781  JetSteps.clear();
782  CaloJetSteps.clear();
783  PFJetSteps.clear();
784  // configure the preselection
785  edm::ParameterSet presel =
786  cfg.getParameter<edm::ParameterSet>("preselection");
787  if (presel.existsAs<edm::ParameterSet>("trigger")) {
788  edm::ParameterSet trigger =
789  presel.getParameter<edm::ParameterSet>("trigger");
790  // triggerTable_=trigger.getParameter<edm::InputTag>("src");
791  triggerTable_ = consumes<edm::TriggerResults>(
792  trigger.getParameter<edm::InputTag>("src"));
793  triggerPaths_ = trigger.getParameter<std::vector<std::string> >("select");
794  }
795  if (presel.existsAs<edm::ParameterSet>("vertex")) {
796  edm::ParameterSet vertex = presel.getParameter<edm::ParameterSet>("vertex");
797  vertex_ = consumes<std::vector<reco::Vertex> >(
798  vertex.getParameter<edm::InputTag>("src"));
800  vertex.getParameter<std::string>("select"));
801  }
802  if (presel.existsAs<edm::ParameterSet>("beamspot")) {
803  edm::ParameterSet beamspot =
804  presel.getParameter<edm::ParameterSet>("beamspot");
805  beamspot_ =
806  consumes<reco::BeamSpot>(beamspot.getParameter<edm::InputTag>("src"));
808  beamspot.getParameter<std::string>("select"));
809  }
810 
811  // conifgure the selection
812  std::vector<edm::ParameterSet> sel =
813  cfg.getParameter<std::vector<edm::ParameterSet> >("selection");
814  for (unsigned int i = 0; i < sel.size(); ++i) {
815  selectionOrder_.push_back(sel.at(i).getParameter<std::string>("label"));
816  selection_[selectionStep(selectionOrder_.back())] = std::make_pair(
817  sel.at(i),
819  selectionStep(selectionOrder_.back()).c_str(),
821  }
822  for (std::vector<std::string>::const_iterator selIt = selectionOrder_.begin();
823  selIt != selectionOrder_.end(); ++selIt) {
824  std::string key = selectionStep(*selIt), type = objectType(*selIt);
825  if (selection_.find(key) != selection_.end()) {
826  if (type == "muons") {
829  }
830  if (type == "elecs") {
832  selection_[key].first, consumesCollector());
833  }
834  if (type == "pvs") {
837  }
838  if (type == "jets") {
840  consumesCollector()));
841  }
842  if (type == "jets/pf") {
845  }
846  if (type == "jets/calo") {
849  }
850  if (type == "met") {
853  }
854  }
855  }
856 }
857 
859  const edm::EventSetup& setup) {
862  if (!event.getByToken(triggerTable_, triggerTable)) return;
863  if (!accept(event, *triggerTable, triggerPaths_)) return;
864  }
865  if (!vertex_.isUninitialized()) {
867  if (!event.getByToken(vertex_, vertex)) return;
868  if (vertex->empty() || !(*vertexSelect_)(vertex->front())) return;
869  }
870  if (!beamspot_.isUninitialized()) {
872  if (!event.getByToken(beamspot_, beamspot)) return;
873  if (!(*beamspotSelect_)(*beamspot)) return;
874  }
875  unsigned int passed = 0;
876 
877  unsigned int nJetSteps = -1;
878 
879  unsigned int nPFJetSteps = -1;
880 
881  unsigned int nCaloJetSteps = -1;
882  // apply selection steps
883  for (std::vector<std::string>::const_iterator selIt = selectionOrder_.begin();
884  selIt != selectionOrder_.end(); ++selIt) {
885  std::string key = selectionStep(*selIt), type = objectType(*selIt);
886  if (selection_.find(key) != selection_.end()) {
887  if (type == "empty") {
888  selection_[key].second->fill(event, setup);
889  }
890  if (type == "muons" && MuonStep != 0) {
891  if (MuonStep->select(event)) {
892  ++passed;
893  selection_[key].second->fill(event, setup);
894  } else
895  break;
896  }
897  if (type == "elecs" && ElectronStep != 0) {
898  if (ElectronStep->select(event, "electron")) {
899  ++passed;
900  selection_[key].second->fill(event, setup);
901  } else
902  break;
903  }
904  if (type == "jets" && JetSteps.size() != 0) {
905  nJetSteps++;
906  if (JetSteps[nJetSteps] != NULL) {
907  if (JetSteps[nJetSteps]->select(event, setup)) {
908  ++passed;
909  selection_[key].second->fill(event, setup);
910  } else
911  break;
912  }
913  }
914 
915  if (type == "jets/pf" && PFJetSteps.size() != 0) {
916  nPFJetSteps++;
917  if (PFJetSteps[nPFJetSteps] != NULL) {
918  if (PFJetSteps[nPFJetSteps]->select(event, setup)) {
919  ++passed;
920  selection_[key].second->fill(event, setup);
921  } else
922  break;
923  }
924  }
925 
926  if (type == "jets/calo" && CaloJetSteps.size() != 0) {
927  nCaloJetSteps++;
928  if (CaloJetSteps[nCaloJetSteps] != NULL) {
929  if (CaloJetSteps[nCaloJetSteps]->select(event, setup)) {
930  ++passed;
931  selection_[key].second->fill(event, setup);
932  } else
933  break;
934  }
935  }
936 
937  if (type == "met" && METStep != 0) {
938  ++passed;
939  if (METStep->select(event)) {
940  selection_[key].second->fill(event, setup);
941  } else
942  break;
943  }
944  }
945  }
946 }
type
Definition: HCALResponse.h:21
StringCutObjectSelector< reco::Vertex > * vertexSelect_
string cut selector
T getParameter(std::string const &) const
std::string selectionStep(const std::string &label)
int i
Definition: DBlmapReader.cc:9
std::vector< std::string > selectionOrder_
std::map< std::string, std::pair< edm::ParameterSet, TopDiLeptonOffline::MonitorEnsemble * > > selection_
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:184
Jets made from CaloTowers.
Definition: CaloJet.h:29
bool select(const edm::Event &event)
apply selection
Level verbosity_
verbosity level for booking
virtual float pt() const
transverse momentum
edm::EDGetTokenT< reco::JetIDValueMap > jetIDLabel_
jetID as an extra selection type
virtual double et() const
transverse energy
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
SelectionStep< reco::MET > * METStep
Base class for all types of Jets.
Definition: Jet.h:20
edm::EDGetTokenT< std::vector< reco::Vertex > > vertex_
primary vertex
MonitorEnsemble(const char *label, const edm::ParameterSet &cfg, edm::ConsumesCollector &&iC)
virtual void analyze(const edm::Event &event, const edm::EventSetup &setup)
do this during the event loop
RunNumber_t run() const
SelectionStep< reco::PFCandidate > * ElectronStep
void loggerBinLabels(std::string hist)
set labels for event logging histograms
#define NULL
Definition: scimark2.h:8
virtual void scaleEnergy(double fScale)
scale energy of the jet
Definition: Jet.cc:444
double deltaR(const T1 &t1, const T2 &t2)
Definition: deltaR.h:48
T eta() const
SelectionStep< reco::Vertex > * PvStep
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:25
void fill(const edm::Event &event, const edm::EventSetup &setup)
fill monitor histograms with electronId and jetCorrections
Jets made from PFObjects.
Definition: PFJet.h:21
edm::EDGetTokenT< edm::View< reco::Jet > > jets_
input sources for monitoring
LuminosityBlockNumber_t luminosityBlock() const
const eventsetup::EventSetupRecord * find(const eventsetup::EventSetupRecordKey &) const
Definition: EventSetup.cc:90
bool overlap(const reco::Muon &muon1, const reco::Muon &muon2, double pullX=1.0, double pullY=1.0, bool checkAdjacentChambers=false)
SelectionStep< reco::PFCandidate > * MuonStep
std::vector< SelectionStep< reco::CaloJet > * > CaloJetSteps
edm::EDGetTokenT< edm::View< reco::PFCandidate > > muons_
StringCutObjectSelector< reco::PFCandidate > * elecIso_
extra isolation criterion on electron
const T & max(const T &a, const T &b)
Definition: MET.h:42
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
double lowerEdge_
mass window upper and lower edge
vector< PseudoJet > jets
std::vector< edm::EDGetTokenT< edm::View< reco::MET > > > mets_
considers a vector of METs
std::vector< std::string > elecMuPaths_
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
bool first
Definition: L1TdeRCT.cc:75
bool isNull() const
Checks for null.
Definition: Ref.h:247
StringCutObjectSelector< reco::PFCandidate, true > * muonIso_
extra isolation criterion on muon
StringCutObjectSelector< reco::BeamSpot > * beamspotSelect_
string cut selector
TopDiLeptonOfflineDQM(const edm::ParameterSet &cfg)
default constructor
void book(std::string directory)
book histograms in subdirectory directory
StringCutObjectSelector< reco::PFCandidate > * elecSelect_
extra selection on electrons
double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:12
EventAuxiliary const & eventAuxiliary() const
Definition: Event.h:69
int elecMuLogged_
number of logged interesting events
std::vector< std::string > diMuonPaths_
trigger paths for di muon channel
std::vector< SelectionStep< reco::Jet > * > JetSteps
std::map< std::string, MonitorElement * > hists_
histogram container
tuple idx
DEBUGGING if hasattr(process,&quot;trackMonIterativeTracking2012&quot;): print &quot;trackMonIterativeTracking2012 D...
static const JetCorrector * getJetCorrector(const std::string &fName, const edm::EventSetup &fSetup)
retrieve corrector from the event setup. troughs exception if something is missing ...
Definition: JetCorrector.cc:50
edm::EDGetTokenT< edm::TriggerResults > triggerTable_
trigger table
list key
Definition: combine.py:13
tuple muons
Definition: patZpeak.py:38
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:81
edm::EDGetTokenT< edm::TriggerResults > triggerTable_
trigger table
std::vector< std::string > triggerPaths_
trigger paths
static EventSetupRecordKey makeKey()
bool isUninitialized() const
Definition: EDGetToken.h:71
std::string objectType(const std::string &label)
StringCutObjectSelector< reco::PFCandidate, true > * muonSelect_
extra selection on muons
StringCutObjectSelector< reco::JetID > * jetIDSelect_
extra jetID selection on calo jets
DecayChannel decayChannel(const std::vector< const reco::PFCandidate * > &muons, const std::vector< const reco::PFCandidate * > &elecs) const
determine dileptonic decay channel
std::vector< SelectionStep< reco::PFJet > * > PFJetSteps
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
edm::EDGetTokenT< reco::BeamSpot > beamspot_
beamspot
edm::EDGetTokenT< edm::ValueMap< float > > electronId_
electronId label
EventNumber_t event() const
void triggerBinLabels(std::string channel, const std::vector< std::string > labels)
set configurable labels for trigger monitoring histograms
edm::EDGetTokenT< edm::View< reco::PFCandidate > > elecs_
Definition: DDAxes.h:10