CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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_(),
56  triggerResults_(),
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 (const auto& tagElectron : *electrons) {
344  for (const 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 //
576 }
577 
578 //
579 // -------------------------------------- book histograms --------------------------------------------
580 //
582  ibooker.cd();
583  ibooker.setCurrentFolder(histFolder_);
584  // since there are endRun manipulations.
585  ibooker.setScope(MonitorElementData::Scope::RUN);
586 
587  dqmoffline::l1t::HistDefinition nVertexDef = histDefinitions_[PlotConfig::nVertex];
588  h_nVertex_ = ibooker.book1D(nVertexDef.name, nVertexDef.title, nVertexDef.nbinsX, nVertexDef.xmin, nVertexDef.xmax);
589  h_tagAndProbeMass_ = ibooker.book1D("tagAndProbeMass", "Invariant mass of tag & probe pair", 100, 40, 140);
590  // electron reco vs L1
591  dqmoffline::l1t::HistDefinition templateETvsET = histDefinitions_[PlotConfig::ETvsET];
593  ibooker.book2D("L1EGammaETvsElectronET_EB",
594  "L1 EGamma E_{T} vs GSF Electron E_{T} (EB); GSF Electron E_{T} (GeV); L1 EGamma E_{T} (GeV)",
595  templateETvsET.nbinsX,
596  &templateETvsET.binsX[0],
597  templateETvsET.nbinsY,
598  &templateETvsET.binsY[0]);
600  ibooker.book2D("L1EGammaETvsElectronET_EE",
601  "L1 EGamma E_{T} vs GSF Electron E_{T} (EE); GSF Electron E_{T} (GeV); L1 EGamma E_{T} (GeV)",
602  templateETvsET.nbinsX,
603  &templateETvsET.binsX[0],
604  templateETvsET.nbinsY,
605  &templateETvsET.binsY[0]);
607  ibooker.book2D("L1EGammaETvsElectronET_EB_EE",
608  "L1 EGamma E_{T} vs GSF Electron E_{T} (EB+EE); GSF Electron E_{T} (GeV); L1 EGamma E_{T} (GeV)",
609  templateETvsET.nbinsX,
610  &templateETvsET.binsX[0],
611  templateETvsET.nbinsY,
612  &templateETvsET.binsY[0]);
613 
614  dqmoffline::l1t::HistDefinition templatePHIvsPHI = histDefinitions_[PlotConfig::PHIvsPHI];
616  "L1EGammaPhivsElectronPhi_EB",
617  "#phi_{electron}^{L1} vs #phi_{electron}^{offline} (EB); #phi_{electron}^{offline}; #phi_{electron}^{L1}",
618  templatePHIvsPHI.nbinsX,
619  templatePHIvsPHI.xmin,
620  templatePHIvsPHI.xmax,
621  templatePHIvsPHI.nbinsY,
622  templatePHIvsPHI.ymin,
623  templatePHIvsPHI.ymax);
625  "L1EGammaPhivsElectronPhi_EE",
626  "#phi_{electron}^{L1} vs #phi_{electron}^{offline} (EE); #phi_{electron}^{offline}; #phi_{electron}^{L1}",
627  templatePHIvsPHI.nbinsX,
628  templatePHIvsPHI.xmin,
629  templatePHIvsPHI.xmax,
630  templatePHIvsPHI.nbinsY,
631  templatePHIvsPHI.ymin,
632  templatePHIvsPHI.ymax);
634  "L1EGammaPhivsElectronPhi_EB_EE",
635  "#phi_{electron}^{L1} vs #phi_{electron}^{offline} (EB+EE); #phi_{electron}^{offline}; #phi_{electron}^{L1}",
636  templatePHIvsPHI.nbinsX,
637  templatePHIvsPHI.xmin,
638  templatePHIvsPHI.xmax,
639  templatePHIvsPHI.nbinsY,
640  templatePHIvsPHI.ymin,
641  templatePHIvsPHI.ymax);
642 
643  h_L1EGammaEtavsElectronEta_ = ibooker.book2D("L1EGammaEtavsElectronEta",
644  "L1 EGamma #eta vs GSF Electron #eta; GSF Electron #eta; L1 EGamma #eta",
645  100,
646  -3,
647  3,
648  100,
649  -3,
650  3);
651 
652  // electron resolutions
654  ibooker.book1D("resolutionElectronET_EB",
655  "electron ET resolution (EB); (L1 EGamma E_{T} - GSF Electron E_{T})/GSF Electron E_{T}; events",
656  50,
657  -1,
658  1.5);
660  ibooker.book1D("resolutionElectronET_EE",
661  "electron ET resolution (EE); (L1 EGamma E_{T} - GSF Electron E_{T})/GSF Electron E_{T}; events",
662  50,
663  -1,
664  1.5);
666  "resolutionElectronET_EB_EE",
667  "electron ET resolution (EB+EE); (L1 EGamma E_{T} - GSF Electron E_{T})/GSF Electron E_{T}; events",
668  50,
669  -1,
670  1.5);
671 
673  ibooker.book1D("resolutionElectronPhi_EB",
674  "#phi_{electron} resolution (EB); #phi_{electron}^{L1} - #phi_{electron}^{offline}; events",
675  120,
676  -0.3,
677  0.3);
679  ibooker.book1D("resolutionElectronPhi_EE",
680  "electron #phi resolution (EE); #phi_{electron}^{L1} - #phi_{electron}^{offline}; events",
681  120,
682  -0.3,
683  0.3);
685  ibooker.book1D("resolutionElectronPhi_EB_EE",
686  "electron #phi resolution (EB+EE); #phi_{electron}^{L1} - #phi_{electron}^{offline}; events",
687  120,
688  -0.3,
689  0.3);
690 
692  ibooker.book1D("resolutionElectronEta",
693  "electron #eta resolution (EB); L1 EGamma #eta - GSF Electron #eta; events",
694  120,
695  -0.3,
696  0.3);
697 
698  // electron turn-ons
700  std::vector<float> electronBins(electronEfficiencyBins_.begin(), electronEfficiencyBins_.end());
701  int nBins = electronBins.size() - 1;
702  float* electronBinArray = &(electronBins[0]);
703 
705  std::string str_threshold = std::to_string(int(threshold));
707  ibooker.book1D("efficiencyElectronET_EB_threshold_" + str_threshold + "_Num",
708  "electron efficiency (EB) (numerator); GSF Electron E_{T} (GeV); events",
709  nBins,
710  electronBinArray);
712  ibooker.book1D("efficiencyElectronET_EE_threshold_" + str_threshold + "_Num",
713  "electron efficiency (EE) (numerator); GSF Electron E_{T} (GeV); events",
714  nBins,
715  electronBinArray);
717  ibooker.book1D("efficiencyElectronET_EB_EE_threshold_" + str_threshold + "_Num",
718  "electron efficiency (EB+EE) (numerator); GSF Electron E_{T} (GeV); events",
719  nBins,
720  electronBinArray);
722  ibooker.book2D("efficiencyElectronPhi_vs_Eta_threshold_" + str_threshold + "_Num",
723  "electron efficiency (numerator); GSF Electron #eta; GSF Electron #phi",
724  50,
725  -2.5,
726  2.5,
727  32,
728  -3.2,
729  3.2);
730 
732  ibooker.book1D("efficiencyElectronET_EB_threshold_" + str_threshold + "_Den",
733  "electron efficiency (EB) (denominator); GSF Electron E_{T} (GeV); events",
734  nBins,
735  electronBinArray);
737  ibooker.book1D("efficiencyElectronET_EE_threshold_" + str_threshold + "_Den",
738  "electron efficiency (EE) (denominator); GSF Electron E_{T} (GeV); events",
739  nBins,
740  electronBinArray);
742  ibooker.book1D("efficiencyElectronET_EB_EE_threshold_" + str_threshold + "_Den",
743  "electron efficiency (EB+EE) (denominator); GSF Electron E_{T} (GeV); events",
744  nBins,
745  electronBinArray);
747  ibooker.book2D("efficiencyElectronPhi_vs_Eta_threshold_" + str_threshold + "_Den",
748  "electron efficiency (denominator); GSF Electron #eta; GSF Electron #phi",
749  50,
750  -2.5,
751  2.5,
752  32,
753  -3.2,
754  3.2);
755  }
756 
758  std::string str_threshold = std::to_string(int(threshold));
760  ibooker.book1D("efficiencyElectronEta_threshold_" + str_threshold + "_Num",
761  "electron efficiency (numerator); GSF Electron #eta; events",
762  50,
763  -2.5,
764  2.5);
766  ibooker.book1D("efficiencyElectronPhi_threshold_" + str_threshold + "_Num",
767  "electron efficiency (numerator); GSF Electron #phi; events",
768  32,
769  -3.2,
770  3.2);
772  ibooker.book1D("efficiencyElectronNVertex_threshold_" + str_threshold + "_Num",
773  "electron efficiency (numerator); Nvtx; events",
774  30,
775  0,
776  60);
777 
779  ibooker.book1D("efficiencyElectronEta_threshold_" + str_threshold + "_Den",
780  "electron efficiency (denominator); GSF Electron #eta; events",
781  50,
782  -2.5,
783  2.5);
785  ibooker.book1D("efficiencyElectronPhi_threshold_" + str_threshold + "_Den",
786  "electron efficiency (denominator); GSF Electron #phi; events",
787  32,
788  -3.2,
789  3.2);
791  ibooker.book1D("efficiencyElectronNVertex_threshold_" + str_threshold + "_Den",
792  "electron efficiency (denominator); Nvtx; events",
793  30,
794  0,
795  60);
796  }
797 
798  ibooker.cd();
799 }
800 
802  ibooker.cd();
803  ibooker.setCurrentFolder(histFolder_);
804 
805  dqmoffline::l1t::HistDefinition templateETvsET = histDefinitions_[PlotConfig::ETvsET];
807  ibooker.book2D("L1EGammaETvsPhotonET_EB",
808  "L1 EGamma E_{T} vs Photon E_{T} (EB); Photon E_{T} (GeV); L1 EGamma E_{T} (GeV)",
809  templateETvsET.nbinsX,
810  &templateETvsET.binsX[0],
811  templateETvsET.nbinsY,
812  &templateETvsET.binsY[0]);
814  ibooker.book2D("L1EGammaETvsPhotonET_EE",
815  "L1 EGamma E_{T} vs Photon E_{T} (EE); Photon E_{T} (GeV); L1 EGamma E_{T} (GeV)",
816  templateETvsET.nbinsX,
817  &templateETvsET.binsX[0],
818  templateETvsET.nbinsY,
819  &templateETvsET.binsY[0]);
821  ibooker.book2D("L1EGammaETvsPhotonET_EB_EE",
822  "L1 EGamma E_{T} vs Photon E_{T} (EB+EE); Photon E_{T} (GeV); L1 EGamma E_{T} (GeV)",
823  templateETvsET.nbinsX,
824  &templateETvsET.binsX[0],
825  templateETvsET.nbinsY,
826  &templateETvsET.binsY[0]);
827 
828  dqmoffline::l1t::HistDefinition templatePHIvsPHI = histDefinitions_[PlotConfig::PHIvsPHI];
830  ibooker.book2D("L1EGammaPhivsPhotonPhi_EB",
831  "#phi_{photon}^{L1} vs #phi_{photon}^{offline} (EB); #phi_{photon}^{offline}; #phi_{photon}^{L1}",
832  templatePHIvsPHI.nbinsX,
833  templatePHIvsPHI.xmin,
834  templatePHIvsPHI.xmax,
835  templatePHIvsPHI.nbinsY,
836  templatePHIvsPHI.ymin,
837  templatePHIvsPHI.ymax);
839  ibooker.book2D("L1EGammaPhivsPhotonPhi_EE",
840  "#phi_{photon}^{L1} vs #phi_{photon}^{offline} (EE); #phi_{photon}^{offline}; #phi_{photon}^{L1}",
841  templatePHIvsPHI.nbinsX,
842  templatePHIvsPHI.xmin,
843  templatePHIvsPHI.xmax,
844  templatePHIvsPHI.nbinsY,
845  templatePHIvsPHI.ymin,
846  templatePHIvsPHI.ymax);
848  "L1EGammaPhivsPhotonPhi_EB_EE",
849  "#phi_{photon}^{L1} vs #phi_{photon}^{offline} (EB+EE); #phi_{photon}^{offline}; #phi_{photon}^{L1}",
850  templatePHIvsPHI.nbinsX,
851  templatePHIvsPHI.xmin,
852  templatePHIvsPHI.xmax,
853  templatePHIvsPHI.nbinsY,
854  templatePHIvsPHI.ymin,
855  templatePHIvsPHI.ymax);
856 
858  "L1EGammaEtavsPhotonEta", "L1 EGamma #eta vs Photon #eta; Photon #eta; L1 EGamma #eta", 100, -3, 3, 100, -3, 3);
859 
860  // photon resolutions
862  ibooker.book1D("resolutionPhotonET_EB",
863  "photon ET resolution (EB); (L1 EGamma E_{T} - Photon E_{T})/ Photon E_{T}; events",
864  50,
865  -1,
866  1.5);
868  ibooker.book1D("resolutionPhotonET_EE",
869  "photon ET resolution (EE); (L1 EGamma E_{T} - Photon E_{T})/ Photon E_{T}; events",
870  50,
871  -1,
872  1.5);
874  ibooker.book1D("resolutionPhotonET_EB_EE",
875  "photon ET resolution (EB+EE); (L1 EGamma E_{T} - Photon E_{T})/ Photon E_{T}; events",
876  50,
877  -1,
878  1.5);
879 
881  ibooker.book1D("resolutionPhotonPhi_EB",
882  "#phi_{photon} resolution (EB); #phi_{photon}^{L1} - #phi_{photon}^{offline}; events",
883  120,
884  -0.3,
885  0.3);
887  ibooker.book1D("resolutionPhotonPhi_EE",
888  "photon #phi resolution (EE); #phi_{photon}^{L1} - #phi_{photon}^{offline}; events",
889  120,
890  -0.3,
891  0.3);
893  ibooker.book1D("resolutionPhotonPhi_EB_EE",
894  "photon #phi resolution (EB+EE); #phi_{photon}^{L1} - #phi_{photon}^{offline}; events",
895  120,
896  -0.3,
897  0.3);
898 
899  h_resolutionPhotonEta_ = ibooker.book1D(
900  "resolutionPhotonEta", "photon #eta resolution (EB); L1 EGamma #eta - Photon #eta; events", 120, -0.3, 0.3);
901 
902  // photon turn-ons
904  std::vector<float> photonBins(photonEfficiencyBins_.begin(), photonEfficiencyBins_.end());
905  int nBins = photonBins.size() - 1;
906  float* photonBinArray = &(photonBins[0]);
907 
909  std::string str_threshold = std::to_string(int(threshold));
911  ibooker.book1D("efficiencyPhotonET_EB_threshold_" + str_threshold + "_Num",
912  "photon efficiency (EB) (numerator); Photon E_{T} (GeV); events",
913  nBins,
914  photonBinArray);
916  ibooker.book1D("efficiencyPhotonET_EE_threshold_" + str_threshold + "_Num",
917  "photon efficiency (EE) (numerator); Photon E_{T} (GeV); events",
918  nBins,
919  photonBinArray);
921  ibooker.book1D("efficiencyPhotonET_EB_EE_threshold_" + str_threshold + "_Num",
922  "photon efficiency (EB+EE) (numerator); Photon E_{T} (GeV); events",
923  nBins,
924  photonBinArray);
925 
927  ibooker.book1D("efficiencyPhotonET_EB_threshold_" + str_threshold + "_Den",
928  "photon efficiency (EB) (denominator); Photon E_{T} (GeV); events",
929  nBins,
930  photonBinArray);
932  ibooker.book1D("efficiencyPhotonET_EE_threshold_" + str_threshold + "_Den",
933  "photon efficiency (EE) (denominator); Photon E_{T} (GeV); events",
934  nBins,
935  photonBinArray);
937  ibooker.book1D("efficiencyPhotonET_EB_EE_threshold_" + str_threshold + "_Den",
938  "photon efficiency (EB+EE) (denominator); Photon E_{T} (GeV); events",
939  nBins,
940  photonBinArray);
941  }
942 
943  ibooker.cd();
944 }
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
std::vector< float > binsX
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
BXVector< EGamma > EGammaBxCollection
Definition: EGamma.h:10
void bookElectronHistos(DQMStore::IBooker &)
std::map< double, MonitorElement * > h_efficiencyElectronNVertex_pass_
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_
trigger::TriggerObjectCollection getMatchedTriggerObjects(double eta, double phi, double maxDeltaR, const trigger::TriggerObjectCollection triggerObjects)
Definition: L1TCommon.cc:114
constexpr char Photon[]
Definition: modules.cc:14
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_
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
double maxDeltaRForL1Matching_
bool passesMediumEleId(reco::GsfElectron const &electron) const
MonitorElement * h_L1EGammaETvsPhotonET_EB_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
edm::EDGetTokenT< std::vector< reco::Photon > > thePhotonCollection_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::map< double, MonitorElement * > h_efficiencyElectronET_EB_EE_pass_
ParameterSet const & getParameterSet(ParameterSetID const &id)
dictionary results
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)
virtual MonitorElementData::Scope setScope(MonitorElementData::Scope newscope)
Definition: DQMStore.cc:46
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_
MonitorElement * h_resolutionElectronET_EB_
std::map< double, MonitorElement * > h_efficiencyElectronET_EB_total_
dqmoffline::l1t::HistDefinitions histDefinitions_
bool passesLooseEleId(reco::GsfElectron const &electron) const
void bookPhotonHistos(DQMStore::IBooker &)
Log< level::Error, false > LogError
~L1TEGammaOffline() override
std::map< double, MonitorElement * > h_efficiencyElectronPhi_vs_Eta_total_
L1TEGammaOffline(const edm::ParameterSet &ps)
std::vector< Vertex > VertexCollection
Definition: Vertex.h:12
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
double maxDeltaRForHLTMatching_
float hadronicOverEm() const
Definition: GsfElectron.h:500
std::vector< double > electronEfficiencyThresholds_
MonitorElement * h_L1EGammaPhivsPhotonPhi_EB_EE_
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:496
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
Log< level::Info, false > LogInfo
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
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:177
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:896
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_
std::vector< double > photonEfficiencyBins_
double et() const final
transverse energy
MonitorElement * h_L1EGammaETvsPhotonET_EB_EE_
MonitorElement * h_L1EGammaETvsElectronET_EE_
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_
Log< level::Warning, false > LogWarning
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
std::map< double, MonitorElement * > h_efficiencyElectronET_EB_pass_
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
double phi() const final
momentum azimuthal angle
MonitorElement * h_L1EGammaPhivsElectronPhi_EB_
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
#define LogDebug(id)
double eta() const final
momentum pseudorapidity