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