ATLAS Offline Software
Loading...
Searching...
No Matches
ActsClusterizationConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2
3from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
4from AthenaConfiguration.ComponentFactory import CompFactory
5from AthenaConfiguration.Enums import BeamType,Format
6from ActsConfig.ActsUtilities import extractChildKwargs
7from HGTD_Calibration.HGTD_CalibrationConfig import HGTD_TdcCalibrationToolCfg
8from ActsConfig.ActsPhaseIIRawDataEdmConfig import PhaseIIPixelRawDataContainerCfg
9
11 name: str = "ActsHgtdClusteringTool",
12 **kwargs) -> ComponentAccumulator:
13 acc = ComponentAccumulator()
14 if flags.HGTD.useALTIROC_RDO:
15 kwargs.setdefault("useALTIROC_RDO", True)
16 kwargs.setdefault("HGTD_TdcCalibrationTool", acc.popToolsAndMerge(HGTD_TdcCalibrationToolCfg(flags)))
17 else:
18 kwargs.setdefault("useALTIROC_RDO", False)
19 acc.setPrivateTools(CompFactory.ActsTrk.HgtdClusteringTool(name, **kwargs))
20 return acc
21
23 name: str = "ActsHgtdTimedClusteringTool",
24 **kwargs) -> ComponentAccumulator:
25 acc = ComponentAccumulator()
26 if flags.HGTD.useALTIROC_RDO:
27 kwargs.setdefault("useALTIROC_RDO", True)
28 kwargs.setdefault("HGTD_TdcCalibrationTool", acc.popToolsAndMerge(HGTD_TdcCalibrationToolCfg(flags)))
29 else:
30 kwargs.setdefault("useALTIROC_RDO", False)
31
32 acc.setPrivateTools(CompFactory.ActsTrk.HgtdTimedClusteringTool(name, **kwargs))
33 return acc
34
36 name: str = "ActsHgtdClusterizationAlg",
37 **kwargs) -> ComponentAccumulator:
38 acc = ComponentAccumulator()
39
40 if flags.HGTD.Geometry.useGeoModelXml:
41 from HGTD_GeoModelXml.HGTD_GeoModelConfig import HGTD_ReadoutGeometryCfg
42 else:
43 from HGTD_GeoModel.HGTD_GeoModelConfig import HGTD_ReadoutGeometryCfg
44 acc.merge(HGTD_ReadoutGeometryCfg(flags))
45
46 kwargs.setdefault('RDOContainerName', 'HGTD_RDOs')
47 kwargs.setdefault('AltirocRDOContainerName', 'HGTD_ALTIROC_RDOs')
48 kwargs.setdefault('ClusterContainerName', 'HGTD_Clusters')
49
50 if 'ClusteringTool' not in kwargs:
51 from HGTD_Config.HGTD_ConfigFlags import ClusteringStrategy
52 if flags.HGTD.Acts.ClusteringStrategy is ClusteringStrategy.SinglePad:
53 kwargs.setdefault('ClusteringTool', acc.popToolsAndMerge(ActsHgtdClusteringToolCfg(flags)))
54 else:
55 kwargs.setdefault('ClusteringTool', acc.popToolsAndMerge(ActsHgtdTimedClusteringToolCfg(flags)))
56
57 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
58 from ActsConfig.ActsMonitoringConfig import ActsHgtdClusterizationMonitoringToolCfg
59 kwargs.setdefault('MonTool', acc.popToolsAndMerge(ActsHgtdClusterizationMonitoringToolCfg(flags)))
60
61 if flags.HGTD.useALTIROC_RDO:
62 kwargs.setdefault("useALTIROC_RDO", True)
63 else:
64 kwargs.setdefault("useALTIROC_RDO", False)
65
66 acc.addEventAlgo(CompFactory.ActsTrk.HgtdClusterizationAlg(name, **kwargs))
67 return acc
68
69
70
72 name: str = "ActsPixelClusteringTool",
73 **kwargs) -> ComponentAccumulator:
74 acc = ComponentAccumulator()
75
76 if flags.Acts.Clusters.RetrieveChargeInformation:
77 from PixelConditionsAlgorithms.ITkPixelConditionsConfig import ITkPixelChargeCalibCondAlgCfg, ITkPixelOfflineCalibCondAlgCfg
78 acc.merge(ITkPixelChargeCalibCondAlgCfg(flags))
79 acc.merge(ITkPixelOfflineCalibCondAlgCfg(flags))
80 kwargs.setdefault('PixelChargeCalibCondData', 'ITkPixelChargeCalibCondData')
81
82 if "PixelLorentzAngleTool" not in kwargs:
83 from SiLorentzAngleTool.ITkPixelLorentzAngleConfig import ITkPixelLorentzAngleToolCfg
84 kwargs.setdefault("PixelLorentzAngleTool", acc.popToolsAndMerge( ITkPixelLorentzAngleToolCfg(flags) ))
85
86 kwargs.setdefault('UseWeightedPosition', flags.Acts.Clusters.UseWeightedPosition)
87
88 #Always use broad errors if cosmics
89 kwargs.setdefault('UseBroadErrors', flags.Acts.Clusters.UsePixelBroadErrors or flags.Beam.Type is BeamType.Cosmics)
90
91 if flags.Acts.EDM.PhaseII :
92 acc.setPrivateTools(CompFactory.ActsTrk.PhaseIIPixelClusteringTool(name, **kwargs))
93 else :
94 acc.setPrivateTools(CompFactory.ActsTrk.PixelClusteringTool(name, **kwargs))
95 return acc
96
97
99 name: str = "ActsPLRClusteringTool",
100 **kwargs) -> ComponentAccumulator:
101 acc = ComponentAccumulator()
102
103 if flags.Acts.Clusters.RetrieveChargeInformation:
104 from PixelConditionsAlgorithms.PLR_ConditionsConfig import PLR_ChargeCalibCondAlgCfg
105 acc.merge(PLR_ChargeCalibCondAlgCfg(flags))
106 kwargs.setdefault("PixelChargeCalibCondData", "PLR_ChargeCalibCondData")
107
108 if "PixelLorentzAngleTool" not in kwargs:
109 from SiLorentzAngleTool.PLR_LorentzAngleConfig import PLR_LorentzAngleToolCfg
110 kwargs.setdefault("PixelLorentzAngleTool",
111 acc.popToolsAndMerge(PLR_LorentzAngleToolCfg(flags)))
112
113 kwargs.setdefault("IDHelperName", "PLR_ID")
114 kwargs.setdefault("UseWeightedPosition", flags.Acts.Clusters.UseWeightedPosition)
115
116 # Always use broad errors if cosmics
117 kwargs.setdefault("UseBroadErrors",
118 flags.Acts.Clusters.UsePixelBroadErrors or flags.Beam.Type is BeamType.Cosmics)
119
120 if flags.Acts.EDM.PhaseII :
121 acc.setPrivateTools(CompFactory.ActsTrk.PhaseIIPixelClusteringTool(name, **kwargs))
122 else :
123 acc.setPrivateTools(CompFactory.ActsTrk.PixelClusteringTool(name, **kwargs))
124 return acc
125
126
128 name: str = "ActsStripClusteringTool",
129 **kwargs) -> ComponentAccumulator:
130 acc = ComponentAccumulator()
131
132 if 'LorentzAngleTool' not in kwargs:
133 from SiLorentzAngleTool.ITkStripLorentzAngleConfig import ITkStripLorentzAngleToolCfg
134 kwargs.setdefault("LorentzAngleTool", acc.popToolsAndMerge(ITkStripLorentzAngleToolCfg(flags)))
135
136 if "StripDetElStatus" not in kwargs :
137 from SCT_ConditionsAlgorithms.ITkStripConditionsAlgorithmsConfig import (
138 ITkStripDetectorElementStatusAlgCfg)
139 acc.merge(ITkStripDetectorElementStatusAlgCfg(flags))
140 kwargs.setdefault("StripDetElStatus", "ITkStripDetectorElementStatus")
141
142 # Disable noisy modules suppression
143 kwargs.setdefault("maxFiredStrips", 0)
144
145 if flags.ITk.selectStripIntimeHits and 'timeBins' not in kwargs:
146 coll_25ns = flags.Beam.BunchSpacing<=25 and flags.Beam.Type is BeamType.Collisions
147 kwargs.setdefault("timeBins", "01X" if coll_25ns else "X1X")
148
149
150 #Error strategy
151 kwargs.setdefault("errorStrategy",flags.Acts.Clusters.StripClusteringErrorMode.value)
152
153 acc.setPrivateTools(CompFactory.ActsTrk.StripClusteringTool(name, **kwargs))
154 return acc
155
157 name: str = 'ActsPixelClusterizationAlg',
158 *,
159 useCache: bool = False,
160 **kwargs) -> ComponentAccumulator:
161 acc = ComponentAccumulator()
162
163 kwargs.setdefault("IDHelper", "PixelID")
164 if flags.Acts.EDM.PhaseII and flags.Input.Format is not Format.BS:
165 # convert persistent to PhaseIIPixelRawDataContainer instead
166 acc.merge(PhaseIIPixelRawDataContainerCfg(flags, RDOKey="ITkPixelRDOs"))
167 kwargs.setdefault("RDOContainerKey", "ITkPixelRDOs")
168 kwargs.setdefault("ClustersKey", "ITkPixelClusters")
169 kwargs.setdefault("DetEleCollKey", "ITkPixelDetectorElementCollection")
170 # Regional selection
171 kwargs.setdefault('RoIs', 'ActsRegionOfInterest')
172
173 kwargs.setdefault('ClusterCacheBackend', 'ActsPixelClusterCache_Back')
174 kwargs.setdefault('ClusterCache', 'ActsPixelClustersCache')
175
176 if 'RegSelTool' not in kwargs:
177 from RegionSelector.RegSelToolConfig import regSelTool_ITkPixel_Cfg
178 kwargs.setdefault('RegSelTool', acc.popToolsAndMerge(regSelTool_ITkPixel_Cfg(flags)))
179
180 if 'ClusteringTool' not in kwargs:
181 kwargs.setdefault("ClusteringTool", acc.popToolsAndMerge(ActsPixelClusteringToolCfg(flags)))
182
183 if 'DetElStatus' not in kwargs:
184 from PixelConditionsAlgorithms.ITkPixelConditionsConfig import ITkPixelDetectorElementStatusAlgCfg
185 acc.merge(ITkPixelDetectorElementStatusAlgCfg(flags))
186 kwargs.setdefault('DetElStatus', 'ITkPixelDetectorElementStatus')
187
188 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
189 from ActsConfig.ActsMonitoringConfig import ActsITkPixelClusterizationMonitoringToolCfg
190 kwargs.setdefault('MonTool', acc.popToolsAndMerge(ActsITkPixelClusterizationMonitoringToolCfg(flags)))
191
192 if flags.Acts.EDM.PhaseII :
193 if not useCache:
194 acc.addEventAlgo(CompFactory.ActsTrk.PhaseIIPixelClusterizationAlg(name, **kwargs))
195 else:
196 acc.addEventAlgo(CompFactory.ActsTrk.PhaseIIPixelCacheClusterizationAlg(name, **kwargs))
197 else :
198 if not useCache:
199 acc.addEventAlgo(CompFactory.ActsTrk.PixelClusterizationAlg(name, **kwargs))
200 else:
201 acc.addEventAlgo(CompFactory.ActsTrk.PixelCacheClusterizationAlg(name, **kwargs))
202 return acc
203
204
206 name: str = "ActsPLRClusterizationAlg",
207 *,
208 useCache: bool = False,
209 **kwargs) -> ComponentAccumulator:
210 acc = ComponentAccumulator()
211
212 kwargs.setdefault("IDHelper", "PLR_ID")
213 if flags.Acts.EDM.PhaseII and flags.Input.Format is not Format.BS:
214 # convert persistent to PhaseIIPixelRawDataContainer instead
215 acc.merge(PhaseIIPixelRawDataContainerCfg(flags,RDOKey="PLR_RDOs"))
216 kwargs.setdefault("RDOContainerKey", "PLR_RDOs")
217 kwargs.setdefault("ClustersKey", "PLR_Clusters")
218 kwargs.setdefault("DetEleCollKey", "PLR_DetectorElementCollection")
219 kwargs.setdefault("RoIs", "ActsRegionOfInterest")
220
221 kwargs.setdefault("ClusterCacheBackend", "ActsPLRClusterCache_Back")
222 kwargs.setdefault("ClusterCache", "ActsPLRClustersCache")
223
224 if "RegSelTool" not in kwargs:
225 from RegionSelector.RegSelToolConfig import regSelTool_PLR_Cfg
226 kwargs.setdefault("RegSelTool", acc.popToolsAndMerge(regSelTool_PLR_Cfg(flags)))
227
228 if "ClusteringTool" not in kwargs:
229 kwargs.setdefault("ClusteringTool", acc.popToolsAndMerge(ActsPLRClusteringToolCfg(flags)))
230
231 if "DetElStatus" not in kwargs:
232 from PixelConditionsAlgorithms.PLR_ConditionsConfig import PLR_DetectorElementStatusAlgCfg
233 acc.merge(PLR_DetectorElementStatusAlgCfg(flags))
234 kwargs.setdefault("DetElStatus", "PLR_DetectorElementStatus")
235
236 if flags.Acts.doMonitoring and "MonTool" not in kwargs:
237 from ActsConfig.ActsMonitoringConfig import ActsITkPixelClusterizationMonitoringToolCfg
238 kwargs.setdefault("MonTool", acc.popToolsAndMerge(
239 ActsITkPixelClusterizationMonitoringToolCfg(
240 flags,
241 name="ActsPLRClusterizationMonitoringTool")))
242
243 # @TODO just call ActsPixelClusterizationAlgCfg ?
244 if flags.Acts.EDM.PhaseII :
245 if not useCache:
246 acc.addEventAlgo(CompFactory.ActsTrk.PhaseIIPixelClusterizationAlg(name, **kwargs))
247 else:
248 acc.addEventAlgo(CompFactory.ActsTrk.PhaseIIPixelCacheClusterizationAlg(name, **kwargs))
249 else :
250 if not useCache:
251 acc.addEventAlgo(CompFactory.ActsTrk.PixelClusterizationAlg(name, **kwargs))
252 else:
253 acc.addEventAlgo(CompFactory.ActsTrk.PixelCacheClusterizationAlg(name, **kwargs))
254 return acc
255
257 name: str = 'ActsStripClusterizationAlg',
258 useCache: bool = False,
259 **kwargs) -> ComponentAccumulator:
260 acc = ComponentAccumulator()
261
262 kwargs.setdefault("RDOContainerKey", "ITkStripRDOs")
263 kwargs.setdefault("ClustersKey", "ITkStripClusters")
264 kwargs.setdefault("IDHelper", "SCT_ID")
265 kwargs.setdefault("DetEleCollKey", "ITkStripDetectorElementCollection")
266 # Regional selection
267 kwargs.setdefault('RoIs', 'ActsRegionOfInterest')
268
269 kwargs.setdefault('ClusterCacheBackend', 'ActsStripClusterCache_Back')
270 kwargs.setdefault('ClusterCache', 'ActsStripClustersCache')
271
272 if 'RegSelTool' not in kwargs:
273 from RegionSelector.RegSelToolConfig import regSelTool_ITkStrip_Cfg
274 kwargs.setdefault('RegSelTool', acc.popToolsAndMerge(regSelTool_ITkStrip_Cfg(flags)))
275
276 if 'DetElStatus' not in kwargs :
277 from SCT_ConditionsAlgorithms.ITkStripConditionsAlgorithmsConfig import ITkStripDetectorElementStatusAlgCfg
278 acc.merge(ITkStripDetectorElementStatusAlgCfg(flags))
279 kwargs.setdefault("DetElStatus", "ITkStripDetectorElementStatus")
280
281 if 'ClusteringTool' not in kwargs:
282 kwargs.setdefault("ClusteringTool", acc.popToolsAndMerge(ActsStripClusteringToolCfg(flags)))
283
284 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
285 from ActsConfig.ActsMonitoringConfig import ActsITkStripClusterizationMonitoringToolCfg
286 kwargs.setdefault('MonTool', acc.popToolsAndMerge(ActsITkStripClusterizationMonitoringToolCfg(flags)))
287
288 if not useCache:
289 acc.addEventAlgo(CompFactory.ActsTrk.StripClusterizationAlg(name, **kwargs))
290 else:
291 acc.addEventAlgo(CompFactory.ActsTrk.StripCacheClusterizationAlg(name, **kwargs))
292 return acc
293
295 name: str = "ActsClusterCacheCreatorAlg",
296 **kwargs) -> ComponentAccumulator:
297 acc = ComponentAccumulator()
298 kwargs.setdefault("PixelClustersCacheKey", "ActsPixelClusterCache_Back")
299 kwargs.setdefault("StripClustersCacheKey", "ActsStripClusterCache_Back")
300 acc.addEventAlgo(CompFactory.ActsTrk.Cache.CreatorAlg(name, **kwargs))
301 return acc
302
304 name: str = "ActsPixelClusterPreparationAlg",
305 useCache: bool = False,
306 **kwargs) -> ComponentAccumulator:
307 acc = ComponentAccumulator()
308
309 kwargs.setdefault('InputCollection', 'ITkPixelClusters')
310 kwargs.setdefault('DetectorElements', 'ITkPixelDetectorElementCollection')
311
312 if 'RegSelTool' not in kwargs:
313 from RegionSelector.RegSelToolConfig import regSelTool_ITkPixel_Cfg
314 kwargs.setdefault('RegSelTool', acc.popToolsAndMerge(regSelTool_ITkPixel_Cfg(flags)))
315
316 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
317 from ActsConfig.ActsMonitoringConfig import ActsDataPreparationMonitoringToolCfg
318 kwargs.setdefault('MonTool', acc.popToolsAndMerge(ActsDataPreparationMonitoringToolCfg(flags,
319 name = "ActsPixelClusterPreparationMonitoringTool")))
320
321 if not useCache:
322 acc.addEventAlgo(CompFactory.ActsTrk.PixelClusterDataPreparationAlg(name, **kwargs))
323 else:
324 acc.addEventAlgo(CompFactory.ActsTrk.PixelClusterCacheDataPreparationAlg(name, **kwargs))
325 return acc
326
328 name: str = "ActsStripClusterPreparationAlg",
329 useCache: bool = False,
330 **kwargs) -> ComponentAccumulator:
331 acc = ComponentAccumulator()
332
333 kwargs.setdefault('InputCollection', 'ITkStripClusters')
334 kwargs.setdefault('DetectorElements', 'ITkStripDetectorElementCollection')
335
336 if 'RegSelTool' not in kwargs:
337 from RegionSelector.RegSelToolConfig import regSelTool_ITkStrip_Cfg
338 kwargs.setdefault('RegSelTool', acc.popToolsAndMerge(regSelTool_ITkStrip_Cfg(flags)))
339
340 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
341 from ActsConfig.ActsMonitoringConfig import ActsDataPreparationMonitoringToolCfg
342 kwargs.setdefault('MonTool', acc.popToolsAndMerge(ActsDataPreparationMonitoringToolCfg(flags,
343 name = "ActsStripClusterPreparationMonitoringTool")))
344
345 if not useCache:
346 acc.addEventAlgo(CompFactory.ActsTrk.StripClusterDataPreparationAlg(name, **kwargs))
347 else:
348 acc.addEventAlgo(CompFactory.ActsTrk.StripClusterCacheDataPreparationAlg(name, **kwargs))
349 return acc
350
352 name: str = 'ActsHgtdClusterPreparationAlg',
353 *,
354 useCache: bool = False,
355 **kwargs) -> ComponentAccumulator:
356 acc = ComponentAccumulator()
357 kwargs.setdefault('InputCollection', 'HGTDClusters')
358 kwargs.setdefault('DetectorElements', 'HGTD_DetectorElementCollection')
359
360 # For the time being the HGTD Regional Selector tool does not exist
361
362 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
363 from ActsConfig.ActsMonitoringConfig import ActsDataPreparationMonitoringToolCfg
364 kwargs.setdefault('MonTool', acc.popToolsAndMerge(ActsDataPreparationMonitoringToolCfg(flags,
365 name = "ActsHgtdClusterPreparationMonitoringTool")))
366
367 acc.addEventAlgo(CompFactory.ActsTrk.HgtdClusterDataPreparationAlg(name, **kwargs))
368 return acc
369
370
372 *,
373 RoIs: str = "ActsRegionOfInterest",
374 **kwargs: dict) -> ComponentAccumulator:
375 assert isinstance(RoIs, str)
376 assert isinstance(kwargs, dict)
377
378 acc = ComponentAccumulator()
379
380 # Clusterization is a three step process at maximum:
381 # (1) Cache Creation
382 # (2) Clusterization algorithm (reconstruction of clusters)
383 # (3) Preparation of collection for downstream algorithms
384 # What step is scheduled depends on the tracking pass and the activation
385 # or de-activation of caching mechanism
386
387 kwargs.setdefault('processPixels', flags.Detector.EnableITkPixel)
388 kwargs.setdefault('processStrips', flags.Detector.EnableITkStrip)
389 kwargs.setdefault('processHGTD', flags.Acts.useHGTDClusterInTrackFinding and flags.Detector.EnableHGTD)
390 kwargs.setdefault('runCacheCreation', flags.Acts.useCache)
391 kwargs.setdefault('runReconstruction', True)
392 kwargs.setdefault('runPreparation', flags.Acts.useCache)
393
394 # Step (1)
395 if kwargs['runCacheCreation']:
396 acc.merge(ActsClusterCacheCreatorAlgCfg(flags,
397 **extractChildKwargs(prefix='ClusterCacheCreatorAlg.', **kwargs)))
398
399 # Step (2)
400 if kwargs['runReconstruction']:
401 if kwargs['processPixels']:
402 if flags.Input.Format is Format.BS:
403 if flags.Acts.EDM.PhaseII :
404 from ITkPixelByteStreamCnv.ITkPixelByteStreamCnvConfig import ITkPixelDecodingPhaseIIRDOAlgCfg
405 # @TODO nRDO estimation needs to be refined.
406 acc.merge( ITkPixelDecodingPhaseIIRDOAlgCfg(flags, nRDOs = 1200000, pixelRDOKey='ITkPixelRDOs') )
407 else :
408 from ITkPixelByteStreamCnv.ITkPixelByteStreamCnvConfig import ITkPixelDecodingAlgCfg
409 # @TODO handle RoIs
410 acc.merge( ITkPixelDecodingAlgCfg(flags) )
411
412 acc.merge(ActsPixelClusterizationAlgCfg(flags,
413 RoIs=RoIs,
414 **extractChildKwargs(prefix='PixelClusterizationAlg.', **kwargs)))
415 if kwargs['processStrips']:
416 if flags.Input.Format is Format.BS:
417 from ITkStripsByteStreamCnv.ITkStripByteStreamCnvConfig import ITkStripRawDataProviderCfg
418 # @TODO handle RoIs, need to toggle flag isRoI_Seeded, when ?
419 acc.merge(ITkStripRawDataProviderCfg(flags,
420 RoIs=RoIs))
421
422 acc.merge(ActsStripClusterizationAlgCfg(flags,
423 RoIs=RoIs,
424 **extractChildKwargs(prefix='StripClusterizationAlg.', **kwargs)))
425 if kwargs['processHGTD']:
426 acc.merge(ActsHgtdClusterizationAlgCfg(flags,
427 **extractChildKwargs(prefix='HgtdClusterizationAlg.', **kwargs)))
428 # Step (3)
429 if kwargs['runPreparation']:
430 if kwargs['processPixels']:
431 acc.merge(ActsPixelClusterPreparationAlgCfg(flags,
432 RoIs=RoIs,
433 **extractChildKwargs(prefix='PixelClusterPreparationAlg.', **kwargs)))
434
435 if kwargs['processStrips']:
436 acc.merge(ActsStripClusterPreparationAlgCfg(flags,
437 RoIs=RoIs,
438 **extractChildKwargs(prefix='StripClusterPreparationAlg.', **kwargs)))
439
440 if kwargs['processHGTD']:
441 acc.merge(ActsHgtdClusterPreparationAlgCfg(flags,
442 RoIs=RoIs,
443 **extractChildKwargs(prefix='HgtdClusterPreparationAlg.', **kwargs)))
444
445 # Analysis extensions
446 if flags.Acts.Clusters.doAnalysis:
447 if kwargs['processPixels']:
448 from ActsConfig.ActsAnalysisConfig import ActsPixelClusterAnalysisAlgCfg
449 acc.merge(ActsPixelClusterAnalysisAlgCfg(flags, **extractChildKwargs(prefix='PixelClusterAnalysisAlg.', **kwargs)))
450
451 if kwargs['processStrips']:
452 from ActsConfig.ActsAnalysisConfig import ActsStripClusterAnalysisAlgCfg
453 acc.merge(ActsStripClusterAnalysisAlgCfg(flags, **extractChildKwargs(prefix='StripClusterAnalysisAlg.', **kwargs)))
454
455 return acc
456
458 *,
459 previousActsExtension: str = None) -> ComponentAccumulator:
460 assert previousActsExtension is None or isinstance(previousActsExtension, str)
461
462 acc = ComponentAccumulator()
463
464 processPixels = flags.Detector.EnableITkPixel
465 processStrips = flags.Detector.EnableITkStrip
466 processHGTD = flags.Acts.useHGTDClusterInTrackFinding and flags.Detector.EnableHGTD
467
468 kwargs = dict()
469 kwargs.setdefault('processPixels', processPixels)
470 kwargs.setdefault('processStrips', processStrips)
471 kwargs.setdefault('processHGTD', processHGTD)
472
473 # Clusterization is a three step process at maximum:
474 # (1) Cache Creation
475 # (2) Clusterization algorithm (reconstruction of clusters)
476 # (3) Preparation of collection for downstream algorithms
477 # What step is scheduled depends on the tracking pass and the activation
478 # or de-activation of caching mechanism.
479
480 # Secondary passes do not need cache creation, that has to be performed
481 # on the primary pass, and only if the caching is enabled.
482 # Reconstruction can run on secondary passes only if the caching is enabled,
483 # this is because we may need to process detector elements not processed
484 # on the primary pass.
485 # Preparation has to be performed on secondary passes always, and on primary
486 # pass only if cache is enabled. In the latter case it is useed to collect all
487 # the clusters from all views before passing them to the downstream algorithms
488
489 from InDetConfig.ITkActsHelpers import isPrimaryPass, isValidationPass
490 if isPrimaryPass(flags) or isValidationPass(flags):
491 # Primary pass
492 # Validation passes count as primary passes
493 kwargs.setdefault('runCacheCreation', flags.Acts.useCache)
494 kwargs.setdefault('runReconstruction', True)
495 kwargs.setdefault('runPreparation', flags.Acts.useCache)
496 else:
497 # Secondary passes
498 kwargs.setdefault('runCacheCreation', False)
499 kwargs.setdefault('runReconstruction', flags.Acts.useCache)
500 kwargs.setdefault('runPreparation', True)
501
502 # Name of the RoI to be used
503 roisName = f'{flags.Tracking.ActiveConfig.extension}RegionOfInterest'
504 # Large Radius Tracking uses full scan RoI created in the primary pass
505 if flags.Tracking.ActiveConfig.isLargeD0 and flags.Tracking.ActiveConfig.isSecondaryPass:
506 from InDetConfig.ITkActsHelpers import primaryPassExtension
507 roisName = f'{primaryPassExtension(flags)}RegionOfInterest'
508
509 # Name of the Cluster container -> ITk + extension without "Acts" + Pixel or Strip + Clusters
510 # We also define the same collection from the main ACTS pass (primary)
511 primaryPixelClustersName = 'ITkPixelClusters'
512 primaryStripClustersName = 'ITkStripClusters'
513 primaryHgtdClustersName = 'HGTD_Clusters'
514 pixelClustersName = primaryPixelClustersName
515 stripClustersName = primaryStripClustersName
516 hgtdClustersName = primaryHgtdClustersName
517
518 # If the workflow is not a primary pass, then change the name of the cluster collections adding that information
519 if flags.Tracking.ActiveConfig.isSecondaryPass:
520 keyPrefix = flags.Tracking.ActiveConfig.extension.replace("Acts", "")
521 pixelClustersName = f'ITk{keyPrefix}PixelClusters'
522 stripClustersName = f'ITk{keyPrefix}StripClusters'
523 hgtdClustersName = f'{keyPrefix}HGTD_Clusters'
524
525 # Configuration for (1)
526 if kwargs['runCacheCreation']:
527 kwargs.setdefault('ClusterCacheCreatorAlg.name', f'{flags.Tracking.ActiveConfig.extension}ClusterCacheCreatorAlg')
528
529 # Configuration for (2)
530 if kwargs['runReconstruction']:
531 if kwargs['processPixels']:
532 kwargs.setdefault('PixelClusterizationAlg.name', f'{flags.Tracking.ActiveConfig.extension}PixelClusterizationAlg')
533 kwargs.setdefault('PixelClusterizationAlg.useCache', flags.Acts.useCache)
534 kwargs.setdefault('PixelClusterizationAlg.ClustersKey', pixelClustersName)
535 kwargs.setdefault('PixelClusterizationAlg.ClusterCache', f'{flags.Tracking.ActiveConfig.extension}PixelClustersCache')
536 if flags.Tracking.ActiveConfig.isSecondaryPass and previousActsExtension is not None:
537 kwargs.setdefault('PixelClusterizationAlg.ExtraInputs', {('ActsTrk::PrepRawDataAssociation', f'StoreGateSvc+{previousActsExtension}PrdMap')})
538
539 if kwargs['processStrips']:
540 kwargs.setdefault('StripClusterizationAlg.name', f'{flags.Tracking.ActiveConfig.extension}StripClusterizationAlg')
541 kwargs.setdefault('StripClusterizationAlg.useCache', flags.Acts.useCache)
542 kwargs.setdefault('StripClusterizationAlg.ClustersKey', stripClustersName)
543 kwargs.setdefault('StripClusterizationAlg.ClusterCache', f'{flags.Tracking.ActiveConfig.extension}StripClustersCache')
544 if flags.Tracking.ActiveConfig.isSecondaryPass and previousActsExtension is not None:
545 kwargs.setdefault('StripClusterizationAlg.ExtraInputs', {('ActsTrk::PrepRawDataAssociation', f'StoreGateSvc+{previousActsExtension}PrdMap')})
546
547 if kwargs['processHGTD']:
548 kwargs.setdefault('HgtdClusterizationAlg.name', f'{flags.Tracking.ActiveConfig.extension}HgtdClusterizationAlg')
549 # HGTD algo has different convention ... need to use the same
550 kwargs.setdefault('HgtdClusterizationAlg.ClusterContainerName', hgtdClustersName)
551 if flags.Tracking.ActiveConfig.isSecondaryPass and previousActsExtension is not None:
552 kwargs.setdefault('HgtdClusterizationAlg.ExtraInputs', {('ActsTrk::PrepRawDataAssociation', f'StoreGateSvc+{previousActsExtension}PrdMap')})
553
554
555 # Configuration for (3)
556 if kwargs['runPreparation']:
557 if kwargs['processPixels']:
558 kwargs.setdefault('PixelClusterPreparationAlg.name', f'{flags.Tracking.ActiveConfig.extension}PixelClusterPreparationAlg')
559 kwargs.setdefault('PixelClusterPreparationAlg.useCache', flags.Acts.useCache)
560 kwargs.setdefault('PixelClusterPreparationAlg.OutputCollection', f'{pixelClustersName}_Cached' if kwargs['runReconstruction'] else pixelClustersName)
561 # The input is one between the collection (w/o cache) and the IDC (w/ cache)
562 if not flags.Acts.useCache:
563 # Take the collection from the reconstruction step. If not available take the collection from the primary pass
564 kwargs.setdefault('PixelClusterPreparationAlg.InputCollection', pixelClustersName if kwargs['runReconstruction'] else primaryPixelClustersName)
565 kwargs.setdefault('PixelClusterPreparationAlg.InputIDC', '')
566 else:
567 kwargs.setdefault('PixelClusterPreparationAlg.InputCollection', '')
568 kwargs.setdefault('PixelClusterPreparationAlg.InputIDC', f'{flags.Tracking.ActiveConfig.extension}PixelClustersCache')
569 # Prd Map for removing previously used measurements
570 if flags.Tracking.ActiveConfig.isSecondaryPass and previousActsExtension is not None:
571 kwargs.setdefault('PixelClusterPreparationAlg.InputPrdMap', f'{previousActsExtension}PrdMap')
572
573 if kwargs['processStrips']:
574 kwargs.setdefault('StripClusterPreparationAlg.name', f'{flags.Tracking.ActiveConfig.extension}StripClusterPreparationAlg')
575 kwargs.setdefault('StripClusterPreparationAlg.useCache', flags.Acts.useCache)
576 kwargs.setdefault('StripClusterPreparationAlg.OutputCollection', f'{stripClustersName}_Cached' if kwargs['runReconstruction'] else stripClustersName)
577 if not flags.Acts.useCache:
578 kwargs.setdefault('StripClusterPreparationAlg.InputCollection', stripClustersName if kwargs['runReconstruction'] else primaryStripClustersName)
579 kwargs.setdefault('StripClusterPreparationAlg.InputIDC', '')
580 else:
581 kwargs.setdefault('StripClusterPreparationAlg.InputCollection', '')
582 kwargs.setdefault('StripClusterPreparationAlg.InputIDC', f'{flags.Tracking.ActiveConfig.extension}StripClustersCache')
583 # Prd Map for removing previously used measurements
584 if flags.Tracking.ActiveConfig.isSecondaryPass and previousActsExtension is not None:
585 kwargs.setdefault('StripClusterPreparationAlg.InputPrdMap', f'{previousActsExtension}PrdMap')
586
587 if kwargs['processHGTD']:
588 kwargs.setdefault('HgtdClusterPreparationAlg.name', f'{flags.Tracking.ActiveConfig.extension}HgtdClusterPreparationAlg')
589 kwargs.setdefault('HgtdClusterPreparationAlg.OutputCollection', f'{hgtdClustersName}_Cached' if kwargs['runReconstruction'] else hgtdClustersName)
590 kwargs.setdefault('HgtdClusterPreparationAlg.InputCollection', hgtdClustersName if kwargs['runReconstruction'] else primaryHgtdClustersName)
591 kwargs.setdefault('HgtdClusterPreparationAlg.InputIDC', '')
592 if flags.Tracking.ActiveConfig.isSecondaryPass and previousActsExtension is not None:
593 kwargs.setdefault('HgtdClusterPreparationAlg.InputPrdMap', f'{previousActsExtension}PrdMap')
594
595 # Analysis algo(s)
596 if flags.Acts.Clusters.doAnalysis:
597 # Run analysis code on the resulting cluster collection produced by this tracking pass
598 # This collection is the result of (3) if it ran, else the result of (2). We are sure at least one of them run
599 if kwargs['processPixels']:
600 kwargs.setdefault('PixelClusterAnalysisAlg.name', f'{flags.Tracking.ActiveConfig.extension}PixelClusterAnalysisAlg')
601 kwargs.setdefault('PixelClusterAnalysisAlg.extension', flags.Tracking.ActiveConfig.extension)
602 kwargs.setdefault('PixelClusterAnalysisAlg.MonGroupName', f'{flags.Tracking.ActiveConfig.extension}ClusterAnalysisAlg')
603 kwargs.setdefault('PixelClusterAnalysisAlg.ClusterContainerKey', kwargs['PixelClusterPreparationAlg.OutputCollection'] if kwargs['runPreparation'] else kwargs['PixelClusterizationAlg.ClustersKey'])
604
605 if kwargs['processStrips']:
606 kwargs.setdefault('StripClusterAnalysisAlg.name', f'{flags.Tracking.ActiveConfig.extension}StripClusterAnalysisAlg')
607 kwargs.setdefault('StripClusterAnalysisAlg.extension', flags.Tracking.ActiveConfig.extension)
608 kwargs.setdefault('StripClusterAnalysisAlg.MonGroupName', f'{flags.Tracking.ActiveConfig.extension}ClusterAnalysisAlg')
609 kwargs.setdefault('StripClusterAnalysisAlg.ClusterContainerKey', kwargs['StripClusterPreparationAlg.OutputCollection'] if kwargs['runPreparation'] else kwargs['StripClusterizationAlg.ClustersKey'])
610
611 if kwargs['processHGTD']:
612 kwargs.setdefault('HgtdClusterAnalysisAlg.name', f'{flags.Tracking.ActiveConfig.extension}HgtdClusterAnalysisAlg')
613 kwargs.setdefault('HgtdClusterAnalysisAlg.extension', flags.Tracking.ActiveConfig.extension)
614 kwargs.setdefault('HgtdClusterAnalysisAlg.MonGroupName', f'{flags.Tracking.ActiveConfig.extension}ClusterAnalysisAlg')
615
616 acc.merge(ActsMainClusterizationCfg(flags, RoIs=roisName, **kwargs))
617
618 # Persistification
619 if flags.Acts.EDM.PersistifyClusters and kwargs['runReconstruction']:
620 from ActsConfig.ActsPersistificationConfig import PersistifyClusters
621 pixelClusterCollections = None if not kwargs['processPixels'] else [kwargs['PixelClusterizationAlg.ClustersKey']]
622 stripClusterCollections = None if not kwargs['processStrips'] else [kwargs['StripClusterizationAlg.ClustersKey']]
623 hgtdClusterCollections = None if not kwargs['processHGTD'] else [kwargs['HgtdClusterizationAlg.ClusterContainerName']]
624 acc.merge(PersistifyClusters(flags,
625 pixelClusterCollections=pixelClusterCollections,
626 stripClusterCollections=stripClusterCollections,
627 hgtdClusterCollections=hgtdClusterCollections))
628 return acc
ComponentAccumulator ActsPixelClusterizationAlgCfg(flags, str name='ActsPixelClusterizationAlg', *, bool useCache=False, **kwargs)
ComponentAccumulator ActsStripClusterizationAlgCfg(flags, str name='ActsStripClusterizationAlg', bool useCache=False, **kwargs)
ComponentAccumulator ActsPixelClusteringToolCfg(flags, str name="ActsPixelClusteringTool", **kwargs)
ComponentAccumulator ActsPLRClusteringToolCfg(flags, str name="ActsPLRClusteringTool", **kwargs)
ComponentAccumulator ActsClusterizationCfg(flags, *, str previousActsExtension=None)
ComponentAccumulator ActsClusterCacheCreatorAlgCfg(flags, str name="ActsClusterCacheCreatorAlg", **kwargs)
ComponentAccumulator ActsPLRClusterizationAlgCfg(flags, str name="ActsPLRClusterizationAlg", *, bool useCache=False, **kwargs)
ComponentAccumulator ActsHgtdClusterPreparationAlgCfg(flags, str name='ActsHgtdClusterPreparationAlg', *, bool useCache=False, **kwargs)
ComponentAccumulator ActsMainClusterizationCfg(flags, *, str RoIs="ActsRegionOfInterest", **dict kwargs)
ComponentAccumulator ActsHgtdClusteringToolCfg(flags, str name="ActsHgtdClusteringTool", **kwargs)
ComponentAccumulator ActsStripClusteringToolCfg(flags, str name="ActsStripClusteringTool", **kwargs)
ComponentAccumulator ActsStripClusterPreparationAlgCfg(flags, str name="ActsStripClusterPreparationAlg", bool useCache=False, **kwargs)
ComponentAccumulator ActsHgtdTimedClusteringToolCfg(flags, str name="ActsHgtdTimedClusteringTool", **kwargs)
ComponentAccumulator ActsHgtdClusterizationAlgCfg(flags, str name="ActsHgtdClusterizationAlg", **kwargs)
ComponentAccumulator ActsPixelClusterPreparationAlgCfg(flags, str name="ActsPixelClusterPreparationAlg", bool useCache=False, **kwargs)