CMS 3D CMS Logo

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