Skip to content

Commit

Permalink
Merge pull request #22038 from cms-nanoAOD/master100Xbase
Browse files Browse the repository at this point in the history
NanoAOD Update: trigger, nPV, pileup (10_0_X)
  • Loading branch information
cmsbuild committed Feb 1, 2018
2 parents fe05df7 + 785f7e3 commit 30eb550
Show file tree
Hide file tree
Showing 11 changed files with 190 additions and 36 deletions.
14 changes: 13 additions & 1 deletion PhysicsTools/NanoAOD/plugins/GlobalVariablesTableProducer.cc
Expand Up @@ -23,6 +23,7 @@ class GlobalVariablesTableProducer : public edm::stream::EDProducer<> {
else if (type == "bool") vars_.push_back(new BoolVar(vname, nanoaod::FlatTable::UInt8Column, varPSet, consumesCollector()));
else if (type == "candidatescalarsum") vars_.push_back(new CandidateScalarSumVar(vname, nanoaod::FlatTable::FloatColumn, varPSet, consumesCollector()));
else if (type == "candidatesize") vars_.push_back(new CandidateSizeVar(vname, nanoaod::FlatTable::IntColumn, varPSet, consumesCollector()));
else if (type == "candidatesummass") vars_.push_back(new CandidateSumMassVar(vname, nanoaod::FlatTable::FloatColumn, varPSet, consumesCollector()));
else throw cms::Exception("Configuration", "unsupported type "+type+" for variable "+vname);
}

Expand Down Expand Up @@ -92,11 +93,21 @@ class GlobalVariablesTableProducer : public edm::stream::EDProducer<> {
return v;
}
};
template <typename ColType,typename ValType>
class MassSum {
public:
static ColType convert(ValType x){
if(x.empty()) return 0;
auto v=x[0].p4();
for(const auto & i : x) v+=i.p4();
return v.mass();
}
};
template <typename ColType,typename ValType>
class PtVectorSum {
public:
static ColType convert(ValType x){
if(x.size()==0) return 0;
if(x.empty()) return 0;
auto v=x[0].p4();
v-=x[0].p4();
for(const auto & i : x) v+=i.p4();
Expand Down Expand Up @@ -125,6 +136,7 @@ class GlobalVariablesTableProducer : public edm::stream::EDProducer<> {
typedef VariableT<double,float> DoubleVar;
typedef VariableT<bool,uint8_t> BoolVar;
typedef VariableT<edm::View<reco::Candidate>,float,ScalarPtSum<float,edm::View<reco::Candidate>>> CandidateScalarSumVar;
typedef VariableT<edm::View<reco::Candidate>,float,MassSum<float,edm::View<reco::Candidate>>> CandidateSumMassVar;
typedef VariableT<edm::View<reco::Candidate>,int,Size<edm::View<reco::Candidate>>> CandidateSizeVar;
boost::ptr_vector<Variable> vars_;
};
Expand Down
73 changes: 73 additions & 0 deletions PhysicsTools/NanoAOD/plugins/NPUTablesProducer.cc
@@ -0,0 +1,73 @@
#include "FWCore/Framework/interface/global/EDProducer.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
#include "DataFormats/NanoAOD/interface/FlatTable.h"
#include "SimDataFormats/GeneratorProducts/interface/LHEEventProduct.h"
#include "SimDataFormats/PileupSummaryInfo/interface/PileupSummaryInfo.h"

#include <vector>
#include <iostream>


class NPUTablesProducer : public edm::global::EDProducer<> {
public:
NPUTablesProducer( edm::ParameterSet const & params ) :
npuTag_(consumes<std::vector<PileupSummaryInfo>>(params.getParameter<edm::InputTag>("src")))
{
produces<nanoaod::FlatTable>();
}

~NPUTablesProducer() override {}

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;
if (iEvent.getByToken(npuTag_, npuInfo)) {
fillNPUObjectTable(*npuInfo, *npuTab);
}

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

void fillNPUObjectTable(const std::vector<PileupSummaryInfo> & npuProd, nanoaod::FlatTable & out) const {
// Get BX 0
unsigned int bx0 = 0;
unsigned int nt = 0;
unsigned int npu = 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();
}
}
unsigned int eoot = 0;
for(unsigned int ipu=0; ipu<bx0; ipu++) {
eoot+=npuProd[ipu].getPU_NumInteractions();
}
unsigned int loot = 0;
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<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);
}

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>)");
descriptions.add("puTable", desc);
}

protected:
const edm::EDGetTokenT<std::vector<PileupSummaryInfo>> npuTag_;
};

