From bc5046ae82b5e1aff895cc6fd8281d659800c8e8 Mon Sep 17 00:00:00 2001 From: Salvatore Rappoccio Date: Fri, 9 Nov 2018 11:03:44 -0600 Subject: [PATCH 1/4] First pass at adding JERC-relevant variables --- .../NanoAOD/plugins/NPUTablesProducer.cc | 39 ++++++++++++++++--- PhysicsTools/NanoAOD/python/globals_cff.py | 4 ++ PhysicsTools/NanoAOD/python/jets_cff.py | 12 +++++- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/NPUTablesProducer.cc b/PhysicsTools/NanoAOD/plugins/NPUTablesProducer.cc index c891e17720bf5..abc737527e416 100644 --- a/PhysicsTools/NanoAOD/plugins/NPUTablesProducer.cc +++ b/PhysicsTools/NanoAOD/plugins/NPUTablesProducer.cc @@ -6,6 +6,7 @@ #include "DataFormats/NanoAOD/interface/FlatTable.h" #include "SimDataFormats/GeneratorProducts/interface/LHEEventProduct.h" #include "SimDataFormats/PileupSummaryInfo/interface/PileupSummaryInfo.h" +#include "DataFormats/VertexReco/interface/Vertex.h" #include #include @@ -14,7 +15,9 @@ class NPUTablesProducer : public edm::global::EDProducer<> { public: NPUTablesProducer( edm::ParameterSet const & params ) : - npuTag_(consumes>(params.getParameter("src"))) + npuTag_(consumes>(params.getParameter("src"))), + pvTag_(consumes>(params.getParameter("pvsrc"))), + vz_(params.getParameter>("zbins")) { produces(); } @@ -24,24 +27,43 @@ class NPUTablesProducer : public edm::global::EDProducer<> { void produce(edm::StreamID id, edm::Event& iEvent, const edm::EventSetup& iSetup) const override { auto npuTab = std::make_unique(1, "Pileup", true); - edm::Handle > npuInfo; + edm::Handle> pvsIn; + iEvent.getByToken(pvTag_, pvsIn); + const double refpvz = (*pvsIn)[0].position().z(); + + edm::Handle > npuInfo; if (iEvent.getByToken(npuTag_, npuInfo)) { - fillNPUObjectTable(*npuInfo, *npuTab); + fillNPUObjectTable(*npuInfo, *npuTab, refpvz); } iEvent.put(std::move(npuTab)); } - void fillNPUObjectTable(const std::vector & npuProd, nanoaod::FlatTable & out) const { + void fillNPUObjectTable(const std::vector & npuProd, nanoaod::FlatTable & out, double refpvz) const { // Get BX 0 unsigned int bx0 = 0; unsigned int nt = 0; unsigned int npu = 0; + + auto zbin = std::lower_bound( vz_.begin(), vz_.end()-1, std::abs(refpvz) ); + float pudensity = 0; + float gpudensity = 0; + for(unsigned int ibx=0; ibx zpositions; + unsigned int nzpositions = npuProd[ibx].getPU_zpositions().size(); + for (unsigned int j=0; j { for(unsigned int ipu=npuProd.size()-1; ipu>bx0; ipu--) { loot+=npuProd[ipu].getPU_NumInteractions(); } - out.addColumnValue("nTrueInt", nt, "the true mean number of the poisson distribution for this event from which the number of interactions each bunch crossing has been sampled", nanoaod::FlatTable::FloatColumn); + out.addColumnValue("nTrueInt", nt, "the true mean number of the poisson distribution for this event from which the number of interactions each bunch crossing has been sampled", nanoaod::FlatTable::FloatColumn); out.addColumnValue("nPU", npu, "the number of pileup interactions that have been added to the event in the current bunch crossing", nanoaod::FlatTable::IntColumn); out.addColumnValue("sumEOOT", eoot, "number of early out of time pileup" , nanoaod::FlatTable::IntColumn); out.addColumnValue("sumLOOT", loot, "number of late out of time pileup" , nanoaod::FlatTable::IntColumn); + out.addColumnValue("pudensity", pudensity, "PU vertices / mm", nanoaod::FlatTable::FloatColumn); + out.addColumnValue("gpudensity", gpudensity, "Generator-level PU vertices / mm", nanoaod::FlatTable::FloatColumn); } static void fillDescriptions(edm::ConfigurationDescriptions & descriptions) { edm::ParameterSetDescription desc; desc.add("src", edm::InputTag("slimmedAddPileupInfo"))->setComment("tag for the PU information (vector)"); + desc.add("pvsrc", edm::InputTag("offlineSlimmedPrimaryVertices"))->setComment("tag for the PVs"); + desc.add> ("zbins", {})->setComment("Z bins to compute the generator-level number of PU vertices per mm"); descriptions.add("puTable", desc); } protected: const edm::EDGetTokenT> npuTag_; + const edm::EDGetTokenT> pvTag_; + + const std::vector vz_; }; #include "FWCore/Framework/interface/MakerMacros.h" diff --git a/PhysicsTools/NanoAOD/python/globals_cff.py b/PhysicsTools/NanoAOD/python/globals_cff.py index 0c58aed9f8f8f..bfa17e721636b 100644 --- a/PhysicsTools/NanoAOD/python/globals_cff.py +++ b/PhysicsTools/NanoAOD/python/globals_cff.py @@ -6,11 +6,15 @@ fixedGridRhoFastjetAll = ExtVar( cms.InputTag("fixedGridRhoFastjetAll"), "double", doc = "rho from all PF Candidates, used e.g. for JECs" ), fixedGridRhoFastjetCentralNeutral = ExtVar( cms.InputTag("fixedGridRhoFastjetCentralNeutral"), "double", doc = "rho from neutral PF Candidates with |eta| < 2.5, used e.g. for rho corrections of some lepton isolations" ), fixedGridRhoFastjetCentralCalo = ExtVar( cms.InputTag("fixedGridRhoFastjetCentralCalo"), "double", doc = "rho from calo towers with |eta| < 2.5, used e.g. egamma PFCluster isolation" ), + fixedGridRhoFastjetCentral = ExtVar( cms.InputTag("fixedGridRhoFastjetCentral"), "double", doc = "rho from all PF Candidates for central region, used e.g. for JECs" ), + fixedGridRhoFastjetCentralChargedPileUp = ExtVar( cms.InputTag("fixedGridRhoFastjetCentralChargedPileUp"), "double", doc = "rho from charged PF Candidates for central region, used e.g. for JECs" ), ) ) puTable = cms.EDProducer("NPUTablesProducer", src = cms.InputTag("slimmedAddPileupInfo"), + pvsrc = cms.InputTag("offlineSlimmedPrimaryVertices"), + zbins = cms.vdouble( [0.0,1.7,2.6,3.0,3.5,4.2,5.2,6.0,7.5,9.0,12.0] ) ) genTable = cms.EDProducer("SimpleGenEventFlatTableProducer", diff --git a/PhysicsTools/NanoAOD/python/jets_cff.py b/PhysicsTools/NanoAOD/python/jets_cff.py index c07dccb089f1a..b058060ba3ccd 100644 --- a/PhysicsTools/NanoAOD/python/jets_cff.py +++ b/PhysicsTools/NanoAOD/python/jets_cff.py @@ -3,7 +3,7 @@ from Configuration.Eras.Modifier_run2_nanoAOD_94X2016_cff import run2_nanoAOD_94X2016 from PhysicsTools.NanoAOD.common_cff import * - +from RecoJets.JetProducers.ak4PFJetsBetaStar_cfi import * ##################### User floats producers, selectors ########################## @@ -111,6 +111,12 @@ #elesrc = cms.InputTag("slimmedElectrons") ) +jercVars = cms.EDProducer("BetaStarPackedCandidateVarProducer", + srcJet = cms.InputTag("slimmedJets"), + srcPF = cms.InputTag("packedPFCandidates"), + maxDR = cms.double(0.4) +) + updatedJetsWithUserData = cms.EDProducer("PATJetUserDataEmbedder", src = cms.InputTag("updatedJets"), @@ -131,6 +137,8 @@ ptD = cms.InputTag("bJetVars:ptD"), genPtwNu = cms.InputTag("bJetVars:genPtwNu"), qgl = cms.InputTag('qgtagger:qgLikelihood'), + jercCHPUF = cms.InputTag("jercVars:chargedHadronPUEnergyFraction"), + jercCHF = cms.InputTag("jercVars:chargedHadronCHSEnergyFraction"), ), userInts = cms.PSet( tightId = cms.InputTag("tightJetId"), @@ -214,6 +222,8 @@ chEmEF = Var("chargedEmEnergyFraction()", float, doc="charged Electromagnetic Energy Fraction", precision= 6), neEmEF = Var("neutralEmEnergyFraction()", float, doc="neutral Electromagnetic Energy Fraction", precision= 6), muEF = Var("muonEnergyFraction()", float, doc="muon Energy Fraction", precision= 6), + jercCHPUF = Var("userFloat('jercCHPUF')", float, doc="Pileup Charged Hadron Energy Fraction with the JERC group definition", precision= 6), + jercCHF = Var("userFloat('jercCHF')", float, doc="Charged Hadron Energy Fraction with the JERC group definition", precision= 6), ) ) From 76ccb8f9488957ef8b5daa2a56363923bb4286aa Mon Sep 17 00:00:00 2001 From: Salvatore Rappoccio Date: Tue, 14 May 2019 12:07:06 -0500 Subject: [PATCH 2/4] Changing source of beta star producer --- PhysicsTools/NanoAOD/python/jets_cff.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PhysicsTools/NanoAOD/python/jets_cff.py b/PhysicsTools/NanoAOD/python/jets_cff.py index b058060ba3ccd..5574153d99473 100644 --- a/PhysicsTools/NanoAOD/python/jets_cff.py +++ b/PhysicsTools/NanoAOD/python/jets_cff.py @@ -112,7 +112,7 @@ ) jercVars = cms.EDProducer("BetaStarPackedCandidateVarProducer", - srcJet = cms.InputTag("slimmedJets"), + srcJet = cms.InputTag("updatedJets"), srcPF = cms.InputTag("packedPFCandidates"), maxDR = cms.double(0.4) ) From 31fc86d4ace0644fc34cfc032bfbeb65675e80a9 Mon Sep 17 00:00:00 2001 From: peruzzim Date: Tue, 14 May 2019 23:55:32 +0200 Subject: [PATCH 3/4] Add jercVars to sequence --- PhysicsTools/NanoAOD/python/jets_cff.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PhysicsTools/NanoAOD/python/jets_cff.py b/PhysicsTools/NanoAOD/python/jets_cff.py index 5574153d99473..8dedf104d3842 100644 --- a/PhysicsTools/NanoAOD/python/jets_cff.py +++ b/PhysicsTools/NanoAOD/python/jets_cff.py @@ -558,7 +558,7 @@ qgtagger=QGTagger.clone(srcJets="updatedJets",srcVertexCollection="offlineSlimmedPrimaryVertices") #before cross linking -jetSequence = cms.Sequence(jetCorrFactorsNano+updatedJets+tightJetId+tightJetIdLepVeto+bJetVars+qgtagger+updatedJetsWithUserData+jetCorrFactorsAK8+updatedJetsAK8+tightJetIdAK8+tightJetIdLepVetoAK8+updatedJetsAK8WithUserData+chsForSATkJets+softActivityJets+softActivityJets2+softActivityJets5+softActivityJets10+finalJets+finalJetsAK8) +jetSequence = cms.Sequence(jetCorrFactorsNano+updatedJets+tightJetId+tightJetIdLepVeto+bJetVars+jercVars+qgtagger+updatedJetsWithUserData+jetCorrFactorsAK8+updatedJetsAK8+tightJetIdAK8+tightJetIdLepVetoAK8+updatedJetsAK8WithUserData+chsForSATkJets+softActivityJets+softActivityJets2+softActivityJets5+softActivityJets10+finalJets+finalJetsAK8) _jetSequence_2016 = jetSequence.copy() _jetSequence_2016.insert(_jetSequence_2016.index(tightJetId), looseJetId) From 0e48744ad1f85031955d2a4173b0db8668e420fb Mon Sep 17 00:00:00 2001 From: peruzzim Date: Wed, 15 May 2019 15:01:13 +0200 Subject: [PATCH 4/4] Update nanoDQM_cfi.py --- PhysicsTools/NanoAOD/python/nanoDQM_cfi.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py index 776ecfb236f01..9f8e16ad04b2f 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py @@ -290,6 +290,8 @@ Plot1D('eta', 'eta', 20, -6, 6, 'eta'), NoPlot('genJetIdx'), Plot1D('hadronFlavour', 'hadronFlavour', 6, -0.5, 5.5, 'flavour from hadron ghost clustering'), + Plot1D('jercCHF', 'jercCHF', 20, 0, 1, 'Charged Hadron Energy Fraction with the JERC group definition'), + Plot1D('jercCHPUF', 'jercCHPUF', 20, 0, 2, 'Pileup Charged Hadron Energy Fraction with the JERC group definition'), Plot1D('jetId', 'jetId', 8, -0.5, 7.5, 'Jet ID flags bit1 is loose (always false in 2017 since it does not exist), bit2 is tight, bit3 is tightLepVeto'), Plot1D('mass', 'mass', 20, 0, 200, 'mass'), Plot1D('muEF', 'muEF', 20, 0, 1, 'muon Energy Fraction'), @@ -437,8 +439,10 @@ Pileup = cms.PSet( sels = cms.PSet(), plots = cms.VPSet( + Plot1D('gpudensity', 'gpudensity', 20, 0, 0.9, 'Generator-level PU vertices / mm'), Plot1D('nPU', 'nPU', 20, 0, 60, 'the number of pileup interactions that have been added to the event in the current bunch crossing'), Plot1D('nTrueInt', 'nTrueInt', 20, 0, 60, 'the true mean number of the poisson distribution for this event from which the number of interactions each bunch crossing has been sampled'), + Plot1D('pudensity', 'pudensity', 5, -0.5, 4.5, 'PU vertices / mm'), Plot1D('sumEOOT', 'sumEOOT', 20, 0, 800, 'number of early out of time pileup'), Plot1D('sumLOOT', 'sumLOOT', 20, 0, 300, 'number of late out of time pileup'), )