ATLAS Offline Software
Loading...
Searching...
No Matches
ActsTrackFindingConfig.py
Go to the documentation of this file.
2# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3
4from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
5from AthenaConfiguration.ComponentFactory import CompFactory
6from ActsConfig.ActsConfigFlags import SeedingStrategy
7import AthenaCommon.SystemOfUnits as Units
8from ActsInterop import UnitConstants
9
10
11# Tools
12
13def isdet(flags,
14 *,
15 pixel: list = None,
16 strip: list = None,
17 hgtd: list = None,
18 noStrip: bool = False) -> list:
19 keys = []
20 if flags.Detector.EnableITkPixel and pixel is not None:
21 keys += pixel
22 if flags.Detector.EnableITkStrip and strip is not None and not noStrip:
23 keys += strip
24 if flags.Acts.useHGTDClusterInTrackFinding and hgtd is not None:
25 keys += hgtd
26 return keys
27
28def seedOrder(flags,
29 *,
30 pixel: list = None,
31 strip: list = None) -> list:
32 keys = isdet(flags, pixel=pixel, strip=strip)
33 if flags.Acts.useStripSeedsFirst:
34 keys.reverse()
35 return keys
36
38 name: str = "ActsTrackStatePrinterTool",
39 **kwargs) -> ComponentAccumulator:
40 acc = ComponentAccumulator()
41
42 from InDetConfig.ITkActsHelpers import isFastPrimaryPass
43 kwargs.setdefault("InputSpacePoints", isdet(flags, noStrip=isFastPrimaryPass(flags),
44 pixel=['ITkPixelSpacePoints_Cached'] if flags.Acts.useCache else ['ITkPixelSpacePoints'],
45 strip=['ITkStripSpacePoints_Cached', 'ITkStripOverlapSpacePoints_Cached'] if flags.Acts.useCache else ['ITkStripSpacePoints', 'ITkStripOverlapSpacePoints']))
46
47 acc.setPrivateTools(CompFactory.ActsTrk.TrackStatePrinterTool(name, **kwargs))
48 return acc
49
50# ACTS only algorithm
51
53 name: str = "ActsTrackFindingAlg",
54 **kwargs) -> ComponentAccumulator:
55 def tolist(c):
56 return c if isinstance(c, list) else [c]
57
58 acc = ComponentAccumulator()
59
60 from ActsAlignmentAlgs.AlignmentAlgsConfig import ActsGeometryContextAlgCfg
61 from ActsConfig.ActsGeometryConfig import ActsTrackingGeometrySvcCfg
62 acc.merge(ActsGeometryContextAlgCfg(flags))
63 acc.merge(ActsTrackingGeometrySvcCfg(flags))
64
65 from ActsConfig.ActsGeometryConfig import ActsVolumeIdToDetectorCollectionMappingAlgCfg
66 # Remove HGTD Volumes from the propagation unless we need it
67 if not flags.Acts.useHGTDClusterInTrackFinding:
68 # HGTD has volume id:
69 # 2 for negative endcap
70 # 25 for positive endcap
71 kwargs.setdefault('EndOfTheWorldVolumeIds', [2, 25])
72
73 acc.merge( ActsVolumeIdToDetectorCollectionMappingAlgCfg(flags) )
74 kwargs.setdefault("ActsVolumeIdToDetectorElementCollectionMapKey", "VolumeIdToDetectorElementCollectionMap")
75
76 if flags.Detector.EnableITkPixel:
77 from PixelConditionsAlgorithms.ITkPixelConditionsConfig import ITkPixelDetectorElementStatusAlgCfg
78 acc.merge(ITkPixelDetectorElementStatusAlgCfg(flags))
79 if flags.Detector.EnableITkStrip:
80 from SCT_ConditionsAlgorithms.ITkStripConditionsAlgorithmsConfig import ITkStripDetectorElementStatusAlgCfg
81 acc.merge(ITkStripDetectorElementStatusAlgCfg(flags))
82 kwargs.setdefault("DetElStatus", seedOrder(flags, pixel=["ITkPixelDetectorElementStatus"], strip=["ITkStripDetectorElementStatus"]))
83
84 # Seed labels and collections.
85 # These 3 lists must match element for element, reversed if flags.Acts.useStripSeedsFirst is True.
86 # Maybe it is best to start with strips where the occupancy is lower.
87 kwargs.setdefault("SeedLabels", seedOrder(flags, pixel=["PPP"], strip=["SSS"]))
88 kwargs.setdefault("SeedContainerKeys", seedOrder(flags, pixel=["ActsPixelSeeds"], strip=["ActsStripSeeds"]))
89 if flags.Acts.Tracks.doAnalysis:
90 kwargs.setdefault("SeedDestiny", [f'{seedkey}Destiny' for seedkey in kwargs["SeedContainerKeys"]])
91
92 kwargs.setdefault("UncalibratedMeasurementContainerKeys", isdet(flags, pixel=["ITkPixelClusters_Cached" if flags.Acts.useCache else "ITkPixelClusters"], strip=["ITkStripClusters_Cached" if flags.Acts.useCache else "ITkStripClusters"], hgtd=["HGTD_Clusters"]))
93
94 kwargs.setdefault('ACTSTracksLocation', 'ActsTracks')
95
96 kwargs.setdefault("maxPropagationStep", 10000)
97 kwargs.setdefault("skipDuplicateSeeds", flags.Acts.skipDuplicateSeeds)
98 kwargs.setdefault("seedMeasOffset", 1)
99
100 # Ambi strategy 0 means do the ambiguity resolution outside the track finding.
101 kwargs.setdefault("ambiStrategy", flags.Acts.AmbiguitySolverMode.value)
102
103 if (not flags.Acts.doAmbiguityResolution) :
104 kwargs.setdefault("MaximumSharedHits", 3)
105 kwargs.setdefault("MaximumIterations", 10000)
106 kwargs.setdefault("NMeasurementsMin", 7)
107
108 kwargs.setdefault("doTwoWay", flags.Acts.doTwoWayCKF)
109 # drop the track states on material-only surfaces: nothing downstream reads them, and the CKF is faster without
110 kwargs.setdefault("recordMaterialStates", False)
111 kwargs.setdefault("autoReverseSearch", flags.Tracking.ActiveConfig.autoReverseSearch)
112 # forceTrackOnSeed isn't effective with secondary passes, which will have removed most/all of the seed measurements from the measurement containers.
113 kwargs.setdefault("forceTrackOnSeed", flags.Acts.forceTrackOnSeed and not flags.Tracking.ActiveConfig.isSecondaryPass)
114
115 # Borrow many settings from flags.Tracking.ActiveConfig, normally initialised in createITkTrackingPassFlags() at
116 # https://gitlab.cern.ch/atlas/athena/-/blob/main/Tracking/TrkConfig/python/TrackingPassFlags.py#L121
117
118 # bins in |eta|, used for both MeasurementSelectorConfig and TrackSelector::EtaBinnedConfig
119 if flags.Detector.GeometryITk:
120 kwargs.setdefault("etaBins", flags.Tracking.ActiveConfig.etaBins)
121 # new default chi2 cuts optimise efficiency vs speed. Set same value as Athena's Xi2maxNoAdd.
122 kwargs.setdefault("chi2CutOff", flags.Tracking.ActiveConfig.Xi2max)
123 kwargs.setdefault("chi2OutlierCutOff", flags.Tracking.ActiveConfig.Xi2maxNoAdd)
124
125 kwargs.setdefault("branchStopperPtMinFactor", 0.9)
126 kwargs.setdefault("branchStopperAbsEtaMaxExtra", 0.1)
127 if not flags.Tracking.ActiveConfig.isLargeD0: # consider seedRefitPtMinFactor later, with other LRT optimisations
128 kwargs.setdefault("seedRefitPtMinFactor", 0.9)
129
130 # Loosen the requirement on the minimum number of measurements on track candidate
131 # during track finding for tracks above a certain eta
132 kwargs.setdefault("branchStopperMeasCutReduce", flags.Acts.branchStopperMeasCutReduce)
133 kwargs.setdefault("branchStopperAbsEtaMeasCut", flags.Acts.branchStopperAbsEtaMeasCut)
134
135 kwargs.setdefault("numMeasurementsCutOff", [1])
136
137 # there is always an over and underflow bin so the first bin will be 0. - 0.5 the last bin 3.5 - inf.
138 # if all eta bins are >=0. the counter will be categorized by abs(eta) otherwise eta
139 kwargs.setdefault("StatisticEtaBins", [eta/10. for eta in range(5, 40, 5)]) # eta 0.0 - 4.0 in steps of 0.5
140
141 kwargs.setdefault("absEtaMax", flags.Tracking.ActiveConfig.maxEta)
142 kwargs.setdefault("ptMin", [p / Units.GeV * UnitConstants.GeV for p in tolist(flags.Tracking.ActiveConfig.minPT)])
143 # z0 cut is the same for all eta bins. I use the size of the eta bins limits minus one to find the number of bins.
144 kwargs.setdefault("z0Min", [-flags.Tracking.ActiveConfig.maxZImpactSeed / Units.mm * UnitConstants.mm for etabin in flags.Tracking.ActiveConfig.etaBins[:-1]])
145 kwargs.setdefault("z0Max", [ flags.Tracking.ActiveConfig.maxZImpactSeed / Units.mm * UnitConstants.mm for etabin in flags.Tracking.ActiveConfig.etaBins[:-1]])
146 kwargs.setdefault("d0Min", [-d0 / Units.mm * UnitConstants.mm for d0 in tolist(flags.Tracking.ActiveConfig.maxPrimaryImpact)])
147 kwargs.setdefault("d0Max", [ d0 / Units.mm * UnitConstants.mm for d0 in tolist(flags.Tracking.ActiveConfig.maxPrimaryImpact)])
148 kwargs.setdefault("minMeasurements", tolist(flags.Tracking.ActiveConfig.minClusters))
149 kwargs.setdefault("maxHoles", tolist(flags.Tracking.ActiveConfig.maxHoles))
150 kwargs.setdefault("minPixelHits", tolist(flags.Tracking.ActiveConfig.minPixel))
151 kwargs.setdefault("maxPixelHoles", tolist(flags.Tracking.ActiveConfig.maxPixelHoles))
152 kwargs.setdefault("maxStripHoles", tolist(flags.Tracking.ActiveConfig.maxSctHoles))
153 # The shared hits are not calculated until *after* the track selection, so maxSharedHits is not used.
154 # Even if that were not the case, we need the ambiguity solver to decide which track to drop.
155
156
157 # GBTS produces much purer seeds, so the branch stopper selections aren't needed with GBTS seeds.
158 if flags.Tracking.ActiveConfig.PixelSeedingStrategy not in [
159 SeedingStrategy.GbtsFtf, SeedingStrategy.Gbts]:
160 kwargs.setdefault("ptMinMeasurements", seedOrder(flags, pixel=[3], strip=[6]))
161 kwargs.setdefault("absEtaMaxMeasurements", seedOrder(flags, pixel=[3], strip=[999999]))
162
163 if 'TrackParamsEstimationTool' not in kwargs:
164 from ActsConfig.ActsTrackParamsEstimationConfig import ActsTrackParamsEstimationToolCfg
165
166 # set TrackParamsEstimationTool in case not defined by caller
167 tpe_tool_kwargs = {}
168 if flags.Tracking.ActiveConfig.isLargeD0:
169 tpe_tool_kwargs["allowPropagatorFailure"] = True
170 tpe_tool_kwargs["stripCalibrationIterations"] = flags.Acts.stripCalibrationIterations
171 tpe = acc.popToolsAndMerge(ActsTrackParamsEstimationToolCfg(flags, **tpe_tool_kwargs))
172
173 kwargs.setdefault('TrackParamsEstimationTool', seedOrder(flags, pixel=[tpe], strip=[tpe]))
174
175 if flags.Acts.doPrintTrackStates and 'TrackStatePrinter' not in kwargs:
176 kwargs.setdefault(
177 "TrackStatePrinter",
178 acc.popToolsAndMerge(ActsTrackStatePrinterToolCfg(flags)),
179 )
180
181 if 'PixelCalibrator' not in kwargs:
182 from AthenaConfiguration.Enums import BeamType
183
184 if flags.Beam.Type is not BeamType.Cosmics and flags.Acts.PixelCalibrationStrategy.usesCalibration():
185 from ActsConfig.ActsMeasurementCalibrationConfig import ActsPixelCalibrationToolCfg
186
187 kwargs.setdefault(
188 'PixelCalibrator',
189 acc.popToolsAndMerge(ActsPixelCalibrationToolCfg(flags))
190 )
191
192 if 'StripCalibrator' not in kwargs:
193 from AthenaConfiguration.Enums import BeamType
194
195 if flags.Beam.Type is not BeamType.Cosmics and flags.Acts.StripCalibrationStrategy.usesCalibration():
196 from ActsConfig.ActsMeasurementCalibrationConfig import ActsStripCalibrationToolCfg
197
198 kwargs.setdefault(
199 'StripCalibrator',
200 acc.popToolsAndMerge(ActsStripCalibrationToolCfg(flags))
201 )
202
203
204 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
205 from ActsConfig.ActsMonitoringConfig import ActsTrackFindingMonitoringToolCfg
206 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
207 ActsTrackFindingMonitoringToolCfg(flags)))
208
209 acc.addEventAlgo(CompFactory.ActsTrk.TrackFindingAlg(name, **kwargs))
210 return acc
211
212
213
215 **kwargs) -> ComponentAccumulator:
216 acc = ComponentAccumulator()
217
218 # Define Uncalibrated Measurement keys
219 dataPrepPrefix = f'{flags.Tracking.ActiveConfig.extension.replace("Acts", "")}'
220 if not flags.Tracking.ActiveConfig.isSecondaryPass:
221 dataPrepPrefix = ''
222 pixelClusters = f'ITk{dataPrepPrefix}PixelClusters'
223 stripClusters = f'ITk{dataPrepPrefix}StripClusters'
224 hgtdClusters = f'{dataPrepPrefix}HGTD_Clusters'
225 # If cache is activated the keys have "_Cached" as postfix
226 if flags.Acts.useCache:
227 pixelClusters += '_Cached'
228 stripClusters += '_Cached'
229 # Consider case detectors are not active
230
231 # Understand what are the seeds we need to consider
232 pixelSeedLabels = ['PPP']
233 stripSeedLabels = ['SSS']
234 if not flags.Tracking.ActiveConfig.useITkPixelSeeding:
235 pixelSeedLabels = None
236 if not flags.Tracking.ActiveConfig.useITkStripSeeding:
237 stripSeedLabels = None
238
239 # Now set the seed and estimated parameters keys accordingly
240 pixelSeedKeys = [f'{flags.Tracking.ActiveConfig.extension}PixelSeeds']
241 stripSeedKeys = [f'{flags.Tracking.ActiveConfig.extension}StripSeeds']
242 pixelDetElements = ['ITkPixelDetectorElementCollection']
243 stripDetElements = ['ITkStripDetectorElementCollection']
244
245 tpe_tool_kwargs = {}
246 if flags.Tracking.ActiveConfig.isLargeD0:
247 tpe_tool_kwargs["allowPropagatorFailure"] = True
248 tpe_tool_kwargs["stripCalibrationIterations"] = flags.Acts.stripCalibrationIterations
249
250 if pixelSeedLabels is None:
251 pixelSeedKeys = None
252 pixelDetElements = None
253 pixelTpe = None
254 elif 'TrackParamsEstimationTool' not in kwargs:
255 from ActsConfig.ActsTrackParamsEstimationConfig import ActsTrackParamsEstimationToolCfg
256 pixelTpe = [acc.popToolsAndMerge(ActsTrackParamsEstimationToolCfg(flags, "PixelTrackParamsEstimationTool", **tpe_tool_kwargs))]
257
258 if stripSeedLabels is None:
259 stripSeedKeys = None
260 stripDetElements = None
261 stripTpe = None
262 elif 'TrackParamsEstimationTool' not in kwargs:
263 from ActsConfig.ActsTrackParamsEstimationConfig import ActsTrackParamsEstimationToolCfg
264 if flags.Tracking.ActiveConfig.isLargeD0 and flags.Acts.LrtStripSeedRefit:
265 tpe_tool_kwargs["refitSeeds"] = True
266 stripTpe = [acc.popToolsAndMerge(ActsTrackParamsEstimationToolCfg(flags, "StripTrackParamsEstimationTool", **tpe_tool_kwargs))]
267
268 kwargs.setdefault("TrackParamsEstimationTool", seedOrder(flags, pixel=pixelTpe, strip=stripTpe))
269 kwargs.setdefault('ACTSTracksLocation', f"{flags.Tracking.ActiveConfig.extension}Tracks")
270 kwargs.setdefault('UncalibratedMeasurementContainerKeys', isdet(flags, pixel=[pixelClusters], strip=[stripClusters], hgtd=[hgtdClusters]))
271 kwargs.setdefault('SeedLabels', seedOrder(flags, pixel=pixelSeedLabels, strip=stripSeedLabels))
272 kwargs.setdefault('SeedContainerKeys', seedOrder(flags, pixel=pixelSeedKeys, strip=stripSeedKeys))
273
274 acc.merge(ActsMainTrackFindingAlgCfg(flags,
275 name=f"{flags.Tracking.ActiveConfig.extension}TrackFindingAlg",
276 **kwargs))
277
278 # Analysis extensions
279 if flags.Acts.Tracks.doAnalysis:
280 from ActsConfig.ActsAnalysisConfig import ActsTrackAnalysisAlgCfg
281 acc.merge(ActsTrackAnalysisAlgCfg(flags,
282 name=f"{flags.Tracking.ActiveConfig.extension}TrackAnalysisAlg",
283 TracksLocation=f"{flags.Tracking.ActiveConfig.extension}Tracks"))
284
285 # Seed To Track Monitoring
286 DetectorElementsKeys=seedOrder(flags, pixel=pixelDetElements, strip=stripDetElements)
287 if len(kwargs["SeedContainerKeys"]) != len(DetectorElementsKeys):
288 raise AttributeError("SeedContainerKeys and DetectorElementsKeys must have same size")
289
290 for i in range(0, len(kwargs["SeedContainerKeys"])):
291 seedKey = kwargs["SeedContainerKeys"][i]
292 detElKey = DetectorElementsKeys[i]
293
294 # make seed params
295 from ActsConfig.ActsAnalysisConfig import ActsBaseSeedsToTrackParamsAlgCfg
296 acc.merge(ActsBaseSeedsToTrackParamsAlgCfg(flags,
297 name = f'{seedKey}SeedsToTrackParamsAlg',
298 InputSeedContainerKey = seedKey,
299 DetectorElementsKey = detElKey,
300 OutputTrackParamsCollectionKey = f'{seedKey}Params'))
301
302 from ActsConfig.ActsAnalysisConfig import ActsSeedToTrackAnalysisAlgCfg
303 acc.merge(ActsSeedToTrackAnalysisAlgCfg(flags,
304 name = f'{seedKey}ToTrackAnalysisAlg',
305 InputSeedCollection = seedKey,
306 InputTrackParamsCollection = f'{seedKey}Params',
307 InputDestinyCollection = f'{seedKey}Destiny'))
308
309 # Persistification
310 if flags.Acts.EDM.PersistifyTracks or flags.Output.doWriteESD:
311 trackColl = kwargs['ACTSTracksLocation']
312 from ActsConfig.ActsEventCnvConfig import ActsToXAODTrackConverterAlgCfg
313 acc.merge(ActsToXAODTrackConverterAlgCfg(flags,
314 name = f'{trackColl}ToXAODConverterAlg',
315 InputActsTracksLocation = trackColl,
316 OutputActsTracksLocation = trackColl))
317
318 prefix = f"{flags.Tracking.ActiveConfig.extension}"
319 from ActsConfig.ActsPersistificationConfig import PersistifyTracks
320 acc.merge(PersistifyTracks(flags,
321 extensions=[prefix]))
322
323 return acc
324
325
327 name: str = "GnnPipelineTool",
328 **kwargs) -> ComponentAccumulator:
329 acc = ComponentAccumulator()
330
331 kwargs.setdefault('moduleMapPath', flags.Acts.GNN.ModuleMapPath)
332 kwargs.setdefault('gnnPath', flags.Acts.GNN.ModelPath)
333 kwargs.setdefault('numTrtContexts', flags.Acts.GNN.NumTrtContexts)
334 kwargs.setdefault('maxGpuInstances', flags.Acts.GNN.MaxGpuInstances)
335 kwargs.setdefault('edgeCut', flags.Acts.GNN.EdgeCut)
336 kwargs.setdefault('minCandidateMeasurements', flags.Acts.GNN.MinCandidateMeasurements)
337 kwargs.setdefault('numFeatures', flags.Acts.GNN.NumFeatures)
338
339 acc.setPrivateTools(CompFactory.ActsTrk.GnnPipelineTool(name, **kwargs))
340 return acc
341
342def ActsTrackFindingGNNCfg(flags, **kwargs) -> ComponentAccumulator:
343 acc = ComponentAccumulator()
344
345 # This is added in the seeding step of the CKF chain...
346 from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
347 acc.merge(BeamSpotCondAlgCfg(flags))
348
349 # Adopt standard convention
350 kwargs.setdefault('ACTSTracksLocation', f"{flags.Tracking.ActiveConfig.extension}Tracks")
351
352 # The GNN inference (graph construction, edge classification, track building)
353 if 'GnnPipelineTool' not in kwargs:
354 kwargs.setdefault('GnnPipelineTool', acc.popToolsAndMerge(
355 ActsGnnPipelineToolCfg(flags, name="GnnPipeline")))
356
357 kwargs.setdefault("varianceInflation", flags.Acts.GNN.VarianceInflation)
358 kwargs.setdefault("tightSeeds", flags.Acts.GNN.TightSeeds)
359 kwargs.setdefault("relaxCentralHoleSel", flags.Acts.GNN.RelaxCentralHoleSel)
360 kwargs.setdefault("relaxMeasurementSel", flags.Acts.GNN.RelaxMeasurementSel)
361 kwargs.setdefault("offlineZ0Sel", flags.Acts.GNN.OfflineZ0Sel)
362
363 # Wire parameter estimation and fitter tools like the main Acts path
364 if 'TrackParamsEstimationTool' not in kwargs:
365 from ActsConfig.ActsTrackParamsEstimationConfig import ActsTrackParamsEstimationToolCfg
366 kwargs.setdefault('TrackParamsEstimationTool', acc.popToolsAndMerge(ActsTrackParamsEstimationToolCfg(flags)))
367
368 # The fitter tool is used in the GNN track finding to fit the track candidates after the GNN has selected the measurements.
369 if 'FitterTool' not in kwargs:
370 from ActsConfig.ActsTrackFittingConfig import ActsFitterCfg
371 kwargs.setdefault('FitterTool', acc.popToolsAndMerge(ActsFitterCfg(flags,
372 ReverseFilteringPt=0,
373 OutlierChi2Cut=float('inf'))))
374
375 from ActsAlignmentAlgs.AlignmentAlgsConfig import ActsGeometryContextAlgCfg
376 from ActsConfig.ActsGeometryConfig import ActsTrackingGeometrySvcCfg
377 acc.merge(ActsGeometryContextAlgCfg(flags))
378 acc.merge(ActsTrackingGeometrySvcCfg(flags))
379
380 acc.addEventAlgo(
381 CompFactory.ActsTrk.TrackFindingGNNAlg("TrackFindingGNNAlg", **kwargs)
382 )
383
384 return acc
385
386
387
388
390 name: str = "ActsScoreBasedAmbiguityResolutionAlg",
391 **kwargs) -> ComponentAccumulator:
392 acc = ComponentAccumulator()
393
394 kwargs.setdefault('TracksLocation', 'ActsTracks')
395 kwargs.setdefault('ResolvedTracksLocation', 'ActsResolvedTracks')
396 kwargs.setdefault('MinScore',1.0)
397 kwargs.setdefault('MinScoreSharedTracks', 1.0)
398 kwargs.setdefault('MaxSharedTracksPerMeasurement', 20)
399 kwargs.setdefault('MaxShared', 5)
400 kwargs.setdefault('MinUnshared', 5)
401 kwargs.setdefault('UseAmbiguityScoring', True)
402 kwargs.setdefault('jsonFileName', 'ActsAmbiguityConfig.json')
403
404 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
405 from ActsConfig.ActsMonitoringConfig import ActsAmbiguityResolutionMonitoringToolCfg
406 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
407 ActsAmbiguityResolutionMonitoringToolCfg(flags)))
408
409 acc.addEventAlgo(
410 CompFactory.ActsTrk.ScoreBasedAmbiguityResolutionAlg(name, **kwargs))
411 return acc
412
413
415 name: str = "ActsAmbiguityResolutionAlg",
416 **kwargs) -> ComponentAccumulator:
417 acc = ComponentAccumulator()
418
419 kwargs.setdefault('TracksLocation', 'ActsTracks')
420 kwargs.setdefault('ResolvedTracksLocation', 'ActsResolvedTracks')
421 kwargs.setdefault('MaximumSharedHits', 3)
422 kwargs.setdefault('MaximumIterations', 10000)
423 kwargs.setdefault('NMeasurementsMin', 7)
424
425 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
426 from ActsConfig.ActsMonitoringConfig import ActsAmbiguityResolutionMonitoringToolCfg
427 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
428 ActsAmbiguityResolutionMonitoringToolCfg(flags)))
429
430 acc.addEventAlgo(
431 CompFactory.ActsTrk.AmbiguityResolutionAlg(name, **kwargs))
432 return acc
433
434
436 **kwargs) -> ComponentAccumulator:
437 acc = ComponentAccumulator()
438 kwargs.setdefault('TracksLocation', f"{flags.Tracking.ActiveConfig.extension}Tracks")
439 kwargs.setdefault('ResolvedTracksLocation', f"{flags.Tracking.ActiveConfig.extension}ResolvedTracks")
440 from ActsConfig.ActsConfigFlags import AmbiguitySolverStrategy
441
442 if flags.Acts.AmbiguitySolverStrategy is AmbiguitySolverStrategy.ScoreBased:
444 name=f"{flags.Tracking.ActiveConfig.extension}ScoreBasedAmbiguityResolutionAlg",
445 **kwargs))
446 else:
447 acc.merge(ActsMainAmbiguityResolutionAlgCfg(flags,
448 name=f"{flags.Tracking.ActiveConfig.extension}AmbiguityResolutionAlg",
449 **kwargs))
450 # Analysis extensions
451 if flags.Acts.Tracks.doAnalysis:
452 from ActsConfig.ActsAnalysisConfig import ActsTrackAnalysisAlgCfg
453 acc.merge(ActsTrackAnalysisAlgCfg(flags,
454 name=f"{flags.Tracking.ActiveConfig.extension}ResolvedTrackAnalysisAlg",
455 TracksLocation=f"{flags.Tracking.ActiveConfig.extension}ResolvedTracks"))
456
457 # Persistification
458 if flags.Acts.EDM.PersistifyTracks or flags.Output.doWriteESD:
459 trackColl = kwargs['ResolvedTracksLocation']
460 from ActsConfig.ActsEventCnvConfig import ActsToXAODTrackConverterAlgCfg
461 acc.merge(ActsToXAODTrackConverterAlgCfg(flags,
462 name = f'{trackColl}ToXAODConverterAlg',
463 InputActsTracksLocation = trackColl,
464 OutputActsTracksLocation = trackColl))
465
466 prefix = f"{flags.Tracking.ActiveConfig.extension}Resolved"
467 from ActsConfig.ActsPersistificationConfig import PersistifyTracks
468 acc.merge(PersistifyTracks(flags,
469 extensions=[prefix]))
470
471 return acc
472
473
ComponentAccumulator ActsMainAmbiguityResolutionAlgCfg(flags, str name="ActsAmbiguityResolutionAlg", **kwargs)
ComponentAccumulator ActsTrackStatePrinterToolCfg(flags, str name="ActsTrackStatePrinterTool", **kwargs)
ComponentAccumulator ActsMainScoreBasedAmbiguityResolutionAlgCfg(flags, str name="ActsScoreBasedAmbiguityResolutionAlg", **kwargs)
list isdet(flags, *, list pixel=None, list strip=None, list hgtd=None, bool noStrip=False)
ComponentAccumulator ActsGnnPipelineToolCfg(flags, str name="GnnPipelineTool", **kwargs)
ComponentAccumulator ActsTrackFindingGNNCfg(flags, **kwargs)
ComponentAccumulator ActsAmbiguityResolutionCfg(flags, **kwargs)
list seedOrder(flags, *, list pixel=None, list strip=None)
ComponentAccumulator ActsMainTrackFindingAlgCfg(flags, str name="ActsTrackFindingAlg", **kwargs)
ComponentAccumulator ActsTrackFindingCfg(flags, **kwargs)