Skip to content

Commit

Permalink
feat: truth flavor with PU category
Browse files Browse the repository at this point in the history
fix: TransientTrackBuilder using ESHandle
fix: updatedJets can be used for custom DeepJet-inputs producer
warning: not yet full functionality ported (SimpleFlatTable with tagInfos ToDo)
  • Loading branch information
AnnikaStein committed Aug 16, 2022
1 parent 6d8732a commit d6e3ef2
Show file tree
Hide file tree
Showing 7 changed files with 499 additions and 237 deletions.
7 changes: 7 additions & 0 deletions interface/helpers.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
int jet_flavour(const pat::Jet& jet,
const std::vector<reco::GenParticle>& gToBB,
const std::vector<reco::GenParticle>& gToCC,
const std::vector<reco::GenParticle>& neutrinosLepB,
const std::vector<reco::GenParticle>& neutrinosLepB_C,
const std::vector<reco::GenParticle>& alltaus,
bool usePhysForLightAndUndefined);
441 changes: 241 additions & 200 deletions plugins/DeepJetTableProducer.cc

Large diffs are not rendered by default.

60 changes: 33 additions & 27 deletions plugins/JetConstituentTableProducer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class JetConstituentTableProducer : public edm::stream::EDProducer<> {
edm::Handle<reco::CandidateView> cands_;
edm::Handle<SVCollection> svs_;
edm::ESHandle<TransientTrackBuilder> track_builder_;
const edm::ESGetToken<TransientTrackBuilder, TransientTrackRecord> track_builder_token_;

const reco::Vertex *pv_ = nullptr;

Expand All @@ -81,7 +82,9 @@ JetConstituentTableProducer<T>::JetConstituentTableProducer(const edm::Parameter
jet_token_(consumes<edm::View<T>>(iConfig.getParameter<edm::InputTag>("jets"))),
vtx_token_(consumes<VertexCollection>(iConfig.getParameter<edm::InputTag>("vertices"))),
cand_token_(consumes<reco::CandidateView>(iConfig.getParameter<edm::InputTag>("candidates"))),
sv_token_(consumes<SVCollection>(iConfig.getParameter<edm::InputTag>("secondary_vertices"))){
sv_token_(consumes<SVCollection>(iConfig.getParameter<edm::InputTag>("secondary_vertices"))),
track_builder_token_(
esConsumes<TransientTrackBuilder, TransientTrackRecord>(edm::ESInputTag("", "TransientTrackBuilder"))){
//produces<nanoaod::FlatTable>(name_);
produces<nanoaod::FlatTable>(name_);
produces<nanoaod::FlatTable>(nameSV_);
Expand Down Expand Up @@ -109,7 +112,10 @@ void JetConstituentTableProducer<T>::produce(edm::Event &iEvent, const edm::Even
iEvent.getByToken(sv_token_, svs_);

if(readBtag_){
iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder", track_builder_);
//iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder", track_builder_);
edm::ESHandle<TransientTrackBuilder> track_builder_ = iSetup.getHandle(track_builder_token_);
//auto const& data = iEventSetup.getData(esToken_);
//auto transientHandle = iEventSetup.getTransientHandle(esToken_));
}

for (unsigned i_jet = 0; i_jet < jets->size(); ++i_jet) {
Expand Down Expand Up @@ -216,40 +222,40 @@ void JetConstituentTableProducer<T>::produce(edm::Event &iEvent, const edm::Even

auto candTable = std::make_unique<nanoaod::FlatTable>(outCands->size(), name_, false);
// We fill from here only stuff that cannot be created with the SimpleFlatTableProducer
candTable->addColumn<int>(idx_name_, pfcandIdx, "Index in the candidate list", nanoaod::FlatTable::IntColumn);
candTable->addColumn<int>("jetIdx", jetIdx_pf, "Index of the parent jet", nanoaod::FlatTable::IntColumn);
candTable->addColumn<int>(idx_name_, pfcandIdx, "Index in the candidate list");
candTable->addColumn<int>("jetIdx", jetIdx_pf, "Index of the parent jet");
if (readBtag_) {
candTable->addColumn<float>("pt", cand_pt, "pt", nanoaod::FlatTable::FloatColumn, 10); // to check matchind down the line
candTable->addColumn<float>("btagEtaRel", btagEtaRel, "btagEtaRel", nanoaod::FlatTable::FloatColumn, 10);
candTable->addColumn<float>("btagPtRatio", btagPtRatio, "btagPtRatio", nanoaod::FlatTable::FloatColumn, 10);
candTable->addColumn<float>("btagPParRatio", btagPParRatio, "btagPParRatio", nanoaod::FlatTable::FloatColumn, 10);
candTable->addColumn<float>("btagSip3dVal", btagSip3dVal, "btagSip3dVal", nanoaod::FlatTable::FloatColumn, 10);
candTable->addColumn<float>("btagSip3dSig", btagSip3dSig, "btagSip3dSig", nanoaod::FlatTable::FloatColumn, 10);
candTable->addColumn<float>("btagJetDistVal", btagJetDistVal, "btagJetDistVal", nanoaod::FlatTable::FloatColumn, 10);
candTable->addColumn<float>("pt", cand_pt, "pt", 10); // to check matchind down the line
candTable->addColumn<float>("btagEtaRel", btagEtaRel, "btagEtaRel", 10);
candTable->addColumn<float>("btagPtRatio", btagPtRatio, "btagPtRatio", 10);
candTable->addColumn<float>("btagPParRatio", btagPParRatio, "btagPParRatio", 10);
candTable->addColumn<float>("btagSip3dVal", btagSip3dVal, "btagSip3dVal", 10);
candTable->addColumn<float>("btagSip3dSig", btagSip3dSig, "btagSip3dSig", 10);
candTable->addColumn<float>("btagJetDistVal", btagJetDistVal, "btagJetDistVal", 10);
}
iEvent.put(std::move(candTable), name_);

// SV table
auto svTable = std::make_unique<nanoaod::FlatTable>(outSVs->size(), nameSV_, false);
// We fill from here only stuff that cannot be created with the SimpleFlatTnameableProducer
svTable->addColumn<int>("jetIdx", jetIdx_sv, "Index of the parent jet", nanoaod::FlatTable::IntColumn);
svTable->addColumn<int>(idx_nameSV_, svIdx, "Index in the SV list", nanoaod::FlatTable::IntColumn);
svTable->addColumn<int>("jetIdx", jetIdx_sv, "Index of the parent jet");
svTable->addColumn<int>(idx_nameSV_, svIdx, "Index in the SV list");
if (readBtag_) {
svTable->addColumn<float>("mass", sv_mass, "SV mass", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("pt", sv_pt, "SV pt", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("ntracks", sv_ntracks, "Number of tracks associated to SV", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("chi2", sv_chi2, "chi2", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("normchi2", sv_normchi2, "chi2/ndof", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("dxy", sv_dxy, "", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("dxysig", sv_dxysig, "", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("d3d", sv_d3d, "", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("d3dsig", sv_d3dsig, "", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("costhetasvpv", sv_costhetasvpv, "", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("mass", sv_mass, "SV mass", 10);
svTable->addColumn<float>("pt", sv_pt, "SV pt", 10);
svTable->addColumn<float>("ntracks", sv_ntracks, "Number of tracks associated to SV", 10);
svTable->addColumn<float>("chi2", sv_chi2, "chi2", 10);
svTable->addColumn<float>("normchi2", sv_normchi2, "chi2/ndof", 10);
svTable->addColumn<float>("dxy", sv_dxy, "", 10);
svTable->addColumn<float>("dxysig", sv_dxysig, "", 10);
svTable->addColumn<float>("d3d", sv_d3d, "", 10);
svTable->addColumn<float>("d3dsig", sv_d3dsig, "", 10);
svTable->addColumn<float>("costhetasvpv", sv_costhetasvpv, "", 10);
// Jet related
svTable->addColumn<float>("phirel", sv_phirel, "DeltaPhi(sv, jet)", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("ptrel", sv_ptrel, "pT relative to parent jet", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("deltaR", sv_deltaR, "dR from parent jet", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("enration", sv_enratio, "energy relative to parent jet", nanoaod::FlatTable::FloatColumn, 10);
svTable->addColumn<float>("phirel", sv_phirel, "DeltaPhi(sv, jet)", 10);
svTable->addColumn<float>("ptrel", sv_ptrel, "pT relative to parent jet", 10);
svTable->addColumn<float>("deltaR", sv_deltaR, "dR from parent jet", 10);
svTable->addColumn<float>("enration", sv_enratio, "energy relative to parent jet", 10);
}
iEvent.put(std::move(svTable), nameSV_);

Expand Down
95 changes: 87 additions & 8 deletions python/addBTV.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import FWCore.ParameterSet.Config as cms
# from PhysicsTools.NanoAOD.common_cff import *
from PhysicsTools.NanoAOD.common_cff import Var
from PhysicsTools.NanoAOD.jets_cff import jetTable, fatJetTable, subJetTable
#from PhysicsTools.NanoAOD.jets_cff import jetTable, fatJetTable, subJetTable
from PhysicsTools.NanoAOD.jetsAK4_CHS_cff import jetTable, jetCorrFactorsNano, updatedJets, finalJets, qgtagger, hfJetShowerShapeforNanoAOD
#from PhysicsTools.NanoAOD.jetsAK4_CHS_cff import jetTable, jetCorrFactorsNano, qgtagger, hfJetShowerShapeforNanoAOD
from PhysicsTools.NanoAOD.jetsAK4_Puppi_cff import jetPuppiTable, jetPuppiCorrFactorsNano, updatedJetsPuppi, updatedJetsPuppiWithUserData
from PhysicsTools.NanoAOD.jetsAK8_cff import fatJetTable, subJetTable
from PhysicsTools.PatAlgos.tools.jetTools import updateJetCollection
from PhysicsTools.PatAlgos.tools.helpers import addToProcessAndTask, getPatAlgosToolsTask



def update_jets_AK4(process):
# Based on ``nanoAOD_addDeepInfo``
# in https://github.com/cms-sw/cmssw/blob/master/PhysicsTools/NanoAOD/python/nano_cff.py
Expand All @@ -26,25 +31,59 @@ def update_jets_AK4(process):
'pfDeepFlavourJetTags:probg'
]

from PhysicsTools.PatAlgos.recoLayer0.jetCorrFactors_cfi import patJetCorrFactors
# Note: Safe to always add 'L2L3Residual' as MC contains dummy L2L3Residual corrections (always set to 1)
# (cf. https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookJetEnergyCorrections#CMSSW_7_6_4_and_above )
jetCorrFactorsNano = patJetCorrFactors.clone(src='slimmedJets',
levels = cms.vstring('L1FastJet',
'L2Relative',
'L3Absolute',
'L2L3Residual'),
primaryVertices = cms.InputTag("offlineSlimmedPrimaryVertices"),
)

from PhysicsTools.PatAlgos.producersLayer1.jetUpdater_cfi import updatedPatJets
updatedJets = updatedPatJets.clone(
addBTagInfo=False,
jetSource='slimmedJets',
jetCorrFactorsSource=cms.VInputTag(cms.InputTag("jetCorrFactorsNano") ),
tagInfoSources=["pfDeepCSVTagInfosWithDeepInfo","pfDeepFlavourTagInfosWithDeepInfo"],
addTagInfos=cms.bool(True),
discriminatorSources=_btagDiscriminators,
)

updateJetCollection(
process,
jetSource=cms.InputTag('slimmedJets'),
jetCorrections=('AK4PFchs',
cms.vstring(
['L1FastJet', 'L2Relative', 'L3Absolute',
'L2L3Residual']), 'None'),
#jetSource=cms.InputTag('slimmedJetsPuppi'),
#jetCorrections=('AK4PFPuppi',
# cms.vstring(
# ['L1FastJet', 'L2Relative', 'L3Absolute',
# 'L2L3Residual']), 'None'),
btagDiscriminators=_btagDiscriminators,
postfix='WithDeepInfo',
)
process.load("Configuration.StandardSequences.MagneticField_cff")
process.jetCorrFactorsNano.src = "selectedUpdatedPatJetsWithDeepInfo"
process.updatedJets.jetSource = "selectedUpdatedPatJetsWithDeepInfo"


#process.updatedJetsWithDeepInfo = updatedJets
process.updatedPatJetsTransientCorrectedWithDeepInfo.tagInfoSources.append(cms.InputTag("pfDeepCSVTagInfosWithDeepInfo"))
process.updatedPatJetsTransientCorrectedWithDeepInfo.tagInfoSources.append(cms.InputTag("pfDeepFlavourTagInfosWithDeepInfo"))

#process.updatedJetsWithDeepInfo.tagInfoSources.append(cms.InputTag("pfDeepFlavourTagInfosWithDeepInfo"))

process.updatedPatJetsTransientCorrectedWithDeepInfo.addTagInfos = cms.bool(True)

finalJets = cms.EDFilter("PATJetRefSelector",
src = cms.InputTag("selectedUpdatedPatJetsWithDeepInfo"),
cut = cms.string("pt > 15")
)

return process


Expand Down Expand Up @@ -302,7 +341,7 @@ def add_BTV(process, runOnMC=False, onlyAK4=False, onlyAK8=False, keepInputs=['D
# AK4
process.customJetExtTable = cms.EDProducer(
"SimpleCandidateFlatTableProducer",
src=jetTable.src,
src=cms.InputTag("linkedObjects","jets"),
cut=jetTable.cut,
name=jetTable.name,
doc=jetTable.doc,
Expand All @@ -317,9 +356,46 @@ def add_BTV(process, runOnMC=False, onlyAK4=False, onlyAK8=False, keepInputs=['D
if ('DeepJet' in keepInputs):
if runOnMC == False and storeAK4Truth == "yes":
storeAK4Truth = "no" # data does not have truth information, avoid crashes in producer.
#process.finalJets = finalJets
#process.content = cms.EDAnalyzer("EventContentAnalyzer")

#finalJets = cms.EDFilter("PATJetRefSelector",
# src = cms.InputTag("updatedPatJetsWithDeepInfo"),
# cut = cms.string("pt > 15") # test with -1 to not require sth
#)
#process.finalJets = finalJets


# from PhysicsTools.PatAlgos.recoLayer0.jetCorrFactors_cfi import patJetCorrFactors
# # Note: Safe to always add 'L2L3Residual' as MC contains dummy L2L3Residual corrections (always set to 1)
# # (cf. https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookJetEnergyCorrections#CMSSW_7_6_4_and_above )
# jetCorrFactorsNano = patJetCorrFactors.clone(src='slimmedJets',
# levels = cms.vstring('L1FastJet',
# 'L2Relative',
# 'L3Absolute',
# 'L2L3Residual'),
# primaryVertices = cms.InputTag("offlineSlimmedPrimaryVertices"),
# )

# from PhysicsTools.PatAlgos.producersLayer1.jetUpdater_cfi import updatedPatJets
# updatedJets = updatedPatJets.clone(
# addBTagInfo=False,
# jetSource='slimmedJets',
# jetCorrFactorsSource=cms.VInputTag(cms.InputTag("jetCorrFactorsNano") ),
# )
# finalJets = cms.EDFilter("PATJetRefSelector",
# src = cms.InputTag("updatedJets"),
# cut = cms.string("pt > 15")
# )


process.customAK4ConstituentsForDeepJetTable = cms.EDProducer("PatJetDeepJetTableProducer",
jets = cms.InputTag("finalJets"),
storeAK4Truth = cms.string(storeAK4Truth)
#jets = cms.InputTag("finalJets"),
jets = cms.InputTag("linkedObjects","jets"),
#jets = jetTable.src,
#jets = cms.InputTag("slimmedJets"),
storeAK4Truth = cms.string(storeAK4Truth),
#nameDeepJet = cms.string("JetCHS"),
)


Expand Down Expand Up @@ -376,14 +452,17 @@ def add_BTV(process, runOnMC=False, onlyAK4=False, onlyAK8=False, keepInputs=['D
)

if addAK4:
process.customizeJetTask.add(process.customJetExtTable)
#process.customizeJetTask.add(process.customJetExtTable)
if ('DeepJet' in keepInputs):
#process.customizeJetTask.add(process.content)
#process.customizeJetTask.add(process.updatedJets)
#process.customizeJetTask.add(process.finalJets)
process.customizeJetTask.add(process.customAK4ConstituentsForDeepJetTable)

if addAK8:
process.customizeJetTask.add(process.customFatJetExtTable)
process.customizeJetTask.add(process.customSubJetExtTable)
if runOnMC and addAK8:
process.customizeJetTask.add(process.customSubJetMCExtTable)
if runOnMC:
process.customizeJetTask.add(process.customSubJetMCExtTable)

return process
2 changes: 1 addition & 1 deletion python/addPFCands_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def addPFCands(process, runOnMC=False, allPF = False, onlyAK4=False, onlyAK8=Fal
process.customAK4ConstituentsTable = cms.EDProducer("PatJetConstituentTableProducer",
#candidates = cms.InputTag("packedPFCandidates"),
candidates = candInput,
jets = cms.InputTag("finalJets"),
jets = cms.InputTag("linkedObjects","jets"), # was finalJets before
jet_radius = cms.double(0.4),
name = cms.string("JetPFCands"),
idx_name = cms.string("pFCandsIdx"),
Expand Down
2 changes: 1 addition & 1 deletion python/pfnano_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ def PFnano_customizeData(process):
return process

def PFnano_customizeData_add_DeepJet(process):
addPFCands(process, False)
#addPFCands(process, False)
add_BTV(process, False, keepInputs=['DeepCSV','DeepJet','DDX'])
process.NANOAODSIMoutput.fakeNameForCrab = cms.untracked.bool(True) # needed for crab publication
return process
Expand Down
Loading

0 comments on commit d6e3ef2

Please sign in to comment.