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