ATLAS Offline Software
ITkTrackRecoConfig.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2 
3 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
4 from AthenaConfiguration.Enums import Format
5 from TrkConfig.TrackingPassFlags import printActiveConfig
6 from AthenaCommon.Constants import WARNING, INFO
7 
8 _flags_set = [] # For caching
9 _extensions_list = [] # For caching, possible legacy / validate Passes/Configurations
10 _actsExtensions = ['Acts', 'ActsLegacy', 'ActsConversion', 'ActsLargeRadius', 'ActsLowPt', 'ActsValidateF100'] # Possible Acts Alone Passes/Configurations
11 _outputExtensions = [] # Passes/Configurations to be passed to the output job option
12 
14  global _flags_set
15  if _flags_set:
16  return _flags_set
17 
18  flags_set = []
19 
20  # Primary Pass(es)
21  from TrkConfig.TrkConfigFlags import TrackingComponent
22  validation_configurations = {
23  TrackingComponent.ActsValidateClusters : "ActsValidateClusters",
24  TrackingComponent.ActsValidateSpacePoints : "ActsValidateSpacePoints",
25  TrackingComponent.ActsValidateSeeds : "ActsValidateSeeds",
26  TrackingComponent.ActsValidateConversionSeeds : "ActsValidateConversionSeeds",
27  TrackingComponent.ActsValidateLargeRadiusSeeds: "ActsValidateLargeRadiusSeeds",
28  TrackingComponent.ActsValidateTracks : "ActsValidateTracks",
29  TrackingComponent.ActsValidateAmbiguityResolution : "ActsValidateAmbiguityResolution",
30  TrackingComponent.ActsValidateF100 : "ActsValidateF100",
31  }
32 
33  # Athena Pass
34  if TrackingComponent.AthenaChain in flags.Tracking.recoChain:
35  flags_set += [flags.cloneAndReplace(
36  "Tracking.ActiveConfig",
37  f"Tracking.{flags.Tracking.ITkPrimaryPassConfig.value}Pass")]
38 
39  # Acts Pass - Legacy like
40  if TrackingComponent.ActsLegacyChain in flags.Tracking.recoChain:
41  flags_set += [flags.cloneAndReplace(
42  "Tracking.ActiveConfig",
43  "Tracking.ITkActsLegacyPass")]
44 
45  # Acts Pass - Fast Tracking based
46  if TrackingComponent.ActsChain in flags.Tracking.recoChain:
47  flags_set += [flags.cloneAndReplace(
48  "Tracking.ActiveConfig",
49  "Tracking.ITkActsPass")]
50 
51  # Acts Heavy Ion Pass
52  if TrackingComponent.ActsHeavyIon in flags.Tracking.recoChain:
53  flags_set += [flags.cloneAndReplace(
54  "Tracking.ActiveConfig",
55  "Tracking.ITkActsHeavyIonPass")]
56 
57  # GNN pass
58  if TrackingComponent.GNNChain in flags.Tracking.recoChain:
59  flags_set += [flags.cloneAndReplace(
60  "Tracking.ActiveConfig",
61  "Tracking.ITkGNNPass")]
62 
63  # Acts Large Radius Pass
64  if flags.Acts.doLargeRadius:
65  flags_set += [flags.cloneAndReplace(
66  "Tracking.ActiveConfig",
67  "Tracking.ITkActsLargeRadiusPass")]
68 
69  # Acts Conversion Pass
70  if flags.Detector.EnableCalo and flags.Acts.doITkConversion and \
71  TrackingComponent.ActsValidateConversionSeeds not in flags.Tracking.recoChain:
72  flags_set += [flags.cloneAndReplace(
73  "Tracking.ActiveConfig",
74  "Tracking.ITkActsConversionPass")]
75 
76  # Acts Low Pt Pass
77  if flags.Acts.doLowPt:
78  flags_set += [flags.cloneAndReplace(
79  "Tracking.ActiveConfig",
80  "Tracking.ITkActsLowPtPass")]
81 
82  # Acts Validation Passes
83  for [configuration, key] in validation_configurations.items():
84  if configuration in flags.Tracking.recoChain:
85  toAdd = eval(f"flags.cloneAndReplace('Tracking.ActiveConfig', 'Tracking.ITk{key}Pass')")
86  flags_set += [toAdd]
87 
88  # LRT
89  if flags.Tracking.doLargeD0:
90  if flags.Tracking.useITkFTF:
91  flagsLRT = flags.cloneAndReplace("Tracking.ActiveConfig",
92  "Tracking.ITkFTFLargeD0Pass")
93  elif flags.Tracking.doITkFastTracking:
94  flagsLRT = flags.cloneAndReplace("Tracking.ActiveConfig",
95  "Tracking.ITkLargeD0FastPass")
96  else:
97  flagsLRT = flags.cloneAndReplace("Tracking.ActiveConfig",
98  "Tracking.ITkLargeD0Pass")
99  flags_set += [flagsLRT]
100 
101 
102  if TrackingComponent.FPGAChain in flags.Tracking.recoChain:
103  flags_set += [flags.cloneAndReplace(
104  "Tracking.ActiveConfig",
105  "Tracking.ITkFPGAPass")]
106 
107  # Photon conversion tracking reco
108  if flags.Detector.EnableCalo and flags.Tracking.doITkConversion:
109  flagsConv = flags.cloneAndReplace("Tracking.ActiveConfig",
110  "Tracking.ITkConversionPass")
111  flags_set += [flagsConv]
112 
113  # LowPt
114  if flags.Tracking.doLowPt:
115  flagsLowPt = flags.cloneAndReplace("Tracking.ActiveConfig",
116  "Tracking.ITkLowPtPass")
117  flags_set += [flagsLowPt]
118 
119  _flags_set = flags_set # Put into cache
120 
121  return flags_set
122 
123 
125  flags_set = CombinedTrackingPassFlagSets(flags)
126  extension = flags_set[-1].Tracking.ActiveConfig.extension
127  ClusterSplitProbContainer = "ITkAmbiguityProcessorSplitProb" + extension
128  return ClusterSplitProbContainer
129 
130 
132  TrackContainer: str ="",
133  ClusterSplitProbContainer: str = "") -> ComponentAccumulator:
134  result = ComponentAccumulator()
135  extension = flags.Tracking.ActiveConfig.extension
136  if hasattr(flags.TrackOverlay, "ActiveConfig"):
137  doTrackOverlay = getattr(flags.TrackOverlay.ActiveConfig, "doTrackOverlay", None)
138  else:
139  doTrackOverlay = flags.Overlay.doTrackOverlay
140 
141  if doTrackOverlay:
142  # schedule merger to combine signal and background tracks
143  InputTracks = [flags.Overlay.SigPrefix+TrackContainer,
144  flags.Overlay.BkgPrefix+TrackContainer]
145  AssociationMapName = ("PRDtoTrackMapMerge_Resolved" +
146  extension + "Tracks")
147  MergerOutputTracks = TrackContainer
148 
149  from TrkConfig.TrkTrackCollectionMergerConfig import TrackCollectionMergerAlgCfg
150  result.merge(TrackCollectionMergerAlgCfg(
151  flags,
152  name="TrackCollectionMergerAlgCfg"+extension,
153  InputCombinedTracks=InputTracks,
154  OutputCombinedTracks=MergerOutputTracks,
155  AssociationMapName=AssociationMapName))
156 
157  # Run truth, but only do this for non ACTS workflows
158  if flags.Tracking.doTruth and extension not in _actsExtensions:
159  from InDetConfig.ITkTrackTruthConfig import ITkTrackTruthCfg
160  result.merge(ITkTrackTruthCfg(
161  flags,
162  Tracks=TrackContainer,
163  DetailedTruth=TrackContainer+"DetailedTruth",
164  TracksTruth=TrackContainer+"TruthCollection"))
165 
166  # Create track particles from all the different track collections
167  # We have different algorithms depending on the EDM being used
168  if extension not in _actsExtensions:
169  # Workflows that use Trk Tracks
170  from xAODTrackingCnv.xAODTrackingCnvConfig import ITkTrackParticleCnvAlgCfg
171  result.merge(ITkTrackParticleCnvAlgCfg(
172  flags,
173  name=extension + "TrackParticleCnvAlg",
174  TrackContainerName=TrackContainer,
175  xAODTrackParticlesFromTracksContainerName=(
176  "InDet" + extension + "TrackParticles"),
177  ClusterSplitProbabilityName=(
178  "" if flags.Tracking.doITkFastTracking else
179  ClusterSplitProbContainer),
180  AssociationMapName=""))
181  else:
182  # Workflows that use Acts Tracks
183  from ActsConfig.ActsTrackFindingConfig import ActsTrackToTrackParticleCnvAlgCfg
184  # The following few lines will disappear once we have imposed a proper nomenclature for our algorithms and collection
185  prefix = flags.Tracking.ActiveConfig.extension
186  result.merge(ActsTrackToTrackParticleCnvAlgCfg(flags, f"{prefix}ResolvedTrackToAltTrackParticleCnvAlg",
187  ACTSTracksLocation=[TrackContainer],
188  TrackParticlesOutKey=f'InDet{prefix}TrackParticles'))
189 
190  if flags.Tracking.doTruth :
191  from ActsConfig.ActsTruthConfig import ActsTrackParticleTruthDecorationAlgCfg
192  result.merge(ActsTrackParticleTruthDecorationAlgCfg(flags,
193  name=f'{TrackContainer}ParticleTruthDecorationAlg',
194  TrackToTruthAssociationMaps = [f'{TrackContainer}ToTruthParticleAssociation'],
195  TrackParticleContainerName = f'InDet{prefix}TrackParticles'
196  ))
197  return result
198 
199 
200 # Returns CA + ClusterSplitProbContainer
202  previousActsExtension: str = None,
203  InputCombinedITkTracks: list[str] = None,
204  InputCombinedActsTracks: list[str] = None,
205  InputExtendedITkTracks: list[str] = None,
206  StatTrackCollections: list[str] = None,
207  StatTrackTruthCollections: list[str] = None,
208  ClusterSplitProbContainer: str = ""):
209  # We use these lists to store the collections from all the tracking passes, thus keeping the history
210  # of previous passes. None of these lists is allowed to be a None
211  assert InputCombinedITkTracks is not None and isinstance(InputCombinedITkTracks, list)
212  assert InputCombinedActsTracks is not None and isinstance(InputCombinedActsTracks, list)
213  assert InputExtendedITkTracks is not None and isinstance(InputExtendedITkTracks, list)
214  assert StatTrackCollections is not None and isinstance(StatTrackCollections, list)
215  assert StatTrackTruthCollections is not None and isinstance(StatTrackTruthCollections ,list)
216 
217  # Get the tracking pass extension name
218  extension = flags.Tracking.ActiveConfig.extension
219 
220  result = ComponentAccumulator()
221  if hasattr(flags.TrackOverlay, "ActiveConfig"):
222  doTrackOverlay = getattr(flags.TrackOverlay.ActiveConfig, "doTrackOverlay", None)
223  else:
224  doTrackOverlay = flags.Overlay.doTrackOverlay
225 
226  # Define collection name(s)
227  # This is the track collection AFTER the ambiguity resolution
228  TrackContainer = "Resolved" + extension + "Tracks"
229  # For Acts we have another convention, with the extention as the first element in the name
230  if extension in _actsExtensions:
231  TrackContainer = extension + "ResolvedTracks"
232  if doTrackOverlay and extension == "Conversion":
233  TrackContainer = flags.Overlay.SigPrefix + TrackContainer
234 
235  # This is the track collection BEFORE the ambiguity resolution
236  SiSPSeededTracks = "SiSPSeeded" + extension + "Tracks"
237  # For ACTS the name is totally different
238  if extension in _actsExtensions:
239  SiSPSeededTracks = extension + "Tracks"
240 
241  # This performs track finding
242  from InDetConfig.ITkTrackingSiPatternConfig import ITkTrackingSiPatternCfg
243  result.merge(ITkTrackingSiPatternCfg(
244  flags,
245  previousActsExtension=previousActsExtension,
246  InputCollections=InputExtendedITkTracks,
247  ResolvedTrackCollectionKey=TrackContainer,
248  SiSPSeededTrackCollectionKey=SiSPSeededTracks,
249  ClusterSplitProbContainer=ClusterSplitProbContainer))
250  StatTrackCollections += [SiSPSeededTracks, TrackContainer]
251  StatTrackTruthCollections += [SiSPSeededTracks+"TruthCollection",
252  TrackContainer+"TruthCollection"]
253 
254  if doTrackOverlay and extension == "Conversion":
255  TrackContainer = "Resolved" + extension + "Tracks"
257  flags,
258  TrackContainer=TrackContainer,
259  ClusterSplitProbContainer=ClusterSplitProbContainer))
260 
261  if flags.Tracking.ActiveConfig.storeSeparateContainer:
262  # If we do not want the track collection to be merged with another collection
263  # then we immediately create the track particles from it
264  # This happens inside ITkStoreTrackSeparateContainerCfg
265 
266  # Track container, for ACTS workflow, depends on whether we activated the ambiguity resolution or not
267  inputTrack = TrackContainer
268  if extension in _actsExtensions and not flags.Tracking.ActiveConfig.doActsAmbiguityResolution:
269  inputTrack = SiSPSeededTracks
270 
272  flags,
273  TrackContainer=inputTrack,
274  ClusterSplitProbContainer=ClusterSplitProbContainer))
275  else:
276  # ClusterSplitProbContainer is used for removing measurements used in previous passes
277  # For ACTS this is still not possible, TO BE IMPLEMENTED
278  ClusterSplitProbContainer = (
279  "ITkAmbiguityProcessorSplitProb" + extension)
280  # Collect all the Trk Track collections to be then merged in a single big collection
281  # Merging will be done later, and after that we create track particles from the merged collection
282  if extension not in _actsExtensions:
283  InputCombinedITkTracks += [TrackContainer]
284  else:
285  InputCombinedActsTracks += [TrackContainer]
286 
287  # This is only used in this same function for the Track-PRD association
288  # Not yet supported for ACTS tracks
289  if extension not in _actsExtensions:
290  InputExtendedITkTracks += [TrackContainer]
291 
292  return result, ClusterSplitProbContainer
293 
294 
296  InputCombinedITkTracks: list[str] = None,
297  ActsTrackContainerName="InDetActsTrackParticles") -> ComponentAccumulator:
298  # Inputs must not be None
299  assert InputCombinedITkTracks is not None and isinstance(InputCombinedITkTracks, list)
300 
301  acc = ComponentAccumulator()
302  if len(InputCombinedITkTracks) == 0:
303  return acc
304 
305  # Schedule Track particle creation
306  from ActsConfig.ActsTrackFindingConfig import ActsTrackToTrackParticleCnvAlgCfg
307  acc.merge(ActsTrackToTrackParticleCnvAlgCfg(flags, "ActsCombinedTrackToTrackParticleCnvAlg",
308  ACTSTracksLocation=InputCombinedITkTracks,
309  TrackParticlesOutKey=ActsTrackContainerName))
310  if flags.Tracking.doTruth :
311  from ActsConfig.ActsTruthConfig import ActsTrackParticleTruthDecorationAlgCfg
312  track_to_truth_maps=[]
313  for track_container in InputCombinedITkTracks :
314  track_to_truth_maps += [f'{track_container}ToTruthParticleAssociation']
315  # note: suppress stat dumps from ActsTrackParticleTruthDecorationAlg if there is only
316  # a single input collection, because it duplicates in that case the output of
317  # the TrackFindingValidationAlg
319  flags,
320  name=f'{ActsTrackContainerName}TruthDecorationAlg',
321  TrackToTruthAssociationMaps = track_to_truth_maps,
322  TrackParticleContainerName = ActsTrackContainerName,
323  OutputLevel=WARNING if len(InputCombinedITkTracks)==1 else INFO,
324  ComputeTrackRecoEfficiency=False if len(InputCombinedITkTracks)==1 else True
325  ))
326  return acc
327 
329  InputCombinedITkTracks: list[str] = None,
330  StatTrackCollections: list[str] = None,
331  StatTrackTruthCollections: list[str] = None):
332  # None of the input collection is supposed to be None
333  assert InputCombinedITkTracks is not None and isinstance(InputCombinedITkTracks, list)
334  assert StatTrackCollections is not None and isinstance(StatTrackCollections, list)
335  assert StatTrackTruthCollections is not None and isinstance(StatTrackTruthCollections, list)
336 
337  # If there are no tracks return directly
338  result = ComponentAccumulator()
339  if len(InputCombinedITkTracks) == 0:
340  return result
341 
342  if hasattr(flags.TrackOverlay, "ActiveConfig"):
343  doTrackOverlay = getattr(flags.TrackOverlay.ActiveConfig, "doTrackOverlay", None)
344  else:
345  doTrackOverlay = flags.Overlay.doTrackOverlay
346 
347  TrackContainer = "CombinedITkTracks"
348  if doTrackOverlay:
349  #schedule merge to combine signal and background tracks
350  InputCombinedITkTracks += [flags.Overlay.BkgPrefix + TrackContainer]
351 
352  from TrkConfig.TrkConfigFlags import TrackingComponent
353  doGNNWithoutAmbiReso = (TrackingComponent.GNNChain in flags.Tracking.recoChain and (not flags.Tracking.GNN.doAmbiResolution))
354  skipClusterMerge = doGNNWithoutAmbiReso or flags.Tracking.doITkFastTracking
355  # This merges track collections
356  from TrkConfig.TrkTrackCollectionMergerConfig import (
357  ITkTrackCollectionMergerAlgCfg)
358  result.merge(ITkTrackCollectionMergerAlgCfg(
359  flags,
360  InputCombinedTracks=InputCombinedITkTracks,
361  OutputCombinedTracks=TrackContainer,
362  AssociationMapName=(
363  "" if skipClusterMerge else
364  f"PRDtoTrackMapMerge_{TrackContainer}")))
365 
366  if flags.Tracking.doTruth:
367  from InDetConfig.ITkTrackTruthConfig import ITkTrackTruthCfg
368  result.merge(ITkTrackTruthCfg(
369  flags,
370  Tracks=TrackContainer,
371  DetailedTruth=f"{TrackContainer}DetailedTruth",
372  TracksTruth=f"{TrackContainer}TruthCollection"))
373 
374  StatTrackCollections += [TrackContainer]
375  StatTrackTruthCollections += [f"{TrackContainer}TruthCollection"]
376 
377  if flags.Tracking.doSlimming:
378  from TrkConfig.TrkTrackSlimmerConfig import TrackSlimmerCfg
379  result.merge(TrackSlimmerCfg(
380  flags,
381  TrackLocation=[TrackContainer]))
382 
383  splitProbName = ITkClusterSplitProbabilityContainerName(flags)
384 
385  # This creates track particles
386  if flags.Tracking.perigeeExpression == "BeamLine":
387  from xAODTrackingCnv.xAODTrackingCnvConfig import ITkTrackParticleCnvAlgCfg
388  result.merge(ITkTrackParticleCnvAlgCfg(
389  flags,
390  ClusterSplitProbabilityName=(
391  "" if skipClusterMerge else
392  splitProbName),
393  AssociationMapName=(
394  "" if skipClusterMerge else
395  f"PRDtoTrackMapMerge_{TrackContainer}"),
396  isActsAmbi = 'ActsValidateResolvedTracks' in splitProbName or \
397  'ActsValidateAmbiguityResolution' in splitProbName or \
398  'ActsValidateScoreBasedAmbiguityResolution' in splitProbName or \
399  'ActsConversion' in splitProbName or \
400  'ActsLargeRadius' in splitProbName or \
401  'ActsLowPt' in splitProbName or \
402  ('Acts' in splitProbName and 'Validate' not in splitProbName) ))
403 
404  return result
405 
406 
407 def ITkStatsCfg(flags, StatTrackCollections=None,
408  StatTrackTruthCollections=None):
409  result = ComponentAccumulator()
410 
411  from InDetConfig.InDetRecStatisticsConfig import (
412  ITkRecStatisticsAlgCfg)
413  result.merge(ITkRecStatisticsAlgCfg(
414  flags,
415  TrackCollectionKeys=StatTrackCollections,
416  TrackTruthCollectionKeys=(
417  StatTrackTruthCollections if flags.Tracking.doTruth else [])))
418 
419  if flags.Tracking.doTruth:
420  from InDetConfig.InDetTrackClusterAssValidationConfig import (
421  ITkTrackClusterAssValidationCfg)
422  result.merge(ITkTrackClusterAssValidationCfg(
423  flags,
424  TracksLocation=StatTrackCollections))
425 
426  return result
427 
428 
430  result = ComponentAccumulator()
431 
432  #Add the truth origin to the truth particles
433  from InDetConfig.InDetPrepRawDataToxAODConfig import ITkActsPrepDataToxAODCfg
434  result.merge(ITkActsPrepDataToxAODCfg(flags))
435 
436  return result
437 
439  result = ComponentAccumulator()
440 
441  if flags.Tracking.doTIDE_AmbiTrackMonitoring:
442  from InDetConfig.InDetPrepRawDataToxAODConfig import (
443  ITkPixelPrepDataToxAOD_ExtraTruthCfg as PixelPrepDataToxAODCfg,
444  ITkStripPrepDataToxAOD_ExtraTruthCfg as StripPrepDataToxAODCfg)
445  else:
446  from InDetConfig.InDetPrepRawDataToxAODConfig import (
447  ITkPixelPrepDataToxAODCfg as PixelPrepDataToxAODCfg,
448  ITkStripPrepDataToxAODCfg as StripPrepDataToxAODCfg)
449 
450  result.merge(PixelPrepDataToxAODCfg(
451  flags,
452  ClusterSplitProbabilityName=(
453  "" if flags.Tracking.doITkFastTracking else
455  result.merge(StripPrepDataToxAODCfg(flags))
456 
457  from DerivationFrameworkInDet.InDetToolsConfig import (
458  ITkTSOS_CommonKernelCfg)
459  # Set up one algorithm for each output tracking container
460  # Always done for default pass
461  # Done for other passes if pass requests to store track seeds OR track candidates OR requests separate container
462  # Input handling/configuration of algorithm for specific cases is done in TSOS_CommonKernelCfg
463  listOfExtensionsRequesting = [
464  e for e in _extensions_list if (e == '')
465  or (flags.Tracking[f"ITk{e}Pass"].storeTrackSeeds) # Store Si track seeds
466  or (flags.Tracking[f"ITk{e}Pass"].storeSiSPSeededTracks) # Store Si candidate tracks
467  or (flags.Tracking[f"ITk{e}Pass"].storeSeparateContainer) ] # Particular tracking pass requesting separate container from main pass
468 
469  result.merge(ITkTSOS_CommonKernelCfg(
470  flags, listOfExtensions = listOfExtensionsRequesting))
471 
472  if flags.Tracking.doStoreTrackSeeds:
473  from DerivationFrameworkInDet.InDetToolsConfig import (
474  ITkSiSPSeedsTSOS_CommonKernelCfg)
475  # Setup one algorithm for each output tracking container
476  listOfExtensionsRequesting = [
477  e for e in _extensions_list if (e == '') or
478  flags.Tracking[f"ITk{e}Pass"].storeTrackSeeds ]
480  flags, listOfExtensions = listOfExtensionsRequesting))
481 
482  if flags.Tracking.doStoreSiSPSeededTracks:
483  listOfExtensionsRequesting = [
484  e for e in _extensions_list if (e=='') or
485  flags.Tracking[f"ITk{e}Pass"].storeSiSPSeededTracks ]
486  from DerivationFrameworkInDet.InDetToolsConfig import (
487  ITkSiSPTSOS_CommonKernelCfg)
488  result.merge(ITkSiSPTSOS_CommonKernelCfg(flags, listOfExtensions = listOfExtensionsRequesting))
489 
490  if flags.Input.isMC:
491  listOfExtensionsRequesting = [
492  e for e in _extensions_list if (e=='') or
493  (flags.Tracking[f"ITk{e}Pass"].storeSiSPSeededTracks and
494  flags.Tracking[f"ITk{e}Pass"].storeSeparateContainer) ]
495  from InDetPhysValMonitoring.InDetPhysValDecorationConfig import (
496  ITkPhysHitDecoratorAlgCfg)
497  for extension in listOfExtensionsRequesting:
498  result.merge(ITkPhysHitDecoratorAlgCfg(
499  flags,
500  name=f"ITkPhysHit{extension}DecoratorAlg",
501  TrackParticleContainerName=f"InDet{extension}TrackParticles"))
502 
503  return result
504 
505 
506 
509 
510 
511 def ITkTrackRecoCfg(flags) -> ComponentAccumulator:
512  """Configures complete ITk tracking """
513 
514  from InDetConfig.ITkActsHelpers import primaryPassUsesActs
515  if primaryPassUsesActs(flags):
516  from InDetConfig.ITkActsTrackRecoConfig import ITkActsTrackRecoCfg
517  return ITkActsTrackRecoCfg(flags)
518 
519  result = ComponentAccumulator()
520 
521  if flags.Input.Format is Format.BS:
522  # TODO: ITk BS providers
523  raise RuntimeError("ByteStream inputs not supported")
524 
525  # Get all the requested tracking passes
526  flags_set = CombinedTrackingPassFlagSets(flags)
527 
528  # Store the names of several collections from all the different passes
529  # These collections will then be used for different purposes
530 
531  # Tracks to be ultimately merged in InDetTrackParticle collection
532  InputCombinedITkTracks = []
533  # Same but for ACTS collection
534  InputCombinedActsTracks = []
535  # Includes also tracks which end in standalone TrackParticle collections
536  InputExtendedITkTracks = []
537  # Cluster split prob container for measurement removal
538  ClusterSplitProbContainer = ""
539  # To be passed to the InDetRecStatistics alg
540  StatTrackCollections = []
541  StatTrackTruthCollections = []
542  # Record previous ACTS extension
543  previousActsExtension = None
544 
545  from InDetConfig.SiliconPreProcessing import ITkRecPreProcessingSiliconCfg
546 
547  for current_flags in flags_set:
548  printActiveConfig(current_flags)
549 
550 
551  extension = current_flags.Tracking.ActiveConfig.extension
552  if extension not in _actsExtensions:
553  _extensions_list.append(extension)
554 
555  # Add the extension to the output job option
556  _outputExtensions.append(extension)
557 
558  # Data Preparation
559  # According to the tracking pass we have different data preparation
560  # sequences. We may have:
561  # (1) Full Athena data preparation
562  # (2) Full Acts data preparation
563  # (3) Hybrid configurations with EDM converters
564  result.merge(ITkRecPreProcessingSiliconCfg(current_flags,
565  previousActsExtension=previousActsExtension))
566 
567  # Track Reconstruction
568  # This includes track finding and ambiguity resolution
569  # The output is the component accumulator to be added to the sequence
570  # and the name of the cluster split prob container that is used for
571  # removing measurements used by previous passes
572  # This last object will also assure the proper sequence of the tracking passes
573  # since it will create a data dependency from the prevous pass
574  acc, ClusterSplitProbContainer = ITkTrackRecoPassCfg(
575  current_flags,
576  previousActsExtension,
577  InputCombinedITkTracks=InputCombinedITkTracks,
578  InputCombinedActsTracks=InputCombinedActsTracks,
579  InputExtendedITkTracks=InputExtendedITkTracks,
580  StatTrackCollections=StatTrackCollections,
581  StatTrackTruthCollections=StatTrackTruthCollections,
582  ClusterSplitProbContainer=ClusterSplitProbContainer)
583  result.merge(acc)
584 
585  # Store ACTS extension
586  if 'Acts' in extension:
587  previousActsExtension = extension
588 
589  # This merges the track collection in InputCombinedITkTracks
590  # and creates a track particle collection from that
591  if InputCombinedITkTracks:
592 
593  result.merge(
594  ITkTrackFinalCfg(flags,
595  InputCombinedITkTracks=InputCombinedITkTracks,
596  StatTrackCollections=StatTrackCollections,
597  StatTrackTruthCollections=StatTrackTruthCollections))
598 
599 
600 
601 
602  # Now handle ACTS tracks instead if present in the event
603  if InputCombinedActsTracks:
604 
605  # The name of the Acts xAOD container name depends on what
606  # workflow has been executed, which we get by checking
607  # the size of the track containers.
608 
609  ActsTrackContainerName = "InDetTrackParticles" if not InputCombinedITkTracks else "InDetActsTrackParticles"
610  ActsPrimaryVertices = "PrimaryVertices" if not InputCombinedITkTracks else "ActsPrimaryVertices"
611 
612  result.merge(ITkActsTrackFinalCfg(flags,
613  InputCombinedITkTracks=InputCombinedActsTracks,
614  ActsTrackContainerName=ActsTrackContainerName))
615 
616  # Perform vertex finding
617  if flags.Tracking.doVertexFinding:
618 
619  from InDetConfig.InDetPriVxFinderConfig import primaryVertexFindingCfg
620 
621  # Schedule the usual vertex finding for Athena workflow(s)
622  # ONLY schedule this if there are Athena Legacy Track collections
623  if InputCombinedITkTracks:
624  result.merge(primaryVertexFindingCfg(flags))
625 
626  # Schedule the same vertex finding for Acts workflow(s)
627  # For now this is separate from the Athena counterpart, but in the
628  # end the difference will not be needed anymore
629  # ONLY schedule this if there are ACTS Track collections
630  if InputCombinedActsTracks:
631  result.merge(primaryVertexFindingCfg(flags,
632  name="ActsPriVxFinderAlg",
633  TracksName=ActsTrackContainerName,
634  vxCandidatesOutputName=ActsPrimaryVertices))
635 
636  # Post Processing
637  # This is mainly for validation support
638  print("-------- POST PROCESSING --------")
639  for current_flags in flags_set:
640  extension = current_flags.Tracking.ActiveConfig.extension
641  print(f"- Running post-processing for extension: {extension}")
642 
643  # Persistify the Seeds
644  # This is done for the InDet EDM, while for ACTS seeds the persistification
645  # support is done while scheduling the seeding algorithms
646  # This means that here we only care about the legacy seeds, that are
647  # produced whem the legacy Track Finding is scheduled
648  # - flags.Tracking.ActiveConfig.doAthenaTrack
649  # This also covers the case of the Acts->InDet Seed conversion, since that
650  # runs the legacy track finding as well
651  #
652  # At the end of this we have a track collection (segments from the seeds)
653  # and the corresponding track particle collection
654  if current_flags.Tracking.ActiveConfig.doAthenaTrack:
655  if current_flags.Tracking.doStoreTrackSeeds:
656  from InDetConfig.ITkPersistificationConfig import ITkTrackSeedsFinalCfg
657  result.merge(ITkTrackSeedsFinalCfg(current_flags))
658 
659  # Persistify Track from Track Finding
660  # Currently this is only possible for Trk Tracks
661  # For legacy tracking passes the CKF Trk Tracks are always produced
662  # - flags.Tracking.ActiveConfig.doAthenaTrack
663  # For hybrid ACTS-Athena tracking passes they are produced only after Track EDM conversion
664  # - flags.Tracking.ActiveConfig.doActsToAthenaTrack
665  if current_flags.Tracking.ActiveConfig.doAthenaTrack or current_flags.Tracking.ActiveConfig.doActsToAthenaTrack:
666  if current_flags.Tracking.doStoreSiSPSeededTracks:
667  from InDetConfig.ITkPersistificationConfig import ITkSiSPSeededTracksFinalCfg
668  result.merge(ITkSiSPSeededTracksFinalCfg(current_flags))
669 
670  if flags.Tracking.doStats:
671  if _extensions_list:
672  result.merge(ITkStatsCfg(
673  flags_set[0], # Use cuts from primary pass
674  StatTrackCollections=StatTrackCollections,
675  StatTrackTruthCollections=StatTrackTruthCollections))
676 
677 
678 
679  if flags.Tracking.writeExtendedSi_PRDInfo:
680  if _extensions_list:
681  result.merge(ITkExtendedPRDInfoCfg(flags))
682 
683  #Acts algorithm
684  else:
685  result.merge(ITkActsExtendedPRDInfoCfg(flags))
686 
687  # output
688  from InDetConfig.ITkTrackOutputConfig import ITkTrackRecoOutputCfg
689  result.merge(ITkTrackRecoOutputCfg(flags, _outputExtensions))
690  result.printConfig(withDetails = False, summariseProps = False)
691  return result
692 
693 
694 if __name__ == "__main__":
695  from AthenaConfiguration.AllConfigFlags import initConfigFlags
696  flags = initConfigFlags()
697 
698  # Disable calo for this test
699  flags.Detector.EnableCalo = False
700 
701  from AthenaConfiguration.TestDefaults import defaultTestFiles
702  flags.Input.Files = defaultTestFiles.RDO_RUN4
703 
704  import sys
705  if "--doFTF" in sys.argv:
706  flags.Tracking.useITkFTF = True
707  flags.Tracking.doITkFastTracking = True
708 
709  flags.lock()
710 
711  from AthenaConfiguration.MainServicesConfig import MainServicesCfg
712  top_acc = MainServicesCfg(flags)
713 
714  from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
715  top_acc.merge(PoolReadCfg(flags))
716 
717  if flags.Input.isMC and flags.Output.doGEN_AOD2xAOD:
718  from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
719  top_acc.merge(GEN_AOD2xAODCfg(flags))
720 
721  top_acc.merge(ITkTrackRecoCfg(flags))
722 
723  from AthenaCommon.Constants import DEBUG
724  top_acc.foreach_component("AthEventSeq/*").OutputLevel = DEBUG
725  top_acc.printConfig(withDetails=True, summariseProps=True)
726  top_acc.store(open("ITkTrackReco.pkl", "wb"))
727 
728  if "--norun" not in sys.argv:
729  sc = top_acc.run(5)
730  if sc.isFailure():
731  sys.exit(-1)
python.ITkTrackRecoConfig.ITkExtendedPRDInfoCfg
def ITkExtendedPRDInfoCfg(flags)
Definition: ITkTrackRecoConfig.py:438
python.ITkTrackRecoConfig.ITkTrackRecoCfg
ComponentAccumulator ITkTrackRecoCfg(flags)
Main ITk tracking config #####################.
Definition: ITkTrackRecoConfig.py:511
python.ActsPriVxFinderConfig.primaryVertexFindingCfg
ComponentAccumulator primaryVertexFindingCfg(flags, str name="InDetPriVxFinder", *str TracksName, str vxCandidatesOutputName=None, **kwargs)
Definition: InnerDetector/InDetConfig/python/ActsPriVxFinderConfig.py:29
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
python.ITkTrackTruthConfig.ITkTrackTruthCfg
def ITkTrackTruthCfg(flags, Tracks="CombinedITkTracks", DetailedTruth="CombinedITkTracksDetailedTrackTruth", TracksTruth="CombinedITkTracksTrackTruthCollection")
Definition: ITkTrackTruthConfig.py:10
xAODTruthCnvConfig.GEN_AOD2xAODCfg
def GEN_AOD2xAODCfg(flags, name="GEN_AOD2xAOD", **kwargs)
Definition: xAODTruthCnvConfig.py:20
python.InDetRecStatisticsConfig.ITkRecStatisticsAlgCfg
def ITkRecStatisticsAlgCfg(flags, name='ITkRecStatistics', **kwargs)
Definition: InDetRecStatisticsConfig.py:62
python.ITkActsHelpers.primaryPassUsesActs
bool primaryPassUsesActs(flags)
Definition: ITkActsHelpers.py:17
python.SiliconPreProcessing.ITkRecPreProcessingSiliconCfg
def ITkRecPreProcessingSiliconCfg(flags, *str previousActsExtension=None)
Definition: SiliconPreProcessing.py:91
xAODTrackingCnvConfig.ITkTrackParticleCnvAlgCfg
def ITkTrackParticleCnvAlgCfg(flags, name="ITkTrackParticleCnvAlg", ClusterSplitProbabilityName="", AssociationMapName="", bool isActsAmbi=False, **kwargs)
Definition: xAODTrackingCnvConfig.py:287
python.ITkTrackRecoConfig.ITkActsTrackFinalCfg
ComponentAccumulator ITkActsTrackFinalCfg(flags, list[str] InputCombinedITkTracks=None, ActsTrackContainerName="InDetActsTrackParticles")
Definition: ITkTrackRecoConfig.py:295
python.TrackingPassFlags.printActiveConfig
def printActiveConfig(flags)
Definition: TrackingPassFlags.py:1008
python.InDetToolsConfig.ITkSiSPSeedsTSOS_CommonKernelCfg
def ITkSiSPSeedsTSOS_CommonKernelCfg(flags, name="ITkSiSPSeedsTSOS_CommonKernel", listOfExtensions=[])
Definition: InDetToolsConfig.py:390
python.TrkTrackCollectionMergerConfig.ITkTrackCollectionMergerAlgCfg
def ITkTrackCollectionMergerAlgCfg(flags, name="ITkTrackCollectionMerger", InputCombinedTracks=None, OutputCombinedTracks="CombinedITkTracks", **kwargs)
Definition: TrkTrackCollectionMergerConfig.py:31
python.ITkPersistificationConfig.ITkSiSPSeededTracksFinalCfg
ComponentAccumulator ITkSiSPSeededTracksFinalCfg(flags)
Definition: ITkPersistificationConfig.py:37
python.InDetToolsConfig.ITkSiSPTSOS_CommonKernelCfg
def ITkSiSPTSOS_CommonKernelCfg(flags, name="ITkSiSPTSOS_CommonKernel", listOfExtensions=[])
Definition: InDetToolsConfig.py:418
python.ITkTrackOutputConfig.ITkTrackRecoOutputCfg
def ITkTrackRecoOutputCfg(flags, extensions_list=None)
Definition: ITkTrackOutputConfig.py:6
python.TrkTrackSlimmerConfig.TrackSlimmerCfg
def TrackSlimmerCfg(flags, name="TrackSlimmer", **kwargs)
Definition: TrkTrackSlimmerConfig.py:6
python.ITkTrackRecoConfig.ITkStatsCfg
def ITkStatsCfg(flags, StatTrackCollections=None, StatTrackTruthCollections=None)
Definition: ITkTrackRecoConfig.py:407
python.MainServicesConfig.MainServicesCfg
def MainServicesCfg(flags, LoopMgr='AthenaEventLoopMgr')
Definition: MainServicesConfig.py:312
Constants
some useful constants -------------------------------------------------—
python.ITkTrackRecoConfig.ITkStoreTrackSeparateContainerCfg
ComponentAccumulator ITkStoreTrackSeparateContainerCfg(flags, str TrackContainer="", str ClusterSplitProbContainer="")
Definition: ITkTrackRecoConfig.py:131
python.ITkTrackRecoConfig.ITkTrackFinalCfg
def ITkTrackFinalCfg(flags, list[str] InputCombinedITkTracks=None, list[str] StatTrackCollections=None, list[str] StatTrackTruthCollections=None)
Definition: ITkTrackRecoConfig.py:328
python.ITkTrackRecoConfig.ITkClusterSplitProbabilityContainerName
def ITkClusterSplitProbabilityContainerName(flags)
Definition: ITkTrackRecoConfig.py:124
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:25
python.InDetPrepRawDataToxAODConfig.ITkActsPrepDataToxAODCfg
ComponentAccumulator ITkActsPrepDataToxAODCfg(flags, *str PixelClusterContainer="ITkPixelClusters", str StripClusterContainer="ITkStripClusters", str PixelMeasurementContainer="ITkPixelMeasurements", str StripMeasurementContainer="ITkStripMeasurements", list[str] TrackParticles=None)
Definition: InDetPrepRawDataToxAODConfig.py:46
python.ITkActsTrackRecoConfig.ITkActsTrackRecoCfg
ComponentAccumulator ITkActsTrackRecoCfg(flags)
Definition: ITkActsTrackRecoConfig.py:4
Trk::open
@ open
Definition: BinningType.h:40
python.ITkTrackRecoConfig.ITkActsExtendedPRDInfoCfg
def ITkActsExtendedPRDInfoCfg(flags)
Definition: ITkTrackRecoConfig.py:429
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
InDetPhysValDecorationConfig.ITkPhysHitDecoratorAlgCfg
def ITkPhysHitDecoratorAlgCfg(flags, name="ITkPhysHitDecoratorAlg", **kwargs)
Definition: InDetPhysValDecorationConfig.py:65
python.InDetTrackClusterAssValidationConfig.ITkTrackClusterAssValidationCfg
def ITkTrackClusterAssValidationCfg(flags, name='ITkTrackClusterAssValidation', **kwargs)
Definition: InDetTrackClusterAssValidationConfig.py:41
python.ITkTrackingSiPatternConfig.ITkTrackingSiPatternCfg
def ITkTrackingSiPatternCfg(flags, InputCollections=None, ResolvedTrackCollectionKey=None, SiSPSeededTrackCollectionKey=None, ClusterSplitProbContainer='', previousActsExtension=None)
Definition: ITkTrackingSiPatternConfig.py:11
python.ITkPersistificationConfig.ITkTrackSeedsFinalCfg
ComponentAccumulator ITkTrackSeedsFinalCfg(flags)
Definition: ITkPersistificationConfig.py:7
python.TrkTrackCollectionMergerConfig.TrackCollectionMergerAlgCfg
def TrackCollectionMergerAlgCfg(flags, name="InDetTrackCollectionMerger", InputCombinedTracks=None, OutputCombinedTracks="", **kwargs)
Definition: TrkTrackCollectionMergerConfig.py:7
python.PoolReadConfig.PoolReadCfg
def PoolReadCfg(flags)
Definition: PoolReadConfig.py:71
python.ITkTrackRecoConfig.ITkTrackRecoPassCfg
def ITkTrackRecoPassCfg(flags, str previousActsExtension=None, list[str] InputCombinedITkTracks=None, list[str] InputCombinedActsTracks=None, list[str] InputExtendedITkTracks=None, list[str] StatTrackCollections=None, list[str] StatTrackTruthCollections=None, str ClusterSplitProbContainer="")
Definition: ITkTrackRecoConfig.py:201
ActsTruthConfig.ActsTrackParticleTruthDecorationAlgCfg
ComponentAccumulator ActsTrackParticleTruthDecorationAlgCfg(flags, str name='ActsTrackParticleTruthDecorationAlg', **dict kwargs)
Definition: ActsTruthConfig.py:137
python.ITkTrackRecoConfig.CombinedTrackingPassFlagSets
def CombinedTrackingPassFlagSets(flags)
Definition: ITkTrackRecoConfig.py:13
ActsTrackFindingConfig.ActsTrackToTrackParticleCnvAlgCfg
ComponentAccumulator ActsTrackToTrackParticleCnvAlgCfg(flags, str name="ActsTrackToTrackParticleCnvAlg", **kwargs)
Definition: ActsTrackFindingConfig.py:441
python.InDetToolsConfig.ITkTSOS_CommonKernelCfg
def ITkTSOS_CommonKernelCfg(flags, name="ITkTSOS_CommonKernel", listOfExtensions=[])
Definition: InDetToolsConfig.py:337