CMS 3D CMS Logo

taus_cff.py
Go to the documentation of this file.
1 import FWCore.ParameterSet.Config as cms
3 from PhysicsTools.JetMCAlgos.TauGenJets_cfi import tauGenJets
4 from PhysicsTools.JetMCAlgos.TauGenJetsDecayModeSelectorAllHadrons_cfi import tauGenJetsSelectorAllHadrons
5 
6 ##################### Updated tau collection with MVA-based tau-Ids rerun #######
7 # Used only in some eras
9 
10 ##################### User floats producers, selectors ##########################
11 
12 
13 finalTaus = cms.EDFilter("PATTauRefSelector",
14  src = cms.InputTag("slimmedTausUpdated"),
15  cut = cms.string("pt > 18 && tauID('decayModeFindingNewDMs') && (tauID('byLooseCombinedIsolationDeltaBetaCorr3Hits') || tauID('byVLooseIsolationMVArun2v1DBoldDMwLT2015') || tauID('byVLooseIsolationMVArun2v1DBnewDMwLT') || tauID('byVLooseIsolationMVArun2v1DBdR03oldDMwLT') || tauID('byVVLooseIsolationMVArun2v1DBoldDMwLT') || tauID('byVVLooseIsolationMVArun2v1DBoldDMwLT2017v2') || tauID('byVVLooseIsolationMVArun2v1DBnewDMwLT2017v2') || tauID('byVVLooseIsolationMVArun2v1DBdR03oldDMwLT2017v2'))")
16 )
17 for era in [eras.run2_nanoAOD_94XMiniAODv1,eras.run2_nanoAOD_92X]:
18  era.toModify(finalTaus,
19  cut = cms.string("pt > 18 && tauID('decayModeFindingNewDMs') && (tauID('byLooseCombinedIsolationDeltaBetaCorr3Hits') || tauID('byVLooseIsolationMVArun2v1DBoldDMwLT') || tauID('byVLooseIsolationMVArun2v1DBnewDMwLT') || tauID('byVLooseIsolationMVArun2v1DBdR03oldDMwLT') || tauID('byVVLooseIsolationMVArun2v1DBoldDMwLT2017v1') || tauID('byVVLooseIsolationMVArun2v1DBoldDMwLT2017v2') || tauID('byVVLooseIsolationMVArun2v1DBnewDMwLT2017v2') || tauID('byVVLooseIsolationMVArun2v1DBdR03oldDMwLT2017v2'))")
20  )
21 eras.run2_miniAOD_80XLegacy.toModify(finalTaus,
22  src = cms.InputTag("slimmedTaus"),
23  cut = cms.string("pt > 18 && tauID('decayModeFindingNewDMs') && (tauID('byLooseCombinedIsolationDeltaBetaCorr3Hits') || tauID('byVLooseIsolationMVArun2v1DBoldDMwLT') || tauID('byVLooseIsolationMVArun2v1DBnewDMwLT') || tauID('byVLooseIsolationMVArun2v1DBdR03oldDMwLT'))")
24  )
25 
26 ##################### Tables for final output and docs ##########################
27 def _tauIdWPMask(pattern, choices, doc=""):
28  return Var(" + ".join(["%d * tauID('%s')" % (pow(2,i), pattern % c) for (i,c) in enumerate(choices)]), "uint8",
29  doc=doc+": bitmask "+", ".join(["%d = %s" % (pow(2,i),c) for (i,c) in enumerate(choices)]))
30 def _tauId2WPMask(pattern,doc):
31  return _tauIdWPMask(pattern,choices=("Loose","Tight"),doc=doc)
32 def _tauId3WPMask(pattern,doc):
33  return _tauIdWPMask(pattern,choices=("Loose","Medium","Tight"),doc=doc)
34 def _tauId5WPMask(pattern,doc):
35  return _tauIdWPMask(pattern,choices=("VLoose","Loose","Medium","Tight","VTight"),doc=doc)
36 def _tauId6WPMask(pattern,doc):
37  return _tauIdWPMask(pattern,choices=("VLoose","Loose","Medium","Tight","VTight","VVTight"),doc=doc)
38 def _tauId7WPMask(pattern,doc):
39  return _tauIdWPMask(pattern,choices=("VVLoose","VLoose","Loose","Medium","Tight","VTight","VVTight"),doc=doc)
40 
41 tauTable = cms.EDProducer("SimpleCandidateFlatTableProducer",
42  src = cms.InputTag("linkedObjects","taus"),
43  cut = cms.string(""), #we should not filter on cross linked collections
44  name= cms.string("Tau"),
45  doc = cms.string("slimmedTaus after basic selection (" + finalTaus.cut.value()+")"),
46  singleton = cms.bool(False), # the number of entries is variable
47  extension = cms.bool(False), # this is the main table for the taus
48  variables = cms.PSet(P4Vars,
49  charge = Var("charge", int, doc="electric charge"),
50  jetIdx = Var("?hasUserCand('jet')?userCand('jet').key():-1", int, doc="index of the associated jet (-1 if none)"),
51  decayMode = Var("decayMode()",int),
52  idDecayMode = Var("tauID('decayModeFinding')", bool),
53  idDecayModeNewDMs = Var("tauID('decayModeFindingNewDMs')", bool),
54 
55  leadTkPtOverTauPt = Var("leadChargedHadrCand.pt/pt ",float, doc="pt of the leading track divided by tau pt",precision=10),
56  leadTkDeltaEta = Var("leadChargedHadrCand.eta - eta ",float, doc="eta of the leading track, minus tau eta",precision=8),
57  leadTkDeltaPhi = Var("deltaPhi(leadChargedHadrCand.phi, phi) ",float, doc="phi of the leading track, minus tau phi",precision=8),
58 
59  dxy = Var("leadChargedHadrCand().dxy()",float, doc="d_{xy} of lead track with respect to PV, in cm (with sign)",precision=10),
60  dz = Var("leadChargedHadrCand().dz()",float, doc="d_{z} of lead track with respect to PV, in cm (with sign)",precision=14),
61 
62  # these are too many, we may have to suppress some
63  rawIso = Var( "tauID('byCombinedIsolationDeltaBetaCorrRaw3Hits')", float, doc = "combined isolation (deltaBeta corrections)", precision=10),
64  rawIsodR03 = Var( "(tauID('chargedIsoPtSumdR03')+max(0.,tauID('neutralIsoPtSumdR03')-0.072*tauID('puCorrPtSum')))", float, doc = "combined isolation (deltaBeta corrections, dR=0.3)", precision=10),
65  chargedIso = Var( "tauID('chargedIsoPtSum')", float, doc = "charged isolation", precision=10),
66  neutralIso = Var( "tauID('neutralIsoPtSum')", float, doc = "neutral (photon) isolation", precision=10),
67  puCorr = Var( "tauID('puCorrPtSum')", float, doc = "pileup correction", precision=10),
68  photonsOutsideSignalCone = Var( "tauID('photonPtSumOutsideSignalCone')", float, doc = "sum of photons outside signal cone", precision=10),
69 
70  rawAntiEle = Var("tauID('againstElectronMVA6Raw')", float, doc= "Anti-electron MVA discriminator V6 raw output discriminator", precision=10),
71  rawAntiEleCat = Var("tauID('againstElectronMVA6category')", int, doc="Anti-electron MVA discriminator V6 category"),
72 
73  idAntiMu = _tauId2WPMask("againstMuon%s3", doc= "Anti-muon discriminator V3: "),
74  idAntiEle = _tauId5WPMask("againstElectron%sMVA6", doc= "Anti-electron MVA discriminator V6"),
75 
76 # isoCI3hit = Var( "tauID("byCombinedIsolationDeltaBetaCorrRaw3Hits")" doc="byCombinedIsolationDeltaBetaCorrRaw3Hits raw output discriminator"),
77 # photonOutsideSigCone = Var( "tauID("photonPtSumOutsideSignalCone")" doc="photonPtSumOutsideSignalCone raw output discriminator"),
78 
79 
80  )
81 )
82 _mvaIsoVars2015 = cms.PSet(
83  rawMVAoldDM = Var( "tauID('byIsolationMVArun2v1DBoldDMwLTraw')",float, doc="byIsolationMVArun2v1DBoldDMwLT raw output discriminator (2015)",precision=10),
84  rawMVAnewDM = Var( "tauID('byIsolationMVArun2v1DBnewDMwLTraw')",float, doc="byIsolationMVArun2v1DBoldDMwLT raw output discriminator (2015)",precision=10),
85  rawMVAoldDMdR03 = Var( "tauID('byIsolationMVArun2v1DBdR03oldDMwLTraw')",float, doc="byIsolationMVArun2v1DBoldDMwLT raw output discriminator (2015)",precision=10),
86  idMVAnew = _tauId6WPMask( "by%sIsolationMVArun2v1DBnewDMwLT", doc="IsolationMVArun2v1DBnewDMwLT ID working point (2015)"),
87  idMVAoldDM = _tauId6WPMask( "by%sIsolationMVArun2v1DBoldDMwLT", doc="IsolationMVArun2v1DBoldDMwLT ID working point (2015)"),
88  idMVAoldDMdR03 = _tauId6WPMask( "by%sIsolationMVArun2v1DBdR03oldDMwLT", doc="IsolationMVArun2v1DBoldDMdR0p3wLT ID working point (2015)")
89 )
90 _mvaIsoVars2015Reduced = cms.PSet(
91  rawMVAoldDM = Var( "tauID('byIsolationMVArun2v1DBoldDMwLTraw2015')",float, doc="byIsolationMVArun2v1DBoldDMwLT raw output discriminator (2015)",precision=10),
92  idMVAoldDM = _tauId6WPMask( "by%sIsolationMVArun2v1DBoldDMwLT2015", doc="IsolationMVArun2v1DBoldDMwLT ID working point (2015)"),
93 )
94 _mvaIsoVars2017v1 = cms.PSet(
95  rawMVAoldDM2017v1 = Var( "tauID('byIsolationMVArun2v1DBoldDMwLTraw')",float, doc="byIsolationMVArun2v1DBoldDMwLT raw output discriminator (2017v1)",precision=10),
96  idMVAoldDM2017v1 = _tauId7WPMask( "by%sIsolationMVArun2v1DBoldDMwLT", doc="IsolationMVArun2v1DBoldDMwLT ID working point (2017v1)")
97 )
98 _mvaIsoVars2017v2 = cms.PSet(
99  rawMVAnewDM2017v2 = Var( "tauID('byIsolationMVArun2v1DBnewDMwLTraw2017v2')",float, doc="byIsolationMVArun2v1DBnewDMwLT raw output discriminator (2017v2)",precision=10),
100  rawMVAoldDM2017v2 = Var( "tauID('byIsolationMVArun2v1DBoldDMwLTraw2017v2')",float, doc="byIsolationMVArun2v1DBoldDMwLT raw output discriminator (2017v2)",precision=10),
101  rawMVAoldDMdR032017v2 = Var( "tauID('byIsolationMVArun2v1DBdR03oldDMwLTraw2017v2')",float, doc="byIsolationMVArun2v1DBdR03oldDMwLT raw output discriminator (2017v2)",precision=10),
102  idMVAnewDM2017v2 = _tauId7WPMask( "by%sIsolationMVArun2v1DBnewDMwLT2017v2", doc="IsolationMVArun2v1DBnewDMwLT ID working point (2017v2)"),
103  idMVAoldDM2017v2 = _tauId7WPMask( "by%sIsolationMVArun2v1DBoldDMwLT2017v2", doc="IsolationMVArun2v1DBoldDMwLT ID working point (2017v2)"),
104  idMVAoldDMdR032017v2 = _tauId7WPMask( "by%sIsolationMVArun2v1DBdR03oldDMwLT2017v2", doc="IsolationMVArun2v1DBoldDMdR0p3wLT ID working point (2017v2)")
105 )
106 _variablesMiniV2 = cms.PSet(
107  tauTable.variables.clone(),
108  _mvaIsoVars2015Reduced,
109  _mvaIsoVars2017v1,
110  _mvaIsoVars2017v2
111 )
112 _variablesMiniV1 = _variablesMiniV2.clone()
113 _variablesMiniV1.rawMVAoldDM = Var( "tauID('byIsolationMVArun2v1DBoldDMwLTraw')",float, doc="byIsolationMVArun2v1DBoldDMwLT raw output discriminator (2015)",precision=10)
114 _variablesMiniV1.rawMVAoldDM2017v1 = Var( "tauID('byIsolationMVArun2v1DBoldDMwLTraw2017v1')",float, doc="byIsolationMVArun2v1DBoldDMwLT raw output discriminator (2017v1)",precision=10)
115 _variablesMiniV1.idMVAoldDM = _tauId6WPMask( "by%sIsolationMVArun2v1DBoldDMwLT", doc="IsolationMVArun2v1DBoldDMwLT ID working point (2015)")
116 _variablesMiniV1.idMVAoldDM2017v1 = _tauId7WPMask( "by%sIsolationMVArun2v1DBoldDMwLT2017v1", doc="IsolationMVArun2v1DBoldDMwLT ID working point (2017v1)")
117 _variables80X = cms.PSet(
118  tauTable.variables.clone(),
119  _mvaIsoVars2015
120 )
121 eras.run2_nanoAOD_94XMiniAODv2.toModify(tauTable,
122  variables = _variablesMiniV2
123 )
124 for era in [eras.run2_nanoAOD_94XMiniAODv1,eras.run2_nanoAOD_92X]:
125  era.toModify(tauTable,
126  variables = _variablesMiniV1
127  )
128 eras.run2_miniAOD_80XLegacy.toModify(tauTable,
129  variables = _variables80X
130 )
131 tauGenJets.GenParticles = cms.InputTag("prunedGenParticles")
132 tauGenJets.includeNeutrinos = cms.bool(False)
133 
134 genVisTaus = cms.EDProducer("GenVisTauProducer",
135  src = cms.InputTag("tauGenJetsSelectorAllHadrons"),
136  srcGenParticles = cms.InputTag("prunedGenParticles")
137 )
138 
139 genVisTauTable = cms.EDProducer("SimpleCandidateFlatTableProducer",
140  src = cms.InputTag("genVisTaus"),
141  cut = cms.string("pt > 10."),
142  name = cms.string("GenVisTau"),
143  doc = cms.string("gen hadronic taus "),
144  singleton = cms.bool(False), # the number of entries is variable
145  extension = cms.bool(False), # this is the main table for generator level hadronic tau decays
146  variables = cms.PSet(
147  pt = Var("pt", float,precision=8),
148  phi = Var("phi", float,precision=8),
149  eta = Var("eta", float,precision=8),
150  mass = Var("mass", float,precision=8),
151  charge = Var("charge", int),
152  status = Var("status", int, doc="Hadronic tau decay mode. 0=OneProng0PiZero, 1=OneProng1PiZero, 2=OneProng2PiZero, 10=ThreeProng0PiZero, 11=ThreeProng1PiZero, 15=Other"),
153  genPartIdxMother = Var("?numberOfMothers>0?motherRef(0).key():-1", int, doc="index of the mother particle"),
154  )
155 )
156 
157 tausMCMatchLepTauForTable = cms.EDProducer("MCMatcher", # cut on deltaR, deltaPt/Pt; pick best by deltaR
158  src = tauTable.src, # final reco collection
159  matched = cms.InputTag("finalGenParticles"), # final mc-truth particle collection
160  mcPdgId = cms.vint32(11,13), # one or more PDG ID (11 = electron, 13 = muon); absolute values (see below)
161  checkCharge = cms.bool(False), # True = require RECO and MC objects to have the same charge
162  mcStatus = cms.vint32(1), # PYTHIA status code (1 = stable, 2 = shower, 3 = hard scattering)
163  maxDeltaR = cms.double(0.3), # Minimum deltaR for the match
164  maxDPtRel = cms.double(0.5), # Minimum deltaPt/Pt for the match
165  resolveAmbiguities = cms.bool(True), # Forbid two RECO objects to match to the same GEN object
166  resolveByMatchQuality = cms.bool(True), # False = just match input in order; True = pick lowest deltaR pair first
167 )
168 
169 tausMCMatchHadTauForTable = cms.EDProducer("MCMatcher", # cut on deltaR, deltaPt/Pt; pick best by deltaR
170  src = tauTable.src, # final reco collection
171  matched = cms.InputTag("genVisTaus"), # generator level hadronic tau decays
172  mcPdgId = cms.vint32(15), # one or more PDG ID (15 = tau); absolute values (see below)
173  checkCharge = cms.bool(False), # True = require RECO and MC objects to have the same charge
174  mcStatus = cms.vint32(), # CV: no *not* require certain status code for matching (status code corresponds to decay mode for hadronic tau decays)
175  maxDeltaR = cms.double(0.3), # Maximum deltaR for the match
176  maxDPtRel = cms.double(1.), # Maximum deltaPt/Pt for the match
177  resolveAmbiguities = cms.bool(True), # Forbid two RECO objects to match to the same GEN object
178  resolveByMatchQuality = cms.bool(True), # False = just match input in order; True = pick lowest deltaR pair first
179 )
180 
181 tauMCTable = cms.EDProducer("CandMCMatchTableProducer",
182  src = tauTable.src,
183  mcMap = cms.InputTag("tausMCMatchLepTauForTable"),
184  mcMapVisTau = cms.InputTag("tausMCMatchHadTauForTable"),
185  objName = tauTable.name,
186  objType = tauTable.name, #cms.string("Tau"),
187  branchName = cms.string("genPart"),
188  docString = cms.string("MC matching to status==2 taus"),
189 )
190 
191 
192 tauSequence = cms.Sequence(patTauMVAIDsSeq + finalTaus)
193 _tauSequence80X = cms.Sequence(finalTaus)
194 eras.run2_miniAOD_80XLegacy.toReplaceWith(tauSequence,_tauSequence80X)
195 tauTables = cms.Sequence(tauTable)
196 tauMC = cms.Sequence(tauGenJets + tauGenJetsSelectorAllHadrons + genVisTaus + genVisTauTable + tausMCMatchLepTauForTable + tausMCMatchHadTauForTable + tauMCTable)
197 
def _tauId7WPMask(pattern, doc)
Definition: taus_cff.py:38
def _tauId5WPMask(pattern, doc)
Definition: taus_cff.py:34
Updated tau collection with MVA-based tau-Ids rerun ####### Used only in some eras.
def Var(expr, valtype, compression=None, doc=None, mcOnly=False, precision=-1)
Definition: common_cff.py:20
def _tauId3WPMask(pattern, doc)
Definition: taus_cff.py:32
def _tauId6WPMask(pattern, doc)
Definition: taus_cff.py:36
def _tauIdWPMask(pattern, choices, doc="")
Tables for final output and docs ##########################.
Definition: taus_cff.py:27
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
def _tauId2WPMask(pattern, doc)
Definition: taus_cff.py:30
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40