#include "FWCore/Framework/interface/MakerMacros.h"
DEFINE_FWK_MODULE(NPUTablesProducer);

4 changes: 0 additions & 4 deletions PhysicsTools/NanoAOD/plugins/SimpleFlatTableProducer.cc
Expand Up @@ -225,14 +225,10 @@ class FirstObjectSimpleFlatTableProducer : public SimpleFlatTableProducerBase<T,
#include "DataFormats/Candidate/interface/Candidate.h"
typedef SimpleFlatTableProducer<reco::Candidate> SimpleCandidateFlatTableProducer;

#include "SimDataFormats/PileupSummaryInfo/interface/PileupSummaryInfo.h"
typedef FirstObjectSimpleFlatTableProducer<PileupSummaryInfo> SimplePileupFlatTableProducer;

#include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"
typedef EventSingletonSimpleFlatTableProducer<GenEventInfoProduct> SimpleGenEventFlatTableProducer;

#include "FWCore/Framework/interface/MakerMacros.h"
DEFINE_FWK_MODULE(SimpleCandidateFlatTableProducer);
DEFINE_FWK_MODULE(SimplePileupFlatTableProducer);
DEFINE_FWK_MODULE(SimpleGenEventFlatTableProducer);

7 changes: 6 additions & 1 deletion PhysicsTools/NanoAOD/plugins/TriggerOutputBranches.cc
Expand Up @@ -18,7 +18,12 @@ TriggerOutputBranches::updateTriggerNames(TTree & tree, const edm::TriggerNames
{
existing.idx=-1;// reset all triggers as not found
for(unsigned int j=0;j<newNames.size();j++) {
if(newNames[j]==existing.name) existing.idx=j;
std::string name=newNames[j]; // no const & as it will be modified below!
std::size_t vfound = name.rfind("_v");
if (vfound!=std::string::npos){
name.replace(vfound,name.size()-vfound,"");
}
if(name==existing.name) existing.idx=j;
}
}
// Find new ones
Expand Down
7 changes: 7 additions & 0 deletions PhysicsTools/NanoAOD/plugins/VertexTableProducer.cc
Expand Up @@ -68,6 +68,8 @@ class VertexTableProducer : public edm::stream::EDProducer<> {
const edm::EDGetTokenT<edm::ValueMap<float>> pvsScore_;
const edm::EDGetTokenT<edm::View<reco::VertexCompositePtrCandidate> > svs_;
const StringCutObjectSelector<reco::Candidate> svCut_;
const StringCutObjectSelector<reco::Vertex> goodPvCut_;
const std::string goodPvCutString_;
const std::string pvName_;
const std::string svName_;
const std::string svDoc_;
Expand All @@ -85,6 +87,8 @@ VertexTableProducer::VertexTableProducer(const edm::ParameterSet& params):
pvsScore_(consumes<edm::ValueMap<float>>( params.getParameter<edm::InputTag>("pvSrc") )),
svs_(consumes<edm::View<reco::VertexCompositePtrCandidate> >( params.getParameter<edm::InputTag>("svSrc") )),
svCut_(params.getParameter<std::string>("svCut") , true),
goodPvCut_(params.getParameter<std::string>("goodPvCut") , true),
goodPvCutString_(params.getParameter<std::string>("goodPvCut") ),
pvName_(params.getParameter<std::string>("pvName") ),
svName_(params.getParameter<std::string>("svName") ),
svDoc_(params.getParameter<std::string>("svDoc") ),
Expand Down Expand Up @@ -130,7 +134,10 @@ VertexTableProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
pvTable->addColumnValue<float>("y",(*pvsIn)[0].position().y(),"main primary vertex position y coordinate",nanoaod::FlatTable::FloatColumn,10);
pvTable->addColumnValue<float>("z",(*pvsIn)[0].position().z(),"main primary vertex position z coordinate",nanoaod::FlatTable::FloatColumn,16);
pvTable->addColumnValue<float>("chi2",(*pvsIn)[0].normalizedChi2(),"main primary vertex reduced chi2",nanoaod::FlatTable::FloatColumn,8);
int goodPVs=0;
for (const auto & pv : *pvsIn) if (goodPvCut_(pv)) goodPVs++;
pvTable->addColumnValue<int>("npvs",(*pvsIn).size(),"total number of reconstructed primary vertices",nanoaod::FlatTable::IntColumn);
pvTable->addColumnValue<int>("npvsGood",goodPVs,"number of good reconstructed primary vertices. selection:"+goodPvCutString_,nanoaod::FlatTable::IntColumn);
pvTable->addColumnValue<float>("score",(*pvsScoreIn).get(pvsIn.id(),0),"main primary vertex score, i.e. sum pt2 of clustered objects",nanoaod::FlatTable::FloatColumn,8);

auto otherPVsTable = std::make_unique<nanoaod::FlatTable>((*pvsIn).size() >4?3:(*pvsIn).size()-1,"Other"+pvName_,false);
Expand Down
14 changes: 4 additions & 10 deletions PhysicsTools/NanoAOD/python/globals_cff.py
Expand Up @@ -9,18 +9,10 @@
)
)

