Back to home page

Project CMSSW displayed by LXR

 
 

    


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 ##################### Updated tau collection with MVA-based tau-Ids rerun #######
0010 # Used only in some eras
0011 from PhysicsTools.NanoAOD.taus_updatedMVAIds_cff import *
0012 
0013 ##################### User floats producers, selectors ##########################
0014 
0015 # Original DeepTau v2p5 in 12_4_X doesn't include WPs in MINIAOD
0016 # Import thresholds here to define WPs manually from raw scores
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 ##################### Tables for final output and docs ##########################
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        # these are too many, we may have to suppress some
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",  # cut on deltaR, deltaPt/Pt; pick best by deltaR
0187     src         = tauTable.src,                 # final reco collection
0188     matched     = cms.InputTag("finalGenParticles"), # final mc-truth particle collection
0189     mcPdgId     = cms.vint32(11,13),            # one or more PDG ID (11 = electron, 13 = muon); absolute values (see below)
0190     checkCharge = cms.bool(False),              # True = require RECO and MC objects to have the same charge
0191     mcStatus    = cms.vint32(),                 # PYTHIA status code (1 = stable, 2 = shower, 3 = hard scattering)
0192     maxDeltaR   = cms.double(0.3),              # Minimum deltaR for the match
0193     maxDPtRel   = cms.double(0.5),              # Minimum deltaPt/Pt for the match
0194     resolveAmbiguities    = cms.bool(True),     # Forbid two RECO objects to match to the same GEN object
0195     resolveByMatchQuality = cms.bool(True),     # False = just match input in order; True = pick lowest deltaR pair first
0196 )
0197 
0198 tausMCMatchHadTauForTable = cms.EDProducer("MCMatcher",  # cut on deltaR, deltaPt/Pt; pick best by deltaR
0199     src         = tauTable.src,                 # final reco collection
0200     matched     = cms.InputTag("genVisTaus"),   # generator level hadronic tau decays
0201     mcPdgId     = cms.vint32(15),               # one or more PDG ID (15 = tau); absolute values (see below)
0202     checkCharge = cms.bool(False),              # True = require RECO and MC objects to have the same charge
0203     mcStatus    = cms.vint32(),                 # CV: no *not* require certain status code for matching (status code corresponds to decay mode for hadronic tau decays)
0204     maxDeltaR   = cms.double(0.3),              # Maximum deltaR for the match
0205     maxDPtRel   = cms.double(1.),               # Maximum deltaPt/Pt for the match
0206     resolveAmbiguities    = cms.bool(True),     # Forbid two RECO objects to match to the same GEN object
0207     resolveByMatchQuality = cms.bool(True),     # False = just match input in order; True = pick lowest deltaR pair first
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, #cms.string("Tau"),
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