ATLAS Offline Software
Loading...
Searching...
No Matches
ActsTrackFindingConfig.py
Go to the documentation of this file.
2# Copyright (C) 2002-2025 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("refitSeeds", seedOrder(flags, pixel=[False], strip=[False]))
109 kwargs.setdefault("doTwoWay", flags.Acts.doTwoWayCKF)
110 kwargs.setdefault("autoReverseSearch", flags.Tracking.ActiveConfig.autoReverseSearch)
111 # forceTrackOnSeed isn't effective with secondary passes, which will have removed most/all of the seed measurements from the measurement containers.
112 kwargs.setdefault("forceTrackOnSeed", flags.Acts.forceTrackOnSeed and not flags.Tracking.ActiveConfig.isSecondaryPass)
113
114 # Borrow many settings from flags.Tracking.ActiveConfig, normally initialised in createITkTrackingPassFlags() at
115 # https://gitlab.cern.ch/atlas/athena/-/blob/main/Tracking/TrkConfig/python/TrackingPassFlags.py#L121
116
117 # bins in |eta|, used for both MeasurementSelectorConfig and TrackSelector::EtaBinnedConfig
118 if flags.Detector.GeometryITk:
119 kwargs.setdefault("etaBins", flags.Tracking.ActiveConfig.etaBins)
120 # new default chi2 cuts optimise efficiency vs speed. Set same value as Athena's Xi2maxNoAdd.
121 kwargs.setdefault("chi2CutOff", flags.Tracking.ActiveConfig.Xi2max)
122 kwargs.setdefault("chi2OutlierCutOff", flags.Tracking.ActiveConfig.Xi2maxNoAdd)
123
124 kwargs.setdefault("branchStopperPtMinFactor", 0.9)
125 kwargs.setdefault("branchStopperAbsEtaMaxExtra", 0.1)
126 if not flags.Tracking.ActiveConfig.isLargeD0: # consider seedRefitPtMinFactor later, with other LRT optimisations
127 kwargs.setdefault("seedRefitPtMinFactor", 0.9)
128
129 # Loosen the requirement on the minimum number of measurements on track candidate
130 # during track finding for tracks above a certain eta
131 kwargs.setdefault("branchStopperMeasCutReduce", flags.Acts.branchStopperMeasCutReduce)
132 kwargs.setdefault("branchStopperAbsEtaMeasCut", flags.Acts.branchStopperAbsEtaMeasCut)
133
134 kwargs.setdefault("numMeasurementsCutOff", [1])
135
136 # there is always an over and underflow bin so the first bin will be 0. - 0.5 the last bin 3.5 - inf.
137 # if all eta bins are >=0. the counter will be categorized by abs(eta) otherwise eta
138 kwargs.setdefault("StatisticEtaBins", [eta/10. for eta in range(5, 40, 5)]) # eta 0.0 - 4.0 in steps of 0.5
139
140 kwargs.setdefault("absEtaMax", flags.Tracking.ActiveConfig.maxEta)
141 kwargs.setdefault("ptMin", [p / Units.GeV * UnitConstants.GeV for p in tolist(flags.Tracking.ActiveConfig.minPT)])
142 # 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.
143 kwargs.setdefault("z0Min", [-flags.Tracking.ActiveConfig.maxZImpactSeed / Units.mm * UnitConstants.mm for etabin in flags.Tracking.ActiveConfig.etaBins[:-1]])
144 kwargs.setdefault("z0Max", [ flags.Tracking.ActiveConfig.maxZImpactSeed / Units.mm * UnitConstants.mm for etabin in flags.Tracking.ActiveConfig.etaBins[:-1]])
145 kwargs.setdefault("d0Min", [-d0 / Units.mm * UnitConstants.mm for d0 in tolist(flags.Tracking.ActiveConfig.maxPrimaryImpact)])
146 kwargs.setdefault("d0Max", [ d0 / Units.mm * UnitConstants.mm for d0 in tolist(flags.Tracking.ActiveConfig.maxPrimaryImpact)])
147 kwargs.setdefault("minMeasurements", tolist(flags.Tracking.ActiveConfig.minClusters))
148 kwargs.setdefault("maxHoles", tolist(flags.Tracking.ActiveConfig.maxHoles))
149 kwargs.setdefault("minPixelHits", tolist(flags.Tracking.ActiveConfig.minPixel))
150 kwargs.setdefault("maxPixelHoles", tolist(flags.Tracking.ActiveConfig.maxPixelHoles))
151 kwargs.setdefault("maxStripHoles", tolist(flags.Tracking.ActiveConfig.maxSctHoles))
152 # The shared hits are not calculated until *after* the track selection, so maxSharedHits is not used.
153 # Even if that were not the case, we need the ambiguity solver to decide which track to drop.
154
155
156 # GBTS produces much purer seeds, so the branch stopper selections aren't needed with GBTS seeds.
157 if flags.Acts.SeedingStrategy not in (SeedingStrategy.GbtsFtf, SeedingStrategy.Gbts):
158 kwargs.setdefault("ptMinMeasurements", seedOrder(flags, pixel=[3], strip=[6]))
159 kwargs.setdefault("absEtaMaxMeasurements", seedOrder(flags, pixel=[3], strip=[999999]))
160
161
162 if 'TrackParamsEstimationTool' not in kwargs:
163 from ActsConfig.ActsTrackParamsEstimationConfig import ActsTrackParamsEstimationToolCfg
164
165 tpe_tool_kwargs = {}
166 if flags.Tracking.ActiveConfig.isLargeD0:
167 tpe_tool_kwargs["allowPropagatorFailure"] = True
168 tpe_tool_kwargs["stripCalibrationIterations"] = flags.Acts.stripCalibrationIterations
169
170 kwargs.setdefault('TrackParamsEstimationTool', acc.popToolsAndMerge(ActsTrackParamsEstimationToolCfg(flags, **tpe_tool_kwargs)))
171
172
173 if flags.Acts.doPrintTrackStates and 'TrackStatePrinter' not in kwargs:
174 kwargs.setdefault(
175 "TrackStatePrinter",
176 acc.popToolsAndMerge(ActsTrackStatePrinterToolCfg(flags)),
177 )
178
179 if 'FitterTool' not in kwargs:
180 from ActsConfig.ActsTrackFittingConfig import ActsFitterCfg
181 # This fitter is only used for the seed refit, so restore a finite
182 # OutlierChi2Cut only if a refit is scheduled for at least one seed
183 # collection (currently the LRT strip seeds), letting the refit
184 # potentially downweight bad hits before they bias initial parameters fed to CKF.
185 # currently does nothing (flag defaults to inf == disabled)
186 if any(kwargs["refitSeeds"]):
187 seedRefitOutlierChi2Cut = flags.Acts.SeedRefitOutlierChi2Cut
188 else:
189 seedRefitOutlierChi2Cut = float('inf')
190 kwargs.setdefault(
191 'FitterTool',
192 acc.popToolsAndMerge(ActsFitterCfg(flags,
193 ReverseFilteringPt=0,
194 OutlierChi2Cut=seedRefitOutlierChi2Cut))
195 )
196
197 if 'PixelCalibrator' not in kwargs:
198 from AthenaConfiguration.Enums import BeamType
199
200 if flags.Beam.Type is not BeamType.Cosmics:
201 from ActsConfig.ActsConfigFlags import PixelCalibrationStrategy
202 from ActsConfig.ActsMeasurementCalibrationConfig import ActsAnalogueClusteringToolCfg
203
204 if flags.Acts.PixelCalibrationStrategy in (PixelCalibrationStrategy.AnalogueClustering,
205 PixelCalibrationStrategy.AnalogueClusteringAfterSelection,
206 PixelCalibrationStrategy.NNClustering):
207
208 kwargs.setdefault(
209 'PixelCalibrator',
210 acc.popToolsAndMerge(ActsAnalogueClusteringToolCfg(flags,
211 CalibrateAfterMeasurementSelection = flags.Acts.PixelCalibrationStrategy is PixelCalibrationStrategy.AnalogueClusteringAfterSelection))
212 )
213
214 if 'StripCalibrator' not in kwargs:
215 from AthenaConfiguration.Enums import BeamType
216 if flags.Beam.Type is not BeamType.Cosmics:
217 from ActsConfig.ActsMeasurementCalibrationConfig import ActsStripCalibrationToolCfg
218 from ActsConfig.ActsConfigFlags import StripCalibrationStrategy
219
220 if flags.Acts.StripCalibrationStrategy in (StripCalibrationStrategy.DigitalCalibration,
221 StripCalibrationStrategy.DigitalCalibrationAfterSelection) :
222
223 kwargs.setdefault(
224 'StripCalibrator',
225 acc.popToolsAndMerge(ActsStripCalibrationToolCfg(flags,
226 CalibrateAfterMeasurementSelection = flags.Acts.StripCalibrationStrategy is StripCalibrationStrategy.DigitalCalibrationAfterSelection))
227 )
228
229
230 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
231 from ActsConfig.ActsMonitoringConfig import ActsTrackFindingMonitoringToolCfg
232 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
233 ActsTrackFindingMonitoringToolCfg(flags)))
234
235 acc.addEventAlgo(CompFactory.ActsTrk.TrackFindingAlg(name, **kwargs))
236 return acc
237
238
239
241 **kwargs) -> ComponentAccumulator:
242 acc = ComponentAccumulator()
243
244 # Define Uncalibrated Measurement keys
245 dataPrepPrefix = f'{flags.Tracking.ActiveConfig.extension.replace("Acts", "")}'
246 if not flags.Tracking.ActiveConfig.isSecondaryPass:
247 dataPrepPrefix = ''
248 pixelClusters = f'ITk{dataPrepPrefix}PixelClusters'
249 stripClusters = f'ITk{dataPrepPrefix}StripClusters'
250 hgtdClusters = f'{dataPrepPrefix}HGTD_Clusters'
251 # If cache is activated the keys have "_Cached" as postfix
252 if flags.Acts.useCache:
253 pixelClusters += '_Cached'
254 stripClusters += '_Cached'
255 # Consider case detectors are not active
256
257 # Understand what are the seeds we need to consider
258 pixelSeedLabels = ['PPP']
259 stripSeedLabels = ['SSS']
260 # Conversion and LRT do not process pixel seeds
261 from InDetConfig.ITkActsHelpers import isFastPrimaryPass
262 if flags.Tracking.ActiveConfig.extension == 'ActsConversion' or flags.Tracking.ActiveConfig.isLargeD0:
263 pixelSeedLabels = None
264 # Main pass does not process strip seeds in the fast tracking configuration
265 elif isFastPrimaryPass(flags):
266 stripSeedLabels = None
267
268 # Now set the seed and estimated parameters keys accordingly
269 pixelSeedKeys = [f'{flags.Tracking.ActiveConfig.extension}PixelSeeds']
270 stripSeedKeys = [f'{flags.Tracking.ActiveConfig.extension}StripSeeds']
271 pixelDetElements = ['ITkPixelDetectorElementCollection']
272 stripDetElements = ['ITkStripDetectorElementCollection']
273
274 pixelRefit = [False]
275 stripRefit = [False]
276 if flags.Tracking.ActiveConfig.isLargeD0:
277 #allow to set whether we do a strip seed refit for LRT
278 stripRefit = [flags.Acts.LrtStripSeedRefit]
279
280 if pixelSeedLabels is None:
281 pixelSeedKeys = None
282 pixelDetElements = None
283 pixelRefit = None
284 if stripSeedLabels is None:
285 stripSeedKeys = None
286 stripDetElements = None
287 stripRefit = None
288
289 kwargs.setdefault('ACTSTracksLocation', f"{flags.Tracking.ActiveConfig.extension}Tracks")
290 kwargs.setdefault('UncalibratedMeasurementContainerKeys', isdet(flags, pixel=[pixelClusters], strip=[stripClusters], hgtd=[hgtdClusters]))
291 kwargs.setdefault('SeedLabels', seedOrder(flags, pixel=pixelSeedLabels, strip=stripSeedLabels))
292 kwargs.setdefault('SeedContainerKeys', seedOrder(flags, pixel=pixelSeedKeys, strip=stripSeedKeys))
293 kwargs.setdefault("refitSeeds", seedOrder(flags, pixel=pixelRefit, strip=stripRefit))
294
295 acc.merge(ActsMainTrackFindingAlgCfg(flags,
296 name=f"{flags.Tracking.ActiveConfig.extension}TrackFindingAlg",
297 **kwargs))
298
299 # Analysis extensions
300 if flags.Acts.Tracks.doAnalysis:
301 from ActsConfig.ActsAnalysisConfig import ActsTrackAnalysisAlgCfg
302 acc.merge(ActsTrackAnalysisAlgCfg(flags,
303 name=f"{flags.Tracking.ActiveConfig.extension}TrackAnalysisAlg",
304 TracksLocation=f"{flags.Tracking.ActiveConfig.extension}Tracks"))
305
306 # Seed To Track Monitoring
307 DetectorElementsKeys=seedOrder(flags, pixel=pixelDetElements, strip=stripDetElements)
308 if len(kwargs["SeedContainerKeys"]) != len(DetectorElementsKeys):
309 raise AttributeError("SeedContainerKeys and DetectorElementsKeys must have same size")
310
311 for i in range(0, len(kwargs["SeedContainerKeys"])):
312 seedKey = kwargs["SeedContainerKeys"][i]
313 detElKey = DetectorElementsKeys[i]
314
315 # make seed params
316 from ActsConfig.ActsAnalysisConfig import ActsBaseSeedsToTrackParamsAlgCfg
317 acc.merge(ActsBaseSeedsToTrackParamsAlgCfg(flags,
318 name = f'{seedKey}SeedsToTrackParamsAlg',
319 InputSeedContainerKey = seedKey,
320 DetectorElementsKey = detElKey,
321 OutputTrackParamsCollectionKey = f'{seedKey}Params'))
322
323 from ActsConfig.ActsAnalysisConfig import ActsSeedToTrackAnalysisAlgCfg
324 acc.merge(ActsSeedToTrackAnalysisAlgCfg(flags,
325 name = f'{seedKey}ToTrackAnalysisAlg',
326 InputSeedCollection = seedKey,
327 InputTrackParamsCollection = f'{seedKey}Params',
328 InputDestinyCollection = f'{seedKey}Destiny'))
329
330 # Persistification
331 if flags.Acts.EDM.PersistifyTracks:
332 trackColl = kwargs['ACTSTracksLocation']
333 from ActsConfig.ActsEventCnvConfig import ActsToXAODTrackConverterAlgCfg
334 acc.merge(ActsToXAODTrackConverterAlgCfg(flags,
335 name = f'{trackColl}ToXAODConverterAlg',
336 InputActsTracksLocation = trackColl,
337 OutputActsTracksLocation = trackColl))
338
339 prefix = f"{flags.Tracking.ActiveConfig.extension}"
340 from ActsConfig.ActsPersistificationConfig import PersistifyTracks
341 acc.merge(PersistifyTracks(flags,
342 extensions=[prefix]))
343
344 return acc
345
346
347def ActsTrackFindingGNNCfg(flags, **kwargs) -> ComponentAccumulator:
348 acc = ComponentAccumulator()
349
350 # This is added in the seeding step of the CKF chain...
351 from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
352 acc.merge(BeamSpotCondAlgCfg(flags))
353
354 # Adopt standard convention
355 kwargs.setdefault('ACTSTracksLocation', f"{flags.Tracking.ActiveConfig.extension}Tracks")
356
357 kwargs.setdefault("moduleMapPath", flags.Acts.GNN.ModuleMapPath)
358 kwargs.setdefault("gnnPath", flags.Acts.GNN.ModelPath)
359 kwargs.setdefault("numTrtContexts", flags.Acts.GNN.NumTrtContexts)
360 kwargs.setdefault("maxGpuInstances", flags.Acts.GNN.MaxGpuInstances)
361 kwargs.setdefault("varianceInflation", flags.Acts.GNN.VarianceInflation)
362 kwargs.setdefault("tightSeeds", flags.Acts.GNN.TightSeeds)
363 kwargs.setdefault("edgeCut", flags.Acts.GNN.EdgeCut)
364 kwargs.setdefault("minCandidateMeasurements", flags.Acts.GNN.MinCandidateMeasurements)
365 kwargs.setdefault("minDeltaR", flags.Acts.GNN.MinDeltaR)
366 kwargs.setdefault("relaxCentralHoleSel", flags.Acts.GNN.RelaxCentralHoleSel)
367 kwargs.setdefault("relaxMeasurementSel", flags.Acts.GNN.RelaxMeasurementSel)
368 kwargs.setdefault("offlineZ0Sel", flags.Acts.GNN.OfflineZ0Sel)
369
370 # Wire parameter estimation and fitter tools like the main Acts path
371 if 'TrackParamsEstimationTool' not in kwargs:
372 from ActsConfig.ActsTrackParamsEstimationConfig import ActsTrackParamsEstimationToolCfg
373 kwargs.setdefault('TrackParamsEstimationTool', acc.popToolsAndMerge(ActsTrackParamsEstimationToolCfg(flags)))
374
375 if 'FitterTool' not in kwargs:
376 from ActsConfig.ActsTrackFittingConfig import ActsFitterCfg
377 kwargs.setdefault('FitterTool', acc.popToolsAndMerge(ActsFitterCfg(flags, ReverseFilteringPt=0, OutlierChi2Cut=float('inf'))))
378
379 from ActsAlignmentAlgs.AlignmentAlgsConfig import ActsGeometryContextAlgCfg
380 from ActsConfig.ActsGeometryConfig import ActsTrackingGeometrySvcCfg
381 acc.merge(ActsGeometryContextAlgCfg(flags))
382 acc.merge(ActsTrackingGeometrySvcCfg(flags))
383
384 acc.addEventAlgo(
385 CompFactory.ActsTrk.TrackFindingGNNAlg("TrackFindingGNNAlg", **kwargs)
386 )
387
388 return acc
389
390
391
392
394 name: str = "ActsScoreBasedAmbiguityResolutionAlg",
395 **kwargs) -> ComponentAccumulator:
396 acc = ComponentAccumulator()
397
398 kwargs.setdefault('TracksLocation', 'ActsTracks')
399 kwargs.setdefault('ResolvedTracksLocation', 'ActsResolvedTracks')
400 kwargs.setdefault('MinScore',1.0)
401 kwargs.setdefault('MinScoreSharedTracks', 1.0)
402 kwargs.setdefault('MaxSharedTracksPerMeasurement', 20)
403 kwargs.setdefault('MaxShared', 5)
404 kwargs.setdefault('MinUnshared', 5)
405 kwargs.setdefault('UseAmbiguityScoring', True)
406 kwargs.setdefault('jsonFileName', 'ActsAmbiguityConfig.json')
407
408 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
409 from ActsConfig.ActsMonitoringConfig import ActsAmbiguityResolutionMonitoringToolCfg
410 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
411 ActsAmbiguityResolutionMonitoringToolCfg(flags)))
412
413 acc.addEventAlgo(
414 CompFactory.ActsTrk.ScoreBasedAmbiguityResolutionAlg(name, **kwargs))
415 return acc
416
417
419 name: str = "ActsAmbiguityResolutionAlg",
420 **kwargs) -> ComponentAccumulator:
421 acc = ComponentAccumulator()
422
423 kwargs.setdefault('TracksLocation', 'ActsTracks')
424 kwargs.setdefault('ResolvedTracksLocation', 'ActsResolvedTracks')
425 kwargs.setdefault('MaximumSharedHits', 3)
426 kwargs.setdefault('MaximumIterations', 10000)
427 kwargs.setdefault('NMeasurementsMin', 7)
428
429 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
430 from ActsConfig.ActsMonitoringConfig import ActsAmbiguityResolutionMonitoringToolCfg
431 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
432 ActsAmbiguityResolutionMonitoringToolCfg(flags)))
433
434 acc.addEventAlgo(
435 CompFactory.ActsTrk.AmbiguityResolutionAlg(name, **kwargs))
436 return acc
437
438
440 **kwargs) -> ComponentAccumulator:
441 acc = ComponentAccumulator()
442 kwargs.setdefault('TracksLocation', f"{flags.Tracking.ActiveConfig.extension}Tracks")
443 kwargs.setdefault('ResolvedTracksLocation', f"{flags.Tracking.ActiveConfig.extension}ResolvedTracks")
444 from ActsConfig.ActsConfigFlags import AmbiguitySolverStrategy
445
446 if flags.Acts.AmbiguitySolverStrategy is AmbiguitySolverStrategy.ScoreBased:
448 name=f"{flags.Tracking.ActiveConfig.extension}ScoreBasedAmbiguityResolutionAlg",
449 **kwargs))
450 else:
451 acc.merge(ActsMainAmbiguityResolutionAlgCfg(flags,
452 name=f"{flags.Tracking.ActiveConfig.extension}AmbiguityResolutionAlg",
453 **kwargs))
454 # Analysis extensions
455 if flags.Acts.Tracks.doAnalysis:
456 from ActsConfig.ActsAnalysisConfig import ActsTrackAnalysisAlgCfg
457 acc.merge(ActsTrackAnalysisAlgCfg(flags,
458 name=f"{flags.Tracking.ActiveConfig.extension}ResolvedTrackAnalysisAlg",
459 TracksLocation=f"{flags.Tracking.ActiveConfig.extension}ResolvedTracks"))
460
461 # Persistification
462 if flags.Acts.EDM.PersistifyTracks:
463 trackColl = kwargs['ResolvedTracksLocation']
464 from ActsConfig.ActsEventCnvConfig import ActsToXAODTrackConverterAlgCfg
465 acc.merge(ActsToXAODTrackConverterAlgCfg(flags,
466 name = f'{trackColl}ToXAODConverterAlg',
467 InputActsTracksLocation = trackColl,
468 OutputActsTracksLocation = trackColl))
469
470 prefix = f"{flags.Tracking.ActiveConfig.extension}Resolved"
471 from ActsConfig.ActsPersistificationConfig import PersistifyTracks
472 acc.merge(PersistifyTracks(flags,
473 extensions=[prefix]))
474
475 return acc
476
477
list seedOrder(flags, *, list pixel=None, list strip=None)
ComponentAccumulator ActsTrackStatePrinterToolCfg(flags, str name="ActsTrackStatePrinterTool", **kwargs)
ComponentAccumulator ActsMainScoreBasedAmbiguityResolutionAlgCfg(flags, str name="ActsScoreBasedAmbiguityResolutionAlg", **kwargs)
ComponentAccumulator ActsMainAmbiguityResolutionAlgCfg(flags, str name="ActsAmbiguityResolutionAlg", **kwargs)
ComponentAccumulator ActsTrackFindingCfg(flags, **kwargs)
list isdet(flags, *, list pixel=None, list strip=None, list hgtd=None, bool noStrip=False)
ComponentAccumulator ActsMainTrackFindingAlgCfg(flags, str name="ActsTrackFindingAlg", **kwargs)
ComponentAccumulator ActsTrackFindingGNNCfg(flags, **kwargs)
ComponentAccumulator ActsAmbiguityResolutionCfg(flags, **kwargs)