puTable = cms.EDProducer("SimplePileupFlatTableProducer",
puTable = cms.EDProducer("NPUTablesProducer",
src = cms.InputTag("slimmedAddPileupInfo"),
cut = cms.string("getBunchCrossing()==0"), # save only the pileup of the in-time bunch crossing
name= cms.string("Pileup"),
doc = cms.string("pileup information for bunch crossing 0"),
singleton = cms.bool(False), # slimmedAddPileupInfo collection has all the BXs, but only BX=0 is saved
extension = cms.bool(False),
variables = cms.PSet(
nTrueInt = Var( "getTrueNumInteractions()", int, doc="the true mean number of the poisson distribution for this event from which the number of interactions each bunch crossing has been sampled" ),
nPU = Var( "getPU_NumInteractions()", int, doc="the number of pileup interactions that have been added to the event in the current bunch crossing" ),
),
)

genTable = cms.EDProducer("SimpleGenEventFlatTableProducer",
src = cms.InputTag("generator"),
cut = cms.string(""),
Expand All @@ -36,6 +28,8 @@
id1 = Var( "?hasPDF?pdf().id.first:-1", int, doc="id of first parton", precision=6 ),
id2 = Var( "?hasPDF?pdf().id.second:-1", int, doc="id of second parton", precision=6 ),
scalePDF = Var( "?hasPDF?pdf().scalePDF:-1", float, doc="Q2 scale for PDF", precision=14 ),
binvar = Var("?hasBinningValues()?binningValues()[0]:-1", float, doc="MC generation binning value", precision=14),
weight = Var("weight()", float,doc="MC generator weight", precision=14),
),
)

Expand Down
73 changes: 56 additions & 17 deletions PhysicsTools/NanoAOD/python/jets_cff.py
Expand Up @@ -29,6 +29,20 @@
),
src = cms.InputTag("slimmedJets")
)
looseJetIdAK8 = cms.EDProducer("PatJetIDValueMapProducer",
filterParams=cms.PSet(
version = cms.string('WINTER16'),
quality = cms.string('LOOSE'),
),
src = cms.InputTag("slimmedJetsAK8")
)
tightJetIdAK8 = cms.EDProducer("PatJetIDValueMapProducer",
filterParams=cms.PSet(
version = cms.string('WINTER16'),
quality = cms.string('TIGHT'),
),
src = cms.InputTag("slimmedJetsAK8")
)


slimmedJetsWithUserData = cms.EDProducer("PATJetUserDataEmbedder",
Expand All @@ -40,6 +54,15 @@
),
)

slimmedJetsAK8WithUserData = cms.EDProducer("PATJetUserDataEmbedder",
src = cms.InputTag("slimmedJetsAK8"),
userFloats = cms.PSet(),
userInts = cms.PSet(
tightId = cms.InputTag("tightJetIdAK8"),
looseId = cms.InputTag("looseJetIdAK8"),
),
)


from PhysicsTools.PatAlgos.recoLayer0.jetCorrFactors_cfi import *
jetCorrFactors = patJetCorrFactors.clone(src='slimmedJetsWithUserData',
Expand All @@ -49,6 +72,15 @@
'L2L3Residual'),
primaryVertices = cms.InputTag("offlineSlimmedPrimaryVertices"),
)
jetCorrFactorsAK8 = patJetCorrFactors.clone(src='slimmedJetsAK8WithUserData',
levels = cms.vstring('L1FastJet',
'L2Relative',
'L3Absolute',
'L2L3Residual'),
payload = cms.string('AK8PFPuppi'),
primaryVertices = cms.InputTag("offlineSlimmedPrimaryVertices"),
)

from PhysicsTools.PatAlgos.producersLayer1.jetUpdater_cfi import *
updatedJets = updatedPatJets.clone(
addBTagInfo=False,
Expand All @@ -61,7 +93,16 @@
cut = cms.string("pt > 15")
)

