From a96a66edb60852f6323a300fd391016aeabbdc2a Mon Sep 17 00:00:00 2001 From: bainbrid Date: Wed, 2 Mar 2022 15:52:15 +0100 Subject: [PATCH 1/7] add new LowPtElectron_electronIdx branch that 'cross links' low-pT and PF electrons --- .../plugins/NanoAODBaseCrossCleaner.cc | 17 ++++++- .../NanoAOD/plugins/NanoAODBaseCrossCleaner.h | 5 ++ .../plugins/NanoAODSimpleCrossCleaner.cc | 2 + .../NanoAOD/python/lowPtElectrons_cff.py | 4 +- PhysicsTools/NanoAOD/python/nano_cff.py | 4 ++ .../PatAlgos/plugins/PATObjectCrossLinker.cc | 51 +++++++++++++++++++ 6 files changed, 81 insertions(+), 2 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.cc b/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.cc index ec83884986568..cb5321593c0fb 100644 --- a/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.cc +++ b/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.cc @@ -28,16 +28,19 @@ NanoAODBaseCrossCleaner::NanoAODBaseCrossCleaner(const edm::ParameterSet& params jets_(consumes>(params.getParameter("jets"))), muons_(consumes>(params.getParameter("muons"))), electrons_(consumes>(params.getParameter("electrons"))), + lowPtElectrons_(consumes>(params.getParameter("lowPtElectrons"))), taus_(consumes>(params.getParameter("taus"))), photons_(consumes>(params.getParameter("photons"))), jetSel_(params.getParameter("jetSel")), muonSel_(params.getParameter("muonSel")), electronSel_(params.getParameter("electronSel")), + lowPtElectronSel_(params.getParameter("lowPtElectronSel")), tauSel_(params.getParameter("tauSel")), photonSel_(params.getParameter("photonSel")), jetName_(params.getParameter("jetName")), muonName_(params.getParameter("muonName")), electronName_(params.getParameter("electronName")), + lowPtElectronName_(params.getParameter("lowPtElectronName")), tauName_(params.getParameter("tauName")), photonName_(params.getParameter("photonName")) @@ -45,6 +48,7 @@ NanoAODBaseCrossCleaner::NanoAODBaseCrossCleaner(const edm::ParameterSet& params produces("jets"); produces("muons"); produces("electrons"); + produces("lowPtElectrons"); produces("taus"); produces("photons"); } @@ -86,6 +90,14 @@ void NanoAODBaseCrossCleaner::produce(edm::Event& iEvent, const edm::EventSetup& } auto electronsTable = std::make_unique(electronsIn->size(), electronName_, false, true); + edm::Handle> lowPtElectronsIn; + iEvent.getByToken(lowPtElectrons_, lowPtElectronsIn); + std::vector lowPtEles; + for (const auto& e : *lowPtElectronsIn) { + lowPtEles.push_back(lowPtElectronSel_(e)); + } + auto lowPtElectronsTable = std::make_unique(lowPtElectronsIn->size(), lowPtElectronName_, false, true); + edm::Handle> tausIn; iEvent.getByToken(taus_, tausIn); std::vector taus; @@ -102,17 +114,20 @@ void NanoAODBaseCrossCleaner::produce(edm::Event& iEvent, const edm::EventSetup& } auto photonsTable = std::make_unique(photonsIn->size(), photonName_, false, true); - objectSelection(*jetsIn, *muonsIn, *electronsIn, *tausIn, *photonsIn, jets, muons, eles, taus, photons); + objectSelection(*jetsIn, *muonsIn, *electronsIn, *lowPtElectronsIn, *tausIn, *photonsIn, + jets, muons, eles, lowPtEles, taus, photons); muonsTable->addColumn(name_, muons, doc_); jetsTable->addColumn(name_, jets, doc_); electronsTable->addColumn(name_, eles, doc_); + lowPtElectronsTable->addColumn(name_, lowPtEles, doc_); tausTable->addColumn(name_, taus, doc_); photonsTable->addColumn(name_, photons, doc_); iEvent.put(std::move(jetsTable), "jets"); iEvent.put(std::move(muonsTable), "muons"); iEvent.put(std::move(electronsTable), "electrons"); + iEvent.put(std::move(lowPtElectronsTable), "lowPtElectrons"); iEvent.put(std::move(tausTable), "taus"); iEvent.put(std::move(photonsTable), "photons"); } diff --git a/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.h b/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.h index 775dbb8ef4328..f804372702572 100644 --- a/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.h +++ b/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.h @@ -59,11 +59,13 @@ class NanoAODBaseCrossCleaner : public edm::stream::EDProducer<> { virtual void objectSelection(const edm::View& jets, const edm::View& muons, const edm::View& eles, + const edm::View& lowPtEles, const edm::View& taus, const edm::View& photons, std::vector& jetBits, std::vector& muonBits, std::vector& eleBits, + std::vector& loWptEleBits, std::vector& tauBits, std::vector& photonBits){}; @@ -79,16 +81,19 @@ class NanoAODBaseCrossCleaner : public edm::stream::EDProducer<> { const edm::EDGetTokenT> jets_; const edm::EDGetTokenT> muons_; const edm::EDGetTokenT> electrons_; + const edm::EDGetTokenT> lowPtElectrons_; const edm::EDGetTokenT> taus_; const edm::EDGetTokenT> photons_; const StringCutObjectSelector jetSel_; const StringCutObjectSelector muonSel_; const StringCutObjectSelector electronSel_; + const StringCutObjectSelector lowPtElectronSel_; const StringCutObjectSelector tauSel_; const StringCutObjectSelector photonSel_; const std::string jetName_; const std::string muonName_; const std::string electronName_; + const std::string lowPtElectronName_; const std::string tauName_; const std::string photonName_; }; diff --git a/PhysicsTools/NanoAOD/plugins/NanoAODSimpleCrossCleaner.cc b/PhysicsTools/NanoAOD/plugins/NanoAODSimpleCrossCleaner.cc index 7eaf0ad61a91c..1d1c9304aac3e 100644 --- a/PhysicsTools/NanoAOD/plugins/NanoAODSimpleCrossCleaner.cc +++ b/PhysicsTools/NanoAOD/plugins/NanoAODSimpleCrossCleaner.cc @@ -8,11 +8,13 @@ class NanoAODSimpleCrossCleaner : public NanoAODBaseCrossCleaner { void objectSelection(const edm::View& jets, const edm::View& muons, const edm::View& eles, + const edm::View& lowPtEles, const edm::View& taus, const edm::View& photons, std::vector& jetBits, std::vector& muonBits, std::vector& eleBits, + std::vector& lowPtEleBits, std::vector& tauBits, std::vector& photonBits) override { for (size_t i = 0; i < jets.size(); i++) { diff --git a/PhysicsTools/NanoAOD/python/lowPtElectrons_cff.py b/PhysicsTools/NanoAOD/python/lowPtElectrons_cff.py index c93b427e2cba2..f9966778feab6 100644 --- a/PhysicsTools/NanoAOD/python/lowPtElectrons_cff.py +++ b/PhysicsTools/NanoAOD/python/lowPtElectrons_cff.py @@ -73,7 +73,7 @@ lowPtElectronTable = cms.EDProducer( "SimpleCandidateFlatTableProducer", - src = cms.InputTag("finalLowPtElectrons"), + src = cms.InputTag("linkedObjects","lowPtElectrons"), cut = cms.string(""), name= cms.string("LowPtElectron"), doc = cms.string("slimmedLowPtElectrons after basic selection (" + finalLowPtElectrons.cut.value()+")"), @@ -82,6 +82,8 @@ variables = cms.PSet( # Basic variables CandVars, + # Overlaps with PF electron + electronIdx = Var("?overlaps('electrons').size()>0?overlaps('electrons')[0].key():-1", int, doc="index of the overlapping PF electron (-1 if none)"), # BDT scores and WPs embeddedID = Var("electronID('ID')",float,doc="ID, BDT (raw) score"), ID = Var("userFloat('ID')",float,doc="New ID, BDT (raw) score"), diff --git a/PhysicsTools/NanoAOD/python/nano_cff.py b/PhysicsTools/NanoAOD/python/nano_cff.py index 18194d48d3a5f..6c8f0dacd1fbf 100644 --- a/PhysicsTools/NanoAOD/python/nano_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_cff.py @@ -37,6 +37,7 @@ jets=cms.InputTag("finalJets"), muons=cms.InputTag("finalMuons"), electrons=cms.InputTag("finalElectrons"), + lowPtElectrons=cms.InputTag("finalLowPtElectrons"), taus=cms.InputTag("finalTaus"), photons=cms.InputTag("finalPhotons"), ) @@ -47,14 +48,17 @@ jets=cms.InputTag("linkedObjects","jets"), muons=cms.InputTag("linkedObjects","muons"), electrons=cms.InputTag("linkedObjects","electrons"), + lowPtElectrons=cms.InputTag("linkedObjects","lowPtElectrons"), taus=cms.InputTag("linkedObjects","taus"), photons=cms.InputTag("linkedObjects","photons"), jetSel=cms.string("pt>15"), muonSel=cms.string("track.isNonnull && isLooseMuon && isPFMuon && innerTrack.validFraction >= 0.49 && ( isGlobalMuon && globalTrack.normalizedChi2 < 3 && combinedQuality.chi2LocalPosition < 12 && combinedQuality.trkKink < 20 && segmentCompatibility >= 0.303 || segmentCompatibility >= 0.451 )"), electronSel=cms.string(""), + lowPtElectronSel=cms.string(""), tauSel=cms.string(""), photonSel=cms.string(""), jetName=cms.string("Jet"),muonName=cms.string("Muon"),electronName=cms.string("Electron"), + lowPtElectronName=cms.string("LowPtElectron"), tauName=cms.string("Tau"),photonName=cms.string("Photon") ) diff --git a/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc b/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc index 1c9758c8c290d..b09bc688480f7 100644 --- a/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc +++ b/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc @@ -70,6 +70,14 @@ class PATObjectCrossLinker : public edm::stream::EDProducer<> { C4& itemsMany, const std::string& nameMany); + template + void matchLowPtToElectron(const C1& refProdOne, + C2& itemsOne, + const std::string& nameOne, + const C3& refProdMany, + C4& itemsMany, + const std::string& nameMany); + //virtual void beginRun(edm::Run const&, edm::EventSetup const&) override; //virtual void endRun(edm::Run const&, edm::EventSetup const&) override; //virtual void beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) override; @@ -79,6 +87,7 @@ class PATObjectCrossLinker : public edm::stream::EDProducer<> { const edm::EDGetTokenT> jets_; const edm::EDGetTokenT> muons_; const edm::EDGetTokenT> electrons_; + const edm::EDGetTokenT> lowPtElectrons_; const edm::EDGetTokenT> taus_; const edm::EDGetTokenT> photons_; }; @@ -90,6 +99,7 @@ PATObjectCrossLinker::PATObjectCrossLinker(const edm::ParameterSet& params) : jets_(consumes>(params.getParameter("jets"))), muons_(consumes>(params.getParameter("muons"))), electrons_(consumes>(params.getParameter("electrons"))), + lowPtElectrons_(consumes>(params.getParameter("lowPtElectrons"))), taus_(consumes>(params.getParameter("taus"))), photons_(consumes>(params.getParameter("photons"))) @@ -97,6 +107,7 @@ PATObjectCrossLinker::PATObjectCrossLinker(const edm::ParameterSet& params) produces>("jets"); produces>("muons"); produces>("electrons"); + produces>("lowPtElectrons"); produces>("taus"); produces>("photons"); } @@ -159,6 +170,37 @@ void PATObjectCrossLinker::matchElectronToPhoton(const C1& refProdOne, } } +template +void PATObjectCrossLinker::matchLowPtToElectron(const C1& refProdOne, + C2& itemsOne, + const std::string& nameOne, + const C3& refProdMany, + C4& itemsMany, + const std::string& nameMany) { + size_t ji = 0; + for (auto& j : itemsOne) { + std::vector idxs; + std::vector vdr2; + size_t mi = 0; + for (auto& m : itemsMany) { + float dr2 = deltaR2(m,j); + if (dr2<1.e-6) { // deltaR < 1.e-3 + m.addUserCand(nameOne, reco::CandidatePtr(refProdOne.id(), ji, refProdOne.productGetter())); + idxs.push_back(mi); + vdr2.push_back(dr2); + } + mi++; + } + std::sort(idxs.begin(),idxs.end(),[&](float a, float b) -> bool { return vdr2[a] < vdr2[b]; }); + edm::PtrVector overlaps(refProdMany.id()); + for ( auto idx : idxs ) { + overlaps.push_back(reco::CandidatePtr(refProdMany.id(), idx, refProdMany.productGetter())); + } + j.setOverlaps(nameMany, overlaps); + ji++; + } +} + void PATObjectCrossLinker::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { using namespace edm; edm::Handle> jetsIn; @@ -182,6 +224,13 @@ void PATObjectCrossLinker::produce(edm::Event& iEvent, const edm::EventSetup& iS electrons->push_back(e); auto eleRefProd = iEvent.getRefBeforePut>("electrons"); + edm::Handle> lowPtElectronsIn; + iEvent.getByToken(lowPtElectrons_, lowPtElectronsIn); + auto lowPtElectrons = std::make_unique>(); + for (const auto& e : *lowPtElectronsIn) + lowPtElectrons->push_back(e); + auto lowPtEleRefProd = iEvent.getRefBeforePut>("lowPtElectrons"); + edm::Handle> tausIn; iEvent.getByToken(taus_, tausIn); auto taus = std::make_unique>(); @@ -202,10 +251,12 @@ void PATObjectCrossLinker::produce(edm::Event& iEvent, const edm::EventSetup& iS matchOneToMany(jetRefProd, *jets, "jet", phRefProd, *photons, "photons"); matchElectronToPhoton(eleRefProd, *electrons, "electron", phRefProd, *photons, "photons"); + matchLowPtToElectron(lowPtEleRefProd, *lowPtElectrons, "lowPtElectron", eleRefProd, *electrons, "electrons"); iEvent.put(std::move(jets), "jets"); iEvent.put(std::move(muons), "muons"); iEvent.put(std::move(electrons), "electrons"); + iEvent.put(std::move(lowPtElectrons), "lowPtElectrons"); iEvent.put(std::move(taus), "taus"); iEvent.put(std::move(photons), "photons"); } From b4c332b5e30fca9ac65f7e407b7f96d5a3feab9f Mon Sep 17 00:00:00 2001 From: bainbrid Date: Wed, 2 Mar 2022 17:07:40 +0100 Subject: [PATCH 2/7] remove unnecessary tasks (Ereg and ID); preserve nano v9 functionality --- .../NanoAOD/python/lowPtElectrons_cff.py | 51 ++++++++++++------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/lowPtElectrons_cff.py b/PhysicsTools/NanoAOD/python/lowPtElectrons_cff.py index f9966778feab6..c37f44f0c3313 100644 --- a/PhysicsTools/NanoAOD/python/lowPtElectrons_cff.py +++ b/PhysicsTools/NanoAOD/python/lowPtElectrons_cff.py @@ -7,12 +7,11 @@ ################################################################################ from RecoEgamma.EgammaTools.lowPtElectronModifier_cfi import lowPtElectronModifier -from RecoEgamma.EgammaElectronProducers.lowPtGsfElectrons_cfi import lowPtRegressionModifier modifiedLowPtElectrons = cms.EDProducer( "ModifiedElectronProducer", src = cms.InputTag("slimmedLowPtElectrons"), modifierConfig = cms.PSet( - modifications = cms.VPSet(lowPtElectronModifier,lowPtRegressionModifier) + modifications = cms.VPSet(lowPtElectronModifier) ) ) @@ -28,16 +27,6 @@ miniIsoParamsE = PhysicsTools.PatAlgos.producersLayer1.electronProducer_cfi.patElectrons.miniIsoParamsE, ) -from RecoEgamma.EgammaElectronProducers.lowPtGsfElectronID_cfi import lowPtGsfElectronID -lowPtPATElectronID = lowPtGsfElectronID.clone( - usePAT = True, - electrons = "updatedLowPtElectrons", - unbiased = "", - ModelWeights = [ - 'RecoEgamma/ElectronIdentification/data/LowPtElectrons/LowPtElectrons_ID_2020Nov28.root', - ], -) - isoForLowPtEle = cms.EDProducer( "EleIsoValueMapProducer", src = cms.InputTag("updatedLowPtElectrons"), @@ -52,7 +41,6 @@ "PATElectronUserDataEmbedder", src = cms.InputTag("updatedLowPtElectrons"), userFloats = cms.PSet( - ID = cms.InputTag("lowPtPATElectronID"), miniIsoChg = cms.InputTag("isoForLowPtEle:miniIsoChg"), miniIsoAll = cms.InputTag("isoForLowPtEle:miniIsoAll"), ), @@ -64,7 +52,7 @@ finalLowPtElectrons = cms.EDFilter( "PATElectronRefSelector", src = cms.InputTag("updatedLowPtElectronsWithUserData"), - cut = cms.string("pt > 1. && userFloat('ID') > -0.25"), + cut = cms.string("pt > 1. && electronID('ID') > -0.25"), ) ################################################################################ @@ -85,8 +73,7 @@ # Overlaps with PF electron electronIdx = Var("?overlaps('electrons').size()>0?overlaps('electrons')[0].key():-1", int, doc="index of the overlapping PF electron (-1 if none)"), # BDT scores and WPs - embeddedID = Var("electronID('ID')",float,doc="ID, BDT (raw) score"), - ID = Var("userFloat('ID')",float,doc="New ID, BDT (raw) score"), + ID = Var("electronID('ID')",float,doc="ID, BDT (raw) score"), unbiased = Var("electronID('unbiased')",float,doc="ElectronSeed, pT- and dxy- agnostic BDT (raw) score"), ptbiased = Var("electronID('ptbiased')",float,doc="ElectronSeed, pT- and dxy- dependent BDT (raw) score"), # Isolation @@ -179,7 +166,6 @@ lowPtElectronTask = cms.Task(modifiedLowPtElectrons, updatedLowPtElectrons, - lowPtPATElectronID, isoForLowPtEle, updatedLowPtElectronsWithUserData, finalLowPtElectrons) @@ -205,3 +191,34 @@ (_modifiers).toReplaceWith(lowPtElectronTask,cms.Task()) (_modifiers).toReplaceWith(lowPtElectronTablesTask,cms.Task()) (_modifiers).toReplaceWith(lowPtElectronMCTask,cms.Task()) + +# To preserve "nano v9" functionality ... + +from RecoEgamma.EgammaElectronProducers.lowPtGsfElectrons_cfi import lowPtRegressionModifier +run2_nanoAOD_106Xv2.toModify(modifiedLowPtElectrons.modifierConfig, + modifications = cms.VPSet(lowPtElectronModifier, + lowPtRegressionModifier)) + +run2_nanoAOD_106Xv2.toModify(updatedLowPtElectronsWithUserData.userFloats, + ID = cms.InputTag("lowPtPATElectronID")) + +run2_nanoAOD_106Xv2.toModify(finalLowPtElectrons, + cut = "pt > 1. && userFloat('ID') > -0.25") + +run2_nanoAOD_106Xv2.toModify(lowPtElectronTable.variables, + embeddedID = Var("electronID('ID')",float,doc="ID, BDT (raw) score"), + ID = Var("userFloat('ID')",float,doc="New ID, BDT (raw) score")) + +from RecoEgamma.EgammaElectronProducers.lowPtGsfElectronID_cfi import lowPtGsfElectronID +lowPtPATElectronID = lowPtGsfElectronID.clone( + usePAT = True, + electrons = "updatedLowPtElectrons", + unbiased = "", + ModelWeights = [ + 'RecoEgamma/ElectronIdentification/data/LowPtElectrons/LowPtElectrons_ID_2020Nov28.root', + ], +) + +_lowPtElectronTask = cms.Task(lowPtPATElectronID) +_lowPtElectronTask.add(lowPtElectronTask.copy()) +run2_nanoAOD_106Xv2.toReplaceWith(lowPtElectronTask,_lowPtElectronTask) From fea41a918b68033de63288bb937220dfec02d3df Mon Sep 17 00:00:00 2001 From: bainbrid Date: Thu, 3 Mar 2022 23:18:07 +0100 Subject: [PATCH 3/7] scram build code-format --- .../plugins/NanoAODBaseCrossCleaner.cc | 17 ++++++++-- .../PatAlgos/plugins/PATObjectCrossLinker.cc | 32 +++++++++---------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.cc b/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.cc index cb5321593c0fb..4f470e772dc78 100644 --- a/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.cc +++ b/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.cc @@ -96,7 +96,8 @@ void NanoAODBaseCrossCleaner::produce(edm::Event& iEvent, const edm::EventSetup& for (const auto& e : *lowPtElectronsIn) { lowPtEles.push_back(lowPtElectronSel_(e)); } - auto lowPtElectronsTable = std::make_unique(lowPtElectronsIn->size(), lowPtElectronName_, false, true); + auto lowPtElectronsTable = + std::make_unique(lowPtElectronsIn->size(), lowPtElectronName_, false, true); edm::Handle> tausIn; iEvent.getByToken(taus_, tausIn); @@ -114,8 +115,18 @@ void NanoAODBaseCrossCleaner::produce(edm::Event& iEvent, const edm::EventSetup& } auto photonsTable = std::make_unique(photonsIn->size(), photonName_, false, true); - objectSelection(*jetsIn, *muonsIn, *electronsIn, *lowPtElectronsIn, *tausIn, *photonsIn, - jets, muons, eles, lowPtEles, taus, photons); + objectSelection(*jetsIn, + *muonsIn, + *electronsIn, + *lowPtElectronsIn, + *tausIn, + *photonsIn, + jets, + muons, + eles, + lowPtEles, + taus, + photons); muonsTable->addColumn(name_, muons, doc_); jetsTable->addColumn(name_, jets, doc_); diff --git a/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc b/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc index b09bc688480f7..8a25222813e00 100644 --- a/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc +++ b/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc @@ -72,11 +72,11 @@ class PATObjectCrossLinker : public edm::stream::EDProducer<> { template void matchLowPtToElectron(const C1& refProdOne, - C2& itemsOne, - const std::string& nameOne, - const C3& refProdMany, - C4& itemsMany, - const std::string& nameMany); + C2& itemsOne, + const std::string& nameOne, + const C3& refProdMany, + C4& itemsMany, + const std::string& nameMany); //virtual void beginRun(edm::Run const&, edm::EventSetup const&) override; //virtual void endRun(edm::Run const&, edm::EventSetup const&) override; @@ -172,28 +172,28 @@ void PATObjectCrossLinker::matchElectronToPhoton(const C1& refProdOne, template void PATObjectCrossLinker::matchLowPtToElectron(const C1& refProdOne, - C2& itemsOne, - const std::string& nameOne, - const C3& refProdMany, - C4& itemsMany, - const std::string& nameMany) { + C2& itemsOne, + const std::string& nameOne, + const C3& refProdMany, + C4& itemsMany, + const std::string& nameMany) { size_t ji = 0; for (auto& j : itemsOne) { std::vector idxs; std::vector vdr2; size_t mi = 0; for (auto& m : itemsMany) { - float dr2 = deltaR2(m,j); - if (dr2<1.e-6) { // deltaR < 1.e-3 + float dr2 = deltaR2(m, j); + if (dr2 < 1.e-6) { // deltaR < 1.e-3 m.addUserCand(nameOne, reco::CandidatePtr(refProdOne.id(), ji, refProdOne.productGetter())); - idxs.push_back(mi); - vdr2.push_back(dr2); + idxs.push_back(mi); + vdr2.push_back(dr2); } mi++; } - std::sort(idxs.begin(),idxs.end(),[&](float a, float b) -> bool { return vdr2[a] < vdr2[b]; }); + std::sort(idxs.begin(), idxs.end(), [&](float a, float b) -> bool { return vdr2[a] < vdr2[b]; }); edm::PtrVector overlaps(refProdMany.id()); - for ( auto idx : idxs ) { + for (auto idx : idxs) { overlaps.push_back(reco::CandidatePtr(refProdMany.id(), idx, refProdMany.productGetter())); } j.setOverlaps(nameMany, overlaps); From 99c7984d4678c3283dfd93387c454ba758d07612 Mon Sep 17 00:00:00 2001 From: bainbrid Date: Wed, 6 Apr 2022 20:59:01 +0200 Subject: [PATCH 4/7] suppress lowPtElectrons in linkedObjects and simpleCleanerTable for pre-nano-v9 --- .../plugins/NanoAODBaseCrossCleaner.cc | 38 +++++++++---------- .../NanoAOD/plugins/NanoAODBaseCrossCleaner.h | 5 +-- .../plugins/NanoAODSimpleCrossCleaner.cc | 2 - PhysicsTools/NanoAOD/python/nano_cff.py | 10 +++++ .../PatAlgos/plugins/PATObjectCrossLinker.cc | 27 ++++++++----- 5 files changed, 47 insertions(+), 35 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.cc b/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.cc index 4f470e772dc78..374a171929fcc 100644 --- a/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.cc +++ b/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.cc @@ -28,7 +28,8 @@ NanoAODBaseCrossCleaner::NanoAODBaseCrossCleaner(const edm::ParameterSet& params jets_(consumes>(params.getParameter("jets"))), muons_(consumes>(params.getParameter("muons"))), electrons_(consumes>(params.getParameter("electrons"))), - lowPtElectrons_(consumes>(params.getParameter("lowPtElectrons"))), + lowPtElectronsTag_(params.getParameter("lowPtElectrons")), + lowPtElectrons_(mayConsume>(lowPtElectronsTag_)), taus_(consumes>(params.getParameter("taus"))), photons_(consumes>(params.getParameter("photons"))), jetSel_(params.getParameter("jetSel")), @@ -48,7 +49,8 @@ NanoAODBaseCrossCleaner::NanoAODBaseCrossCleaner(const edm::ParameterSet& params produces("jets"); produces("muons"); produces("electrons"); - produces("lowPtElectrons"); + if (!lowPtElectronsTag_.label().empty()) + produces("lowPtElectrons"); produces("taus"); produces("photons"); } @@ -91,13 +93,13 @@ void NanoAODBaseCrossCleaner::produce(edm::Event& iEvent, const edm::EventSetup& auto electronsTable = std::make_unique(electronsIn->size(), electronName_, false, true); edm::Handle> lowPtElectronsIn; - iEvent.getByToken(lowPtElectrons_, lowPtElectronsIn); std::vector lowPtEles; - for (const auto& e : *lowPtElectronsIn) { - lowPtEles.push_back(lowPtElectronSel_(e)); + if (!lowPtElectronsTag_.label().empty()) { + iEvent.getByToken(lowPtElectrons_, lowPtElectronsIn); + for (const auto& e : *lowPtElectronsIn) { + lowPtEles.push_back(lowPtElectronSel_(e)); + } } - auto lowPtElectronsTable = - std::make_unique(lowPtElectronsIn->size(), lowPtElectronName_, false, true); edm::Handle> tausIn; iEvent.getByToken(taus_, tausIn); @@ -115,32 +117,26 @@ void NanoAODBaseCrossCleaner::produce(edm::Event& iEvent, const edm::EventSetup& } auto photonsTable = std::make_unique(photonsIn->size(), photonName_, false, true); - objectSelection(*jetsIn, - *muonsIn, - *electronsIn, - *lowPtElectronsIn, - *tausIn, - *photonsIn, - jets, - muons, - eles, - lowPtEles, - taus, - photons); + objectSelection(*jetsIn, *muonsIn, *electronsIn, *tausIn, *photonsIn, jets, muons, eles, taus, photons); muonsTable->addColumn(name_, muons, doc_); jetsTable->addColumn(name_, jets, doc_); electronsTable->addColumn(name_, eles, doc_); - lowPtElectronsTable->addColumn(name_, lowPtEles, doc_); tausTable->addColumn(name_, taus, doc_); photonsTable->addColumn(name_, photons, doc_); iEvent.put(std::move(jetsTable), "jets"); iEvent.put(std::move(muonsTable), "muons"); iEvent.put(std::move(electronsTable), "electrons"); - iEvent.put(std::move(lowPtElectronsTable), "lowPtElectrons"); iEvent.put(std::move(tausTable), "taus"); iEvent.put(std::move(photonsTable), "photons"); + + if (!lowPtElectronsTag_.label().empty()) { + auto lowPtElectronsTable = + std::make_unique(lowPtElectronsIn->size(), lowPtElectronName_, false, true); + lowPtElectronsTable->addColumn(name_, lowPtEles, doc_); + iEvent.put(std::move(lowPtElectronsTable), "lowPtElectrons"); + } } // ------------ method called once each stream before processing any runs, lumis or events ------------ diff --git a/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.h b/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.h index f804372702572..849218af1a95f 100644 --- a/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.h +++ b/PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.h @@ -59,13 +59,11 @@ class NanoAODBaseCrossCleaner : public edm::stream::EDProducer<> { virtual void objectSelection(const edm::View& jets, const edm::View& muons, const edm::View& eles, - const edm::View& lowPtEles, const edm::View& taus, const edm::View& photons, std::vector& jetBits, std::vector& muonBits, std::vector& eleBits, - std::vector& loWptEleBits, std::vector& tauBits, std::vector& photonBits){}; @@ -81,7 +79,8 @@ class NanoAODBaseCrossCleaner : public edm::stream::EDProducer<> { const edm::EDGetTokenT> jets_; const edm::EDGetTokenT> muons_; const edm::EDGetTokenT> electrons_; - const edm::EDGetTokenT> lowPtElectrons_; + edm::InputTag lowPtElectronsTag_; + edm::EDGetTokenT> lowPtElectrons_; const edm::EDGetTokenT> taus_; const edm::EDGetTokenT> photons_; const StringCutObjectSelector jetSel_; diff --git a/PhysicsTools/NanoAOD/plugins/NanoAODSimpleCrossCleaner.cc b/PhysicsTools/NanoAOD/plugins/NanoAODSimpleCrossCleaner.cc index 1d1c9304aac3e..7eaf0ad61a91c 100644 --- a/PhysicsTools/NanoAOD/plugins/NanoAODSimpleCrossCleaner.cc +++ b/PhysicsTools/NanoAOD/plugins/NanoAODSimpleCrossCleaner.cc @@ -8,13 +8,11 @@ class NanoAODSimpleCrossCleaner : public NanoAODBaseCrossCleaner { void objectSelection(const edm::View& jets, const edm::View& muons, const edm::View& eles, - const edm::View& lowPtEles, const edm::View& taus, const edm::View& photons, std::vector& jetBits, std::vector& muonBits, std::vector& eleBits, - std::vector& lowPtEleBits, std::vector& tauBits, std::vector& photonBits) override { for (size_t i = 0; i < jets.size(); i++) { diff --git a/PhysicsTools/NanoAOD/python/nano_cff.py b/PhysicsTools/NanoAOD/python/nano_cff.py index 6c8f0dacd1fbf..95a40287e74b8 100644 --- a/PhysicsTools/NanoAOD/python/nano_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_cff.py @@ -402,3 +402,13 @@ def nanoWmassGenCustomize(process): etaPrecision="{} ? {} : {}".format(pdgSelection, CandVars.eta.precision.value(), genParticleTable.variables.eta.precision.value()) process.genParticleTable.variables.eta.precision=cms.string(etaPrecision) return process + +# lowPtElectrons do not exsit for old nano campaigns (i.e. before v9) +_modifiers = ( run2_miniAOD_80XLegacy | + run2_nanoAOD_94XMiniAODv1 | + run2_nanoAOD_94XMiniAODv2 | + run2_nanoAOD_94X2016 | + run2_nanoAOD_102Xv1 | + run2_nanoAOD_106Xv1 ) +_modifiers.toModify(linkedObjects,lowPtElectrons="") +_modifiers.toModify(simpleCleanerTable,lowPtElectrons="") diff --git a/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc b/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc index 8a25222813e00..1d0df2ce17a8b 100644 --- a/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc +++ b/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc @@ -87,7 +87,8 @@ class PATObjectCrossLinker : public edm::stream::EDProducer<> { const edm::EDGetTokenT> jets_; const edm::EDGetTokenT> muons_; const edm::EDGetTokenT> electrons_; - const edm::EDGetTokenT> lowPtElectrons_; + edm::InputTag lowPtElectronsTag_; + edm::EDGetTokenT> lowPtElectrons_; const edm::EDGetTokenT> taus_; const edm::EDGetTokenT> photons_; }; @@ -99,7 +100,8 @@ PATObjectCrossLinker::PATObjectCrossLinker(const edm::ParameterSet& params) : jets_(consumes>(params.getParameter("jets"))), muons_(consumes>(params.getParameter("muons"))), electrons_(consumes>(params.getParameter("electrons"))), - lowPtElectrons_(consumes>(params.getParameter("lowPtElectrons"))), + lowPtElectronsTag_(params.getParameter("lowPtElectrons")), + lowPtElectrons_(mayConsume>(lowPtElectronsTag_)), taus_(consumes>(params.getParameter("taus"))), photons_(consumes>(params.getParameter("photons"))) @@ -107,7 +109,8 @@ PATObjectCrossLinker::PATObjectCrossLinker(const edm::ParameterSet& params) produces>("jets"); produces>("muons"); produces>("electrons"); - produces>("lowPtElectrons"); + if (!lowPtElectronsTag_.label().empty()) + produces>("lowPtElectrons"); produces>("taus"); produces>("photons"); } @@ -225,11 +228,13 @@ void PATObjectCrossLinker::produce(edm::Event& iEvent, const edm::EventSetup& iS auto eleRefProd = iEvent.getRefBeforePut>("electrons"); edm::Handle> lowPtElectronsIn; - iEvent.getByToken(lowPtElectrons_, lowPtElectronsIn); auto lowPtElectrons = std::make_unique>(); - for (const auto& e : *lowPtElectronsIn) - lowPtElectrons->push_back(e); - auto lowPtEleRefProd = iEvent.getRefBeforePut>("lowPtElectrons"); + if (!lowPtElectronsTag_.label().empty()) { + iEvent.getByToken(lowPtElectrons_, lowPtElectronsIn); + for (const auto& e : *lowPtElectronsIn) { + lowPtElectrons->push_back(e); + } + } edm::Handle> tausIn; iEvent.getByToken(taus_, tausIn); @@ -251,12 +256,16 @@ void PATObjectCrossLinker::produce(edm::Event& iEvent, const edm::EventSetup& iS matchOneToMany(jetRefProd, *jets, "jet", phRefProd, *photons, "photons"); matchElectronToPhoton(eleRefProd, *electrons, "electron", phRefProd, *photons, "photons"); - matchLowPtToElectron(lowPtEleRefProd, *lowPtElectrons, "lowPtElectron", eleRefProd, *electrons, "electrons"); + if (!lowPtElectronsTag_.label().empty()) { + auto lowPtEleRefProd = iEvent.getRefBeforePut>("lowPtElectrons"); + matchLowPtToElectron(lowPtEleRefProd, *lowPtElectrons, "lowPtElectron", eleRefProd, *electrons, "electrons"); + } iEvent.put(std::move(jets), "jets"); iEvent.put(std::move(muons), "muons"); iEvent.put(std::move(electrons), "electrons"); - iEvent.put(std::move(lowPtElectrons), "lowPtElectrons"); + if (!lowPtElectronsTag_.label().empty()) + iEvent.put(std::move(lowPtElectrons), "lowPtElectrons"); iEvent.put(std::move(taus), "taus"); iEvent.put(std::move(photons), "photons"); } From 0d06e6c1813ce3ddbc8c24cce0471fcfeb72fb62 Mon Sep 17 00:00:00 2001 From: bainbrid Date: Wed, 11 May 2022 15:28:45 +0200 Subject: [PATCH 5/7] suppress lowPtElectrons DQM histos for v8 and earlier --- PhysicsTools/NanoAOD/python/nanoDQM_cff.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cff.py b/PhysicsTools/NanoAOD/python/nanoDQM_cff.py index 4e74190953967..51a6ece603c1c 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cff.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cff.py @@ -140,4 +140,13 @@ (run3_nanoAOD_devel).toModify(nanoDQM.vplots, Electron = None) (run3_nanoAOD_devel).toModify(nanoDQMMC.vplots, Electron = None) +_modifiers = ( run2_miniAOD_80XLegacy | + run2_nanoAOD_94XMiniAODv1 | + run2_nanoAOD_94XMiniAODv2 | + run2_nanoAOD_94X2016 | + run2_nanoAOD_102Xv1 | + run2_nanoAOD_106Xv1 ) +_modifiers.toModify(nanoDQM.vplots, LowPtElectron = None) +_modifiers.toModify(nanoDQMMC.vplots, LowPtElectron = None) + nanoHarvest = cms.Sequence( nanoDQMQTester ) From 028bc8a12044bd2c9f48eb88e393b63ae9678248 Mon Sep 17 00:00:00 2001 From: bainbrid Date: Wed, 11 May 2022 15:29:31 +0200 Subject: [PATCH 6/7] bug fix: sort indices by increasing dR --- PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc b/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc index 1d0df2ce17a8b..0caee058ac9ed 100644 --- a/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc +++ b/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc @@ -182,22 +182,21 @@ void PATObjectCrossLinker::matchLowPtToElectron(const C1& refProdOne, const std::string& nameMany) { size_t ji = 0; for (auto& j : itemsOne) { - std::vector idxs; - std::vector vdr2; + std::vector< std::pair > idxs; size_t mi = 0; for (auto& m : itemsMany) { float dr2 = deltaR2(m, j); if (dr2 < 1.e-6) { // deltaR < 1.e-3 m.addUserCand(nameOne, reco::CandidatePtr(refProdOne.id(), ji, refProdOne.productGetter())); - idxs.push_back(mi); - vdr2.push_back(dr2); + idxs.push_back( std::make_pair(mi,dr2) ); } mi++; } - std::sort(idxs.begin(), idxs.end(), [&](float a, float b) -> bool { return vdr2[a] < vdr2[b]; }); + std::sort(idxs.begin(), idxs.end(), [](auto& left, auto& right){return left.second < right.second;}); + edm::PtrVector overlaps(refProdMany.id()); for (auto idx : idxs) { - overlaps.push_back(reco::CandidatePtr(refProdMany.id(), idx, refProdMany.productGetter())); + overlaps.push_back(reco::CandidatePtr(refProdMany.id(), idx.first, refProdMany.productGetter())); } j.setOverlaps(nameMany, overlaps); ji++; From 65e9bca2bfa32af9fe366c0bb408b46e0d724a78 Mon Sep 17 00:00:00 2001 From: bainbrid Date: Wed, 11 May 2022 15:30:49 +0200 Subject: [PATCH 7/7] scram build code-format --- PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc b/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc index 0caee058ac9ed..f2f99463783b8 100644 --- a/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc +++ b/PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc @@ -182,17 +182,17 @@ void PATObjectCrossLinker::matchLowPtToElectron(const C1& refProdOne, const std::string& nameMany) { size_t ji = 0; for (auto& j : itemsOne) { - std::vector< std::pair > idxs; + std::vector> idxs; size_t mi = 0; for (auto& m : itemsMany) { float dr2 = deltaR2(m, j); if (dr2 < 1.e-6) { // deltaR < 1.e-3 m.addUserCand(nameOne, reco::CandidatePtr(refProdOne.id(), ji, refProdOne.productGetter())); - idxs.push_back( std::make_pair(mi,dr2) ); + idxs.push_back(std::make_pair(mi, dr2)); } mi++; } - std::sort(idxs.begin(), idxs.end(), [](auto& left, auto& right){return left.second < right.second;}); + std::sort(idxs.begin(), idxs.end(), [](auto& left, auto& right) { return left.second < right.second; }); edm::PtrVector overlaps(refProdMany.id()); for (auto idx : idxs) {