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