updatedJetsAK8 = updatedPatJets.clone(
addBTagInfo=False,
jetSource='slimmedJetsAK8WithUserData',
jetCorrFactorsSource=cms.VInputTag(cms.InputTag("jetCorrFactorsAK8") ),
)

finalJetsAK8 = cms.EDFilter("PATJetRefSelector",
src = cms.InputTag("updatedJetsAK8"),
cut = cms.string("pt > 170")
)


##################### Tables for final output and docs ##########################
Expand Down Expand Up @@ -90,18 +131,16 @@
btagDeepB = Var("bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb')",float,doc="DeepCSV b+bb tag discriminator",precision=10),
btagCSVV2 = Var("bDiscriminator('pfCombinedInclusiveSecondaryVertexV2BJetTags')",float,doc=" pfCombinedInclusiveSecondaryVertexV2 b-tag discriminator (aka CSVV2)",precision=10),
btagDeepC = Var("bDiscriminator('pfDeepCSVJetTags:probc')",float,doc="DeepCSV charm btag discriminator",precision=10),

#puIdDisc = Var("userFloat('pileupJetId:fullDiscriminant')",float,doc="Pilup ID discriminant",precision=10),
puId = Var("userInt('pileupJetId:fullId')",int,doc="Pilup ID flags"),
jetId = Var("userInt('tightId')*2+userInt('looseId')",int,doc="Jet ID flags bit1 is loose, bit2 is tight"),
qgl = Var("userFloat('QGTagger:qgLikelihood')",float,doc="Quark vs Gluon likelihood discriminator",precision=10),
nConstituents = Var("numberOfDaughters()",int,doc="Number of particles in the jet"),
rawFactor = Var("1.-jecFactor('Uncorrected')",float,doc="1 - Factor to get back to raw pT",precision=6),
chHEF = Var("chargedHadronEnergy()/energy()", float, doc="charged Hadron Energy Fraction", precision= 6),
neHEF = Var("neutralHadronEnergy()/energy()", float, doc="neutral Hadron Energy Fraction", precision= 6),
chEmEF = Var("chargedEmEnergy()/energy()", float, doc="charged Electromagnetic Energy Fraction", precision= 6),
neEmEF = Var("neutralEmEnergy()/energy()", float, doc="charged Electromagnetic EnergyFraction", precision= 6),

#puIdDisc = Var("userFloat('pileupJetId:fullDiscriminant')",float,doc="Pilup ID discriminant",precision=10),
puId = Var("userInt('pileupJetId:fullId')",int,doc="Pilup ID flags"),
jetId = Var("userInt('tightId')*2+userInt('looseId')",int,doc="Jet ID flags bit1 is loose, bit2 is tight"),
qgl = Var("userFloat('QGTagger:qgLikelihood')",float,doc="Quark vs Gluon likelihood discriminator",precision=10),
nConstituents = Var("numberOfDaughters()",int,doc="Number of particles in the jet"),
rawFactor = Var("1.-jecFactor('Uncorrected')",float,doc="1 - Factor to get back to raw pT",precision=6),
chHEF = Var("chargedHadronEnergyFraction()", float, doc="charged Hadron Energy Fraction", precision= 6),
neHEF = Var("neutralHadronEnergyFraction()", float, doc="neutral Hadron Energy Fraction", precision= 6),
chEmEF = Var("chargedEmEnergyFraction()", float, doc="charged Electromagnetic Energy Fraction", precision= 6),
neEmEF = Var("neutralEmEnergyFraction()", float, doc="neutral Electromagnetic Energy Fraction", precision= 6)
)
)
#jets are not as precise as muons
Expand Down Expand Up @@ -167,26 +206,26 @@

