ATLAS Offline Software
Loading...
Searching...
No Matches
ITkActsDeviceTrackRecoConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
3from AthenaConfiguration.Enums import FlagEnum
4
5from ActsGPUGeometry.ActsGPUGeometryConfig import DeviceDetectorDescriptionCondAlgCfg
6from ActsConfig.ActsConfigFlags import DeviceTritonMode
7from ActsGPUDataPreparation.ActsGPUDataPreparationConfig import DeviceClusterizationAlgCfg
8
9class DataLocation(FlagEnum):
10 HOST = "host" # Athena objects on CPU
11 DEVICE = "device" # Traccc buffers on GPU
12
13def ITkActsDeviceTrackRecoCfg(flags, *, previousExtension=None):
14 acc = ComponentAccumulator()
15
16 tritonMode = flags.Acts.Device.tritonMode
17 doDeviceSteps = (flags.Acts.Device.doClusterization,
18 flags.Acts.Device.doSeeding,
19 flags.Acts.Device.doTrackReconstruction)
20 if tritonMode is DeviceTritonMode.Server and not all(doDeviceSteps):
21 raise ValueError("Acts.Device.tritonMode=Server runs the full chain on "
22 "the device: Acts.Device.doClusterization, doSeeding and "
23 "doTrackReconstruction must all be True.")
24 if tritonMode is DeviceTritonMode.Client and any(doDeviceSteps):
25 raise ValueError("Acts.Device.tritonMode=Client sends the event to the "
26 "Triton server instead of running on the device: "
27 "Acts.Device.doClusterization, doSeeding and doTrackReconstruction "
28 "must all be False.")
29
30 # Bring up shared device infrastructure once, upfront
31 print(f"Setting up GPU algorithms with {flags.Device.Backend.value} backend")
32
33 acc.merge(DeviceDetectorDescriptionCondAlgCfg(flags))
34
35 if tritonMode is DeviceTritonMode.Client:
36 from TracccTritonClient.TracccTritonClientConfig import TritonTracccTrackMakerCfg
37 acc.merge(TritonTracccTrackMakerCfg(flags))
38 acc.merge(ITkActsDeviceTrackRecoPostProcessingCfg(flags, previousExtension=previousExtension))
39 return acc
40
41 # --- Clusterization ---
42 if flags.Acts.Device.doClusterization and tritonMode is DeviceTritonMode.Server:
43 # The cells are recorded by the Triton backend from the client request
44 acc.merge(DeviceClusterizationAlgCfg(flags,
45 InputTracccCells="TracccCellCollection",
46 OutputTracccMeasurements="TracccMeasurementCollection",
47 OutputTracccClusters="TracccClusterCollection",
48 RetrieveClusterCells=True))
49 clustersLocation = DataLocation.DEVICE
50
51 elif flags.Acts.Device.doClusterization:
52
53 #TODO: remove this once MC is fixed
54 if not flags.Tracking.doPixelDigitalClustering:
55 raise ValueError("clusterization on device is not compatible "
56 "with analog clustering at the moment due to incorrent "
57 "ToT values for Pixel hits in the simulation data.")
58
59 # Create RoI for secondary passes (e.g. LargeD0) to reuse
60 from ActsConfig.ActsRegionsOfInterestConfig import ActsRegionsOfInterestCreatorAlgCfg
61 acc.merge(ActsRegionsOfInterestCreatorAlgCfg(flags,
62 name=f"{flags.Tracking.ActiveConfig.extension}RegionsOfInterestCreatorAlg"))
63
64 print("Performing clusterization on device")
65
66 # setup RDO converter
67 if flags.Acts.EDM.PhaseII :
68 from ActsConfig.ActsPhaseIIRawDataEdmConfig import (
69 PhaseIIPixelRawDataContainerCfg,
70 PhaseIIStripRawDataContainerCfg,
71 )
72 acc.merge(PhaseIIPixelRawDataContainerCfg(flags))
73 acc.merge(PhaseIIStripRawDataContainerCfg(flags))
74 from ActsGPUEventCnv.ActsGPUEventCnvConfig import PhaseIIRDOtoTracccCellConverterAlgCfg
75 acc.merge(PhaseIIRDOtoTracccCellConverterAlgCfg(flags,
76 TracccCells = "TracccCellCollection",
77 ))
78 else:
79 from ActsGPUEventCnv.ActsGPUEventCnvConfig import RDOtoTracccCellConverterAlgCfg
80 acc.merge(RDOtoTracccCellConverterAlgCfg(flags,
81 TracccCells = "TracccCellCollection",
82 ))
83
84 # setup traccc clusterization
85 acc.merge(DeviceClusterizationAlgCfg(flags,
86 InputTracccCells="TracccCellCollection",
87 OutputTracccMeasurements="TracccMeasurementCollection",
88 OutputTracccClusters="TracccClusterCollection",
89 RetrieveClusterCells=flags.Tracking.doTruth,
90 previousExtension=previousExtension))
91 clustersLocation = DataLocation.DEVICE
92
93 else:
94 from InDetConfig.ITkActsDataPreparationConfig import ITkActsDataPreparationCfg
95 acc.merge(ITkActsDataPreparationCfg(flags, previousExtension=previousExtension))
96 clustersLocation = DataLocation.HOST
97
98 # --- Seeding ---
99 if flags.Acts.Device.doSeeding:
100
101 if clustersLocation is not DataLocation.DEVICE:
102 raise ValueError("Device seeding requires device clusterization "
103 "(flags.Acts.Device.doClusterization=True): it reads the "
104 "traccc measurement collection straight out of device memory "
105 "and there is currently no host->device measurement converter.")
106
107 # Pixel space point formation on device
108 from ActsGPUDataPreparation.ActsGPUDataPreparationConfig import DeviceSPFormationAlgCfg
109 acc.merge(DeviceSPFormationAlgCfg(flags,
110 name="DeviceSPFormationAlg",
111 InputTracccMeasurements="TracccMeasurementCollection",
112 OutputTracccPixelSpacepoints="TracccPixelSpacepointCollection"))
113
114 from ActsConfig.ActsConfigFlags import SeedingStrategy
115
116 print(f"Performing seeding on device with seeding strategy set to {flags.Acts.Device.seedingStrategy}")
117 if flags.Acts.Device.seedingStrategy is SeedingStrategy.Gbts:
118 from ActsGPUPatternRecognition.ActsGPUPatternRecognitionConfig import DeviceGBTSSeedingAlgCfg
119 acc.merge(DeviceGBTSSeedingAlgCfg(flags,
120 name="DeviceGBTSSeedingAlg",
121 InputTracccPixelSpacepoints="TracccPixelSpacepointCollection",
122 InputTracccMeasurements="TracccMeasurementCollection",
123 OutputTracccPixelSeeds="TracccPixelSeedCollection"))
124 else:
125 from ActsGPUPatternRecognition.ActsGPUPatternRecognitionConfig import DeviceTripletSeedingAlgCfg
126 acc.merge(DeviceTripletSeedingAlgCfg(flags,
127 name="DeviceTripletSeedingAlg",
128 InputTracccPixelSpacepoints="TracccPixelSpacepointCollection",
129 OutputTracccPixelSeeds="TracccPixelSeedCollection"))
130
131 seedsLocation = DataLocation.DEVICE
132
133 else:
134
135 # If clusterization was on device, need to copy them to host first
136 # and schedule space point formation
137 if clustersLocation is DataLocation.DEVICE:
138 from ActsGPUEventCnv.ActsGPUEventCnvConfig import TracccMeasurementConverterAlgCfg
139 acc.merge(TracccMeasurementConverterAlgCfg(flags,
140 InputMeasurements="TracccMeasurementCollection",
141 InputClusters="TracccClusterCollection",
142 InputCells="TracccCellCollection",
143 ConvertClustersWithCells = flags.Tracking.doTruth,
144 OutputPixelSpacePoints="ITkPixelSpacePoints",
145 OutputPixelClusters="ITkPixelClusters",
146 OutputStripClusters="ITkStripClusters"
147 ))
148
149 from ActsConfig.ActsSpacePointFormationConfig import ActsStripSpacePointFormationAlgCfg
150 acc.merge(ActsStripSpacePointFormationAlgCfg(flags,
151 name=f"{flags.Tracking.ActiveConfig.extension}StripSpacePointFormationAlg",
152 StripClusters="ITkStripClusters",
153 StripSpacePoints="ITkStripSpacePoints",
154 StripOverlapSpacePoints="ITkStripOverlapSpacePoints"))
155
156 clustersLocation = DataLocation.HOST
157
158 # Truth (as configured in ITkActsDataPreparationCfg)
159 # this truth must only be done if you do PRD and SpacePointformation
160 # If you only do the latter (== running on ESD) then the needed input (simdata)
161 # is not in ESD but the resulting truth (clustertruth) is already there ...
162 if flags.Tracking.doTruth:
163 from ActsConfig.ActsTruthConfig import ActsTruthAssociationAlgCfg, ActsTruthParticleHitCountAlgCfg
164 acc.merge(ActsTruthAssociationAlgCfg(flags))
165 acc.merge(ActsTruthParticleHitCountAlgCfg(flags))
166
167 from ActsConfig.ActsSeedingConfig import ActsSeedingCfg
168 acc.merge(ActsSeedingCfg(flags))
169 seedsLocation = DataLocation.HOST
170
171
172 # --- Track Reconstruction ---
173 if flags.Acts.Device.doTrackReconstruction:
174
175 if clustersLocation is not DataLocation.DEVICE or seedsLocation is not DataLocation.DEVICE:
176 raise ValueError("Device track reconstruction requires device clusterization "
177 "(flags.Acts.Device.doClusterization=True) and device seeding "
178 "(flags.Acts.Device.doSeeding=True): it reads the traccc measurement "
179 "and seed collections straight out of device memory and there is "
180 "currently no host->device converter for these yet.")
181
182
183 from ActsGPUMagField.ActsGPUMagFieldConfig import JSONDeviceMagFieldProviderSvcCfg
184 acc.merge(JSONDeviceMagFieldProviderSvcCfg(flags,
185 DeviceMagFieldObjectName="TracccMagneticField",
186 HostMagFieldObjectName="TracccHostMagField",
187 ))
188
189 from ActsGPUPatternRecognition.ActsGPUPatternRecognitionConfig import DeviceTrkParamEstimationAlgCfg, DeviceTrackFindingAlgCfg
190 acc.merge(DeviceTrkParamEstimationAlgCfg(flags,
191 InputTracccSpacepoints="TracccPixelSpacepointCollection",
192 InputTracccMeasurements="TracccMeasurementCollection",
193 InputTracccSeeds="TracccPixelSeedCollection",
194 InputTracccMagField="TracccMagneticField",
195 OutputTracccTrackParameters="TracccTrackParameterCollection",
196 ))
197
198 acc.merge(DeviceTrackFindingAlgCfg(flags,
199 InputTracccMeasurements="TracccMeasurementCollection",
200 InputTracccMagField="TracccMagneticField",
201 InputTracccTrackParameters="TracccTrackParameterCollection",
202 InputTracccDetectorGeometry="TracccDeviceDetectorGeometry",
203 OutputTracccTracks="TracccTrackCollection",
204 ))
205
206 # The Triton backend returns the raw tracks to be converted by the client
207 if tritonMode is DeviceTritonMode.Server:
208 return acc
209
210 if clustersLocation is not DataLocation.DEVICE:
211 acc.merge(TracccMeasurementConverterAlgCfg(flags,
212 InputMeasurements="TracccMeasurementCollection",
213 InputClusters="TracccClusterCollection",
214 InputCells="TracccCellCollection",
215 ConvertClustersWithCells = flags.Tracking.doTruth,
216 OutputPixelClusters="ITkPixelClusters",
217 OutputPixelSpacePoints="ITkPixelSpacePoints",
218 OutputMeasToPixelSP="ITkTracccMeasToPixelSP",
219 OutputMeasToStripCl="ITkTracccMeasToStripCl",
220 OutputStripClusters="ITkStripClusters",
221 GeoIdMapping="TracccGeoIdMapping",
222 ))
223
224 from ActsGPUEventCnv.ActsGPUEventCnvConfig import TracccTrackConverterAlgCfg, TracccMeasurementConverterAlgCfg
225 if clustersLocation is DataLocation.DEVICE:
226 acc.merge(TracccMeasurementConverterAlgCfg(flags,
227 InputMeasurements="TracccMeasurementCollection",
228 InputClusters="TracccClusterCollection",
229 InputCells="TracccCellCollection",
230 ConvertClustersWithCells = flags.Tracking.doTruth,
231 OutputPixelClusters="ITkPixelClusters",
232 OutputPixelSpacePoints="ITkPixelSpacePoints",
233 OutputMeasToPixelSP="ITkTracccMeasToPixelSP",
234 OutputMeasToStripCl="ITkTracccMeasToStripCl",
235 OutputStripClusters="ITkStripClusters"
236 ))
237
238 # Strip clusters were just produced above, but nothing forms strip
239 # space points on the device path — mirror the host-side flow
240 if flags.Tracking.ActiveConfig.useITkStripSeeding or (flags.Acts.SpacePoints.doStrip and not flags.Tracking.ActiveConfig.isSecondaryPass):
241 from ActsConfig.ActsSpacePointFormationConfig import ActsStripSpacePointFormationAlgCfg
242 acc.merge(ActsStripSpacePointFormationAlgCfg(flags,
243 name=f"{flags.Tracking.ActiveConfig.extension}StripSpacePointFormationAlg",
244 StripClusters="ITkStripClusters",
245 StripSpacePoints="ITkStripSpacePoints",
246 StripOverlapSpacePoints="ITkStripOverlapSpacePoints"))
247
248 acc.merge(TracccTrackConverterAlgCfg(flags,
249 InputPixelClusters="ITkPixelClusters",
250 InputStripClusters="ITkStripClusters",
251 InputMeasToPixelSP="ITkTracccMeasToPixelSP",
252 InputMeasToStripCl="ITkTracccMeasToStripCl",
253 InputTracks="TracccTrackCollection",
254 OutputTracks=f"{flags.Tracking.ActiveConfig.extension}Tracks",
255 ))
256
257
258
259 else:
260
261 # If clusterization was on device, need to copy the measurements to host first
262 if clustersLocation is DataLocation.DEVICE:
263 from ActsGPUEventCnv.ActsGPUEventCnvConfig import TracccMeasurementConverterAlgCfg
264 acc.merge(TracccMeasurementConverterAlgCfg(flags,
265 InputMeasurements="TracccMeasurementCollection",
266 InputClusters="TracccClusterCollection",
267 InputCells="TracccCellCollection",
268 ConvertClustersWithCells = flags.Tracking.doTruth,
269 OutputPixelClusters="ITkPixelClusters",
270 OutputPixelSpacePoints="ITkPixelSpacePoints",
271 OutputMeasToPixelSP="ITkTracccMeasToPixelSP",
272 OutputMeasToStripCl="ITkTracccMeasToStripCl",
273 OutputStripClusters="ITkStripClusters"
274 ))
275 from ActsConfig.ActsSpacePointFormationConfig import ActsStripSpacePointFormationAlgCfg
276 acc.merge(ActsStripSpacePointFormationAlgCfg(flags,
277 name=f"{flags.Tracking.ActiveConfig.extension}StripSpacePointFormationAlg",
278 StripClusters="ITkStripClusters",
279 StripSpacePoints="ITkStripSpacePoints",
280 StripOverlapSpacePoints="ITkStripOverlapSpacePoints"))
281 clustersLocation = DataLocation.HOST
282
283 if seedsLocation is DataLocation.DEVICE:
284 from ActsGPUEventCnv.ActsGPUEventCnvConfig import TracccSeedConverterAlgCfg
285
286 acc.merge(TracccSeedConverterAlgCfg(flags,
287 name="TracccSeedConverterAlg",
288 InputSpacepointsDevice="TracccPixelSpacepointCollection",
289 InputSpacepoints="ITkPixelSpacePoints",
290 InputMeasToPixelSP="ITkTracccMeasToPixelSP",
291 InputSeeds="TracccPixelSeedCollection",
292 OutputSeeds=f'{flags.Tracking.ActiveConfig.extension}PixelSeeds'))
293 seedsLocation = DataLocation.HOST
294
295 # CKF
296 from ActsConfig.ActsTrackFindingConfig import ActsTrackFindingCfg
297 acc.merge(ActsTrackFindingCfg(flags))
298
299 # Ambiguity Resolution
300 if flags.Acts.doAmbiguityResolution:
301 from ActsConfig.ActsTrackFindingConfig import ActsAmbiguityResolutionCfg
302 acc.merge(ActsAmbiguityResolutionCfg(flags))
303
304 acc.merge(ITkActsDeviceTrackRecoPostProcessingCfg(flags, previousExtension=previousExtension))
305 return acc
306
307
308def ITkActsDeviceTrackRecoPostProcessingCfg(flags, *, previousExtension=None):
309 """PRD association and truth for the tracks of the primary pass, once
310 they are converted back to the host."""
311 acc = ComponentAccumulator()
312
313 # PRD association
314 from ActsConfig.ActsPrdAssociationConfig import ActsPrdAssociationAlgCfg
315 acc.merge(ActsPrdAssociationAlgCfg(flags,
316 name = f'{flags.Tracking.ActiveConfig.extension}PrdAssociationAlg',
317 previousActsExtension = previousExtension))
318
319 # Truth
320 if flags.Tracking.doTruth:
321
322 # schedule association of measurements to truth particles
323 from ActsConfig.ActsTruthConfig import ActsTruthAssociationAlgCfg, ActsTruthParticleHitCountAlgCfg
324 acc.merge(ActsTruthAssociationAlgCfg(flags))
325 acc.merge(ActsTruthParticleHitCountAlgCfg(flags))
326 if flags.Acts.doTruthInspection:
327 from ActsConfig.ActsInspectTruthContentConfig import ActsInspectTruthContentAlgCfg
328 acc.merge(ActsInspectTruthContentAlgCfg(flags))
329
330 # Run truth on CKF tracks
331 # This is only necessary if we are asking for these tracks to be persistified with the
332 # - flag: Tracking.ActiveConfig.storeSiSPSeededTracks set to True OR
333 # - flag: flags.Acts.doAmbiguityResolution set to False
334 if flags.Tracking.ActiveConfig.storeSiSPSeededTracks or not flags.Acts.doAmbiguityResolution:
335 from ActsConfig.ActsTruthConfig import ActsTrackToTruthAssociationAlgCfg, ActsTrackFindingValidationAlgCfg
336 acts_tracks = f"{flags.Tracking.ActiveConfig.extension}Tracks"
337 acc.merge(ActsTrackToTruthAssociationAlgCfg(flags,
338 name = f"{acts_tracks}TrackToTruthAssociationAlg",
339 ACTSTracksLocation = acts_tracks,
340 AssociationMapOut = f"{acts_tracks}ToTruthParticleAssociation"))
341
342 acc.merge(ActsTrackFindingValidationAlgCfg(flags,
343 name = f"{acts_tracks}TrackFindingValidationAlg",
344 TrackToTruthAssociationMap = f"{acts_tracks}ToTruthParticleAssociation"))
345
346 # Run truth on the tracks from ambiguity resolution. This is only necessary if
347 # - flag: flags.Acts.doAmbiguityResolution set to True
348 if flags.Acts.doAmbiguityResolution:
349 acts_tracks = f"{flags.Tracking.ActiveConfig.extension}ResolvedTracks"
350 from ActsConfig.ActsTruthConfig import ActsTrackToTruthAssociationAlgCfg, ActsTrackFindingValidationAlgCfg
351 acc.merge(ActsTrackToTruthAssociationAlgCfg(flags,
352 name = f"{acts_tracks}TrackToTruthAssociationAlg",
353 ACTSTracksLocation = acts_tracks,
354 AssociationMapOut = f"{acts_tracks}ToTruthParticleAssociation"))
355
356 acc.merge(ActsTrackFindingValidationAlgCfg(flags,
357 name = f"{acts_tracks}TrackFindingValidationAlg",
358 TrackToTruthAssociationMap = f"{acts_tracks}ToTruthParticleAssociation"))
359
360 # Extract track parameters from device seeds if requested
361 if flags.Tracking.ActiveConfig.storeTrackSeeds and flags.Acts.Device.doSeeding: # for clustering only pipelines this is controlled via the ActsSeedingConfig file
362 from ActsConfig.ActsSeedingConfig import ActsStoreTrackSeedsCfg
363 from ActsConfig.ActsAnalysisConfig import ActsPixelSeedsToTrackParamsAlgCfg, ActsStripSeedsToTrackParamsAlgCfg
364 processPixels = flags.Tracking.ActiveConfig.useITkPixelSeeding
365 processStrips = flags.Tracking.ActiveConfig.useITkStripSeeding
366
367 prefix = flags.Tracking.ActiveConfig.extension
368
369 if flags.Acts.Device.doTrackReconstruction:
370 from ActsGPUEventCnv.ActsGPUEventCnvConfig import TracccSeedConverterAlgCfg
371 acc.merge(TracccSeedConverterAlgCfg(flags,
372 name="TracccSeedConverterAlg",
373 InputSpacepointsDevice="TracccPixelSpacepointCollection",
374 InputSpacepoints="ITkPixelSpacePoints",
375 InputMeasToPixelSP="ITkTracccMeasToPixelSP",
376 InputSeeds="TracccPixelSeedCollection",
377 OutputSeeds=f'{flags.Tracking.ActiveConfig.extension}PixelSeeds'))
378
379 # Create track parameters before ActsStoreTrackSeedsCfg (following ActsSeedingCfg pattern)
380 if processPixels:
381 acc.merge(ActsPixelSeedsToTrackParamsAlgCfg(
382 flags,
383 name = prefix + 'PixelSeedsToTrackParamsAlg',
384 InputSeedContainerKey = prefix + 'PixelSeeds',
385 OutputTrackParamsCollectionKey = prefix + 'PixelEstimatedTrackParams'))
386 if processStrips:
387 acc.merge(ActsStripSeedsToTrackParamsAlgCfg(
388 flags,
389 name = prefix + 'StripSeedsToTrackParamsAlg',
390 InputSeedContainerKey = prefix + 'StripSeeds',
391 OutputTrackParamsCollectionKey = prefix + 'StripEstimatedTrackParams'))
392
393 if processPixels:
394 acc.merge(ActsStoreTrackSeedsCfg(flags,processPixels=True, processStrips=False))
395 if processStrips:
396 acc.merge(ActsStoreTrackSeedsCfg(flags,processPixels=False, processStrips=True))
397 if processPixels and processStrips:
398 acc.merge(ActsStoreTrackSeedsCfg(flags,processPixels=True, processStrips=True))
399
400 return acc
401
402
403def ITkActsDeviceSecondaryPassTrackRecoCfg(flags, *, previousExtension=None):
404 """Secondary tracking pass with data preparation on the host and
405 seeding and track finding on the device.
406
407 The clusters and space points of the pass are prepared on the host from
408 the objects of the previous pass (PRD association), converted to traccc
409 measurements and spacepoints, and the seeds and tracks are reconstructed
410 on the device. The tracks are converted back to an ACTS track container
411 named as for the host reconstruction of the pass.
412 """
413 acc = ComponentAccumulator()
414
415 if previousExtension is None:
416 raise ValueError("A secondary pass on the device requires a previous pass")
417
418 extension = flags.Tracking.ActiveConfig.extension
419 prefix = f"ITk{extension.replace('Acts', '')}"
420 pixelClusters = f"{prefix}PixelClusters"
421 stripClusters = f"{prefix}StripClusters"
422
423 if flags.Tracking.ActiveConfig.useITkPixelSeeding:
424 raise ValueError("Pixel seeding on the device is not supported for secondary passes")
425 if not flags.Tracking.ActiveConfig.useITkStripSeeding:
426 raise ValueError("Secondary pass on the device requires strip seeding")
427
428 print(f"Setting up GPU algorithms for the {extension} pass with {flags.Device.Backend.value} backend")
429
430 # Setup traccc detector description objects — loads all device detector description data into detStore
431 acc.merge(DeviceDetectorDescriptionCondAlgCfg(flags))
432
433 from ActsGPUMagField.ActsGPUMagFieldConfig import JSONDeviceMagFieldProviderSvcCfg
434 acc.merge(JSONDeviceMagFieldProviderSvcCfg(flags,
435 DeviceMagFieldObjectName="TracccMagneticField",
436 HostMagFieldObjectName="TracccHostMagField",
437 ))
438
439 # --- Data preparation on the host ---
440 from InDetConfig.ITkActsDataPreparationConfig import ITkActsDataPreparationCfg
441 acc.merge(ITkActsDataPreparationCfg(flags, previousExtension=previousExtension))
442
443 # --- Conversion to traccc ---
444 measurements = f"Traccc{extension}MeasurementCollection"
445 measToPixelCluster = f"Traccc{extension}MeasToPixelCluster"
446 measToStripCluster = f"Traccc{extension}MeasToStripCluster"
447 stripSpacepoints = f"Traccc{extension}StripSpacepointCollection"
448
449 from ActsGPUEventCnv.ActsGPUEventCnvConfig import (
450 xAODToTracccMeasurementConverterAlgCfg,
451 xAODToTracccSpacePointConverterAlgCfg,
452 )
453 acc.merge(xAODToTracccMeasurementConverterAlgCfg(flags,
454 name=f"{extension}MeasurementConverterAlg",
455 InputPixelClusters=pixelClusters,
456 InputStripClusters=stripClusters,
457 OutputTracccMeasurements=measurements,
458 OutputMeasToPixelCluster=measToPixelCluster,
459 OutputMeasToStripCluster=measToStripCluster,
460 ))
461
462 stripSpacePoints = [f"{prefix}StripSpacePoints"]
463 if extension != "ActsConversion":
464 stripSpacePoints += [f"{prefix}StripOverlapSpacePoints"]
465 acc.merge(xAODToTracccSpacePointConverterAlgCfg(flags,
466 name=f"{extension}StripSpacePointConverterAlg",
467 InputSpacePoints=stripSpacePoints,
468 InputMeasToCluster=measToStripCluster,
469 OutputTracccSpacepoints=stripSpacepoints,
470 ))
471
472 # --- Seeding ---
473 seeds = f"Traccc{extension}StripSeedCollection"
474 from ActsGPUPatternRecognition.ActsGPUPatternRecognitionConfig import (
475 DeviceLargeRadiusStripTripletSeedingAlgCfg,
476 DeviceTrkParamEstimationAlgCfg,
477 DeviceLargeRadiusTrackFindingAlgCfg,
478 )
479 acc.merge(DeviceLargeRadiusStripTripletSeedingAlgCfg(flags,
480 name=f"{extension}DeviceStripTripletSeedingAlg",
481 InputTracccPixelSpacepoints=stripSpacepoints,
482 OutputTracccPixelSeeds=seeds,
483 ))
484
485 # --- Track Reconstruction ---
486 trackParameters = f"Traccc{extension}TrackParameterCollection"
487 tracccTracks = f"Traccc{extension}TrackCollection"
488 acc.merge(DeviceTrkParamEstimationAlgCfg(flags,
489 name=f"{extension}DeviceTrkParamEstimationAlg",
490 InputTracccSpacepoints=stripSpacepoints,
491 InputTracccMeasurements=measurements,
492 InputTracccSeeds=seeds,
493 InputTracccMagField="TracccMagneticField",
494 OutputTracccTrackParameters=trackParameters,
495 ))
496
497 acc.merge(DeviceLargeRadiusTrackFindingAlgCfg(flags,
498 name=f"{extension}DeviceTrackFindingAlg",
499 InputTracccMeasurements=measurements,
500 InputTracccMagField="TracccMagneticField",
501 InputTracccTrackParameters=trackParameters,
502 InputTracccDetectorGeometry="TracccDeviceDetectorGeometry",
503 OutputTracccTracks=tracccTracks,
504 ))
505
506 # The measurement to cluster maps hold the index of the cluster in its
507 # owning container, so the tracks are resolved against the primary pass
508 # cluster containers rather than the views of this pass
509 from ActsGPUEventCnv.ActsGPUEventCnvConfig import TracccTrackConverterAlgCfg
510 acc.merge(TracccTrackConverterAlgCfg(flags,
511 name=f"{extension}TracccTrackConverterAlg",
512 InputPixelClusters="ITkPixelClusters",
513 InputStripClusters="ITkStripClusters",
514 InputMeasToPixelSP=measToPixelCluster,
515 InputMeasToStripCl=measToStripCluster,
516 InputTracks=tracccTracks,
517 OutputTracks=f"{extension}Tracks",
518 GeoIdMapping="TracccGeometryIdMapping",
519 HostDetectorName="TracccHostDetectorGeometry",
520 ))
521
522 # Ambiguity Resolution
523 if flags.Acts.doAmbiguityResolution:
524 from ActsConfig.ActsTrackFindingConfig import ActsAmbiguityResolutionCfg
525 acc.merge(ActsAmbiguityResolutionCfg(flags))
526
527 # PRD association
528 from ActsConfig.ActsPrdAssociationConfig import ActsPrdAssociationAlgCfg
529 acc.merge(ActsPrdAssociationAlgCfg(flags,
530 name = f'{extension}PrdAssociationAlg',
531 previousActsExtension = previousExtension))
532
533 # Truth
534 if flags.Tracking.doTruth:
535 from ActsConfig.ActsTruthConfig import ActsTrackToTruthAssociationAlgCfg, ActsTrackFindingValidationAlgCfg
536 if flags.Tracking.ActiveConfig.storeSiSPSeededTracks or not flags.Acts.doAmbiguityResolution:
537 acts_tracks = f"{extension}Tracks"
538 acc.merge(ActsTrackToTruthAssociationAlgCfg(flags,
539 name = f"{acts_tracks}TrackToTruthAssociationAlg",
540 ACTSTracksLocation = acts_tracks,
541 AssociationMapOut = f"{acts_tracks}ToTruthParticleAssociation"))
542 acc.merge(ActsTrackFindingValidationAlgCfg(flags,
543 name = f"{acts_tracks}TrackFindingValidationAlg",
544 TrackToTruthAssociationMap = f"{acts_tracks}ToTruthParticleAssociation"))
545
546 if flags.Acts.doAmbiguityResolution:
547 acts_tracks = f"{extension}ResolvedTracks"
548 acc.merge(ActsTrackToTruthAssociationAlgCfg(flags,
549 name = f"{acts_tracks}TrackToTruthAssociationAlg",
550 ACTSTracksLocation = acts_tracks,
551 AssociationMapOut = f"{acts_tracks}ToTruthParticleAssociation"))
552 acc.merge(ActsTrackFindingValidationAlgCfg(flags,
553 name = f"{acts_tracks}TrackFindingValidationAlg",
554 TrackToTruthAssociationMap = f"{acts_tracks}ToTruthParticleAssociation"))
555
556 return acc
void print(char *figname, TCanvas *c1)
ITkActsDeviceTrackRecoCfg(flags, *, previousExtension=None)
ITkActsDeviceTrackRecoPostProcessingCfg(flags, *, previousExtension=None)
ITkActsDeviceSecondaryPassTrackRecoCfg(flags, *, previousExtension=None)