From 1b1b4dc4249b0ce91a2b53bca0f1586677bc7e62 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Tue, 5 Oct 2021 12:58:53 +0200 Subject: [PATCH 01/22] Added GEN-level proton table producer --- .../NanoAOD/plugins/GenProtonTableProducer.cc | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc diff --git a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc new file mode 100644 index 0000000000000..d325d627a0bd2 --- /dev/null +++ b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc @@ -0,0 +1,87 @@ +/**************************************************************************** + * + * This is a part of PPS offline software. + * Authors: + * Laurent Forthomme + * Michael Pitt + * + ****************************************************************************/ + +#include + +#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 "CommonTools/Utils/interface/StringCutObjectSelector.h" + +#include "DataFormats/HepMCCandidate/interface/GenParticle.h" +#include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h" + +#include "DataFormats/NanoAOD/interface/FlatTable.h" + +class GenProtonTableProducer : public edm::stream::EDProducer<> { +public: + explicit GenProtonTableProducer(const edm::ParameterSet&); + ~GenProtonTableProducer() override = default; + +private: + void produce(edm::Event&, const edm::EventSetup&) override; + + const edm::EDGetTokenT prunedCandsToken_; + const edm::EDGetTokenT puCandsToken_; + const StringCutObjectSelector protonsCut_; + const std::string table_name_; + const double tolerance_; +}; + +GenProtonTableProducer::GenProtonTableProducer(const edm::ParameterSet& iConfig) + : prunedCandsToken_(consumes(iConfig.getParameter("srcPruned"))), + puCandsToken_(consumes(iConfig.getParameter("srcPUProtons"))), + protonsCut_(iConfig.getParameter("cut")), + table_name_(iConfig.getParameter("name")), + tolerance_(iConfig.getParameter("tolerance")) {} + +void GenProtonTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&) { + // define the variables + std::vector pts, pzs, vzs; + std::vector isPUs; + // first loop over signal protons + for (const auto& pruned_cand : iEvent.get(prunedCandsToken_)) { + if (!protonsCut_(pruned_cand)) + continue; + pts.emplace_back(pruned_cand.pt()); + pzs.emplace_back(pruned_cand.pz()); + vzs.emplace_back(pruned_cand.vz()); + isPUs.emplace_back(false); + } + // then loop over pruned candidates ; if already in signal protons, discard + for (const auto& pu_cand : iEvent.get(puCandsToken_)) { + if (!protonsCut_(pu_cand)) + continue; + bool associated{false}; + for (size_t i = 0; i < pts.size(); ++i) { + if (fabs(1. - pts.at(i) / pu_cand.pt()) < tolerance_ && fabs(1. - pzs.at(i) / pu_cand.pz()) < tolerance_) { + associated = true; + break; + } + } + if (associated) + continue; + pts.emplace_back(pu_cand.pt()); + pzs.emplace_back(pu_cand.pz()); + vzs.emplace_back(pu_cand.vz()); + isPUs.emplace_back(true); + } + + auto protons_table = std::make_unique(isPUs.size(), table_name_, false); + protons_table->addColumn("pt", pts, "proton transverse momentum", nanoaod::FlatTable::FloatColumn, 10); + protons_table->addColumn("pz", pzs, "proton longitudinal momentum", nanoaod::FlatTable::FloatColumn, 10); + protons_table->addColumn( + "vz", vzs, "proton vertex longitudinal coordinate", nanoaod::FlatTable::FloatColumn, 10); + protons_table->addColumn("isPU", isPUs, "pileup proton?", nanoaod::FlatTable::IntColumn, 10); + iEvent.put(std::move(protons_table)); +} From 9d1f397543789a7dd41f81a2ce1178ae69b2ef57 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Tue, 5 Oct 2021 13:26:13 +0200 Subject: [PATCH 02/22] Added the fillDescriptions member to our new EDProducer --- .../NanoAOD/plugins/GenProtonTableProducer.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc index d325d627a0bd2..2f7e84369f57a 100644 --- a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc @@ -28,6 +28,8 @@ class GenProtonTableProducer : public edm::stream::EDProducer<> { explicit GenProtonTableProducer(const edm::ParameterSet&); ~GenProtonTableProducer() override = default; + static void fillDescriptions(edm::ConfigurationDescriptions&); + private: void produce(edm::Event&, const edm::EventSetup&) override; @@ -85,3 +87,17 @@ void GenProtonTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&) protons_table->addColumn("isPU", isPUs, "pileup proton?", nanoaod::FlatTable::IntColumn, 10); iEvent.put(std::move(protons_table)); } + +void GenProtonTableProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("srcPruned", edm::InputTag()) + ->setComment("input source for pruned gen-level particle candidates"); + desc.add("srcPUProtons", edm::InputTag())->setComment("input source for pileup protons collection"); + desc.add("cut", "")->setComment("proton kinematic selection"); + desc.add("name", "GenProtons")->setComment("flat table name"); + desc.add("tolerance", 1.e-3) + ->setComment("relative difference between the signal and pileup protons pt and pz"); + descriptions.add("genProtonTable", desc); +} + +DEFINE_FWK_MODULE(GenProtonTableProducer); From c5d40ad4a66c64dea27bee87e2d44bbf50486825 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Tue, 5 Oct 2021 13:26:39 +0200 Subject: [PATCH 03/22] Added the genProtonTable collection to proton nanoAOD routine --- PhysicsTools/NanoAOD/python/protons_cff.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/protons_cff.py b/PhysicsTools/NanoAOD/python/protons_cff.py index fd7d8851308e0..847d96e7f7f3a 100644 --- a/PhysicsTools/NanoAOD/python/protons_cff.py +++ b/PhysicsTools/NanoAOD/python/protons_cff.py @@ -1,5 +1,6 @@ import FWCore.ParameterSet.Config as cms from PhysicsTools.NanoAOD.common_cff import * +from PhysicsTools.NanoAOD.genProtonTable_cfi import genProtonTable as _genproton from PhysicsTools.NanoAOD.nano_eras_cff import * from RecoPPS.ProtonReconstruction.ppsFilteredProtonProducer_cfi import * @@ -19,6 +20,12 @@ protonTable.tagRecoProtonsSingle = cms.InputTag("filteredProtons" if singleRPProtons else "ctppsProtons","singleRP") +genProtonTable = _genproton.clone( + srcPruned = cms.InputTag('prunedGenParticles'), + srcPUProtons = cms.InputTag('genPUProtons'), #FIXME could have an extra 'genPUProtons' collection name for some samples + cut = cms.string('(pdgId == 2212) && (abs(pz) > 5200) && (abs(pz) < 6467.5)'), # xi in [0.015, 0.2] +) + multiRPTable = cms.EDProducer("SimpleProtonTrackFlatTableProducer", src = cms.InputTag("filteredProtons","multiRP"), cut = cms.string(""), @@ -53,11 +60,11 @@ thetaY = Var("thetaY",float,doc="th y",precision=10), ), externalVariables = cms.PSet( - decRPId = ExtVar("protonTable:protonRPId",int,doc="Detector ID",precision=8), + decRPId = ExtVar("protonTable:protonRPId",int,doc="Detector ID",precision=8), ), ) -protonTablesTask = cms.Task(filteredProtons,protonTable,multiRPTable) +protonTablesTask = cms.Task(filteredProtons, genProtonTable, protonTable, multiRPTable) if singleRPProtons: protonTablesTask.add(singleRPTable) for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_94X2016, run2_nanoAOD_102Xv1: From 76cc8bca07f36a0b7f2b28f48e41e3f1255562e4 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Tue, 5 Oct 2021 13:50:46 +0200 Subject: [PATCH 04/22] Added gen-level proton table producer for full sim --- PhysicsTools/NanoAOD/python/nano_cff.py | 12 ++++++------ PhysicsTools/NanoAOD/python/protons_cff.py | 4 +++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/nano_cff.py b/PhysicsTools/NanoAOD/python/nano_cff.py index 23de15d98e814..de47fa7230463 100644 --- a/PhysicsTools/NanoAOD/python/nano_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_cff.py @@ -82,7 +82,7 @@ nanoTableTaskFS = cms.Task(genParticleTask, particleLevelTask, jetMCTask, muonMCTask, electronMCTask, lowPtElectronMCTask, photonMCTask, tauMCTask, boostedTauMCTask, metMCTable, ttbarCatMCProducersTask, globalTablesMCTask, cms.Task(btagWeightTable), ttbarCategoryTableTask, - genWeightsTableTask, genVertexTablesTask, genParticleTablesTask, particleLevelTablesTask) + genWeightsTableTask, genVertexTablesTask, genParticleTablesTask, genProtonTablesTask, particleLevelTablesTask) nanoSequenceFS = cms.Sequence(nanoSequenceCommon + cms.Sequence(nanoTableTaskFS)) @@ -105,7 +105,7 @@ def nanoAOD_addTauIds(process): def nanoAOD_addBoostedTauIds(process): updatedBoostedTauName = "slimmedTausBoostedNewID" - boostedTauIdEmbedder = tauIdConfig.TauIDEmbedder(process, debug=False, + boostedTauIdEmbedder = tauIdConfig.TauIDEmbedder(process, debug=False, originalTauName = "slimmedTausBoosted", updatedTauName = updatedBoostedTauName, postfix="Boosted", @@ -118,7 +118,7 @@ def nanoAOD_addBoostedTauIds(process): process.boostedTauTask = _boostedTauTask.copy() return process - + from PhysicsTools.PatAlgos.tools.jetTools import updateJetCollection def nanoAOD_addDeepInfo(process,addDeepBTag,addDeepFlavour): @@ -202,7 +202,7 @@ def nanoAOD_recalibrateMETs(process,isData): process.patJetsPuppi.addGenJetMatch = cms.bool(False) print("nanoAOD_PuppiV15_switch.reclusterJets is true") - + runMetCorAndUncFromMiniAOD(process,isData=isData,metType="Puppi",postfix="Puppi",jetFlavor="AK4PFPuppi", recoMetFromPFCs=bool(nanoAOD_PuppiV15_switch.recoMetFromPFCs), reclusterJets=bool(nanoAOD_PuppiV15_switch.reclusterJets)) process.nanoSequenceCommon.insert(2,cms.Sequence(process.puppiMETSequence+process.fullPatMetSequencePuppi)) @@ -393,10 +393,10 @@ def nanoAOD_customizeMC(process): modifier.toModify(process, lambda p: nanoAOD_runMETfixEE2017(p,isData=False)) return process -###increasing the precision of selected GenParticles. +###increasing the precision of selected GenParticles. def nanoWmassGenCustomize(process): pdgSelection="?(abs(pdgId) == 11|| abs(pdgId)==13 || abs(pdgId)==15 ||abs(pdgId)== 12 || abs(pdgId)== 14 || abs(pdgId)== 16|| abs(pdgId)== 24|| pdgId== 23)" - # Keep precision same as default RECO for selected particles + # Keep precision same as default RECO for selected particles ptPrecision="{}?{}:{}".format(pdgSelection, CandVars.pt.precision.value(),genParticleTable.variables.pt.precision.value()) process.genParticleTable.variables.pt.precision=cms.string(ptPrecision) phiPrecision="{} ? {} : {}".format(pdgSelection, CandVars.phi.precision.value(), genParticleTable.variables.phi.precision.value()) diff --git a/PhysicsTools/NanoAOD/python/protons_cff.py b/PhysicsTools/NanoAOD/python/protons_cff.py index 847d96e7f7f3a..0b7b437388551 100644 --- a/PhysicsTools/NanoAOD/python/protons_cff.py +++ b/PhysicsTools/NanoAOD/python/protons_cff.py @@ -64,8 +64,10 @@ ), ) -protonTablesTask = cms.Task(filteredProtons, genProtonTable, protonTable, multiRPTable) +protonTablesTask = cms.Task(filteredProtons, genProtonTable, multiRPTable) if singleRPProtons: protonTablesTask.add(singleRPTable) +genProtonTablesTask = cms.Task(genProtonTable) + for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_94X2016, run2_nanoAOD_102Xv1: modifier.toReplaceWith(protonTablesTask, cms.Task()) From 212ccbf9aeea61ac80de2ea957cdca408f65d53d Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Tue, 5 Oct 2021 14:47:42 +0200 Subject: [PATCH 05/22] Set collection produced by proton flat table producer, renamed object prefix --- PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc | 6 ++++-- PhysicsTools/NanoAOD/python/protons_cff.py | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc index 2f7e84369f57a..c9498da4d6cd8 100644 --- a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc @@ -45,7 +45,9 @@ GenProtonTableProducer::GenProtonTableProducer(const edm::ParameterSet& iConfig) puCandsToken_(consumes(iConfig.getParameter("srcPUProtons"))), protonsCut_(iConfig.getParameter("cut")), table_name_(iConfig.getParameter("name")), - tolerance_(iConfig.getParameter("tolerance")) {} + tolerance_(iConfig.getParameter("tolerance")) { + produces(); +} void GenProtonTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&) { // define the variables @@ -94,7 +96,7 @@ void GenProtonTableProducer::fillDescriptions(edm::ConfigurationDescriptions& de ->setComment("input source for pruned gen-level particle candidates"); desc.add("srcPUProtons", edm::InputTag())->setComment("input source for pileup protons collection"); desc.add("cut", "")->setComment("proton kinematic selection"); - desc.add("name", "GenProtons")->setComment("flat table name"); + desc.add("name", "GenProton")->setComment("flat table name"); desc.add("tolerance", 1.e-3) ->setComment("relative difference between the signal and pileup protons pt and pz"); descriptions.add("genProtonTable", desc); diff --git a/PhysicsTools/NanoAOD/python/protons_cff.py b/PhysicsTools/NanoAOD/python/protons_cff.py index 0b7b437388551..e40872540a238 100644 --- a/PhysicsTools/NanoAOD/python/protons_cff.py +++ b/PhysicsTools/NanoAOD/python/protons_cff.py @@ -22,7 +22,8 @@ genProtonTable = _genproton.clone( srcPruned = cms.InputTag('prunedGenParticles'), - srcPUProtons = cms.InputTag('genPUProtons'), #FIXME could have an extra 'genPUProtons' collection name for some samples + #srcPUProtons = cms.InputTag('genPUProtons'), #FIXME could have an extra 'genPUProtons' collection name for some samples + srcPUProtons = cms.InputTag('genPUProtons', 'genPUProtons'), cut = cms.string('(pdgId == 2212) && (abs(pz) > 5200) && (abs(pz) < 6467.5)'), # xi in [0.015, 0.2] ) From dd9a44d783cf57dd754965b30d3543435b6bbf39 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Fri, 29 Oct 2021 00:38:58 +0200 Subject: [PATCH 06/22] Added default values for input collection tags --- PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc | 5 +++-- PhysicsTools/NanoAOD/python/protons_cff.py | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc index c9498da4d6cd8..d2b233ada20a1 100644 --- a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc @@ -92,9 +92,10 @@ void GenProtonTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&) void GenProtonTableProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; - desc.add("srcPruned", edm::InputTag()) + desc.add("srcPruned", edm::InputTag("prunedGenParticles")) ->setComment("input source for pruned gen-level particle candidates"); - desc.add("srcPUProtons", edm::InputTag())->setComment("input source for pileup protons collection"); + desc.add("srcPUProtons", edm::InputTag("genPUProtons")) + ->setComment("input source for pileup protons collection"); desc.add("cut", "")->setComment("proton kinematic selection"); desc.add("name", "GenProton")->setComment("flat table name"); desc.add("tolerance", 1.e-3) diff --git a/PhysicsTools/NanoAOD/python/protons_cff.py b/PhysicsTools/NanoAOD/python/protons_cff.py index e40872540a238..f39b0c12c0c38 100644 --- a/PhysicsTools/NanoAOD/python/protons_cff.py +++ b/PhysicsTools/NanoAOD/python/protons_cff.py @@ -21,9 +21,8 @@ genProtonTable = _genproton.clone( - srcPruned = cms.InputTag('prunedGenParticles'), - #srcPUProtons = cms.InputTag('genPUProtons'), #FIXME could have an extra 'genPUProtons' collection name for some samples srcPUProtons = cms.InputTag('genPUProtons', 'genPUProtons'), + # PU protons source could have an extra 'genPUProtons' collection name for some samples cut = cms.string('(pdgId == 2212) && (abs(pz) > 5200) && (abs(pz) < 6467.5)'), # xi in [0.015, 0.2] ) From c15df844d4a657c5dbbe5c812094db2bc8a11aa3 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Tue, 9 Nov 2021 17:00:52 +0100 Subject: [PATCH 07/22] Cleanup of proton tables task --- PhysicsTools/NanoAOD/python/protons_cff.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PhysicsTools/NanoAOD/python/protons_cff.py b/PhysicsTools/NanoAOD/python/protons_cff.py index f39b0c12c0c38..5edccda1e1f2c 100644 --- a/PhysicsTools/NanoAOD/python/protons_cff.py +++ b/PhysicsTools/NanoAOD/python/protons_cff.py @@ -64,7 +64,7 @@ ), ) -protonTablesTask = cms.Task(filteredProtons, genProtonTable, multiRPTable) +protonTablesTask = cms.Task(filteredProtons,protonTable,multiRPTable) if singleRPProtons: protonTablesTask.add(singleRPTable) genProtonTablesTask = cms.Task(genProtonTable) From 13ce68dc4fd0395d7f2df87675ade275d41474de Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Tue, 9 Nov 2021 17:05:05 +0100 Subject: [PATCH 08/22] Adapting to column addition method signature in 12_2_X --- PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc index d2b233ada20a1..88ca4b51f4966 100644 --- a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc @@ -82,11 +82,10 @@ void GenProtonTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&) } auto protons_table = std::make_unique(isPUs.size(), table_name_, false); - protons_table->addColumn("pt", pts, "proton transverse momentum", nanoaod::FlatTable::FloatColumn, 10); - protons_table->addColumn("pz", pzs, "proton longitudinal momentum", nanoaod::FlatTable::FloatColumn, 10); - protons_table->addColumn( - "vz", vzs, "proton vertex longitudinal coordinate", nanoaod::FlatTable::FloatColumn, 10); - protons_table->addColumn("isPU", isPUs, "pileup proton?", nanoaod::FlatTable::IntColumn, 10); + protons_table->addColumn("pt", pts, "proton transverse momentum"); + protons_table->addColumn("pz", pzs, "proton longitudinal momentum"); + protons_table->addColumn("vz", vzs, "proton vertex longitudinal coordinate"); + protons_table->addColumn("isPU", isPUs, "pileup proton?"); iEvent.put(std::move(protons_table)); } From ca50b4218dcf89770721e208bd107e502d3f03a8 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Wed, 10 Nov 2021 19:55:36 +0100 Subject: [PATCH 09/22] Storing isPU attribute as boolean column --- PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc index 88ca4b51f4966..46fe962b4d8f1 100644 --- a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc @@ -52,7 +52,7 @@ GenProtonTableProducer::GenProtonTableProducer(const edm::ParameterSet& iConfig) void GenProtonTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&) { // define the variables std::vector pts, pzs, vzs; - std::vector isPUs; + std::vector isPUs; // first loop over signal protons for (const auto& pruned_cand : iEvent.get(prunedCandsToken_)) { if (!protonsCut_(pruned_cand)) @@ -85,7 +85,7 @@ void GenProtonTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&) protons_table->addColumn("pt", pts, "proton transverse momentum"); protons_table->addColumn("pz", pzs, "proton longitudinal momentum"); protons_table->addColumn("vz", vzs, "proton vertex longitudinal coordinate"); - protons_table->addColumn("isPU", isPUs, "pileup proton?"); + protons_table->addColumn("isPU", isPUs, "pileup proton?"); iEvent.put(std::move(protons_table)); } From 9590c54e626d57c777f1b301e9222623672d5740 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Wed, 10 Nov 2021 19:56:03 +0100 Subject: [PATCH 10/22] Reverting genPUProtons input tag to its "factory setting" --- PhysicsTools/NanoAOD/python/protons_cff.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/protons_cff.py b/PhysicsTools/NanoAOD/python/protons_cff.py index 5edccda1e1f2c..48aa20bc33187 100644 --- a/PhysicsTools/NanoAOD/python/protons_cff.py +++ b/PhysicsTools/NanoAOD/python/protons_cff.py @@ -21,9 +21,9 @@ genProtonTable = _genproton.clone( - srcPUProtons = cms.InputTag('genPUProtons', 'genPUProtons'), - # PU protons source could have an extra 'genPUProtons' collection name for some samples cut = cms.string('(pdgId == 2212) && (abs(pz) > 5200) && (abs(pz) < 6467.5)'), # xi in [0.015, 0.2] + # PU protons source could have an extra 'genPUProtons' collection name for some samples + # srcPUProtons = cms.InputTag('genPUProtons', 'genPUProtons'), ) multiRPTable = cms.EDProducer("SimpleProtonTrackFlatTableProducer", From f10e569b8fcaacb5a9e598d0e3acd382f75da270 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Wed, 10 Nov 2021 20:00:27 +0100 Subject: [PATCH 11/22] Added docstring to GEN proton table --- PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc index 46fe962b4d8f1..cbeb5549a0d2e 100644 --- a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc @@ -97,6 +97,8 @@ void GenProtonTableProducer::fillDescriptions(edm::ConfigurationDescriptions& de ->setComment("input source for pileup protons collection"); desc.add("cut", "")->setComment("proton kinematic selection"); desc.add("name", "GenProton")->setComment("flat table name"); + desc.add("doc", "generator level information on (signal+PU) protons") + ->setComment("flat table description"); desc.add("tolerance", 1.e-3) ->setComment("relative difference between the signal and pileup protons pt and pz"); descriptions.add("genProtonTable", desc); From c9f09eb3bf718b127b5d038867d0923e9682d360 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Thu, 11 Nov 2021 10:46:54 +0100 Subject: [PATCH 12/22] Disabling genProtons table building for 80X UL samples --- PhysicsTools/NanoAOD/python/protons_cff.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/protons_cff.py b/PhysicsTools/NanoAOD/python/protons_cff.py index 48aa20bc33187..af518757dbdd9 100644 --- a/PhysicsTools/NanoAOD/python/protons_cff.py +++ b/PhysicsTools/NanoAOD/python/protons_cff.py @@ -67,7 +67,11 @@ protonTablesTask = cms.Task(filteredProtons,protonTable,multiRPTable) if singleRPProtons: protonTablesTask.add(singleRPTable) -genProtonTablesTask = cms.Task(genProtonTable) - for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_94X2016, run2_nanoAOD_102Xv1: modifier.toReplaceWith(protonTablesTask, cms.Task()) + +# GEN-level signal/PU protons collection +genProtonTablesTask = cms.Task(genProtonTable) + +# input GEN-level PU protons collection introduced in 9_4_X cycle +run2_miniAOD_80XLegacy.toReplaceWith(genProtonTablesTask, cms.Task()) From ba920e1a593d445d8daf9009f32ee6256e762541 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Wed, 17 Nov 2021 08:52:35 +0100 Subject: [PATCH 13/22] Storing protons px and py instead of pt --- .../NanoAOD/plugins/GenProtonTableProducer.cc | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc index cbeb5549a0d2e..1fe40def31f9f 100644 --- a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc @@ -51,13 +51,14 @@ GenProtonTableProducer::GenProtonTableProducer(const edm::ParameterSet& iConfig) void GenProtonTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&) { // define the variables - std::vector pts, pzs, vzs; + std::vector pxs, pys, pzs, vzs; std::vector isPUs; // first loop over signal protons for (const auto& pruned_cand : iEvent.get(prunedCandsToken_)) { if (!protonsCut_(pruned_cand)) continue; - pts.emplace_back(pruned_cand.pt()); + pxs.emplace_back(pruned_cand.px()); + pys.emplace_back(pruned_cand.py()); pzs.emplace_back(pruned_cand.pz()); vzs.emplace_back(pruned_cand.vz()); isPUs.emplace_back(false); @@ -67,22 +68,25 @@ void GenProtonTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&) if (!protonsCut_(pu_cand)) continue; bool associated{false}; - for (size_t i = 0; i < pts.size(); ++i) { - if (fabs(1. - pts.at(i) / pu_cand.pt()) < tolerance_ && fabs(1. - pzs.at(i) / pu_cand.pz()) < tolerance_) { + for (size_t i = 0; i < pzs.size(); ++i) { + if (fabs(1. - pxs.at(i) / pu_cand.px()) < tolerance_ && fabs(1. - pys.at(i) / pu_cand.py()) < tolerance_ && + fabs(1. - pzs.at(i) / pu_cand.pz()) < tolerance_) { associated = true; break; } } if (associated) continue; - pts.emplace_back(pu_cand.pt()); + pxs.emplace_back(pu_cand.px()); + pys.emplace_back(pu_cand.py()); pzs.emplace_back(pu_cand.pz()); vzs.emplace_back(pu_cand.vz()); isPUs.emplace_back(true); } auto protons_table = std::make_unique(isPUs.size(), table_name_, false); - protons_table->addColumn("pt", pts, "proton transverse momentum"); + protons_table->addColumn("px", pxs, "proton horizontal momentum"); + protons_table->addColumn("py", pys, "proton vertical momentum"); protons_table->addColumn("pz", pzs, "proton longitudinal momentum"); protons_table->addColumn("vz", vzs, "proton vertex longitudinal coordinate"); protons_table->addColumn("isPU", isPUs, "pileup proton?"); From 1b321e968c45722af42167257eb8beaa23ba5854 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Wed, 17 Nov 2021 08:53:24 +0100 Subject: [PATCH 14/22] Updated ConfigurationDescription --- PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc index 1fe40def31f9f..11aceaf46e129 100644 --- a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc @@ -103,8 +103,7 @@ void GenProtonTableProducer::fillDescriptions(edm::ConfigurationDescriptions& de desc.add("name", "GenProton")->setComment("flat table name"); desc.add("doc", "generator level information on (signal+PU) protons") ->setComment("flat table description"); - desc.add("tolerance", 1.e-3) - ->setComment("relative difference between the signal and pileup protons pt and pz"); + desc.add("tolerance", 1.e-3)->setComment("relative difference between the signal and pileup protons momenta"); descriptions.add("genProtonTable", desc); } From 9b6310c5d595595ef8683c2165b46d64abb9b5e2 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Mon, 22 Nov 2021 17:18:22 +0100 Subject: [PATCH 15/22] Modified PU protons source for 94X-produced MiniAOD samples --- PhysicsTools/NanoAOD/python/protons_cff.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/protons_cff.py b/PhysicsTools/NanoAOD/python/protons_cff.py index af518757dbdd9..2a82cfcf59cb7 100644 --- a/PhysicsTools/NanoAOD/python/protons_cff.py +++ b/PhysicsTools/NanoAOD/python/protons_cff.py @@ -20,12 +20,6 @@ protonTable.tagRecoProtonsSingle = cms.InputTag("filteredProtons" if singleRPProtons else "ctppsProtons","singleRP") -genProtonTable = _genproton.clone( - cut = cms.string('(pdgId == 2212) && (abs(pz) > 5200) && (abs(pz) < 6467.5)'), # xi in [0.015, 0.2] - # PU protons source could have an extra 'genPUProtons' collection name for some samples - # srcPUProtons = cms.InputTag('genPUProtons', 'genPUProtons'), -) - multiRPTable = cms.EDProducer("SimpleProtonTrackFlatTableProducer", src = cms.InputTag("filteredProtons","multiRP"), cut = cms.string(""), @@ -71,7 +65,16 @@ modifier.toReplaceWith(protonTablesTask, cms.Task()) # GEN-level signal/PU protons collection +genProtonTable = _genproton.clone( + cut = cms.string('(pdgId == 2212) && (abs(pz) > 5200) && (abs(pz) < 6467.5)') # xi in [0.015, 0.2] +) + genProtonTablesTask = cms.Task(genProtonTable) # input GEN-level PU protons collection introduced in 9_4_X cycle run2_miniAOD_80XLegacy.toReplaceWith(genProtonTablesTask, cms.Task()) +# re-MiniAODv2 appears to have this extra label +(run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2).toModify(genProtonTable, + # PU protons source could have an extra 'genPUProtons' collection name for some samples + srcPUProtons = cms.InputTag('genPUProtons', 'genPUProtons') +) From 689b6ac385ec0dcee7ab3b53a291d745afba0c38 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Wed, 24 Nov 2021 11:29:03 +0100 Subject: [PATCH 16/22] 94XMiniAODv1 does not seem to have the extra collection name in its InputTag --- PhysicsTools/NanoAOD/python/protons_cff.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/protons_cff.py b/PhysicsTools/NanoAOD/python/protons_cff.py index 2a82cfcf59cb7..4aa0b87d55ea0 100644 --- a/PhysicsTools/NanoAOD/python/protons_cff.py +++ b/PhysicsTools/NanoAOD/python/protons_cff.py @@ -73,8 +73,7 @@ # input GEN-level PU protons collection introduced in 9_4_X cycle run2_miniAOD_80XLegacy.toReplaceWith(genProtonTablesTask, cms.Task()) -# re-MiniAODv2 appears to have this extra label -(run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2).toModify(genProtonTable, - # PU protons source could have an extra 'genPUProtons' collection name for some samples +# PU protons tag could have an extra 'genPUProtons' collection name for some eras +run2_nanoAOD_94XMiniAODv2.toModify(genProtonTable, srcPUProtons = cms.InputTag('genPUProtons', 'genPUProtons') ) From 40ba4b917a35a6dfd5d6a031f435cc8e4ed4b016 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Sat, 27 Nov 2021 18:12:40 +0100 Subject: [PATCH 17/22] Disabling gen protons table for CMSSW_9_4_X samples --- PhysicsTools/NanoAOD/python/protons_cff.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/protons_cff.py b/PhysicsTools/NanoAOD/python/protons_cff.py index 4aa0b87d55ea0..c83daf83b3bdb 100644 --- a/PhysicsTools/NanoAOD/python/protons_cff.py +++ b/PhysicsTools/NanoAOD/python/protons_cff.py @@ -71,9 +71,5 @@ genProtonTablesTask = cms.Task(genProtonTable) -# input GEN-level PU protons collection introduced in 9_4_X cycle -run2_miniAOD_80XLegacy.toReplaceWith(genProtonTablesTask, cms.Task()) -# PU protons tag could have an extra 'genPUProtons' collection name for some eras -run2_nanoAOD_94XMiniAODv2.toModify(genProtonTable, - srcPUProtons = cms.InputTag('genPUProtons', 'genPUProtons') -) +# input GEN-level PU protons collection introduced after 9_4_X cycle +(run2_miniAOD_80XLegacy | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2).toReplaceWith(genProtonTablesTask, cms.Task()) From 24627423428c89cef5a0131a9ec8f1ac644c2fe2 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Mon, 29 Nov 2021 13:56:21 +0100 Subject: [PATCH 18/22] Using same modifier as standard proton nanoAOD part --- PhysicsTools/NanoAOD/python/protons_cff.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/protons_cff.py b/PhysicsTools/NanoAOD/python/protons_cff.py index c83daf83b3bdb..9919bf026ed76 100644 --- a/PhysicsTools/NanoAOD/python/protons_cff.py +++ b/PhysicsTools/NanoAOD/python/protons_cff.py @@ -61,9 +61,6 @@ protonTablesTask = cms.Task(filteredProtons,protonTable,multiRPTable) if singleRPProtons: protonTablesTask.add(singleRPTable) -for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_94X2016, run2_nanoAOD_102Xv1: - modifier.toReplaceWith(protonTablesTask, cms.Task()) - # GEN-level signal/PU protons collection genProtonTable = _genproton.clone( cut = cms.string('(pdgId == 2212) && (abs(pz) > 5200) && (abs(pz) < 6467.5)') # xi in [0.015, 0.2] @@ -71,5 +68,7 @@ genProtonTablesTask = cms.Task(genProtonTable) -# input GEN-level PU protons collection introduced after 9_4_X cycle -(run2_miniAOD_80XLegacy | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2).toReplaceWith(genProtonTablesTask, cms.Task()) +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_94X2016, run2_nanoAOD_102Xv1: + modifier.toReplaceWith(protonTablesTask, cms.Task()) + # input GEN-level PU protons collection only introduced for UL and 12_X_Y + modifier.toReplaceWith(genProtonTablesTask, cms.Task()) From 1c06bbe4051b6315513fe4050c701e190c1ed4c4 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Mon, 10 Jan 2022 09:32:41 +0100 Subject: [PATCH 19/22] Added an alternative source for PU protons with premixing --- PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc index 11aceaf46e129..98826acd927f5 100644 --- a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc @@ -34,7 +34,7 @@ class GenProtonTableProducer : public edm::stream::EDProducer<> { void produce(edm::Event&, const edm::EventSetup&) override; const edm::EDGetTokenT prunedCandsToken_; - const edm::EDGetTokenT puCandsToken_; + const edm::EDGetTokenT puCandsToken_, puAltCandsToken_; const StringCutObjectSelector protonsCut_; const std::string table_name_; const double tolerance_; @@ -42,7 +42,8 @@ class GenProtonTableProducer : public edm::stream::EDProducer<> { GenProtonTableProducer::GenProtonTableProducer(const edm::ParameterSet& iConfig) : prunedCandsToken_(consumes(iConfig.getParameter("srcPruned"))), - puCandsToken_(consumes(iConfig.getParameter("srcPUProtons"))), + puCandsToken_(mayConsume(iConfig.getParameter("srcPUProtons"))), + puAltCandsToken_(mayConsume(iConfig.getParameter("srcAltPUProtons"))), protonsCut_(iConfig.getParameter("cut")), table_name_(iConfig.getParameter("name")), tolerance_(iConfig.getParameter("tolerance")) { @@ -99,6 +100,8 @@ void GenProtonTableProducer::fillDescriptions(edm::ConfigurationDescriptions& de ->setComment("input source for pruned gen-level particle candidates"); desc.add("srcPUProtons", edm::InputTag("genPUProtons")) ->setComment("input source for pileup protons collection"); + desc.add("srcAltPUProtons", edm::InputTag("genPUProtons", "genPUProtons")) + ->setComment("alternative input source for pileup protons collection (for premix-mix backward compatibility)"); desc.add("cut", "")->setComment("proton kinematic selection"); desc.add("name", "GenProton")->setComment("flat table name"); desc.add("doc", "generator level information on (signal+PU) protons") From 31ea174550d601d8ce366dd44d4879cad93650d2 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Mon, 10 Jan 2022 09:33:24 +0100 Subject: [PATCH 20/22] Try to fetch alternative token if main one is not found --- PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc index 98826acd927f5..4b6c379a61bd7 100644 --- a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc @@ -65,7 +65,10 @@ void GenProtonTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&) isPUs.emplace_back(false); } // then loop over pruned candidates ; if already in signal protons, discard - for (const auto& pu_cand : iEvent.get(puCandsToken_)) { + edm::Handle hPUCands; + if (!iEvent.getByToken(puCandsToken_, hPUCands)) + iEvent.getByToken(puAltCandsToken_, hPUCands); + for (const auto& pu_cand : *hPUCands) { if (!protonsCut_(pu_cand)) continue; bool associated{false}; From be038f3408e195231ebfd911d1d765422d9703de Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Mon, 10 Jan 2022 09:42:21 +0100 Subject: [PATCH 21/22] Disable the check of PU collection presence at every event --- PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc index 4b6c379a61bd7..cbd23668ba831 100644 --- a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc @@ -38,6 +38,7 @@ class GenProtonTableProducer : public edm::stream::EDProducer<> { const StringCutObjectSelector protonsCut_; const std::string table_name_; const double tolerance_; + bool use_alt_coll_{false}; ///< Are we using premix/mix collection name for PU protons? }; GenProtonTableProducer::GenProtonTableProducer(const edm::ParameterSet& iConfig) @@ -66,8 +67,8 @@ void GenProtonTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&) } // then loop over pruned candidates ; if already in signal protons, discard edm::Handle hPUCands; - if (!iEvent.getByToken(puCandsToken_, hPUCands)) - iEvent.getByToken(puAltCandsToken_, hPUCands); + if (use_alt_coll_ || !iEvent.getByToken(puCandsToken_, hPUCands)) + use_alt_coll_ = iEvent.getByToken(puAltCandsToken_, hPUCands); for (const auto& pu_cand : *hPUCands) { if (!protonsCut_(pu_cand)) continue; From 1f74f4b2bf423897b4b647b35c5eaff4702325e9 Mon Sep 17 00:00:00 2001 From: Laurent Forthomme Date: Tue, 18 Jan 2022 12:41:03 +0100 Subject: [PATCH 22/22] Floating point precision set for kinematics variables --- PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc index cbd23668ba831..09e8a39fe4bb0 100644 --- a/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/GenProtonTableProducer.cc @@ -90,10 +90,10 @@ void GenProtonTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&) } auto protons_table = std::make_unique(isPUs.size(), table_name_, false); - protons_table->addColumn("px", pxs, "proton horizontal momentum"); - protons_table->addColumn("py", pys, "proton vertical momentum"); - protons_table->addColumn("pz", pzs, "proton longitudinal momentum"); - protons_table->addColumn("vz", vzs, "proton vertex longitudinal coordinate"); + protons_table->addColumn("px", pxs, "proton horizontal momentum", 8); + protons_table->addColumn("py", pys, "proton vertical momentum", 8); + protons_table->addColumn("pz", pzs, "proton longitudinal momentum", 8); + protons_table->addColumn("vz", vzs, "proton vertex longitudinal coordinate", 8); protons_table->addColumn("isPU", isPUs, "pileup proton?"); iEvent.put(std::move(protons_table)); }