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
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
42 if flags.Acts.Device.doClusterization and tritonMode is DeviceTritonMode.Server:
43
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
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
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
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
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
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
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
136
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
159
160
161
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
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
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
239
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
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
296 from ActsConfig.ActsTrackFindingConfig import ActsTrackFindingCfg
297 acc.merge(ActsTrackFindingCfg(flags))
298
299
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