From 91f06a0aa17ee59b9faf3812e69fc253bbfa3e56 Mon Sep 17 00:00:00 2001 From: Sam Harper Date: Tue, 29 Dec 2020 19:40:51 +0100 Subject: [PATCH 1/5] initial commit of E/gamma L1 track isolation --- .../L1TrackTrigger/interface/L1Track.h | 7 ++ .../EgammaHLTEleL1TrackIsolProducer.cc | 97 +++++++++++++++++++ .../interface/EgammaL1TkIsolation.h | 61 ++++++++++++ .../src/EgammaL1TkIsolation.cc | 80 +++++++++++++++ 4 files changed, 245 insertions(+) create mode 100644 DataFormats/L1TrackTrigger/interface/L1Track.h create mode 100644 RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTEleL1TrackIsolProducer.cc create mode 100644 RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h create mode 100644 RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc diff --git a/DataFormats/L1TrackTrigger/interface/L1Track.h b/DataFormats/L1TrackTrigger/interface/L1Track.h new file mode 100644 index 0000000000000..d60adb560af07 --- /dev/null +++ b/DataFormats/L1TrackTrigger/interface/L1Track.h @@ -0,0 +1,7 @@ +#include "DataFormats/L1TrackTrigger/interface/TTTrack.h" +#include "DataFormats/L1TrackTrigger/interface/TTTypes.h" +#include + +using L1Track = TTTrack; +using L1TrackCollection = std::vector; + diff --git a/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTEleL1TrackIsolProducer.cc b/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTEleL1TrackIsolProducer.cc new file mode 100644 index 0000000000000..51ad6b7f2d7a8 --- /dev/null +++ b/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTEleL1TrackIsolProducer.cc @@ -0,0 +1,97 @@ +// Author: Sam Harper (RAL/CERN) +// L1 track isolation producer for the HLT +// A quick primer on how the E/gamma HLT works w.r.t to ID variables +// 1. the supercluster is the primary object +// 2. superclusters get id variables associated to them via association maps keyed +// to the supercluster +// However here we also need to read in electron objects as we need to solve for which +// GsfTrack associated to the supercluster to use for the isolation +// The electron producer solves for this and assigns the electron the best GsfTrack +// which we will use for the vz of the electron +// One thing which Swagata Mukherjee pointed out is that we have to be careful of +// is getting a bad GsfTrack with a bad vertex which will give us a fake vz which then +// leads to a perfectly isolated electron as that random vz is not a vertex + +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/Framework/interface/global/EDProducer.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" + +#include "DataFormats/EgammaCandidates/interface/Electron.h" +#include "DataFormats/EgammaCandidates/interface/ElectronFwd.h" +#include "DataFormats/RecoCandidate/interface/RecoEcalCandidate.h" +#include "DataFormats/RecoCandidate/interface/RecoEcalCandidateFwd.h" +#include "DataFormats/RecoCandidate/interface/RecoEcalCandidateIsolation.h" +#include "DataFormats/TrackReco/interface/TrackFwd.h" +#include "DataFormats/TrackReco/interface/Track.h" + +#include "RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h" + +#include + +class EgammaHLTEleL1TrackIsolProducer : public edm::global::EDProducer<> { +public: + explicit EgammaHLTEleL1TrackIsolProducer(const edm::ParameterSet&); + ~EgammaHLTEleL1TrackIsolProducer() override; + void produce(edm::StreamID sid, edm::Event&, const edm::EventSetup&) const override; + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + const edm::EDGetTokenT ecalCandsToken_; + const edm::EDGetTokenT elesToken_; + const edm::EDGetTokenT l1TrksToken_; + EgammaL1TkIsolation isolAlgo_; +}; + +EgammaHLTEleL1TrackIsolProducer::EgammaHLTEleL1TrackIsolProducer(const edm::ParameterSet& config) + : ecalCandsToken_(consumes(config.getParameter("ecalCands"))), + elesToken_(consumes(config.getParameter("eles"))), + l1TrksToken_(consumes(config.getParameter("l1Tracks"))), + isolAlgo_(config.getParameter("isolCfg")) +{ + produces(); +} + +EgammaHLTEleL1TrackIsolProducer::~EgammaHLTEleL1TrackIsolProducer() {} + +void EgammaHLTEleL1TrackIsolProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("ecalCands", edm::InputTag("hltEgammaCandidates")); + desc.add("eles", edm::InputTag("hltEgammaGsfElectrons")); + desc.add("l1Tracks", edm::InputTag("TTTracksFromTrackletEmulation","Level1TTTracks")); + desc.add("isolCfg", EgammaL1TkIsolation::pSetDescript()); + descriptions.add("hltEgammaHLTEleL1TrackIsolProducer", desc); +} +void EgammaHLTEleL1TrackIsolProducer::produce(edm::StreamID sid, + edm::Event& iEvent, + const edm::EventSetup& iSetup) const { + + auto ecalCands = iEvent.getHandle(ecalCandsToken_); + auto eles = iEvent.getHandle(elesToken_); + auto l1Trks = iEvent.getHandle(l1TrksToken_); + + auto recoEcalCandMap = std::make_unique(ecalCands); + + for (size_t candNr = 0; candNrsize();candNr++){ + reco::RecoEcalCandidateRef recoEcalCandRef(ecalCands, candNr); + reco::ElectronRef eleRef; + for (size_t eleNr = 0; eleNrsize(); eleNr++){ + if ((*eles)[eleNr].superCluster() == recoEcalCandRef->superCluster()) { + eleRef = reco::ElectronRef(eles, eleNr); + break; + } + } + + float isol = eleRef.isNonnull() ? isolAlgo_.calIsol(*eleRef->gsfTrack(),*l1Trks).second : std::numeric_limits::max(); + + recoEcalCandMap->insert(recoEcalCandRef, isol); + } + iEvent.put(std::move(recoEcalCandMap)); + +} + +#include "FWCore/Framework/interface/MakerMacros.h" +DEFINE_FWK_MODULE(EgammaHLTEleL1TrackIsolProducer); diff --git a/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h b/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h new file mode 100644 index 0000000000000..6fa82f52048cd --- /dev/null +++ b/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h @@ -0,0 +1,61 @@ +#ifndef RECOEGAMMA_EGAMMAISOLATIONALGOS_EGAMMAL1TKISOLATION_H +#define RECOEGAMMA_EGAMMAISOLATIONALGOS_EGAMMAL1TKISOLATION_H + +#include "DataFormats/L1TrackTrigger/interface/L1Track.h" +#include "DataFormats/TrackReco/interface/TrackBase.h" +#include "DataFormats/TrackReco/interface/TrackFwd.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" + +//author S. Harper (RAL/CERN) +//based on the work of Swagata Mukherjee and Giulia Sorrentino + +class EgammaL1TkIsolation { +public: + +private: + struct TrkCuts { + float minPt; + float minDR2; + float maxDR2; + float minDEta; + float maxDZ; + explicit TrkCuts(const edm::ParameterSet& para); + static edm::ParameterSetDescription pSetDescript(); + }; + + TrkCuts barrelCuts_, endcapCuts_; + +public: + explicit EgammaL1TkIsolation(const edm::ParameterSet& para); + EgammaL1TkIsolation(const EgammaL1TkIsolation&) = default; + ~EgammaL1TkIsolation() = default; + EgammaL1TkIsolation& operator=(const EgammaL1TkIsolation&) = default; + + static edm::ParameterSetDescription pSetDescript(); + + std::pair calIsol(const reco::TrackBase& trk, + const L1TrackCollection& l1Tks)const; + + std::pair calIsol(const double objEta, + const double objPhi, + const double objZ, + const L1TrackCollection& l1Tks)const; + + //little helper function for the two calIsol functions for it to directly return the pt + template + double calIsolPt(Args&&... args) const { + return calIsol(std::forward(args)...).second; + } + + +private: + static bool passTrkSel(const L1Track& trk, + const double trkPt, + const TrkCuts& cuts, + const double objEta, + const double objPhi, + const double objZ); +}; + +#endif diff --git a/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc b/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc new file mode 100644 index 0000000000000..82944c4cb85be --- /dev/null +++ b/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc @@ -0,0 +1,80 @@ +#include "RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h" +#include "DataFormats/TrackReco/interface/Track.h" +#include "DataFormats/Math/interface/deltaR.h" + +EgammaL1TkIsolation::TrkCuts::TrkCuts(const edm::ParameterSet& para) { + minPt = para.getParameter("minPt"); + auto sq = [](double val) { return val * val; }; + minDR2 = sq(para.getParameter("minDR")); + maxDR2 = sq(para.getParameter("maxDR")); + minDEta = para.getParameter("minDEta"); + maxDZ = para.getParameter("maxDZ"); +} + +edm::ParameterSetDescription EgammaL1TkIsolation::TrkCuts::pSetDescript() { + edm::ParameterSetDescription desc; + desc.add("minPt", 2.0); + desc.add("maxDR", 0.3); + desc.add("minDR", 0.01); + desc.add("minDEta", 0.003); + desc.add("maxDZ", 0.7); + return desc; +} + +EgammaL1TkIsolation::EgammaL1TkIsolation(const edm::ParameterSet& para) + : barrelCuts_(para.getParameter("barrelCuts")), + endcapCuts_(para.getParameter("endcapCuts")) {} + +edm::ParameterSetDescription EgammaL1TkIsolation::pSetDescript() { + edm::ParameterSetDescription desc; + desc.add("barrelCuts", TrkCuts::pSetDescript()); + desc.add("endcapCuts", TrkCuts::pSetDescript()); + return desc; +} + + + +std::pair EgammaL1TkIsolation::calIsol(const reco::TrackBase& trk, + const L1TrackCollection& tracks) const { + return calIsol(trk.eta(), trk.phi(), trk.vz(), tracks); +} + +std::pair EgammaL1TkIsolation::calIsol(const double objEta, + const double objPhi, + const double objZ, + const L1TrackCollection& tracks) const { + double ptSum = 0.; + int nrTrks = 0; + + std::cout <<"obj eta "< cuts.minPt && + std::abs(objZ-trk.z0()) < cuts.maxDZ){ + const float trkEta = trk.eta(); + const float dEta = trkEta - objEta; + const float dR2 = reco::deltaR2(objEta, objPhi, trkEta, trk.phi()); + return dR2 >= cuts.minDR2 && dR2 <= cuts.maxDR2 && std::abs(dEta) >= cuts.minDEta; + } + + return false; +} + From 84a57468aa611c617b0d1167d440b2190a4519b8 Mon Sep 17 00:00:00 2001 From: Sam Harper Date: Thu, 31 Dec 2020 09:55:11 +0100 Subject: [PATCH 2/5] code checks & format --- .../L1TrackTrigger/interface/L1Track.h | 1 - .../EgammaHLTEleL1TrackIsolProducer.cc | 42 +++++++++---------- .../interface/EgammaL1TkIsolation.h | 9 ++-- .../src/EgammaL1TkIsolation.cc | 30 ++++++------- 4 files changed, 35 insertions(+), 47 deletions(-) diff --git a/DataFormats/L1TrackTrigger/interface/L1Track.h b/DataFormats/L1TrackTrigger/interface/L1Track.h index d60adb560af07..149d9a91cfeca 100644 --- a/DataFormats/L1TrackTrigger/interface/L1Track.h +++ b/DataFormats/L1TrackTrigger/interface/L1Track.h @@ -4,4 +4,3 @@ using L1Track = TTTrack; using L1TrackCollection = std::vector; - diff --git a/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTEleL1TrackIsolProducer.cc b/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTEleL1TrackIsolProducer.cc index 51ad6b7f2d7a8..e74a7d404029f 100644 --- a/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTEleL1TrackIsolProducer.cc +++ b/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTEleL1TrackIsolProducer.cc @@ -9,7 +9,7 @@ // The electron producer solves for this and assigns the electron the best GsfTrack // which we will use for the vz of the electron // One thing which Swagata Mukherjee pointed out is that we have to be careful of -// is getting a bad GsfTrack with a bad vertex which will give us a fake vz which then +// is getting a bad GsfTrack with a bad vertex which will give us a fake vz which then // leads to a perfectly isolated electron as that random vz is not a vertex #include "FWCore/Framework/interface/Frameworkfwd.h" @@ -47,12 +47,11 @@ class EgammaHLTEleL1TrackIsolProducer : public edm::global::EDProducer<> { }; EgammaHLTEleL1TrackIsolProducer::EgammaHLTEleL1TrackIsolProducer(const edm::ParameterSet& config) - : ecalCandsToken_(consumes(config.getParameter("ecalCands"))), - elesToken_(consumes(config.getParameter("eles"))), - l1TrksToken_(consumes(config.getParameter("l1Tracks"))), - isolAlgo_(config.getParameter("isolCfg")) -{ - produces(); + : ecalCandsToken_(consumes(config.getParameter("ecalCands"))), + elesToken_(consumes(config.getParameter("eles"))), + l1TrksToken_(consumes(config.getParameter("l1Tracks"))), + isolAlgo_(config.getParameter("isolCfg")) { + produces(); } EgammaHLTEleL1TrackIsolProducer::~EgammaHLTEleL1TrackIsolProducer() {} @@ -61,36 +60,35 @@ void EgammaHLTEleL1TrackIsolProducer::fillDescriptions(edm::ConfigurationDescrip edm::ParameterSetDescription desc; desc.add("ecalCands", edm::InputTag("hltEgammaCandidates")); desc.add("eles", edm::InputTag("hltEgammaGsfElectrons")); - desc.add("l1Tracks", edm::InputTag("TTTracksFromTrackletEmulation","Level1TTTracks")); + desc.add("l1Tracks", edm::InputTag("TTTracksFromTrackletEmulation", "Level1TTTracks")); desc.add("isolCfg", EgammaL1TkIsolation::pSetDescript()); descriptions.add("hltEgammaHLTEleL1TrackIsolProducer", desc); } void EgammaHLTEleL1TrackIsolProducer::produce(edm::StreamID sid, - edm::Event& iEvent, - const edm::EventSetup& iSetup) const { - + edm::Event& iEvent, + const edm::EventSetup& iSetup) const { auto ecalCands = iEvent.getHandle(ecalCandsToken_); auto eles = iEvent.getHandle(elesToken_); auto l1Trks = iEvent.getHandle(l1TrksToken_); - auto recoEcalCandMap = std::make_unique(ecalCands); - - for (size_t candNr = 0; candNrsize();candNr++){ - reco::RecoEcalCandidateRef recoEcalCandRef(ecalCands, candNr); + auto recoEcalCandMap = std::make_unique(ecalCands); + + for (size_t candNr = 0; candNr < ecalCands->size(); candNr++) { + reco::RecoEcalCandidateRef recoEcalCandRef(ecalCands, candNr); reco::ElectronRef eleRef; - for (size_t eleNr = 0; eleNrsize(); eleNr++){ + for (size_t eleNr = 0; eleNr < eles->size(); eleNr++) { if ((*eles)[eleNr].superCluster() == recoEcalCandRef->superCluster()) { - eleRef = reco::ElectronRef(eles, eleNr); - break; + eleRef = reco::ElectronRef(eles, eleNr); + break; } } - - float isol = eleRef.isNonnull() ? isolAlgo_.calIsol(*eleRef->gsfTrack(),*l1Trks).second : std::numeric_limits::max(); - + + float isol = + eleRef.isNonnull() ? isolAlgo_.calIsol(*eleRef->gsfTrack(), *l1Trks).second : std::numeric_limits::max(); + recoEcalCandMap->insert(recoEcalCandRef, isol); } iEvent.put(std::move(recoEcalCandMap)); - } #include "FWCore/Framework/interface/MakerMacros.h" diff --git a/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h b/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h index 6fa82f52048cd..8c365f0cef940 100644 --- a/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h +++ b/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h @@ -7,12 +7,11 @@ #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/ParameterSet/interface/ParameterSetDescription.h" -//author S. Harper (RAL/CERN) +//author S. Harper (RAL/CERN) //based on the work of Swagata Mukherjee and Giulia Sorrentino class EgammaL1TkIsolation { public: - private: struct TrkCuts { float minPt; @@ -34,13 +33,12 @@ class EgammaL1TkIsolation { static edm::ParameterSetDescription pSetDescript(); - std::pair calIsol(const reco::TrackBase& trk, - const L1TrackCollection& l1Tks)const; + std::pair calIsol(const reco::TrackBase& trk, const L1TrackCollection& l1Tks) const; std::pair calIsol(const double objEta, const double objPhi, const double objZ, - const L1TrackCollection& l1Tks)const; + const L1TrackCollection& l1Tks) const; //little helper function for the two calIsol functions for it to directly return the pt template @@ -48,7 +46,6 @@ class EgammaL1TkIsolation { return calIsol(std::forward(args)...).second; } - private: static bool passTrkSel(const L1Track& trk, const double trkPt, diff --git a/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc b/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc index 82944c4cb85be..a3f9bfd8f144c 100644 --- a/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc +++ b/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc @@ -32,21 +32,18 @@ edm::ParameterSetDescription EgammaL1TkIsolation::pSetDescript() { return desc; } - - -std::pair EgammaL1TkIsolation::calIsol(const reco::TrackBase& trk, - const L1TrackCollection& tracks) const { +std::pair EgammaL1TkIsolation::calIsol(const reco::TrackBase& trk, const L1TrackCollection& tracks) const { return calIsol(trk.eta(), trk.phi(), trk.vz(), tracks); } std::pair EgammaL1TkIsolation::calIsol(const double objEta, - const double objPhi, - const double objZ, - const L1TrackCollection& tracks) const { + const double objPhi, + const double objZ, + const L1TrackCollection& tracks) const { double ptSum = 0.; int nrTrks = 0; - std::cout <<"obj eta "< EgammaL1TkIsolation::calIsol(const double objEta, } bool EgammaL1TkIsolation::passTrkSel(const L1Track& trk, - const double trkPt, - const TrkCuts& cuts, - const double objEta, - const double objPhi, - const double objZ) { - - if(trkPt > cuts.minPt && - std::abs(objZ-trk.z0()) < cuts.maxDZ){ + const double trkPt, + const TrkCuts& cuts, + const double objEta, + const double objPhi, + const double objZ) { + if (trkPt > cuts.minPt && std::abs(objZ - trk.z0()) < cuts.maxDZ) { const float trkEta = trk.eta(); - const float dEta = trkEta - objEta; + const float dEta = trkEta - objEta; const float dR2 = reco::deltaR2(objEta, objPhi, trkEta, trk.phi()); return dR2 >= cuts.minDR2 && dR2 <= cuts.maxDR2 && std::abs(dEta) >= cuts.minDEta; } return false; } - From 4871f2eda8783006d330ff6f7bfded5cdb971bb1 Mon Sep 17 00:00:00 2001 From: Sam Harper Date: Thu, 31 Dec 2020 10:56:53 +0100 Subject: [PATCH 3/5] removing debug statement --- RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc b/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc index a3f9bfd8f144c..20d0bb0beb7cb 100644 --- a/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc +++ b/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc @@ -43,8 +43,6 @@ std::pair EgammaL1TkIsolation::calIsol(const double objEta, double ptSum = 0.; int nrTrks = 0; - std::cout << "obj eta " << objEta << " obj phi " << objPhi << " objZ " << objZ << std::endl; - const TrkCuts& cuts = std::abs(objEta) < 1.5 ? barrelCuts_ : endcapCuts_; for (auto& trk : tracks) { From f3c00df683b855cc1b764d7ea8832712c7e8ac8e Mon Sep 17 00:00:00 2001 From: Sam Harper Date: Mon, 4 Jan 2021 13:29:47 +0100 Subject: [PATCH 4/5] code review comments --- .../EgammaHLTEleL1TrackIsolProducer.cc | 6 +- .../interface/EgammaL1TkIsolation.h | 36 +++++---- .../src/EgammaL1TkIsolation.cc | 81 ++++++++++++------- 3 files changed, 77 insertions(+), 46 deletions(-) diff --git a/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTEleL1TrackIsolProducer.cc b/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTEleL1TrackIsolProducer.cc index e74a7d404029f..611ea49c506a5 100644 --- a/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTEleL1TrackIsolProducer.cc +++ b/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTEleL1TrackIsolProducer.cc @@ -35,7 +35,7 @@ class EgammaHLTEleL1TrackIsolProducer : public edm::global::EDProducer<> { public: explicit EgammaHLTEleL1TrackIsolProducer(const edm::ParameterSet&); - ~EgammaHLTEleL1TrackIsolProducer() override; + ~EgammaHLTEleL1TrackIsolProducer() override = default; void produce(edm::StreamID sid, edm::Event&, const edm::EventSetup&) const override; static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); @@ -54,14 +54,12 @@ EgammaHLTEleL1TrackIsolProducer::EgammaHLTEleL1TrackIsolProducer(const edm::Para produces(); } -EgammaHLTEleL1TrackIsolProducer::~EgammaHLTEleL1TrackIsolProducer() {} - void EgammaHLTEleL1TrackIsolProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; desc.add("ecalCands", edm::InputTag("hltEgammaCandidates")); desc.add("eles", edm::InputTag("hltEgammaGsfElectrons")); desc.add("l1Tracks", edm::InputTag("TTTracksFromTrackletEmulation", "Level1TTTracks")); - desc.add("isolCfg", EgammaL1TkIsolation::pSetDescript()); + desc.add("isolCfg", EgammaL1TkIsolation::makePSetDescription()); descriptions.add("hltEgammaHLTEleL1TrackIsolProducer", desc); } void EgammaHLTEleL1TrackIsolProducer::produce(edm::StreamID sid, diff --git a/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h b/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h index 8c365f0cef940..3ecd591924177 100644 --- a/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h +++ b/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h @@ -11,27 +11,18 @@ //based on the work of Swagata Mukherjee and Giulia Sorrentino class EgammaL1TkIsolation { -public: -private: - struct TrkCuts { - float minPt; - float minDR2; - float maxDR2; - float minDEta; - float maxDZ; - explicit TrkCuts(const edm::ParameterSet& para); - static edm::ParameterSetDescription pSetDescript(); - }; - - TrkCuts barrelCuts_, endcapCuts_; - public: explicit EgammaL1TkIsolation(const edm::ParameterSet& para); EgammaL1TkIsolation(const EgammaL1TkIsolation&) = default; ~EgammaL1TkIsolation() = default; EgammaL1TkIsolation& operator=(const EgammaL1TkIsolation&) = default; - static edm::ParameterSetDescription pSetDescript(); + static void fillPSetDescription(edm::ParameterSetDescription& desc); + static edm::ParameterSetDescription makePSetDescription() { + edm::ParameterSetDescription desc; + fillPSetDescription(desc); + return desc; + } std::pair calIsol(const reco::TrackBase& trk, const L1TrackCollection& l1Tks) const; @@ -47,6 +38,21 @@ class EgammaL1TkIsolation { } private: + struct TrkCuts { + float minPt; + float minDR2; + float maxDR2; + float minDEta; + float maxDZ; + explicit TrkCuts(const edm::ParameterSet& para); + static edm::ParameterSetDescription makePSetDescription(); + }; + + bool useAbsEta_; + std::vector etaBoundaries_; + std::vector trkCuts_; + + size_t etaBinNr(double eta) const; static bool passTrkSel(const L1Track& trk, const double trkPt, const TrkCuts& cuts, diff --git a/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc b/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc index 20d0bb0beb7cb..fbd9f3358a51b 100644 --- a/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc +++ b/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc @@ -2,34 +2,31 @@ #include "DataFormats/TrackReco/interface/Track.h" #include "DataFormats/Math/interface/deltaR.h" -EgammaL1TkIsolation::TrkCuts::TrkCuts(const edm::ParameterSet& para) { - minPt = para.getParameter("minPt"); - auto sq = [](double val) { return val * val; }; - minDR2 = sq(para.getParameter("minDR")); - maxDR2 = sq(para.getParameter("maxDR")); - minDEta = para.getParameter("minDEta"); - maxDZ = para.getParameter("maxDZ"); -} - -edm::ParameterSetDescription EgammaL1TkIsolation::TrkCuts::pSetDescript() { - edm::ParameterSetDescription desc; - desc.add("minPt", 2.0); - desc.add("maxDR", 0.3); - desc.add("minDR", 0.01); - desc.add("minDEta", 0.003); - desc.add("maxDZ", 0.7); - return desc; -} +#include EgammaL1TkIsolation::EgammaL1TkIsolation(const edm::ParameterSet& para) - : barrelCuts_(para.getParameter("barrelCuts")), - endcapCuts_(para.getParameter("endcapCuts")) {} + : useAbsEta_(para.getParameter("useAbsEta")), + etaBoundaries_(para.getParameter>("etaBoundaries")) { + const auto& trkCutParams = para.getParameter>("trkCuts"); + for (const auto& params : trkCutParams) { + trkCuts_.push_back(TrkCuts(params)); + } + if (etaBoundaries_.size() + 1 != trkCuts_.size()) { + throw cms::Exception("ConfigError") << "EgammaL1TkIsolation: etaBoundaries parameters size (" + << etaBoundaries_.size() + << ") should be one less than the size of trkCuts VPSet (" << trkCuts_.size() + << ")"; + } + if (!std::is_sorted(etaBoundaries_.begin(), etaBoundaries_.end())) { + throw cms::Exception("ConfigError") + << "EgammaL1TkIsolation: etaBoundaries parameter's entries should be in increasing value"; + } +} -edm::ParameterSetDescription EgammaL1TkIsolation::pSetDescript() { - edm::ParameterSetDescription desc; - desc.add("barrelCuts", TrkCuts::pSetDescript()); - desc.add("endcapCuts", TrkCuts::pSetDescript()); - return desc; +void EgammaL1TkIsolation::fillPSetDescription(edm::ParameterSetDescription& desc) { + desc.add("useAbsEta", true); + desc.add("etaBoundaries", std::vector{1.5}); + desc.addVPSet("trkCuts", TrkCuts::makePSetDescription(), {edm::ParameterSet(), edm::ParameterSet()}); } std::pair EgammaL1TkIsolation::calIsol(const reco::TrackBase& trk, const L1TrackCollection& tracks) const { @@ -43,9 +40,9 @@ std::pair EgammaL1TkIsolation::calIsol(const double objEta, double ptSum = 0.; int nrTrks = 0; - const TrkCuts& cuts = std::abs(objEta) < 1.5 ? barrelCuts_ : endcapCuts_; + const TrkCuts& cuts = trkCuts_[etaBinNr(objEta)]; - for (auto& trk : tracks) { + for (const auto& trk : tracks) { const float trkPt = trk.momentum().perp(); if (passTrkSel(trk, trkPt, cuts, objEta, objPhi, objZ)) { ptSum += trkPt; @@ -55,6 +52,17 @@ std::pair EgammaL1TkIsolation::calIsol(const double objEta, return {nrTrks, ptSum}; } +//as we have verfied that trkCuts_ size is etaBoundaries_ size +1 +//then this is always a valid binnr for trkCuts_ +size_t EgammaL1TkIsolation::etaBinNr(double eta) const { + if (useAbsEta_) { + eta = std::abs(eta); + } + auto res = std::upper_bound(etaBoundaries_.begin(), etaBoundaries_.end(), eta); + size_t binNr = std::distance(etaBoundaries_.begin(), res); + return binNr; +} + bool EgammaL1TkIsolation::passTrkSel(const L1Track& trk, const double trkPt, const TrkCuts& cuts, @@ -70,3 +78,22 @@ bool EgammaL1TkIsolation::passTrkSel(const L1Track& trk, return false; } + +EgammaL1TkIsolation::TrkCuts::TrkCuts(const edm::ParameterSet& para) { + minPt = para.getParameter("minPt"); + auto sq = [](double val) { return val * val; }; + minDR2 = sq(para.getParameter("minDR")); + maxDR2 = sq(para.getParameter("maxDR")); + minDEta = para.getParameter("minDEta"); + maxDZ = para.getParameter("maxDZ"); +} + +edm::ParameterSetDescription EgammaL1TkIsolation::TrkCuts::makePSetDescription() { + edm::ParameterSetDescription desc; + desc.add("minPt", 2.0); + desc.add("maxDR", 0.3); + desc.add("minDR", 0.01); + desc.add("minDEta", 0.003); + desc.add("maxDZ", 0.7); + return desc; +} From aa6df7c25a8eba83ad0d6c5762904d87c4e718bc Mon Sep 17 00:00:00 2001 From: Sam Harper Date: Tue, 5 Jan 2021 10:50:05 +0100 Subject: [PATCH 5/5] more code review comments --- .../L1TrackTrigger/interface/L1Track.h | 5 +++ .../interface/EgammaL1TkIsolation.h | 15 +++---- .../src/EgammaL1TkIsolation.cc | 40 +++++++++---------- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/DataFormats/L1TrackTrigger/interface/L1Track.h b/DataFormats/L1TrackTrigger/interface/L1Track.h index 149d9a91cfeca..2cc2d83c79fec 100644 --- a/DataFormats/L1TrackTrigger/interface/L1Track.h +++ b/DataFormats/L1TrackTrigger/interface/L1Track.h @@ -1,6 +1,11 @@ +#ifndef DataFormats_L1TrackTrigger_L1Track_h +#define DataFormats_L1TrackTrigger_L1Track_h + #include "DataFormats/L1TrackTrigger/interface/TTTrack.h" #include "DataFormats/L1TrackTrigger/interface/TTTypes.h" #include using L1Track = TTTrack; using L1TrackCollection = std::vector; + +#endif diff --git a/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h b/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h index 3ecd591924177..4ab686e5b9d2f 100644 --- a/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h +++ b/RecoEgamma/EgammaIsolationAlgos/interface/EgammaL1TkIsolation.h @@ -1,5 +1,5 @@ -#ifndef RECOEGAMMA_EGAMMAISOLATIONALGOS_EGAMMAL1TKISOLATION_H -#define RECOEGAMMA_EGAMMAISOLATIONALGOS_EGAMMAL1TKISOLATION_H +#ifndef RecoEgamma_EgammaIsolationAlgos_EgammaL1TkIsolation_h +#define RecoEgamma_EgammaIsolationAlgos_EgammaL1TkIsolation_h #include "DataFormats/L1TrackTrigger/interface/L1Track.h" #include "DataFormats/TrackReco/interface/TrackBase.h" @@ -13,9 +13,6 @@ class EgammaL1TkIsolation { public: explicit EgammaL1TkIsolation(const edm::ParameterSet& para); - EgammaL1TkIsolation(const EgammaL1TkIsolation&) = default; - ~EgammaL1TkIsolation() = default; - EgammaL1TkIsolation& operator=(const EgammaL1TkIsolation&) = default; static void fillPSetDescription(edm::ParameterSetDescription& desc); static edm::ParameterSetDescription makePSetDescription() { @@ -48,10 +45,6 @@ class EgammaL1TkIsolation { static edm::ParameterSetDescription makePSetDescription(); }; - bool useAbsEta_; - std::vector etaBoundaries_; - std::vector trkCuts_; - size_t etaBinNr(double eta) const; static bool passTrkSel(const L1Track& trk, const double trkPt, @@ -59,6 +52,10 @@ class EgammaL1TkIsolation { const double objEta, const double objPhi, const double objZ); + + bool useAbsEta_; + std::vector etaBoundaries_; + std::vector trkCuts_; }; #endif diff --git a/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc b/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc index fbd9f3358a51b..1fa0aef29b150 100644 --- a/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc +++ b/RecoEgamma/EgammaIsolationAlgos/src/EgammaL1TkIsolation.cc @@ -9,7 +9,7 @@ EgammaL1TkIsolation::EgammaL1TkIsolation(const edm::ParameterSet& para) etaBoundaries_(para.getParameter>("etaBoundaries")) { const auto& trkCutParams = para.getParameter>("trkCuts"); for (const auto& params : trkCutParams) { - trkCuts_.push_back(TrkCuts(params)); + trkCuts_.emplace_back(TrkCuts(params)); } if (etaBoundaries_.size() + 1 != trkCuts_.size()) { throw cms::Exception("ConfigError") << "EgammaL1TkIsolation: etaBoundaries parameters size (" @@ -52,6 +52,25 @@ std::pair EgammaL1TkIsolation::calIsol(const double objEta, return {nrTrks, ptSum}; } +EgammaL1TkIsolation::TrkCuts::TrkCuts(const edm::ParameterSet& para) { + minPt = para.getParameter("minPt"); + auto sq = [](double val) { return val * val; }; + minDR2 = sq(para.getParameter("minDR")); + maxDR2 = sq(para.getParameter("maxDR")); + minDEta = para.getParameter("minDEta"); + maxDZ = para.getParameter("maxDZ"); +} + +edm::ParameterSetDescription EgammaL1TkIsolation::TrkCuts::makePSetDescription() { + edm::ParameterSetDescription desc; + desc.add("minPt", 2.0); + desc.add("maxDR", 0.3); + desc.add("minDR", 0.01); + desc.add("minDEta", 0.003); + desc.add("maxDZ", 0.7); + return desc; +} + //as we have verfied that trkCuts_ size is etaBoundaries_ size +1 //then this is always a valid binnr for trkCuts_ size_t EgammaL1TkIsolation::etaBinNr(double eta) const { @@ -78,22 +97,3 @@ bool EgammaL1TkIsolation::passTrkSel(const L1Track& trk, return false; } - -EgammaL1TkIsolation::TrkCuts::TrkCuts(const edm::ParameterSet& para) { - minPt = para.getParameter("minPt"); - auto sq = [](double val) { return val * val; }; - minDR2 = sq(para.getParameter("minDR")); - maxDR2 = sq(para.getParameter("maxDR")); - minDEta = para.getParameter("minDEta"); - maxDZ = para.getParameter("maxDZ"); -} - -edm::ParameterSetDescription EgammaL1TkIsolation::TrkCuts::makePSetDescription() { - edm::ParameterSetDescription desc; - desc.add("minPt", 2.0); - desc.add("maxDR", 0.3); - desc.add("minDR", 0.01); - desc.add("minDEta", 0.003); - desc.add("maxDZ", 0.7); - return desc; -}