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 JSONDeviceDetectorDescriptionProviderSvcCfg
6
7class DataLocation(FlagEnum):
8 HOST = "host" # Athena objects on CPU
9 DEVICE = "device" # Traccc buffers on GPU
10
11def ITkActsDeviceTrackRecoCfg(flags, *, previousExtension=None):
12 acc = ComponentAccumulator()
13
14 # Bring up shared device infrastructure once, upfront
15 print(f"Setting up GPU algorithms with {flags.Device.Backend.value} backend")
16
17 # Setup traccc detector description objects — loads all device detector description data into detStore
18 acc.merge(JSONDeviceDetectorDescriptionProviderSvcCfg(flags,
19 HostConditionsObjectName="TracccHostCondConfig",
20 HostDigitizationObjectName="TracccHostDigitizationConfig",
21 DeviceConditionsObjectName="TracccDeviceCondConfig",
22 DeviceDigitizationObjectName="TracccDeviceDigitizationConfig"
23 ))
24
25 # --- Clusterization ---
26 if flags.Acts.Device.doClusterization:
27
28 #TODO: remove this once MC is fixed
29 if not flags.Tracking.doPixelDigitalClustering:
30 raise ValueError("clusterization on device is not compatible "
31 "with analog clustering at the moment due to incorrent "
32 "ToT values for Pixel hits in the simulation data.")
33
34 # Create RoI for secondary passes (e.g. LargeD0) to reuse
35 from ActsConfig.ActsRegionsOfInterestConfig import ActsRegionsOfInterestCreatorAlgCfg
36 acc.merge(ActsRegionsOfInterestCreatorAlgCfg(flags,
37 name=f"{flags.Tracking.ActiveConfig.extension}RegionsOfInterestCreatorAlg"))
38
39 print("Performing clusterization on device")
40
41 # setup RDO converter
42 if flags.Acts.EDM.PhaseII :
43 from ActsConfig.ActsPhaseIIRawDataEdmConfig import (
44 PhaseIIPixelRawDataContainerCfg,
45 PhaseIIStripRawDataContainerCfg,
46 )
47 acc.merge(PhaseIIPixelRawDataContainerCfg(flags))
48 acc.merge(PhaseIIStripRawDataContainerCfg(flags))
49 from ActsGPUEventCnv.ActsGPUEventCnvConfig import PhaseIIRDOtoTracccCellConverterAlgCfg
50 acc.merge(PhaseIIRDOtoTracccCellConverterAlgCfg(flags,
51 TracccCells = "TracccCellCollection",
52 ))
53 else:
54 from ActsGPUEventCnv.ActsGPUEventCnvConfig import RDOtoTracccCellConverterAlgCfg
55 acc.merge(RDOtoTracccCellConverterAlgCfg(flags,
56 TracccCells = "TracccCellCollection",
57 ))
58
59 # setup traccc clusterization
60 from ActsGPUDataPreparation.ActsGPUDataPreparationConfig import DeviceClusterizationAlgCfg
61 acc.merge(DeviceClusterizationAlgCfg(flags,
62 InputTracccCells="TracccCellCollection",
63 OutputTracccMeasurements="TracccMeasurementCollection",
64 OutputTracccClusters="TracccClusterCollection",
65 RetrieveClusterCells=flags.Tracking.doTruth,
66 previousExtension=previousExtension))
67 clustersLocation = DataLocation.DEVICE
68
69 else:
70 from InDetConfig.ITkActsDataPreparationConfig import ITkActsDataPreparationCfg
71 acc.merge(ITkActsDataPreparationCfg(flags, previousExtension=previousExtension))
72 clustersLocation = DataLocation.HOST
73
74 # --- Seeding ---
75 if flags.Acts.Device.doSeeding:
76
77 raise ValueError("Unsupported: no device seeding yet!")
78
79 else:
80
81 # If clusterization was on device, need to copy them to host first
82 # and schedule space point formation
83 if clustersLocation is DataLocation.DEVICE:
84 from ActsGPUEventCnv.ActsGPUEventCnvConfig import TracccMeasurementConverterAlgCfg
85 acc.merge(TracccMeasurementConverterAlgCfg(flags,
86 InputMeasurements="TracccMeasurementCollection",
87 InputClusters="TracccClusterCollection",
88 InputCells="TracccCellCollection",
89 ConvertClustersWithCells = flags.Tracking.doTruth,
90 OutputPixelClusters="ITkPixelClusters",
91 OutputStripClusters="ITkStripClusters"
92 ))
93 clustersLocation = DataLocation.HOST
94
95 from ActsConfig.ActsSpacePointFormationConfig import ActsSpacePointFormationCfg
96 acc.merge(ActsSpacePointFormationCfg(flags, previousActsExtension=previousExtension))
97
98 # Truth (as configured in ITkActsDataPreparationCfg)
99 # this truth must only be done if you do PRD and SpacePointformation
100 # If you only do the latter (== running on ESD) then the needed input (simdata)
101 # is not in ESD but the resulting truth (clustertruth) is already there ...
102 if flags.Tracking.doTruth:
103 from ActsConfig.ActsTruthConfig import ActsTruthAssociationAlgCfg, ActsTruthParticleHitCountAlgCfg
104 acc.merge(ActsTruthAssociationAlgCfg(flags))
105 acc.merge(ActsTruthParticleHitCountAlgCfg(flags))
106
107 from ActsConfig.ActsSeedingConfig import ActsSeedingCfg
108 acc.merge(ActsSeedingCfg(flags))
109 seedsLocation = DataLocation.HOST
110
111
112 # --- Track Reconstruction ---
113 if flags.Acts.Device.doTrackReconstruction:
114
115 raise ValueError("Unsupported operation, we do not have this step on device yet")
116
117 else:
118
119 # If clusterization was on device, need to copy the measurements to host first
120 if clustersLocation is DataLocation.DEVICE:
121 from ActsGPUEventCnv.ActsGPUEventCnvConfig import TracccMeasurementConverterAlgCfg
122 acc.merge(TracccMeasurementConverterAlgCfg(flags,
123 InputMeasurements="TracccMeasurementCollection",
124 InputClusters="TracccClusterCollection",
125 InputTracccCells="TracccCellCollection",
126 ConvertClustersWithCells = flags.Tracking.doTruth,
127 OutputPixelClusters="ITkPixelClusters",
128 OutputStripClusters="ITkStripClusters"
129 ))
130
131 if seedsLocation is DataLocation.DEVICE:
132 raise ValueError("Unsupported operation, we do not have this conversion yet")
133
134 # CKF
135 from ActsConfig.ActsTrackFindingConfig import ActsTrackFindingCfg
136 acc.merge(ActsTrackFindingCfg(flags))
137
138 # Ambiguity Resolution
139 if flags.Acts.doAmbiguityResolution:
140 from ActsConfig.ActsTrackFindingConfig import ActsAmbiguityResolutionCfg
141 acc.merge(ActsAmbiguityResolutionCfg(flags))
142
143
144 # PRD association
145 from ActsConfig.ActsPrdAssociationConfig import ActsPrdAssociationAlgCfg
146 acc.merge(ActsPrdAssociationAlgCfg(flags,
147 name = f'{flags.Tracking.ActiveConfig.extension}PrdAssociationAlg',
148 previousActsExtension = previousExtension))
149
150 # Truth
151 if flags.Tracking.doTruth:
152
153 # schedule association of measurements to truth particles
154 from ActsConfig.ActsTruthConfig import ActsTruthAssociationAlgCfg, ActsTruthParticleHitCountAlgCfg
155 acc.merge(ActsTruthAssociationAlgCfg(flags))
156 acc.merge(ActsTruthParticleHitCountAlgCfg(flags))
157 if flags.Acts.doTruthInspection:
158 from ActsConfig.ActsInspectTruthContentConfig import ActsInspectTruthContentAlgCfg
159 acc.merge(ActsInspectTruthContentAlgCfg(flags))
160
161 # Run truth on CKF tracks
162 # This is only necessary if we are asking for these tracks to be persistified with the
163 # - flag: Tracking.ActiveConfig.storeSiSPSeededTracks set to True OR
164 # - flag: flags.Acts.doAmbiguityResolution set to False
165 if flags.Tracking.ActiveConfig.storeSiSPSeededTracks or not flags.Acts.doAmbiguityResolution:
166 from ActsConfig.ActsTruthConfig import ActsTrackToTruthAssociationAlgCfg, ActsTrackFindingValidationAlgCfg
167 acts_tracks = f"{flags.Tracking.ActiveConfig.extension}Tracks"
168 acc.merge(ActsTrackToTruthAssociationAlgCfg(flags,
169 name = f"{acts_tracks}TrackToTruthAssociationAlg",
170 ACTSTracksLocation = acts_tracks,
171 AssociationMapOut = f"{acts_tracks}ToTruthParticleAssociation"))
172
173 acc.merge(ActsTrackFindingValidationAlgCfg(flags,
174 name = f"{acts_tracks}TrackFindingValidationAlg",
175 TrackToTruthAssociationMap = f"{acts_tracks}ToTruthParticleAssociation"))
176
177 # Run truth on the tracks from ambiguity resolution. This is only necessary if
178 # - flag: flags.Acts.doAmbiguityResolution set to True
179 if flags.Acts.doAmbiguityResolution:
180 acts_tracks = f"{flags.Tracking.ActiveConfig.extension}ResolvedTracks"
181 from ActsConfig.ActsTruthConfig import ActsTrackToTruthAssociationAlgCfg, ActsTrackFindingValidationAlgCfg
182 acc.merge(ActsTrackToTruthAssociationAlgCfg(flags,
183 name = f"{acts_tracks}TrackToTruthAssociationAlg",
184 ACTSTracksLocation = acts_tracks,
185 AssociationMapOut = f"{acts_tracks}ToTruthParticleAssociation"))
186
187 acc.merge(ActsTrackFindingValidationAlgCfg(flags,
188 name = f"{acts_tracks}TrackFindingValidationAlg",
189 TrackToTruthAssociationMap = f"{acts_tracks}ToTruthParticleAssociation"))
190
191 return acc
void print(char *figname, TCanvas *c1)
ITkActsDeviceTrackRecoCfg(flags, *, previousExtension=None)