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