ATLAS Offline Software
Loading...
Searching...
No Matches
ITkActsHelpers.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
3def isPrimaryPass(flags) -> bool:
4 if not flags.hasCategory("Tracking.ActiveConfig"):
5 return False
6 # Support for non ACTS passes, that do not respect the convention
7 # This comes from Athena legacy passes
8 if flags.Tracking.ActiveConfig.extension in ["", "HeavyIon"]:
9 return True
10 # For ACTS the convention is respected: ITk{extension} + Pass
11 return f"ITk{flags.Tracking.ActiveConfig.extension}" == flags.Tracking.ITkPrimaryPassConfig.value
12
13def isFastPrimaryPass(flags) -> bool:
14 if flags.hasCategory("Tracking.ActiveConfig") and flags.Tracking.ActiveConfig.extension in ["ActsValidateF100", "ActsValidateF150"] and flags.Tracking.doITkFastTracking:
15 return True
16 return flags.Tracking.doITkFastTracking and isPrimaryPass(flags)
17
18def isValidationPass(flags) -> bool:
19 return "Validate" in flags.Tracking.ActiveConfig.extension
20
21def isProductionPass(flags) -> bool:
22 return not isValidationPass(flags)
23
24def primaryPassUsesActs(flags) -> bool:
25 from TrkConfig.TrkConfigFlags import ITkPrimaryPassConfig
26 return flags.Tracking.ITkPrimaryPassConfig in [ITkPrimaryPassConfig.Acts, \
27 ITkPrimaryPassConfig.ActsLegacy, \
28 ITkPrimaryPassConfig.ActsHeavyIon]
29
30def primaryPassExtension(flags) -> str:
31 # we rely on the fact that flags.Tracking.ITkPrimaryPassConfig.value is
32 # equal to ITk{extension}
33 return flags.Tracking.ITkPrimaryPassConfig.value.replace("ITk", "")
34
36 # Name of the persistified track particle container for tracking passes
37 # that store their tracks in a separate container (storeSeparateContainer).
38 # This follows the InDet{extension}TrackParticles convention, unless the
39 # pass requests a different name via the storedTrackParticlesExtension flag
40 # (e.g. the ActsLargeRadius pass writes to InDetLargeD0TrackParticles so that
41 # downstream LRT clients can rely on the Run-3 container name)
42 extension = flags.Tracking.ActiveConfig.storedTrackParticlesExtension or \
43 flags.Tracking.ActiveConfig.extension
44 return f"InDet{extension}TrackParticles"
45
46def extractTrackingPasses(flags) -> list:
47 # Function for extracting the requested tracking passes that need to be scheduled
48 trackingPasses = []
49
50 # Check there is only one chain
51 # for the time being we still technically allow for a list, but we should move to a single value eventually
52 if len(flags.Tracking.recoChain) != 1:
53 raise ValueError(f"Conflicting reco configuration: Tracking.recoChain should have only one element but we found {flags.Tracking.recoChain}")
54
55 # Quick check about fast tracking configuration
56 from TrkConfig.TrkConfigFlags import ITkPrimaryPassConfig
57 if flags.Tracking.ITkPrimaryPassConfig is ITkPrimaryPassConfig.Acts:
58 if not flags.Tracking.doITkFastTracking:
59 raise ValueError(f"Main pass is set to Acts Fast Tracking but Tracking.doITkFastTracking is set to {flags.Tracking.doITkFastTracking}")
60 else:
61 if flags.Tracking.doITkFastTracking:
62 raise ValueError(f"Main pass is NOT set to Fast Tracking but Tracking.doITkFastTracking is set to {flags.Tracking.doITkFastTracking}")
63
64 # Check the ambiguity resolution strategy
65 if flags.Acts.doAmbiguityResolution:
66 from ActsConfig.ActsConfigFlags import AmbiguitySolverMode
67 # If ambiguity resolution is requested, it means we want to schedule the ambiguity resolution algorithm
68 # this means that we must have AmbiguitySolverMode.OUTSIDE_TF
69 if flags.Acts.AmbiguitySolverMode is not AmbiguitySolverMode.OUTSIDE_TF:
70 raise ValueError(f"Conflicting reco configuration: Acts.doAmbiguityResolution has been requested and this will schedule the ACTS ambiguity solver algorithm, yet the ambiguity mode (set to {flags.Acts.AmbiguitySolverMode}) is not compatible with this.")
71
72
73 # Primary pass
74 trackingPasses += [flags.cloneAndReplace(
75 "Tracking.ActiveConfig",
76 f"Tracking.{flags.Tracking.ITkPrimaryPassConfig.value}Pass")]
77
78 # Conversion pass
79 if flags.Acts.doITkConversion:
80 # Check that we can schedule the conversion
81 if not flags.Detector.EnableCalo:
82 raise ValueError("Problem in the job configuration: required reconstruction of photon conversion tracks but Calorimeter Detector is not enabled")
83 trackingPasses += [flags.cloneAndReplace(
84 "Tracking.ActiveConfig",
85 "Tracking.ITkActsConversionPass")]
86
87 # Large Radius pass
88 if flags.Acts.doLargeRadius and primaryPassUsesActs(flags):
89 trackingPasses += [flags.cloneAndReplace(
90 "Tracking.ActiveConfig",
91 "Tracking.ITkActsLargeRadiusPass")]
92
93
94 # Low pT pass
95 if flags.Acts.doLowPt:
96 trackingPasses += [flags.cloneAndReplace(
97 "Tracking.ActiveConfig",
98 "Tracking.ITkActsLowPtPass")]
99
100 print("List of scheduled passes:")
101 for trackingPass in trackingPasses:
102 print(f'- {trackingPass.Tracking.ActiveConfig.extension}')
103
104 # Check if we found a primary pass (and only one)
105 nPrimaryPasses = 0
106 for current_flags in trackingPasses:
107 if isPrimaryPass(current_flags):
108 nPrimaryPasses += 1
109 if nPrimaryPasses != 1:
110 raise ValueError(f"Problem in the job configuration: exactly one primary pass is required for a proper configuration, but we found {nPrimaryPasses} instead!")
111
112 return trackingPasses
113
114def getListOfGeneratedTrackParticles(flags) -> list[str]:
115 generateTrackCollections = ["InDetTrackParticles"]
116
117 # loop on tracking passes
118 scheduledTrackingPasses: list = extractTrackingPasses(flags)
119 for currentFlags in scheduledTrackingPasses:
120 # Add the seed tracks
121 if currentFlags.Tracking.ActiveConfig.storeTrackSeeds:
122 # pixel seeds
123 generatePixelSegments = currentFlags.Detector.EnableITkPixel
124 generateStripSegments = currentFlags.Detector.EnableITkStrip
125
126 # For conversion pass we do not process pixels
127 if currentFlags.Tracking.ActiveConfig.extension == "ActsConversion" or currentFlags.Tracking.ActiveConfig.isLargeD0:
128 generatePixelSegments = False
129 # For main pass disable strips if fast tracking configuration
130 elif isFastPrimaryPass(currentFlags):
131 generateStripSegments = False
132
133 if generatePixelSegments:
134 generateTrackCollections += [f'SiSPSeedSegments{currentFlags.Tracking.ActiveConfig.extension}PixelTrackParticles']
135 if generateStripSegments:
136 generateTrackCollections += [f'SiSPSeedSegments{currentFlags.Tracking.ActiveConfig.extension}StripTrackParticles']
137 if generatePixelSegments and generateStripSegments:
138 generateTrackCollections += [f'SiSPSeedSegments{currentFlags.Tracking.ActiveConfig.extension}TrackParticles']
139
140 # Add CKF tracks
141 if currentFlags.Tracking.ActiveConfig.storeSiSPSeededTracks:
142 generateTrackCollections += [f'SiSPSeededTracks{currentFlags.Tracking.ActiveConfig.extension}TrackParticles']
143
144 # Add tracks after ambi
145 # this is necessary only if ambiguity resolution is run and we
146 # store track particles in a separate container w.r.t InDetTrackParticles
147 if currentFlags.Acts.doAmbiguityResolution and currentFlags.Tracking.ActiveConfig.storeSeparateContainer:
148 generateTrackCollections += [separateTrackParticleContainerName(currentFlags)]
149
150 print('Here is the list of generated track particle collections:')
151 for collection in generateTrackCollections:
152 print(f'- {collection}')
153
154 return generateTrackCollections
void print(char *figname, TCanvas *c1)
str separateTrackParticleContainerName(flags)
bool primaryPassUsesActs(flags)
list extractTrackingPasses(flags)
bool isFastPrimaryPass(flags)
bool isPrimaryPass(flags)
str primaryPassExtension(flags)
list[str] getListOfGeneratedTrackParticles(flags)
bool isValidationPass(flags)
bool isProductionPass(flags)