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