Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding a few jet and event variables to prepare for automatic JEC workflows #245

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
47 changes: 42 additions & 5 deletions PhysicsTools/NanoAOD/plugins/NPUTablesProducer.cc
Expand Up @@ -4,6 +4,7 @@
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
#include "DataFormats/NanoAOD/interface/FlatTable.h"
#include "DataFormats/PatCandidates/interface/PackedGenParticle.h"
#include "SimDataFormats/GeneratorProducts/interface/LHEEventProduct.h"
#include "SimDataFormats/PileupSummaryInfo/interface/PileupSummaryInfo.h"

Expand All @@ -14,7 +15,9 @@
class NPUTablesProducer : public edm::global::EDProducer<> {
public:
NPUTablesProducer( edm::ParameterSet const & params ) :
npuTag_(consumes<std::vector<PileupSummaryInfo>>(params.getParameter<edm::InputTag>("src")))
npuTag_(consumes<std::vector<PileupSummaryInfo>>(params.getParameter<edm::InputTag>("src"))),
genTag_(consumes<edm::View<pat::PackedGenParticle>>(params.getParameter<edm::InputTag>("gensrc"))),
vz_(params.getParameter<std::vector<double>>("zbins"))
{
produces<nanoaod::FlatTable>();
}
Expand All @@ -24,24 +27,51 @@ 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<nanoaod::FlatTable>(1, "Pileup", true);

edm::Handle<std::vector<PileupSummaryInfo> > npuInfo;

edm::Handle<edm::View<pat::PackedGenParticle> > genParticles;
double refpvz = -1000.0;
if ( iEvent.getByToken(genTag_, genParticles) ) {
for ( auto genIt = genParticles->begin(); genIt != genParticles->end(); ++genIt ) {
if ( genIt->statusFlags().isHardProcess() ) {
refpvz = genIt->vz();
break;
}
}
}

edm::Handle<std::vector<PileupSummaryInfo> > npuInfo;
if (iEvent.getByToken(npuTag_, npuInfo)) {
fillNPUObjectTable(*npuInfo, *npuTab);
fillNPUObjectTable(*npuInfo, *npuTab, refpvz);
}

iEvent.put(std::move(npuTab));
}

void fillNPUObjectTable(const std::vector<PileupSummaryInfo> & npuProd, nanoaod::FlatTable & out) const {
void fillNPUObjectTable(const std::vector<PileupSummaryInfo> & 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<npuProd.size(); ibx++) {
if(npuProd[ibx].getBunchCrossing()==0) {
bx0 = ibx;
nt = npuProd[ibx].getTrueNumInteractions();
npu = npuProd[ibx].getPU_NumInteractions();

std::vector<float> zpositions;
unsigned int nzpositions = npuProd[ibx].getPU_zpositions().size();
for (unsigned int j=0; j<nzpositions; ++j) {
zpositions.push_back(npuProd[ibx].getPU_zpositions()[j]);
if (std::abs(zpositions.back()- refpvz)<0.1) pudensity++; //N_PU/mm
auto bin = std::lower_bound( vz_.begin(), vz_.end()-1, std::abs(zpositions.back()) );
if ( bin != vz_.end() && bin==zbin) gpudensity++;
}
gpudensity/=(20.0*( *(zbin+1) - *(zbin) ) ) ;
}
}
unsigned int eoot = 0;
Expand All @@ -52,20 +82,27 @@ class NPUTablesProducer : public edm::global::EDProducer<> {
for(unsigned int ipu=npuProd.size()-1; ipu>bx0; ipu--) {
loot+=npuProd[ipu].getPU_NumInteractions();
}
out.addColumnValue<float>("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<float>("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<int>("nPU", npu, "the number of pileup interactions that have been added to the event in the current bunch crossing", nanoaod::FlatTable::IntColumn);
out.addColumnValue<int>("sumEOOT", eoot, "number of early out of time pileup" , nanoaod::FlatTable::IntColumn);
out.addColumnValue<int>("sumLOOT", loot, "number of late out of time pileup" , nanoaod::FlatTable::IntColumn);
out.addColumnValue<float>("pudensity", pudensity, "PU vertices / mm", nanoaod::FlatTable::FloatColumn);
out.addColumnValue<float>("gpudensity", gpudensity, "Generator-level PU vertices / mm", nanoaod::FlatTable::FloatColumn);
}

static void fillDescriptions(edm::ConfigurationDescriptions & descriptions) {
edm::ParameterSetDescription desc;
desc.add<edm::InputTag>("src", edm::InputTag("slimmedAddPileupInfo"))->setComment("tag for the PU information (vector<PileupSummaryInfo>)");
desc.add<edm::InputTag>("gensrc", edm::InputTag("packedGenParticles"))->setComment("tag for the packed GenParticles");
desc.add<std::vector<double>> ("zbins", {})->setComment("Z bins to compute the generator-level number of PU vertices per mm");
descriptions.add("puTable", desc);
}

protected:
const edm::EDGetTokenT<std::vector<PileupSummaryInfo>> npuTag_;
const edm::EDGetTokenT<edm::View<pat::PackedGenParticle>> genTag_;

const std::vector<double> vz_;
};

#include "FWCore/Framework/interface/MakerMacros.h"
Expand Down
4 changes: 4 additions & 0 deletions PhysicsTools/NanoAOD/python/globals_cff.py
Expand Up @@ -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"),
gensrc = cms.InputTag("packedGenParticles"),
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",
Expand Down
15 changes: 12 additions & 3 deletions PhysicsTools/NanoAOD/python/jets_cff.py
Expand Up @@ -3,7 +3,7 @@
from Configuration.Eras.Modifier_run2_nanoAOD_92X_cff import run2_nanoAOD_92X

from PhysicsTools.NanoAOD.common_cff import *

from RecoJets.JetProducers.ak4PFJetsBetaStar_cfi import *


##################### User floats producers, selectors ##########################
Expand Down Expand Up @@ -72,6 +72,12 @@
#elesrc = cms.InputTag("slimmedElectrons")
)

