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