10 #include "TLorentzVector.h" 24 theGsfElectronCollection_(
27 consumes <
std::vector<
reco::
Photon> > (ps.getParameter <
edm::InputTag > (
"photonCollection"))),
29 theBSCollection_(consumes <
reco::
BeamSpot > (ps.getParameter <
edm::InputTag > (
"beamSpotCollection"))),
30 triggerEvent_(consumes <
trigger::TriggerEvent > (ps.getParameter <
edm::InputTag > (
"TriggerEvent"))),
31 triggerResults_(consumes <
edm::TriggerResults > (ps.getParameter <
edm::InputTag > (
"TriggerResults"))),
32 triggerFilter_(ps.getParameter <
edm::InputTag > (
"TriggerFilter")),
33 triggerPath_(ps.getParameter <
std::
string > (
"TriggerPath")),
34 histFolder_(ps.getParameter <
std::
string > (
"histFolder")),
35 efficiencyFolder_(histFolder_ +
"/efficiency_raw"),
36 stage2CaloLayer2EGammaToken_(
38 electronEfficiencyThresholds_(ps.getParameter <
std::vector<double> > (
"electronEfficiencyThresholds")),
39 electronEfficiencyBins_(ps.getParameter <
std::vector<double> > (
"electronEfficiencyBins")),
40 probeToL1Offset_(ps.getParameter <double> (
"probeToL1Offset")),
41 deepInspectionElectronThresholds_(ps.getParameter <
std::vector<double> > (
"deepInspectionElectronThresholds")),
42 photonEfficiencyThresholds_(ps.getParameter <
std::vector<double> > (
"photonEfficiencyThresholds")),
43 photonEfficiencyBins_(ps.getParameter <
std::vector<double> > (
"photonEfficiencyBins")),
46 tagAndProbleInvariantMass_(-1.)
48 edm::LogInfo(
"L1TEGammaOffline") <<
"Constructor " <<
"L1TEGammaOffline::L1TEGammaOffline " << std::endl;
56 edm::LogInfo(
"L1TEGammaOffline") <<
"Destructor L1TEGammaOffline::~L1TEGammaOffline " << std::endl;
64 edm::LogInfo(
"L1TEGammaOffline") <<
"L1TEGammaOffline::beginRun" << std::endl;
72 edm::LogInfo(
"L1TEGammaOffline") <<
"L1TEGammaOffline::bookHistograms" << std::endl;
83 edm::LogInfo(
"L1TEGammaOffline") <<
"L1TEGammaOffline::beginLuminosityBlock" << std::endl;
91 edm::LogInfo(
"L1TEGammaOffline") <<
"L1TEGammaOffline::analyze" << std::endl;
96 edm::LogError(
"L1TEGammaOffline") <<
"invalid collection: vertex " << std::endl;
100 unsigned int nVertex = vertexHandle->size();
117 edm::LogError(
"L1TEGammaOffline") <<
"invalid collection: GSF electrons " << std::endl;
120 if (gsfElectrons->empty()) {
121 LogDebug(
"L1TEGammaOffline") <<
"empty collection: GSF electrons " << std::endl;
125 edm::LogError(
"L1TEGammaOffline") <<
"invalid collection: L1 EGamma " << std::endl;
129 LogDebug(
"L1TEGammaOffline") <<
"Could not find a tag & probe pair" << std::endl;
136 double minDeltaR = 0.3;
138 bool foundMatch =
false;
140 int bunchCrossing = 0;
142 double currentDeltaR =
deltaR(
egamma->eta(),
egamma->phi(), probeElectron.eta(), probeElectron.phi());
143 if (currentDeltaR > minDeltaR) {
146 minDeltaR = currentDeltaR;
147 closestL1EGamma = *
egamma;
154 LogDebug(
"L1TEGammaOffline") <<
"Could not find a matching L1 EGamma " << std::endl;
158 double recoEt = probeElectron.et();
159 double recoEta = probeElectron.eta();
160 double recoPhi = probeElectron.phi();
162 double l1Et = closestL1EGamma.
et();
163 double l1Eta = closestL1EGamma.
eta();
164 double l1Phi = closestL1EGamma.
phi();
167 double outOfBounds = 9999;
168 double resolutionEt = recoEt > 0 ? (l1Et - recoEt) / recoEt : outOfBounds;
169 double resolutionEta =
std::abs(recoEta) > 0 ? (l1Eta - recoEta) / recoEta : outOfBounds;
170 double resolutionPhi =
std::abs(recoPhi) > 0 ? (l1Phi - recoPhi) / recoPhi : outOfBounds;
182 if(recoEt > threshold){
213 for (
auto threshold : electronEfficiencyThresholds_) {
216 if (l1Et > threshold) {
236 for (
auto threshold : electronEfficiencyThresholds_) {
239 if (l1Et > threshold) {
267 bool foundBoth(
false);
272 for (
auto tagElectron : *electrons) {
273 for (
auto probeElectron : *electrons) {
274 if (tagElectron.p4() == probeElectron.p4())
277 auto combined(tagElectron.p4() + probeElectron.p4());
278 auto tagAbsEta =
std::abs(tagElectron.eta());
279 auto probeAbsEta =
std::abs(probeElectron.eta());
282 bool isEBEEGap = tagElectron.isEBEEGap() || probeElectron.isEBEEGap();
283 bool passesEta = !isEBEEGap && tagAbsEta < 2.5 && probeAbsEta < 2.5;
284 bool passesCharge = tagElectron.charge() == -probeElectron.charge();
287 bool tagPassesMediumID =
passesMediumEleId(tagElectron) && tagElectron.et() > 30.;
289 bool passesInvariantMass = combined.M() > 60 && combined.M() < 120;
291 if (passesEta && passesInvariantMass && passesCharge && tagPassesMediumID && probePassesLooseID) {
313 const float ecal_energy_inverse = 1.0 / electron.
ecalEnergy();
315 const float eOverP =
std::abs(1.0 - eSCoverP) * ecal_energy_inverse;
317 if (electron.
isEB() && eOverP > 0.241)
319 if (electron.
isEE() && eOverP > 0.14)
348 const float ecal_energy_inverse = 1.0 / electron.
ecalEnergy();
350 const float eOverP =
std::abs(1.0 - eSCoverP) * ecal_energy_inverse;
352 if (electron.
isEB() && eOverP < 0.134)
354 if (electron.
isEE() && eOverP > 0.13)
385 edm::LogError(
"L1TEGammaOffline") <<
"invalid collection: reco::Photons " << std::endl;
393 if(photons->empty()){
394 LogDebug(
"L1TEGammaOffline") <<
"No photons found in event." << std::endl;
398 auto probePhoton = photons->at(0);
400 double minDeltaR = 0.3;
402 bool foundMatch =
false;
404 int bunchCrossing = 0;
406 double currentDeltaR =
deltaR(
egamma->eta(),
egamma->phi(), probePhoton.eta(), probePhoton.phi());
407 if (currentDeltaR > minDeltaR) {
410 minDeltaR = currentDeltaR;
411 closestL1EGamma = *
egamma;
418 LogDebug(
"L1TEGammaOffline") <<
"Could not find a matching L1 EGamma " << std::endl;
422 double recoEt = probePhoton.et();
423 double recoEta = probePhoton.eta();
424 double recoPhi = probePhoton.phi();
426 double l1Et = closestL1EGamma.
et();
427 double l1Eta = closestL1EGamma.
eta();
428 double l1Phi = closestL1EGamma.
phi();
431 double outOfBounds = 9999;
432 double resolutionEt = recoEt > 0 ? (l1Et - recoEt) / recoEt : outOfBounds;
433 double resolutionEta =
std::abs(recoEta) > 0 ? (l1Eta - recoEta) / recoEta : outOfBounds;
434 double resolutionPhi =
std::abs(recoPhi) > 0 ? (l1Phi - recoPhi) / recoPhi : outOfBounds;
459 if (l1Et > threshold) {
482 if (l1Et > threshold) {
495 edm::LogInfo(
"L1TEGammaOffline") <<
"L1TEGammaOffline::endLuminosityBlock" << std::endl;
503 edm::LogInfo(
"L1TEGammaOffline") <<
"L1TEGammaOffline::endRun" << std::endl;
513 h_nVertex_ = ibooker.
book1D(
"nVertex",
"Number of event vertices in collection", 40, -0.5, 39.5);
517 "L1 EGamma E_{T} vs GSF Electron E_{T} (EB); GSF Electron E_{T} (GeV); L1 EGamma E_{T} (GeV)", 300, 0, 300, 300,
520 "L1 EGamma E_{T} vs GSF Electron E_{T} (EE); GSF Electron E_{T} (GeV); L1 EGamma E_{T} (GeV)", 300, 0, 300, 300,
523 "L1 EGamma E_{T} vs GSF Electron E_{T} (EB+EE); GSF Electron E_{T} (GeV); L1 EGamma E_{T} (GeV)", 300, 0, 300,
527 "#phi_{electron}^{L1} vs #phi_{electron}^{offline} (EB); #phi_{electron}^{offline}; #phi_{electron}^{L1}", 100,
530 "#phi_{electron}^{L1} vs #phi_{electron}^{offline} (EE); #phi_{electron}^{offline}; #phi_{electron}^{L1}", 100,
533 "#phi_{electron}^{L1} vs #phi_{electron}^{offline} (EB+EE); #phi_{electron}^{offline}; #phi_{electron}^{L1}", 100,
537 "L1 EGamma #eta vs GSF Electron #eta; GSF Electron #eta; L1 EGamma #eta", 100, -3, 3, 100, -3, 3);
541 "electron ET resolution (EB); (L1 EGamma E_{T} - GSF Electron E_{T})/GSF Electron E_{T}; events", 50, -1, 1.5);
543 "electron ET resolution (EE); (L1 EGamma E_{T} - GSF Electron E_{T})/GSF Electron E_{T}; events", 50, -1, 1.5);
545 "electron ET resolution (EB+EE); (L1 EGamma E_{T} - GSF Electron E_{T})/GSF Electron E_{T}; events", 50, -1, 1.5);
548 ibooker.
book1D(
"resolutionElectronPhi_EB",
549 "#phi_{electron} resolution (EB); (#phi_{electron}^{L1} - #phi_{electron}^{offline})/#phi_{electron}^{offline}; events",
552 ibooker.
book1D(
"resolutionElectronPhi_EE",
553 "electron #phi resolution (EE); (#phi_{electron}^{L1} - #phi_{electron}^{offline})/#phi_{electron}^{offline}; events",
556 ibooker.
book1D(
"resolutionElectronPhi_EB_EE",
557 "electron #phi resolution (EB+EE); (#phi_{electron}^{L1} - #phi_{electron}^{offline})/#phi_{electron}^{offline}; events",
561 "electron #eta resolution (EB); (L1 EGamma #eta - GSF Electron #eta)/GSF Electron #eta; events", 120, -0.3, 0.3);
566 int nBins = electronBins.size() - 1;
567 float* electronBinArray = &(electronBins[0]);
572 "efficiencyElectronET_EB_threshold_" + str_threshold +
"_Num",
573 "electron efficiency (EB) (numerator); GSF Electron E_{T} (GeV); events", nBins, electronBinArray);
575 "efficiencyElectronET_EE_threshold_" + str_threshold +
"_Num",
576 "electron efficiency (EE) (numerator); GSF Electron E_{T} (GeV); events", nBins, electronBinArray);
578 "efficiencyElectronET_EB_EE_threshold_" + str_threshold +
"_Num",
579 "electron efficiency (EB+EE) (numerator); GSF Electron E_{T} (GeV); events", nBins, electronBinArray);
581 "efficiencyElectronPhi_vs_Eta_threshold_" + str_threshold +
"_Num",
582 "electron efficiency (numerator); GSF Electron #eta; GSF Electron #phi",
583 50, -2.5, 2.5, 32, -3.2, 3.2);
586 "efficiencyElectronET_EB_threshold_" + str_threshold +
"_Den",
587 "electron efficiency (EB) (denominator); GSF Electron E_{T} (GeV); events", nBins, electronBinArray);
589 "efficiencyElectronET_EE_threshold_" + str_threshold +
"_Den",
590 "electron efficiency (EE) (denominator); GSF Electron E_{T} (GeV); events", nBins, electronBinArray);
592 "efficiencyElectronET_EB_EE_threshold_" + str_threshold +
"_Den",
593 "electron efficiency (EB+EE) (denominator); GSF Electron E_{T} (GeV); events", nBins, electronBinArray);
595 "efficiencyElectronPhi_vs_Eta_threshold_" + str_threshold +
"_Den",
596 "electron efficiency (denominator); GSF Electron #eta; GSF Electron #phi",
597 50, -2.5, 2.5, 32, -3.2, 3.2);
603 "efficiencyElectronEta_threshold_" + str_threshold +
"_Num",
604 "electron efficiency (numerator); GSF Electron #eta; events", 50, -2.5, 2.5);
606 "efficiencyElectronPhi_threshold_" + str_threshold +
"_Num",
607 "electron efficiency (numerator); GSF Electron #phi; events", 32, -3.2, 3.2);
609 "efficiencyElectronNVertex_threshold_" + str_threshold +
"_Num",
610 "electron efficiency (numerator); Nvtx; events", 30, 0, 60);
613 "efficiencyElectronEta_threshold_" + str_threshold +
"_Den",
614 "electron efficiency (denominator); GSF Electron #eta; events", 50, -2.5, 2.5);
616 "efficiencyElectronPhi_threshold_" + str_threshold +
"_Den",
617 "electron efficiency (denominator); GSF Electron #phi; events", 32, -3.2, 3.2);
619 "efficiencyElectronNVertex_threshold_" + str_threshold +
"_Den",
620 "electron efficiency (denominator); Nvtx; events", 30, 0, 60);
632 "L1 EGamma E_{T} vs Photon E_{T} (EB); Photon E_{T} (GeV); L1 EGamma E_{T} (GeV)", 300, 0, 300, 300, 0, 300);
634 "L1 EGamma E_{T} vs Photon E_{T} (EE); Photon E_{T} (GeV); L1 EGamma E_{T} (GeV)", 300, 0, 300, 300, 0, 300);
636 "L1 EGamma E_{T} vs Photon E_{T} (EB+EE); Photon E_{T} (GeV); L1 EGamma E_{T} (GeV)", 300, 0, 300, 300, 0, 300);
639 "#phi_{photon}^{L1} vs #phi_{photon}^{offline} (EB); #phi_{photon}^{offline}; #phi_{photon}^{L1}", 100, -4, 4,
642 "#phi_{photon}^{L1} vs #phi_{photon}^{offline} (EE); #phi_{photon}^{offline}; #phi_{photon}^{L1}", 100, -4, 4,
645 "#phi_{photon}^{L1} vs #phi_{photon}^{offline} (EB+EE); #phi_{photon}^{offline}; #phi_{photon}^{L1}", 100, -4, 4,
649 "L1 EGamma #eta vs Photon #eta; Photon #eta; L1 EGamma #eta", 100, -3, 3, 100, -3, 3);
653 "photon ET resolution (EB); (L1 EGamma E_{T} - Photon E_{T})/ Photon E_{T}; events", 50, -1, 1.5);
655 "photon ET resolution (EE); (L1 EGamma E_{T} - Photon E_{T})/ Photon E_{T}; events", 50, -1, 1.5);
657 "photon ET resolution (EB+EE); (L1 EGamma E_{T} - Photon E_{T})/ Photon E_{T}; events", 50, -1, 1.5);
660 "#phi_{photon} resolution (EB); (#phi_{photon}^{L1} - #phi_{photon}^{offline})/#phi_{photon}^{offline}; events",
663 "photon #phi resolution (EE); (#phi_{photon}^{L1} - #phi_{photon}^{offline})/#phi_{photon}^{offline}; events",
666 "photon #phi resolution (EB+EE); (#phi_{photon}^{L1} - #phi_{photon}^{offline})/#phi_{photon}^{offline}; events",
670 "photon #eta resolution (EB); (L1 EGamma #eta - Photon #eta)/ Photon #eta; events", 120, -0.3, 0.3);
675 int nBins = photonBins.size() - 1;
676 float* photonBinArray = &(photonBins[0]);
681 "efficiencyPhotonET_EB_threshold_" + str_threshold +
"_Num",
682 "photon efficiency (EB) (numerator); Photon E_{T} (GeV); events", nBins, photonBinArray);
684 "efficiencyPhotonET_EE_threshold_" + str_threshold +
"_Num",
685 "photon efficiency (EE) (numerator); Photon E_{T} (GeV); events", nBins, photonBinArray);
687 "efficiencyPhotonET_EB_EE_threshold_" + str_threshold +
"_Num",
688 "photon efficiency (EB+EE) (numerator); Photon E_{T} (GeV); events", nBins, photonBinArray);
691 "efficiencyPhotonET_EB_threshold_" + str_threshold +
"_Den",
692 "photon efficiency (EB) (denominator); Photon E_{T} (GeV); events", nBins, photonBinArray);
694 "efficiencyPhotonET_EE_threshold_" + str_threshold +
"_Den",
695 "photon efficiency (EE) (denominator); Photon E_{T} (GeV); events", nBins, photonBinArray);
697 "efficiencyPhotonET_EB_EE_threshold_" + str_threshold +
"_Den",
698 "photon efficiency (EB+EE) (denominator); Photon E_{T} (GeV); events", nBins, photonBinArray);
BXVector< EGamma > EGammaBxCollection
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_
double eta() const final
momentum pseudorapidity
std::map< double, MonitorElement * > h_efficiencyPhotonET_EE_total_
MonitorElement * h_L1EGammaETvsElectronET_EB_EE_
float eSuperClusterOverP() const
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
edm::EDGetTokenT< std::vector< reco::Photon > > thePhotonCollection_
#define DEFINE_FWK_MODULE(type)
std::map< double, MonitorElement * > h_efficiencyElectronET_EB_EE_pass_
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_
MonitorElement * h_resolutionPhotonET_EE_
std::vector< Vertex > VertexCollection
collection of Vertex objects
MonitorElement * h_resolutionElectronET_EB_
std::map< double, MonitorElement * > h_efficiencyElectronET_EB_total_
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_
MonitorElement * h_resolutionElectronET_EE_
float deltaEtaSuperClusterTrackAtVtx() const
float hadronicOverEm() const
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
std::map< double, MonitorElement * > h_efficiencyElectronNVertex_total_
MonitorElement * h_L1EGammaEtavsElectronEta_
MonitorElement * h_resolutionPhotonET_EB_
MonitorElement * book1D(Args &&...args)
edm::EDGetTokenT< l1t::EGammaBxCollection > stage2CaloLayer2EGammaToken_
MonitorElement * h_resolutionElectronEta_
Abs< T >::type abs(const T &t)
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
MonitorElement * h_resolutionPhotonEta_
float scSigmaIEtaIEta() const
MonitorElement * h_L1EGammaPhivsPhotonPhi_EE_
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)
bool findTagAndProbePair(edm::Handle< reco::GsfElectronCollection > const &electrons)
void setCurrentFolder(const std::string &fullpath)
std::map< double, MonitorElement * > h_efficiencyPhotonET_EB_total_
std::string efficiencyFolder_
std::map< double, MonitorElement * > h_efficiencyElectronET_EE_pass_
std::vector< double > deepInspectionElectronThresholds_
reco::GsfElectron probeElectron_
MonitorElement * book2D(Args &&...args)
MonitorElement * h_resolutionPhotonPhi_EB_EE_
void fill2DWithinLimits(MonitorElement *mon, double valueX, double valueY, double weight=1.)
std::map< double, MonitorElement * > h_efficiencyElectronPhi_total_
MonitorElement * h_resolutionElectronET_EB_EE_
std::map< double, MonitorElement * > h_efficiencyElectronEta_total_
std::map< double, MonitorElement * > h_efficiencyElectronET_EB_EE_total_
MonitorElement * h_resolutionElectronPhi_EB_
MonitorElement * h_nVertex_
void fillWithinLimits(MonitorElement *mon, double value, double weight=1.)
MonitorElement * h_resolutionPhotonPhi_EB_
std::vector< double > photonEfficiencyBins_
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< 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_