CMS 3D CMS Logo

leptonTimeLifeInfo_common_cff.py
Go to the documentation of this file.
1 #
2 # Common definition of time-life variables for pat-leptons produced
3 # with {Electron,Muon,Tau}TimeLifeInfoTableProducer
4 #
5 import FWCore.ParameterSet.Config as cms
8 from PhysicsTools.PatAlgos.patRefitVertexProducer_cfi import patRefitVertexProducer
9 from PhysicsTools.NanoAOD.simpleVertexFlatTableProducer_cfi import simpleVertexFlatTableProducer
10 from PhysicsTools.PatAlgos.patElectronTimeLifeInfoProducer_cfi import patElectronTimeLifeInfoProducer
11 from PhysicsTools.PatAlgos.patMuonTimeLifeInfoProducer_cfi import patMuonTimeLifeInfoProducer
12 from PhysicsTools.PatAlgos.patTauTimeLifeInfoProducer_cfi import patTauTimeLifeInfoProducer
13 from PhysicsTools.NanoAOD.simplePATElectron2TrackTimeLifeInfoFlatTableProducer_cfi import simplePATElectron2TrackTimeLifeInfoFlatTableProducer
14 from PhysicsTools.NanoAOD.simplePATMuon2TrackTimeLifeInfoFlatTableProducer_cfi import simplePATMuon2TrackTimeLifeInfoFlatTableProducer
15 from PhysicsTools.NanoAOD.simplePATTau2TrackTimeLifeInfoFlatTableProducer_cfi import simplePATTau2TrackTimeLifeInfoFlatTableProducer
18 
19 # common settings of lepton life-time info producer
20 prod_common = cms.PSet(
21  pvSource = cms.InputTag("offlineSlimmedPrimaryVerticesWithBS"),
22  pvChoice = cms.int32(0) #0: PV[0], 1: smallest dz
23 )
24 
25 # impact parameter
26 ipVars = cms.PSet(
27  #ipLength = Var("ipLength().value()", float, doc="lenght of impact parameter (3d)", precision=10),
28  ipLengthSig = Var("ipLength().significance()", float, doc="significance of impact parameter", precision=10),
29  IPx = Var("ipVector().x()", float, doc="x coordinate of impact parameter vector", precision=10),
30  IPy = Var("ipVector().y()", float, doc="y coordinate of impact parameter vector", precision=10),
31  IPz = Var("ipVector().z()", float, doc="z coordinate of impact parameter vector", precision=10)
32 )
33 
34 # track parameters and covariance at ref. point
35 trackVars = cms.PSet(
36  track_qoverp = Var("?hasTrack()?track().parameter(0):0", float, doc="track q/p", precision=10),
37  track_lambda = Var("?hasTrack()?track().parameter(1):0", float, doc="track lambda", precision=10),
38  track_phi = Var("?hasTrack()?track().parameter(2):0", float, doc="track phi", precision=10),
39  #track_deltaPhi = Var("?hasTrack()?deltaPhi(track().parameter(2), phi):0", float, doc="track phi minus lepton phi", precision=10),
40  track_dxy = Var("?hasTrack()?track().parameter(3):0", float, doc="track dxy", precision=10),
41  track_dsz = Var("?hasTrack()?track().parameter(4):0", float, doc="track dsz", precision=10),
42  bField_z = Var("?hasTrack()?bField_z:0", float, doc="z coordinate of magnetic field at track ref. point", precision=10),
43 )
44 # track covariance elements (adding to trackVars)
45 for i in range(0,5):
46  for j in range(i,5):
47  jistr = str(j)+str(i)
48  setattr(trackVars, 'track_cov'+jistr, Var("?hasTrack()?track().covariance("+str(j)+","+str(i)+"):0", float, doc="track covariance element ("+str(j)+","+str(i)+")", precision=10))
49 
50 # secondary vertex
51 svVars = cms.PSet(
52  # SV
53  hasRefitSV = Var("hasSV()", bool, doc="has SV refit using miniAOD quantities"),
54  refitSVx = Var("?hasSV()?sv().x():0", float, doc="x coordinate of SV", precision=10),
55  refitSVy = Var("?hasSV()?sv().y():0", float, doc="y coordinate of SV", precision=10),
56  refitSVz = Var("?hasSV()?sv().z():0", float, doc="z coordinate of SV", precision=10),
57  refitSVchi2 = Var("?hasSV()?sv().normalizedChi2():0", float, doc="reduced chi2, i.e. chi2/ndof, of SV fit", precision=8),
58  #refitSVndof = Var("?hasSV()?sv().ndof():0", float, doc="ndof of SV fit", precision=8),
59  # flight-length
60  #refitFlightLength = Var("?hasSV()?flightLength().value():0", float, doc="flight-length,i.e. the PV to SV distance", precision=10),
61  #refitFlightLengthSig = Var("?hasSV()?flightLength().significance():0", float, doc="Significance of flight-length", precision=10)
62 )
63 # secondary vertex covariance elements (adding to svVars)
64 for i in range(0,3):
65  for j in range(i,3):
66  jistr = str(j)+str(i)
67  setattr(svVars, 'refitSVcov'+jistr, Var("?hasSV()?sv().covariance("+str(j)+","+str(i)+"):0", float, doc="Covariance of SV ("+str(j)+","+str(i)+")", precision=10))
68 
69 # primary vertex covariance elements
70 pvCovVars = cms.PSet()
71 for i in range(0,3):
72  for j in range(i,3):
73  jistr = str(j)+str(i)
74  setattr(pvCovVars, 'cov'+jistr, Var("covariance("+str(j)+","+str(i)+")", float, doc="vertex covariance ("+str(j)+","+str(i)+")", precision=10))
75 
76 # Module to refit PV with beam-spot constraint that is not present in Run-2 samples
77 refittedPV = patRefitVertexProducer.clone(
78  srcVertices = "offlineSlimmedPrimaryVertices",
79 )
80 run2_nanoAOD_ANY.toModify(
81  prod_common, pvSource = "refittedPV")
82 
83 # Definition of DQM plots
84 ipVarsPlots = cms.VPSet(
85  #Plot1D('ipLength', 'ipLength', 25, -0.25, 0.25, 'signed lenght of impact parameter (3d)'),
86  Plot1D('ipLengthSig', 'ipLengthSig', 60, -5, 10, 'signed significance of impact parameter'),
87  Plot1D('IPx', 'IPx', 40, -0.02, 0.02, 'x coordinate of impact parameter vector'),
88  Plot1D('IPy', 'IPy', 40, -0.02, 0.02, 'y coordinate of impact parameter vector'),
89  Plot1D('IPz', 'IPz', 40, -0.02, 0.02, 'z coordinate of impact parameter vector')
90 )
91 trackVarsPlots = cms.VPSet(
92  Plot1D('track_qoverp', 'track_qoverp', 40, -0.2, 0.2, 'track q/p'),
93  Plot1D('track_lambda', 'track_lambda', 30, -1.5, 1.5, 'track lambda'),
94  Plot1D('track_phi', 'track_phi', 20, -3.14159, 3.14159, 'track phi'),
95  Plot1D('track_dxy', 'track_dxy', 20, -0.1, 0.1, 'track dxy'),
96  Plot1D('track_dsz', 'track_dsz', 20, -10, 10, 'track dsz'),
97  NoPlot('bField_z')
98 )
99 #no plots for track covariance elements, but store placeholders
100 for i in range(0,5):
101  for j in range(i,5):
102  trackVarsPlots.append(NoPlot('track_cov'+str(j)+str(i)))
103 svVarsPlots = cms.VPSet(
104  Plot1D('hasRefitSV', 'hasRefitSV', 2, 0, 2, 'has SV refit using miniAOD quantities'),
105  Plot1D('refitSVx', 'refitSVx', 20, -0.1, 0.1, 'x coordinate of refitted SV'),
106  Plot1D('refitSVy', 'refitSVy', 20, -0.1, 0.1, 'y coordinate of refitted SV'),
107  Plot1D('refitSVz', 'refitSVz', 20, -20, 20, 'z coordinate of refitted SV'),
108  Plot1D('refitSVchi2', 'refitSVchi2', 20, 0, 40, 'reduced chi2 of SV fit'),
109  #Plot1D('refitSVndof', 'refitSVndof', 10, 0, 10, 'ndof of SV fit')
110 )
111 #no plots for SV covariance elements, but store placeholders
112 for i in range(0,3):
113  for j in range(i,3):
114  svVarsPlots.append(NoPlot('refitSVcov'+str(j)+str(i)))
115 
116 #
117 # Customization sequences and functions
118 #
119 # electrons
121  process.electronTimeLifeInfos = patElectronTimeLifeInfoProducer.clone(
122  src = process.electronTable.src,
123  selection = 'pt > 15',
124  pvSource = prod_common.pvSource,
125  pvChoice = prod_common.pvChoice
126  )
127  process.electronTimeLifeInfoTable = simplePATElectron2TrackTimeLifeInfoFlatTableProducer.clone(
128  name = process.electronTable.name,
129  src = process.electronTable.src,
130  doc = cms.string("Additional time-life info for non-prompt electrons"),
131  extension = True,
132  externalTypedVariables = cms.PSet()
133  )
134  process.electronTimeLifeInfoTask = cms.Task(
135  process.electronTimeLifeInfos,
136  process.electronTimeLifeInfoTable
137  )
138  # refit PV with beam-spot constraint that is not present in Run-2 samples
139  if not hasattr(process,'refittedPV'):
140  setattr(process,'refittedPV',refittedPV)
141  _electronTimeLifeInfoTaskRun2 = process.electronTimeLifeInfoTask.copy()
142  _electronTimeLifeInfoTaskRun2.add(process.refittedPV)
143  run2_nanoAOD_ANY.toReplaceWith(process.electronTimeLifeInfoTask,
144  _electronTimeLifeInfoTaskRun2)
145  process.electronTablesTask.add(process.electronTimeLifeInfoTask)
146  return process
147 #base vars
148 electronVars = cms.PSet(
149  ipVars
150 )
151 for var in electronVars.parameters_():
152  setattr(getattr(electronVars, var), "src", cms.InputTag("electronTimeLifeInfos"))
154  if not hasattr(process,'electronTimeLifeInfoTask'):
155  process = addElectronTimeLifeInfoTask(process)
156  electronExtVars = cms.PSet(
157  process.electronTimeLifeInfoTable.externalTypedVariables,
158  electronVars
159  )
160  process.electronTimeLifeInfoTable.externalTypedVariables = electronExtVars
161  # add DQM plots if needed
162  if hasattr(process,'nanoDQM'):
163  process.nanoDQM.vplots.Electron.plots.extend(ipVarsPlots)
164  return process
165 #track vars
166 electronTrackVars = cms.PSet(
167  trackVars
168 )
169 for var in electronTrackVars.parameters_():
170  setattr(getattr(electronTrackVars, var), "src", cms.InputTag("electronTimeLifeInfos"))
172  if not hasattr(process,'electronTimeLifeInfoTask'):
173  process = addElectronTimeLifeInfoTask(process)
174  electronExtVars = cms.PSet(
175  process.electronTimeLifeInfoTable.externalTypedVariables,
176  electronTrackVars
177  )
178  process.electronTimeLifeInfoTable.externalTypedVariables = electronExtVars
179  # add DQM plots if needed
180  if hasattr(process,'nanoDQM'):
181  process.nanoDQM.vplots.Electron.plots.extend(trackVarsPlots)
182  return process
183 
184 # muons
186  process.muonTimeLifeInfos = patMuonTimeLifeInfoProducer.clone(
187  src = process.muonTable.src,
188  selection = 'pt > 15',
189  pvSource = prod_common.pvSource,
190  pvChoice = prod_common.pvChoice
191  )
192  process.muonTimeLifeInfoTable = simplePATMuon2TrackTimeLifeInfoFlatTableProducer.clone(
193  name = process.muonTable.name,
194  src = process.muonTable.src,
195  doc = cms.string("Additional time-life info for non-prompt muon"),
196  extension = True,
197  externalTypedVariables = cms.PSet()
198  )
199  process.muonTimeLifeInfoTask = cms.Task(
200  process.muonTimeLifeInfos,
201  process.muonTimeLifeInfoTable
202  )
203  # refit PV with beam-spot constraint that is not present in Run-2 samples
204  if not hasattr(process,'refittedPV'):
205  setattr(process,'refittedPV',refittedPV)
206  _muonTimeLifeInfoTaskRun2 = process.muonTimeLifeInfoTask.copy()
207  _muonTimeLifeInfoTaskRun2.add(process.refittedPV)
208  run2_nanoAOD_ANY.toReplaceWith(process.muonTimeLifeInfoTask,
209  _muonTimeLifeInfoTaskRun2)
210  process.muonTablesTask.add(process.muonTimeLifeInfoTask)
211  return process
212 #base vars
213 muonVars = cms.PSet(
214  ipVars
215 )
216 for var in muonVars.parameters_():
217  setattr(getattr(muonVars, var), "src", cms.InputTag("muonTimeLifeInfos"))
219  if not hasattr(process,'muonTimeLifeInfoTask'):
220  process = addMuonTimeLifeInfoTask(process)
221  muonExtVars = cms.PSet(
222  process.muonTimeLifeInfoTable.externalTypedVariables,
223  muonVars
224  )
225  process.muonTimeLifeInfoTable.externalTypedVariables = muonExtVars
226  # add DQM plots if needed
227  if hasattr(process,'nanoDQM'):
228  process.nanoDQM.vplots.Muon.plots.extend(ipVarsPlots)
229  return process
230 #track vars
231 muonTrackVars = cms.PSet(
232  trackVars
233 )
234 for var in muonTrackVars.parameters_():
235  setattr(getattr(muonTrackVars, var), "src", cms.InputTag("muonTimeLifeInfos"))
237  if not hasattr(process,'muonTimeLifeInfoTask'):
238  process = addMuonTimeLifeInfoTask(process)
239  muonExtVars = cms.PSet(
240  process.muonTimeLifeInfoTable.externalTypedVariables,
241  muonTrackVars
242  )
243  process.muonTimeLifeInfoTable.externalTypedVariables = muonExtVars
244  # add DQM plots if needed
245  if hasattr(process,'nanoDQM'):
246  process.nanoDQM.vplots.Muon.plots.extend(trackVarsPlots)
247  return process
248 
249 # taus
251  process.tauTimeLifeInfos = patTauTimeLifeInfoProducer.clone(
252  src = process.tauTable.src,
253  pvSource = prod_common.pvSource,
254  pvChoice = prod_common.pvChoice
255  )
256  process.tauTimeLifeInfoTable = simplePATTau2TrackTimeLifeInfoFlatTableProducer.clone(
257  name = process.tauTable.name,
258  src = process.tauTable.src,
259  doc = cms.string("Additional tau time-life info"),
260  extension = True,
261  externalTypedVariables = cms.PSet()
262  )
263  process.tauTimeLifeInfoTask = cms.Task(
264  process.tauTimeLifeInfos,
265  process.tauTimeLifeInfoTable
266  )
267  # refit PV with beam-spot constraint that is not present in Run-2 samples
268  if not hasattr(process,'refittedPV'):
269  setattr(process,'refittedPV',refittedPV)
270  _tauTimeLifeInfoTaskRun2 = process.tauTimeLifeInfoTask.copy()
271  _tauTimeLifeInfoTaskRun2.add(process.refittedPV)
272  run2_nanoAOD_ANY.toReplaceWith(process.tauTimeLifeInfoTask,
273  _tauTimeLifeInfoTaskRun2)
274  process.tauTablesTask.add(process.tauTimeLifeInfoTask)
275  return process
276 # base vars
277 tauVars = cms.PSet(
278  svVars,
279  ipVars
280 )
281 for var in tauVars.parameters_():
282  setattr(getattr(tauVars, var), "src", cms.InputTag("tauTimeLifeInfos"))
284  if not hasattr(process,'tauTimeLifeInfoTask'):
285  process = addTauTimeLifeInfoTask(process)
286  tauExtVars = cms.PSet(
287  process.tauTimeLifeInfoTable.externalTypedVariables,
288  tauVars
289  )
290  process.tauTimeLifeInfoTable.externalTypedVariables = tauExtVars
291  # add DQM plots if needed
292  if hasattr(process,'nanoDQM'):
293  process.nanoDQM.vplots.Tau.plots.extend(ipVarsPlots)
294  process.nanoDQM.vplots.Tau.plots.extend(svVarsPlots)
295  return process
296 #track vars
297 tauTrackVars = cms.PSet(
298  trackVars
299 )
300 for var in tauTrackVars.parameters_():
301  setattr(getattr(tauTrackVars, var), "src", cms.InputTag("tauTimeLifeInfos"))
303  if not hasattr(process,'tauTimeLifeInfoTask'):
304  process = addTauTimeLifeInfoTask(process)
305  tauExtVars = cms.PSet(
306  process.tauTimeLifeInfoTable.externalTypedVariables,
307  tauTrackVars
308  )
309  process.tauTimeLifeInfoTable.externalTypedVariables = tauExtVars
310  # add DQM plots if needed
311  if hasattr(process,'nanoDQM'):
312  process.nanoDQM.vplots.Tau.plots.extend(trackVarsPlots)
313  return process
314 
315 # Vertices
316 def addExtendVertexInfo(process):
317  process.pvbsTable = simpleVertexFlatTableProducer.clone(
318  src = prod_common.pvSource,
319  name = "PVBS",
320  doc = "main primary vertex with beam-spot",
321  maxLen = 1,
322  variables = cms.PSet(
323  pvCovVars,
324  x = Var("position().x()", float, doc = "position x coordinate, in cm", precision = 10),
325  y = Var("position().y()", float, doc = "position y coordinate, in cm", precision = 10),
326  z = Var("position().z()", float, doc = "position z coordinate, in cm", precision = 16),
327  #ndof = Var("ndof()", float, doc = "number of degrees of freedom", precision = 8),#MB: not important
328  chi2 = Var("normalizedChi2()", float, doc = "reduced chi2, i.e. chi2/ndof", precision = 8),
329  ),
330  )
331  process.pvbsTableTask = cms.Task(process.pvbsTable)
332  # refit PV with beam-spot constraint that is not present in Run-2 samples
333  if not hasattr(process,'refittedPV'):
334  setattr(process,'refittedPV',refittedPV)
335  _pvbsTableTaskRun2 = process.pvbsTableTask.copy()
336  _pvbsTableTaskRun2.add(process.refittedPV)
337  run2_nanoAOD_ANY.toReplaceWith(process.pvbsTableTask,
338  _pvbsTableTaskRun2)
339  process.vertexTablesTask.add(process.pvbsTableTask)
340  return process
341 
342 # Time-life info without track parameters
343 def addTimeLifeInfoBase(process):
345  addTimeLifeInfoToMuons(process)
346  addTimeLifeInfoToTaus(process)
347  addExtendVertexInfo(process)
348  return process
349 # Add track parameters to time-life info
354  return process
355 # Full
356 def addTimeLifeInfo(process):
357  addTimeLifeInfoBase(process)
359  return process
def Var(expr, valtype, doc=None, precision=-1, lazyEval=False)
Definition: common_cff.py:17
#define str(s)