From f1bf112f00729830864a86b150842210741bd72d Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Wed, 29 Jan 2025 20:57:44 +0100 Subject: [PATCH 1/6] Add selector for PackedCandidate Ptr and PackedGenParticle Ptr --- .../PatAlgos/plugins/PATObjectSelector.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc b/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc index 854f3c558e2a2..6c75e01dee5c7 100644 --- a/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc +++ b/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc @@ -4,6 +4,7 @@ #include "CommonTools/UtilAlgos/interface/StringCutObjectSelector.h" #include "DataFormats/Common/interface/RefVector.h" #include "DataFormats/PatCandidates/interface/PackedCandidate.h" +#include "DataFormats/PatCandidates/interface/PackedGenParticle.h" #include "DataFormats/PatCandidates/interface/CompositeCandidate.h" #include "DataFormats/PatCandidates/interface/Electron.h" #include "DataFormats/PatCandidates/interface/GenericParticle.h" @@ -255,6 +256,18 @@ namespace pat { > PATPackedCandidateSelector; + typedef SingleObjectSelector< + std::vector>, + StringCutObjectSelector, true>, + std::vector>> + PATPackedCandidatePtrSelector; + + typedef SingleObjectSelector< + std::vector>, + StringCutObjectSelector, true>, + std::vector>> + PATPackedGenParticlePtrSelector; + typedef SingleObjectSelector, StringCutObjectSelector, edm::RefVector>> @@ -304,6 +317,8 @@ DEFINE_FWK_MODULE(PATCompositeCandidateSelector); DEFINE_FWK_MODULE(PATTriggerObjectStandAloneSelector); DEFINE_FWK_MODULE(PATGenericParticleSelector); DEFINE_FWK_MODULE(PATPackedCandidateSelector); +DEFINE_FWK_MODULE(PATPackedCandidatePtrSelector); +DEFINE_FWK_MODULE(PATPackedGenParticlePtrSelector); DEFINE_FWK_MODULE(PATElectronRefSelector); DEFINE_FWK_MODULE(PATMuonRefSelector); From 2f1e9183970d63c07a257d4678fa620de1cf8d97 Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Wed, 29 Jan 2025 23:09:27 +0100 Subject: [PATCH 2/6] Add TableProducer for PackedGenParticle --- .../NanoAOD/plugins/SimplePATFlatTableProducerPlugins.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PhysicsTools/NanoAOD/plugins/SimplePATFlatTableProducerPlugins.cc b/PhysicsTools/NanoAOD/plugins/SimplePATFlatTableProducerPlugins.cc index 921163486de77..2d7d0ea5029ba 100644 --- a/PhysicsTools/NanoAOD/plugins/SimplePATFlatTableProducerPlugins.cc +++ b/PhysicsTools/NanoAOD/plugins/SimplePATFlatTableProducerPlugins.cc @@ -24,6 +24,9 @@ typedef SimpleFlatTableProducer SimplePATGenericParticleFl #include "DataFormats/PatCandidates/interface/PackedCandidate.h" typedef SimpleFlatTableProducer SimplePATCandidateFlatTableProducer; +#include "DataFormats/PatCandidates/interface/PackedGenParticle.h" +typedef SimpleFlatTableProducer SimplePATGenParticleFlatTableProducer; + #include "DataFormats/PatCandidates/interface/MET.h" typedef SimpleFlatTableProducer SimplePATMETFlatTableProducer; @@ -44,6 +47,7 @@ DEFINE_FWK_MODULE(SimplePATJetFlatTableProducer); DEFINE_FWK_MODULE(SimplePATIsolatedTrackFlatTableProducer); DEFINE_FWK_MODULE(SimplePATGenericParticleFlatTableProducer); DEFINE_FWK_MODULE(SimplePATCandidateFlatTableProducer); +DEFINE_FWK_MODULE(SimplePATGenParticleFlatTableProducer); DEFINE_FWK_MODULE(SimplePATMETFlatTableProducer); DEFINE_FWK_MODULE(SimplePATElectron2TrackTimeLifeInfoFlatTableProducer); DEFINE_FWK_MODULE(SimplePATMuon2TrackTimeLifeInfoFlatTableProducer); From 9cabbf1d7a1ab76fdfea903152beb502eef6f6b3 Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Wed, 29 Jan 2025 23:13:18 +0100 Subject: [PATCH 3/6] Rewrite SimpleJetConstituentTableProducer to be able to cut on constituents. Move jet constituents set up to its own file. Add functions to add AK4 jet and genjets constituents for private production --- .../SimpleJetConstituentTableProducer.cc | 75 ++++--- .../NanoAOD/python/jetConstituents_cff.py | 194 ++++++++++++++++++ PhysicsTools/NanoAOD/python/jetsAK8_cff.py | 45 +--- PhysicsTools/NanoAOD/python/nano_cff.py | 7 +- 4 files changed, 249 insertions(+), 72 deletions(-) create mode 100644 PhysicsTools/NanoAOD/python/jetConstituents_cff.py diff --git a/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc b/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc index 05565a483a912..c42381f9824a7 100644 --- a/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc @@ -16,12 +16,17 @@ #include "CommonTools/Utils/interface/StringCutObjectSelector.h" #include "DataFormats/NanoAOD/interface/FlatTable.h" -template +template > class SimpleJetConstituentTableProducer : public edm::stream::EDProducer<> { public: + + using ConstituentsOutput = C; + using ConstituentValueType = typename C::value_type; + explicit SimpleJetConstituentTableProducer(const edm::ParameterSet &); ~SimpleJetConstituentTableProducer() override; + ConstituentValueType const initptr(edm::Ptr const&) const; static void fillDescriptions(edm::ConfigurationDescriptions &descriptions); private: @@ -35,41 +40,40 @@ class SimpleJetConstituentTableProducer : public edm::stream::EDProducer<> { edm::EDGetTokenT cand_token_; const StringCutObjectSelector jetCut_; - - edm::Handle cands_; + const StringCutObjectSelector jetConstCut_; }; // // constructors and destructor // -template -SimpleJetConstituentTableProducer::SimpleJetConstituentTableProducer(const edm::ParameterSet &iConfig) +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")) { + jetCut_(iConfig.getParameter("jetCut")), + jetConstCut_(iConfig.getParameter("jetConstCut")) { produces(name_); - produces>(); + produces(); } -template -SimpleJetConstituentTableProducer::~SimpleJetConstituentTableProducer() {} +template +SimpleJetConstituentTableProducer::~SimpleJetConstituentTableProducer() {} -template -void SimpleJetConstituentTableProducer::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) { +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>(); + auto outCands = std::make_unique(); auto jets = iEvent.getHandle(jet_token_); + edm::Handle cands_; 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); @@ -78,23 +82,27 @@ void SimpleJetConstituentTableProducer::produce(edm::Event &iEvent, const edm 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); + for (const auto &dauPtr : daughters) { + + // Apply cut on jet constituent + typename C::value_type cand = initptr(dauPtr); + if (!jetConstCut_(cand)) + continue; + + // Find jet constituent in candidate collection + auto candInNewList = std::find(candPtrs.begin(), candPtrs.end(), dauPtr); if (candInNewList == candPtrs.end()) { continue; } + outCands->push_back(cand); parentJetIdx.push_back(jetIdx); candIdx.push_back(candInNewList - candPtrs.begin()); @@ -103,7 +111,7 @@ void SimpleJetConstituentTableProducer::produce(edm::Event &iEvent, const edm 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_); + candTable->template addColumn(candIdxName_, candIdx, candIdxDoc_); std::string parentJetIdxName("jetIdx"); std::string parentJetIdxDoc("Index of the parent jet"); @@ -111,14 +119,28 @@ void SimpleJetConstituentTableProducer::produce(edm::Event &iEvent, const edm parentJetIdxName = "genJetIdx"; parentJetIdxDoc = "Index of the parent gen jet"; } - candTable->addColumn(parentJetIdxName, parentJetIdx, parentJetIdxDoc); + candTable->template addColumn(parentJetIdxName, parentJetIdx, parentJetIdxDoc); iEvent.put(std::move(candTable), name_); iEvent.put(std::move(outCands)); } -template -void SimpleJetConstituentTableProducer::fillDescriptions(edm::ConfigurationDescriptions &descriptions) { +template <> +edm::Ptr const +SimpleJetConstituentTableProducer>>::initptr(edm::Ptr const& dau) const { + edm::Ptr retval(dau); + return retval; +} + +template <> +edm::Ptr const +SimpleJetConstituentTableProducer>>::initptr(edm::Ptr const& dau) const { + edm::Ptr retval(dau); + return retval; +} + +template +void SimpleJetConstituentTableProducer::fillDescriptions(edm::ConfigurationDescriptions &descriptions) { edm::ParameterSetDescription desc; desc.add("name", "FatJetPFCand"); desc.add("candIdxName", "PFCandIdx"); @@ -126,11 +148,12 @@ void SimpleJetConstituentTableProducer::fillDescriptions(edm::ConfigurationDe desc.add("jets", edm::InputTag("finalJetsAK8")); desc.add("candidates", edm::InputTag("packedPFCandidates")); desc.add("jetCut", ""); + desc.add("jetConstCut", ""); descriptions.addWithDefaultLabel(desc); } -typedef SimpleJetConstituentTableProducer SimplePatJetConstituentTableProducer; -typedef SimpleJetConstituentTableProducer SimpleGenJetConstituentTableProducer; +typedef SimpleJetConstituentTableProducer>> SimplePatJetConstituentTableProducer; +typedef SimpleJetConstituentTableProducer>> SimpleGenJetConstituentTableProducer; DEFINE_FWK_MODULE(SimplePatJetConstituentTableProducer); DEFINE_FWK_MODULE(SimpleGenJetConstituentTableProducer); \ No newline at end of file diff --git a/PhysicsTools/NanoAOD/python/jetConstituents_cff.py b/PhysicsTools/NanoAOD/python/jetConstituents_cff.py new file mode 100644 index 0000000000000..859f0e92647f4 --- /dev/null +++ b/PhysicsTools/NanoAOD/python/jetConstituents_cff.py @@ -0,0 +1,194 @@ +import FWCore.ParameterSet.Config as cms + +from PhysicsTools.NanoAOD.common_cff import * +from PhysicsTools.NanoAOD.jetsAK8_cff import fatJetTable as _fatJetTable + +############################################################## +# Take AK8 jets and collect their PF constituents +############################################################### +finalJetsAK8PFConstituents = cms.EDProducer("PatJetConstituentPtrSelector", + src = _fatJetTable.src, + cut = cms.string("abs(eta) <= 2.5") +) + +selectedFinalJetsAK8PFConstituents = cms.EDFilter("PATPackedCandidatePtrSelector", + src = cms.InputTag("finalJetsAK8PFConstituents", "constituents"), + cut = cms.string("") +) + +############################################################## +# Setup PF candidates table +############################################################## +finalPFCandidates = cms.EDProducer("PackedCandidatePtrMerger", + src = cms.VInputTag(cms.InputTag("selectedFinalJetsAK8PFConstituents")), + skipNulls = cms.bool(True), + warnOnSkip = cms.bool(True) +) + +pfCandidatesTable = cms.EDProducer("SimplePATCandidateFlatTableProducer", + src = cms.InputTag("finalPFCandidates"), + 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="PF candidate type (+/-211 = ChgHad, 130 = NeuHad, 22 = Photon, +/-11 = Electron, +/-13 = Muon, 1 = HFHad, 2 = HFEM)") + ) +) + +############################################################## +# Setup AK8 jet constituents table +############################################################## +finalJetsAK8ConstituentsTable = cms.EDProducer("SimplePatJetConstituentTableProducer", + name = cms.string(_fatJetTable.name.value()+"PFCand"), + candIdxName = cms.string("pfCandIdx"), + candIdxDoc = cms.string("Index in the PFCand table"), + candidates = pfCandidatesTable.src, + jets = _fatJetTable.src, + jetCut = _fatJetTable.cut, + jetConstCut = selectedFinalJetsAK8PFConstituents.cut +) + +jetConstituentsTask = cms.Task(finalJetsAK8PFConstituents,selectedFinalJetsAK8PFConstituents) +jetConstituentsTablesTask = cms.Task(finalPFCandidates,pfCandidatesTable,finalJetsAK8ConstituentsTable) + + +def SaveAK4JetConstituents(process, jetCut="", jetConstCut=""): + """ + This function can be used as a cmsDriver customization + function to add AK4 jet constituents, on top of the AK8 + jet constituents. + """ + process.finalJetsPuppiPFConstituents = process.finalJetsAK8PFConstituents.clone( + src = process.jetPuppiTable.src, + cut = jetCut + ) + process.jetConstituentsTask.add(process.finalJetsPuppiPFConstituents) + + process.selectedFinalJetsPuppiPFConstituents = process.selectedFinalJetsAK8PFConstituents.clone( + src = cms.InputTag("finalJetsPuppiPFConstituents", "constituents"), + cut = jetConstCut + ) + process.jetConstituentsTask.add(process.selectedFinalJetsPuppiPFConstituents) + + process.finalPFCandidates.src += ["selectedFinalJetsPuppiPFConstituents"] + process.pfCandidatesTable.doc = pfCandidatesTable.doc.value()+" and AK4 puppi jets (Jet)" + + process.finalJetsPuppiConstituentsTable = process.finalJetsAK8ConstituentsTable.clone( + name = process.jetPuppiTable.name.value()+"PFCand", + jets = process.jetPuppiTable.src, + jetCut = process.jetPuppiTable.cut, + jetConstCut = process.selectedFinalJetsPuppiPFConstituents.cut + ) + process.jetConstituentsTablesTask.add(process.finalJetsPuppiConstituentsTable) + + return process + +def SaveGenJetConstituents(process, addGenJetConst, addGenJetAK8Const, genJetConstCut="",genJetAK8ConstCut=""): + """ + This function can be used as a cmsDriver + customization function to add gen jet + constituents. + """ + process.genjetConstituentsTask = cms.Task() + process.genjetConstituentsTableTask = cms.Task() + + if addGenJetConst: + process.genJetConstituents = cms.EDProducer("GenJetPackedConstituentPtrSelector", + src = process.genJetTable.src, + cut = process.genJetTable.cut, + ) + process.genjetConstituentsTask.add(process.genJetConstituents) + + process.selectedGenJetConstituents = cms.EDFilter("PATPackedGenParticlePtrSelector", + src = cms.InputTag("genJetConstituents", "constituents"), + cut = cms.string(genJetConstCut) + ) + process.genjetConstituentsTask.add(process.selectedGenJetConstituents) + + if addGenJetAK8Const: + process.genJetAK8Constituents = cms.EDProducer("GenJetPackedConstituentPtrSelector", + src = process.genJetAK8Table.src, + cut = process.genJetAK8Table.cut, + ) + process.genjetConstituentsTask.add(process.genJetAK8Constituents) + + process.selectedGenJetAK8Constituents = cms.EDFilter("PATPackedGenParticlePtrSelector", + src = cms.InputTag("genJetAK8Constituents", "constituents"), + cut = cms.string(genJetConstCut) + ) + process.genjetConstituentsTask.add(process.selectedGenJetAK8Constituents) + + if addGenJetConst or addGenJetConst: + process.finalGenPartCandidates = cms.EDProducer("PackedGenParticlePtrMerger", + src = cms.VInputTag(), + skipNulls = cms.bool(True), + warnOnSkip = cms.bool(True) + ) + process.genjetConstituentsTableTask.add(process.finalGenPartCandidates) + + process.genPartCandidatesTable = cms.EDProducer("SimplePATGenParticleFlatTableProducer", + src = cms.InputTag("finalGenPartCandidates"), + cut = cms.string(""), + name = cms.string("GenPartCand"), + doc = cms.string("Gen particle constituents:"), + singleton = cms.bool(False), + extension = cms.bool(False), + variables = cms.PSet(P4Vars, + pdgId = Var("pdgId", int, doc="pdgId") + ) + ) + process.genjetConstituentsTableTask.add(process.genPartCandidatesTable) + process.genPartCandidatesTable.variables.pt.precision=10 + process.genPartCandidatesTable.variables.mass.precision=10 + + if addGenJetConst: + process.finalGenPartCandidates.src += ["selectedGenJetConstituents"] + process.genPartCandidatesTable.doc = process.genPartCandidatesTable.doc.value()+" AK4 Gen jets (GenJet) " + + process.genJetConstituentsTable = cms.EDProducer("SimpleGenJetConstituentTableProducer", + name = cms.string(process.genJetTable.name.value()+"GenPartCand"), + candIdxName = cms.string("genPartCandIdx"), + candIdxDoc = cms.string("Index in the GenPartCand table"), + candidates = pfCandidatesTable.src, + jets = process.genJetTable.src, + jetCut = process.genJetTable.cut, + jetConstCut = process.selectedGenJetConstituents.cut + ) + process.genjetConstituentsTableTask.add(process.genJetConstituentsTable) + + if addGenJetAK8Const: + process.finalGenPartCandidates.src += ["selectedGenJetAK8Constituents"] + process.genPartCandidatesTable.doc = process.genPartCandidatesTable.doc.value()+" AK8 Gen jets (GenJetAK8)" + + process.genJetAK8ConstituentsTable = cms.EDProducer("SimpleGenJetConstituentTableProducer", + name = cms.string(process.genJetAK8Table.name.value()+"GenPartCand"), + candIdxName = cms.string("genPartCandIdx"), + candIdxDoc = cms.string("Index in the GenPartCand table"), + candidates = pfCandidatesTable.src, + jets = process.genJetAK8Table.src, + jetCut = process.genJetAK8Table.cut, + jetConstCut = process.selectedGenJetConstituents.cut + ) + process.genjetConstituentsTableTask.add(process.genJetAK8ConstituentsTable) + + process.nanoTableTaskFS.add(process.genjetConstituentsTask) + process.nanoTableTaskFS.add(process.genjetConstituentsTableTask) + + return process + +def SaveGenJetAK4Constituents(process): + process = SaveGenJetConstituents(process,True,False) + return process +def SaveGenJetAK8Constituents(process): + process = SaveGenJetConstituents(process,True,False) + return process +def SaveGenJetAK4AK8Constituents(process): + process = SaveGenJetConstituents(process,True,True) + return process + diff --git a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py index ca1b924b8f407..876f76eb04d9a 100644 --- a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py +++ b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py @@ -279,55 +279,14 @@ def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubl btagDeepB = Var("bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb')",float,doc="DeepCSV b+bb tag discriminator",precision=10), ) - #jets are not as precise as muons fatJetTable.variables.pt.precision=10 subJetTable.variables.pt.precision=10 -############################################################## -# AK8 constituents -############################################################### -finalJetsAK8PFConstituents = cms.EDProducer("PatJetConstituentPtrSelector", - src = fatJetTable.src, - 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="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 = fatJetTable.cut -) - jetAK8UserDataTask = cms.Task() -jetAK8Task = cms.Task(jetCorrFactorsAK8,updatedJetsAK8,jetAK8UserDataTask,updatedJetsAK8WithUserData,finalJetsAK8,finalJetsAK8PFConstituents,finalJetsPFConstituents) +jetAK8Task = cms.Task(jetCorrFactorsAK8,updatedJetsAK8,jetAK8UserDataTask,updatedJetsAK8WithUserData,finalJetsAK8) #after lepton collections have been run jetAK8LepTask = cms.Task(lepInAK8JetVars) -jetAK8TablesTask = cms.Task(fatJetTable,subJetTable,pfCandidatesTable,finalJetsAK8ConstituentsTable) - +jetAK8TablesTask = cms.Task(fatJetTable,subJetTable) diff --git a/PhysicsTools/NanoAOD/python/nano_cff.py b/PhysicsTools/NanoAOD/python/nano_cff.py index 386b78fbb6ca9..37fe0c9648f5f 100644 --- a/PhysicsTools/NanoAOD/python/nano_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_cff.py @@ -5,6 +5,7 @@ from PhysicsTools.NanoAOD.jetsAK4_Puppi_cff import * from PhysicsTools.NanoAOD.jetsAK8_cff import * from PhysicsTools.NanoAOD.jetMC_cff import * +from PhysicsTools.NanoAOD.jetConstituents_cff import * from PhysicsTools.NanoAOD.muons_cff import * from PhysicsTools.NanoAOD.taus_cff import * from PhysicsTools.NanoAOD.boostedTaus_cff import * @@ -57,14 +58,14 @@ ) nanoTableTaskCommon = cms.Task( - cms.Task(nanoMetadata), - jetPuppiTask, jetPuppiForMETTask, jetAK8Task, + cms.Task(nanoMetadata), + jetPuppiTask, jetPuppiForMETTask, jetAK8Task, jetConstituentsTask, extraFlagsProducersTask, muonTask, tauTask, boostedTauTask, electronTask , lowPtElectronTask, photonTask, vertexTask, isoTrackTask, jetAK8LepTask, # must be after all the leptons softActivityTask, cms.Task(linkedObjects), - jetPuppiTablesTask, jetAK8TablesTask, + jetPuppiTablesTask, jetAK8TablesTask, jetConstituentsTablesTask, muonTablesTask, fsrTablesTask, tauTablesTask, boostedTauTablesTask, electronTablesTask, lowPtElectronTablesTask, photonTablesTask, globalTablesTask, vertexTablesTask, metTablesTask, extraFlagsTableTask, From fc5f1daac0d0d3dc248d580608926a24d5997d44 Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Wed, 29 Jan 2025 23:28:19 +0100 Subject: [PATCH 4/6] Add WvsQCD binarized score for globalParT3 --- PhysicsTools/NanoAOD/python/jetsAK8_cff.py | 2 ++ PhysicsTools/NanoAOD/python/nanoDQM_cfi.py | 1 + 2 files changed, 3 insertions(+) diff --git a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py index 876f76eb04d9a..c1d2d0c616428 100644 --- a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py +++ b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py @@ -73,6 +73,8 @@ globalParT3_TopbWmv = Var("bDiscriminator('pfGlobalParticleTransformerAK8JetTags:probTopbWmv')",float,doc="Mass-decorrelated GlobalParT-3 Top->bWmv score",precision=10), globalParT3_TopbWtauhv = Var("bDiscriminator('pfGlobalParticleTransformerAK8JetTags:probTopbWtauhv')",float,doc="Mass-decorrelated GlobalParT-3 Top->bWtauhv score",precision=10), globalParT3_QCD = Var("bDiscriminator('pfGlobalParticleTransformerAK8JetTags:probQCD')",float,doc="Mass-decorrelated GlobalParT-3 QCD score.",precision=10), + globalParT3_WvsQCD = Var("?bDiscriminator('pfGlobalParticleTransformerAK8JetTags:probXqq')+bDiscriminator('pfGlobalParticleTransformerAK8JetTags:probXcs')+bDiscriminator('pfGlobalParticleTransformerAK8JetTags:probQCD')>0?(bDiscriminator('pfGlobalParticleTransformerAK8JetTags:probXqq')+bDiscriminator('pfGlobalParticleTransformerAK8JetTags:probXcs'))/(bDiscriminator('pfGlobalParticleTransformerAK8JetTags:probXqq')+bDiscriminator('pfGlobalParticleTransformerAK8JetTags:probXcs')+bDiscriminator('pfGlobalParticleTransformerAK8JetTags:probQCD')):-1", + float,doc="Mass-decorrelated GlobalParT-3 (Xqq+Xcs/Xqq+Xcs+QCD) binarized score.",precision=10), globalParT3_massCorrX2p = Var("bDiscriminator('pfGlobalParticleTransformerAK8JetTags:massCorrX2p')",float,doc="GlobalParT-3 mass regression corrector with respect to the original jet mass, optimised for resonance 2-prong (bb/cc/cs/ss/qq) jets. Use (massCorrX2p * mass * (1 - rawFactor)) to get the regressed mass",precision=10), globalParT3_massCorrGeneric = Var("bDiscriminator('pfGlobalParticleTransformerAK8JetTags:massCorrGeneric')",float,doc="GlobalParT-3 mass regression corrector with respect to the original jet mass, optimised for generic jet cases. Use (massCorrGeneric * mass * (1 - rawFactor)) to get the regressed mass",precision=10), globalParT3_withMassTopvsQCD = Var("bDiscriminator('pfGlobalParticleTransformerAK8JetTags:probWithMassTopvsQCD')",float,doc="GlobalParT-3 tagger (w/mass) Top vs QCD discriminator",precision=10), diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py index 89a6a9ba2567a..9529f9a792984 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py @@ -198,6 +198,7 @@ Plot1D('globalParT3_TopbWmv', 'globalParT3_TopbWmv', 20, -1, 1, 'GlobalParT-3 Top->bWmv score'), Plot1D('globalParT3_TopbWtauhv', 'globalParT3_TopbWtauhv', 20, -1, 1, 'GlobalParT-3 Top->bWtauhv score'), Plot1D('globalParT3_QCD', 'globalParT3_QCD', 20, -1, 1, 'GlobalParT-3 QCD score'), + Plot1D('globalParT3_WvsQCD', 'globalParT3_WvsQCD', 20, -1, 1, 'GlobalParT-3 (Xqq+Xcs/Xqq+Xcs+QCD) binarized score'), Plot1D('globalParT3_massCorrX2p', 'globalParT3_massCorrX2p', 20, -1, 2, 'GlobalParT-3 mass regression corrector (for X->2-prong jets)'), Plot1D('globalParT3_massCorrGeneric', 'globalParT3_massCorrGeneric', 20, -1, 2, 'GlobalParT-3 mass regression corrector (for generic cases)'), Plot1D('globalParT3_withMassTopvsQCD', 'globalParT3_withMassTopvsQCD', 20, -1, 1, 'GlobalParT-3 tagger (mass-correlated) Top vs QCD discriminator'), From 8bb27f0d24b34df08ea242a5bb8945cc346d6374 Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Wed, 29 Jan 2025 23:48:02 +0100 Subject: [PATCH 5/6] Add code-checks patch --- .../SimpleJetConstituentTableProducer.cc | 24 ++++++++++--------- .../PatAlgos/plugins/PATObjectSelector.cc | 14 +++++------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc b/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc index c42381f9824a7..b1552e8071638 100644 --- a/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/SimpleJetConstituentTableProducer.cc @@ -19,14 +19,13 @@ template > class SimpleJetConstituentTableProducer : public edm::stream::EDProducer<> { public: - using ConstituentsOutput = C; using ConstituentValueType = typename C::value_type; explicit SimpleJetConstituentTableProducer(const edm::ParameterSet &); ~SimpleJetConstituentTableProducer() override; - ConstituentValueType const initptr(edm::Ptr const&) const; + ConstituentValueType const initptr(edm::Ptr const &) const; static void fillDescriptions(edm::ConfigurationDescriptions &descriptions); private: @@ -47,7 +46,7 @@ class SimpleJetConstituentTableProducer : public edm::stream::EDProducer<> { // constructors and destructor // template -SimpleJetConstituentTableProducer::SimpleJetConstituentTableProducer(const edm::ParameterSet &iConfig) +SimpleJetConstituentTableProducer::SimpleJetConstituentTableProducer(const edm::ParameterSet &iConfig) : name_(iConfig.getParameter("name")), candIdxName_(iConfig.getParameter("candIdxName")), candIdxDoc_(iConfig.getParameter("candIdxDoc")), @@ -60,10 +59,10 @@ SimpleJetConstituentTableProducer::SimpleJetConstituentTableProducer(const } template -SimpleJetConstituentTableProducer::~SimpleJetConstituentTableProducer() {} +SimpleJetConstituentTableProducer::~SimpleJetConstituentTableProducer() {} template -void SimpleJetConstituentTableProducer::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) { +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(); @@ -91,7 +90,6 @@ void SimpleJetConstituentTableProducer::produce(edm::Event &iEvent, const e // Loop over jet constituents std::vector const &daughters = jet.daughterPtrVector(); for (const auto &dauPtr : daughters) { - // Apply cut on jet constituent typename C::value_type cand = initptr(dauPtr); if (!jetConstCut_(cand)) @@ -127,20 +125,22 @@ void SimpleJetConstituentTableProducer::produce(edm::Event &iEvent, const e template <> edm::Ptr const -SimpleJetConstituentTableProducer>>::initptr(edm::Ptr const& dau) const { +SimpleJetConstituentTableProducer>>::initptr( + edm::Ptr const &dau) const { edm::Ptr retval(dau); return retval; } template <> edm::Ptr const -SimpleJetConstituentTableProducer>>::initptr(edm::Ptr const& dau) const { +SimpleJetConstituentTableProducer>>::initptr( + edm::Ptr const &dau) const { edm::Ptr retval(dau); return retval; } template -void SimpleJetConstituentTableProducer::fillDescriptions(edm::ConfigurationDescriptions &descriptions) { +void SimpleJetConstituentTableProducer::fillDescriptions(edm::ConfigurationDescriptions &descriptions) { edm::ParameterSetDescription desc; desc.add("name", "FatJetPFCand"); desc.add("candIdxName", "PFCandIdx"); @@ -152,8 +152,10 @@ void SimpleJetConstituentTableProducer::fillDescriptions(edm::Configuration descriptions.addWithDefaultLabel(desc); } -typedef SimpleJetConstituentTableProducer>> SimplePatJetConstituentTableProducer; -typedef SimpleJetConstituentTableProducer>> SimpleGenJetConstituentTableProducer; +typedef SimpleJetConstituentTableProducer>> + SimplePatJetConstituentTableProducer; +typedef SimpleJetConstituentTableProducer>> + SimpleGenJetConstituentTableProducer; DEFINE_FWK_MODULE(SimplePatJetConstituentTableProducer); DEFINE_FWK_MODULE(SimpleGenJetConstituentTableProducer); \ No newline at end of file diff --git a/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc b/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc index 6c75e01dee5c7..650c88cb1de5f 100644 --- a/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc +++ b/PhysicsTools/PatAlgos/plugins/PATObjectSelector.cc @@ -256,16 +256,14 @@ namespace pat { > PATPackedCandidateSelector; - typedef SingleObjectSelector< - std::vector>, - StringCutObjectSelector, true>, - std::vector>> + typedef SingleObjectSelector>, + StringCutObjectSelector, true>, + std::vector>> PATPackedCandidatePtrSelector; - typedef SingleObjectSelector< - std::vector>, - StringCutObjectSelector, true>, - std::vector>> + typedef SingleObjectSelector>, + StringCutObjectSelector, true>, + std::vector>> PATPackedGenParticlePtrSelector; typedef SingleObjectSelector, From 8ef461deccdc7dec40b06c88496244140fd61767 Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Fri, 31 Jan 2025 21:33:58 +0100 Subject: [PATCH 6/6] Fix wrong configurations --- .../NanoAOD/python/jetConstituents_cff.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/jetConstituents_cff.py b/PhysicsTools/NanoAOD/python/jetConstituents_cff.py index 859f0e92647f4..4a2980a1b88ff 100644 --- a/PhysicsTools/NanoAOD/python/jetConstituents_cff.py +++ b/PhysicsTools/NanoAOD/python/jetConstituents_cff.py @@ -120,11 +120,11 @@ def SaveGenJetConstituents(process, addGenJetConst, addGenJetAK8Const, genJetCon process.selectedGenJetAK8Constituents = cms.EDFilter("PATPackedGenParticlePtrSelector", src = cms.InputTag("genJetAK8Constituents", "constituents"), - cut = cms.string(genJetConstCut) + cut = cms.string(genJetAK8ConstCut) ) process.genjetConstituentsTask.add(process.selectedGenJetAK8Constituents) - if addGenJetConst or addGenJetConst: + if addGenJetConst or addGenJetAK8Const: process.finalGenPartCandidates = cms.EDProducer("PackedGenParticlePtrMerger", src = cms.VInputTag(), skipNulls = cms.bool(True), @@ -155,7 +155,7 @@ def SaveGenJetConstituents(process, addGenJetConst, addGenJetAK8Const, genJetCon name = cms.string(process.genJetTable.name.value()+"GenPartCand"), candIdxName = cms.string("genPartCandIdx"), candIdxDoc = cms.string("Index in the GenPartCand table"), - candidates = pfCandidatesTable.src, + candidates = process.genPartCandidatesTable.src, jets = process.genJetTable.src, jetCut = process.genJetTable.cut, jetConstCut = process.selectedGenJetConstituents.cut @@ -170,10 +170,10 @@ def SaveGenJetConstituents(process, addGenJetConst, addGenJetAK8Const, genJetCon name = cms.string(process.genJetAK8Table.name.value()+"GenPartCand"), candIdxName = cms.string("genPartCandIdx"), candIdxDoc = cms.string("Index in the GenPartCand table"), - candidates = pfCandidatesTable.src, + candidates = process.genPartCandidatesTable.src, jets = process.genJetAK8Table.src, jetCut = process.genJetAK8Table.cut, - jetConstCut = process.selectedGenJetConstituents.cut + jetConstCut = process.selectedGenJetAK8Constituents.cut ) process.genjetConstituentsTableTask.add(process.genJetAK8ConstituentsTable) @@ -183,12 +183,12 @@ def SaveGenJetConstituents(process, addGenJetConst, addGenJetAK8Const, genJetCon return process def SaveGenJetAK4Constituents(process): - process = SaveGenJetConstituents(process,True,False) + process = SaveGenJetConstituents(process,addGenJetConst=True,addGenJetAK8Const=False) return process def SaveGenJetAK8Constituents(process): - process = SaveGenJetConstituents(process,True,False) + process = SaveGenJetConstituents(process,addGenJetConst=False,addGenJetAK8Const=True) return process def SaveGenJetAK4AK8Constituents(process): - process = SaveGenJetConstituents(process,True,True) + process = SaveGenJetConstituents(process,addGenJetConst=True,addGenJetAK8Const=True) return process