CMS 3D CMS Logo

TrackValidation_cff.py
Go to the documentation of this file.
1 from __future__ import absolute_import
2 import FWCore.ParameterSet.Config as cms
3 
8 from Validation.RecoTrack.trajectorySeedTracks_cfi import trajectorySeedTracks as _trajectorySeedTracks
12 import Validation.RecoTrack.cutsRecoTracks_cfi as cutsRecoTracks_cfi
13 #from . import cutsRecoTracks_cfi
14 
17 from CommonTools.RecoAlgos.trackingParticleRefSelector_cfi import trackingParticleRefSelector as _trackingParticleRefSelector
18 from CommonTools.RecoAlgos.trackingParticleConversionRefSelector_cfi import trackingParticleConversionRefSelector as _trackingParticleConversionRefSelector
19 from SimTracker.TrackHistory.trackingParticleBHadronRefSelector_cfi import trackingParticleBHadronRefSelector as _trackingParticleBHadronRefSelector
21 from CommonTools.RecoAlgos.recoChargedRefCandidateToTrackRefProducer_cfi import recoChargedRefCandidateToTrackRefProducer as _recoChargedRefCandidateToTrackRefProducer
22 
23 import RecoTracker.IterativeTracking.iterativeTkConfig as _cfg
24 import RecoTracker.IterativeTracking.iterativeTkUtils as _utils
25 from Configuration.Eras.Modifier_fastSim_cff import fastSim
26 import six
27 
28 ### First define the stuff for the standard validation sequence
29 ## Track selectors
30 for _eraName, _postfix, _era in _cfg.allEras():
31  _seedProd = ["initialStepSeedsPreSplitting"]
32  _trackProd = ["initialStepTracksPreSplitting"]
33  if _eraName in ["trackingLowPU", "trackingPhase2PU140"]: # these don't have preSplitting
34  _seedProd = []
35  _trackProd = []
36 
37  locals()["_algos"+_postfix] = ["generalTracks"] + _cfg.iterationAlgos(_postfix) + ["duplicateMerge"]
38  locals()["_seedProducersPreSplitting"+_postfix] = _seedProd
39  locals()["_trackProducersPreSplitting"+_postfix] = _trackProd
40  locals()["_seedProducers"+_postfix] = _cfg.seedProducers(_postfix)
41  locals()["_trackProducers"+_postfix] = _cfg.trackProducers(_postfix)
42 
43  if _eraName != "trackingPhase2PU140":
44  locals()["_electronSeedProducers"+_postfix] = ["tripletElectronSeeds", "pixelPairElectronSeeds", "stripPairElectronSeeds"]
45  else:
46  locals()["_electronSeedProducers"+_postfix] = ["tripletElectronSeeds"]
47 
48 _removeForFastSimSeedProducers =["initialStepSeedsPreSplitting",
49  "jetCoreRegionalStepSeeds",
50  "muonSeededSeedsInOut",
51  "muonSeededSeedsOutIn"]
52 _seedProducers_fastSim = [ x for x in _seedProducers if x not in _removeForFastSimSeedProducers]
53 
54 _removeForFastTrackProducers = ["initialStepTracksPreSplitting",
55  "jetCoreRegionalStepTracks",
56  "muonSeededTracksInOut",
57  "muonSeededTracksOutIn"]
58 _trackProducers_fastSim = [ x for x in _trackProducers if x not in _removeForFastTrackProducers]
59 
60 def _algoToSelector(algo):
61  sel = ""
62  if algo != "generalTracks":
63  sel = algo[0].upper()+algo[1:]
64  return "cutsRecoTracks"+sel
65 
66 def _addSelectorsByAlgo(algos, modDict):
67  names = []
68  task = cms.Task()
69  for algo in algos:
70  if algo == "generalTracks":
71  continue
72  modName = _algoToSelector(algo)
73  if modName not in modDict:
74  mod = cutsRecoTracks_cfi.cutsRecoTracks.clone(algorithm=[algo])
75  modDict[modName] = mod
76  else:
77  mod = modDict[modName]
78  names.append(modName)
79  task.add(mod)
80  return (names, task)
81 def _addSelectorsByHp(algos, modDict):
82  task = cms.Task()
83  names = []
84  for algo in algos:
85  modName = _algoToSelector(algo)
86  modNameHp = modName+"Hp"
87  if modNameHp not in modDict:
88  if algo == "generalTracks":
89  mod = cutsRecoTracks_cfi.cutsRecoTracks.clone(quality=["highPurity"])
90  else:
91  mod = modDict[modName].clone(quality=["highPurity"])
92  modDict[modNameHp] = mod
93  else:
94  mod = modDict[modNameHp]
95  names.append(modNameHp)
96  task.add(mod)
97  return (names, task)
98 def _addSelectorsBySrc(modules, midfix, src, modDict):
99  task = cms.Task()
100  names = []
101  for modName in modules:
102  modNameNew = modName.replace("cutsRecoTracks", "cutsRecoTracks"+midfix)
103  if modNameNew not in modDict:
104  mod = modDict[modName].clone(src=src)
105  modDict[modNameNew] = mod
106  else:
107  mod = modDict[modNameNew]
108  names.append(modNameNew)
109  task.add(mod)
110  return (names, task)
111 def _addSelectorsByOriginalAlgoMask(modules, midfix, algoParam,modDict):
112  task = cms.Task()
113  names = []
114  for modName in modules:
115  if modName[-2:] == "Hp":
116  modNameNew = modName[:-2] + midfix + "Hp"
117  else:
118  modNameNew = modName + midfix
119  if modNameNew not in modDict:
120  mod = modDict[modName].clone()
121  setattr(mod, algoParam, mod.algorithm.value())
122  mod.algorithm = []
123  modDict[modNameNew] = mod
124  else:
125  mod = modDict[modNameNew]
126  names.append(modNameNew)
127  task.add(mod)
128  return (names, task)
129 def _addSeedToTrackProducers(seedProducers,modDict):
130  names = []
131  task = cms.Task()
132  for seed in seedProducers:
133  modName = "seedTracks"+seed
134  if modName not in modDict:
135  mod = _trajectorySeedTracks.clone(src=seed)
136  modDict[modName] = mod
137  else:
138  mod = modDict[modName]
139  names.append(modName)
140  task.add(mod)
141  return (names, task)
142 
143 _relevantEras = _cfg.allEras()
144 _relevantErasAndFastSim = _relevantEras + [("fastSim", "_fastSim", fastSim)]
145 def _translateArgs(args, postfix, modDict):
146  ret = []
147  for arg in args:
148  if isinstance(arg, list):
149  ret.append(_translateArgs(arg, postfix, modDict))
150  else:
151  ret.append(modDict[arg+postfix])
152  return ret
153 def _taskForEachEra(function, args, names, task, modDict, plainArgs=[], modifyTask=None, includeFastSim=False):
154  if task[0] != "_":
155  raise Exception("Task name is expected to begin with _")
156 
157  _eras = _relevantErasAndFastSim if includeFastSim else _relevantEras
158  for eraName, postfix, _era in _eras:
159  _args = _translateArgs(args, postfix, modDict)
160  _args.extend(plainArgs)
161  ret = function(*_args, modDict=modDict)
162  if len(ret) != 2:
163  raise Exception("_taskForEachEra is expected to return 2 values, but function returned %d" % len(ret))
164  modDict[names+postfix] = ret[0]
165  modDict[task+postfix] = ret[1]
166 
167  # The task of the first era will be the default one
168  defaultTaskName = task+_eras[0][0]
169  defaultTask = modDict[defaultTaskName]
170  modDict[defaultTaskName[1:]] = defaultTask # remove leading underscore
171 
172  # Optionally modify task before applying the era
173  if modifyTask is not None:
174  for eraName, postfix, _era in _eras:
175  modifyTask(modDict[task+postfix])
176 
177  # Apply eras
178  for _eraName, _postfix, _era in _eras[1:]:
179  _era.toReplaceWith(defaultTask, modDict[task+_postfix])
180 def _setForEra(module, eraName, era, **kwargs):
181  if eraName == "":
182  for key, value in six.iteritems(kwargs):
183  setattr(module, key, value)
184  else:
185  era.toModify(module, **kwargs)
186 
187 # Seeding layer sets
188 def _getSeedingLayers(seedProducers, config):
189  def _findSeedingLayers(name):
190  prod = getattr(config, name)
191  if hasattr(prod, "triplets"):
192  if hasattr(prod, "layerList"): # merger
193  return prod.layerList.refToPSet_.value()
194  return _findSeedingLayers(prod.triplets.getModuleLabel())
195  elif hasattr(prod, "doublets"):
196  return _findSeedingLayers(prod.doublets.getModuleLabel())
197  label = prod.trackingRegionsSeedingLayers.getModuleLabel()
198  if label != "":
199  return label
200  return prod.seedingLayers.getModuleLabel()
201 
202  seedingLayersMerged = []
203  for seedName in seedProducers:
204  seedProd = getattr(config, seedName)
205  seedingLayersName = None
206  seedingLayers = None
207  if hasattr(seedProd, "OrderedHitsFactoryPSet"): # old seeding framework
208  seedingLayersName = seedProd.OrderedHitsFactoryPSet.SeedingLayers.getModuleLabel()
209  elif hasattr(seedProd, "seedingHitSets"): # new seeding framework
210  seedingLayersName = _findSeedingLayers(seedProd.seedingHitSets.getModuleLabel())
211  elif hasattr(seedProd, "layerList"): # FastSim:
212  seedingLayers = seedProd.layerList.value()
213  else:
214  continue
215 
216  if seedingLayersName is not None:
217  seedingLayers = getattr(config, seedingLayersName).layerList.value()
218  for layerSet in seedingLayers:
219  if layerSet not in seedingLayersMerged:
220  seedingLayersMerged.append(layerSet)
221 
222  return seedingLayersMerged
223 import RecoTracker.IterativeTracking.iterativeTk_cff as _iterativeTk_cff
224 import RecoTracker.IterativeTracking.ElectronSeeds_cff as _ElectronSeeds_cff
225 for _eraName, _postfix, _era in _relevantErasAndFastSim:
226  _stdLayers = _getSeedingLayers(locals()["_seedProducers"+_postfix], _iterativeTk_cff)
227  _eleLayers = []
228  if "_electronSeedProducers"+_postfix in locals(): # doesn't exist for FastSim
229  for _layer in _getSeedingLayers(locals()["_electronSeedProducers"+_postfix], _ElectronSeeds_cff):
230  if _layer not in _stdLayers:
231  _eleLayers.append(_layer)
232 
233  locals()["_seedingLayerSets"+_postfix] = _stdLayers
234  locals()["_seedingLayerSetsForElectrons"+_postfix] = _eleLayers
235 
236 
237 # MVA selectors
238 def _getMVASelectors(postfix):
239  mvaSel = _utils.getMVASelectors(postfix)
240 
241  pset = cms.untracked.PSet()
242  for iteration, (trackProducer, classifiers) in six.iteritems(mvaSel):
243  setattr(pset, trackProducer, cms.untracked.vstring(classifiers))
244  return pset
245 for _eraName, _postfix, _era in _relevantEras:
246  locals()["_mvaSelectors"+_postfix] = _getMVASelectors(_postfix)
247 
248 # Validation iterative steps
249 _taskForEachEra(_addSelectorsByAlgo, args=["_algos"], names="_selectorsByAlgo", task="_tracksValidationSelectorsByAlgo", modDict=globals())
250 
251 # high purity
252 _taskForEachEra(_addSelectorsByHp, args=["_algos"], names="_selectorsByAlgoHp", task="_tracksValidationSelectorsByAlgoHp", modDict=globals())
253 
254 # by originalAlgo
255 for _eraName, _postfix, _era in _relevantEras:
256  locals()["_selectorsByAlgoAndHp"+_postfix] = locals()["_selectorsByAlgo"+_postfix] + locals()["_selectorsByAlgoHp"+_postfix]
257  # For ByAlgoMask
258  locals()["_selectorsByAlgoAndHpNoGenTk"+_postfix] = [n for n in locals()["_selectorsByAlgoAndHp"+_postfix] if n not in ["generalTracks", "cutsRecoTracksHp"]]
259  # For ByOriginalAlgo
260  locals()["_selectorsByAlgoAndHpNoGenTkDupMerge"+_postfix] = [n for n in locals()["_selectorsByAlgoAndHpNoGenTk"+_postfix] if n not in ["cutsRecoTracksDuplicateMerge", "cutsRecoTracksDuplicateMergeHp"]]
261 _taskForEachEra(_addSelectorsByOriginalAlgoMask, modDict = globals(),
262  args = ["_selectorsByAlgoAndHpNoGenTkDupMerge"], plainArgs = ["ByOriginalAlgo", "originalAlgorithm"],
263  names = "_selectorsByOriginalAlgo", task = "_tracksValidationSelectorsByOriginalAlgo")
264 
265 
266 for _eraName, _postfix, _era in _relevantEras:
267  selectors = locals()["_selectorsByAlgoHp"+_postfix]
268  locals()["_generalTracksHp"+_postfix] = selectors[0]
269  locals()["_selectorsByAlgoHp"+_postfix] = selectors[1:]
270 
271 # BTV-like selection
272 import PhysicsTools.RecoAlgos.btvTracks_cfi as btvTracks_cfi
273 cutsRecoTracksBtvLike = btvTracks_cfi.btvTrackRefs.clone()
274 
275 # Select tracks associated to AK4 jets
277 ak4JetTracksAssociatorExplicitAll = ak4JTA_cff.ak4JetTracksAssociatorExplicit.clone(
278  jets = "ak4PFJets"
279 )
281 import CommonTools.RecoAlgos.jetTracksAssociationToTrackRefs_cfi as jetTracksAssociationToTrackRefs_cfi
282 cutsRecoTracksAK4PFJets = jetTracksAssociationToTrackRefs_cfi.jetTracksAssociationToTrackRefs.clone(
283  association = "ak4JetTracksAssociatorExplicitAll",
284  jets = "ak4PFJets",
285  correctedPtMin = 10,
286 )
287 
288 
289 ## Select signal TrackingParticles, and do the corresponding associations
290 trackingParticlesSignal = _trackingParticleRefSelector.clone(
291  signalOnly = True,
292  chargedOnly = False,
293  tip = 1e5,
294  lip = 1e5,
295  minRapidity = -10,
296  maxRapidity = 10,
297  ptMin = 0,
298 )
299 
300 # select tracks with pT > 0.9 GeV (for upgrade fake rates)
301 generalTracksPt09 = cutsRecoTracks_cfi.cutsRecoTracks.clone(ptMin=0.9)
302 # and then the selectors
303 _taskForEachEra(_addSelectorsBySrc, modDict=globals(),
304  args=[["_generalTracksHp"]],
305  plainArgs=["Pt09", "generalTracksPt09"],
306  names="_selectorsPt09", task="_tracksValidationSelectorsPt09",
307  modifyTask=lambda task:task.add(generalTracksPt09))
308 
309 # select tracks from the PV
310 from CommonTools.RecoAlgos.TrackWithVertexRefSelector_cfi import trackWithVertexRefSelector as _trackWithVertexRefSelector
311 generalTracksFromPV = _trackWithVertexRefSelector.clone(
312  src = "generalTracks",
313  ptMin = 0,
314  ptMax = 1e10,
315  ptErrorCut = 1e10,
316  quality = "loose",
317  vertexTag = "offlinePrimaryVertices",
318  nVertices = 1,
319  vtxFallback = False,
320  zetaVtx = 0.1, # 1 mm
321  rhoVtx = 1e10, # intentionally no dxy cut
322 )
323 # and then the selectors
324 _taskForEachEra(_addSelectorsBySrc, modDict=globals(),
325  args=[["_generalTracksHp"]],
326  plainArgs=["FromPV", "generalTracksFromPV"],
327  names="_selectorsFromPV", task="_tracksValidationSelectorsFromPV",
328  modifyTask=lambda task: task.add(generalTracksFromPV))
329 
330 # select tracks with pT > 0.9 GeV from the PV
331 generalTracksFromPVPt09 = generalTracksPt09.clone(src="generalTracksFromPV")
332 # and then the selectors
333 _taskForEachEra(_addSelectorsBySrc, modDict=globals(),
334  args=[["_generalTracksHp"]],
335  plainArgs=["FromPVPt09", "generalTracksFromPVPt09"],
336  names="_selectorsFromPVPt09", task="_tracksValidationSelectorsFromPVPt09",
337  modifyTask=lambda task: task.add(generalTracksFromPVPt09))
338 
339 ## Select conversion TrackingParticles, and define the corresponding associator
340 trackingParticlesConversion = _trackingParticleConversionRefSelector.clone()
341 
342 ## Select electron TPs
343 trackingParticlesElectron = _trackingParticleRefSelector.clone(
344  pdgId = [-11, 11],
345  signalOnly = False,
346  tip = 1e5,
347  lip = 1e5,
348  minRapidity = -10,
349  maxRapidity = 10,
350  ptMin = 0,
351 )
352 
353 # Select jets for JetCore tracking
354 highPtJets = cms.EDFilter("CandPtrSelector", src = cms.InputTag("ak4CaloJets"), cut = cms.string("pt()>1000"))
355 highPtJetsForTrk = highPtJetsForTrk = highPtJets.clone(src = "ak4CaloJetsForTrk")
356 
357 # Select B-hadron TPs
358 trackingParticlesBHadron = _trackingParticleBHadronRefSelector.clone()
359 
360 ## MTV instances
361 trackValidator = Validation.RecoTrack.MultiTrackValidator_cfi.multiTrackValidator.clone(
362  useLogPt = cms.untracked.bool(True),
363  dodEdxPlots = True,
364  doPVAssociationPlots = True
365  #,minpT = cms.double(-1)
366  #,maxpT = cms.double(3)
367  #,nintpT = cms.int32(40)
368 )
369 fastSim.toModify(trackValidator,
370  dodEdxPlots = False)
371 
372 for _eraName, _postfix, _era in _relevantEras:
373  _setForEra(trackValidator, _eraName, _era,
374  label = ["generalTracks", locals()["_generalTracksHp"+_postfix]] +
375  locals()["_selectorsByAlgo"+_postfix] + locals()["_selectorsByAlgoHp"+_postfix] +
376  locals()["_selectorsByOriginalAlgo"+_postfix] +
377  ["generalTracksPt09"] + locals()["_selectorsPt09"+_postfix] +
378  [
379  "cutsRecoTracksBtvLike",
380  "cutsRecoTracksAK4PFJets"
381  ],
382  doResolutionPlotsForLabels = [
383  "generalTracks",
384  locals()["_generalTracksHp"+_postfix],
385  "generalTracksPt09",
386  "cutsRecoTracksBtvLike",
387  ]
388  )
389  _setForEra(trackValidator.histoProducerAlgoBlock, _eraName, _era, seedingLayerSets=locals()["_seedingLayerSets"+_postfix])
390 
391 # for low-pT
392 trackValidatorTPPtLess09 = trackValidator.clone(
393  dirName = "Tracking/TrackTPPtLess09/",
394  label = [x for x in trackValidator.label.value() if ("Pt09" not in x) and ("BtvLike" not in x) and ("AK4PFJets" not in x)],
395  ptMaxTP = 0.9, # set maximum pT globally
396  histoProducerAlgoBlock = dict(
397  TpSelectorForEfficiencyVsEta = dict(ptMin=0.05), # enough to set min pT here
398  TpSelectorForEfficiencyVsPhi = dict(ptMin=0.05),
399  TpSelectorForEfficiencyVsVTXR = dict(ptMin=0.05),
400  TpSelectorForEfficiencyVsVTXZ = dict(ptMin=0.05),
401  ),
402  doSimPlots = False, # same as in trackValidator, no need to repeat here
403  doRecoTrackPlots = False, # fake rates are same as in trackValidator, no need to repeat here
404  doResolutionPlotsForLabels = ["disabled"], # resolutions are same as in trackValidator, no need to repeat here
405 )
406 
407 # for high-eta (phase2 : |eta| > 2.7)
408 trackValidatorTPEtaGreater2p7 = trackValidator.clone(
409  dirName = "Tracking/TrackTPEtaGreater2p7/",
410  label = [x for x in trackValidator.label.value() if ("Pt09" not in x) and ("BtvLike" not in x) and ("AK4PFJets" not in x)],
411  dodEdxPlots = False,
412 # doPVAssociationPlots = False,
413  minRapidityTP = -2.7,
414  maxRapidityTP = 2.7,
415  invertRapidityCutTP = True,
416 # ptMaxTP = 0.9, # set maximum pT globally
417  histoProducerAlgoBlock = dict(
418  TpSelectorForEfficiencyVsPt = dict(ptMin=0.005,minRapidity=-2.7,maxRapidity=2.7,invertRapidityCut=True), # enough to set min pT here
419  TpSelectorForEfficiencyVsEta = dict(ptMin=0.005,minRapidity=-2.7,maxRapidity=2.7,invertRapidityCut=True), # enough to set min pT here
420  TpSelectorForEfficiencyVsPhi = dict(ptMin=0.005,minRapidity=-2.7,maxRapidity=2.7,invertRapidityCut=True),
421  TpSelectorForEfficiencyVsVTXR = dict(ptMin=0.005,minRapidity=-2.7,maxRapidity=2.7,invertRapidityCut=True),
422  TpSelectorForEfficiencyVsVTXZ = dict(ptMin=0.005,minRapidity=-2.7,maxRapidity=2.7,invertRapidityCut=True),
423  generalTpSelector = dict(ptMin=0.005,minRapidity=-2.7,maxRapidity=2.7,invertRapidityCut=True),
424 # minEta = -4.5,
425 # maxEta = 4.5,
426 # nintEta = 90,
427  # minPt = 0.01,
428  ),
429  doSimPlots = False, # same as in trackValidator, no need to repeat here
430  doRecoTrackPlots = False, # fake rates are same as in trackValidator, no need to repeat here
431  doResolutionPlotsForLabels = ["disabled"] # resolutions are same as in trackValidator, no need to repeat here
432 )
433 
434 
435 # For efficiency of signal TPs vs. signal tracks, and fake rate of
436 # signal tracks vs. signal TPs
437 trackValidatorFromPV = trackValidator.clone(
438  dirName = "Tracking/TrackFromPV/",
439  label_tp_effic = "trackingParticlesSignal",
440  label_tp_fake = "trackingParticlesSignal",
441  label_tp_effic_refvector = True,
442  label_tp_fake_refvector = True,
443  trackCollectionForDrCalculation = "generalTracksFromPV",
444  doPlotsOnlyForTruePV = True,
445  doPVAssociationPlots = False,
446  doResolutionPlotsForLabels = ["disabled"],
447 )
448 for _eraName, _postfix, _era in _relevantEras:
449  _setForEra(trackValidatorFromPV, _eraName, _era,
450  label = ["generalTracksFromPV"] + locals()["_selectorsFromPV"+_postfix] + ["generalTracksFromPVPt09"] + locals()["_selectorsFromPVPt09"+_postfix],
451  doResolutionPlotsForLabels = [] # for standard "FromPV" do resolution plots for all input collections as they are already limited
452  )
453 
454 # For fake rate of signal tracks vs. all TPs, and pileup rate of
455 # signal tracks vs. non-signal TPs
456 trackValidatorFromPVAllTP = trackValidatorFromPV.clone(
457  dirName = "Tracking/TrackFromPVAllTP/",
458  label_tp_effic = trackValidator.label_tp_effic.value(),
459  label_tp_fake = trackValidator.label_tp_fake.value(),
460  label_tp_effic_refvector = False,
461  label_tp_fake_refvector = False,
462  doSimPlots = False,
463  doSimTrackPlots = False,
464  doResolutionPlotsForLabels = ["disabled"], # resolution plots are the same as in "trackValidatorFromPV"
465 )
466 
467 # For efficiency of all TPs vs. all tracks
468 trackValidatorAllTPEffic = trackValidator.clone(
469  dirName = "Tracking/TrackAllTPEffic/",
470  label = [x for x in trackValidator.label.value() if "Pt09" not in x],
471  doSimPlots = False,
472  doRecoTrackPlots = True, # Fake rate of all tracks vs. all TPs is already included in trackValidator, but we want the reco plots for other reasons
473  doPVAssociationPlots = False,
474  doResolutionPlotsForLabels = ["disabled"], # resolution plots are the same as in "trackValidator"
475 )
476 trackValidatorAllTPEffic.histoProducerAlgoBlock.generalTpSelector.signalOnly = False
477 trackValidatorAllTPEffic.histoProducerAlgoBlock.TpSelectorForEfficiencyVsEta.signalOnly = False
478 trackValidatorAllTPEffic.histoProducerAlgoBlock.TpSelectorForEfficiencyVsPhi.signalOnly = False
479 trackValidatorAllTPEffic.histoProducerAlgoBlock.TpSelectorForEfficiencyVsPt.signalOnly = False
480 trackValidatorAllTPEffic.histoProducerAlgoBlock.TpSelectorForEfficiencyVsVTXR.signalOnly = False
481 trackValidatorAllTPEffic.histoProducerAlgoBlock.TpSelectorForEfficiencyVsVTXZ.signalOnly = False
482 for _eraName, _postfix, _era in _relevantEras:
483  _setForEra(trackValidatorAllTPEffic, _eraName, _era, label = ["generalTracks", locals()["_generalTracksHp"+_postfix]])
484 
485 # Built tracks, in the standard sequence mainly for monitoring the track selection MVA
486 tpClusterProducerPreSplitting = tpClusterProducer.clone(pixelClusterSrc = "siPixelClustersPreSplitting")
487 quickTrackAssociatorByHitsPreSplitting = quickTrackAssociatorByHits.clone(cluster2TPSrc = "tpClusterProducerPreSplitting")
488 _trackValidatorSeedingBuilding = trackValidator.clone( # common for built tracks and seeds (in trackingOnly)
489  associators = ["quickTrackAssociatorByHits"],
490  UseAssociators = True,
491  dodEdxPlots = False,
492  doPVAssociationPlots = False,
493  doSimPlots = False,
494  doResolutionPlotsForLabels = ["disabled"],
495 )
496 trackValidatorBuilding = _trackValidatorSeedingBuilding.clone(
497  dirName = "Tracking/TrackBuilding/",
498  doMVAPlots = True,
499 )
500 trackValidatorBuildingPreSplitting = trackValidatorBuilding.clone(
501  associators = ["quickTrackAssociatorByHitsPreSplitting"],
502  doMVAPlots = False,
503  doSummaryPlots = False,
504 )
505 for _eraName, _postfix, _era in _relevantErasAndFastSim:
506  _setForEra(trackValidatorBuilding, _eraName, _era, label = locals()["_trackProducers"+_postfix])
507 fastSim.toModify(trackValidatorBuilding, doMVAPlots=False)
508 for _eraName, _postfix, _era in _relevantEras:
509  _setForEra(trackValidatorBuilding, _eraName, _era, mvaLabels = locals()["_mvaSelectors"+_postfix])
510  _setForEra(trackValidatorBuildingPreSplitting, _eraName, _era, label = locals()["_trackProducersPreSplitting"+_postfix])
511 
512 
513 # For conversions
514 trackValidatorConversion = trackValidator.clone(
515  dirName = "Tracking/TrackConversion/",
516  label = [
517  "convStepTracks",
518  "conversionStepTracks",
519  "ckfInOutTracksFromConversions",
520  "ckfOutInTracksFromConversions",
521  ],
522  label_tp_effic = "trackingParticlesConversion",
523  label_tp_effic_refvector = True,
524  associators = ["quickTrackAssociatorByHits"],
525  UseAssociators = True,
526  doSimPlots = True,
527  dodEdxPlots = False,
528  doPVAssociationPlots = False,
529  calculateDrSingleCollection = False,
530 )
531 from RecoTracker.ConversionSeedGenerators.ConversionStep_cff import convLayerPairs as _convLayerPairs
532 def _uniqueFirstLayers(layerList):
533  firstLayers = [layerSet.split("+")[0] for layerSet in layerList]
534  ret = []
535  for l in firstLayers:
536  if not l in ret:
537  ret.append(l)
538  # For conversions add also the mono-TEC to the list as 'TEC'
539  # is used for both matched and unmatched rphi/stereo hits
540  if l.startswith("TEC"):
541  ret.append("M"+l)
542  return ret
543 # PhotonConversionTrajectorySeedProducerFromSingleLeg keeps only the
544 # first hit of the pairs in the seed, bookkeeping those is the best we
545 # can do without major further development
546 trackValidatorConversion.histoProducerAlgoBlock.seedingLayerSets = _uniqueFirstLayers(_convLayerPairs.layerList.value())
547 # relax lip and tip
548 for n in ["Eta", "Phi", "Pt", "VTXR", "VTXZ"]:
549  pset = getattr(trackValidatorConversion.histoProducerAlgoBlock, "TpSelectorForEfficiencyVs"+n)
550  pset.lip = trackValidatorConversion.lipTP.value()
551  pset.tip = trackValidatorConversion.tipTP.value()
552 
553 # For electrons
554 trackValidatorGsfTracks = trackValidatorConversion.clone(
555  dirName = "Tracking/TrackGsf/",
556  label = ["electronGsfTracks"],
557  label_tp_effic = "trackingParticlesElectron",
558 )
559 # add the additional seeding layers from ElectronSeeds
560 for _eraName, _postfix, _era in _relevantEras:
561  _setForEra(trackValidatorGsfTracks.histoProducerAlgoBlock, _eraName, _era, seedingLayerSets=trackValidator.histoProducerAlgoBlock.seedingLayerSets.value()+locals()["_seedingLayerSetsForElectrons"+_postfix])
562 
563 
564 
565 # for B-hadrons
566 trackValidatorBHadron = trackValidator.clone(
567  dirName = "Tracking/TrackBHadron/",
568  label_tp_effic = "trackingParticlesBHadron",
569  label_tp_effic_refvector = True,
570  doSimPlots = True,
571  doRecoTrackPlots = False, # Fake rate is defined wrt. all TPs, and that is already included in trackValidator
572  dodEdxPlots = False,
573 )
574 for _eraName, _postfix, _era in _relevantEras:
575  _setForEra(trackValidatorBHadron, _eraName, _era,
576  label = ["generalTracks", locals()["_generalTracksHp"+_postfix], "cutsRecoTracksBtvLike"]
577  )
578 
579 
580 # the track selectors
581 tracksValidationSelectors = cms.Task(
582  tracksValidationSelectorsByAlgo,
583  tracksValidationSelectorsByAlgoHp,
584  tracksValidationSelectorsByOriginalAlgo,
585  cutsRecoTracksBtvLike,
586  ak4JetTracksAssociatorExplicitAll,
587  cutsRecoTracksAK4PFJets
588 )
589 tracksValidationTruth = cms.Task(
590  tpClusterProducer,
591  tpClusterProducerPreSplitting,
592  quickTrackAssociatorByHits,
593  quickTrackAssociatorByHitsPreSplitting,
594  trackingParticleRecoTrackAsssociation,
595  VertexAssociatorByPositionAndTracks,
596  trackingParticleNumberOfLayersProducer
597 )
598 fastSim.toModify(tracksValidationTruth, lambda x: x.remove(tpClusterProducer))
599 
600 tracksPreValidation = cms.Task(
601  highPtJetsForTrk,
602  tracksValidationSelectors,
603  tracksValidationSelectorsPt09,
604  tracksValidationSelectorsFromPV,
605  tracksValidationSelectorsFromPVPt09,
606  tracksValidationTruth,
607  trackingParticlesSignal,
608  trackingParticlesElectron,
609  trackingParticlesConversion
610 )
611 fastSim.toReplaceWith(tracksPreValidation, tracksPreValidation.copyAndExclude([
612  trackingParticlesElectron,
613  trackingParticlesConversion,
614 ]))
615 
616 tracksValidation = cms.Sequence(
617  trackValidator +
618  trackValidatorTPPtLess09 +
619  trackValidatorFromPV +
620  trackValidatorFromPVAllTP +
621  trackValidatorAllTPEffic +
622  trackValidatorBuilding +
623  trackValidatorBuildingPreSplitting +
624  trackValidatorConversion +
625  trackValidatorGsfTracks,
626  tracksPreValidation
627 )
628 
629 from Configuration.Eras.Modifier_phase2_tracker_cff import phase2_tracker
630 #tracksValidationPhase2 = cms.Sequence(tracksValidation+trackValidatorTPEtaGreater2p7) # it does not work
631 tracksValidationPhase2 = tracksValidation.copy()
632 tracksValidationPhase2+=trackValidatorTPEtaGreater2p7
633 phase2_tracker.toReplaceWith(tracksValidation, tracksValidationPhase2)
634 
635 
636 fastSim.toReplaceWith(tracksValidation, tracksValidation.copyAndExclude([
637  trackValidatorBuildingPreSplitting,
638  trackValidatorConversion,
639  trackValidatorGsfTracks,
640 ]))
641 
642 ### Then define stuff for standalone mode (i.e. MTV with RECO+DIGI input)
643 
644 # Select by originalAlgo and algoMask
645 _taskForEachEra(_addSelectorsByOriginalAlgoMask, modDict = globals(),
646  args = ["_selectorsByAlgoAndHpNoGenTk"], plainArgs = ["ByAlgoMask", "algorithmMaskContains"],
647  names = "_selectorsByAlgoMask", task = "_tracksValidationSelectorsByAlgoMaskStandalone")
648 
649 # Select pT>0.9 by iteration
650 # Need to avoid generalTracks+HP because those are already included in the standard validator
651 _taskForEachEra(_addSelectorsBySrc, modDict = globals(),
652  args = ["_selectorsByAlgoAndHpNoGenTk"], plainArgs = ["Pt09", "generalTracksPt09"],
653  names = "_selectorsPt09Standalone", task = "_tracksValidationSelectorsPt09Standalone")
654 
655 # Select fromPV by iteration
656 # Need to avoid generalTracks+HP because those are already included in the standard validator
657 _taskForEachEra(_addSelectorsBySrc, modDict = globals(),
658  args = ["_selectorsByAlgoAndHpNoGenTk"], plainArgs = ["FromPV", "generalTracksFromPV"],
659  names = "_selectorsFromPVStandalone", task = "_tracksValidationSelectorsFromPVStandalone")
660 
661 # Select pt>0.9 and fromPV by iteration
662 # Need to avoid generalTracks+HP because those are already included in the standard validator
663 _taskForEachEra(_addSelectorsBySrc, modDict = globals(),
664  args = ["_selectorsByAlgoAndHpNoGenTk"], plainArgs = ["FromPVPt09", "generalTracksFromPVPt09"],
665  names = "_selectorsFromPVPt09Standalone", task = "_tracksValidationSelectorsFromPVPt09Standalone")
666 
667 # MTV instances
668 trackValidatorStandalone = trackValidator.clone(
669  cores = "highPtJets"
670 )
671 trackValidatorTPPtLess09Standalone = trackValidatorTPPtLess09.clone(
672  cores = "highPtJets"
673 )
674 for _eraName, _postfix, _era in _relevantEras:
675  _setForEra(trackValidatorStandalone, _eraName, _era, label = trackValidator.label + locals()["_selectorsByAlgoMask"+_postfix] + locals()["_selectorsPt09Standalone"+_postfix])
676  _setForEra(trackValidatorTPPtLess09Standalone, _eraName, _era, label = trackValidatorTPPtLess09.label + locals()["_selectorsByAlgoMask"+_postfix] + locals()["_selectorsPt09Standalone"+_postfix])
677 
678 trackValidatorFromPVStandalone = trackValidatorFromPV.clone(
679  cores = "highPtJets"
680 )
681 for _eraName, _postfix, _era in _relevantEras:
682  _setForEra(trackValidatorFromPVStandalone, _eraName, _era, label = trackValidatorFromPV.label + locals()["_selectorsFromPVStandalone"+_postfix] + locals()["_selectorsFromPVPt09Standalone"+_postfix])
683 # do resolutions as in the standard version
684 
685 trackValidatorFromPVAllTPStandalone = trackValidatorFromPVAllTP.clone(
686  label = trackValidatorFromPVStandalone.label.value(),
687  cores = "highPtJets"
688 
689 )
690 trackValidatorAllTPEfficStandalone = trackValidatorAllTPEffic.clone(
691  label = [ x for x in trackValidator.label.value() if x not in ["cutsRecoTracksBtvLike", "cutsRecoTracksAK4PFJets"] and "Pt09" not in x],
692  cores = "highPtJets"
693 )
694 
695 trackValidatorConversionStandalone = trackValidatorConversion.clone(
696  label = [x for x in trackValidatorConversion.label if x != "convStepTracks"],
697  cores = "highPtJets"
698 )
699 
700 trackValidatorBHadronStandalone = trackValidatorBHadron.clone(
701  label = [x for x in trackValidatorStandalone.label if "Pt09" not in x],
702  cores = "highPtJets"
703 )
704 
705 trackValidatorGsfTracksStandalone = trackValidatorGsfTracks.clone(
706  cores = "highPtJets"
707 )
708 
709 # sequences
710 tracksPreValidationStandalone = tracksPreValidation.copy()
711 tracksPreValidationStandalone.add(trackingParticlesBHadron)
712 tracksPreValidationStandalone.replace(highPtJetsForTrk,highPtJets)
713 fastSim.toReplaceWith(tracksPreValidationStandalone, tracksPreValidation)
714 
715 tracksValidationSelectorsStandalone = cms.Task(
716  tracksValidationSelectorsByAlgoMaskStandalone,
717  tracksValidationSelectorsPt09Standalone,
718  tracksValidationSelectorsFromPVStandalone,
719  tracksValidationSelectorsFromPVPt09Standalone
720 )
721 
722 # we copy this for both Standalone and TrackingOnly
723 # and later make modifications from it which change based on era
724 _trackValidatorsBase = cms.Sequence(
725  trackValidatorStandalone +
726  trackValidatorTPPtLess09Standalone +
727  trackValidatorFromPVStandalone +
728  trackValidatorFromPVAllTPStandalone +
729  trackValidatorAllTPEfficStandalone +
730  trackValidatorConversionStandalone +
731  trackValidatorGsfTracksStandalone +
732  trackValidatorBHadronStandalone
733 )
734 trackValidatorsStandalone = _trackValidatorsBase.copy()
735 fastSim.toModify(trackValidatorsStandalone, lambda x: x.remove(trackValidatorConversionStandalone) )
736 
737 tracksValidationStandalone = cms.Sequence(
738  ak4PFL1FastL2L3CorrectorChain +
739  trackValidatorsStandalone,
740  tracksPreValidationStandalone,
741  tracksValidationSelectorsStandalone
742 )
743 
744 ### TrackingOnly mode (i.e. MTV with DIGI input + tracking-only reconstruction)
745 
746 # selectors
747 tracksValidationSelectorsTrackingOnly = tracksValidationSelectors.copyAndExclude([ak4JetTracksAssociatorExplicitAll,cutsRecoTracksAK4PFJets]) # selectors using track information only (i.e. no PF)
748 _taskForEachEra(_addSeedToTrackProducers, args=["_seedProducers"], names="_seedSelectors", task="_tracksValidationSeedSelectorsTrackingOnly", includeFastSim=True, modDict=globals())
749 _taskForEachEra(_addSeedToTrackProducers, args=["_seedProducersPreSplitting"], names="_seedSelectorsPreSplitting", task="_tracksValidationSeedSelectorsPreSplittingTrackingOnly", modDict=globals())
750 tracksValidationSeedSelectorsTrackingOnly.add(tracksValidationSeedSelectorsPreSplittingTrackingOnly)
751 
752 # MTV instances
753 trackValidatorTrackingOnly = trackValidatorStandalone.clone(
754  label = [ x for x in trackValidatorStandalone.label if x != "cutsRecoTracksAK4PFJets"],
755  cores = "highPtJetsForTrk"
756  )
757 
758 trackValidatorSeedingTrackingOnly = _trackValidatorSeedingBuilding.clone(
759  dirName = "Tracking/TrackSeeding/",
760  label = _seedSelectors,
761  doSeedPlots = True,
762 )
763 trackValidatorSeedingPreSplittingTrackingOnly = trackValidatorSeedingTrackingOnly.clone(
764  associators = ["quickTrackAssociatorByHitsPreSplitting"],
765  label = _seedSelectorsPreSplitting,
766  doSummaryPlots = False,
767 
768 )
769 for _eraName, _postfix, _era in _relevantErasAndFastSim:
770  _setForEra(trackValidatorSeedingTrackingOnly, _eraName, _era, label = locals()["_seedSelectors"+_postfix])
771 for _eraName, _postfix, _era in _relevantEras:
772  _setForEra(trackValidatorSeedingPreSplittingTrackingOnly, _eraName, _era, label = locals()["_seedSelectorsPreSplitting"+_postfix])
773 
774 
775 trackValidatorConversionTrackingOnly = trackValidatorConversion.clone(label = [x for x in trackValidatorConversion.label if x not in ["ckfInOutTracksFromConversions", "ckfOutInTracksFromConversions"]])
776 
777 trackValidatorBHadronTrackingOnly = trackValidatorBHadron.clone(label = [x for x in trackValidatorTrackingOnly.label if "Pt09" not in x])
778 
779 trackValidatorTPPtLess09TrackingOnly = trackValidatorTPPtLess09Standalone.clone(cores = "highPtJetsForTrk")
780 trackValidatorFromPVTrackingOnly = trackValidatorFromPVStandalone.clone(cores = "highPtJetsForTrk")
781 trackValidatorFromPVAllTPTrackingOnly = trackValidatorFromPVAllTPStandalone.clone(cores = "highPtJetsForTrk")
782 trackValidatorAllTPEfficTrackingOnly = trackValidatorAllTPEfficStandalone.clone(cores = "highPtJetsForTrk")
783 # sequences
784 tracksPreValidationTrackingOnly = tracksPreValidationStandalone.copy()
785 tracksPreValidationTrackingOnly.replace(tracksValidationSelectors, tracksValidationSelectorsTrackingOnly)
786 tracksPreValidationTrackingOnly.replace(highPtJets,highPtJetsForTrk)
787 
788 trackValidatorsTrackingOnly = _trackValidatorsBase.copy()
789 trackValidatorsTrackingOnly.replace(trackValidatorStandalone, trackValidatorTrackingOnly)
790 trackValidatorsTrackingOnly.replace(trackValidatorTPPtLess09Standalone,trackValidatorTPPtLess09TrackingOnly)
791 trackValidatorsTrackingOnly.replace(trackValidatorFromPVStandalone,trackValidatorFromPVTrackingOnly)
792 trackValidatorsTrackingOnly.replace(trackValidatorFromPVAllTPStandalone,trackValidatorFromPVAllTPTrackingOnly)
793 trackValidatorsTrackingOnly.replace(trackValidatorAllTPEfficStandalone,trackValidatorAllTPEfficTrackingOnly)
794 trackValidatorsTrackingOnly += trackValidatorSeedingTrackingOnly
795 trackValidatorsTrackingOnly += trackValidatorSeedingPreSplittingTrackingOnly
796 trackValidatorsTrackingOnly += trackValidatorBuilding
797 trackValidatorsTrackingOnly += trackValidatorBuildingPreSplitting
798 trackValidatorsTrackingOnly.replace(trackValidatorConversionStandalone, trackValidatorConversionTrackingOnly)
799 trackValidatorsTrackingOnly.remove(trackValidatorGsfTracksStandalone)
800 trackValidatorsTrackingOnly.replace(trackValidatorBHadronStandalone, trackValidatorBHadronTrackingOnly)
801 fastSim.toReplaceWith(trackValidatorsTrackingOnly, trackValidatorsTrackingOnly.copyAndExclude([
802  trackValidatorBuildingPreSplitting,
803  trackValidatorSeedingPreSplittingTrackingOnly,
804  trackValidatorConversionTrackingOnly,
805  trackValidatorBHadronTrackingOnly
806 ]))
807 
808 
809 tracksValidationTrackingOnly = cms.Sequence(
810  trackValidatorsTrackingOnly,
811  tracksPreValidationTrackingOnly,
812  tracksValidationSelectorsStandalone,
813  tracksValidationSeedSelectorsTrackingOnly
814 )
815 
816 
817 ### Pixel tracking only mode (placeholder for now)
818 trackingParticlePixelTrackAsssociation = trackingParticleRecoTrackAsssociation.clone(
819  label_tr = "pixelTracks",
820  associator = "quickTrackAssociatorByHitsPreSplitting",
821 )
822 PixelVertexAssociatorByPositionAndTracks = VertexAssociatorByPositionAndTracks.clone(
823  trackAssociation = "trackingParticlePixelTrackAsssociation"
824 )
825 
826 trackValidatorPixelTrackingOnly = trackValidator.clone(
827  dirName = "Tracking/PixelTrack/",
828  label = ["pixelTracks"],
829  doResolutionPlotsForLabels = [],
830  trackCollectionForDrCalculation = "pixelTracks",
831  associators = ["trackingParticlePixelTrackAsssociation"],
832  label_vertex = "pixelVertices",
833  vertexAssociator = "PixelVertexAssociatorByPositionAndTracks",
834  dodEdxPlots = False,
835  cores = cms.InputTag(""),
836 )
837 
838 tracksValidationTruthPixelTrackingOnly = tracksValidationTruth.copy()
839 tracksValidationTruthPixelTrackingOnly.replace(trackingParticleRecoTrackAsssociation, trackingParticlePixelTrackAsssociation)
840 tracksValidationTruthPixelTrackingOnly.replace(VertexAssociatorByPositionAndTracks, PixelVertexAssociatorByPositionAndTracks)
841 tracksValidationPixelTrackingOnly = cms.Sequence(
842  trackValidatorPixelTrackingOnly,
843  tracksValidationTruthPixelTrackingOnly
844 )
845 
846 
847 ### Lite mode (only generalTracks and HP)
848 trackValidatorLite = trackValidator.clone(
849  label = ["generalTracks", "cutsRecoTracksHp"]
850 )
851 tracksValidationLite = cms.Sequence(
852  cutsRecoTracksHp +
853  trackValidatorLite,
854  tracksValidationTruth
855 )
856 
857 ## customization for timing
858 from Configuration.Eras.Modifier_phase2_timing_layer_cff import phase2_timing_layer
859 phase2_timing_layer.toModify( generalTracksFromPV,
860  timesTag = cms.InputTag('tofPID:t0'),
861  timeResosTag = cms.InputTag('tofPID:sigmat0'),
862  nSigmaDtVertex = cms.double(3) )
863 phase2_timing_layer.toModify( trackValidatorStandalone,
864  label_vertex = cms.untracked.InputTag('offlinePrimaryVertices4D') )
865 phase2_timing_layer.toModify( trackValidatorFromPVStandalone,
866  label_vertex = cms.untracked.InputTag('offlinePrimaryVertices4D') )
867 phase2_timing_layer.toModify( trackValidatorFromPVAllTPStandalone,
868  label_vertex = cms.untracked.InputTag('offlinePrimaryVertices4D') )
869 phase2_timing_layer.toModify( trackValidatorConversionStandalone,
870  label_vertex = cms.untracked.InputTag('offlinePrimaryVertices4D') )
871 phase2_timing_layer.toModify( trackValidatorGsfTracks,
872  label_vertex = cms.untracked.InputTag('offlinePrimaryVertices4D') )
Definition: vlib.h:246
def _setForEra(module, eraName, era, kwargs)
def _translateArgs(args, postfix, modDict)
def _uniqueFirstLayers(layerList)
_addSelectorsByOriginalAlgoMask
Then define stuff for standalone mode (i.e.
def _getSeedingLayers(seedProducers, config)
TEveGeoShape * clone(const TEveElement *element, TEveElement *parent)
Definition: eve_macros.cc:135
def _taskForEachEra(function, args, names, task, modDict, plainArgs=[], modifyTask=None, includeFastSim=False)