CMS 3D CMS Logo

L1TEGammaOffline.cc
Go to the documentation of this file.
4 
7 // Geometry
12 #include "TLorentzVector.h"
13 
14 #include <iostream>
15 #include <iomanip>
16 #include <cstdio>
17 #include <string>
18 #include <sstream>
19 #include <cmath>
20 #include <algorithm>
21 
22 const std::map<std::string, unsigned int> L1TEGammaOffline::PlotConfigNames = {
23  {"nVertex", PlotConfig::nVertex}, {"ETvsET", PlotConfig::ETvsET}, {"PHIvsPHI", PlotConfig::PHIvsPHI}};
24 
25 //
26 // -------------------------------------- Constructor --------------------------------------------
27 //
29  : theGsfElectronCollection_(
30  consumes<reco::GsfElectronCollection>(ps.getParameter<edm::InputTag>("electronCollection"))),
31  thePhotonCollection_(consumes<std::vector<reco::Photon> >(ps.getParameter<edm::InputTag>("photonCollection"))),
32  thePVCollection_(consumes<reco::VertexCollection>(ps.getParameter<edm::InputTag>("PVCollection"))),
33  theBSCollection_(consumes<reco::BeamSpot>(ps.getParameter<edm::InputTag>("beamSpotCollection"))),
34  triggerInputTag_(consumes<trigger::TriggerEvent>(ps.getParameter<edm::InputTag>("triggerInputTag"))),
35  triggerResultsInputTag_(consumes<edm::TriggerResults>(ps.getParameter<edm::InputTag>("triggerResults"))),
36  triggerProcess_(ps.getParameter<std::string>("triggerProcess")),
37  triggerNames_(ps.getParameter<std::vector<std::string> >("triggerNames")),
38  histFolder_(ps.getParameter<std::string>("histFolder")),
39  efficiencyFolder_(histFolder_ + "/efficiency_raw"),
40  stage2CaloLayer2EGammaToken_(
41  consumes<l1t::EGammaBxCollection>(ps.getParameter<edm::InputTag>("stage2CaloLayer2EGammaSource"))),
42  electronEfficiencyThresholds_(ps.getParameter<std::vector<double> >("electronEfficiencyThresholds")),
43  electronEfficiencyBins_(ps.getParameter<std::vector<double> >("electronEfficiencyBins")),
44  probeToL1Offset_(ps.getParameter<double>("probeToL1Offset")),
45  deepInspectionElectronThresholds_(ps.getParameter<std::vector<double> >("deepInspectionElectronThresholds")),
46  photonEfficiencyThresholds_(ps.getParameter<std::vector<double> >("photonEfficiencyThresholds")),
47  photonEfficiencyBins_(ps.getParameter<std::vector<double> >("photonEfficiencyBins")),
48  maxDeltaRForL1Matching_(ps.getParameter<double>("maxDeltaRForL1Matching")),
49  maxDeltaRForHLTMatching_(ps.getParameter<double>("maxDeltaRForHLTMatching")),
50  recoToL1TThresholdFactor_(ps.getParameter<double>("recoToL1TThresholdFactor")),
51  tagElectron_(),
52  probeElectron_(),
53  tagAndProbleInvariantMass_(-1.),
54  hltConfig_(),
55  triggerIndices_(),
57  triggerEvent_(),
58  histDefinitions_(dqmoffline::l1t::readHistDefinitions(ps.getParameterSet("histDefinitions"), PlotConfigNames)),
59  h_nVertex_(),
60  h_tagAndProbeMass_(),
61  h_L1EGammaETvsElectronET_EB_(),
62  h_L1EGammaETvsElectronET_EE_(),
63  h_L1EGammaETvsElectronET_EB_EE_(),
64  h_L1EGammaPhivsElectronPhi_EB_(),
65  h_L1EGammaPhivsElectronPhi_EE_(),
66  h_L1EGammaPhivsElectronPhi_EB_EE_(),
67  h_L1EGammaEtavsElectronEta_(),
68  h_resolutionElectronET_EB_(),
69  h_resolutionElectronET_EE_(),
70  h_resolutionElectronET_EB_EE_(),
71  h_resolutionElectronPhi_EB_(),
72  h_resolutionElectronPhi_EE_(),
73  h_resolutionElectronPhi_EB_EE_(),
74  h_resolutionElectronEta_(),
75  h_efficiencyElectronET_EB_pass_(),
76  h_efficiencyElectronET_EE_pass_(),
77  h_efficiencyElectronET_EB_EE_pass_(),
78  h_efficiencyElectronPhi_vs_Eta_pass_(),
79  h_efficiencyElectronEta_pass_(),
80  h_efficiencyElectronPhi_pass_(),
81  h_efficiencyElectronNVertex_pass_(),
82  h_efficiencyElectronET_EB_total_(),
83  h_efficiencyElectronET_EE_total_(),
84  h_efficiencyElectronET_EB_EE_total_(),
85  h_efficiencyElectronPhi_vs_Eta_total_(),
86  h_efficiencyElectronEta_total_(),
87  h_efficiencyElectronPhi_total_(),
88  h_efficiencyElectronNVertex_total_(),
89  h_L1EGammaETvsPhotonET_EB_(),
90  h_L1EGammaETvsPhotonET_EE_(),
91  h_L1EGammaETvsPhotonET_EB_EE_(),
92  h_L1EGammaPhivsPhotonPhi_EB_(),
93  h_L1EGammaPhivsPhotonPhi_EE_(),
94  h_L1EGammaPhivsPhotonPhi_EB_EE_(),
95  h_L1EGammaEtavsPhotonEta_(),
96  h_resolutionPhotonEta_(),
97  h_efficiencyPhotonET_EB_pass_(),
98  h_efficiencyPhotonET_EE_pass_(),
99  h_efficiencyPhotonET_EB_EE_pass_(),
100  h_efficiencyPhotonET_EB_total_(),
101  h_efficiencyPhotonET_EE_total_(),
102  h_efficiencyPhotonET_EB_EE_total_() {
103  edm::LogInfo("L1TEGammaOffline") << "Constructor "
104  << "L1TEGammaOffline::L1TEGammaOffline " << std::endl;
105 }
106 
107 //
108 // -- Destructor
109 //
111  edm::LogInfo("L1TEGammaOffline") << "Destructor L1TEGammaOffline::~L1TEGammaOffline " << std::endl;
112 }
113 
114 //
115 // -------------------------------------- beginRun --------------------------------------------
116 //
117 void L1TEGammaOffline::dqmBeginRun(edm::Run const& iRun, edm::EventSetup const& iSetup) {
118  edm::LogInfo("L1TEGammaOffline") << "L1TEGammaOffline::beginRun" << std::endl;
119  bool changed(true);
120  if (!hltConfig_.init(iRun, iSetup, triggerProcess_, changed)) {
121  edm::LogError("L1TEGammaOffline") << " HLT config extraction failure with process name " << triggerProcess_
122  << std::endl;
123  triggerNames_.clear();
124  } else {
126  }
127 }
128 
129 //
130 // -------------------------------------- bookHistos --------------------------------------------
131 //
133  edm::LogInfo("L1TEGammaOffline") << "L1TEGammaOffline::bookHistograms" << std::endl;
134 
135  //book at beginRun
136  bookElectronHistos(ibooker);
137  // bookPhotonHistos(ibooker);
138 }
139 
140 //
141 // -------------------------------------- Analyze --------------------------------------------
142 //
144  edm::LogInfo("L1TEGammaOffline") << "L1TEGammaOffline::analyze" << std::endl;
145 
146  edm::Handle<edm::TriggerResults> triggerResultHandle;
147  e.getByToken(triggerResultsInputTag_, triggerResultHandle);
148  if (!triggerResultHandle.isValid()) {
149  edm::LogWarning("L1TEGammaOffline") << "invalid edm::TriggerResults handle" << std::endl;
150  return;
151  }
152  triggerResults_ = *triggerResultHandle;
153 
154  edm::Handle<trigger::TriggerEvent> triggerEventHandle;
155  e.getByToken(triggerInputTag_, triggerEventHandle);
156  if (!triggerEventHandle.isValid()) {
157  edm::LogWarning("L1TEGammaOffline") << "invalid trigger::TriggerEvent handle" << std::endl;
158  return;
159  }
160  triggerEvent_ = *triggerEventHandle;
161 
163  e.getByToken(thePVCollection_, vertexHandle);
164  if (!vertexHandle.isValid()) {
165  edm::LogWarning("L1TEGammaOffline") << "invalid collection: vertex " << std::endl;
166  return;
167  }
168 
169  unsigned int nVertex = vertexHandle->size();
171 
173  return;
174  }
175  // L1T
176  fillElectrons(e, nVertex);
177  // fillPhotons(e, nVertex);
178 }
179 
180 void L1TEGammaOffline::fillElectrons(edm::Event const& e, const unsigned int nVertex) {
183 
185  e.getByToken(theGsfElectronCollection_, gsfElectrons);
186 
187  if (!gsfElectrons.isValid()) {
188  edm::LogWarning("L1TEGammaOffline") << "invalid collection: GSF electrons " << std::endl;
189  return;
190  }
191  if (gsfElectrons->empty()) {
192  LogDebug("L1TEGammaOffline") << "empty collection: GSF electrons " << std::endl;
193  return;
194  }
195  if (!l1EGamma.isValid()) {
196  edm::LogWarning("L1TEGammaOffline") << "invalid collection: L1 EGamma " << std::endl;
197  return;
198  }
199  if (!findTagAndProbePair(gsfElectrons)) {
200  LogDebug("L1TEGammaOffline") << "Could not find a tag & probe pair" << std::endl;
201  return; //continue to next event
202  }
203 
204  auto probeElectron = probeElectron_;
205 
206  // find corresponding L1 EG
208  l1t::EGamma closestL1EGamma;
209  bool foundMatch = false;
210 
211  int bunchCrossing = 0;
212  for (auto egamma = l1EGamma->begin(bunchCrossing); egamma != l1EGamma->end(bunchCrossing); ++egamma) {
213  double currentDeltaR = deltaR(egamma->eta(), egamma->phi(), probeElectron.eta(), probeElectron.phi());
214  if (currentDeltaR > minDeltaR) {
215  continue;
216  } else {
217  minDeltaR = currentDeltaR;
218  closestL1EGamma = *egamma;
219  foundMatch = true;
220  }
221  }
222 
223  if (!foundMatch) {
224  LogDebug("L1TEGammaOffline") << "Could not find a matching L1 EGamma " << std::endl;
225  return;
226  }
227 
228  double recoEt = probeElectron.et();
229  double recoEta = probeElectron.eta();
230  double recoPhi = probeElectron.phi();
231 
232  double l1Et = closestL1EGamma.et();
233  double l1Eta = closestL1EGamma.eta();
234  double l1Phi = closestL1EGamma.phi();
235 
236  // if no reco value, relative resolution does not make sense -> sort to overflow
237  double outOfBounds = 9999;
238  double resolutionEt = recoEt > 0 ? (l1Et - recoEt) / recoEt : outOfBounds;
239  double resolutionEta = l1Eta - recoEta;
240  double resolutionPhi = reco::deltaPhi(l1Phi, recoPhi);
241 
242  using namespace dqmoffline::l1t;
243  // eta
246 
247  // plots for deeper inspection
249  if (recoEt > threshold * recoToL1TThresholdFactor_) {
253  if (l1Et > threshold + probeToL1Offset_) {
254  fillWithinLimits(h_efficiencyElectronEta_pass_[threshold], recoEta);
255  fillWithinLimits(h_efficiencyElectronPhi_pass_[threshold], recoPhi);
257  }
258  }
259  }
260 
262  if (recoEt > threshold * recoToL1TThresholdFactor_) {
264  if (l1Et > threshold + probeToL1Offset_) {
265  fill2DWithinLimits(h_efficiencyElectronPhi_vs_Eta_pass_[threshold], recoEta, recoPhi);
266  }
267  }
268  }
269 
270  if (std::abs(recoEta) <= 1.479) { // barrel
271  // et
274  //resolution
277  // phi
280  // resolution
283 
284  // turn-ons
285  for (auto threshold : electronEfficiencyThresholds_) {
288  if (l1Et > threshold) {
291  }
292  }
293  } else { // end-cap
294  // et
297  //resolution
300  // phi
303  // resolution
306 
307  // turn-ons
308  for (auto threshold : electronEfficiencyThresholds_) {
311  if (l1Et > threshold) {
314  }
315  }
316  }
317 }
318 
338  bool foundBoth(false);
339  auto nElectrons = electrons->size();
340  if (nElectrons < 2)
341  return false;
342 
343  for (auto tagElectron : *electrons) {
344  for (auto probeElectron : *electrons) {
345  if (tagElectron.p4() == probeElectron.p4())
346  continue;
347 
348  auto combined(tagElectron.p4() + probeElectron.p4());
349  auto tagAbsEta = std::abs(tagElectron.eta());
350  auto probeAbsEta = std::abs(probeElectron.eta());
351 
352  // EB-EE transition region
353  bool isEBEEGap = tagElectron.isEBEEGap() || probeElectron.isEBEEGap();
354  bool passesEta = !isEBEEGap && tagAbsEta < 2.5 && probeAbsEta < 2.5;
355  bool passesCharge = tagElectron.charge() == -probeElectron.charge();
356 
357  // https://github.com/ikrav/cmssw/blob/egm_id_80X_v1/RecoEgamma/ElectronIdentification/plugins/cuts/GsfEleFull5x5SigmaIEtaIEtaCut.cc#L45
358  bool tagPassesMediumID = passesMediumEleId(tagElectron) && tagElectron.et() > 30.;
359  bool probePassesLooseID = passesLooseEleId(probeElectron);
360  bool passesInvariantMass = combined.M() > 60 && combined.M() < 120;
361  bool tagMatchesHLTObject = matchesAnHLTObject(tagElectron.eta(), tagElectron.phi());
362 
363  if (passesEta && passesInvariantMass && passesCharge && tagPassesMediumID && probePassesLooseID &&
364  tagMatchesHLTObject) {
365  foundBoth = true;
366  tagElectron_ = tagElectron;
367  probeElectron_ = probeElectron;
368  // plot tag & probe invariant mass
370  return foundBoth;
371  }
372  }
373  }
374  return foundBoth;
375 }
376 
384  const float ecal_energy_inverse = 1.0 / electron.ecalEnergy();
385  const float eSCoverP = electron.eSuperClusterOverP();
386  const float eOverP = std::abs(1.0 - eSCoverP) * ecal_energy_inverse;
387 
388  if (electron.isEB() && eOverP > 0.241)
389  return false;
390  if (electron.isEE() && eOverP > 0.14)
391  return false;
392  if (electron.isEB() && std::abs(electron.deltaEtaSuperClusterTrackAtVtx()) > 0.00477)
393  return false;
394  if (electron.isEE() && std::abs(electron.deltaEtaSuperClusterTrackAtVtx()) > 0.00868)
395  return false;
396  if (electron.isEB() && std::abs(electron.deltaPhiSuperClusterTrackAtVtx()) > 0.222)
397  return false;
398  if (electron.isEE() && std::abs(electron.deltaPhiSuperClusterTrackAtVtx()) > 0.213)
399  return false;
400  if (electron.isEB() && electron.scSigmaIEtaIEta() > 0.011)
401  return false;
402  if (electron.isEE() && electron.scSigmaIEtaIEta() > 0.0314)
403  return false;
404  if (electron.isEB() && electron.hadronicOverEm() > 0.298)
405  return false;
406  if (electron.isEE() && electron.hadronicOverEm() > 0.101)
407  return false;
408  return true;
409 }
410 
411 /*
412  * Structure from
413  * https://github.com/cms-sw/cmssw/blob/CMSSW_9_0_X/DQMOffline/EGamma/plugins/ElectronAnalyzer.cc
414  * Values from
415  * https://twiki.cern.ch/twiki/bin/view/CMS/CutBasedElectronIdentificationRun2
416  */
418  const float ecal_energy_inverse = 1.0 / electron.ecalEnergy();
419  const float eSCoverP = electron.eSuperClusterOverP();
420  const float eOverP = std::abs(1.0 - eSCoverP) * ecal_energy_inverse;
421 
422  if (electron.isEB() && eOverP < 0.134)
423  return false;
424  if (electron.isEE() && eOverP > 0.13)
425  return false;
426  if (electron.isEB() && std::abs(electron.deltaEtaSuperClusterTrackAtVtx()) > 0.00311)
427  return false;
428  if (electron.isEE() && std::abs(electron.deltaEtaSuperClusterTrackAtVtx()) > 0.00609)
429  return false;
430  if (electron.isEB() && std::abs(electron.deltaPhiSuperClusterTrackAtVtx()) > 0.103)
431  return false;
432  if (electron.isEE() && std::abs(electron.deltaPhiSuperClusterTrackAtVtx()) > 0.045)
433  return false;
434  if (electron.isEB() && electron.scSigmaIEtaIEta() > 0.00998)
435  return false;
436  if (electron.isEE() && electron.scSigmaIEtaIEta() > 0.0298)
437  return false;
438  if (electron.isEB() && electron.hadronicOverEm() > 0.253)
439  return false;
440  if (electron.isEE() && electron.hadronicOverEm() > 0.0878)
441  return false;
442  return true;
443 }
444 
445 bool L1TEGammaOffline::matchesAnHLTObject(double eta, double phi) const {
446  // get HLT objects of fired triggers
447  using namespace dqmoffline::l1t;
449  std::vector<unsigned int> firedTriggers = getFiredTriggerIndices(triggerIndices_, results);
450  std::vector<edm::InputTag> hltFilters = getHLTFilters(firedTriggers, hltConfig_, triggerProcess_);
451  const trigger::TriggerObjectCollection hltObjects = getTriggerObjects(hltFilters, triggerEvent_);
452  const trigger::TriggerObjectCollection matchedObjects =
453  getMatchedTriggerObjects(eta, phi, maxDeltaRForHLTMatching_, hltObjects);
454 
455  return !matchedObjects.empty();
456 }
457 
458 void L1TEGammaOffline::fillPhotons(edm::Event const& e, const unsigned int nVertex) {
459  // TODO - just an example here
462 
464  e.getByToken(thePhotonCollection_, photons);
465 
466  if (!photons.isValid()) {
467  edm::LogWarning("L1TEGammaOffline") << "invalid collection: reco::Photons " << std::endl;
468  return;
469  }
470  if (!l1EGamma.isValid()) {
471  edm::LogWarning("L1TEGammaOffline") << "invalid collection: L1 EGamma " << std::endl;
472  return;
473  }
474 
475  if (photons->empty()) {
476  LogDebug("L1TEGammaOffline") << "No photons found in event." << std::endl;
477  return;
478  }
479 
480  auto probePhoton = photons->at(0);
481 
482  double minDeltaR = 0.3;
483  l1t::EGamma closestL1EGamma;
484  bool foundMatch = false;
485 
486  int bunchCrossing = 0;
487  for (auto egamma = l1EGamma->begin(bunchCrossing); egamma != l1EGamma->end(bunchCrossing); ++egamma) {
488  double currentDeltaR = deltaR(egamma->eta(), egamma->phi(), probePhoton.eta(), probePhoton.phi());
489  if (currentDeltaR > minDeltaR) {
490  continue;
491  } else {
492  minDeltaR = currentDeltaR;
493  closestL1EGamma = *egamma;
494  foundMatch = true;
495  }
496  }
497 
498  if (!foundMatch) {
499  LogDebug("L1TEGammaOffline") << "Could not find a matching L1 EGamma " << std::endl;
500  return;
501  }
502 
503  double recoEt = probePhoton.et();
504  double recoEta = probePhoton.eta();
505  double recoPhi = probePhoton.phi();
506 
507  double l1Et = closestL1EGamma.et();
508  double l1Eta = closestL1EGamma.eta();
509  double l1Phi = closestL1EGamma.phi();
510 
511  // if no reco value, relative resolution does not make sense -> sort to overflow
512  double outOfBounds = 9999;
513  double resolutionEt = recoEt > 0 ? (l1Et - recoEt) / recoEt : outOfBounds;
514  double resolutionEta = l1Eta - recoEta;
515  double resolutionPhi = reco::deltaPhi(l1Phi, recoPhi);
516 
517  using namespace dqmoffline::l1t;
518  // eta
521 
522  if (std::abs(recoEta) <= 1.479) { // barrel
523  // et
526  //resolution
529  // phi
532  // resolution
535 
536  // turn-ons
540  if (l1Et > threshold) {
543  }
544  }
545  } else { // end-cap
546  // et
549  //resolution
552  // phi
555  // resolution
558 
559  // turn-ons
563  if (l1Et > threshold) {
566  }
567  }
568  }
569 }
570 
571 //
572 // -------------------------------------- endRun --------------------------------------------
573 //
575  edm::LogInfo("L1TEGammaOffline") << "L1TEGammaOffline::endRun" << std::endl;
576 }
577 
578 //
579 // -------------------------------------- book histograms --------------------------------------------
580 //
582  ibooker.cd();
583  ibooker.setCurrentFolder(histFolder_);
584 
586  h_nVertex_ = ibooker.book1D(nVertexDef.name, nVertexDef.title, nVertexDef.nbinsX, nVertexDef.xmin, nVertexDef.xmax);
587  h_tagAndProbeMass_ = ibooker.book1D("tagAndProbeMass", "Invariant mass of tag & probe pair", 100, 40, 140);
588  // electron reco vs L1
591  ibooker.book2D("L1EGammaETvsElectronET_EB",
592  "L1 EGamma E_{T} vs GSF Electron E_{T} (EB); GSF Electron E_{T} (GeV); L1 EGamma E_{T} (GeV)",
593  templateETvsET.nbinsX,
594  &templateETvsET.binsX[0],
595  templateETvsET.nbinsY,
596  &templateETvsET.binsY[0]);
598  ibooker.book2D("L1EGammaETvsElectronET_EE",
599  "L1 EGamma E_{T} vs GSF Electron E_{T} (EE); GSF Electron E_{T} (GeV); L1 EGamma E_{T} (GeV)",
600  templateETvsET.nbinsX,
601  &templateETvsET.binsX[0],
602  templateETvsET.nbinsY,
603  &templateETvsET.binsY[0]);
605  ibooker.book2D("L1EGammaETvsElectronET_EB_EE",
606  "L1 EGamma E_{T} vs GSF Electron E_{T} (EB+EE); GSF Electron E_{T} (GeV); L1 EGamma E_{T} (GeV)",
607  templateETvsET.nbinsX,
608  &templateETvsET.binsX[0],
609  templateETvsET.nbinsY,
610  &templateETvsET.binsY[0]);
611 
614  "L1EGammaPhivsElectronPhi_EB",
615  "#phi_{electron}^{L1} vs #phi_{electron}^{offline} (EB); #phi_{electron}^{offline}; #phi_{electron}^{L1}",
616  templatePHIvsPHI.nbinsX,
617  templatePHIvsPHI.xmin,
618  templatePHIvsPHI.xmax,
619  templatePHIvsPHI.nbinsY,
620  templatePHIvsPHI.ymin,
621  templatePHIvsPHI.ymax);
623  "L1EGammaPhivsElectronPhi_EE",
624  "#phi_{electron}^{L1} vs #phi_{electron}^{offline} (EE); #phi_{electron}^{offline}; #phi_{electron}^{L1}",
625  templatePHIvsPHI.nbinsX,
626  templatePHIvsPHI.xmin,
627  templatePHIvsPHI.xmax,
628  templatePHIvsPHI.nbinsY,
629  templatePHIvsPHI.ymin,
630  templatePHIvsPHI.ymax);
632  "L1EGammaPhivsElectronPhi_EB_EE",
633  "#phi_{electron}^{L1} vs #phi_{electron}^{offline} (EB+EE); #phi_{electron}^{offline}; #phi_{electron}^{L1}",
634  templatePHIvsPHI.nbinsX,
635  templatePHIvsPHI.xmin,
636  templatePHIvsPHI.xmax,
637  templatePHIvsPHI.nbinsY,
638  templatePHIvsPHI.ymin,
639  templatePHIvsPHI.ymax);
640 
641  h_L1EGammaEtavsElectronEta_ = ibooker.book2D("L1EGammaEtavsElectronEta",
642  "L1 EGamma #eta vs GSF Electron #eta; GSF Electron #eta; L1 EGamma #eta",
643  100,
644  -3,
645  3,
646  100,
647  -3,
648  3);
649 
650  // electron resolutions
652  ibooker.book1D("resolutionElectronET_EB",
653  "electron ET resolution (EB); (L1 EGamma E_{T} - GSF Electron E_{T})/GSF Electron E_{T}; events",
654  50,
655  -1,
656  1.5);
658  ibooker.book1D("resolutionElectronET_EE",
659  "electron ET resolution (EE); (L1 EGamma E_{T} - GSF Electron E_{T})/GSF Electron E_{T}; events",
660  50,
661  -1,
662  1.5);
664  "resolutionElectronET_EB_EE",
665  "electron ET resolution (EB+EE); (L1 EGamma E_{T} - GSF Electron E_{T})/GSF Electron E_{T}; events",
666  50,
667  -1,
668  1.5);
669 
671  ibooker.book1D("resolutionElectronPhi_EB",
672  "#phi_{electron} resolution (EB); #phi_{electron}^{L1} - #phi_{electron}^{offline}; events",
673  120,
674  -0.3,
675  0.3);
677  ibooker.book1D("resolutionElectronPhi_EE",
678  "electron #phi resolution (EE); #phi_{electron}^{L1} - #phi_{electron}^{offline}; events",
679  120,
680  -0.3,
681  0.3);
683  ibooker.book1D("resolutionElectronPhi_EB_EE",
684  "electron #phi resolution (EB+EE); #phi_{electron}^{L1} - #phi_{electron}^{offline}; events",
685  120,
686  -0.3,
687  0.3);
688 
690  ibooker.book1D("resolutionElectronEta",
691  "electron #eta resolution (EB); L1 EGamma #eta - GSF Electron #eta; events",
692  120,
693  -0.3,
694  0.3);
695 
696  // electron turn-ons
698  std::vector<float> electronBins(electronEfficiencyBins_.begin(), electronEfficiencyBins_.end());
699  int nBins = electronBins.size() - 1;
700  float* electronBinArray = &(electronBins[0]);
701 
703  std::string str_threshold = std::to_string(int(threshold));
705  ibooker.book1D("efficiencyElectronET_EB_threshold_" + str_threshold + "_Num",
706  "electron efficiency (EB) (numerator); GSF Electron E_{T} (GeV); events",
707  nBins,
708  electronBinArray);
710  ibooker.book1D("efficiencyElectronET_EE_threshold_" + str_threshold + "_Num",
711  "electron efficiency (EE) (numerator); GSF Electron E_{T} (GeV); events",
712  nBins,
713  electronBinArray);
715  ibooker.book1D("efficiencyElectronET_EB_EE_threshold_" + str_threshold + "_Num",
716  "electron efficiency (EB+EE) (numerator); GSF Electron E_{T} (GeV); events",
717  nBins,
718  electronBinArray);
720  ibooker.book2D("efficiencyElectronPhi_vs_Eta_threshold_" + str_threshold + "_Num",
721  "electron efficiency (numerator); GSF Electron #eta; GSF Electron #phi",
722  50,
723  -2.5,
724  2.5,
725  32,
726  -3.2,
727  3.2);
728 
730  ibooker.book1D("efficiencyElectronET_EB_threshold_" + str_threshold + "_Den",
731  "electron efficiency (EB) (denominator); GSF Electron E_{T} (GeV); events",
732  nBins,
733  electronBinArray);
735  ibooker.book1D("efficiencyElectronET_EE_threshold_" + str_threshold + "_Den",
736  "electron efficiency (EE) (denominator); GSF Electron E_{T} (GeV); events",
737  nBins,
738  electronBinArray);
740  ibooker.book1D("efficiencyElectronET_EB_EE_threshold_" + str_threshold + "_Den",
741  "electron efficiency (EB+EE) (denominator); GSF Electron E_{T} (GeV); events",
742  nBins,
743  electronBinArray);
745  ibooker.book2D("efficiencyElectronPhi_vs_Eta_threshold_" + str_threshold + "_Den",
746  "electron efficiency (denominator); GSF Electron #eta; GSF Electron #phi",
747  50,
748  -2.5,
749  2.5,
750  32,
751  -3.2,
752  3.2);
753  }
754 
756  std::string str_threshold = std::to_string(int(threshold));
758  ibooker.book1D("efficiencyElectronEta_threshold_" + str_threshold + "_Num",
759  "electron efficiency (numerator); GSF Electron #eta; events",
760  50,
761  -2.5,
762  2.5);
764  ibooker.book1D("efficiencyElectronPhi_threshold_" + str_threshold + "_Num",
765  "electron efficiency (numerator); GSF Electron #phi; events",
766  32,
767  -3.2,
768  3.2);
770  ibooker.book1D("efficiencyElectronNVertex_threshold_" + str_threshold + "_Num",
771  "electron efficiency (numerator); Nvtx; events",
772  30,
773  0,
774  60);
775 
777  ibooker.book1D("efficiencyElectronEta_threshold_" + str_threshold + "_Den",
778  "electron efficiency (denominator); GSF Electron #eta; events",
779  50,
780  -2.5,
781  2.5);
783  ibooker.book1D("efficiencyElectronPhi_threshold_" + str_threshold + "_Den",
784  "electron efficiency (denominator); GSF Electron #phi; events",
785  32,
786  -3.2,
787  3.2);
789  ibooker.book1D("efficiencyElectronNVertex_threshold_" + str_threshold + "_Den",
790  "electron efficiency (denominator); Nvtx; events",
791  30,
792  0,
793  60);
794  }
795 
796  ibooker.cd();
797 }
798 
800  ibooker.cd();
801  ibooker.setCurrentFolder(histFolder_);
802 
805  ibooker.book2D("L1EGammaETvsPhotonET_EB",
806  "L1 EGamma E_{T} vs Photon E_{T} (EB); Photon E_{T} (GeV); L1 EGamma E_{T} (GeV)",
807  templateETvsET.nbinsX,
808  &templateETvsET.binsX[0],
809  templateETvsET.nbinsY,
810  &templateETvsET.binsY[0]);
812  ibooker.book2D("L1EGammaETvsPhotonET_EE",
813  "L1 EGamma E_{T} vs Photon E_{T} (EE); Photon E_{T} (GeV); L1 EGamma E_{T} (GeV)",
814  templateETvsET.nbinsX,
815  &templateETvsET.binsX[0],
816  templateETvsET.nbinsY,
817  &templateETvsET.binsY[0]);
819  ibooker.book2D("L1EGammaETvsPhotonET_EB_EE",
820  "L1 EGamma E_{T} vs Photon E_{T} (EB+EE); Photon E_{T} (GeV); L1 EGamma E_{T} (GeV)",
821  templateETvsET.nbinsX,
822  &templateETvsET.binsX[0],
823  templateETvsET.nbinsY,
824  &templateETvsET.binsY[0]);
825 
828  ibooker.book2D("L1EGammaPhivsPhotonPhi_EB",
829  "#phi_{photon}^{L1} vs #phi_{photon}^{offline} (EB); #phi_{photon}^{offline}; #phi_{photon}^{L1}",
830  templatePHIvsPHI.nbinsX,
831  templatePHIvsPHI.xmin,
832  templatePHIvsPHI.xmax,
833  templatePHIvsPHI.nbinsY,
834  templatePHIvsPHI.ymin,
835  templatePHIvsPHI.ymax);
837  ibooker.book2D("L1EGammaPhivsPhotonPhi_EE",
838  "#phi_{photon}^{L1} vs #phi_{photon}^{offline} (EE); #phi_{photon}^{offline}; #phi_{photon}^{L1}",
839  templatePHIvsPHI.nbinsX,
840  templatePHIvsPHI.xmin,
841  templatePHIvsPHI.xmax,
842  templatePHIvsPHI.nbinsY,
843  templatePHIvsPHI.ymin,
844  templatePHIvsPHI.ymax);
846  "L1EGammaPhivsPhotonPhi_EB_EE",
847  "#phi_{photon}^{L1} vs #phi_{photon}^{offline} (EB+EE); #phi_{photon}^{offline}; #phi_{photon}^{L1}",
848  templatePHIvsPHI.nbinsX,
849  templatePHIvsPHI.xmin,
850  templatePHIvsPHI.xmax,
851  templatePHIvsPHI.nbinsY,
852  templatePHIvsPHI.ymin,
853  templatePHIvsPHI.ymax);
854 
856  "L1EGammaEtavsPhotonEta", "L1 EGamma #eta vs Photon #eta; Photon #eta; L1 EGamma #eta", 100, -3, 3, 100, -3, 3);
857 
858  // photon resolutions
860  ibooker.book1D("resolutionPhotonET_EB",
861  "photon ET resolution (EB); (L1 EGamma E_{T} - Photon E_{T})/ Photon E_{T}; events",
862  50,
863  -1,
864  1.5);
866  ibooker.book1D("resolutionPhotonET_EE",
867  "photon ET resolution (EE); (L1 EGamma E_{T} - Photon E_{T})/ Photon E_{T}; events",
868  50,
869  -1,
870  1.5);
872  ibooker.book1D("resolutionPhotonET_EB_EE",
873  "photon ET resolution (EB+EE); (L1 EGamma E_{T} - Photon E_{T})/ Photon E_{T}; events",
874  50,
875  -1,
876  1.5);
877 
879  ibooker.book1D("resolutionPhotonPhi_EB",
880  "#phi_{photon} resolution (EB); #phi_{photon}^{L1} - #phi_{photon}^{offline}; events",
881  120,
882  -0.3,
883  0.3);
885  ibooker.book1D("resolutionPhotonPhi_EE",
886  "photon #phi resolution (EE); #phi_{photon}^{L1} - #phi_{photon}^{offline}; events",
887  120,
888  -0.3,
889  0.3);
891  ibooker.book1D("resolutionPhotonPhi_EB_EE",
892  "photon #phi resolution (EB+EE); #phi_{photon}^{L1} - #phi_{photon}^{offline}; events",
893  120,
894  -0.3,
895  0.3);
896 
897  h_resolutionPhotonEta_ = ibooker.book1D(
898  "resolutionPhotonEta", "photon #eta resolution (EB); L1 EGamma #eta - Photon #eta; events", 120, -0.3, 0.3);
899 
900  // photon turn-ons
902  std::vector<float> photonBins(photonEfficiencyBins_.begin(), photonEfficiencyBins_.end());
903  int nBins = photonBins.size() - 1;
904  float* photonBinArray = &(photonBins[0]);
905 
907  std::string str_threshold = std::to_string(int(threshold));
909  ibooker.book1D("efficiencyPhotonET_EB_threshold_" + str_threshold + "_Num",
910  "photon efficiency (EB) (numerator); Photon E_{T} (GeV); events",
911  nBins,
912  photonBinArray);
914  ibooker.book1D("efficiencyPhotonET_EE_threshold_" + str_threshold + "_Num",
915  "photon efficiency (EE) (numerator); Photon E_{T} (GeV); events",
916  nBins,
917  photonBinArray);
919  ibooker.book1D("efficiencyPhotonET_EB_EE_threshold_" + str_threshold + "_Num",
920  "photon efficiency (EB+EE) (numerator); Photon E_{T} (GeV); events",
921  nBins,
922  photonBinArray);
923 
925  ibooker.book1D("efficiencyPhotonET_EB_threshold_" + str_threshold + "_Den",
926  "photon efficiency (EB) (denominator); Photon E_{T} (GeV); events",
927  nBins,
928  photonBinArray);
930  ibooker.book1D("efficiencyPhotonET_EE_threshold_" + str_threshold + "_Den",
931  "photon efficiency (EE) (denominator); Photon E_{T} (GeV); events",
932  nBins,
933  photonBinArray);
935  ibooker.book1D("efficiencyPhotonET_EB_EE_threshold_" + str_threshold + "_Den",
936  "photon efficiency (EB+EE) (denominator); Photon E_{T} (GeV); events",
937  nBins,
938  photonBinArray);
939  }
940 
941  ibooker.cd();
942 }
943 
945 
947  std::vector<MonitorElement*> monElementstoNormalize = {h_L1EGammaETvsElectronET_EB_,
961 
962  for (auto mon : monElementstoNormalize) {
963  if (mon != nullptr) {
964  auto h = mon->getTH2F();
965  if (h != nullptr) {
966  h->Scale(1, "width");
967  }
968  }
969  }
970 }
971 
972 //define this as a plug-in
#define LogDebug(id)
std::vector< float > binsX
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
BXVector< EGamma > EGammaBxCollection
Definition: EGamma.h:10
const_iterator end(int bx) const
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX)
Definition: DQMStore.cc:239
void bookElectronHistos(DQMStore::IBooker &)
std::map< double, MonitorElement * > h_efficiencyElectronNVertex_pass_
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
void fillPhotons(edm::Event const &e, const unsigned int nVertex)
std::vector< double > electronEfficiencyBins_
MonitorElement * h_resolutionElectronPhi_EB_EE_
MonitorElement * h_L1EGammaPhivsElectronPhi_EE_
edm::EDGetTokenT< reco::GsfElectronCollection > theGsfElectronCollection_
MonitorElement * h_tagAndProbeMass_
Definition: Photon.py:1
double eta() const final
momentum pseudorapidity
trigger::TriggerObjectCollection getMatchedTriggerObjects(double eta, double phi, double maxDeltaR, const trigger::TriggerObjectCollection triggerObjects)
Definition: L1TCommon.cc:114
std::map< double, MonitorElement * > h_efficiencyPhotonET_EE_total_
MonitorElement * h_L1EGammaETvsElectronET_EB_EE_
float eSuperClusterOverP() const
Definition: GsfElectron.h:221
std::map< double, MonitorElement * > h_efficiencyPhotonET_EB_pass_
MonitorElement * h_L1EGammaPhivsPhotonPhi_EB_
double maxDeltaRForL1Matching_
bool passesMediumEleId(reco::GsfElectron const &electron) const
MonitorElement * h_L1EGammaETvsPhotonET_EB_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
edm::EDGetTokenT< std::vector< reco::Photon > > thePhotonCollection_
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:418
std::map< double, MonitorElement * > h_efficiencyElectronET_EB_EE_pass_
ParameterSet const & getParameterSet(ParameterSetID const &id)
std::string histFolder_
const std::vector< std::string > & triggerNames() const
names of trigger paths
MonitorElement * h_L1EGammaETvsPhotonET_EE_
void fillElectrons(edm::Event const &e, const unsigned int nVertex)
std::map< double, MonitorElement * > h_efficiencyElectronPhi_pass_
std::map< double, MonitorElement * > h_efficiencyPhotonET_EB_EE_total_
trigger::TriggerObjectCollection getTriggerObjects(const std::vector< edm::InputTag > &hltFilters, const trigger::TriggerEvent &triggerEvent)
Definition: L1TCommon.cc:75
MonitorElement * h_resolutionPhotonET_EE_
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
MonitorElement * h_resolutionElectronET_EB_
std::map< double, MonitorElement * > h_efficiencyElectronET_EB_total_
dqmoffline::l1t::HistDefinitions histDefinitions_
delete x;
Definition: CaloConfig.h:22
bool passesLooseEleId(reco::GsfElectron const &electron) const
void bookPhotonHistos(DQMStore::IBooker &)
~L1TEGammaOffline() override
std::map< double, MonitorElement * > h_efficiencyElectronPhi_vs_Eta_total_
L1TEGammaOffline(const edm::ParameterSet &ps)
MonitorElement * h_L1EGammaETvsElectronET_EB_
std::map< double, MonitorElement * > h_efficiencyElectronPhi_vs_Eta_pass_
std::vector< GsfElectron > GsfElectronCollection
collection of GsfElectron objects
MonitorElement * h_L1EGammaPhivsElectronPhi_EB_EE_
std::map< double, MonitorElement * > h_efficiencyPhotonET_EB_EE_pass_
bool isEE() const
Definition: GsfElectron.h:329
bool isEB() const
Definition: GsfElectron.h:328
std::vector< unsigned int > getTriggerIndices(const std::vector< std::string > &requestedTriggers, const std::vector< std::string > &triggersInEvent)
Definition: L1TCommon.cc:10
MonitorElement * h_resolutionElectronET_EE_
edm::EDGetTokenT< trigger::TriggerEvent > triggerInputTag_
void dqmEndRun(edm::Run const &run, edm::EventSetup const &eSetup) override
void normalise2DHistogramsToBinArea()
float deltaEtaSuperClusterTrackAtVtx() const
Definition: GsfElectron.h:225
void endJob() override
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
double maxDeltaRForHLTMatching_
float hadronicOverEm() const
Definition: GsfElectron.h:468
std::vector< double > electronEfficiencyThresholds_
MonitorElement * h_L1EGammaPhivsPhotonPhi_EB_EE_
double et() const final
transverse energy
std::map< double, MonitorElement * > h_efficiencyElectronEta_pass_
float deltaPhiSuperClusterTrackAtVtx() const
Definition: GsfElectron.h:228
std::map< double, MonitorElement * > h_efficiencyElectronNVertex_total_
MonitorElement * h_L1EGammaEtavsElectronEta_
std::string triggerProcess_
std::vector< edm::InputTag > getHLTFilters(const std::vector< unsigned int > &triggers, const HLTConfigProvider &hltConfig, const std::string triggerProcess)
Definition: L1TCommon.cc:99
MonitorElement * h_resolutionPhotonET_EB_
edm::EDGetTokenT< l1t::EGammaBxCollection > stage2CaloLayer2EGammaToken_
MonitorElement * h_resolutionElectronEta_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
reco::GsfElectron tagElectron_
void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override
bool isValid() const
Definition: HandleBase.h:70
MonitorElement * h_resolutionPhotonEta_
float scSigmaIEtaIEta() const
Definition: GsfElectron.h:464
MonitorElement * h_L1EGammaPhivsPhotonPhi_EE_
edm::EDGetTokenT< edm::TriggerResults > triggerResultsInputTag_
static const std::map< std::string, unsigned int > PlotConfigNames
std::map< double, MonitorElement * > h_efficiencyElectronET_EE_total_
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
HLTConfigProvider hltConfig_
std::vector< TriggerObject > TriggerObjectCollection
collection of trigger physics objects (e.g., all isolated muons)
Definition: TriggerObject.h:75
HistDefinitions readHistDefinitions(const edm::ParameterSet &ps, const std::map< std::string, unsigned int > &mapping)
bool findTagAndProbePair(edm::Handle< reco::GsfElectronCollection > const &electrons)
std::map< double, MonitorElement * > h_efficiencyPhotonET_EB_total_
std::string efficiencyFolder_
std::map< double, MonitorElement * > h_efficiencyElectronET_EE_pass_
std::vector< double > deepInspectionElectronThresholds_
std::vector< float > binsY
reco::GsfElectron probeElectron_
bool matchesAnHLTObject(double eta, double phi) const
MonitorElement * h_resolutionPhotonPhi_EB_EE_
std::vector< bool > getTriggerResults(const std::vector< unsigned int > &triggers, const edm::TriggerResults &triggerResults)
Definition: L1TCommon.cc:34
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
void fill2DWithinLimits(MonitorElement *mon, double valueX, double valueY, double weight=1.)
std::map< double, MonitorElement * > h_efficiencyElectronPhi_total_
MonitorElement * h_resolutionElectronET_EB_EE_
float ecalEnergy() const
Definition: GsfElectron.h:812
std::map< double, MonitorElement * > h_efficiencyElectronEta_total_
std::map< double, MonitorElement * > h_efficiencyElectronET_EB_EE_total_
std::vector< std::string > triggerNames_
MonitorElement * h_resolutionElectronPhi_EB_
edm::TriggerResults triggerResults_
MonitorElement * h_nVertex_
void fillWithinLimits(MonitorElement *mon, double value, double weight=1.)
MonitorElement * h_resolutionPhotonPhi_EB_
fixed size matrix
std::vector< double > photonEfficiencyBins_
HLT enums.
MonitorElement * h_L1EGammaETvsPhotonET_EB_EE_
MonitorElement * h_L1EGammaETvsElectronET_EE_
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Definition: DQMStore.cc:266
MonitorElement * h_resolutionElectronPhi_EE_
MonitorElement * h_L1EGammaEtavsPhotonEta_
MonitorElement * h_resolutionPhotonPhi_EE_
edm::EDGetTokenT< reco::VertexCollection > thePVCollection_
std::vector< unsigned int > triggerIndices_
std::vector< double > photonEfficiencyThresholds_
std::map< double, MonitorElement * > h_efficiencyElectronET_EB_pass_
const_iterator begin(int bx) const
MonitorElement * h_L1EGammaPhivsElectronPhi_EB_
double phi() const final
momentum azimuthal angle
std::map< double, MonitorElement * > h_efficiencyPhotonET_EE_pass_
MonitorElement * h_resolutionPhotonET_EB_EE_
double recoToL1TThresholdFactor_
trigger::TriggerEvent triggerEvent_
std::vector< unsigned int > getFiredTriggerIndices(const std::vector< unsigned int > &triggers, const std::vector< bool > &triggerResults)
Definition: L1TCommon.cc:54
Definition: Run.h:45
bool passesAnyTriggerFromList(const std::vector< unsigned int > &triggers, const edm::TriggerResults &triggerResults)
Definition: L1TCommon.cc:66