jercVars = cms.EDProducer("BetaStarPackedCandidateVarProducer"),
srcJet = cms.InputTag("slimmedJets"),
srcPF = cms.InputTag("packedPFCandidates"),
maxDR = cms.double(0.4)
)


slimmedJetsWithUserData = cms.EDProducer("PATJetUserDataEmbedder",
src = cms.InputTag("slimmedJets"),
Expand All @@ -91,7 +97,8 @@
vtx3deL = cms.InputTag("bJetVars:vtx3deL"),
ptD = cms.InputTag("bJetVars:ptD"),
genPtwNu = cms.InputTag("bJetVars:genPtwNu"),

jercCHPUF = cms.InputTag("jercVars:chargedHadronPUEnergyFraction"),
jercCHF = cms.InputTag("jercVars:chargedHadronCHSEnergyFraction"),
),
userInts = cms.PSet(
tightId = cms.InputTag("tightJetId"),
Expand Down Expand Up @@ -205,6 +212,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),
)
)

Expand Down Expand Up @@ -510,7 +519,7 @@
run2_nanoAOD_92X.toModify( genJetFlavourTable, jetFlavourInfos = cms.InputTag("genJetFlavourAssociation"),)

#before cross linking
jetSequence = cms.Sequence(tightJetId+tightJetIdLepVeto+bJetVars+slimmedJetsWithUserData+jetCorrFactorsNano+updatedJets+tightJetIdAK8+tightJetIdLepVetoAK8+slimmedJetsAK8WithUserData+jetCorrFactorsAK8+updatedJetsAK8+chsForSATkJets+softActivityJets+softActivityJets2+softActivityJets5+softActivityJets10+finalJets+finalJetsAK8)
jetSequence = cms.Sequence(tightJetId+tightJetIdLepVeto+bJetVars+jercVars+slimmedJetsWithUserData+jetCorrFactorsNano+updatedJets+tightJetIdAK8+tightJetIdLepVetoAK8+slimmedJetsAK8WithUserData+jetCorrFactorsAK8+updatedJetsAK8+chsForSATkJets+softActivityJets+softActivityJets2+softActivityJets5+softActivityJets10+finalJets+finalJetsAK8)

from RecoJets.JetProducers.QGTagger_cfi import QGTagger
qgtagger80x=QGTagger.clone(srcJets="slimmedJets",srcVertexCollection="offlineSlimmedPrimaryVertices")
Expand Down