## BOOSTED STUFF #################
fatJetTable = cms.EDProducer("SimpleCandidateFlatTableProducer",
src = cms.InputTag("slimmedJetsAK8"),
src = cms.InputTag("finalJetsAK8"),
cut = cms.string(" pt > 170"), #probably already applied in miniaod
name = cms.string("FatJet"),
doc = cms.string("slimmedJetsAK8, i.e. ak8 fat jets for boosted analysis"),
singleton = cms.bool(False), # the number of entries is variable
extension = cms.bool(False), # this is the main table for the jets
variables = cms.PSet(P4Vars,
jetId = Var("userInt('tightId')*2+userInt('looseId')",int,doc="Jet ID flags bit1 is loose, bit2 is tight"),
area = Var("jetArea()", float, doc="jet catchment area, for JECs",precision=10),
tau1 = Var("userFloat('NjettinessAK8Puppi:tau1')",float, doc="Nsubjettiness (1 axis)",precision=10),
tau2 = Var("userFloat('NjettinessAK8Puppi:tau2')",float, doc="Nsubjettiness (2 axis)",precision=10),
tau3 = Var("userFloat('NjettinessAK8Puppi:tau3')",float, doc="Nsubjettiness (3 axis)",precision=10),
tau4 = Var("userFloat('NjettinessAK8Puppi:tau4')",float, doc="Nsubjettiness (4 axis)",precision=10),
n2b1 = Var("userFloat('ak8PFJetsPuppiSoftDropValueMap:nb1AK8PuppiSoftDropN2')", float, doc="N2 with beta=1", precision=10),
n3b1 = Var("userFloat('ak8PFJetsPuppiSoftDropValueMap:nb1AK8PuppiSoftDropN3')", float, doc="N3 with beta=1", precision=10),
msoftdrop = Var("userFloat('ak8PFJetsPuppiSoftDropMass')",float, doc="Soft drop mass",precision=10),
msoftdrop = Var("groomedMass('SoftDropPuppi')",float, doc="Corrected soft drop mass with PUPPI",precision=10),
btagCMVA = Var("bDiscriminator('pfCombinedMVAV2BJetTags')",float,doc="CMVA V2 btag discriminator",precision=10),
btagDeepB = Var("bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb')",float,doc="DeepCSV b+bb tag discriminator",precision=10),
btagCSVV2 = Var("bDiscriminator('pfCombinedInclusiveSecondaryVertexV2BJetTags')",float,doc=" pfCombinedInclusiveSecondaryVertexV2 b-tag discriminator (aka CSVV2)",precision=10),
btagHbb = Var("bDiscriminator('pfBoostedDoubleSecondaryVertexAK8BJetTags')",float,doc="Higgs to BB tagger discriminator",precision=10),

subJetIdx1 = Var("?numberOfSourceCandidatePtrs()>0 && sourceCandidatePtr(0).numberOfSourceCandidatePtrs()>0?sourceCandidatePtr(0).key():-1", int,
doc="index of first subjet"),
subJetIdx2 = Var("?numberOfSourceCandidatePtrs()>1 && sourceCandidatePtr(1).numberOfSourceCandidatePtrs()>0?sourceCandidatePtr(1).key():-1", int,
Expand All @@ -199,7 +238,7 @@
)
)
### Era dependent customization
run2_miniAOD_80XLegacy.toModify( fatJetTable.variables.msoftdrop, expr = cms.string("userFloat(\'ak8PFJetsCHSSoftDropMass\')"),)
run2_miniAOD_80XLegacy.toModify( fatJetTable.variables, msoftdrop_chs = Var("userFloat('ak8PFJetsCHSSoftDropMass')",float, doc="Legacy uncorrected soft drop mass with CHS",precision=10))
run2_miniAOD_80XLegacy.toModify( fatJetTable.variables.tau1, expr = cms.string("userFloat(\'ak8PFJetsPuppiValueMap:NjettinessAK8PuppiTau1\')"),)
run2_miniAOD_80XLegacy.toModify( fatJetTable.variables.tau2, expr = cms.string("userFloat(\'ak8PFJetsPuppiValueMap:NjettinessAK8PuppiTau2\')"),)
run2_miniAOD_80XLegacy.toModify( fatJetTable.variables.tau3, expr = cms.string("userFloat(\'ak8PFJetsPuppiValueMap:NjettinessAK8PuppiTau3\')"),)
Expand Down Expand Up @@ -347,7 +386,7 @@
run2_nanoAOD_92X.toModify( genJetFlavourTable, jetFlavourInfos = cms.InputTag("genJetFlavourAssociation"),)

#before cross linking
jetSequence = cms.Sequence(looseJetId+tightJetId+slimmedJetsWithUserData+jetCorrFactors+updatedJets+chsForSATkJets+softActivityJets+softActivityJets2+softActivityJets5+softActivityJets10+finalJets)
jetSequence = cms.Sequence(looseJetId+tightJetId+slimmedJetsWithUserData+jetCorrFactors+updatedJets+looseJetIdAK8+tightJetIdAK8+slimmedJetsAK8WithUserData+jetCorrFactorsAK8+updatedJetsAK8+chsForSATkJets+softActivityJets+softActivityJets2+softActivityJets5+softActivityJets10+finalJets+finalJetsAK8)
#after cross linkining
jetTables = cms.Sequence(bjetMVA+ jetTable+fatJetTable+subJetTable+saJetTable+saTable)

Expand Down

0 comments on commit 30eb550

Please sign in to comment.