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