CMS 3D CMS Logo

L1TEGammaOffline.cc
Go to the documentation of this file.
4 
7 // Geometry
11 #include "TLorentzVector.h"
12 
13 #include <iostream>
14 #include <iomanip>
15 #include <cstdio>
16 #include <string>
17 #include <sstream>
18 #include <cmath>
19 #include <algorithm>
20 
21 
22 const std::map<std::string, unsigned int> L1TEGammaOffline::PlotConfigNames = {
23  {"nVertex", PlotConfig::nVertex},
24  {"ETvsET", PlotConfig::ETvsET},
25  {"PHIvsPHI", PlotConfig::PHIvsPHI}
26 };
27 
28 //
29 // -------------------------------------- Constructor --------------------------------------------
30 //
32  theGsfElectronCollection_(
33  consumes < reco::GsfElectronCollection > (ps.getParameter < edm::InputTag > ("electronCollection"))),
34  thePhotonCollection_(
35  consumes < std::vector<reco::Photon> > (ps.getParameter < edm::InputTag > ("photonCollection"))),
36  thePVCollection_(consumes < reco::VertexCollection > (ps.getParameter < edm::InputTag > ("PVCollection"))),
37  theBSCollection_(consumes < reco::BeamSpot > (ps.getParameter < edm::InputTag > ("beamSpotCollection"))),
38  triggerInputTag_(consumes < trigger::TriggerEvent > (ps.getParameter < edm::InputTag > ("triggerInputTag"))),
39  triggerResultsInputTag_(consumes<edm::TriggerResults>(ps.getParameter<edm::InputTag>("triggerResults"))),
40  triggerProcess_(ps.getParameter < std::string > ("triggerProcess")),
41  triggerNames_(ps.getParameter < std::vector<std::string> > ("triggerNames")),
42  histFolder_(ps.getParameter < std::string > ("histFolder")),
43  efficiencyFolder_(histFolder_ + "/efficiency_raw"),
44  stage2CaloLayer2EGammaToken_(
45  consumes < l1t::EGammaBxCollection > (ps.getParameter < edm::InputTag > ("stage2CaloLayer2EGammaSource"))),
46  electronEfficiencyThresholds_(ps.getParameter < std::vector<double> > ("electronEfficiencyThresholds")),
47  electronEfficiencyBins_(ps.getParameter < std::vector<double> > ("electronEfficiencyBins")),
48  probeToL1Offset_(ps.getParameter <double> ("probeToL1Offset")),
49  deepInspectionElectronThresholds_(ps.getParameter < std::vector<double> > ("deepInspectionElectronThresholds")),
50  photonEfficiencyThresholds_(ps.getParameter < std::vector<double> > ("photonEfficiencyThresholds")),
51  photonEfficiencyBins_(ps.getParameter < std::vector<double> > ("photonEfficiencyBins")),
52  tagElectron_(),
53  probeElectron_(),
54  tagAndProbleInvariantMass_(-1.),
55  hltConfig_(),
56  triggerIndices_(),
57  triggerResults_(),
58  triggerEvent_(),
59  histDefinitions_(dqmoffline::l1t::readHistDefinitions(ps.getParameterSet("histDefinitions"), PlotConfigNames))
60 {
61  edm::LogInfo("L1TEGammaOffline") << "Constructor " << "L1TEGammaOffline::L1TEGammaOffline " << std::endl;
62 }
63 
64 //
65 // -- Destructor
66 //
68 {
69  edm::LogInfo("L1TEGammaOffline") << "Destructor L1TEGammaOffline::~L1TEGammaOffline " << std::endl;
70 }
71 
72 //
73 // -------------------------------------- beginRun --------------------------------------------
74 //
75 void L1TEGammaOffline::dqmBeginRun(edm::Run const & iRun, edm::EventSetup const & iSetup)
76 {
77  edm::LogInfo("L1TEGammaOffline") << "L1TEGammaOffline::beginRun" << std::endl;
78  bool changed(true);
79  if (!hltConfig_.init(iRun, iSetup, triggerProcess_, changed)) {
80  edm::LogError("L1TEGammaOffline")
81  << " HLT config extraction failure with process name "
82  << triggerProcess_<< std::endl;
83  triggerNames_.clear();
84  } else {
86  }
87 }
88 
89 //
90 // -------------------------------------- bookHistos --------------------------------------------
91 //
93 {
94  edm::LogInfo("L1TEGammaOffline") << "L1TEGammaOffline::bookHistograms" << std::endl;
95 
96  //book at beginRun
97  bookElectronHistos(ibooker);
98  bookPhotonHistos(ibooker);
99 }
100 //
101 // -------------------------------------- beginLuminosityBlock --------------------------------------------
102 //
104 {
105  edm::LogInfo("L1TEGammaOffline") << "L1TEGammaOffline::beginLuminosityBlock" << std::endl;
106 }
107 
108 //
109 // -------------------------------------- Analyze --------------------------------------------
110 //
112 {
113  edm::LogInfo("L1TEGammaOffline") << "L1TEGammaOffline::analyze" << std::endl;
114 
115  edm::Handle<edm::TriggerResults> triggerResultHandle;
116  e.getByToken(triggerResultsInputTag_, triggerResultHandle);
117  if (!triggerResultHandle.isValid()) {
118  edm::LogWarning("L1TEGammaOffline") << "invalid edm::TriggerResults handle" << std::endl;
119  return;
120  }
121  triggerResults_ = *triggerResultHandle;
122 
123  edm::Handle<trigger::TriggerEvent> triggerEventHandle;
124  e.getByToken(triggerInputTag_, triggerEventHandle);
125  if (!triggerEventHandle.isValid()) {
126  edm::LogWarning("L1TEGammaOffline") << "invalid trigger::TriggerEvent handle" << std::endl;
127  return;
128  }
129  triggerEvent_ = *triggerEventHandle;
130 
132  e.getByToken(thePVCollection_, vertexHandle);
133  if (!vertexHandle.isValid()) {
134  edm::LogWarning("L1TEGammaOffline") << "invalid collection: vertex " << std::endl;
135  return;
136  }
137 
138  unsigned int nVertex = vertexHandle->size();
140 
142  return;
143  }
144  // L1T
145  fillElectrons(e, nVertex);
146  fillPhotons(e, nVertex);
147 }
148 
149 void L1TEGammaOffline::fillElectrons(edm::Event const& e, const unsigned int nVertex)
150 {
153 
155  e.getByToken(theGsfElectronCollection_, gsfElectrons);
156 
157  if (!gsfElectrons.isValid()) {
158  edm::LogWarning("L1TEGammaOffline") << "invalid collection: GSF electrons " << std::endl;
159  return;
160  }
161  if (gsfElectrons->empty()) {
162  LogDebug("L1TEGammaOffline") << "empty collection: GSF electrons " << std::endl;
163  return;
164  }
165  if (!l1EGamma.isValid()) {
166  edm::LogWarning("L1TEGammaOffline") << "invalid collection: L1 EGamma " << std::endl;
167  return;
168  }
169  if (!findTagAndProbePair(gsfElectrons)) {
170  LogDebug("L1TEGammaOffline") << "Could not find a tag & probe pair" << std::endl;
171  return; //continue to next event
172  }
173 
174  auto probeElectron = probeElectron_;
175 
176  // find corresponding L1 EG
177  double minDeltaR = 0.3;
178  l1t::EGamma closestL1EGamma;
179  bool foundMatch = false;
180 
181  int bunchCrossing = 0;
182  for (auto egamma = l1EGamma->begin(bunchCrossing); egamma != l1EGamma->end(bunchCrossing); ++egamma) {
183  double currentDeltaR = deltaR(egamma->eta(), egamma->phi(), probeElectron.eta(), probeElectron.phi());
184  if (currentDeltaR > minDeltaR) {
185  continue;
186  } else {
187  minDeltaR = currentDeltaR;
188  closestL1EGamma = *egamma;
189  foundMatch = true;
190  }
191 
192  }
193 
194  if (!foundMatch) {
195  LogDebug("L1TEGammaOffline") << "Could not find a matching L1 EGamma " << std::endl;
196  return;
197  }
198 
199  double recoEt = probeElectron.et();
200  double recoEta = probeElectron.eta();
201  double recoPhi = probeElectron.phi();
202 
203  double l1Et = closestL1EGamma.et();
204  double l1Eta = closestL1EGamma.eta();
205  double l1Phi = closestL1EGamma.phi();
206 
207  // if no reco value, relative resolution does not make sense -> sort to overflow
208  double outOfBounds = 9999;
209  double resolutionEt = recoEt > 0 ? (l1Et - recoEt) / recoEt : outOfBounds;
210  double resolutionEta = std::abs(recoEta) > 0 ? (l1Eta - recoEta) / recoEta : outOfBounds;
211  double resolutionPhi = std::abs(recoPhi) > 0 ? (l1Phi - recoPhi) / recoPhi : outOfBounds;
212 
213  using namespace dqmoffline::l1t;
214  // eta
217 
218  // plots for deeper inspection
223  if(recoEt > threshold){
224  fillWithinLimits(h_efficiencyElectronEta_pass_[threshold], recoEta);
225  fillWithinLimits(h_efficiencyElectronPhi_pass_[threshold], recoPhi);
227  }
228  }
229 
232  recoEta, recoPhi);
233  if(l1Et > threshold + probeToL1Offset_){
235  recoEta, recoPhi);
236  }
237  }
238 
239  if (std::abs(recoEta) <= 1.479) { // barrel
240  // et
243  //resolution
246  // phi
249  // resolution
252 
253  // turn-ons
254  for (auto threshold : electronEfficiencyThresholds_) {
257  if (l1Et > threshold) {
260  }
261  }
262  } else { // end-cap
263  // et
266  //resolution
269  // phi
272  // resolution
275 
276  // turn-ons
277  for (auto threshold : electronEfficiencyThresholds_) {
280  if (l1Et > threshold) {
283  }
284  }
285  }
286 }
287 
307 {
308  bool foundBoth(false);
309  auto nElectrons = electrons->size();
310  if (nElectrons < 2)
311  return false;
312 
313  for (auto tagElectron : *electrons) {
314  for (auto probeElectron : *electrons) {
315  if (tagElectron.p4() == probeElectron.p4())
316  continue;
317 
318  auto combined(tagElectron.p4() + probeElectron.p4());
319  auto tagAbsEta = std::abs(tagElectron.eta());
320  auto probeAbsEta = std::abs(probeElectron.eta());
321 
322  // EB-EE transition region
323  bool isEBEEGap = tagElectron.isEBEEGap() || probeElectron.isEBEEGap();
324  bool passesEta = !isEBEEGap && tagAbsEta < 2.5 && probeAbsEta < 2.5;
325  bool passesCharge = tagElectron.charge() == -probeElectron.charge();
326 
327  // https://github.com/ikrav/cmssw/blob/egm_id_80X_v1/RecoEgamma/ElectronIdentification/plugins/cuts/GsfEleFull5x5SigmaIEtaIEtaCut.cc#L45
328  bool tagPassesMediumID = passesMediumEleId(tagElectron) && tagElectron.et() > 30.;
329  bool probePassesLooseID = passesLooseEleId(probeElectron);
330  bool passesInvariantMass = combined.M() > 60 && combined.M() < 120;
331  bool tagMatchesHLTObject = matchesAnHLTObject(tagElectron.eta(), tagElectron.phi());
332 
333  if (passesEta && passesInvariantMass && passesCharge && tagPassesMediumID &&
334  probePassesLooseID && tagMatchesHLTObject) {
335  foundBoth = true;
336  tagElectron_ = tagElectron;
337  probeElectron_ = probeElectron;
338  // plot tag & probe invariant mass
340  return foundBoth;
341  }
342  }
343 
344  }
345  return foundBoth;
346 }
347 
355 {
356  const float ecal_energy_inverse = 1.0 / electron.ecalEnergy();
357  const float eSCoverP = electron.eSuperClusterOverP();
358  const float eOverP = std::abs(1.0 - eSCoverP) * ecal_energy_inverse;
359 
360  if (electron.isEB() && eOverP > 0.241)
361  return false;
362  if (electron.isEE() && eOverP > 0.14)
363  return false;
364  if (electron.isEB() && std::abs(electron.deltaEtaSuperClusterTrackAtVtx()) > 0.00477)
365  return false;
366  if (electron.isEE() && std::abs(electron.deltaEtaSuperClusterTrackAtVtx()) > 0.00868)
367  return false;
368  if (electron.isEB() && std::abs(electron.deltaPhiSuperClusterTrackAtVtx()) > 0.222)
369  return false;
370  if (electron.isEE() && std::abs(electron.deltaPhiSuperClusterTrackAtVtx()) > 0.213)
371  return false;
372  if (electron.isEB() && electron.scSigmaIEtaIEta() > 0.011)
373  return false;
374  if (electron.isEE() && electron.scSigmaIEtaIEta() > 0.0314)
375  return false;
376  if (electron.isEB() && electron.hadronicOverEm() > 0.298)
377  return false;
378  if (electron.isEE() && electron.hadronicOverEm() > 0.101)
379  return false;
380  return true;
381 }
382 
383 /*
384  * Structure from
385  * https://github.com/cms-sw/cmssw/blob/CMSSW_9_0_X/DQMOffline/EGamma/plugins/ElectronAnalyzer.cc
386  * Values from
387  * https://twiki.cern.ch/twiki/bin/view/CMS/CutBasedElectronIdentificationRun2
388  */
390 {
391  const float ecal_energy_inverse = 1.0 / electron.ecalEnergy();
392  const float eSCoverP = electron.eSuperClusterOverP();
393  const float eOverP = std::abs(1.0 - eSCoverP) * ecal_energy_inverse;
394 
395  if (electron.isEB() && eOverP < 0.134)
396  return false;
397  if (electron.isEE() && eOverP > 0.13)
398  return false;
399  if (electron.isEB() && std::abs(electron.deltaEtaSuperClusterTrackAtVtx()) > 0.00311)
400  return false;
401  if (electron.isEE() && std::abs(electron.deltaEtaSuperClusterTrackAtVtx()) > 0.00609)
402  return false;
403  if (electron.isEB() && std::abs(electron.deltaPhiSuperClusterTrackAtVtx()) > 0.103)
404  return false;
405  if (electron.isEE() && std::abs(electron.deltaPhiSuperClusterTrackAtVtx()) > 0.045)
406  return false;
407  if (electron.isEB() && electron.scSigmaIEtaIEta() > 0.00998)
408  return false;
409  if (electron.isEE() && electron.scSigmaIEtaIEta() > 0.0298)
410  return false;
411  if (electron.isEB() && electron.hadronicOverEm() > 0.253)
412  return false;
413  if (electron.isEE() && electron.hadronicOverEm() > 0.0878)
414  return false;
415  return true;
416 }
417 
418 bool L1TEGammaOffline::matchesAnHLTObject(double eta, double phi) const{
419  // get HLT objects of fired triggers
420  using namespace dqmoffline::l1t;
422  std::vector<unsigned int> firedTriggers = getFiredTriggerIndices(triggerIndices_, results);
423  std::vector<edm::InputTag> hltFilters = getHLTFilters(firedTriggers, hltConfig_, triggerProcess_);
424  const trigger::TriggerObjectCollection hltObjects = getTriggerObjects(hltFilters, triggerEvent_);
425  const trigger::TriggerObjectCollection matchedObjects = getMatchedTriggerObjects(eta, phi, 0.3, hltObjects);
426 
427  return !matchedObjects.empty();
428 }
429 
430 void L1TEGammaOffline::fillPhotons(edm::Event const& e, const unsigned int nVertex)
431 {
432  // TODO - just an example here
435 
437  e.getByToken(thePhotonCollection_, photons);
438 
439  if (!photons.isValid()) {
440  edm::LogWarning("L1TEGammaOffline") << "invalid collection: reco::Photons " << std::endl;
441  return;
442  }
443  if (!l1EGamma.isValid()) {
444  edm::LogWarning("L1TEGammaOffline") << "invalid collection: L1 EGamma " << std::endl;
445  return;
446  }
447 
448  if(photons->empty()){
449  LogDebug("L1TEGammaOffline") << "No photons found in event." << std::endl;
450  return;
451  }
452 
453  auto probePhoton = photons->at(0);
454 
455  double minDeltaR = 0.3;
456  l1t::EGamma closestL1EGamma;
457  bool foundMatch = false;
458 
459  int bunchCrossing = 0;
460  for (auto egamma = l1EGamma->begin(bunchCrossing); egamma != l1EGamma->end(bunchCrossing); ++egamma) {
461  double currentDeltaR = deltaR(egamma->eta(), egamma->phi(), probePhoton.eta(), probePhoton.phi());
462  if (currentDeltaR > minDeltaR) {
463  continue;
464  } else {
465  minDeltaR = currentDeltaR;
466  closestL1EGamma = *egamma;
467  foundMatch = true;
468  }
469 
470  }
471 
472  if (!foundMatch) {
473  LogDebug("L1TEGammaOffline") << "Could not find a matching L1 EGamma " << std::endl;
474  return;
475  }
476 
477  double recoEt = probePhoton.et();
478  double recoEta = probePhoton.eta();
479  double recoPhi = probePhoton.phi();
480 
481  double l1Et = closestL1EGamma.et();
482  double l1Eta = closestL1EGamma.eta();
483  double l1Phi = closestL1EGamma.phi();
484 
485  // if no reco value, relative resolution does not make sense -> sort to overflow
486  double outOfBounds = 9999;
487  double resolutionEt = recoEt > 0 ? (l1Et - recoEt) / recoEt : outOfBounds;
488  double resolutionEta = std::abs(recoEta) > 0 ? (l1Eta - recoEta) / recoEta : outOfBounds;
489  double resolutionPhi = std::abs(recoPhi) > 0 ? (l1Phi - recoPhi) / recoPhi : outOfBounds;
490 
491  using namespace dqmoffline::l1t;
492  // eta
495 
496  if (std::abs(recoEta) <= 1.479) { // barrel
497  // et
500  //resolution
503  // phi
506  // resolution
509 
510  // turn-ons
514  if (l1Et > threshold) {
517  }
518  }
519  } else { // end-cap
520  // et
523  //resolution
526  // phi
529  // resolution
532 
533  // turn-ons
537  if (l1Et > threshold) {
540  }
541  }
542  }
543 }
544 
545 //
546 // -------------------------------------- endLuminosityBlock --------------------------------------------
547 //
549 {
550  edm::LogInfo("L1TEGammaOffline") << "L1TEGammaOffline::endLuminosityBlock" << std::endl;
551 }
552 
553 //
554 // -------------------------------------- endRun --------------------------------------------
555 //
557 {
558  edm::LogInfo("L1TEGammaOffline") << "L1TEGammaOffline::endRun" << std::endl;
559 }
560 
561 //
562 // -------------------------------------- book histograms --------------------------------------------
563 //
565 {
566  ibooker.cd();
567  ibooker.setCurrentFolder(histFolder_);
568 
569  dqmoffline::l1t::HistDefinition nVertexDef = histDefinitions_[PlotConfig::nVertex];
570  h_nVertex_ = ibooker.book1D(
571  nVertexDef.name, nVertexDef.title, nVertexDef.nbinsX, nVertexDef.xmin, nVertexDef.xmax
572  );
573  h_tagAndProbeMass_ = ibooker.book1D("tagAndProbeMass", "Invariant mass of tag & probe pair", 100, 40, 140);
574  // electron reco vs L1
575  dqmoffline::l1t::HistDefinition templateETvsET = histDefinitions_[PlotConfig::ETvsET];
576  h_L1EGammaETvsElectronET_EB_ = ibooker.book2D("L1EGammaETvsElectronET_EB",
577  "L1 EGamma E_{T} vs GSF Electron E_{T} (EB); GSF Electron E_{T} (GeV); L1 EGamma E_{T} (GeV)",
578  templateETvsET.nbinsX, &templateETvsET.binsX[0], templateETvsET.nbinsY, &templateETvsET.binsY[0]);
579  h_L1EGammaETvsElectronET_EE_ = ibooker.book2D("L1EGammaETvsElectronET_EE",
580  "L1 EGamma E_{T} vs GSF Electron E_{T} (EE); GSF Electron E_{T} (GeV); L1 EGamma E_{T} (GeV)",
581  templateETvsET.nbinsX, &templateETvsET.binsX[0], templateETvsET.nbinsY, &templateETvsET.binsY[0]);
582  h_L1EGammaETvsElectronET_EB_EE_ = ibooker.book2D("L1EGammaETvsElectronET_EB_EE",
583  "L1 EGamma E_{T} vs GSF Electron E_{T} (EB+EE); GSF Electron E_{T} (GeV); L1 EGamma E_{T} (GeV)",
584  templateETvsET.nbinsX, &templateETvsET.binsX[0], templateETvsET.nbinsY, &templateETvsET.binsY[0]);
585 
586  dqmoffline::l1t::HistDefinition templatePHIvsPHI = histDefinitions_[PlotConfig::PHIvsPHI];
587  h_L1EGammaPhivsElectronPhi_EB_ = ibooker.book2D("L1EGammaPhivsElectronPhi_EB",
588  "#phi_{electron}^{L1} vs #phi_{electron}^{offline} (EB); #phi_{electron}^{offline}; #phi_{electron}^{L1}",
589  templatePHIvsPHI.nbinsX, templatePHIvsPHI.xmin, templatePHIvsPHI.xmax,
590  templatePHIvsPHI.nbinsY, templatePHIvsPHI.ymin, templatePHIvsPHI.ymax);
591  h_L1EGammaPhivsElectronPhi_EE_ = ibooker.book2D("L1EGammaPhivsElectronPhi_EE",
592  "#phi_{electron}^{L1} vs #phi_{electron}^{offline} (EE); #phi_{electron}^{offline}; #phi_{electron}^{L1}",
593  templatePHIvsPHI.nbinsX, templatePHIvsPHI.xmin, templatePHIvsPHI.xmax,
594  templatePHIvsPHI.nbinsY, templatePHIvsPHI.ymin, templatePHIvsPHI.ymax);
595  h_L1EGammaPhivsElectronPhi_EB_EE_ = ibooker.book2D("L1EGammaPhivsElectronPhi_EB_EE",
596  "#phi_{electron}^{L1} vs #phi_{electron}^{offline} (EB+EE); #phi_{electron}^{offline}; #phi_{electron}^{L1}",
597  templatePHIvsPHI.nbinsX, templatePHIvsPHI.xmin, templatePHIvsPHI.xmax,
598  templatePHIvsPHI.nbinsY, templatePHIvsPHI.ymin, templatePHIvsPHI.ymax);
599 
600  h_L1EGammaEtavsElectronEta_ = ibooker.book2D("L1EGammaEtavsElectronEta",
601  "L1 EGamma #eta vs GSF Electron #eta; GSF Electron #eta; L1 EGamma #eta", 100, -3, 3, 100, -3, 3);
602 
603  // electron resolutions
604  h_resolutionElectronET_EB_ = ibooker.book1D("resolutionElectronET_EB",
605  "electron ET resolution (EB); (L1 EGamma E_{T} - GSF Electron E_{T})/GSF Electron E_{T}; events", 50, -1, 1.5);
606  h_resolutionElectronET_EE_ = ibooker.book1D("resolutionElectronET_EE",
607  "electron ET resolution (EE); (L1 EGamma E_{T} - GSF Electron E_{T})/GSF Electron E_{T}; events", 50, -1, 1.5);
608  h_resolutionElectronET_EB_EE_ = ibooker.book1D("resolutionElectronET_EB_EE",
609  "electron ET resolution (EB+EE); (L1 EGamma E_{T} - GSF Electron E_{T})/GSF Electron E_{T}; events", 50, -1, 1.5);
610 
612  ibooker.book1D("resolutionElectronPhi_EB",
613  "#phi_{electron} resolution (EB); (#phi_{electron}^{L1} - #phi_{electron}^{offline})/#phi_{electron}^{offline}; events",
614  120, -0.3, 0.3);
616  ibooker.book1D("resolutionElectronPhi_EE",
617  "electron #phi resolution (EE); (#phi_{electron}^{L1} - #phi_{electron}^{offline})/#phi_{electron}^{offline}; events",
618  120, -0.3, 0.3);
620  ibooker.book1D("resolutionElectronPhi_EB_EE",
621  "electron #phi resolution (EB+EE); (#phi_{electron}^{L1} - #phi_{electron}^{offline})/#phi_{electron}^{offline}; events",
622  120, -0.3, 0.3);
623 
624  h_resolutionElectronEta_ = ibooker.book1D("resolutionElectronEta",
625  "electron #eta resolution (EB); (L1 EGamma #eta - GSF Electron #eta)/GSF Electron #eta; events", 120, -0.3, 0.3);
626 
627  // electron turn-ons
629  std::vector<float> electronBins(electronEfficiencyBins_.begin(), electronEfficiencyBins_.end());
630  int nBins = electronBins.size() - 1;
631  float* electronBinArray = &(electronBins[0]);
632 
634  std::string str_threshold = std::to_string(int(threshold));
636  "efficiencyElectronET_EB_threshold_" + str_threshold + "_Num",
637  "electron efficiency (EB) (numerator); GSF Electron E_{T} (GeV); events", nBins, electronBinArray);
639  "efficiencyElectronET_EE_threshold_" + str_threshold + "_Num",
640  "electron efficiency (EE) (numerator); GSF Electron E_{T} (GeV); events", nBins, electronBinArray);
642  "efficiencyElectronET_EB_EE_threshold_" + str_threshold + "_Num",
643  "electron efficiency (EB+EE) (numerator); GSF Electron E_{T} (GeV); events", nBins, electronBinArray);
645  "efficiencyElectronPhi_vs_Eta_threshold_" + str_threshold + "_Num",
646  "electron efficiency (numerator); GSF Electron #eta; GSF Electron #phi",
647  50, -2.5, 2.5, 32, -3.2, 3.2);
648 
650  "efficiencyElectronET_EB_threshold_" + str_threshold + "_Den",
651  "electron efficiency (EB) (denominator); GSF Electron E_{T} (GeV); events", nBins, electronBinArray);
653  "efficiencyElectronET_EE_threshold_" + str_threshold + "_Den",
654  "electron efficiency (EE) (denominator); GSF Electron E_{T} (GeV); events", nBins, electronBinArray);
656  "efficiencyElectronET_EB_EE_threshold_" + str_threshold + "_Den",
657  "electron efficiency (EB+EE) (denominator); GSF Electron E_{T} (GeV); events", nBins, electronBinArray);
659  "efficiencyElectronPhi_vs_Eta_threshold_" + str_threshold + "_Den",
660  "electron efficiency (denominator); GSF Electron #eta; GSF Electron #phi",
661  50, -2.5, 2.5, 32, -3.2, 3.2);
662  }
663 
665  std::string str_threshold = std::to_string(int(threshold));
667  "efficiencyElectronEta_threshold_" + str_threshold + "_Num",
668  "electron efficiency (numerator); GSF Electron #eta; events", 50, -2.5, 2.5);
670  "efficiencyElectronPhi_threshold_" + str_threshold + "_Num",
671  "electron efficiency (numerator); GSF Electron #phi; events", 32, -3.2, 3.2);
673  "efficiencyElectronNVertex_threshold_" + str_threshold + "_Num",
674  "electron efficiency (numerator); Nvtx; events", 30, 0, 60);
675 
677  "efficiencyElectronEta_threshold_" + str_threshold + "_Den",
678  "electron efficiency (denominator); GSF Electron #eta; events", 50, -2.5, 2.5);
680  "efficiencyElectronPhi_threshold_" + str_threshold + "_Den",
681  "electron efficiency (denominator); GSF Electron #phi; events", 32, -3.2, 3.2);
683  "efficiencyElectronNVertex_threshold_" + str_threshold + "_Den",
684  "electron efficiency (denominator); Nvtx; events", 30, 0, 60);
685  }
686 
687 
688  ibooker.cd();
689 }
690 
692 {
693  ibooker.cd();
694  ibooker.setCurrentFolder(histFolder_);
695 
696  dqmoffline::l1t::HistDefinition templateETvsET = histDefinitions_[PlotConfig::ETvsET];
697  h_L1EGammaETvsPhotonET_EB_ = ibooker.book2D("L1EGammaETvsPhotonET_EB",
698  "L1 EGamma E_{T} vs Photon E_{T} (EB); Photon E_{T} (GeV); L1 EGamma E_{T} (GeV)",
699  templateETvsET.nbinsX, &templateETvsET.binsX[0], templateETvsET.nbinsY, &templateETvsET.binsY[0]);
700  h_L1EGammaETvsPhotonET_EE_ = ibooker.book2D("L1EGammaETvsPhotonET_EE",
701  "L1 EGamma E_{T} vs Photon E_{T} (EE); Photon E_{T} (GeV); L1 EGamma E_{T} (GeV)",
702  templateETvsET.nbinsX, &templateETvsET.binsX[0], templateETvsET.nbinsY, &templateETvsET.binsY[0]);
703  h_L1EGammaETvsPhotonET_EB_EE_ = ibooker.book2D("L1EGammaETvsPhotonET_EB_EE",
704  "L1 EGamma E_{T} vs Photon E_{T} (EB+EE); Photon E_{T} (GeV); L1 EGamma E_{T} (GeV)",
705  templateETvsET.nbinsX, &templateETvsET.binsX[0], templateETvsET.nbinsY, &templateETvsET.binsY[0]);
706 
707  dqmoffline::l1t::HistDefinition templatePHIvsPHI = histDefinitions_[PlotConfig::PHIvsPHI];
708  h_L1EGammaPhivsPhotonPhi_EB_ = ibooker.book2D("L1EGammaPhivsPhotonPhi_EB",
709  "#phi_{photon}^{L1} vs #phi_{photon}^{offline} (EB); #phi_{photon}^{offline}; #phi_{photon}^{L1}",
710  templatePHIvsPHI.nbinsX, templatePHIvsPHI.xmin, templatePHIvsPHI.xmax,
711  templatePHIvsPHI.nbinsY, templatePHIvsPHI.ymin, templatePHIvsPHI.ymax);
712  h_L1EGammaPhivsPhotonPhi_EE_ = ibooker.book2D("L1EGammaPhivsPhotonPhi_EE",
713  "#phi_{photon}^{L1} vs #phi_{photon}^{offline} (EE); #phi_{photon}^{offline}; #phi_{photon}^{L1}",
714  templatePHIvsPHI.nbinsX, templatePHIvsPHI.xmin, templatePHIvsPHI.xmax,
715  templatePHIvsPHI.nbinsY, templatePHIvsPHI.ymin, templatePHIvsPHI.ymax);
716  h_L1EGammaPhivsPhotonPhi_EB_EE_ = ibooker.book2D("L1EGammaPhivsPhotonPhi_EB_EE",
717  "#phi_{photon}^{L1} vs #phi_{photon}^{offline} (EB+EE); #phi_{photon}^{offline}; #phi_{photon}^{L1}",
718  templatePHIvsPHI.nbinsX, templatePHIvsPHI.xmin, templatePHIvsPHI.xmax,
719  templatePHIvsPHI.nbinsY, templatePHIvsPHI.ymin, templatePHIvsPHI.ymax);
720 
721  h_L1EGammaEtavsPhotonEta_ = ibooker.book2D("L1EGammaEtavsPhotonEta",
722  "L1 EGamma #eta vs Photon #eta; Photon #eta; L1 EGamma #eta", 100, -3, 3, 100, -3, 3);
723 
724  // photon resolutions
725  h_resolutionPhotonET_EB_ = ibooker.book1D("resolutionPhotonET_EB",
726  "photon ET resolution (EB); (L1 EGamma E_{T} - Photon E_{T})/ Photon E_{T}; events", 50, -1, 1.5);
727  h_resolutionPhotonET_EE_ = ibooker.book1D("resolutionPhotonET_EE",
728  "photon ET resolution (EE); (L1 EGamma E_{T} - Photon E_{T})/ Photon E_{T}; events", 50, -1, 1.5);
729  h_resolutionPhotonET_EB_EE_ = ibooker.book1D("resolutionPhotonET_EB_EE",
730  "photon ET resolution (EB+EE); (L1 EGamma E_{T} - Photon E_{T})/ Photon E_{T}; events", 50, -1, 1.5);
731 
732  h_resolutionPhotonPhi_EB_ = ibooker.book1D("resolutionPhotonPhi_EB",
733  "#phi_{photon} resolution (EB); (#phi_{photon}^{L1} - #phi_{photon}^{offline})/#phi_{photon}^{offline}; events",
734  120, -0.3, 0.3);
735  h_resolutionPhotonPhi_EE_ = ibooker.book1D("resolutionPhotonPhi_EE",
736  "photon #phi resolution (EE); (#phi_{photon}^{L1} - #phi_{photon}^{offline})/#phi_{photon}^{offline}; events",
737  120, -0.3, 0.3);
738  h_resolutionPhotonPhi_EB_EE_ = ibooker.book1D("resolutionPhotonPhi_EB_EE",
739  "photon #phi resolution (EB+EE); (#phi_{photon}^{L1} - #phi_{photon}^{offline})/#phi_{photon}^{offline}; events",
740  120, -0.3, 0.3);
741 
742  h_resolutionPhotonEta_ = ibooker.book1D("resolutionPhotonEta",
743  "photon #eta resolution (EB); (L1 EGamma #eta - Photon #eta)/ Photon #eta; events", 120, -0.3, 0.3);
744 
745  // photon turn-ons
747  std::vector<float> photonBins(photonEfficiencyBins_.begin(), photonEfficiencyBins_.end());
748  int nBins = photonBins.size() - 1;
749  float* photonBinArray = &(photonBins[0]);
750 
752  std::string str_threshold = std::to_string(int(threshold));
754  "efficiencyPhotonET_EB_threshold_" + str_threshold + "_Num",
755  "photon efficiency (EB) (numerator); Photon E_{T} (GeV); events", nBins, photonBinArray);
757  "efficiencyPhotonET_EE_threshold_" + str_threshold + "_Num",
758  "photon efficiency (EE) (numerator); Photon E_{T} (GeV); events", nBins, photonBinArray);
760  "efficiencyPhotonET_EB_EE_threshold_" + str_threshold + "_Num",
761  "photon efficiency (EB+EE) (numerator); Photon E_{T} (GeV); events", nBins, photonBinArray);
762 
764  "efficiencyPhotonET_EB_threshold_" + str_threshold + "_Den",
765  "photon efficiency (EB) (denominator); Photon E_{T} (GeV); events", nBins, photonBinArray);
767  "efficiencyPhotonET_EE_threshold_" + str_threshold + "_Den",
768  "photon efficiency (EE) (denominator); Photon E_{T} (GeV); events", nBins, photonBinArray);
770  "efficiencyPhotonET_EB_EE_threshold_" + str_threshold + "_Den",
771  "photon efficiency (EB+EE) (denominator); Photon E_{T} (GeV); events", nBins, photonBinArray);
772  }
773 
774  ibooker.cd();
775 }
776 
777 //define this as a plug-in
#define LogDebug(id)
std::vector< float > binsX
BXVector< EGamma > EGammaBxCollection
Definition: EGamma.h:11
const_iterator end(int bx) const
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_
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:121
std::map< double, MonitorElement * > h_efficiencyPhotonET_EE_total_
MonitorElement * h_L1EGammaETvsElectronET_EB_EE_
float eSuperClusterOverP() const
Definition: GsfElectron.h:245
void endLuminosityBlock(edm::LuminosityBlock const &lumi, edm::EventSetup const &eSetup) override
std::map< double, MonitorElement * > h_efficiencyPhotonET_EB_pass_
MonitorElement * h_L1EGammaPhivsPhotonPhi_EB_
bool passesMediumEleId(reco::GsfElectron const &electron) const
MonitorElement * h_L1EGammaETvsPhotonET_EB_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:519
edm::EDGetTokenT< std::vector< reco::Photon > > thePhotonCollection_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
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:80
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
void beginLuminosityBlock(edm::LuminosityBlock const &lumi, edm::EventSetup const &eSetup) override
MonitorElement * h_L1EGammaPhivsElectronPhi_EB_EE_
std::map< double, MonitorElement * > h_efficiencyPhotonET_EB_EE_pass_
bool isEE() const
Definition: GsfElectron.h:353
bool isEB() const
Definition: GsfElectron.h:352
std::vector< unsigned int > getTriggerIndices(const std::vector< std::string > &requestedTriggers, const std::vector< std::string > &triggersInEvent)
Definition: L1TCommon.cc:11
MonitorElement * h_resolutionElectronET_EE_
edm::EDGetTokenT< trigger::TriggerEvent > triggerInputTag_
float deltaEtaSuperClusterTrackAtVtx() const
Definition: GsfElectron.h:249
float hadronicOverEm() const
Definition: GsfElectron.h:487
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:252
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:106
MonitorElement * h_resolutionPhotonET_EB_
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:118
edm::EDGetTokenT< l1t::EGammaBxCollection > stage2CaloLayer2EGammaToken_
MonitorElement * h_resolutionElectronEta_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void endRun(edm::Run const &run, edm::EventSetup const &eSetup) override
reco::GsfElectron tagElectron_
void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override
bool isValid() const
Definition: HandleBase.h:74
MonitorElement * h_resolutionPhotonEta_
float scSigmaIEtaIEta() const
Definition: GsfElectron.h:483
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
double deltaR(double eta1, double eta2, double phi1, double phi2)
Definition: TreeUtility.cc:17
HLTConfigProvider hltConfig_
std::vector< TriggerObject > TriggerObjectCollection
collection of trigger physics objects (e.g., all isolated muons)
Definition: TriggerObject.h:81
HistDefinitions readHistDefinitions(const edm::ParameterSet &ps, const std::map< std::string, unsigned int > &mapping)
bool findTagAndProbePair(edm::Handle< reco::GsfElectronCollection > const &electrons)
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:279
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_
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:136
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:35
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:844
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 * 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_
trigger::TriggerEvent triggerEvent_
std::vector< unsigned int > getFiredTriggerIndices(const std::vector< unsigned int > &triggers, const std::vector< bool > &triggerResults)
Definition: L1TCommon.cc:57
Definition: Run.h:43
bool passesAnyTriggerFromList(const std::vector< unsigned int > &triggers, const edm::TriggerResults &triggerResults)
Definition: L1TCommon.cc:69