diff --git a/PhysicsTools/NanoAOD/python/electrons_cff.py b/PhysicsTools/NanoAOD/python/electrons_cff.py index 490cabb25c88c..c136e1a88c05a 100644 --- a/PhysicsTools/NanoAOD/python/electrons_cff.py +++ b/PhysicsTools/NanoAOD/python/electrons_cff.py @@ -141,7 +141,7 @@ def _get_bitmapVIDForEle_docstring(modules,WorkingPoints): ######################################ptRatioForEle##################################### ###import from hysicsTools/NanoAOD/pythonElectronJetVarProducer_cfi.py ptRatioRelForEle = cms.EDProducer("ElectronJetVarProducer", - srcJet = cms.InputTag("updatedJets"), + srcJet = cms.InputTag("updatedJetsPuppi"), srcLep = cms.InputTag("slimmedElectrons"), srcVtx = cms.InputTag("offlineSlimmedPrimaryVertices"), ) @@ -559,6 +559,9 @@ def _get_bitmapVIDForEle_docstring(modules,WorkingPoints): ) ##### end TEMPORARY Run3 +# Revert back to AK4 CHS jets for Run 2 +run2_nanoAOD_ANY.toModify(ptRatioRelForEle,srcJet="updatedJets") + #for NANO from reminAOD, no need to run slimmedElectronsUpdated, other modules of electron sequence will run on slimmedElectrons for modifier in run2_miniAOD_80XLegacy,run2_nanoAOD_94XMiniAODv1,run2_nanoAOD_94XMiniAODv2,run2_nanoAOD_94X2016,run2_nanoAOD_102Xv1,run2_nanoAOD_106Xv1: diff --git a/PhysicsTools/NanoAOD/python/jetMC_cff.py b/PhysicsTools/NanoAOD/python/jetMC_cff.py index 6b0ef0203261a..fd9959003b287 100644 --- a/PhysicsTools/NanoAOD/python/jetMC_cff.py +++ b/PhysicsTools/NanoAOD/python/jetMC_cff.py @@ -2,8 +2,8 @@ from PhysicsTools.NanoAOD.nano_eras_cff import * from PhysicsTools.NanoAOD.common_cff import * -from PhysicsTools.NanoAOD.jets_cff import fatJetTable as _fatJetTable -from PhysicsTools.NanoAOD.jets_cff import subJetTable as _subJetTable +from PhysicsTools.NanoAOD.jetsAK8_cff import fatJetTable as _fatJetTable +from PhysicsTools.NanoAOD.jetsAK8_cff import subJetTable as _subJetTable jetMCTable = cms.EDProducer("SimpleCandidateFlatTableProducer", src = cms.InputTag("linkedObjects","jets"), @@ -135,7 +135,6 @@ ### Era dependent customization run2_miniAOD_80XLegacy.toModify( genJetFlavourTable, jetFlavourInfos = cms.InputTag("genJetFlavourAssociation"),) - _jetMCTaskak8 = jetMCTaskak8.copyAndExclude([genSubJetAK8Table]) _jetMC_pre94XTask = jetMCTaskak4.copy() diff --git a/PhysicsTools/NanoAOD/python/jetsAK4_CHS_cff.py b/PhysicsTools/NanoAOD/python/jetsAK4_CHS_cff.py new file mode 100644 index 0000000000000..43c8cbd7304f3 --- /dev/null +++ b/PhysicsTools/NanoAOD/python/jetsAK4_CHS_cff.py @@ -0,0 +1,446 @@ +import FWCore.ParameterSet.Config as cms + +from PhysicsTools.NanoAOD.nano_eras_cff import * +from PhysicsTools.NanoAOD.common_cff import * + +##################### User floats producers, selectors ########################## + +from PhysicsTools.PatAlgos.recoLayer0.jetCorrFactors_cfi import * +# 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 * +updatedJets = updatedPatJets.clone( + addBTagInfo=False, + jetSource='slimmedJets', + jetCorrFactorsSource=cms.VInputTag(cms.InputTag("jetCorrFactorsNano") ), +) + +# +# JetID +# +looseJetId = cms.EDProducer("PatJetIDValueMapProducer", + filterParams=cms.PSet( + version = cms.string('WINTER16'), + quality = cms.string('LOOSE'), + ), + src = cms.InputTag("updatedJets") +) +tightJetId = cms.EDProducer("PatJetIDValueMapProducer", + filterParams=cms.PSet( + version = cms.string('RUN2ULCHS'), + quality = cms.string('TIGHT'), + ), + src = cms.InputTag("updatedJets") +) +tightJetIdLepVeto = cms.EDProducer("PatJetIDValueMapProducer", + filterParams=cms.PSet( + version = cms.string('RUN2ULCHS'), + quality = cms.string('TIGHTLEPVETO'), + ), + src = cms.InputTag("updatedJets") +) +run2_jme_2016.toModify( tightJetId.filterParams, version = "RUN2UL16CHS" ) +run2_jme_2016.toModify( tightJetIdLepVeto.filterParams, version = "RUN2UL16CHS" ) +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: + modifier.toModify( tightJetId.filterParams, version = "WINTER16" ) + modifier.toModify( tightJetIdLepVeto.filterParams, version = "WINTER16" ) +for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2: + modifier.toModify( tightJetId.filterParams, version = "WINTER17" ) + modifier.toModify( tightJetIdLepVeto.filterParams, version = "WINTER17" ) +run2_nanoAOD_102Xv1.toModify( tightJetId.filterParams, version = "SUMMER18" ) +run2_nanoAOD_102Xv1.toModify( tightJetIdLepVeto.filterParams, version = "SUMMER18" ) + +bJetVars = cms.EDProducer("JetRegressionVarProducer", + pvsrc = cms.InputTag("offlineSlimmedPrimaryVertices"), + src = cms.InputTag("updatedJets"), + svsrc = cms.InputTag("slimmedSecondaryVertices"), + gpsrc = cms.InputTag("prunedGenParticles"), + #musrc = cms.InputTag("slimmedMuons"), + #elesrc = cms.InputTag("slimmedElectrons") +) + +jercVars = cms.EDProducer("BetaStarPackedCandidateVarProducer", + srcJet = cms.InputTag("updatedJets"), + srcPF = cms.InputTag("packedPFCandidates"), + maxDR = cms.double(0.4) +) + +updatedJetsWithUserData = cms.EDProducer("PATJetUserDataEmbedder", + src = cms.InputTag("updatedJets"), + userFloats = cms.PSet( + leadTrackPt = cms.InputTag("bJetVars:leadTrackPt"), + leptonPtRel = cms.InputTag("bJetVars:leptonPtRel"), + leptonPtRatio = cms.InputTag("bJetVars:leptonPtRatio"), + leptonPtRelInv = cms.InputTag("bJetVars:leptonPtRelInv"), + leptonPtRelv0 = cms.InputTag("bJetVars:leptonPtRelv0"), + leptonPtRatiov0 = cms.InputTag("bJetVars:leptonPtRatiov0"), + leptonPtRelInvv0 = cms.InputTag("bJetVars:leptonPtRelInvv0"), + leptonDeltaR = cms.InputTag("bJetVars:leptonDeltaR"), + leptonPt = cms.InputTag("bJetVars:leptonPt"), + vtxPt = cms.InputTag("bJetVars:vtxPt"), + vtxMass = cms.InputTag("bJetVars:vtxMass"), + vtx3dL = cms.InputTag("bJetVars:vtx3dL"), + vtx3deL = cms.InputTag("bJetVars:vtx3deL"), + ptD = cms.InputTag("bJetVars:ptD"), + genPtwNu = cms.InputTag("bJetVars:genPtwNu"), + qgl = cms.InputTag('qgtagger:qgLikelihood'), + puIdNanoDisc = cms.InputTag('pileupJetIdNano:fullDiscriminant'), + chFPV0EF = cms.InputTag("jercVars:chargedFromPV0EnergyFraction"), + ), + userInts = cms.PSet( + tightId = cms.InputTag("tightJetId"), + tightIdLepVeto = cms.InputTag("tightJetIdLepVeto"), + vtxNtrk = cms.InputTag("bJetVars:vtxNtrk"), + leptonPdgId = cms.InputTag("bJetVars:leptonPdgId"), + puIdNanoId = cms.InputTag('pileupJetIdNano:fullId'), + ), +) +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: + modifier.toModify(updatedJetsWithUserData.userInts, + looseId = cms.InputTag("looseJetId"), + ) + + +finalJets = cms.EDFilter("PATJetRefSelector", + src = cms.InputTag("updatedJetsWithUserData"), + cut = cms.string("pt > 15") +) + + +##################### Tables for final output and docs ########################## + + +jetTable = cms.EDProducer("SimpleCandidateFlatTableProducer", + src = cms.InputTag("linkedObjects","jets"), + cut = cms.string(""), #we should not filter on cross linked collections + name = cms.string("Jet"), + doc = cms.string("slimmedJets, i.e. ak4 PFJets CHS with JECs applied, after basic selection (" + finalJets.cut.value()+")"), + singleton = cms.bool(False), # the number of entries is variable + extension = cms.bool(False), # this is the main table for the jets + externalVariables = cms.PSet( + bRegCorr = ExtVar(cms.InputTag("bjetNN:corr"),float, doc="pt correction for b-jet energy regression",precision=10), + bRegRes = ExtVar(cms.InputTag("bjetNN:res"),float, doc="res on pt corrected with b-jet regression",precision=6), + cRegCorr = ExtVar(cms.InputTag("cjetNN:corr"),float, doc="pt correction for c-jet energy regression",precision=10), + cRegRes = ExtVar(cms.InputTag("cjetNN:res"),float, doc="res on pt corrected with c-jet regression",precision=6), + ), + variables = cms.PSet(P4Vars, + area = Var("jetArea()", float, doc="jet catchment area, for JECs",precision=10), + nMuons = Var("?hasOverlaps('muons')?overlaps('muons').size():0", int, doc="number of muons in the jet"), + muonIdx1 = Var("?overlaps('muons').size()>0?overlaps('muons')[0].key():-1", int, doc="index of first matching muon"), + muonIdx2 = Var("?overlaps('muons').size()>1?overlaps('muons')[1].key():-1", int, doc="index of second matching muon"), + electronIdx1 = Var("?overlaps('electrons').size()>0?overlaps('electrons')[0].key():-1", int, doc="index of first matching electron"), + electronIdx2 = Var("?overlaps('electrons').size()>1?overlaps('electrons')[1].key():-1", int, doc="index of second matching electron"), + nElectrons = Var("?hasOverlaps('electrons')?overlaps('electrons').size():0", int, doc="number of electrons in the jet"), + btagDeepB = Var("?(bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'))>=0?bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'):-1",float,doc="DeepCSV b+bb tag discriminator",precision=10), + btagDeepFlavB = Var("bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb')",float,doc="DeepJet b+bb+lepb tag discriminator",precision=10), + btagCSVV2 = Var("bDiscriminator('pfCombinedInclusiveSecondaryVertexV2BJetTags')",float,doc=" pfCombinedInclusiveSecondaryVertexV2 b-tag discriminator (aka CSVV2)",precision=10), + btagDeepCvL = Var("?bDiscriminator('pfDeepCSVJetTags:probc')>=0?bDiscriminator('pfDeepCSVJetTags:probc')/(bDiscriminator('pfDeepCSVJetTags:probc')+bDiscriminator('pfDeepCSVJetTags:probudsg')):-1", float,doc="DeepCSV c vs udsg discriminator",precision=10), + btagDeepCvB = Var("?bDiscriminator('pfDeepCSVJetTags:probc')>=0?bDiscriminator('pfDeepCSVJetTags:probc')/(bDiscriminator('pfDeepCSVJetTags:probc')+bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb')):-1",float,doc="DeepCSV c vs b+bb discriminator",precision=10), + btagDeepFlavCvL = Var("?(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probuds')+bDiscriminator('pfDeepFlavourJetTags:probg'))>0?bDiscriminator('pfDeepFlavourJetTags:probc')/(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probuds')+bDiscriminator('pfDeepFlavourJetTags:probg')):-1",float,doc="DeepJet c vs uds+g discriminator",precision=10), + btagDeepFlavCvB = Var("?(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb'))>0?bDiscriminator('pfDeepFlavourJetTags:probc')/(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb')):-1",float,doc="DeepJet c vs b+bb+lepb discriminator",precision=10), + btagDeepFlavQG = Var("?(bDiscriminator('pfDeepFlavourJetTags:probg')+bDiscriminator('pfDeepFlavourJetTags:probuds'))>0?bDiscriminator('pfDeepFlavourJetTags:probg')/(bDiscriminator('pfDeepFlavourJetTags:probg')+bDiscriminator('pfDeepFlavourJetTags:probuds')):-1",float,doc="DeepJet g vs uds discriminator",precision=10), + puIdDisc = Var("userFloat('puIdNanoDisc')", float,doc="Pileup ID discriminant with 106X (2018) training",precision=10), + puId = Var("userInt('puIdNanoId')", int,doc="Pileup ID flags with 106X (2018) training"), + jetId = Var("userInt('tightId')*2+4*userInt('tightIdLepVeto')",int,doc="Jet ID flags bit1 is loose (always false in 2017 since it does not exist), bit2 is tight, bit3 is tightLepVeto"), + qgl = Var("?userFloat('qgl')>0?userFloat('qgl'):-1",float,doc="Quark vs Gluon likelihood discriminator",precision=10), + hfsigmaEtaEta = Var("userFloat('hfJetShowerShape:sigmaEtaEta')",float,doc="sigmaEtaEta for HF jets (noise discriminating variable)",precision=10), + hfsigmaPhiPhi = Var("userFloat('hfJetShowerShape:sigmaPhiPhi')",float,doc="sigmaPhiPhi for HF jets (noise discriminating variable)",precision=10), + hfcentralEtaStripSize = Var("userInt('hfJetShowerShape:centralEtaStripSize')", int, doc="eta size of the central tower strip in HF (noise discriminating variable) "), + hfadjacentEtaStripsSize = Var("userInt('hfJetShowerShape:adjacentEtaStripsSize')", int, doc="eta size of the strips next to the central tower strip in HF (noise discriminating variable) "), + nConstituents = Var("numberOfDaughters()","uint8",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), + muEF = Var("muonEnergyFraction()", float, doc="muon Energy Fraction", precision= 6), + chFPV0EF = Var("userFloat('chFPV0EF')", float, doc="charged fromPV==0 Energy Fraction (energy excluded from CHS jets). Previously called betastar.", precision= 6), + ) +) + +#jets are not as precise as muons +jetTable.variables.pt.precision=10 + +### Era dependent customization +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_102Xv1, run2_nanoAOD_106Xv1: + # Deprecated after 106X + modifier.toModify(jetTable.variables, + btagCMVA = Var("bDiscriminator('pfCombinedMVAV2BJetTags')",float,doc="CMVA V2 btag discriminator",precision=10), + btagDeepC = Var("bDiscriminator('pfDeepCSVJetTags:probc')",float,doc="DeepCSV charm btag discriminator",precision=10), + btagDeepFlavC = Var("bDiscriminator('pfDeepFlavourJetTags:probc')",float,doc="DeepFlavour charm tag discriminator",precision=10), + ) +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: + modifier.toModify( jetTable.variables, jetId = Var("userInt('tightIdLepVeto')*4+userInt('tightId')*2+userInt('looseId')",int,doc="Jet ID flags bit1 is loose, bit2 is tight, bit3 is tightLepVeto")) + +run2_nanoAOD_102Xv1.toModify( jetTable.variables.puIdDisc, doc="Pileup ID discriminant with 102X (2018) training") +run2_nanoAOD_102Xv1.toModify( jetTable.variables, puId = Var("userInt('pileupJetId:fullId')",int,doc="Pileup ID flags for pre-UL trainings")) +(run2_jme_2016 & ~tracker_apv_vfp30_2016 ).toModify( jetTable.variables.puIdDisc, doc="Pileup ID discriminant with 106X (2016) training") +(run2_jme_2016 & ~tracker_apv_vfp30_2016 ).toModify( jetTable.variables.puId, doc="Pileup ID flags with 106X (2016) training") +(run2_jme_2016 & tracker_apv_vfp30_2016 ).toModify( jetTable.variables.puIdDisc, doc="Pileup ID discriminant with 106X (2016APV) training") +(run2_jme_2016 & tracker_apv_vfp30_2016 ).toModify( jetTable.variables.puId, doc="Pileup ID flags with 106X (2016APV) training") +run2_jme_2017.toModify( jetTable.variables.puIdDisc, doc="Pileup ID discriminant with 106X (2017) training") +run2_jme_2017.toModify( jetTable.variables.puId, doc="Pileup ID flags with 106X (2017) training") +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: + modifier.toModify( jetTable.variables, puIdDisc = Var("userFloat('pileupJetId:fullDiscriminant')",float,doc="Pileup ID discriminant with 80X (2016) training",precision=10)) + modifier.toModify( jetTable.variables, puId = Var("userInt('pileupJetId:fullId')",int,doc="Pileup ID flags for pre-UL trainings")) +for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2: + modifier.toModify( jetTable.variables.puIdDisc, doc="Pileup ID discriminant with 94X (2017) training") + modifier.toModify( jetTable.variables, puId = Var("userInt('pileupJetId:fullId')",int,doc="Pileup ID flags for 2016/2017/2018 EOY trainings")) + +bjetNN = cms.EDProducer("BJetEnergyRegressionMVA", + backend = cms.string("ONNX"), + batch_eval = cms.bool(True), + src = cms.InputTag("linkedObjects","jets"), + pvsrc = cms.InputTag("offlineSlimmedPrimaryVertices"), + svsrc = cms.InputTag("slimmedSecondaryVertices"), + rhosrc = cms.InputTag("fixedGridRhoFastjetAll"), + + weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/breg_training_2018.onnx"), + name = cms.string("JetRegNN"), + isClassifier = cms.bool(False), + variablesOrder = cms.vstring(["Jet_pt","Jet_eta","rho","Jet_mt","Jet_leadTrackPt","Jet_leptonPtRel","Jet_leptonDeltaR","Jet_neHEF", + "Jet_neEmEF","Jet_vtxPt","Jet_vtxMass","Jet_vtx3dL","Jet_vtxNtrk","Jet_vtx3deL", + "Jet_numDaughters_pt03","Jet_energyRing_dR0_em_Jet_rawEnergy","Jet_energyRing_dR1_em_Jet_rawEnergy", + "Jet_energyRing_dR2_em_Jet_rawEnergy","Jet_energyRing_dR3_em_Jet_rawEnergy","Jet_energyRing_dR4_em_Jet_rawEnergy", + "Jet_energyRing_dR0_neut_Jet_rawEnergy","Jet_energyRing_dR1_neut_Jet_rawEnergy","Jet_energyRing_dR2_neut_Jet_rawEnergy", + "Jet_energyRing_dR3_neut_Jet_rawEnergy","Jet_energyRing_dR4_neut_Jet_rawEnergy","Jet_energyRing_dR0_ch_Jet_rawEnergy", + "Jet_energyRing_dR1_ch_Jet_rawEnergy","Jet_energyRing_dR2_ch_Jet_rawEnergy","Jet_energyRing_dR3_ch_Jet_rawEnergy", + "Jet_energyRing_dR4_ch_Jet_rawEnergy","Jet_energyRing_dR0_mu_Jet_rawEnergy","Jet_energyRing_dR1_mu_Jet_rawEnergy", + "Jet_energyRing_dR2_mu_Jet_rawEnergy","Jet_energyRing_dR3_mu_Jet_rawEnergy","Jet_energyRing_dR4_mu_Jet_rawEnergy", + "Jet_chHEF","Jet_chEmEF","Jet_leptonPtRelInv","isEle","isMu","isOther","Jet_mass","Jet_ptd"]), + variables = cms.PSet( + Jet_pt = cms.string("pt*jecFactor('Uncorrected')"), + Jet_mt = cms.string("mt*jecFactor('Uncorrected')"), + Jet_eta = cms.string("eta"), + Jet_mass = cms.string("mass*jecFactor('Uncorrected')"), + Jet_ptd = cms.string("userFloat('ptD')"), + Jet_leadTrackPt = cms.string("userFloat('leadTrackPt')"), + Jet_vtxNtrk = cms.string("userInt('vtxNtrk')"), + Jet_vtxMass = cms.string("userFloat('vtxMass')"), + Jet_vtx3dL = cms.string("userFloat('vtx3dL')"), + Jet_vtx3deL = cms.string("userFloat('vtx3deL')"), + Jet_vtxPt = cms.string("userFloat('vtxPt')"), + #Jet_leptonPt = cms.string("userFloat('leptonPt')"), + Jet_leptonPtRel = cms.string("userFloat('leptonPtRelv0')"), + Jet_leptonPtRelInv = cms.string("userFloat('leptonPtRelInvv0')*jecFactor('Uncorrected')"), + Jet_leptonDeltaR = cms.string("userFloat('leptonDeltaR')"), + #Jet_leptonPdgId = cms.string("userInt('leptonPdgId')"), + Jet_neHEF = cms.string("neutralHadronEnergyFraction()"), + Jet_neEmEF = cms.string("neutralEmEnergyFraction()"), + Jet_chHEF = cms.string("chargedHadronEnergyFraction()"), + Jet_chEmEF = cms.string("chargedEmEnergyFraction()"), + isMu = cms.string("?abs(userInt('leptonPdgId'))==13?1:0"), + isEle = cms.string("?abs(userInt('leptonPdgId'))==11?1:0"), + isOther = cms.string("?userInt('leptonPdgId')==0?1:0"), + ), + inputTensorName = cms.string("ffwd_inp:0"), + outputTensorName = cms.string("ffwd_out/BiasAdd:0"), + outputNames = cms.vstring(["corr","res"]), + outputFormulas = cms.vstring(["at(0)*0.27912887930870056+1.0545977354049683","0.5*(at(2)-at(1))*0.27912887930870056"]), +) + +cjetNN = cms.EDProducer("BJetEnergyRegressionMVA", + backend = cms.string("ONNX"), + batch_eval = cms.bool(True), + + src = cms.InputTag("linkedObjects","jets"), + pvsrc = cms.InputTag("offlineSlimmedPrimaryVertices"), + svsrc = cms.InputTag("slimmedSecondaryVertices"), + rhosrc = cms.InputTag("fixedGridRhoFastjetAll"), + + weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/creg_training_2018.onnx"), + name = cms.string("JetRegNN"), + isClassifier = cms.bool(False), + variablesOrder = cms.vstring(["Jet_pt","Jet_eta","rho","Jet_mt","Jet_leadTrackPt","Jet_leptonPtRel","Jet_leptonDeltaR", + "Jet_neHEF","Jet_neEmEF","Jet_vtxPt","Jet_vtxMass","Jet_vtx3dL","Jet_vtxNtrk","Jet_vtx3deL", + "Jet_numDaughters_pt03","Jet_chEmEF","Jet_chHEF", "Jet_ptd","Jet_mass", + "Jet_energyRing_dR0_em_Jet_rawEnergy","Jet_energyRing_dR1_em_Jet_rawEnergy", + "Jet_energyRing_dR2_em_Jet_rawEnergy","Jet_energyRing_dR3_em_Jet_rawEnergy","Jet_energyRing_dR4_em_Jet_rawEnergy", + "Jet_energyRing_dR0_neut_Jet_rawEnergy","Jet_energyRing_dR1_neut_Jet_rawEnergy","Jet_energyRing_dR2_neut_Jet_rawEnergy", + "Jet_energyRing_dR3_neut_Jet_rawEnergy","Jet_energyRing_dR4_neut_Jet_rawEnergy","Jet_energyRing_dR0_ch_Jet_rawEnergy", + "Jet_energyRing_dR1_ch_Jet_rawEnergy","Jet_energyRing_dR2_ch_Jet_rawEnergy","Jet_energyRing_dR3_ch_Jet_rawEnergy", + "Jet_energyRing_dR4_ch_Jet_rawEnergy","Jet_energyRing_dR0_mu_Jet_rawEnergy","Jet_energyRing_dR1_mu_Jet_rawEnergy", + "Jet_energyRing_dR2_mu_Jet_rawEnergy","Jet_energyRing_dR3_mu_Jet_rawEnergy","Jet_energyRing_dR4_mu_Jet_rawEnergy"]), + variables = cms.PSet( + Jet_pt = cms.string("pt*jecFactor('Uncorrected')"), + Jet_mt = cms.string("mt*jecFactor('Uncorrected')"), + Jet_eta = cms.string("eta"), + Jet_mass = cms.string("mass*jecFactor('Uncorrected')"), + Jet_ptd = cms.string("userFloat('ptD')"), + Jet_leadTrackPt = cms.string("userFloat('leadTrackPt')"), + Jet_vtxNtrk = cms.string("userInt('vtxNtrk')"), + Jet_vtxMass = cms.string("userFloat('vtxMass')"), + Jet_vtx3dL = cms.string("userFloat('vtx3dL')"), + Jet_vtx3deL = cms.string("userFloat('vtx3deL')"), + Jet_vtxPt = cms.string("userFloat('vtxPt')"), + #Jet_leptonPt = cms.string("userFloat('leptonPt')"), + Jet_leptonPtRel = cms.string("userFloat('leptonPtRelv0')"), + Jet_leptonPtRelInv = cms.string("userFloat('leptonPtRelInvv0')*jecFactor('Uncorrected')"), + Jet_leptonDeltaR = cms.string("userFloat('leptonDeltaR')"), + #Jet_leptonPdgId = cms.string("userInt('leptonPdgId')"), + Jet_neHEF = cms.string("neutralHadronEnergyFraction()"), + Jet_neEmEF = cms.string("neutralEmEnergyFraction()"), + Jet_chHEF = cms.string("chargedHadronEnergyFraction()"), + Jet_chEmEF = cms.string("chargedEmEnergyFraction()"), + isMu = cms.string("?abs(userInt('leptonPdgId'))==13?1:0"), + isEle = cms.string("?abs(userInt('leptonPdgId'))==11?1:0"), + isOther = cms.string("?userInt('leptonPdgId')==0?1:0"), + ), + inputTensorName = cms.string("ffwd_inp:0"), + outputTensorName = cms.string("ffwd_out/BiasAdd:0"), + outputNames = cms.vstring(["corr","res"]), + outputFormulas = cms.vstring(["at(0)*0.24325256049633026+0.993854820728302","0.5*(at(2)-at(1))*0.24325256049633026"]), +) + + +run2_jme_2016.toModify( bjetNN, weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/breg_training_2016.onnx") ) +run2_jme_2016.toModify( bjetNN,outputFormulas = cms.vstring(["at(0)*0.31976690888404846+1.047176718711853","0.5*(at(2)-at(1))*0.31976690888404846"])) + +run2_jme_2017.toModify( bjetNN, weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/breg_training_2017.onnx") ) +run2_jme_2017.toModify( bjetNN,outputFormulas = cms.vstring(["at(0)*0.28225210309028625+1.055067777633667","0.5*(at(2)-at(1))*0.28225210309028625"])) + +run2_jme_2016.toModify( cjetNN, weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/creg_training_2016.onnx") ) +run2_jme_2016.toModify( cjetNN,outputFormulas = cms.vstring(["at(0)*0.28862622380256653+0.9908722639083862","0.5*(at(2)-at(1))*0.28862622380256653"])) + +run2_jme_2017.toModify( cjetNN, weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/creg_training_2017.onnx") ) +run2_jme_2017.toModify( cjetNN,outputFormulas = cms.vstring(["at(0)*0.24718524515628815+0.9927206635475159","0.5*(at(2)-at(1))*0.24718524515628815"])) + + +# +# Quark-Gluon Likelihood (QGL) +# +from RecoJets.JetProducers.QGTagger_cfi import QGTagger +qgtagger=QGTagger.clone(srcJets="updatedJets",srcVertexCollection="offlineSlimmedPrimaryVertices") + +# +# PileUp ID +# +from RecoJets.JetProducers.PileupJetID_cfi import pileupJetId, _chsalgos_94x, _chsalgos_102x, _chsalgos_106X_UL16, _chsalgos_106X_UL16APV, _chsalgos_106X_UL17, _chsalgos_106X_UL18 +pileupJetIdNano=pileupJetId.clone(jets="updatedJets",algos = cms.VPSet(_chsalgos_106X_UL18),inputIsCorrected=True,applyJec=False,vertexes="offlineSlimmedPrimaryVertices") +run2_jme_2017.toModify(pileupJetIdNano, algos = _chsalgos_106X_UL17) +(run2_jme_2016 & ~tracker_apv_vfp30_2016 ).toModify(pileupJetIdNano, algos = _chsalgos_106X_UL16) +(run2_jme_2016 & tracker_apv_vfp30_2016 ).toModify(pileupJetIdNano, algos = _chsalgos_106X_UL16APV) +run2_nanoAOD_102Xv1.toModify(pileupJetIdNano, algos = _chsalgos_102x) +for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2: + modifier.toModify(pileupJetIdNano, algos = _chsalgos_94x) + +############################################################## +## DeepInfoAK4CHS:Start +## - To be used in nanoAOD_customizeCommon() in nano_cff.py +############################################################### +from PhysicsTools.PatAlgos.tools.jetTools import updateJetCollection +def nanoAOD_addDeepInfoAK4CHS(process,addDeepBTag,addDeepFlavour): + _btagDiscriminators=[] + if addDeepBTag: + print("Updating process to run DeepCSV btag") + _btagDiscriminators += ['pfDeepCSVJetTags:probb','pfDeepCSVJetTags:probbb','pfDeepCSVJetTags:probc'] + if addDeepFlavour: + print("Updating process to run DeepFlavour btag") + _btagDiscriminators += ['pfDeepFlavourJetTags:probb','pfDeepFlavourJetTags:probbb','pfDeepFlavourJetTags:problepb','pfDeepFlavourJetTags:probc'] + if len(_btagDiscriminators)==0: return process + print("Will recalculate the following discriminators: "+", ".join(_btagDiscriminators)) + updateJetCollection( + process, + jetSource = cms.InputTag('slimmedJets'), + jetCorrections = ('AK4PFchs', 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" + return process + +nanoAOD_addDeepInfoAK4CHS_switch = cms.PSet( + nanoAOD_addDeepBTag_switch = cms.untracked.bool(False), + nanoAOD_addDeepFlavourTag_switch = cms.untracked.bool(False), +) +run2_miniAOD_80XLegacy.toModify(nanoAOD_addDeepInfoAK4CHS_switch, nanoAOD_addDeepBTag_switch = cms.untracked.bool(True)) +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2: + modifier.toModify(nanoAOD_addDeepInfoAK4CHS_switch, nanoAOD_addDeepFlavourTag_switch = cms.untracked.bool(True)) +################################################ +## DeepInfoAK4CHS:End +################################################# + +################################################################################ +# JETS FOR MET type1 +################################################################################ +basicJetsForMetForT1METNano = cms.EDProducer("PATJetCleanerForType1MET", + src = updatedJetsWithUserData.src, + jetCorrEtaMax = cms.double(9.9), + jetCorrLabel = cms.InputTag("L3Absolute"), + jetCorrLabelRes = cms.InputTag("L2L3Residual"), + offsetCorrLabel = cms.InputTag("L1FastJet"), + skipEM = cms.bool(False), + skipEMfractionThreshold = cms.double(0.9), + skipMuonSelection = cms.string('isGlobalMuon | isStandAloneMuon'), + skipMuons = cms.bool(True), + type1JetPtThreshold = cms.double(0.0), + calcMuonSubtrRawPtAsValueMap = cms.bool(True) +) + +updatedJetsWithUserData.userFloats.muonSubtrRawPt = cms.InputTag("basicJetsForMetForT1METNano:MuonSubtrRawPt") + +corrT1METJetTable = cms.EDProducer("SimpleCandidateFlatTableProducer", + src = finalJets.src, + cut = cms.string("pt<15 && abs(eta)<9.9"), + name = cms.string("CorrT1METJet"), + doc = cms.string("Additional low-pt ak4 CHS jets for Type-1 MET re-correction"), + 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( + rawPt = Var("pt()*jecFactor('Uncorrected')",float,precision=10), + eta = Var("eta", float,precision=12), + phi = Var("phi", float, precision=12), + area = Var("jetArea()", float, doc="jet catchment area, for JECs",precision=10), + ) +) + +corrT1METJetTable.variables.muonSubtrFactor = Var("1-userFloat('muonSubtrRawPt')/(pt()*jecFactor('Uncorrected'))",float,doc="1-(muon-subtracted raw pt)/(raw pt)",precision=6) +jetTable.variables.muonSubtrFactor = Var("1-userFloat('muonSubtrRawPt')/(pt()*jecFactor('Uncorrected'))",float,doc="1-(muon-subtracted raw pt)/(raw pt)",precision=6) + +jetForMETTask = cms.Task(basicJetsForMetForT1METNano,corrT1METJetTable) + +#before cross linking +jetUserDataTask = cms.Task(bJetVars,qgtagger,jercVars,tightJetId,tightJetIdLepVeto,pileupJetIdNano) + +# +# HF shower shape recomputation +# Only run if needed (i.e. if default MINIAOD info is missing or outdated because of new JECs...) +# +from RecoJets.JetProducers.hfJetShowerShape_cfi import hfJetShowerShape +hfJetShowerShapeforNanoAOD = hfJetShowerShape.clone(jets="updatedJets",vertices="offlineSlimmedPrimaryVertices") +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_102Xv1, run2_nanoAOD_106Xv1: + modifier.toModify(updatedJetsWithUserData.userFloats, + hfsigmaEtaEta = cms.InputTag('hfJetShowerShapeforNanoAOD:sigmaEtaEta'), + hfsigmaPhiPhi = cms.InputTag('hfJetShowerShapeforNanoAOD:sigmaPhiPhi'), + ) + modifier.toModify(updatedJetsWithUserData.userInts, + hfcentralEtaStripSize = cms.InputTag('hfJetShowerShapeforNanoAOD:centralEtaStripSize'), + hfadjacentEtaStripsSize = cms.InputTag('hfJetShowerShapeforNanoAOD:adjacentEtaStripsSize'), + ) + modifier.toModify(jetTable.variables, hfsigmaEtaEta = Var("userFloat('hfsigmaEtaEta')",float,doc="sigmaEtaEta for HF jets (noise discriminating variable)",precision=10)) + modifier.toModify(jetTable.variables, hfsigmaPhiPhi = Var("userFloat('hfsigmaPhiPhi')",float,doc="sigmaPhiPhi for HF jets (noise discriminating variable)",precision=10)) + modifier.toModify(jetTable.variables, hfcentralEtaStripSize = Var("userInt('hfcentralEtaStripSize')", int, doc="eta size of the central tower strip in HF (noise discriminating variable)")) + modifier.toModify(jetTable.variables, hfadjacentEtaStripsSize = Var("userInt('hfadjacentEtaStripsSize')", int, doc="eta size of the strips next to the central tower strip in HF (noise discriminating variable)")) + modifier.toModify(jetUserDataTask, jetUserDataTask.add(hfJetShowerShapeforNanoAOD)) + +_jetUserDataTask2016 = jetUserDataTask.copy() +_jetUserDataTask2016.add(looseJetId) + +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: + modifier.toReplaceWith(jetUserDataTask,_jetUserDataTask2016) + +#before cross linking +jetTask = cms.Task(jetCorrFactorsNano,updatedJets,jetUserDataTask,updatedJetsWithUserData,finalJets) + +#after cross linkining +jetTablesTask = cms.Task(bjetNN,cjetNN,jetTable) diff --git a/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py b/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py new file mode 100644 index 0000000000000..852611a726f08 --- /dev/null +++ b/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py @@ -0,0 +1,155 @@ +import FWCore.ParameterSet.Config as cms + +from PhysicsTools.NanoAOD.nano_eras_cff import * +from PhysicsTools.NanoAOD.common_cff import * + +##################### User floats producers, selectors ########################## + +from PhysicsTools.PatAlgos.recoLayer0.jetCorrFactors_cfi import * +# 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 ) +jetPuppiCorrFactorsNano = patJetCorrFactors.clone(src='slimmedJetsPuppi', + levels = cms.vstring('L1FastJet', + 'L2Relative', + 'L3Absolute', + 'L2L3Residual'), + payload = cms.string('AK4PFPuppi'), + primaryVertices = cms.InputTag("offlineSlimmedPrimaryVertices"), +) + +from PhysicsTools.PatAlgos.producersLayer1.jetUpdater_cfi import * + +updatedJetsPuppi = updatedPatJets.clone( + addBTagInfo=False, + jetSource='slimmedJetsPuppi', + jetCorrFactorsSource=cms.VInputTag(cms.InputTag("jetPuppiCorrFactorsNano") ), +) + +tightJetPuppiId = cms.EDProducer("PatJetIDValueMapProducer", + filterParams=cms.PSet( + version = cms.string('RUN2ULPUPPI'), + quality = cms.string('TIGHT'), + ), + src = cms.InputTag("updatedJetsPuppi") +) +tightJetPuppiIdLepVeto = cms.EDProducer("PatJetIDValueMapProducer", + filterParams=cms.PSet( + version = cms.string('RUN2ULPUPPI'), + quality = cms.string('TIGHTLEPVETO'), + ), + src = cms.InputTag("updatedJetsPuppi") +) + +#HF shower shape recomputation +from RecoJets.JetProducers.hfJetShowerShape_cfi import hfJetShowerShape +hfJetPuppiShowerShapeforNanoAOD = hfJetShowerShape.clone(jets="updatedJetsPuppi",vertices="offlineSlimmedPrimaryVertices") + +updatedJetsPuppiWithUserData = cms.EDProducer("PATJetUserDataEmbedder", + src = cms.InputTag("updatedJetsPuppi"), + userFloats = cms.PSet( + hfsigmaEtaEta = cms.InputTag('hfJetPuppiShowerShapeforNanoAOD:sigmaEtaEta'), + hfsigmaPhiPhi = cms.InputTag('hfJetPuppiShowerShapeforNanoAOD:sigmaPhiPhi'), + ), + userInts = cms.PSet( + tightId = cms.InputTag("tightJetPuppiId"), + tightIdLepVeto = cms.InputTag("tightJetPuppiIdLepVeto"), + hfcentralEtaStripSize = cms.InputTag('hfJetPuppiShowerShapeforNanoAOD:centralEtaStripSize'), + hfadjacentEtaStripsSize = cms.InputTag('hfJetPuppiShowerShapeforNanoAOD:adjacentEtaStripsSize'), + ), +) + +finalJetsPuppi = cms.EDFilter("PATJetRefSelector", + src = cms.InputTag("updatedJetsPuppiWithUserData"), + cut = cms.string("pt > 15") +) + +##################### Tables for final output and docs ########################## +jetPuppiTable = cms.EDProducer("SimpleCandidateFlatTableProducer", + src = cms.InputTag("linkedObjects","jets"), + cut = cms.string(""), #we should not filter on cross linked collections + name = cms.string("Jet"), + doc = cms.string("slimmedJetsPuppi, i.e. ak4 PFJets Puppi with JECs applied, after basic selection (" + finalJetsPuppi.cut.value()+")"), + singleton = cms.bool(False), # the number of entries is variable + extension = cms.bool(False), # this is the main table for the jets + externalVariables = cms.PSet(), + variables = cms.PSet(P4Vars, + area = Var("jetArea()", float, doc="jet catchment area, for JECs",precision=10), + nMuons = Var("?hasOverlaps('muons')?overlaps('muons').size():0", int, doc="number of muons in the jet"), + muonIdx1 = Var("?overlaps('muons').size()>0?overlaps('muons')[0].key():-1", int, doc="index of first matching muon"), + muonIdx2 = Var("?overlaps('muons').size()>1?overlaps('muons')[1].key():-1", int, doc="index of second matching muon"), + electronIdx1 = Var("?overlaps('electrons').size()>0?overlaps('electrons')[0].key():-1", int, doc="index of first matching electron"), + electronIdx2 = Var("?overlaps('electrons').size()>1?overlaps('electrons')[1].key():-1", int, doc="index of second matching electron"), + nElectrons = Var("?hasOverlaps('electrons')?overlaps('electrons').size():0", int, doc="number of electrons in the jet"), + btagDeepB = Var("?(bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'))>=0?bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'):-1",float,doc="DeepCSV b+bb tag discriminator",precision=10), + btagDeepFlavB = Var("bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb')",float,doc="DeepJet b+bb+lepb tag discriminator",precision=10), + btagCSVV2 = Var("bDiscriminator('pfCombinedInclusiveSecondaryVertexV2BJetTags')",float,doc=" pfCombinedInclusiveSecondaryVertexV2 b-tag discriminator (aka CSVV2)",precision=10), + btagDeepCvL = Var("?bDiscriminator('pfDeepCSVJetTags:probc')>=0?bDiscriminator('pfDeepCSVJetTags:probc')/(bDiscriminator('pfDeepCSVJetTags:probc')+bDiscriminator('pfDeepCSVJetTags:probudsg')):-1", float,doc="DeepCSV c vs udsg discriminator",precision=10), + btagDeepCvB = Var("?bDiscriminator('pfDeepCSVJetTags:probc')>=0?bDiscriminator('pfDeepCSVJetTags:probc')/(bDiscriminator('pfDeepCSVJetTags:probc')+bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb')):-1",float,doc="DeepCSV c vs b+bb discriminator",precision=10), + btagDeepFlavCvL = Var("?(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probuds')+bDiscriminator('pfDeepFlavourJetTags:probg'))>0?bDiscriminator('pfDeepFlavourJetTags:probc')/(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probuds')+bDiscriminator('pfDeepFlavourJetTags:probg')):-1",float,doc="DeepJet c vs uds+g discriminator",precision=10), + btagDeepFlavCvB = Var("?(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb'))>0?bDiscriminator('pfDeepFlavourJetTags:probc')/(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb')):-1",float,doc="DeepJet c vs b+bb+lepb discriminator",precision=10), + btagDeepFlavQG = Var("?(bDiscriminator('pfDeepFlavourJetTags:probg')+bDiscriminator('pfDeepFlavourJetTags:probuds'))>0?bDiscriminator('pfDeepFlavourJetTags:probg')/(bDiscriminator('pfDeepFlavourJetTags:probg')+bDiscriminator('pfDeepFlavourJetTags:probuds')):-1",float,doc="DeepJet g vs uds discriminator",precision=10), + jetId = Var("userInt('tightId')*2+4*userInt('tightIdLepVeto')",int,doc="Jet ID flag: bit2 is tight, bit3 is tightLepVeto"), + hfsigmaEtaEta = Var("userFloat('hfsigmaEtaEta')",float,doc="sigmaEtaEta for HF jets (noise discriminating variable)",precision=10), + hfsigmaPhiPhi = Var("userFloat('hfsigmaPhiPhi')",float,doc="sigmaPhiPhi for HF jets (noise discriminating variable)",precision=10), + hfcentralEtaStripSize = Var("userInt('hfcentralEtaStripSize')", int, doc="eta size of the central tower strip in HF (noise discriminating variable)"), + hfadjacentEtaStripsSize = Var("userInt('hfadjacentEtaStripsSize')", int, doc="eta size of the strips next to the central tower strip in HF (noise discriminating variable)"), + nConstituents = Var("numberOfDaughters()","uint8",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), + muEF = Var("muonEnergyFraction()", float, doc="muon Energy Fraction", precision= 6), + ) +) + +#jets are not as precise as muons +jetPuppiTable.variables.pt.precision=10 + +################################################################################ +# JETS FOR MET type1 +################################################################################ +basicJetsPuppiForMetForT1METNano = cms.EDProducer("PATJetCleanerForType1MET", + src = updatedJetsPuppiWithUserData.src, + jetCorrEtaMax = cms.double(9.9), + jetCorrLabel = cms.InputTag("L3Absolute"), + jetCorrLabelRes = cms.InputTag("L2L3Residual"), + offsetCorrLabel = cms.InputTag("L1FastJet"), + skipEM = cms.bool(False), + skipEMfractionThreshold = cms.double(0.9), + skipMuonSelection = cms.string('isGlobalMuon | isStandAloneMuon'), + skipMuons = cms.bool(True), + type1JetPtThreshold = cms.double(0.0), + calcMuonSubtrRawPtAsValueMap = cms.bool(True) +) + +updatedJetsPuppiWithUserData.userFloats.muonSubtrRawPt = cms.InputTag("basicJetsPuppiForMetForT1METNano:MuonSubtrRawPt") + +corrT1METJetPuppiTable = cms.EDProducer("SimpleCandidateFlatTableProducer", + src = finalJetsPuppi.src, + cut = cms.string("pt<15 && abs(eta)<9.9"), + name = cms.string("CorrT1METJet"), + doc = cms.string("Additional low-pt ak4 Puppi jets for Type-1 MET re-correction"), + 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( + rawPt = Var("pt()*jecFactor('Uncorrected')",float,precision=10), + eta = Var("eta", float,precision=12), + phi = Var("phi", float, precision=12), + area = Var("jetArea()", float, doc="jet catchment area, for JECs",precision=10), + ) +) + +corrT1METJetPuppiTable.variables.muonSubtrFactor = Var("1-userFloat('muonSubtrRawPt')/(pt()*jecFactor('Uncorrected'))",float,doc="1-(muon-subtracted raw pt)/(raw pt)",precision=6) +jetPuppiTable.variables.muonSubtrFactor = Var("1-userFloat('muonSubtrRawPt')/(pt()*jecFactor('Uncorrected'))",float,doc="1-(muon-subtracted raw pt)/(raw pt)",precision=6) + +jetPuppiForMETTask = cms.Task(basicJetsPuppiForMetForT1METNano,corrT1METJetPuppiTable) + +#before cross linking +jetPuppiUserDataTask = cms.Task(tightJetPuppiId, tightJetPuppiIdLepVeto, hfJetPuppiShowerShapeforNanoAOD) + +#before cross linking +jetPuppiTask = cms.Task(jetPuppiCorrFactorsNano,updatedJetsPuppi,jetPuppiUserDataTask,updatedJetsPuppiWithUserData,finalJetsPuppi) + +#after cross linkining +jetPuppiTablesTask = cms.Task(jetPuppiTable) diff --git a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py new file mode 100644 index 0000000000000..e82c8d8a553d2 --- /dev/null +++ b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py @@ -0,0 +1,317 @@ +import FWCore.ParameterSet.Config as cms + +from PhysicsTools.NanoAOD.nano_eras_cff import * +from PhysicsTools.NanoAOD.common_cff import * + +from PhysicsTools.PatAlgos.recoLayer0.jetCorrFactors_cfi import * +# 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 ) +jetCorrFactorsAK8 = patJetCorrFactors.clone(src='slimmedJetsAK8', + levels = cms.vstring('L1FastJet', + 'L2Relative', + 'L3Absolute', + 'L2L3Residual'), + payload = cms.string('AK8PFPuppi'), + primaryVertices = cms.InputTag("offlineSlimmedPrimaryVertices"), +) +run2_miniAOD_80XLegacy.toModify(jetCorrFactorsAK8, payload = cms.string('AK8PFchs')) # ak8PFJetsCHS in 2016 80X miniAOD + +from PhysicsTools.PatAlgos.producersLayer1.jetUpdater_cfi import * +updatedJetsAK8 = updatedPatJets.clone( + addBTagInfo=False, + jetSource='slimmedJetsAK8', + jetCorrFactorsSource=cms.VInputTag(cms.InputTag("jetCorrFactorsAK8") ), +) + +# +# JetID +# +looseJetIdAK8 = cms.EDProducer("PatJetIDValueMapProducer", + filterParams=cms.PSet( + version = cms.string('WINTER16'), + quality = cms.string('LOOSE'), + ), + src = cms.InputTag("updatedJetsAK8") +) +tightJetIdAK8 = cms.EDProducer("PatJetIDValueMapProducer", + filterParams=cms.PSet( + version = cms.string('RUN2ULPUPPI'), + quality = cms.string('TIGHT'), + ), + src = cms.InputTag("updatedJetsAK8") +) +tightJetIdLepVetoAK8 = cms.EDProducer("PatJetIDValueMapProducer", + filterParams=cms.PSet( + version = cms.string('RUN2ULPUPPI'), + quality = cms.string('TIGHTLEPVETO'), + ), + src = cms.InputTag("updatedJetsAK8") +) + +run2_jme_2016.toModify( tightJetIdAK8.filterParams, version = "RUN2UL16PUPPI" ) +run2_jme_2016.toModify( tightJetIdLepVetoAK8.filterParams, version = "RUN2UL16PUPPI" ) +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: + modifier.toModify( tightJetIdAK8.filterParams, version = "WINTER16" ) + modifier.toModify( tightJetIdLepVetoAK8.filterParams, version = "WINTER16" ) +for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2: + modifier.toModify( tightJetIdAK8.filterParams, version = "WINTER17PUPPI" ) + modifier.toModify( tightJetIdLepVetoAK8.filterParams, version = "WINTER17PUPPI" ) +run2_nanoAOD_102Xv1.toModify( tightJetIdAK8.filterParams, version = "SUMMER18PUPPI" ) +run2_nanoAOD_102Xv1.toModify( tightJetIdLepVetoAK8.filterParams, version = "SUMMER18PUPPI" ) + +updatedJetsAK8WithUserData = cms.EDProducer("PATJetUserDataEmbedder", + src = cms.InputTag("updatedJetsAK8"), + userFloats = cms.PSet(), + userInts = cms.PSet( + tightId = cms.InputTag("tightJetIdAK8"), + tightIdLepVeto = cms.InputTag("tightJetIdLepVetoAK8"), + ), +) +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: + modifier.toModify(updatedJetsAK8WithUserData.userInts, + looseId = cms.InputTag("looseJetIdAK8"), + ) + + +finalJetsAK8 = cms.EDFilter("PATJetRefSelector", + src = cms.InputTag("updatedJetsAK8WithUserData"), + cut = cms.string("pt > 170") +) + + +lepInAK8JetVars = cms.EDProducer("LepInJetProducer", + src = cms.InputTag("updatedJetsAK8WithUserData"), + srcEle = cms.InputTag("finalElectrons"), + srcMu = cms.InputTag("finalMuons") +) + +fatJetTable = cms.EDProducer("SimpleCandidateFlatTableProducer", + 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+4*userInt('tightIdLepVeto')",int,doc="Jet ID flags bit1 is loose (always false in 2017 since it does not exist), bit2 is tight, bit3 is tightLepVeto"), + area = Var("jetArea()", float, doc="jet catchment area, for JECs",precision=10), + rawFactor = Var("1.-jecFactor('Uncorrected')",float,doc="1 - Factor to get back to raw pT",precision=6), + 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("?hasUserFloat('nb1AK8PuppiSoftDrop:ecfN2')?userFloat('nb1AK8PuppiSoftDrop:ecfN2'):-99999.", float, doc="N2 with beta=1 (for jets with raw pT>250 GeV)", precision=10), + n3b1 = Var("?hasUserFloat('nb1AK8PuppiSoftDrop:ecfN3')?userFloat('nb1AK8PuppiSoftDrop:ecfN3'):-99999.", float, doc="N3 with beta=1 (for jets with raw pT>250 GeV)", precision=10), + msoftdrop = Var("groomedMass('SoftDropPuppi')",float, doc="Corrected soft drop mass with PUPPI",precision=10), + btagDeepB = Var("?(bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'))>=0?bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'):-1",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), + btagDDBvLV2 = Var("bDiscriminator('pfMassIndependentDeepDoubleBvLV2JetTags:probHbb')",float,doc="DeepDoubleX V2(mass-decorrelated) discriminator for H(Z)->bb vs QCD",precision=10), + btagDDCvLV2 = Var("bDiscriminator('pfMassIndependentDeepDoubleCvLV2JetTags:probHcc')",float,doc="DeepDoubleX V2 (mass-decorrelated) discriminator for H(Z)->cc vs QCD",precision=10), + btagDDCvBV2 = Var("bDiscriminator('pfMassIndependentDeepDoubleCvBV2JetTags:probHcc')",float,doc="DeepDoubleX V2 (mass-decorrelated) discriminator for H(Z)->cc vs H(Z)->bb",precision=10), + deepTag_TvsQCD = Var("bDiscriminator('pfDeepBoostedDiscriminatorsJetTags:TvsQCD')",float,doc="DeepBoostedJet tagger top vs QCD discriminator",precision=10), + deepTag_WvsQCD = Var("bDiscriminator('pfDeepBoostedDiscriminatorsJetTags:WvsQCD')",float,doc="DeepBoostedJet tagger W vs QCD discriminator",precision=10), + deepTag_ZvsQCD = Var("bDiscriminator('pfDeepBoostedDiscriminatorsJetTags:ZvsQCD')",float,doc="DeepBoostedJet tagger Z vs QCD discriminator",precision=10), + deepTag_H = Var("bDiscriminator('pfDeepBoostedJetTags:probHbb')+bDiscriminator('pfDeepBoostedJetTags:probHcc')+bDiscriminator('pfDeepBoostedJetTags:probHqqqq')",float,doc="DeepBoostedJet tagger H(bb,cc,4q) sum",precision=10), + deepTag_QCD = Var("bDiscriminator('pfDeepBoostedJetTags:probQCDbb')+bDiscriminator('pfDeepBoostedJetTags:probQCDcc')+bDiscriminator('pfDeepBoostedJetTags:probQCDb')+bDiscriminator('pfDeepBoostedJetTags:probQCDc')+bDiscriminator('pfDeepBoostedJetTags:probQCDothers')",float,doc="DeepBoostedJet tagger QCD(bb,cc,b,c,others) sum",precision=10), + deepTag_QCDothers = Var("bDiscriminator('pfDeepBoostedJetTags:probQCDothers')",float,doc="DeepBoostedJet tagger QCDothers value",precision=10), + deepTagMD_TvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:TvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger top vs QCD discriminator",precision=10), + deepTagMD_WvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:WvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger W vs QCD discriminator",precision=10), + deepTagMD_ZvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ZvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z vs QCD discriminator",precision=10), + deepTagMD_ZHbbvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ZHbbvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z/H->bb vs QCD discriminator",precision=10), + deepTagMD_ZbbvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ZbbvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z->bb vs QCD discriminator",precision=10), + deepTagMD_HbbvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:HbbvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger H->bb vs QCD discriminator",precision=10), + deepTagMD_ZHccvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ZHccvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z/H->cc vs QCD discriminator",precision=10), + deepTagMD_H4qvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:H4qvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger H->4q vs QCD discriminator",precision=10), + deepTagMD_bbvsLight = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:bbvsLight')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z/H/gluon->bb vs light flavour discriminator",precision=10), + deepTagMD_ccvsLight = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ccvsLight')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z/H/gluon->cc vs light flavour discriminator",precision=10), + particleNet_TvsQCD = Var("bDiscriminator('pfParticleNetDiscriminatorsJetTags:TvsQCD')",float,doc="ParticleNet tagger top vs QCD discriminator",precision=10), + particleNet_WvsQCD = Var("bDiscriminator('pfParticleNetDiscriminatorsJetTags:WvsQCD')",float,doc="ParticleNet tagger W vs QCD discriminator",precision=10), + particleNet_ZvsQCD = Var("bDiscriminator('pfParticleNetDiscriminatorsJetTags:ZvsQCD')",float,doc="ParticleNet tagger Z vs QCD discriminator",precision=10), + particleNet_HbbvsQCD = Var("bDiscriminator('pfParticleNetDiscriminatorsJetTags:HbbvsQCD')",float,doc="ParticleNet tagger H(->bb) vs QCD discriminator",precision=10), + particleNet_HccvsQCD = Var("bDiscriminator('pfParticleNetDiscriminatorsJetTags:HccvsQCD')",float,doc="ParticleNet tagger H(->cc) vs QCD discriminator",precision=10), + particleNet_H4qvsQCD = Var("bDiscriminator('pfParticleNetDiscriminatorsJetTags:H4qvsQCD')",float,doc="ParticleNet tagger H(->VV->qqqq) vs QCD discriminator",precision=10), + particleNet_QCD = Var("bDiscriminator('pfParticleNetJetTags:probQCDbb')+bDiscriminator('pfParticleNetJetTags:probQCDcc')+bDiscriminator('pfParticleNetJetTags:probQCDb')+bDiscriminator('pfParticleNetJetTags:probQCDc')+bDiscriminator('pfParticleNetJetTags:probQCDothers')",float,doc="ParticleNet tagger QCD(bb,cc,b,c,others) sum",precision=10), + particleNet_mass = Var("bDiscriminator('pfParticleNetMassRegressionJetTags:mass')",float,doc="ParticleNet mass regression",precision=10), + particleNetMD_Xbb = Var("bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probXbb')",float,doc="Mass-decorrelated ParticleNet tagger raw X->bb score. For X->bb vs QCD tagging, use Xbb/(Xbb+QCD)",precision=10), + particleNetMD_Xcc = Var("bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probXcc')",float,doc="Mass-decorrelated ParticleNet tagger raw X->cc score. For X->cc vs QCD tagging, use Xcc/(Xcc+QCD)",precision=10), + particleNetMD_Xqq = Var("bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probXqq')",float,doc="Mass-decorrelated ParticleNet tagger raw X->qq (uds) score. For X->qq vs QCD tagging, use Xqq/(Xqq+QCD). For W vs QCD tagging, use (Xcc+Xqq)/(Xcc+Xqq+QCD)",precision=10), + particleNetMD_QCD = Var("bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probQCDbb')+bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probQCDcc')+bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probQCDb')+bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probQCDc')+bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probQCDothers')",float,doc="Mass-decorrelated ParticleNet tagger raw QCD score",precision=10), + subJetIdx1 = Var("?nSubjetCollections()>0 && subjets('SoftDropPuppi').size()>0?subjets('SoftDropPuppi')[0].key():-1", int, + doc="index of first subjet"), + subJetIdx2 = Var("?nSubjetCollections()>0 && subjets('SoftDropPuppi').size()>1?subjets('SoftDropPuppi')[1].key():-1", int, + doc="index of second subjet"), + nConstituents = Var("numberOfDaughters()","uint8",doc="Number of particles in the jet"), + ), + externalVariables = cms.PSet( + lsf3 = ExtVar(cms.InputTag("lepInAK8JetVars:lsf3"),float, doc="Lepton Subjet Fraction (3 subjets)",precision=10), + muonIdx3SJ = ExtVar(cms.InputTag("lepInAK8JetVars:muIdx3SJ"),int, doc="index of muon matched to jet"), + electronIdx3SJ = ExtVar(cms.InputTag("lepInAK8JetVars:eleIdx3SJ"),int,doc="index of electron matched to jet"), + ) +) + +### Era dependent customization +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_102Xv1, run2_nanoAOD_106Xv1: + modifier.toModify( fatJetTable.variables.n2b1, expr = cms.string("userFloat('ak8PFJetsPuppiSoftDropValueMap:nb1AK8PuppiSoftDropN2')"),) + modifier.toModify( fatJetTable.variables.n3b1, expr = cms.string("userFloat('ak8PFJetsPuppiSoftDropValueMap:nb1AK8PuppiSoftDropN3')"),) + # Deprecated after 106X + modifier.toModify( fatJetTable.variables, + btagCMVA = Var("bDiscriminator('pfCombinedMVAV2BJetTags')",float,doc="CMVA V2 btag discriminator",precision=10), + btagDDBvL_noMD = Var("bDiscriminator('pfDeepDoubleBvLJetTags:probHbb')",float,doc="DeepDoubleX discriminator (no mass-decorrelation) for H(Z)->bb vs QCD",precision=10), + btagDDCvL_noMD = Var("bDiscriminator('pfDeepDoubleCvLJetTags:probHcc')",float,doc="DeepDoubleX discriminator (no mass-decorrelation) for H(Z)->cc vs QCD",precision=10), + btagDDCvB_noMD = Var("bDiscriminator('pfDeepDoubleCvBJetTags:probHcc')",float,doc="DeepDoubleX discriminator (no mass-decorrelation) for H(Z)->cc vs H(Z)->bb",precision=10), + btagDDBvL = Var("bDiscriminator('pfMassIndependentDeepDoubleBvLJetTags:probHbb')",float,doc="DeepDoubleX (mass-decorrelated) discriminator for H(Z)->bb vs QCD",precision=10), + btagDDCvL = Var("bDiscriminator('pfMassIndependentDeepDoubleCvLJetTags:probHcc')",float,doc="DeepDoubleX (mass-decorrelated) discriminator for H(Z)->cc vs QCD",precision=10), + btagDDCvB = Var("bDiscriminator('pfMassIndependentDeepDoubleCvBJetTags:probHcc')",float,doc="DeepDoubleX (mass-decorrelated) discriminator for H(Z)->cc vs H(Z)->bb",precision=10), + ) +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\')"),) +run2_miniAOD_80XLegacy.toModify( fatJetTable.variables, tau4 = None) +run2_miniAOD_80XLegacy.toModify( fatJetTable.variables, n2b1 = None) +run2_miniAOD_80XLegacy.toModify( fatJetTable.variables, n3b1 = None) +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: + modifier.toModify( fatJetTable.variables, jetId = Var("userInt('tightId')*2+userInt('looseId')",int,doc="Jet ID flags bit1 is loose, bit2 is tight")) + +############################################################## +## DeepInfoAK8:Start +## - To be used in nanoAOD_customizeCommon() in nano_cff.py +############################################################### +from PhysicsTools.PatAlgos.tools.jetTools import updateJetCollection +def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubleX, addDeepDoubleXV2, addParticleNet, addParticleNetMass, jecPayload): + _btagDiscriminators=[] + if addDeepBTag: + print("Updating process to run DeepCSV btag to AK8 jets") + _btagDiscriminators += ['pfDeepCSVJetTags:probb','pfDeepCSVJetTags:probbb'] + if addDeepBoostedJet: + print("Updating process to run DeepBoostedJet on datasets before 103X") + from RecoBTag.ONNXRuntime.pfDeepBoostedJet_cff import _pfDeepBoostedJetTagsAll as pfDeepBoostedJetTagsAll + _btagDiscriminators += pfDeepBoostedJetTagsAll + if addParticleNet: + print("Updating process to run ParticleNet before it's included in MiniAOD") + from RecoBTag.ONNXRuntime.pfParticleNet_cff import _pfParticleNetJetTagsAll as pfParticleNetJetTagsAll + _btagDiscriminators += pfParticleNetJetTagsAll + if addParticleNetMass: + from RecoBTag.ONNXRuntime.pfParticleNet_cff import _pfParticleNetMassRegressionOutputs + _btagDiscriminators += _pfParticleNetMassRegressionOutputs + if addDeepDoubleX: + print("Updating process to run DeepDoubleX on datasets before 104X") + _btagDiscriminators += ['pfDeepDoubleBvLJetTags:probHbb', \ + 'pfDeepDoubleCvLJetTags:probHcc', \ + 'pfDeepDoubleCvBJetTags:probHcc', \ + 'pfMassIndependentDeepDoubleBvLJetTags:probHbb', 'pfMassIndependentDeepDoubleCvLJetTags:probHcc', 'pfMassIndependentDeepDoubleCvBJetTags:probHcc'] + if addDeepDoubleXV2: + print("Updating process to run DeepDoubleXv2 on datasets before 11X") + _btagDiscriminators += [ + 'pfMassIndependentDeepDoubleBvLV2JetTags:probHbb', + 'pfMassIndependentDeepDoubleCvLV2JetTags:probHcc', + 'pfMassIndependentDeepDoubleCvBV2JetTags:probHcc' + ] + if len(_btagDiscriminators)==0: return process + print("Will recalculate the following discriminators on AK8 jets: "+", ".join(_btagDiscriminators)) + updateJetCollection( + process, + jetSource = cms.InputTag('slimmedJetsAK8'), + pvSource = cms.InputTag('offlineSlimmedPrimaryVertices'), + svSource = cms.InputTag('slimmedSecondaryVertices'), + rParam = 0.8, + jetCorrections = (jecPayload.value(), cms.vstring(['L1FastJet', 'L2Relative', 'L3Absolute', 'L2L3Residual']), 'None'), + btagDiscriminators = _btagDiscriminators, + postfix='AK8WithDeepInfo', + printWarning = False + ) + process.jetCorrFactorsAK8.src="selectedUpdatedPatJetsAK8WithDeepInfo" + process.updatedJetsAK8.jetSource="selectedUpdatedPatJetsAK8WithDeepInfo" + return process + +nanoAOD_addDeepInfoAK8_switch = cms.PSet( + nanoAOD_addDeepBTag_switch = cms.untracked.bool(False), + nanoAOD_addDeepBoostedJet_switch = cms.untracked.bool(False), + nanoAOD_addDeepDoubleX_switch = cms.untracked.bool(False), + nanoAOD_addDeepDoubleXV2_switch = cms.untracked.bool(False), + nanoAOD_addParticleNet_switch = cms.untracked.bool(False), + nanoAOD_addParticleNetMass_switch = cms.untracked.bool(False), + jecPayload = cms.untracked.string('AK8PFPuppi') +) +# deepAK8 should not run on 80X, that contains ak8PFJetsCHS jets +run2_miniAOD_80XLegacy.toModify(nanoAOD_addDeepInfoAK8_switch, + nanoAOD_addDeepBTag_switch = True, + jecPayload = 'AK8PFchs' +) +# for 94X and 102X samples: needs to run DeepAK8, DeepDoubleX and ParticleNet +(run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2 | run2_nanoAOD_102Xv1).toModify( + nanoAOD_addDeepInfoAK8_switch, + nanoAOD_addDeepBoostedJet_switch = True, + nanoAOD_addDeepDoubleX_switch = True, + nanoAOD_addDeepDoubleXV2_switch = True, + nanoAOD_addParticleNet_switch = True, + nanoAOD_addParticleNetMass_switch = True, +) +# for 106Xv1: only needs to run ParticleNet and DDXV2; DeepAK8, DeepDoubleX are already in MiniAOD +run2_nanoAOD_106Xv1.toModify( + nanoAOD_addDeepInfoAK8_switch, + nanoAOD_addDeepDoubleXV2_switch = True, + nanoAOD_addParticleNet_switch = True, + nanoAOD_addParticleNetMass_switch = True, +) +# for 106Xv2: only needs to run ParticleNet Mass regression; The rest are already in MiniAOD +run2_nanoAOD_106Xv2.toModify( + nanoAOD_addDeepInfoAK8_switch, + nanoAOD_addParticleNetMass_switch = True, +) +################################################ +## DeepInfoAK8:End +################################################# + +subJetTable = cms.EDProducer("SimpleCandidateFlatTableProducer", + src = cms.InputTag("slimmedJetsAK8PFPuppiSoftDropPacked","SubJets"), + cut = cms.string(""), #probably already applied in miniaod + name = cms.string("SubJet"), + 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, + 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), + rawFactor = Var("1.-jecFactor('Uncorrected')",float,doc="1 - Factor to get back to raw pT",precision=6), + tau1 = Var("userFloat('NjettinessAK8Subjets:tau1')",float, doc="Nsubjettiness (1 axis)",precision=10), + tau2 = Var("userFloat('NjettinessAK8Subjets:tau2')",float, doc="Nsubjettiness (2 axis)",precision=10), + tau3 = Var("userFloat('NjettinessAK8Subjets:tau3')",float, doc="Nsubjettiness (3 axis)",precision=10), + tau4 = Var("userFloat('NjettinessAK8Subjets:tau4')",float, doc="Nsubjettiness (4 axis)",precision=10), + n2b1 = Var("userFloat('nb1AK8PuppiSoftDropSubjets:ecfN2')", float, doc="N2 with beta=1", precision=10), + n3b1 = Var("userFloat('nb1AK8PuppiSoftDropSubjets:ecfN3')", float, doc="N3 with beta=1", precision=10), + ) +) + +# Deprecation/backcomp +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_102Xv1, run2_nanoAOD_106Xv1: + # post 106X + modifier.toModify(subJetTable.variables, + btagCMVA = Var("bDiscriminator('pfCombinedMVAV2BJetTags')",float,doc="CMVA V2 btag discriminator",precision=10), + ) + +#jets are not as precise as muons +fatJetTable.variables.pt.precision=10 +subJetTable.variables.pt.precision=10 + +run2_miniAOD_80XLegacy.toModify( subJetTable.variables, tau1 = None) +run2_miniAOD_80XLegacy.toModify( subJetTable.variables, tau2 = None) +run2_miniAOD_80XLegacy.toModify( subJetTable.variables, tau3 = None) +run2_miniAOD_80XLegacy.toModify( subJetTable.variables, tau4 = None) +run2_miniAOD_80XLegacy.toModify( subJetTable.variables, n2b1 = None) +run2_miniAOD_80XLegacy.toModify( subJetTable.variables, n3b1 = None) +run2_miniAOD_80XLegacy.toModify( subJetTable.variables, btagCMVA = None, btagDeepB = None) + +jetAK8UserDataTask = cms.Task(tightJetIdAK8,tightJetIdLepVetoAK8) +_jetAK8UserDataTask2016 = jetAK8UserDataTask.copy() +_jetAK8UserDataTask2016.add(looseJetIdAK8) +for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: + modifier.toReplaceWith(jetAK8UserDataTask,_jetAK8UserDataTask2016) + +jetAK8Task = cms.Task(jetCorrFactorsAK8,updatedJetsAK8,jetAK8UserDataTask,updatedJetsAK8WithUserData,finalJetsAK8) + +#after lepton collections have been run +jetAK8LepTask = cms.Task(lepInAK8JetVars) + +jetAK8TablesTask = cms.Task(fatJetTable,subJetTable) diff --git a/PhysicsTools/NanoAOD/python/jets_cff.py b/PhysicsTools/NanoAOD/python/jets_cff.py deleted file mode 100644 index 91c4c93b25292..0000000000000 --- a/PhysicsTools/NanoAOD/python/jets_cff.py +++ /dev/null @@ -1,615 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -from PhysicsTools.NanoAOD.nano_eras_cff import * -from PhysicsTools.NanoAOD.common_cff import * - -##################### User floats producers, selectors ########################## - -from PhysicsTools.PatAlgos.recoLayer0.jetCorrFactors_cfi import * -# 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"), -) -jetCorrFactorsAK8 = patJetCorrFactors.clone(src='slimmedJetsAK8', - levels = cms.vstring('L1FastJet', - 'L2Relative', - 'L3Absolute', - 'L2L3Residual'), - payload = cms.string('AK8PFPuppi'), - primaryVertices = cms.InputTag("offlineSlimmedPrimaryVertices"), -) -run2_miniAOD_80XLegacy.toModify(jetCorrFactorsAK8, payload = cms.string('AK8PFchs')) # ak8PFJetsCHS in 2016 80X miniAOD - -from PhysicsTools.PatAlgos.producersLayer1.jetUpdater_cfi import * - -updatedJets = updatedPatJets.clone( - addBTagInfo=False, - jetSource='slimmedJets', - jetCorrFactorsSource=cms.VInputTag(cms.InputTag("jetCorrFactorsNano") ), -) - -updatedJetsAK8 = updatedPatJets.clone( - addBTagInfo=False, - jetSource='slimmedJetsAK8', - jetCorrFactorsSource=cms.VInputTag(cms.InputTag("jetCorrFactorsAK8") ), -) - - -looseJetId = cms.EDProducer("PatJetIDValueMapProducer", - filterParams=cms.PSet( - version = cms.string('WINTER16'), - quality = cms.string('LOOSE'), - ), - src = cms.InputTag("updatedJets") -) -tightJetId = cms.EDProducer("PatJetIDValueMapProducer", - filterParams=cms.PSet( - version = cms.string('RUN2ULCHS'), - quality = cms.string('TIGHT'), - ), - src = cms.InputTag("updatedJets") -) -tightJetIdLepVeto = cms.EDProducer("PatJetIDValueMapProducer", - filterParams=cms.PSet( - version = cms.string('RUN2ULCHS'), - quality = cms.string('TIGHTLEPVETO'), - ), - src = cms.InputTag("updatedJets") -) -run2_jme_2016.toModify( tightJetId.filterParams, version = "RUN2UL16CHS" ) -run2_jme_2016.toModify( tightJetIdLepVeto.filterParams, version = "RUN2UL16CHS" ) -for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: - modifier.toModify( tightJetId.filterParams, version = "WINTER16" ) - modifier.toModify( tightJetIdLepVeto.filterParams, version = "WINTER16" ) -for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2: - modifier.toModify( tightJetId.filterParams, version = "WINTER17" ) - modifier.toModify( tightJetIdLepVeto.filterParams, version = "WINTER17" ) -run2_nanoAOD_102Xv1.toModify( tightJetId.filterParams, version = "SUMMER18" ) -run2_nanoAOD_102Xv1.toModify( tightJetIdLepVeto.filterParams, version = "SUMMER18" ) - - -looseJetIdAK8 = cms.EDProducer("PatJetIDValueMapProducer", - filterParams=cms.PSet( - version = cms.string('WINTER16'), - quality = cms.string('LOOSE'), - ), - src = cms.InputTag("updatedJetsAK8") -) -tightJetIdAK8 = cms.EDProducer("PatJetIDValueMapProducer", - filterParams=cms.PSet( - version = cms.string('RUN2ULPUPPI'), - quality = cms.string('TIGHT'), - ), - src = cms.InputTag("updatedJetsAK8") -) -tightJetIdLepVetoAK8 = cms.EDProducer("PatJetIDValueMapProducer", - filterParams=cms.PSet( - version = cms.string('RUN2ULPUPPI'), - quality = cms.string('TIGHTLEPVETO'), - ), - src = cms.InputTag("updatedJetsAK8") -) -run2_jme_2016.toModify( tightJetIdAK8.filterParams, version = "RUN2UL16PUPPI" ) -run2_jme_2016.toModify( tightJetIdLepVetoAK8.filterParams, version = "RUN2UL16PUPPI" ) -for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: - modifier.toModify( tightJetIdAK8.filterParams, version = "WINTER16" ) - modifier.toModify( tightJetIdLepVetoAK8.filterParams, version = "WINTER16" ) -for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2: - modifier.toModify( tightJetIdAK8.filterParams, version = "WINTER17PUPPI" ) - modifier.toModify( tightJetIdLepVetoAK8.filterParams, version = "WINTER17PUPPI" ) -run2_nanoAOD_102Xv1.toModify( tightJetIdAK8.filterParams, version = "SUMMER18PUPPI" ) -run2_nanoAOD_102Xv1.toModify( tightJetIdLepVetoAK8.filterParams, version = "SUMMER18PUPPI" ) - - -bJetVars = cms.EDProducer("JetRegressionVarProducer", - pvsrc = cms.InputTag("offlineSlimmedPrimaryVertices"), - src = cms.InputTag("updatedJets"), - svsrc = cms.InputTag("slimmedSecondaryVertices"), - gpsrc = cms.InputTag("prunedGenParticles"), - #musrc = cms.InputTag("slimmedMuons"), - #elesrc = cms.InputTag("slimmedElectrons") -) - -jercVars = cms.EDProducer("BetaStarPackedCandidateVarProducer", - srcJet = cms.InputTag("updatedJets"), - srcPF = cms.InputTag("packedPFCandidates"), - maxDR = cms.double(0.4) -) - -updatedJetsWithUserData = cms.EDProducer("PATJetUserDataEmbedder", - src = cms.InputTag("updatedJets"), - userFloats = cms.PSet( - leadTrackPt = cms.InputTag("bJetVars:leadTrackPt"), - leptonPtRel = cms.InputTag("bJetVars:leptonPtRel"), - leptonPtRatio = cms.InputTag("bJetVars:leptonPtRatio"), - leptonPtRelInv = cms.InputTag("bJetVars:leptonPtRelInv"), - leptonPtRelv0 = cms.InputTag("bJetVars:leptonPtRelv0"), - leptonPtRatiov0 = cms.InputTag("bJetVars:leptonPtRatiov0"), - leptonPtRelInvv0 = cms.InputTag("bJetVars:leptonPtRelInvv0"), - leptonDeltaR = cms.InputTag("bJetVars:leptonDeltaR"), - leptonPt = cms.InputTag("bJetVars:leptonPt"), - vtxPt = cms.InputTag("bJetVars:vtxPt"), - vtxMass = cms.InputTag("bJetVars:vtxMass"), - vtx3dL = cms.InputTag("bJetVars:vtx3dL"), - vtx3deL = cms.InputTag("bJetVars:vtx3deL"), - ptD = cms.InputTag("bJetVars:ptD"), - genPtwNu = cms.InputTag("bJetVars:genPtwNu"), - qgl = cms.InputTag('qgtagger:qgLikelihood'), - puIdNanoDisc = cms.InputTag('pileupJetIdNano:fullDiscriminant'), - chFPV0EF = cms.InputTag("jercVars:chargedFromPV0EnergyFraction"), - ), - userInts = cms.PSet( - tightId = cms.InputTag("tightJetId"), - tightIdLepVeto = cms.InputTag("tightJetIdLepVeto"), - vtxNtrk = cms.InputTag("bJetVars:vtxNtrk"), - leptonPdgId = cms.InputTag("bJetVars:leptonPdgId"), - puIdNanoId = cms.InputTag('pileupJetIdNano:fullId'), - ), -) -for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: - modifier.toModify(updatedJetsWithUserData.userInts, - looseId = cms.InputTag("looseJetId"), - ) - -updatedJetsAK8WithUserData = cms.EDProducer("PATJetUserDataEmbedder", - src = cms.InputTag("updatedJetsAK8"), - userInts = cms.PSet( - tightId = cms.InputTag("tightJetIdAK8"), - tightIdLepVeto = cms.InputTag("tightJetIdLepVetoAK8"), - ), -) -for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: - modifier.toModify(updatedJetsAK8WithUserData.userInts, - looseId = cms.InputTag("looseJetIdAK8"), - ) - - -finalJets = cms.EDFilter("PATJetRefSelector", - src = cms.InputTag("updatedJetsWithUserData"), - cut = cms.string("pt > 15") -) - -finalJetsAK8 = cms.EDFilter("PATJetRefSelector", - src = cms.InputTag("updatedJetsAK8WithUserData"), - cut = cms.string("pt > 170") -) - -lepInJetVars = cms.EDProducer("LepInJetProducer", - src = cms.InputTag("updatedJetsAK8WithUserData"), - srcEle = cms.InputTag("finalElectrons"), - srcMu = cms.InputTag("finalMuons") -) - - -##################### Tables for final output and docs ########################## - - -jetTable = cms.EDProducer("SimpleCandidateFlatTableProducer", - src = cms.InputTag("linkedObjects","jets"), - cut = cms.string(""), #we should not filter on cross linked collections - name = cms.string("Jet"), - doc = cms.string("slimmedJets, i.e. ak4 PFJets CHS with JECs applied, after basic selection (" + finalJets.cut.value()+")"), - singleton = cms.bool(False), # the number of entries is variable - extension = cms.bool(False), # this is the main table for the jets - externalVariables = cms.PSet( - bRegCorr = ExtVar(cms.InputTag("bjetNN:corr"),float, doc="pt correction for b-jet energy regression",precision=10), - bRegRes = ExtVar(cms.InputTag("bjetNN:res"),float, doc="res on pt corrected with b-jet regression",precision=6), - cRegCorr = ExtVar(cms.InputTag("cjetNN:corr"),float, doc="pt correction for c-jet energy regression",precision=10), - cRegRes = ExtVar(cms.InputTag("cjetNN:res"),float, doc="res on pt corrected with c-jet regression",precision=6), - ), - variables = cms.PSet(P4Vars, - area = Var("jetArea()", float, doc="jet catchment area, for JECs",precision=10), - nMuons = Var("?hasOverlaps('muons')?overlaps('muons').size():0", int, doc="number of muons in the jet"), - muonIdx1 = Var("?overlaps('muons').size()>0?overlaps('muons')[0].key():-1", int, doc="index of first matching muon"), - muonIdx2 = Var("?overlaps('muons').size()>1?overlaps('muons')[1].key():-1", int, doc="index of second matching muon"), - electronIdx1 = Var("?overlaps('electrons').size()>0?overlaps('electrons')[0].key():-1", int, doc="index of first matching electron"), - electronIdx2 = Var("?overlaps('electrons').size()>1?overlaps('electrons')[1].key():-1", int, doc="index of second matching electron"), - nElectrons = Var("?hasOverlaps('electrons')?overlaps('electrons').size():0", int, doc="number of electrons in the jet"), - btagDeepB = Var("?(bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'))>=0?bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'):-1",float,doc="DeepCSV b+bb tag discriminator",precision=10), - btagDeepFlavB = Var("bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb')",float,doc="DeepJet b+bb+lepb tag discriminator",precision=10), - btagCSVV2 = Var("bDiscriminator('pfCombinedInclusiveSecondaryVertexV2BJetTags')",float,doc=" pfCombinedInclusiveSecondaryVertexV2 b-tag discriminator (aka CSVV2)",precision=10), - btagDeepCvL = Var("?bDiscriminator('pfDeepCSVJetTags:probc')>=0?bDiscriminator('pfDeepCSVJetTags:probc')/(bDiscriminator('pfDeepCSVJetTags:probc')+bDiscriminator('pfDeepCSVJetTags:probudsg')):-1", float,doc="DeepCSV c vs udsg discriminator",precision=10), - btagDeepCvB = Var("?bDiscriminator('pfDeepCSVJetTags:probc')>=0?bDiscriminator('pfDeepCSVJetTags:probc')/(bDiscriminator('pfDeepCSVJetTags:probc')+bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb')):-1",float,doc="DeepCSV c vs b+bb discriminator",precision=10), - btagDeepFlavCvL = Var("?(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probuds')+bDiscriminator('pfDeepFlavourJetTags:probg'))>0?bDiscriminator('pfDeepFlavourJetTags:probc')/(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probuds')+bDiscriminator('pfDeepFlavourJetTags:probg')):-1",float,doc="DeepJet c vs uds+g discriminator",precision=10), - btagDeepFlavCvB = Var("?(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb'))>0?bDiscriminator('pfDeepFlavourJetTags:probc')/(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb')):-1",float,doc="DeepJet c vs b+bb+lepb discriminator",precision=10), - btagDeepFlavQG = Var("?(bDiscriminator('pfDeepFlavourJetTags:probg')+bDiscriminator('pfDeepFlavourJetTags:probuds'))>0?bDiscriminator('pfDeepFlavourJetTags:probg')/(bDiscriminator('pfDeepFlavourJetTags:probg')+bDiscriminator('pfDeepFlavourJetTags:probuds')):-1",float,doc="DeepJet g vs uds discriminator",precision=10), - puIdDisc = Var("userFloat('puIdNanoDisc')", float,doc="Pileup ID discriminant with 106X (2018) training",precision=10), - puId = Var("userInt('puIdNanoId')", int,doc="Pileup ID flags with 106X (2018) training"), - jetId = Var("userInt('tightId')*2+4*userInt('tightIdLepVeto')",int,doc="Jet ID flags bit1 is loose (always false in 2017 since it does not exist), bit2 is tight, bit3 is tightLepVeto"), - qgl = Var("?userFloat('qgl')>0?userFloat('qgl'):-1",float,doc="Quark vs Gluon likelihood discriminator",precision=10), - hfsigmaEtaEta = Var("userFloat('hfJetShowerShape:sigmaEtaEta')",float,doc="sigmaEtaEta for HF jets (noise discriminating variable)",precision=10), - hfsigmaPhiPhi = Var("userFloat('hfJetShowerShape:sigmaPhiPhi')",float,doc="sigmaPhiPhi for HF jets (noise discriminating variable)",precision=10), - hfcentralEtaStripSize = Var("userInt('hfJetShowerShape:centralEtaStripSize')", int, doc="eta size of the central tower strip in HF (noise discriminating variable) "), - hfadjacentEtaStripsSize = Var("userInt('hfJetShowerShape:adjacentEtaStripsSize')", int, doc="eta size of the strips next to the central tower strip in HF (noise discriminating variable) "), - nConstituents = Var("numberOfDaughters()","uint8",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), - muEF = Var("muonEnergyFraction()", float, doc="muon Energy Fraction", precision= 6), - chFPV0EF = Var("userFloat('chFPV0EF')", float, doc="charged fromPV==0 Energy Fraction (energy excluded from CHS jets). Previously called betastar.", precision= 6), - ) -) - -#jets are not as precise as muons -jetTable.variables.pt.precision=10 - -### Era dependent customization -for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_102Xv1, run2_nanoAOD_106Xv1: - # Deprecated after 106X - modifier.toModify(jetTable.variables, - btagCMVA = Var("bDiscriminator('pfCombinedMVAV2BJetTags')",float,doc="CMVA V2 btag discriminator",precision=10), - btagDeepC = Var("bDiscriminator('pfDeepCSVJetTags:probc')",float,doc="DeepCSV charm btag discriminator",precision=10), - btagDeepFlavC = Var("bDiscriminator('pfDeepFlavourJetTags:probc')",float,doc="DeepFlavour charm tag discriminator",precision=10), - ) -for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: - modifier.toModify( jetTable.variables, jetId = Var("userInt('tightIdLepVeto')*4+userInt('tightId')*2+userInt('looseId')",int,doc="Jet ID flags bit1 is loose, bit2 is tight, bit3 is tightLepVeto")) - -run2_nanoAOD_102Xv1.toModify( jetTable.variables.puIdDisc, doc="Pileup ID discriminant with 102X (2018) training") -run2_nanoAOD_102Xv1.toModify( jetTable.variables, puId = Var("userInt('pileupJetId:fullId')",int,doc="Pileup ID flags for pre-UL trainings")) -(run2_jme_2016 & ~tracker_apv_vfp30_2016 ).toModify( jetTable.variables.puIdDisc, doc="Pileup ID discriminant with 106X (2016) training") -(run2_jme_2016 & ~tracker_apv_vfp30_2016 ).toModify( jetTable.variables.puId, doc="Pileup ID flags with 106X (2016) training") -(run2_jme_2016 & tracker_apv_vfp30_2016 ).toModify( jetTable.variables.puIdDisc, doc="Pileup ID discriminant with 106X (2016APV) training") -(run2_jme_2016 & tracker_apv_vfp30_2016 ).toModify( jetTable.variables.puId, doc="Pileup ID flags with 106X (2016APV) training") -run2_jme_2017.toModify( jetTable.variables.puIdDisc, doc="Pileup ID discriminant with 106X (2017) training") -run2_jme_2017.toModify( jetTable.variables.puId, doc="Pileup ID flags with 106X (2017) training") -for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: - modifier.toModify( jetTable.variables, puIdDisc = Var("userFloat('pileupJetId:fullDiscriminant')",float,doc="Pileup ID discriminant with 80X (2016) training",precision=10)) - modifier.toModify( jetTable.variables, puId = Var("userInt('pileupJetId:fullId')",int,doc="Pileup ID flags for pre-UL trainings")) -for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2: - modifier.toModify( jetTable.variables.puIdDisc, doc="Pileup ID discriminant with 94X (2017) training") - modifier.toModify( jetTable.variables, puId = Var("userInt('pileupJetId:fullId')",int,doc="Pileup ID flags for 2016/2017/2018 EOY trainings")) - -bjetNN= cms.EDProducer("BJetEnergyRegressionMVA", - backend = cms.string("ONNX"), - batch_eval = cms.bool(True), - src = cms.InputTag("linkedObjects","jets"), - pvsrc = cms.InputTag("offlineSlimmedPrimaryVertices"), - svsrc = cms.InputTag("slimmedSecondaryVertices"), - rhosrc = cms.InputTag("fixedGridRhoFastjetAll"), - - weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/breg_training_2018.onnx"), - name = cms.string("JetRegNN"), - isClassifier = cms.bool(False), - variablesOrder = cms.vstring(["Jet_pt","Jet_eta","rho","Jet_mt","Jet_leadTrackPt","Jet_leptonPtRel","Jet_leptonDeltaR","Jet_neHEF", - "Jet_neEmEF","Jet_vtxPt","Jet_vtxMass","Jet_vtx3dL","Jet_vtxNtrk","Jet_vtx3deL", - "Jet_numDaughters_pt03","Jet_energyRing_dR0_em_Jet_rawEnergy","Jet_energyRing_dR1_em_Jet_rawEnergy", - "Jet_energyRing_dR2_em_Jet_rawEnergy","Jet_energyRing_dR3_em_Jet_rawEnergy","Jet_energyRing_dR4_em_Jet_rawEnergy", - "Jet_energyRing_dR0_neut_Jet_rawEnergy","Jet_energyRing_dR1_neut_Jet_rawEnergy","Jet_energyRing_dR2_neut_Jet_rawEnergy", - "Jet_energyRing_dR3_neut_Jet_rawEnergy","Jet_energyRing_dR4_neut_Jet_rawEnergy","Jet_energyRing_dR0_ch_Jet_rawEnergy", - "Jet_energyRing_dR1_ch_Jet_rawEnergy","Jet_energyRing_dR2_ch_Jet_rawEnergy","Jet_energyRing_dR3_ch_Jet_rawEnergy", - "Jet_energyRing_dR4_ch_Jet_rawEnergy","Jet_energyRing_dR0_mu_Jet_rawEnergy","Jet_energyRing_dR1_mu_Jet_rawEnergy", - "Jet_energyRing_dR2_mu_Jet_rawEnergy","Jet_energyRing_dR3_mu_Jet_rawEnergy","Jet_energyRing_dR4_mu_Jet_rawEnergy", - "Jet_chHEF","Jet_chEmEF","Jet_leptonPtRelInv","isEle","isMu","isOther","Jet_mass","Jet_ptd"]), - variables = cms.PSet( - Jet_pt = cms.string("pt*jecFactor('Uncorrected')"), - Jet_mt = cms.string("mt*jecFactor('Uncorrected')"), - Jet_eta = cms.string("eta"), - Jet_mass = cms.string("mass*jecFactor('Uncorrected')"), - Jet_ptd = cms.string("userFloat('ptD')"), - Jet_leadTrackPt = cms.string("userFloat('leadTrackPt')"), - Jet_vtxNtrk = cms.string("userInt('vtxNtrk')"), - Jet_vtxMass = cms.string("userFloat('vtxMass')"), - Jet_vtx3dL = cms.string("userFloat('vtx3dL')"), - Jet_vtx3deL = cms.string("userFloat('vtx3deL')"), - Jet_vtxPt = cms.string("userFloat('vtxPt')"), - #Jet_leptonPt = cms.string("userFloat('leptonPt')"), - Jet_leptonPtRel = cms.string("userFloat('leptonPtRelv0')"), - Jet_leptonPtRelInv = cms.string("userFloat('leptonPtRelInvv0')*jecFactor('Uncorrected')"), - Jet_leptonDeltaR = cms.string("userFloat('leptonDeltaR')"), - #Jet_leptonPdgId = cms.string("userInt('leptonPdgId')"), - Jet_neHEF = cms.string("neutralHadronEnergyFraction()"), - Jet_neEmEF = cms.string("neutralEmEnergyFraction()"), - Jet_chHEF = cms.string("chargedHadronEnergyFraction()"), - Jet_chEmEF = cms.string("chargedEmEnergyFraction()"), - isMu = cms.string("?abs(userInt('leptonPdgId'))==13?1:0"), - isEle = cms.string("?abs(userInt('leptonPdgId'))==11?1:0"), - isOther = cms.string("?userInt('leptonPdgId')==0?1:0"), - ), - inputTensorName = cms.string("ffwd_inp:0"), - outputTensorName = cms.string("ffwd_out/BiasAdd:0"), - outputNames = cms.vstring(["corr","res"]), - outputFormulas = cms.vstring(["at(0)*0.27912887930870056+1.0545977354049683","0.5*(at(2)-at(1))*0.27912887930870056"]), -) - -cjetNN= cms.EDProducer("BJetEnergyRegressionMVA", - backend = cms.string("ONNX"), - batch_eval = cms.bool(True), - - src = cms.InputTag("linkedObjects","jets"), - pvsrc = cms.InputTag("offlineSlimmedPrimaryVertices"), - svsrc = cms.InputTag("slimmedSecondaryVertices"), - rhosrc = cms.InputTag("fixedGridRhoFastjetAll"), - - weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/creg_training_2018.onnx"), - name = cms.string("JetRegNN"), - isClassifier = cms.bool(False), - variablesOrder = cms.vstring(["Jet_pt","Jet_eta","rho","Jet_mt","Jet_leadTrackPt","Jet_leptonPtRel","Jet_leptonDeltaR", - "Jet_neHEF","Jet_neEmEF","Jet_vtxPt","Jet_vtxMass","Jet_vtx3dL","Jet_vtxNtrk","Jet_vtx3deL", - "Jet_numDaughters_pt03","Jet_chEmEF","Jet_chHEF", "Jet_ptd","Jet_mass", - "Jet_energyRing_dR0_em_Jet_rawEnergy","Jet_energyRing_dR1_em_Jet_rawEnergy", - "Jet_energyRing_dR2_em_Jet_rawEnergy","Jet_energyRing_dR3_em_Jet_rawEnergy","Jet_energyRing_dR4_em_Jet_rawEnergy", - "Jet_energyRing_dR0_neut_Jet_rawEnergy","Jet_energyRing_dR1_neut_Jet_rawEnergy","Jet_energyRing_dR2_neut_Jet_rawEnergy", - "Jet_energyRing_dR3_neut_Jet_rawEnergy","Jet_energyRing_dR4_neut_Jet_rawEnergy","Jet_energyRing_dR0_ch_Jet_rawEnergy", - "Jet_energyRing_dR1_ch_Jet_rawEnergy","Jet_energyRing_dR2_ch_Jet_rawEnergy","Jet_energyRing_dR3_ch_Jet_rawEnergy", - "Jet_energyRing_dR4_ch_Jet_rawEnergy","Jet_energyRing_dR0_mu_Jet_rawEnergy","Jet_energyRing_dR1_mu_Jet_rawEnergy", - "Jet_energyRing_dR2_mu_Jet_rawEnergy","Jet_energyRing_dR3_mu_Jet_rawEnergy","Jet_energyRing_dR4_mu_Jet_rawEnergy"]), - variables = cms.PSet( - Jet_pt = cms.string("pt*jecFactor('Uncorrected')"), - Jet_mt = cms.string("mt*jecFactor('Uncorrected')"), - Jet_eta = cms.string("eta"), - Jet_mass = cms.string("mass*jecFactor('Uncorrected')"), - Jet_ptd = cms.string("userFloat('ptD')"), - Jet_leadTrackPt = cms.string("userFloat('leadTrackPt')"), - Jet_vtxNtrk = cms.string("userInt('vtxNtrk')"), - Jet_vtxMass = cms.string("userFloat('vtxMass')"), - Jet_vtx3dL = cms.string("userFloat('vtx3dL')"), - Jet_vtx3deL = cms.string("userFloat('vtx3deL')"), - Jet_vtxPt = cms.string("userFloat('vtxPt')"), - #Jet_leptonPt = cms.string("userFloat('leptonPt')"), - Jet_leptonPtRel = cms.string("userFloat('leptonPtRelv0')"), - Jet_leptonPtRelInv = cms.string("userFloat('leptonPtRelInvv0')*jecFactor('Uncorrected')"), - Jet_leptonDeltaR = cms.string("userFloat('leptonDeltaR')"), - #Jet_leptonPdgId = cms.string("userInt('leptonPdgId')"), - Jet_neHEF = cms.string("neutralHadronEnergyFraction()"), - Jet_neEmEF = cms.string("neutralEmEnergyFraction()"), - Jet_chHEF = cms.string("chargedHadronEnergyFraction()"), - Jet_chEmEF = cms.string("chargedEmEnergyFraction()"), - isMu = cms.string("?abs(userInt('leptonPdgId'))==13?1:0"), - isEle = cms.string("?abs(userInt('leptonPdgId'))==11?1:0"), - isOther = cms.string("?userInt('leptonPdgId')==0?1:0"), - ), - inputTensorName = cms.string("ffwd_inp:0"), - outputTensorName = cms.string("ffwd_out/BiasAdd:0"), - outputNames = cms.vstring(["corr","res"]), - outputFormulas = cms.vstring(["at(0)*0.24325256049633026+0.993854820728302","0.5*(at(2)-at(1))*0.24325256049633026"]), -) - - -## BOOSTED STUFF ################# -fatJetTable = cms.EDProducer("SimpleCandidateFlatTableProducer", - 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+4*userInt('tightIdLepVeto')",int,doc="Jet ID flags bit1 is loose (always false in 2017 since it does not exist), bit2 is tight, bit3 is tightLepVeto"), - area = Var("jetArea()", float, doc="jet catchment area, for JECs",precision=10), - rawFactor = Var("1.-jecFactor('Uncorrected')",float,doc="1 - Factor to get back to raw pT",precision=6), - 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("?hasUserFloat('nb1AK8PuppiSoftDrop:ecfN2')?userFloat('nb1AK8PuppiSoftDrop:ecfN2'):-99999.", float, doc="N2 with beta=1 (for jets with raw pT>250 GeV)", precision=10), - n3b1 = Var("?hasUserFloat('nb1AK8PuppiSoftDrop:ecfN3')?userFloat('nb1AK8PuppiSoftDrop:ecfN3'):-99999.", float, doc="N3 with beta=1 (for jets with raw pT>250 GeV)", precision=10), - msoftdrop = Var("groomedMass('SoftDropPuppi')",float, doc="Corrected soft drop mass with PUPPI",precision=10), - btagDeepB = Var("?(bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'))>=0?bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'):-1",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), - btagDDBvLV2 = Var("bDiscriminator('pfMassIndependentDeepDoubleBvLV2JetTags:probHbb')",float,doc="DeepDoubleX V2(mass-decorrelated) discriminator for H(Z)->bb vs QCD",precision=10), - btagDDCvLV2 = Var("bDiscriminator('pfMassIndependentDeepDoubleCvLV2JetTags:probHcc')",float,doc="DeepDoubleX V2 (mass-decorrelated) discriminator for H(Z)->cc vs QCD",precision=10), - btagDDCvBV2 = Var("bDiscriminator('pfMassIndependentDeepDoubleCvBV2JetTags:probHcc')",float,doc="DeepDoubleX V2 (mass-decorrelated) discriminator for H(Z)->cc vs H(Z)->bb",precision=10), - deepTag_TvsQCD = Var("bDiscriminator('pfDeepBoostedDiscriminatorsJetTags:TvsQCD')",float,doc="DeepBoostedJet tagger top vs QCD discriminator",precision=10), - deepTag_WvsQCD = Var("bDiscriminator('pfDeepBoostedDiscriminatorsJetTags:WvsQCD')",float,doc="DeepBoostedJet tagger W vs QCD discriminator",precision=10), - deepTag_ZvsQCD = Var("bDiscriminator('pfDeepBoostedDiscriminatorsJetTags:ZvsQCD')",float,doc="DeepBoostedJet tagger Z vs QCD discriminator",precision=10), - deepTag_H = Var("bDiscriminator('pfDeepBoostedJetTags:probHbb')+bDiscriminator('pfDeepBoostedJetTags:probHcc')+bDiscriminator('pfDeepBoostedJetTags:probHqqqq')",float,doc="DeepBoostedJet tagger H(bb,cc,4q) sum",precision=10), - deepTag_QCD = Var("bDiscriminator('pfDeepBoostedJetTags:probQCDbb')+bDiscriminator('pfDeepBoostedJetTags:probQCDcc')+bDiscriminator('pfDeepBoostedJetTags:probQCDb')+bDiscriminator('pfDeepBoostedJetTags:probQCDc')+bDiscriminator('pfDeepBoostedJetTags:probQCDothers')",float,doc="DeepBoostedJet tagger QCD(bb,cc,b,c,others) sum",precision=10), - deepTag_QCDothers = Var("bDiscriminator('pfDeepBoostedJetTags:probQCDothers')",float,doc="DeepBoostedJet tagger QCDothers value",precision=10), - deepTagMD_TvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:TvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger top vs QCD discriminator",precision=10), - deepTagMD_WvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:WvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger W vs QCD discriminator",precision=10), - deepTagMD_ZvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ZvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z vs QCD discriminator",precision=10), - deepTagMD_ZHbbvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ZHbbvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z/H->bb vs QCD discriminator",precision=10), - deepTagMD_ZbbvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ZbbvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z->bb vs QCD discriminator",precision=10), - deepTagMD_HbbvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:HbbvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger H->bb vs QCD discriminator",precision=10), - deepTagMD_ZHccvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ZHccvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z/H->cc vs QCD discriminator",precision=10), - deepTagMD_H4qvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:H4qvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger H->4q vs QCD discriminator",precision=10), - deepTagMD_bbvsLight = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:bbvsLight')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z/H/gluon->bb vs light flavour discriminator",precision=10), - deepTagMD_ccvsLight = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ccvsLight')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z/H/gluon->cc vs light flavour discriminator",precision=10), - particleNet_TvsQCD = Var("bDiscriminator('pfParticleNetDiscriminatorsJetTags:TvsQCD')",float,doc="ParticleNet tagger top vs QCD discriminator",precision=10), - particleNet_WvsQCD = Var("bDiscriminator('pfParticleNetDiscriminatorsJetTags:WvsQCD')",float,doc="ParticleNet tagger W vs QCD discriminator",precision=10), - particleNet_ZvsQCD = Var("bDiscriminator('pfParticleNetDiscriminatorsJetTags:ZvsQCD')",float,doc="ParticleNet tagger Z vs QCD discriminator",precision=10), - particleNet_HbbvsQCD = Var("bDiscriminator('pfParticleNetDiscriminatorsJetTags:HbbvsQCD')",float,doc="ParticleNet tagger H(->bb) vs QCD discriminator",precision=10), - particleNet_HccvsQCD = Var("bDiscriminator('pfParticleNetDiscriminatorsJetTags:HccvsQCD')",float,doc="ParticleNet tagger H(->cc) vs QCD discriminator",precision=10), - particleNet_H4qvsQCD = Var("bDiscriminator('pfParticleNetDiscriminatorsJetTags:H4qvsQCD')",float,doc="ParticleNet tagger H(->VV->qqqq) vs QCD discriminator",precision=10), - particleNet_QCD = Var("bDiscriminator('pfParticleNetJetTags:probQCDbb')+bDiscriminator('pfParticleNetJetTags:probQCDcc')+bDiscriminator('pfParticleNetJetTags:probQCDb')+bDiscriminator('pfParticleNetJetTags:probQCDc')+bDiscriminator('pfParticleNetJetTags:probQCDothers')",float,doc="ParticleNet tagger QCD(bb,cc,b,c,others) sum",precision=10), - particleNet_mass = Var("bDiscriminator('pfParticleNetMassRegressionJetTags:mass')",float,doc="ParticleNet mass regression",precision=10), - particleNetMD_Xbb = Var("bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probXbb')",float,doc="Mass-decorrelated ParticleNet tagger raw X->bb score. For X->bb vs QCD tagging, use Xbb/(Xbb+QCD)",precision=10), - particleNetMD_Xcc = Var("bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probXcc')",float,doc="Mass-decorrelated ParticleNet tagger raw X->cc score. For X->cc vs QCD tagging, use Xcc/(Xcc+QCD)",precision=10), - particleNetMD_Xqq = Var("bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probXqq')",float,doc="Mass-decorrelated ParticleNet tagger raw X->qq (uds) score. For X->qq vs QCD tagging, use Xqq/(Xqq+QCD). For W vs QCD tagging, use (Xcc+Xqq)/(Xcc+Xqq+QCD)",precision=10), - particleNetMD_QCD = Var("bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probQCDbb')+bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probQCDcc')+bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probQCDb')+bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probQCDc')+bDiscriminator('pfMassDecorrelatedParticleNetJetTags:probQCDothers')",float,doc="Mass-decorrelated ParticleNet tagger raw QCD score",precision=10), - subJetIdx1 = Var("?nSubjetCollections()>0 && subjets('SoftDropPuppi').size()>0?subjets('SoftDropPuppi')[0].key():-1", int, - doc="index of first subjet"), - subJetIdx2 = Var("?nSubjetCollections()>0 && subjets('SoftDropPuppi').size()>1?subjets('SoftDropPuppi')[1].key():-1", int, - doc="index of second subjet"), - -# btagDeepC = Var("bDiscriminator('pfDeepCSVJetTags:probc')",float,doc="CMVA V2 btag discriminator",precision=10), -#puIdDisc = Var("userFloat('pileupJetId:fullDiscriminant')",float,doc="Pileup ID discriminant",precision=10), - nConstituents = Var("numberOfDaughters()","uint8",doc="Number of particles in the jet"), - ), - externalVariables = cms.PSet( - lsf3 = ExtVar(cms.InputTag("lepInJetVars:lsf3"),float, doc="Lepton Subjet Fraction (3 subjets)",precision=10), - muonIdx3SJ = ExtVar(cms.InputTag("lepInJetVars:muIdx3SJ"),int, doc="index of muon matched to jet"), - electronIdx3SJ = ExtVar(cms.InputTag("lepInJetVars:eleIdx3SJ"),int,doc="index of electron matched to jet"), - ) -) -### Era dependent customization -for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_102Xv1, run2_nanoAOD_106Xv1: - modifier.toModify( fatJetTable.variables.n2b1, expr = cms.string("userFloat('ak8PFJetsPuppiSoftDropValueMap:nb1AK8PuppiSoftDropN2')"),) - modifier.toModify( fatJetTable.variables.n3b1, expr = cms.string("userFloat('ak8PFJetsPuppiSoftDropValueMap:nb1AK8PuppiSoftDropN3')"),) - # Deprecated after 106X - modifier.toModify( fatJetTable.variables, - btagCMVA = Var("bDiscriminator('pfCombinedMVAV2BJetTags')",float,doc="CMVA V2 btag discriminator",precision=10), - btagDDBvL_noMD = Var("bDiscriminator('pfDeepDoubleBvLJetTags:probHbb')",float,doc="DeepDoubleX discriminator (no mass-decorrelation) for H(Z)->bb vs QCD",precision=10), - btagDDCvL_noMD = Var("bDiscriminator('pfDeepDoubleCvLJetTags:probHcc')",float,doc="DeepDoubleX discriminator (no mass-decorrelation) for H(Z)->cc vs QCD",precision=10), - btagDDCvB_noMD = Var("bDiscriminator('pfDeepDoubleCvBJetTags:probHcc')",float,doc="DeepDoubleX discriminator (no mass-decorrelation) for H(Z)->cc vs H(Z)->bb",precision=10), - btagDDBvL = Var("bDiscriminator('pfMassIndependentDeepDoubleBvLJetTags:probHbb')",float,doc="DeepDoubleX (mass-decorrelated) discriminator for H(Z)->bb vs QCD",precision=10), - btagDDCvL = Var("bDiscriminator('pfMassIndependentDeepDoubleCvLJetTags:probHcc')",float,doc="DeepDoubleX (mass-decorrelated) discriminator for H(Z)->cc vs QCD",precision=10), - btagDDCvB = Var("bDiscriminator('pfMassIndependentDeepDoubleCvBJetTags:probHcc')",float,doc="DeepDoubleX (mass-decorrelated) discriminator for H(Z)->cc vs H(Z)->bb",precision=10), - ) -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\')"),) -run2_miniAOD_80XLegacy.toModify( fatJetTable.variables, tau4 = None) -run2_miniAOD_80XLegacy.toModify( fatJetTable.variables, n2b1 = None) -run2_miniAOD_80XLegacy.toModify( fatJetTable.variables, n3b1 = None) -for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: - modifier.toModify( fatJetTable.variables, jetId = Var("userInt('tightId')*2+userInt('looseId')",int,doc="Jet ID flags bit1 is loose, bit2 is tight")) - -run2_jme_2016.toModify( bjetNN, weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/breg_training_2016.onnx") ) -run2_jme_2016.toModify( bjetNN,outputFormulas = cms.vstring(["at(0)*0.31976690888404846+1.047176718711853","0.5*(at(2)-at(1))*0.31976690888404846"])) - -run2_jme_2017.toModify( bjetNN, weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/breg_training_2017.onnx") ) -run2_jme_2017.toModify( bjetNN,outputFormulas = cms.vstring(["at(0)*0.28225210309028625+1.055067777633667","0.5*(at(2)-at(1))*0.28225210309028625"])) - -run2_jme_2016.toModify( cjetNN, weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/creg_training_2016.onnx") ) -run2_jme_2016.toModify( cjetNN,outputFormulas = cms.vstring(["at(0)*0.28862622380256653+0.9908722639083862","0.5*(at(2)-at(1))*0.28862622380256653"])) - -run2_jme_2017.toModify( cjetNN, weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/creg_training_2017.onnx") ) -run2_jme_2017.toModify( cjetNN,outputFormulas = cms.vstring(["at(0)*0.24718524515628815+0.9927206635475159","0.5*(at(2)-at(1))*0.24718524515628815"])) - - - -subJetTable = cms.EDProducer("SimpleCandidateFlatTableProducer", - src = cms.InputTag("slimmedJetsAK8PFPuppiSoftDropPacked","SubJets"), - cut = cms.string(""), #probably already applied in miniaod - name = cms.string("SubJet"), - 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, - 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), - rawFactor = Var("1.-jecFactor('Uncorrected')",float,doc="1 - Factor to get back to raw pT",precision=6), - tau1 = Var("userFloat('NjettinessAK8Subjets:tau1')",float, doc="Nsubjettiness (1 axis)",precision=10), - tau2 = Var("userFloat('NjettinessAK8Subjets:tau2')",float, doc="Nsubjettiness (2 axis)",precision=10), - tau3 = Var("userFloat('NjettinessAK8Subjets:tau3')",float, doc="Nsubjettiness (3 axis)",precision=10), - tau4 = Var("userFloat('NjettinessAK8Subjets:tau4')",float, doc="Nsubjettiness (4 axis)",precision=10), - n2b1 = Var("userFloat('nb1AK8PuppiSoftDropSubjets:ecfN2')", float, doc="N2 with beta=1", precision=10), - n3b1 = Var("userFloat('nb1AK8PuppiSoftDropSubjets:ecfN3')", float, doc="N3 with beta=1", precision=10), - ) -) - -# Deprecation/backcomp -for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_102Xv1, run2_nanoAOD_106Xv1: - # post 106X - modifier.toModify(subJetTable.variables, - btagCMVA = Var("bDiscriminator('pfCombinedMVAV2BJetTags')",float,doc="CMVA V2 btag discriminator",precision=10), - ) - -#jets are not as precise as muons -fatJetTable.variables.pt.precision=10 -subJetTable.variables.pt.precision=10 - -run2_miniAOD_80XLegacy.toModify( subJetTable.variables, tau1 = None) -run2_miniAOD_80XLegacy.toModify( subJetTable.variables, tau2 = None) -run2_miniAOD_80XLegacy.toModify( subJetTable.variables, tau3 = None) -run2_miniAOD_80XLegacy.toModify( subJetTable.variables, tau4 = None) -run2_miniAOD_80XLegacy.toModify( subJetTable.variables, n2b1 = None) -run2_miniAOD_80XLegacy.toModify( subJetTable.variables, n3b1 = None) -run2_miniAOD_80XLegacy.toModify( subJetTable.variables, btagCMVA = None, btagDeepB = None) - - -################################################################################ -# JETS FOR MET type1 -################################################################################ - -basicJetsForMetForT1METNano = cms.EDProducer("PATJetCleanerForType1MET", - src = updatedJetsWithUserData.src, - jetCorrEtaMax = cms.double(9.9), - jetCorrLabel = cms.InputTag("L3Absolute"), - jetCorrLabelRes = cms.InputTag("L2L3Residual"), - offsetCorrLabel = cms.InputTag("L1FastJet"), - skipEM = cms.bool(False), - skipEMfractionThreshold = cms.double(0.9), - skipMuonSelection = cms.string('isGlobalMuon | isStandAloneMuon'), - skipMuons = cms.bool(True), - type1JetPtThreshold = cms.double(0.0), - calcMuonSubtrRawPtAsValueMap = cms.bool(True) - ) - -updatedJetsWithUserData.userFloats.muonSubtrRawPt = cms.InputTag("basicJetsForMetForT1METNano:MuonSubtrRawPt") - - -corrT1METJetTable = cms.EDProducer("SimpleCandidateFlatTableProducer", - src = finalJets.src, - cut = cms.string("pt<15 && abs(eta)<9.9"), - name = cms.string("CorrT1METJet"), - doc = cms.string("Additional low-pt jets for Type-1 MET re-correction"), - 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( - rawPt = Var("pt()*jecFactor('Uncorrected')",float,precision=10), - eta = Var("eta", float,precision=12), - phi = Var("phi", float, precision=12), - area = Var("jetArea()", float, doc="jet catchment area, for JECs",precision=10), - ) -) - -corrT1METJetTable.variables.muonSubtrFactor = Var("1-userFloat('muonSubtrRawPt')/(pt()*jecFactor('Uncorrected'))",float,doc="1-(muon-subtracted raw pt)/(raw pt)",precision=6) -jetTable.variables.muonSubtrFactor = Var("1-userFloat('muonSubtrRawPt')/(pt()*jecFactor('Uncorrected'))",float,doc="1-(muon-subtracted raw pt)/(raw pt)",precision=6) - -jetForMETTask = cms.Task(basicJetsForMetForT1METNano,corrT1METJetTable) - - -from RecoJets.JetProducers.QGTagger_cfi import QGTagger -qgtagger=QGTagger.clone(srcJets="updatedJets",srcVertexCollection="offlineSlimmedPrimaryVertices") - - -from RecoJets.JetProducers.PileupJetID_cfi import pileupJetId, _chsalgos_94x, _chsalgos_102x, _chsalgos_106X_UL16, _chsalgos_106X_UL16APV, _chsalgos_106X_UL17, _chsalgos_106X_UL18 -pileupJetIdNano=pileupJetId.clone(jets="updatedJets",algos = cms.VPSet(_chsalgos_106X_UL18),inputIsCorrected=True,applyJec=False,vertexes="offlineSlimmedPrimaryVertices") -run2_jme_2017.toModify(pileupJetIdNano, algos = _chsalgos_106X_UL17) -(run2_jme_2016 & ~tracker_apv_vfp30_2016 ).toModify(pileupJetIdNano, algos = _chsalgos_106X_UL16) -(run2_jme_2016 & tracker_apv_vfp30_2016 ).toModify(pileupJetIdNano, algos = _chsalgos_106X_UL16APV) -run2_nanoAOD_102Xv1.toModify(pileupJetIdNano, algos = _chsalgos_102x) -for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2: - modifier.toModify(pileupJetIdNano, algos = _chsalgos_94x) - -#before cross linking -jetUserDataTask = cms.Task(bJetVars, qgtagger, jercVars, tightJetId, tightJetIdLepVeto, pileupJetIdNano) -jetAK8UserDataTask = cms.Task(tightJetIdAK8,tightJetIdLepVetoAK8) - -_jetUserDataTask2016 = jetUserDataTask.copy() -_jetUserDataTask2016.add(looseJetId) -_jetAK8UserDataTask2016 = jetAK8UserDataTask.copy() -_jetAK8UserDataTask2016.add(looseJetIdAK8) - -for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: - modifier.toReplaceWith(jetUserDataTask,_jetUserDataTask2016) - modifier.toReplaceWith(jetAK8UserDataTask,_jetAK8UserDataTask2016) - -#HF shower shape recomputation -#Only run if needed (i.e. if default MINIAOD info is missing or outdated because of new JECs...) -from RecoJets.JetProducers.hfJetShowerShape_cfi import hfJetShowerShape -hfJetShowerShapeforNanoAOD = hfJetShowerShape.clone(jets="updatedJets",vertices="offlineSlimmedPrimaryVertices") -for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_102Xv1, run2_nanoAOD_106Xv1: - modifier.toModify(updatedJetsWithUserData.userFloats, - hfsigmaEtaEta = cms.InputTag('hfJetShowerShapeforNanoAOD:sigmaEtaEta'), - hfsigmaPhiPhi = cms.InputTag('hfJetShowerShapeforNanoAOD:sigmaPhiPhi'), - ) - modifier.toModify(updatedJetsWithUserData.userInts, - hfcentralEtaStripSize = cms.InputTag('hfJetShowerShapeforNanoAOD:centralEtaStripSize'), - hfadjacentEtaStripsSize = cms.InputTag('hfJetShowerShapeforNanoAOD:adjacentEtaStripsSize'), - ) - modifier.toModify( jetTable.variables, hfsigmaEtaEta = Var("userFloat('hfsigmaEtaEta')",float,doc="sigmaEtaEta for HF jets (noise discriminating variable)",precision=10)) - modifier.toModify( jetTable.variables, hfsigmaPhiPhi = Var("userFloat('hfsigmaPhiPhi')",float,doc="sigmaPhiPhi for HF jets (noise discriminating variable)",precision=10)) - modifier.toModify( jetTable.variables, hfcentralEtaStripSize = Var("userInt('hfcentralEtaStripSize')", int, doc="eta size of the central tower strip in HF (noise discriminating variable) ")) - modifier.toModify( jetTable.variables, hfadjacentEtaStripsSize = Var("userInt('hfadjacentEtaStripsSize')", int, doc="eta size of the strips next to the central tower strip in HF (noise discriminating variable) ")) - modifier.toModify(jetUserDataTask, jetUserDataTask.add(hfJetShowerShapeforNanoAOD)) - -#before cross linking -jetTask = cms.Task(jetCorrFactorsNano,updatedJets,jetUserDataTask,updatedJetsWithUserData,jetCorrFactorsAK8,updatedJetsAK8,jetAK8UserDataTask,updatedJetsAK8WithUserData,finalJets,finalJetsAK8) - -#after lepton collections have been run -jetLepTask = cms.Task(lepInJetVars) - -#after cross linkining -jetTablesTask = cms.Task(bjetNN,cjetNN,jetTable,fatJetTable,subJetTable) diff --git a/PhysicsTools/NanoAOD/python/muons_cff.py b/PhysicsTools/NanoAOD/python/muons_cff.py index 97ebc6228fc03..f0dc8a0669ab6 100644 --- a/PhysicsTools/NanoAOD/python/muons_cff.py +++ b/PhysicsTools/NanoAOD/python/muons_cff.py @@ -26,7 +26,7 @@ run2_nanoAOD_94X2016.toModify(isoForMu, EAFile_MiniIso = "PhysicsTools/NanoAOD/data/effAreaMuons_cone03_pfNeuHadronsAndPhotons_80X.txt") ptRatioRelForMu = cms.EDProducer("MuonJetVarProducer", - srcJet = cms.InputTag("updatedJets"), + srcJet = cms.InputTag("updatedJetsPuppi"), srcLep = cms.InputTag("slimmedMuonsUpdated"), srcVtx = cms.InputTag("offlineSlimmedPrimaryVertices"), ) @@ -154,6 +154,9 @@ run2_nanoAOD_102Xv1.toModify(muonTable.variables, puppiIsoId = None) +# Revert back to AK4 CHS jets for Run 2 +run2_nanoAOD_ANY.toModify(ptRatioRelForMu,srcJet="updatedJets") + muonsMCMatchForTable = cms.EDProducer("MCMatcher", # cut on deltaR, deltaPt/Pt; pick best by deltaR src = muonTable.src, # final reco collection diff --git a/PhysicsTools/NanoAOD/python/nano_cff.py b/PhysicsTools/NanoAOD/python/nano_cff.py index 18194d48d3a5f..226ca85b7580a 100644 --- a/PhysicsTools/NanoAOD/python/nano_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_cff.py @@ -2,7 +2,9 @@ import FWCore.ParameterSet.Config as cms from PhysicsTools.NanoAOD.common_cff import * from PhysicsTools.NanoAOD.nano_eras_cff import * -from PhysicsTools.NanoAOD.jets_cff import * +from PhysicsTools.NanoAOD.jetsAK4_CHS_cff import * +from PhysicsTools.NanoAOD.jetsAK4_Puppi_cff import * +from PhysicsTools.NanoAOD.jetsAK8_cff import * from PhysicsTools.NanoAOD.jetMC_cff import * from PhysicsTools.NanoAOD.muons_cff import * from PhysicsTools.NanoAOD.taus_cff import * @@ -34,13 +36,16 @@ ) linkedObjects = cms.EDProducer("PATObjectCrossLinker", - jets=cms.InputTag("finalJets"), + jets=cms.InputTag("finalJetsPuppi"), muons=cms.InputTag("finalMuons"), electrons=cms.InputTag("finalElectrons"), taus=cms.InputTag("finalTaus"), photons=cms.InputTag("finalPhotons"), ) +# Switch to AK4 CHS jets for Run-2 +run2_nanoAOD_ANY.toModify(linkedObjects, jets="finalJets") + simpleCleanerTable = cms.EDProducer("NanoAODSimpleCrossCleaner", name=cms.string("cleanmask"), doc=cms.string("simple cleaning mask with priority to leptons"), @@ -60,20 +65,30 @@ lhcInfoTable = cms.EDProducer("LHCInfoProducer", - precision = cms.int32(10), + precision = cms.int32(10), ) nanoTableTaskCommon = cms.Task( - cms.Task(nanoMetadata), jetTask, jetForMETTask, extraFlagsProducersTask, muonTask, tauTask, boostedTauTask, - electronTask , lowPtElectronTask, photonTask, - vertexTask, isoTrackTask, jetLepTask, # must be after all the leptons - softActivityTask, - cms.Task(linkedObjects), - jetTablesTask, muonTablesTask, fsrTablesTask, tauTablesTask, boostedTauTablesTask, - electronTablesTask, lowPtElectronTablesTask, photonTablesTask, - globalTablesTask, vertexTablesTask, metTablesTask, simpleCleanerTable, extraFlagsTableTask, - isoTrackTablesTask,softActivityTablesTask - ) + cms.Task(nanoMetadata), + jetPuppiTask, jetPuppiForMETTask, jetAK8Task, + extraFlagsProducersTask, muonTask, tauTask, boostedTauTask, + electronTask , lowPtElectronTask, photonTask, + vertexTask, isoTrackTask, jetAK8LepTask, # must be after all the leptons + softActivityTask, + cms.Task(linkedObjects), + jetPuppiTablesTask, jetAK8TablesTask, + muonTablesTask, fsrTablesTask, tauTablesTask, boostedTauTablesTask, + electronTablesTask, lowPtElectronTablesTask, photonTablesTask, + globalTablesTask, vertexTablesTask, metTablesTask, simpleCleanerTable, extraFlagsTableTask, + isoTrackTablesTask,softActivityTablesTask +) + +# Replace AK4 Puppi with AK4 CHS for Run-2 +_nanoTableTaskCommonRun2 = nanoTableTaskCommon.copy() +_nanoTableTaskCommonRun2.replace(jetPuppiTask, jetTask) +_nanoTableTaskCommonRun2.replace(jetPuppiForMETTask, jetForMETTask) +_nanoTableTaskCommonRun2.replace(jetPuppiTablesTask, jetTablesTask) +run2_nanoAOD_ANY.toReplaceWith(nanoTableTaskCommon, _nanoTableTaskCommonRun2) nanoSequenceCommon = cms.Sequence(nanoTableTaskCommon) @@ -82,10 +97,12 @@ nanoSequence = cms.Sequence(nanoSequenceCommon + nanoSequenceOnlyData + nanoSequenceOnlyFullSim) -nanoTableTaskFS = cms.Task(genParticleTask, particleLevelTask, jetMCTask, muonMCTask, electronMCTask, lowPtElectronMCTask, photonMCTask, - tauMCTask, boostedTauMCTask, - metMCTable, ttbarCatMCProducersTask, globalTablesMCTask, cms.Task(btagWeightTable), ttbarCategoryTableTask, - genWeightsTableTask, genVertexTablesTask, genParticleTablesTask, genProtonTablesTask, particleLevelTablesTask) +nanoTableTaskFS = cms.Task( + genParticleTask, particleLevelTask, jetMCTask, muonMCTask, electronMCTask, lowPtElectronMCTask, photonMCTask, + tauMCTask, boostedTauMCTask, + metMCTable, ttbarCatMCProducersTask, globalTablesMCTask, cms.Task(btagWeightTable), ttbarCategoryTableTask, + genWeightsTableTask, genVertexTablesTask, genParticleTablesTask, genProtonTablesTask, particleLevelTablesTask +) nanoSequenceFS = cms.Sequence(nanoSequenceCommon + cms.Sequence(nanoTableTaskFS)) @@ -131,31 +148,6 @@ def nanoAOD_addBoostedTauIds(process, idsToRun=[]): return process - -from PhysicsTools.PatAlgos.tools.jetTools import updateJetCollection -def nanoAOD_addDeepInfo(process,addDeepBTag,addDeepFlavour): - _btagDiscriminators=[] - if addDeepBTag: - print("Updating process to run DeepCSV btag") - _btagDiscriminators += ['pfDeepCSVJetTags:probb','pfDeepCSVJetTags:probbb','pfDeepCSVJetTags:probc'] - if addDeepFlavour: - print("Updating process to run DeepFlavour btag") - _btagDiscriminators += ['pfDeepFlavourJetTags:probb','pfDeepFlavourJetTags:probbb','pfDeepFlavourJetTags:problepb','pfDeepFlavourJetTags:probc'] - if len(_btagDiscriminators)==0: return process - print("Will recalculate the following discriminators: "+", ".join(_btagDiscriminators)) - updateJetCollection( - process, - jetSource = cms.InputTag('slimmedJets'), - jetCorrections = ('AK4PFchs', 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" - return process - - from PhysicsTools.PatUtils.tools.runMETCorrectionsAndUncertainties import runMetCorAndUncFromMiniAOD def nanoAOD_recalibrateMETs(process,isData): # add DeepMETs @@ -196,18 +188,18 @@ def nanoAOD_recalibrateMETs(process,isData): addToProcessAndTask('ak4PuppiJets', ak4PFJets.clone (src = 'puppi', doAreaFastjet = True, jetPtMin = 10.), process, task) from PhysicsTools.PatAlgos.tools.jetTools import addJetCollection addJetCollection(process, - labelName = 'Puppi', - jetSource = cms.InputTag('ak4PuppiJets'), - algo = 'AK', rParam=0.4, - genJetCollection=cms.InputTag('slimmedGenJets'), - jetCorrections = ('AK4PFPuppi', ['L1FastJet', 'L2Relative', 'L3Absolute','L2L3Residual'], 'None'), - pfCandidates = cms.InputTag('packedPFCandidates'), - pvSource = cms.InputTag('offlineSlimmedPrimaryVertices'), - svSource = cms.InputTag('slimmedSecondaryVertices'), - muSource =cms.InputTag( 'slimmedMuons'), - elSource = cms.InputTag('slimmedElectrons'), - genParticles= cms.InputTag('prunedGenParticles'), - getJetMCFlavour= False + labelName = 'Puppi', + jetSource = cms.InputTag('ak4PuppiJets'), + algo = 'AK', rParam=0.4, + genJetCollection=cms.InputTag('slimmedGenJets'), + jetCorrections = ('AK4PFPuppi', ['L1FastJet', 'L2Relative', 'L3Absolute','L2L3Residual'], 'None'), + pfCandidates = cms.InputTag('packedPFCandidates'), + pvSource = cms.InputTag('offlineSlimmedPrimaryVertices'), + svSource = cms.InputTag('slimmedSecondaryVertices'), + muSource =cms.InputTag( 'slimmedMuons'), + elSource = cms.InputTag('slimmedElectrons'), + genParticles= cms.InputTag('prunedGenParticles'), + getJetMCFlavour= False ) process.patJetsPuppi.addGenPartonMatch = cms.bool(False) @@ -246,52 +238,6 @@ def nanoAOD_activateVID(process): modifier.toModify(process.egmPhotonIDs, physicsObjectSrc = "slimmedPhotonsTo106X") return process -def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubleX, addDeepDoubleXV2, addParticleNet, addParticleNetMass, jecPayload): - _btagDiscriminators=[] - if addDeepBTag: - print("Updating process to run DeepCSV btag to AK8 jets") - _btagDiscriminators += ['pfDeepCSVJetTags:probb','pfDeepCSVJetTags:probbb'] - if addDeepBoostedJet: - print("Updating process to run DeepBoostedJet on datasets before 103X") - from RecoBTag.ONNXRuntime.pfDeepBoostedJet_cff import _pfDeepBoostedJetTagsAll as pfDeepBoostedJetTagsAll - _btagDiscriminators += pfDeepBoostedJetTagsAll - if addParticleNet: - print("Updating process to run ParticleNet before it's included in MiniAOD") - from RecoBTag.ONNXRuntime.pfParticleNet_cff import _pfParticleNetJetTagsAll as pfParticleNetJetTagsAll - _btagDiscriminators += pfParticleNetJetTagsAll - if addParticleNetMass: - from RecoBTag.ONNXRuntime.pfParticleNet_cff import _pfParticleNetMassRegressionOutputs - _btagDiscriminators += _pfParticleNetMassRegressionOutputs - if addDeepDoubleX: - print("Updating process to run DeepDoubleX on datasets before 104X") - _btagDiscriminators += ['pfDeepDoubleBvLJetTags:probHbb', \ - 'pfDeepDoubleCvLJetTags:probHcc', \ - 'pfDeepDoubleCvBJetTags:probHcc', \ - 'pfMassIndependentDeepDoubleBvLJetTags:probHbb', 'pfMassIndependentDeepDoubleCvLJetTags:probHcc', 'pfMassIndependentDeepDoubleCvBJetTags:probHcc'] - if addDeepDoubleXV2: - print("Updating process to run DeepDoubleXv2 on datasets before 11X") - _btagDiscriminators += [ - 'pfMassIndependentDeepDoubleBvLV2JetTags:probHbb', - 'pfMassIndependentDeepDoubleCvLV2JetTags:probHcc', - 'pfMassIndependentDeepDoubleCvBV2JetTags:probHcc' - ] - if len(_btagDiscriminators)==0: return process - print("Will recalculate the following discriminators on AK8 jets: "+", ".join(_btagDiscriminators)) - updateJetCollection( - process, - jetSource = cms.InputTag('slimmedJetsAK8'), - pvSource = cms.InputTag('offlineSlimmedPrimaryVertices'), - svSource = cms.InputTag('slimmedSecondaryVertices'), - rParam = 0.8, - jetCorrections = (jecPayload.value(), cms.vstring(['L1FastJet', 'L2Relative', 'L3Absolute', 'L2L3Residual']), 'None'), - btagDiscriminators = _btagDiscriminators, - postfix='AK8WithDeepInfo', - printWarning = False - ) - process.jetCorrFactorsAK8.src="selectedUpdatedPatJetsAK8WithDeepInfo" - process.updatedJetsAK8.jetSource="selectedUpdatedPatJetsAK8WithDeepInfo" - return process - from PhysicsTools.PatUtils.tools.runMETCorrectionsAndUncertainties import runMetCorAndUncFromMiniAOD def nanoAOD_runMETfixEE2017(process,isData): runMetCorAndUncFromMiniAOD(process,isData=isData, @@ -304,59 +250,24 @@ def nanoAOD_runMETfixEE2017(process,isData): def nanoAOD_customizeCommon(process): process = nanoAOD_activateVID(process) - nanoAOD_addDeepInfo_switch = cms.PSet( - nanoAOD_addDeepBTag_switch = cms.untracked.bool(False), - nanoAOD_addDeepFlavourTag_switch = cms.untracked.bool(False), - ) - run2_miniAOD_80XLegacy.toModify(nanoAOD_addDeepInfo_switch, nanoAOD_addDeepBTag_switch = cms.untracked.bool(True)) - for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2: - modifier.toModify(nanoAOD_addDeepInfo_switch, nanoAOD_addDeepFlavourTag_switch = cms.untracked.bool(True)) - process = nanoAOD_addDeepInfo(process, - addDeepBTag=nanoAOD_addDeepInfo_switch.nanoAOD_addDeepBTag_switch, - addDeepFlavour=nanoAOD_addDeepInfo_switch.nanoAOD_addDeepFlavourTag_switch) - nanoAOD_addDeepInfoAK8_switch = cms.PSet( - nanoAOD_addDeepBTag_switch = cms.untracked.bool(False), - nanoAOD_addDeepBoostedJet_switch = cms.untracked.bool(False), - nanoAOD_addDeepDoubleX_switch = cms.untracked.bool(False), - nanoAOD_addDeepDoubleXV2_switch = cms.untracked.bool(False), - nanoAOD_addParticleNet_switch = cms.untracked.bool(False), - nanoAOD_addParticleNetMass_switch = cms.untracked.bool(False), - jecPayload = cms.untracked.string('AK8PFPuppi') - ) - # deepAK8 should not run on 80X, that contains ak8PFJetsCHS jets - run2_miniAOD_80XLegacy.toModify(nanoAOD_addDeepInfoAK8_switch, - nanoAOD_addDeepBTag_switch = True, - jecPayload = 'AK8PFchs') - # for 94X and 102X samples: needs to run DeepAK8, DeepDoubleX and ParticleNet - (run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2 | run2_nanoAOD_102Xv1).toModify( - nanoAOD_addDeepInfoAK8_switch, - nanoAOD_addDeepBoostedJet_switch = True, - nanoAOD_addDeepDoubleX_switch = True, - nanoAOD_addDeepDoubleXV2_switch = True, - nanoAOD_addParticleNet_switch = True, - nanoAOD_addParticleNetMass_switch = True, - ) - # for 106Xv1: only needs to run ParticleNet and DDXV2; DeepAK8, DeepDoubleX are already in MiniAOD - run2_nanoAOD_106Xv1.toModify( - nanoAOD_addDeepInfoAK8_switch, - nanoAOD_addDeepDoubleXV2_switch = True, - nanoAOD_addParticleNet_switch = True, - nanoAOD_addParticleNetMass_switch = True, - ) - run2_nanoAOD_106Xv2.toModify( - nanoAOD_addDeepInfoAK8_switch, - nanoAOD_addParticleNetMass_switch = True, + # This function is defined in jetsAK4_CHS_cff.py + process = nanoAOD_addDeepInfoAK4CHS(process, + addDeepBTag=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addDeepBTag_switch, + addDeepFlavour=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addDeepFlavourTag_switch ) + # This function is defined in jetsAK8_cff.py process = nanoAOD_addDeepInfoAK8(process, - addDeepBTag=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepBTag_switch, - addDeepBoostedJet=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepBoostedJet_switch, - addDeepDoubleX=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepDoubleX_switch, - addDeepDoubleXV2=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepDoubleXV2_switch, - addParticleNet=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addParticleNet_switch, - addParticleNetMass=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addParticleNetMass_switch, - jecPayload=nanoAOD_addDeepInfoAK8_switch.jecPayload) + addDeepBTag=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepBTag_switch, + addDeepBoostedJet=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepBoostedJet_switch, + addDeepDoubleX=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepDoubleX_switch, + addDeepDoubleXV2=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepDoubleXV2_switch, + addParticleNet=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addParticleNet_switch, + addParticleNetMass=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addParticleNetMass_switch, + jecPayload=nanoAOD_addDeepInfoAK8_switch.jecPayload + ) + nanoAOD_tau_switch = cms.PSet( idsToAdd = cms.vstring() ) @@ -372,7 +283,6 @@ def nanoAOD_customizeCommon(process): def nanoAOD_customizeData(process): process = nanoAOD_customizeCommon(process) - for modifier in run2_miniAOD_80XLegacy,run2_nanoAOD_94X2016,run2_nanoAOD_94XMiniAODv1,run2_nanoAOD_94XMiniAODv2,run2_nanoAOD_102Xv1,run2_nanoAOD_106Xv1: modifier.toModify(process, lambda p: nanoAOD_recalibrateMETs(p,isData=True)) for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2: diff --git a/PhysicsTools/NanoAOD/python/nano_eras_cff.py b/PhysicsTools/NanoAOD/python/nano_eras_cff.py index 522d55ff1db1b..3fdcf78ed0456 100644 --- a/PhysicsTools/NanoAOD/python/nano_eras_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_eras_cff.py @@ -21,3 +21,7 @@ from Configuration.Eras.Modifier_tracker_apv_vfp30_2016_cff import tracker_apv_vfp30_2016 from Configuration.Eras.Modifier_run3_nanoAOD_devel_cff import run3_nanoAOD_devel + +run2_nanoAOD_ANY = ( + run2_miniAOD_80XLegacy | run2_nanoAOD_92X | run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2 | run2_nanoAOD_102Xv1 | run2_nanoAOD_106Xv1 | run2_nanoAOD_106Xv2 +) \ No newline at end of file