From 817cac6cc5ddd82f0d5eca7dde38f44193aaf856 Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Tue, 17 Sep 2024 09:37:05 +0200 Subject: [PATCH 1/8] Add PATPackedCandidateSelector --- PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc b/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc index 39a35cc98b4b0..ae35dc5e62fc6 100644 --- a/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc +++ b/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc @@ -3,6 +3,7 @@ #include "CommonTools/UtilAlgos/interface/SingleObjectSelector.h" #include "CommonTools/UtilAlgos/interface/StringCutObjectSelector.h" #include "DataFormats/Common/interface/RefVector.h" +#include "DataFormats/PatCandidates/interface/PackedCandidate.h" #include "DataFormats/PatCandidates/interface/CompositeCandidate.h" #include "DataFormats/PatCandidates/interface/Electron.h" #include "DataFormats/PatCandidates/interface/GenericParticle.h" @@ -248,6 +249,12 @@ namespace pat { typedef SingleObjectSelector, StringCutObjectSelector> PATGenericParticleSelector; + typedef SingleObjectSelector< + std::vector, + StringCutObjectSelector // true => lazy parsing => get all methods of daughters + > + PATPackedCandidateSelector; + typedef SingleObjectSelector, StringCutObjectSelector, edm::RefVector>> @@ -296,6 +303,7 @@ DEFINE_FWK_MODULE(PATPFParticleSelector); DEFINE_FWK_MODULE(PATCompositeCandidateSelector); DEFINE_FWK_MODULE(PATTriggerObjectStandAloneSelector); DEFINE_FWK_MODULE(PATGenericParticleSelector); +DEFINE_FWK_MODULE(PATPackedCandidateSelector); DEFINE_FWK_MODULE(PATElectronRefSelector); DEFINE_FWK_MODULE(PATMuonRefSelector); From 9dc5dd5e84b17ff8266060150045b0913c502e18 Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Tue, 17 Sep 2024 09:38:22 +0200 Subject: [PATCH 2/8] Add PF candidates table for FatJet with abs(eta) <= 2.5 --- PhysicsTools/NanoAOD/python/jetsAK8_cff.py | 44 +++++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py index 7915baaf4dafd..833fb9a3385c7 100644 --- a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py +++ b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py @@ -317,10 +317,50 @@ def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubl fatJetTable.variables.pt.precision=10 subJetTable.variables.pt.precision=10 +############################################################## +# AK8 constituents +############################################################### +finalJetsAK8PFConstituents = cms.EDProducer("PatJetConstituentPtrSelector", + src = cms.InputTag("finalJetsAK8"), + cut = cms.string("abs(eta) <= 2.5") +) + +finalJetsPFConstituents = cms.EDProducer("PackedCandidatePtrMerger", + src = cms.VInputTag(cms.InputTag("finalJetsAK8PFConstituents", "constituents")), + skipNulls = cms.bool(True), + warnOnSkip = cms.bool(True) +) + +pfCandidatesTable = cms.EDProducer("SimplePATCandidateFlatTableProducer", + src = cms.InputTag("finalJetsPFConstituents"), + cut = cms.string(""), + name = cms.string("PFCand"), + doc = cms.string("PF candidate constituents of AK8 puppi jets (FatJet) with |eta| <= 2.5."), + singleton = cms.bool(False), + extension = cms.bool(False), + variables = cms.PSet( + pt = Var("pt * puppiWeight()", float, doc="Puppi-weighted pt", precision=10), + mass = Var("mass * puppiWeight()", float, doc="Puppi-weighted mass", precision=10), + eta = Var("eta", float, precision=12), + phi = Var("phi", float, precision=12), + pdgId = Var("pdgId", int, doc="Defines PF candidate type (+/-211 = ChgHad, 130 = NeuHad, 22 = Photon, +/-11 = Electron, +/-13 = Muon, 1 = HFHad, 2 = HFEM)") + ) +) + +finalJetsAK8ConstituentsTable = cms.EDProducer("SimplePatJetConstituentTableProducer", + name = cms.string(fatJetTable.name.value()+"PFCand"), + candIdxName = cms.string("PFCandIdx"), + candIdxDoc = cms.string("Index in the PFCand table"), + jets = fatJetTable.src, + candidates = pfCandidatesTable.src, + jetCut = cms.string("") +) + jetAK8UserDataTask = cms.Task(tightJetIdAK8,tightJetIdLepVetoAK8) -jetAK8Task = cms.Task(jetCorrFactorsAK8,updatedJetsAK8,jetAK8UserDataTask,updatedJetsAK8WithUserData,finalJetsAK8) +jetAK8Task = cms.Task(jetCorrFactorsAK8,updatedJetsAK8,jetAK8UserDataTask,updatedJetsAK8WithUserData,finalJetsAK8,finalJetsAK8PFConstituents,finalJetsPFConstituents) #after lepton collections have been run jetAK8LepTask = cms.Task(lepInAK8JetVars) -jetAK8TablesTask = cms.Task(fatJetTable,subJetTable) +jetAK8TablesTask = cms.Task(fatJetTable,subJetTable,pfCandidatesTable,finalJetsAK8ConstituentsTable) + From b44e5ae8f6238a4106d121b56003515e63c0fdb6 Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Tue, 17 Sep 2024 09:42:01 +0200 Subject: [PATCH 3/8] small update for PFCand pdgId --- PhysicsTools/NanoAOD/python/jetsAK8_cff.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py index 833fb9a3385c7..ac759f0ddd27f 100644 --- a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py +++ b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py @@ -343,7 +343,7 @@ def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubl mass = Var("mass * puppiWeight()", float, doc="Puppi-weighted mass", precision=10), eta = Var("eta", float, precision=12), phi = Var("phi", float, precision=12), - pdgId = Var("pdgId", int, doc="Defines PF candidate type (+/-211 = ChgHad, 130 = NeuHad, 22 = Photon, +/-11 = Electron, +/-13 = Muon, 1 = HFHad, 2 = HFEM)") + pdgId = Var("pdgId", int, doc="PF candidate type (+/-211 = ChgHad, 130 = NeuHad, 22 = Photon, +/-11 = Electron, +/-13 = Muon, 1 = HFHad, 2 = HFEM)") ) ) From f653ffcf60a501d4f57788f29aee7ab756dfcffc Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Tue, 17 Sep 2024 09:42:46 +0200 Subject: [PATCH 4/8] Add PFCand in nanoDQM --- PhysicsTools/NanoAOD/python/nanoDQM_cfi.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py index 294156824b2ec..f77dc5fd6fd42 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py @@ -240,6 +240,17 @@ Plot1D('tau4', 'tau4', 20, 0, 1, 'Nsubjettiness (4 axis)'), ) ), + PFCand = cms.PSet( + sels = cms.PSet(), + plots = cms.VPSet( + Count1D('_size', 10, 0, 100, 'PF candidates'), + Plot1D('pt', 'pt' 20, 0, 50, 'Puppi-weighted pt'), + Plot1D('eta', 'eta' 20, -4, 4., 'eta'), + Plot1D('phi', 'phi' 20, -3.14159, 3.14159, 'phi'), + Plot1D('mass', 'mass' 10, 0, 1., 'Puppi-weighted mass'), + Plot1D('pdgId', 'pdgId', 44, -220, 220, 'PF candidate type (+/-211 = ChgHad, 130 = NeuHad, 22 = Photon, +/-11 = Electron, +/-13 = Muon, 1 = HFHad, 2 = HFEM)'), + ) + ), Flag = cms.PSet( sels = cms.PSet(), plots = cms.VPSet( From 2e58c5b6332c8588b6c8737fc68836a5468f2f65 Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Tue, 17 Sep 2024 09:45:58 +0200 Subject: [PATCH 5/8] Add SimpleJetConstituentTableProducer --- .../SimpleJetConstituentTableProducer.cc | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc diff --git a/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc b/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc new file mode 100644 index 0000000000000..733549be63762 --- /dev/null +++ b/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc @@ -0,0 +1,136 @@ +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" + +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/StreamID.h" + +#include "DataFormats/PatCandidates/interface/Jet.h" +#include "DataFormats/PatCandidates/interface/PackedCandidate.h" +#include "DataFormats/PatCandidates/interface/PackedGenParticle.h" + +#include "DataFormats/Candidate/interface/CandidateFwd.h" + +#include "CommonTools/Utils/interface/StringCutObjectSelector.h" +#include "DataFormats/NanoAOD/interface/FlatTable.h" + +template +class SimpleJetConstituentTableProducer : public edm::stream::EDProducer<> { +public: + explicit SimpleJetConstituentTableProducer(const edm::ParameterSet &); + ~SimpleJetConstituentTableProducer() override; + + static void fillDescriptions(edm::ConfigurationDescriptions &descriptions); + +private: + void produce(edm::Event &, const edm::EventSetup &) override; + + const std::string name_; + const std::string candIdxName_; + const std::string candIdxDoc_; + + edm::EDGetTokenT> jet_token_; + edm::EDGetTokenT cand_token_; + + const StringCutObjectSelector jetCut_; + + edm::Handle cands_; +}; + +// +// constructors and destructor +// +template< typename T> +SimpleJetConstituentTableProducer::SimpleJetConstituentTableProducer(const edm::ParameterSet &iConfig): + name_(iConfig.getParameter("name")), + candIdxName_(iConfig.getParameter("candIdxName")), + candIdxDoc_(iConfig.getParameter("candIdxDoc")), + jet_token_(consumes>(iConfig.getParameter("jets"))), + cand_token_(consumes(iConfig.getParameter("candidates"))), + jetCut_(iConfig.getParameter("jetCut")) +{ + produces(name_); + produces>(); +} + +template< typename T> +SimpleJetConstituentTableProducer::~SimpleJetConstituentTableProducer() {} + +template< typename T> +void SimpleJetConstituentTableProducer::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) { + // elements in all these collections must have the same order! + auto outCands = std::make_unique>(); + + auto jets = iEvent.getHandle(jet_token_); + + iEvent.getByToken(cand_token_, cands_); + auto candPtrs = cands_->ptrs(); + + // + // First, select jets + // + std::vector jetsPassCut; + for (unsigned jetIdx = 0; jetIdx < jets->size(); ++jetIdx) { + const auto &jet = jets->at(jetIdx); + if (!jetCut_(jet)) continue; + jetsPassCut.push_back(jets->at(jetIdx)); + } + + // + // Then loop over selected jets + // + std::vector parentJetIdx; + std::vector candIdx; + for (unsigned jetIdx = 0; jetIdx < jetsPassCut.size(); ++jetIdx) { + const auto &jet = jetsPassCut.at(jetIdx); + + // + // Loop over jet constituents + // + std::vector const & daughters = jet.daughterPtrVector(); + for (const auto &cand : daughters) { + auto candInNewList = std::find( candPtrs.begin(), candPtrs.end(), cand ); + if ( candInNewList == candPtrs.end() ) { + continue; + } + outCands->push_back(cand); + parentJetIdx.push_back(jetIdx); + candIdx.push_back(candInNewList - candPtrs.begin()); + } + }// end jet loop + + auto candTable = std::make_unique(outCands->size(), name_, false); + // We fill from here only stuff that cannot be created with the SimpleFlatTableProducer + candTable->addColumn(candIdxName_, candIdx, candIdxDoc_); + + std::string parentJetIdxName("jetIdx"); + std::string parentJetIdxDoc("Index of the parent jet"); + if constexpr (std::is_same::value){ + parentJetIdxName = "genJetIdx"; + parentJetIdxDoc = "Index of the parent gen jet"; + } + candTable->addColumn(parentJetIdxName, parentJetIdx, parentJetIdxDoc); + + iEvent.put(std::move(candTable), name_); + iEvent.put(std::move(outCands)); +} + +template< typename T> +void SimpleJetConstituentTableProducer::fillDescriptions(edm::ConfigurationDescriptions &descriptions) { + edm::ParameterSetDescription desc; + desc.add("name", "FatJetPFCand"); + desc.add("candIdxName", "PFCandIdx"); + desc.add("candIdxDoc", "Index in PFCand table"); + desc.add("jets", edm::InputTag("finalJetsAK8")); + desc.add("candidates", edm::InputTag("packedPFCandidates")); + desc.add("jetCut", ""); + descriptions.addWithDefaultLabel(desc); +} + +typedef SimpleJetConstituentTableProducer SimplePatJetConstituentTableProducer; +typedef SimpleJetConstituentTableProducer SimpleGenJetConstituentTableProducer; + +DEFINE_FWK_MODULE(SimplePatJetConstituentTableProducer); +DEFINE_FWK_MODULE(SimpleGenJetConstituentTableProducer); \ No newline at end of file From 9bb7e360ff03babb0b82f7d0a53e5c7f00a8b393 Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Tue, 17 Sep 2024 09:58:13 +0200 Subject: [PATCH 6/8] Apple code-format patches --- .../SimpleJetConstituentTableProducer.cc | 38 +++++++++---------- .../PatAlgos/plugins/PATObjectSelector.cc | 8 ++-- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc b/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc index 733549be63762..05565a483a912 100644 --- a/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc @@ -16,7 +16,7 @@ #include "CommonTools/Utils/interface/StringCutObjectSelector.h" #include "DataFormats/NanoAOD/interface/FlatTable.h" -template +template class SimpleJetConstituentTableProducer : public edm::stream::EDProducer<> { public: explicit SimpleJetConstituentTableProducer(const edm::ParameterSet &); @@ -42,23 +42,22 @@ class SimpleJetConstituentTableProducer : public edm::stream::EDProducer<> { // // constructors and destructor // -template< typename T> -SimpleJetConstituentTableProducer::SimpleJetConstituentTableProducer(const edm::ParameterSet &iConfig): - name_(iConfig.getParameter("name")), - candIdxName_(iConfig.getParameter("candIdxName")), - candIdxDoc_(iConfig.getParameter("candIdxDoc")), - jet_token_(consumes>(iConfig.getParameter("jets"))), - cand_token_(consumes(iConfig.getParameter("candidates"))), - jetCut_(iConfig.getParameter("jetCut")) -{ +template +SimpleJetConstituentTableProducer::SimpleJetConstituentTableProducer(const edm::ParameterSet &iConfig) + : name_(iConfig.getParameter("name")), + candIdxName_(iConfig.getParameter("candIdxName")), + candIdxDoc_(iConfig.getParameter("candIdxDoc")), + jet_token_(consumes>(iConfig.getParameter("jets"))), + cand_token_(consumes(iConfig.getParameter("candidates"))), + jetCut_(iConfig.getParameter("jetCut")) { produces(name_); produces>(); } -template< typename T> +template SimpleJetConstituentTableProducer::~SimpleJetConstituentTableProducer() {} -template< typename T> +template void SimpleJetConstituentTableProducer::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) { // elements in all these collections must have the same order! auto outCands = std::make_unique>(); @@ -74,7 +73,8 @@ void SimpleJetConstituentTableProducer::produce(edm::Event &iEvent, const edm std::vector jetsPassCut; for (unsigned jetIdx = 0; jetIdx < jets->size(); ++jetIdx) { const auto &jet = jets->at(jetIdx); - if (!jetCut_(jet)) continue; + if (!jetCut_(jet)) + continue; jetsPassCut.push_back(jets->at(jetIdx)); } @@ -89,17 +89,17 @@ void SimpleJetConstituentTableProducer::produce(edm::Event &iEvent, const edm // // Loop over jet constituents // - std::vector const & daughters = jet.daughterPtrVector(); + std::vector const &daughters = jet.daughterPtrVector(); for (const auto &cand : daughters) { - auto candInNewList = std::find( candPtrs.begin(), candPtrs.end(), cand ); - if ( candInNewList == candPtrs.end() ) { + auto candInNewList = std::find(candPtrs.begin(), candPtrs.end(), cand); + if (candInNewList == candPtrs.end()) { continue; } outCands->push_back(cand); parentJetIdx.push_back(jetIdx); candIdx.push_back(candInNewList - candPtrs.begin()); } - }// end jet loop + } // end jet loop auto candTable = std::make_unique(outCands->size(), name_, false); // We fill from here only stuff that cannot be created with the SimpleFlatTableProducer @@ -107,7 +107,7 @@ void SimpleJetConstituentTableProducer::produce(edm::Event &iEvent, const edm std::string parentJetIdxName("jetIdx"); std::string parentJetIdxDoc("Index of the parent jet"); - if constexpr (std::is_same::value){ + if constexpr (std::is_same::value) { parentJetIdxName = "genJetIdx"; parentJetIdxDoc = "Index of the parent gen jet"; } @@ -117,7 +117,7 @@ void SimpleJetConstituentTableProducer::produce(edm::Event &iEvent, const edm iEvent.put(std::move(outCands)); } -template< typename T> +template void SimpleJetConstituentTableProducer::fillDescriptions(edm::ConfigurationDescriptions &descriptions) { edm::ParameterSetDescription desc; desc.add("name", "FatJetPFCand"); diff --git a/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc b/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc index ae35dc5e62fc6..854f3c558e2a2 100644 --- a/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc +++ b/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc @@ -250,10 +250,10 @@ namespace pat { PATGenericParticleSelector; typedef SingleObjectSelector< - std::vector, - StringCutObjectSelector // true => lazy parsing => get all methods of daughters - > - PATPackedCandidateSelector; + std::vector, + StringCutObjectSelector // true => lazy parsing => get all methods of daughters + > + PATPackedCandidateSelector; typedef SingleObjectSelector, StringCutObjectSelector, From 973ce46a412cd4d97084e5a9a15ce28b108ad33b Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Tue, 17 Sep 2024 14:07:03 +0200 Subject: [PATCH 7/8] Fix typo --- PhysicsTools/NanoAOD/python/nanoDQM_cfi.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py index f77dc5fd6fd42..eb4a6b89945ae 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py @@ -244,10 +244,10 @@ sels = cms.PSet(), plots = cms.VPSet( Count1D('_size', 10, 0, 100, 'PF candidates'), - Plot1D('pt', 'pt' 20, 0, 50, 'Puppi-weighted pt'), - Plot1D('eta', 'eta' 20, -4, 4., 'eta'), - Plot1D('phi', 'phi' 20, -3.14159, 3.14159, 'phi'), - Plot1D('mass', 'mass' 10, 0, 1., 'Puppi-weighted mass'), + Plot1D('pt', 'pt', 20, 0, 50, 'Puppi-weighted pt'), + Plot1D('eta', 'eta', 20, -4, 4., 'eta'), + Plot1D('phi', 'phi', 20, -3.14159, 3.14159, 'phi'), + Plot1D('mass', 'mass', 10, 0, 1., 'Puppi-weighted mass'), Plot1D('pdgId', 'pdgId', 44, -220, 220, 'PF candidate type (+/-211 = ChgHad, 130 = NeuHad, 22 = Photon, +/-11 = Electron, +/-13 = Muon, 1 = HFHad, 2 = HFEM)'), ) ), From 7797075c0ef1b43037e435dceb50d1f2c03397d0 Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Fri, 20 Sep 2024 12:33:33 +0300 Subject: [PATCH 8/8] Update for src consistency --- PhysicsTools/NanoAOD/python/jetsAK8_cff.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py index ac759f0ddd27f..1829fdd92bf51 100644 --- a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py +++ b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py @@ -321,7 +321,7 @@ def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubl # AK8 constituents ############################################################### finalJetsAK8PFConstituents = cms.EDProducer("PatJetConstituentPtrSelector", - src = cms.InputTag("finalJetsAK8"), + src = fatJetTable.src, cut = cms.string("abs(eta) <= 2.5") ) @@ -353,7 +353,7 @@ def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubl candIdxDoc = cms.string("Index in the PFCand table"), jets = fatJetTable.src, candidates = pfCandidatesTable.src, - jetCut = cms.string("") + jetCut = fatJetTable.cut ) jetAK8UserDataTask = cms.Task(tightJetIdAK8,tightJetIdLepVetoAK8)