File indexing completed on 2024-10-08 23:09:53
0001 import FWCore.ParameterSet.Config as cms
0002 from PhysicsTools.NanoAOD.common_cff import *
0003 from PhysicsTools.NanoAOD.simpleCandidateFlatTableProducer_cfi import simpleCandidateFlatTableProducer
0004 from PhysicsTools.NanoAOD.simpleGenParticleFlatTableProducer_cfi import simpleGenParticleFlatTableProducer
0005 from PhysicsTools.NanoAOD.simplePATTauFlatTableProducer_cfi import simplePATTauFlatTableProducer
0006
0007 from PhysicsTools.JetMCAlgos.TauGenJets_cfi import tauGenJets
0008 from PhysicsTools.JetMCAlgos.TauGenJetsDecayModeSelectorAllHadrons_cfi import tauGenJetsSelectorAllHadrons
0009
0010 from PhysicsTools.PatAlgos.patTauSignalCandidatesProducer_cfi import patTauSignalCandidatesProducer
0011
0012
0013
0014
0015
0016 from RecoTauTag.RecoTau.tauIdWPsDefs import WORKING_POINTS_v2p5
0017
0018 finalTaus = cms.EDFilter("PATTauRefSelector",
0019 src = cms.InputTag("slimmedTaus"),
0020 cut = cms.string("pt > 18 && ((tauID('decayModeFindingNewDMs') > 0.5 && (tauID('byLooseCombinedIsolationDeltaBetaCorr3Hits') || (tauID('chargedIsoPtSumdR03')+max(0.,tauID('neutralIsoPtSumdR03')-0.072*tauID('puCorrPtSum'))<2.5) || tauID('byVVVLooseDeepTau2018v2p5VSjet'))) || (?isTauIDAvailable('byUTagCHSVSjetraw')?tauID('byUTagCHSVSjetraw'):-1) > {} || (?isTauIDAvailable('byUTagPUPPIVSjetraw')?tauID('byUTagPUPPIVSjetraw'):-1) > {})".format(0.05, 0.05))
0021 )
0022
0023
0024 def _tauIdWPMask(pattern, choices, doc="", from_raw=False, wp_thrs=None):
0025 if from_raw:
0026 assert wp_thrs is not None, "wp_thrs argument in _tauIdWPMask() is None, expect it to be dict-like"
0027
0028 var_definition = []
0029 for wp_name in choices:
0030 if not isinstance(wp_thrs[wp_name], float):
0031 raise TypeError("Threshold for WP=%s is not a float number." % wp_name)
0032 wp_definition = "test_bit(tauID('{}')-{}+1,0)".format(pattern, wp_thrs[wp_name])
0033 var_definition.append(wp_definition)
0034 var_definition = " + ".join(var_definition)
0035 var_definition = ("?isTauIDAvailable('%s')?(" % pattern) + var_definition + "):0"
0036 else:
0037 var_definition = " + ".join(["tauID('%s')" % (pattern % c) for c in choices])
0038 var_definition = ("?isTauIDAvailable('%s')?(" % (pattern % choices[0])) + var_definition + "):0"
0039
0040 doc = doc + ": "+", ".join(["%d = %s" % (i,c) for (i,c) in enumerate(choices, start=1)])
0041 return Var(var_definition, "uint8", doc=doc)
0042
0043
0044 tauTable = simplePATTauFlatTableProducer.clone(
0045 src = cms.InputTag("linkedObjects","taus"),
0046 name= cms.string("Tau"),
0047 doc = cms.string("slimmedTaus after basic selection (" + finalTaus.cut.value()+")")
0048 )
0049
0050 _tauVarsBase = cms.PSet(P4Vars,
0051 charge = Var("charge", "int16", doc="electric charge"),
0052 jetIdx = Var("?hasUserCand('jet')?userCand('jet').key():-1", "int16", doc="index of the associated jet (-1 if none)"),
0053 eleIdx = Var("?overlaps('electrons').size()>0?overlaps('electrons')[0].key():-1", "int16", doc="index of first matching electron"),
0054 muIdx = Var("?overlaps('muons').size()>0?overlaps('muons')[0].key():-1", "int16", doc="index of first matching muon"),
0055 svIdx1 = Var("?overlaps('vertices').size()>0?overlaps('vertices')[0].key():-1", "int16", doc="index of first matching secondary vertex"),
0056 svIdx2 = Var("?overlaps('vertices').size()>1?overlaps('vertices')[1].key():-1", "int16", doc="index of second matching secondary vertex"),
0057 nSVs = Var("?hasOverlaps('vertices')?overlaps('vertices').size():0", "uint8", doc="number of secondary vertices in the tau"),
0058 decayMode = Var("decayMode()", "uint8"),
0059 idDecayModeOldDMs = Var("(?isTauIDAvailable('decayModeFinding')?tauID('decayModeFinding'):-1) > 0", bool),
0060 idDecayModeNewDMs = Var("(?isTauIDAvailable('decayModeFindingNewDMs')?tauID('decayModeFindingNewDMs'):-1) > 0", bool),
0061 leadTkPtOverTauPt = Var("?leadChargedHadrCand.isNonnull()?leadChargedHadrCand.pt/pt:1",float, doc="pt of the leading track divided by tau pt",precision=10),
0062 leadTkDeltaEta = Var("?leadChargedHadrCand.isNonnull()?(leadChargedHadrCand.eta - eta):0",float, doc="eta of the leading track, minus tau eta",precision=8),
0063 leadTkDeltaPhi = Var("?leadChargedHadrCand.isNonnull()?deltaPhi(leadChargedHadrCand.phi, phi):0",float, doc="phi of the leading track, minus tau phi",precision=8),
0064
0065
0066 dxy = Var("?leadChargedHadrCand.isNonnull()?leadChargedHadrCand().dxy():0",float, doc="d_{xy} of lead track with respect to PV, in cm (with sign)",precision=10, lazyEval=True),
0067 dz = Var("?leadChargedHadrCand.isNonnull()?leadChargedHadrCand().dz():0",float, doc="d_{z} of lead track with respect to PV, in cm (with sign)",precision=14, lazyEval=True),
0068
0069
0070 rawIso = Var("?isTauIDAvailable('byCombinedIsolationDeltaBetaCorrRaw3Hits')?tauID('byCombinedIsolationDeltaBetaCorrRaw3Hits'):-1", float, doc = "combined isolation (deltaBeta corrections)", precision=10),
0071 rawIsodR03 = Var("?isTauIDAvailable('chargedIsoPtSumdR03')?(tauID('chargedIsoPtSumdR03')+max(0.,tauID('neutralIsoPtSumdR03')-0.072*tauID('puCorrPtSum'))):-1", float, doc = "combined isolation (deltaBeta corrections, dR=0.3)", precision=10),
0072 chargedIso = Var("?isTauIDAvailable('chargedIsoPtSum')?tauID('chargedIsoPtSum'):-1", float, doc = "charged isolation", precision=10),
0073 neutralIso = Var("?isTauIDAvailable('neutralIsoPtSum')?tauID('neutralIsoPtSum'):-1", float, doc = "neutral (photon) isolation", precision=10),
0074 puCorr = Var("?isTauIDAvailable('puCorrPtSum')?tauID('puCorrPtSum'):-1", float, doc = "pileup correction", precision=10),
0075 photonsOutsideSignalCone = Var("?isTauIDAvailable('photonPtSumOutsideSignalCone')?tauID('photonPtSumOutsideSignalCone'):-1", float, doc = "sum of photons outside signal cone", precision=10),
0076
0077 idAntiMu = _tauIdWPMask("againstMuon%s3", choices=("Loose","Tight"), doc= "Anti-muon discriminator V3: "),
0078 idAntiEleDeadECal = Var("(?isTauIDAvailable('againstElectronDeadECAL')?tauID('againstElectronDeadECAL'):-1) > 0", bool, doc = "Anti-electron dead-ECal discriminator"),
0079
0080 )
0081
0082 _deepTauVars2018v2p5 = cms.PSet(
0083 rawDeepTau2018v2p5VSe = Var("?isTauIDAvailable('byDeepTau2018v2p5VSeraw')?tauID('byDeepTau2018v2p5VSeraw'):-1", float, doc="byDeepTau2018v2p5VSe raw output discriminator (deepTau2018v2p5)", precision=10),
0084 rawDeepTau2018v2p5VSmu = Var("?isTauIDAvailable('byDeepTau2018v2p5VSmuraw')?tauID('byDeepTau2018v2p5VSmuraw'):-1", float, doc="byDeepTau2018v2p5VSmu raw output discriminator (deepTau2018v2p5)", precision=10),
0085 rawDeepTau2018v2p5VSjet = Var("?isTauIDAvailable('byDeepTau2018v2p5VSjetraw')?tauID('byDeepTau2018v2p5VSjetraw'):-1", float, doc="byDeepTau2018v2p5VSjet raw output discriminator (deepTau2018v2p5)", precision=10),
0086 idDeepTau2018v2p5VSe = _tauIdWPMask("by%sDeepTau2018v2p5VSe",
0087 choices=("VVVLoose","VVLoose","VLoose","Loose","Medium","Tight","VTight","VVTight"),
0088 doc="byDeepTau2018v2p5VSe ID working points (deepTau2018v2p5)"),
0089 idDeepTau2018v2p5VSmu = _tauIdWPMask("by%sDeepTau2018v2p5VSmu",
0090 choices=("VLoose", "Loose", "Medium", "Tight"),
0091 doc="byDeepTau2018v2p5VSmu ID working points (deepTau2018v2p5)"),
0092 idDeepTau2018v2p5VSjet = _tauIdWPMask("by%sDeepTau2018v2p5VSjet",
0093 choices=("VVVLoose","VVLoose","VLoose","Loose","Medium","Tight","VTight","VVTight"),
0094 doc="byDeepTau2018v2p5VSjet ID working points (deepTau2018v2p5)"),
0095 )
0096
0097 _UTagCHS = cms.PSet(
0098 decayModePNet = Var("?isTauIDAvailable('byUTagCHSDecayMode')?tauID('byUTagCHSDecayMode'):-1", "int16",doc="decay mode of the highest tau score of ParticleNet (CHS Jets)"),
0099 rawPNetVSe = Var("?isTauIDAvailable('byUTagCHSVSeraw')?tauID('byUTagCHSVSeraw'):-1", float, doc="raw output of ParticleNetVsE discriminator (PNet 2023 - CHS Jets)", precision=10),
0100 rawPNetVSmu = Var("?isTauIDAvailable('byUTagCHSVSmuraw')?tauID('byUTagCHSVSmuraw'):-1", float, doc="raw output of ParticleNetVsMu discriminator (PNet 2023 - CHS Jets)", precision=10),
0101 rawPNetVSjet = Var("?isTauIDAvailable('byUTagCHSVSjetraw')?tauID('byUTagCHSVSjetraw'):-1", float, doc="raw output of ParticleNetVsJet discriminator (PNet 2023 - CHS Jets)", precision=10),
0102 ptCorrPNet = Var("?isTauIDAvailable('byUTagCHSPtCorr')?tauID('byUTagCHSPtCorr'):1", float, doc="pt correction (PNet 2023 - CHS Jets)", precision=10),
0103 qConfPNet = Var("?isTauIDAvailable('byUTagCHSQConf')?tauID('byUTagCHSQConf'):0", float, doc="signed charge confidence (PNet 2023 - CHS Jets)", precision=10),
0104 probDM0PNet = Var("?isTauIDAvailable('byUTagCHSProb1h0pi0')?tauID('byUTagCHSProb1h0pi0'):-1", float, doc="normalised probablity of decayMode 0, 1h+0pi0 (PNet 2023 - CHS Jets)", precision=10),
0105 probDM1PNet = Var("?isTauIDAvailable('byUTagCHSProb1h1pi0')?tauID('byUTagCHSProb1h1pi0'):-1", float, doc="normalised probablity of decayMode 1, 1h+1pi0 (PNet 2023 - CHS Jets)", precision=10),
0106 probDM2PNet = Var("?isTauIDAvailable('byUTagCHSProb1h2pi0')?tauID('byUTagCHSProb1h2pi0'):-1", float, doc="normalised probablity of decayMode 2, 1h+2pi0 (PNet 2023 - CHS Jets)", precision=10),
0107 probDM10PNet = Var("?isTauIDAvailable('byUTagCHSProb3h0pi0')?tauID('byUTagCHSProb3h0pi0'):-1", float, doc="normalised probablity of decayMode 10, 3h+0pi0 (PNet 2023 - CHS Jets)", precision=10),
0108 probDM11PNet = Var("?isTauIDAvailable('byUTagCHSProb3h1pi0')?tauID('byUTagCHSProb3h1pi0'):-1", float, doc="normalised probablity of decayMode 11, 3h+1pi0 (PNet 2023 - CHS Jets)", precision=10),
0109 )
0110
0111 _UTagPUPPI = cms.PSet(
0112 decayModeUParT= Var("?isTauIDAvailable('byUTagPUPPIDecayMode')?tauID('byUTagPUPPIDecayMode'):-1", "int16",doc="decay mode of the highest tau score of Unified ParT 2024 (PUPPI Jets)"),
0113 rawUParTVSe = Var("?isTauIDAvailable('byUTagPUPPIVSeraw')?tauID('byUTagPUPPIVSeraw'):-1", float, doc="raw output of UParTVsE discriminator (Unified ParT 2024 - PUPPI Jets)", precision=10),
0114 rawUParTVSmu = Var("?isTauIDAvailable('byUTagPUPPIVSmuraw')?tauID('byUTagPUPPIVSmuraw'):-1", float, doc="raw output of UParTVsMu discriminator (Unified ParT 2024 - PUPPI Jets)", precision=10),
0115 rawUParTVSjet = Var("?isTauIDAvailable('byUTagPUPPIVSjetraw')?tauID('byUTagPUPPIVSjetraw'):-1", float, doc="raw output of UParTVsJet discriminator (Unified ParT 2024 - PUPPI Jets)", precision=10),
0116 ptCorrUParT= Var("?isTauIDAvailable('byUTagPUPPIPtCorr')?tauID('byUTagPUPPIPtCorr'):1", float, doc="pt correction (Unified ParT 2024 - PUPPI Jets)", precision=10),
0117 qConfUParT= Var("?isTauIDAvailable('byUTagPUPPIQConf')?tauID('byUTagPUPPIQConf'):0", float, doc="signed charge confidence (Unified ParT 2024 - PUPPI Jets)", precision=10),
0118 probDM0UParT= Var("?isTauIDAvailable('byUTagPUPPIProb1h0pi0')?tauID('byUTagPUPPIProb1h0pi0'):-1", float, doc="normalised probablity of decayMode 0, 1h+0pi0 (Unified ParT 2024 - PUPPI Jets)", precision=10),
0119 probDM1UParT= Var("?isTauIDAvailable('byUTagPUPPIProb1h1pi0')?tauID('byUTagPUPPIProb1h1pi0'):-1", float, doc="normalised probablity of decayMode 1, 1h+1pi0 (Unified ParT 2024 - PUPPI Jets)", precision=10),
0120 probDM2UParT= Var("?isTauIDAvailable('byUTagPUPPIProb1h2pi0')?tauID('byUTagPUPPIProb1h2pi0'):-1", float, doc="normalised probablity of decayMode 2, 1h+2pi0 (Unified ParT 2024 - PUPPI Jets)", precision=10),
0121 probDM10UParT= Var("?isTauIDAvailable('byUTagPUPPIProb3h0pi0')?tauID('byUTagPUPPIProb3h0pi0'):-1", float, doc="normalised probablity of decayMode 10, 3h+0pi0 (Unified ParT 2024 - PUPPI Jets)", precision=10),
0122 probDM11UParT= Var("?isTauIDAvailable('byUTagPUPPIProb3h1pi0')?tauID('byUTagPUPPIProb3h1pi0'):-1", float, doc="normalised probablity of decayMode 11, 3h+1pi0 (Unified ParT 2024 - PUPPI Jets)", precision=10),
0123 )
0124
0125 _variablesMiniV2 = cms.PSet(
0126 _tauVarsBase,
0127 _deepTauVars2018v2p5,
0128 _UTagCHS,
0129 _UTagPUPPI
0130 )
0131
0132 tauTable.variables = _variablesMiniV2
0133
0134 tauSignalCands = patTauSignalCandidatesProducer.clone(
0135 src = tauTable.src,
0136 storeLostTracks = True
0137 )
0138
0139 tauSignalCandsTable = simpleCandidateFlatTableProducer.clone(
0140 src = cms.InputTag("tauSignalCands"),
0141 cut = cms.string("pt > 0."),
0142 name = cms.string("TauProd"),
0143 doc = cms.string("tau signal candidates"),
0144 variables = cms.PSet(
0145 P3Vars,
0146 pdgId = Var("pdgId", int, doc="PDG code assigned by the event reconstruction (not by MC truth)"),
0147 tauIdx = Var("status", "int16", doc="index of the mother tau"),
0148
0149 )
0150 )
0151
0152 tauGenJetsForNano = tauGenJets.clone(
0153 GenParticles = "finalGenParticles",
0154 includeNeutrinos = False
0155 )
0156
0157 tauGenJetsSelectorAllHadronsForNano = tauGenJetsSelectorAllHadrons.clone(
0158 src = "tauGenJetsForNano"
0159 )
0160
0161 genVisTaus = cms.EDProducer("GenVisTauProducer",
0162 src = cms.InputTag("tauGenJetsSelectorAllHadronsForNano"),
0163 srcGenParticles = cms.InputTag("finalGenParticles")
0164 )
0165
0166 genVisTauTable = simpleGenParticleFlatTableProducer.clone(
0167 src = cms.InputTag("genVisTaus"),
0168 cut = cms.string("pt > 10."),
0169 name = cms.string("GenVisTau"),
0170 doc = cms.string("gen hadronic taus "),
0171 variables = cms.PSet(
0172 pt = Var("pt", float,precision=8),
0173 phi = Var("phi", float,precision=8),
0174 eta = Var("eta", float,precision=8),
0175 mass = Var("mass", float,precision=8),
0176 charge = Var("charge", "int16"),
0177 status = Var("status", "uint8", doc="Hadronic tau decay mode. 0=OneProng0PiZero, 1=OneProng1PiZero, 2=OneProng2PiZero, 10=ThreeProng0PiZero, 11=ThreeProng1PiZero, 15=Other"),
0178 genPartIdxMother = Var("?numberOfMothers>0?motherRef(0).key():-1", "int16", doc="index of the mother particle"),
0179 )
0180 )
0181
0182 tausMCMatchLepTauForTable = cms.EDProducer("MCMatcher",
0183 src = tauTable.src,
0184 matched = cms.InputTag("finalGenParticles"),
0185 mcPdgId = cms.vint32(11,13),
0186 checkCharge = cms.bool(False),
0187 mcStatus = cms.vint32(),
0188 maxDeltaR = cms.double(0.3),
0189 maxDPtRel = cms.double(0.5),
0190 resolveAmbiguities = cms.bool(True),
0191 resolveByMatchQuality = cms.bool(True),
0192 )
0193
0194 tausMCMatchHadTauForTable = cms.EDProducer("MCMatcher",
0195 src = tauTable.src,
0196 matched = cms.InputTag("genVisTaus"),
0197 mcPdgId = cms.vint32(15),
0198 checkCharge = cms.bool(False),
0199 mcStatus = cms.vint32(),
0200 maxDeltaR = cms.double(0.3),
0201 maxDPtRel = cms.double(1.),
0202 resolveAmbiguities = cms.bool(True),
0203 resolveByMatchQuality = cms.bool(True),
0204 )
0205
0206 tauMCTable = cms.EDProducer("CandMCMatchTableProducer",
0207 src = tauTable.src,
0208 mcMap = cms.InputTag("tausMCMatchLepTauForTable"),
0209 mcMapVisTau = cms.InputTag("tausMCMatchHadTauForTable"),
0210 objName = tauTable.name,
0211 objType = tauTable.name,
0212 branchName = cms.string("genPart"),
0213 docString = cms.string("MC matching to status==2 taus"),
0214 )
0215
0216
0217 tauTask = cms.Task(finalTaus)
0218 tauTablesTask = cms.Task(tauTable)
0219 tauSignalCandsTask = cms.Task(tauSignalCands,tauSignalCandsTable)
0220 tauTablesTask.add(tauSignalCandsTask)
0221
0222 genTauTask = cms.Task(tauGenJetsForNano,tauGenJetsSelectorAllHadronsForNano,genVisTaus,genVisTauTable)
0223 tauMCTask = cms.Task(genTauTask,tausMCMatchLepTauForTable,tausMCMatchHadTauForTable,tauMCTable)
0224