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 if 'TrackingGeometryTool' not in kwargs:
48 from ActsConfig.ActsGeometryConfig import ActsTrackingGeometryToolCfg
49 kwargs.setdefault(
50 "TrackingGeometryTool",
51 acc.getPrimaryAndMerge(ActsTrackingGeometryToolCfg(flags)),
52 )
53
54 acc.setPrivateTools(CompFactory.ActsTrk.TrackStatePrinterTool(name, **kwargs))
55 return acc
56
57# ACTS only algorithm
58
60 name: str = "ActsTrackFindingAlg",
61 **kwargs) -> ComponentAccumulator:
62 def tolist(c):
63 return c if isinstance(c, list) else [c]
64
65 acc = ComponentAccumulator()
66
67 from ActsConfig.ActsGeometryConfig import ActsVolumeIdToDetectorCollectionMappingAlgCfg
68 # Remove HGTD Volumes from the propagation unless we need it
69 if not flags.Acts.useHGTDClusterInTrackFinding:
70 # HGTD has volume id:
71 # 2 for negative endcap
72 # 25 for positive endcap
73 kwargs.setdefault('EndOfTheWorldVolumeIds', [2, 25])
74
75 acc.merge( ActsVolumeIdToDetectorCollectionMappingAlgCfg(flags) )
76 kwargs.setdefault("ActsVolumeIdToDetectorElementCollectionMapKey", "VolumeIdToDetectorElementCollectionMap")
77
78 if flags.Detector.EnableITkPixel:
79 from PixelConditionsAlgorithms.ITkPixelConditionsConfig import ITkPixelDetectorElementStatusAlgCfg
80 acc.merge(ITkPixelDetectorElementStatusAlgCfg(flags))
81 if flags.Detector.EnableITkStrip:
82 from SCT_ConditionsAlgorithms.ITkStripConditionsAlgorithmsConfig import ITkStripDetectorElementStatusAlgCfg
83 acc.merge(ITkStripDetectorElementStatusAlgCfg(flags))
84 kwargs.setdefault("DetElStatus", seedOrder(flags, pixel=["ITkPixelDetectorElementStatus"], strip=["ITkStripDetectorElementStatus"]))
85
86 # Seed labels and collections.
87 # These 3 lists must match element for element, reversed if flags.Acts.useStripSeedsFirst is True.
88 # Maybe it is best to start with strips where the occupancy is lower.
89 kwargs.setdefault("SeedLabels", seedOrder(flags, pixel=["PPP"], strip=["SSS"]))
90 kwargs.setdefault("SeedContainerKeys", seedOrder(flags, pixel=["ActsPixelSeeds"], strip=["ActsStripSeeds"]))
91 if flags.Acts.Tracks.doAnalysis:
92 kwargs.setdefault("SeedDestiny", [f'{seedkey}Destiny' for seedkey in kwargs["SeedContainerKeys"]])
93
94 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"]))
95
96 kwargs.setdefault('ACTSTracksLocation', 'ActsTracks')
97
98 kwargs.setdefault("maxPropagationStep", 10000)
99 kwargs.setdefault("skipDuplicateSeeds", flags.Acts.skipDuplicateSeeds)
100 kwargs.setdefault("seedMeasOffset", 1)
101
102 # Ambi strategy 0 means do the ambiguity resolution outside the track finding.
103 kwargs.setdefault("ambiStrategy", flags.Acts.AmbiguitySolverMode.value)
104
105 if (not flags.Acts.doAmbiguityResolution) :
106 kwargs.setdefault("MaximumSharedHits", 3)
107 kwargs.setdefault("MaximumIterations", 10000)
108 kwargs.setdefault("NMeasurementsMin", 7)
109
110 kwargs.setdefault("refitSeeds", seedOrder(flags, pixel=[False], strip=[False]))
111 kwargs.setdefault("doTwoWay", flags.Acts.doTwoWayCKF)
112 kwargs.setdefault("autoReverseSearch", flags.Tracking.ActiveConfig.autoReverseSearch)
113 # forceTrackOnSeed isn't effective with secondary passes, which will have removed most/all of the seed measurements from the measurement containers.
114 kwargs.setdefault("forceTrackOnSeed", flags.Acts.forceTrackOnSeed and not flags.Tracking.ActiveConfig.isSecondaryPass)
115
116 # Borrow many settings from flags.Tracking.ActiveConfig, normally initialised in createITkTrackingPassFlags() at
117 # https://gitlab.cern.ch/atlas/athena/-/blob/main/Tracking/TrkConfig/python/TrackingPassFlags.py#L121
118
119 # bins in |eta|, used for both MeasurementSelectorConfig and TrackSelector::EtaBinnedConfig
120 if flags.Detector.GeometryITk:
121 kwargs.setdefault("etaBins", flags.Tracking.ActiveConfig.etaBins)
122 # new default chi2 cuts optimise efficiency vs speed. Set same value as Athena's Xi2maxNoAdd.
123 kwargs.setdefault("chi2CutOff", flags.Tracking.ActiveConfig.Xi2max)
124 kwargs.setdefault("chi2OutlierCutOff", flags.Tracking.ActiveConfig.Xi2maxNoAdd)
125
126 kwargs.setdefault("branchStopperPtMinFactor", 0.9)
127 kwargs.setdefault("branchStopperAbsEtaMaxExtra", 0.1)
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 if 'TrackingGeometryTool' not in kwargs:
162 from ActsConfig.ActsGeometryConfig import ActsTrackingGeometryToolCfg
163 kwargs.setdefault(
164 "TrackingGeometryTool",
165 acc.getPrimaryAndMerge(ActsTrackingGeometryToolCfg(flags)),
166 )
167
168 if 'TrackParamsEstimationTool' not in kwargs:
169 from ActsConfig.ActsTrackParamsEstimationConfig import ActsTrackParamsEstimationToolCfg
170
171 tpe_tool_kwargs = {}
172 if flags.Tracking.ActiveConfig.isLargeD0:
173 tpe_tool_kwargs["allowPropagatorFailure"] = True
174
175 kwargs.setdefault('TrackParamsEstimationTool', acc.popToolsAndMerge(ActsTrackParamsEstimationToolCfg(flags, **tpe_tool_kwargs)))
176
177 if 'ExtrapolationTool' not in kwargs:
178 from ActsConfig.ActsGeometryConfig import ActsExtrapolationToolCfg
179 kwargs.setdefault(
180 "ExtrapolationTool",
181 acc.popToolsAndMerge(ActsExtrapolationToolCfg(flags, MaxSteps=10000)),
182 )
183
184 if flags.Acts.doPrintTrackStates and 'TrackStatePrinter' not in kwargs:
185 kwargs.setdefault(
186 "TrackStatePrinter",
187 acc.popToolsAndMerge(ActsTrackStatePrinterToolCfg(flags)),
188 )
189
190 if 'FitterTool' not in kwargs:
191 from ActsConfig.ActsTrackFittingConfig import ActsFitterCfg
192 kwargs.setdefault(
193 'FitterTool',
194 acc.popToolsAndMerge(ActsFitterCfg(flags,
195 ReverseFilteringPt=0,
196 OutlierChi2Cut=float('inf')))
197 )
198
199 if 'PixelCalibrator' not in kwargs:
200 from AthenaConfiguration.Enums import BeamType
201
202 if flags.Beam.Type is not BeamType.Cosmics:
203 from ActsConfig.ActsConfigFlags import PixelCalibrationStrategy
204 from ActsConfig.ActsMeasurementCalibrationConfig import ActsAnalogueClusteringToolCfg
205
206 if flags.Acts.PixelCalibrationStrategy in (PixelCalibrationStrategy.AnalogueClustering,
207 PixelCalibrationStrategy.AnalogueClusteringAfterSelection,
208 PixelCalibrationStrategy.NNClustering):
209
210 kwargs.setdefault(
211 'PixelCalibrator',
212 acc.popToolsAndMerge(ActsAnalogueClusteringToolCfg(flags,
213 CalibrateAfterMeasurementSelection = flags.Acts.PixelCalibrationStrategy is PixelCalibrationStrategy.AnalogueClusteringAfterSelection))
214 )
215
216 if 'StripCalibrator' not in kwargs:
217 from AthenaConfiguration.Enums import BeamType
218 if flags.Beam.Type is not BeamType.Cosmics:
219 from ActsConfig.ActsMeasurementCalibrationConfig import ActsStripCalibrationToolCfg
220 from ActsConfig.ActsConfigFlags import StripCalibrationStrategy
221
222 if flags.Acts.StripCalibrationStrategy in (StripCalibrationStrategy.DigitalCalibration,
223 StripCalibrationStrategy.DigitalCalibrationAfterSelection) :
224
225 kwargs.setdefault(
226 'StripCalibrator',
227 acc.popToolsAndMerge(ActsStripCalibrationToolCfg(flags,
228 CalibrateAfterMeasurementSelection = flags.Acts.StripCalibrationStrategy is StripCalibrationStrategy.DigitalCalibrationAfterSelection))
229 )
230
231
232 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
233 from ActsConfig.ActsMonitoringConfig import ActsTrackFindingMonitoringToolCfg
234 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
235 ActsTrackFindingMonitoringToolCfg(flags)))
236
237 acc.addEventAlgo(CompFactory.ActsTrk.TrackFindingAlg(name, **kwargs))
238 return acc
239
240
241
243 **kwargs) -> ComponentAccumulator:
244 acc = ComponentAccumulator()
245
246 # Define Uncalibrated Measurement keys
247 dataPrepPrefix = f'{flags.Tracking.ActiveConfig.extension.replace("Acts", "")}'
248 if not flags.Tracking.ActiveConfig.isSecondaryPass:
249 dataPrepPrefix = ''
250 pixelClusters = f'ITk{dataPrepPrefix}PixelClusters'
251 stripClusters = f'ITk{dataPrepPrefix}StripClusters'
252 hgtdClusters = f'{dataPrepPrefix}HGTD_Clusters'
253 # If cache is activated the keys have "_Cached" as postfix
254 if flags.Acts.useCache:
255 pixelClusters += '_Cached'
256 stripClusters += '_Cached'
257 # Consider case detectors are not active
258
259 # Understand what are the seeds we need to consider
260 pixelSeedLabels = ['PPP']
261 stripSeedLabels = ['SSS']
262 # Conversion and LRT do not process pixel seeds
263 from InDetConfig.ITkActsHelpers import isFastPrimaryPass
264 if flags.Tracking.ActiveConfig.extension == 'ActsConversion' or flags.Tracking.ActiveConfig.isLargeD0:
265 pixelSeedLabels = None
266 # Main pass does not process strip seeds in the fast tracking configuration
267 elif isFastPrimaryPass(flags):
268 stripSeedLabels = None
269
270 # Now set the seed and estimated parameters keys accordingly
271 pixelSeedKeys = [f'{flags.Tracking.ActiveConfig.extension}PixelSeeds']
272 stripSeedKeys = [f'{flags.Tracking.ActiveConfig.extension}StripSeeds']
273 pixelDetElements = ['ITkPixelDetectorElementCollection']
274 stripDetElements = ['ITkStripDetectorElementCollection']
275
276 pixelRefit = [False]
277 stripRefit = [False]
278 if flags.Tracking.ActiveConfig.isLargeD0:
279 stripRefit = [True]
280
281 if pixelSeedLabels is None:
282 pixelSeedKeys = None
283 pixelDetElements = None
284 pixelRefit = None
285 if stripSeedLabels is None:
286 stripSeedKeys = None
287 stripDetElements = None
288 stripRefit = None
289
290 kwargs.setdefault('ACTSTracksLocation', f"{flags.Tracking.ActiveConfig.extension}Tracks")
291 kwargs.setdefault('UncalibratedMeasurementContainerKeys', isdet(flags, pixel=[pixelClusters], strip=[stripClusters], hgtd=[hgtdClusters]))
292 kwargs.setdefault('SeedLabels', seedOrder(flags, pixel=pixelSeedLabels, strip=stripSeedLabels))
293 kwargs.setdefault('SeedContainerKeys', seedOrder(flags, pixel=pixelSeedKeys, strip=stripSeedKeys))
294 kwargs.setdefault("refitSeeds", seedOrder(flags, pixel=pixelRefit, strip=stripRefit))
295
296 acc.merge(ActsMainTrackFindingAlgCfg(flags,
297 name=f"{flags.Tracking.ActiveConfig.extension}TrackFindingAlg",
298 **kwargs))
299
300 # Analysis extensions
301 if flags.Acts.Tracks.doAnalysis:
302 from ActsConfig.ActsAnalysisConfig import ActsTrackAnalysisAlgCfg
303 acc.merge(ActsTrackAnalysisAlgCfg(flags,
304 name=f"{flags.Tracking.ActiveConfig.extension}TrackAnalysisAlg",
305 TracksLocation=f"{flags.Tracking.ActiveConfig.extension}Tracks"))
306
307 # Seed To Track Monitoring
308 DetectorElementsKeys=seedOrder(flags, pixel=pixelDetElements, strip=stripDetElements)
309 if len(kwargs["SeedContainerKeys"]) != len(DetectorElementsKeys):
310 raise AttributeError("SeedContainerKeys and DetectorElementsKeys must have same size")
311
312 for i in range(0, len(kwargs["SeedContainerKeys"])):
313 seedKey = kwargs["SeedContainerKeys"][i]
314 detElKey = DetectorElementsKeys[i]
315
316 # make seed params
317 from ActsConfig.ActsAnalysisConfig import ActsBaseSeedsToTrackParamsAlgCfg
318 acc.merge(ActsBaseSeedsToTrackParamsAlgCfg(flags,
319 name = f'{seedKey}SeedsToTrackParamsAlg',
320 InputSeedContainerKey = seedKey,
321 DetectorElementsKey = detElKey,
322 OutputTrackParamsCollectionKey = f'{seedKey}Params'))
323
324 from ActsConfig.ActsAnalysisConfig import ActsSeedToTrackAnalysisAlgCfg
325 acc.merge(ActsSeedToTrackAnalysisAlgCfg(flags,
326 name = f'{seedKey}ToTrackAnalysisAlg',
327 InputSeedCollection = seedKey,
328 InputTrackParamsCollection = f'{seedKey}Params',
329 InputDestinyCollection = f'{seedKey}Destiny'))
330
331 # Persistification
332 if flags.Acts.EDM.PersistifyTracks:
333 trackColl = kwargs['ACTSTracksLocation']
334 from ActsConfig.ActsTrackFindingConfig import ActsToXAODTrackConverterAlgCfg
335 acc.merge(ActsToXAODTrackConverterAlgCfg(flags,
336 name = f'{trackColl}ToXAODConverterAlg',
337 InputActsTracksLocation = trackColl,
338 OutputActsTracksLocation = trackColl))
339
340 prefix = f"{flags.Tracking.ActiveConfig.extension}"
341 from ActsConfig.ActsPersistificationConfig import PersistifyTracks
342 acc.merge(PersistifyTracks(flags,
343 extensions=[prefix]))
344
345 return acc
346
347
348def ActsTrackFindingGNNCfg(flags, **kwargs) -> ComponentAccumulator:
349 acc = ComponentAccumulator()
350
351 # This is added in the seeding step of the CKF chain...
352 from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
353 acc.merge(BeamSpotCondAlgCfg(flags))
354
355 # Adopt standard convention
356 kwargs.setdefault('ACTSTracksLocation', f"{flags.Tracking.ActiveConfig.extension}Tracks")
357
358 kwargs.setdefault("moduleMapPath", flags.Acts.GNN.ModuleMapPath)
359 kwargs.setdefault("gnnPath", flags.Acts.GNN.ModelPath)
360 kwargs.setdefault("numTrtContexts", flags.Acts.GNN.NumTrtContexts)
361 kwargs.setdefault("maxGpuInstances", flags.Acts.GNN.MaxGpuInstances)
362 kwargs.setdefault("varianceInflation", flags.Acts.GNN.VarianceInflation)
363 kwargs.setdefault("tightSeeds", flags.Acts.GNN.TightSeeds)
364 kwargs.setdefault("edgeCut", flags.Acts.GNN.EdgeCut)
365 kwargs.setdefault("minCandidateMeasurements", flags.Acts.GNN.MinCandidateMeasurements)
366 kwargs.setdefault("minDeltaR", flags.Acts.GNN.MinDeltaR)
367 kwargs.setdefault("relaxCentralHoleSel", flags.Acts.GNN.RelaxCentralHoleSel)
368 kwargs.setdefault("relaxMeasurementSel", flags.Acts.GNN.RelaxMeasurementSel)
369 kwargs.setdefault("offlineZ0Sel", flags.Acts.GNN.OfflineZ0Sel)
370
371 # Wire parameter estimation and fitter tools like the main Acts path
372 if 'TrackParamsEstimationTool' not in kwargs:
373 from ActsConfig.ActsTrackParamsEstimationConfig import ActsTrackParamsEstimationToolCfg
374 kwargs.setdefault('TrackParamsEstimationTool', acc.popToolsAndMerge(ActsTrackParamsEstimationToolCfg(flags)))
375
376 if 'FitterTool' not in kwargs:
377 from ActsConfig.ActsTrackFittingConfig import ActsFitterCfg
378 kwargs.setdefault('FitterTool', acc.popToolsAndMerge(ActsFitterCfg(flags, ReverseFilteringPt=0, OutlierChi2Cut=float('inf'))))
379
380 if 'TrackingGeometryTool' not in kwargs:
381 from ActsConfig.ActsGeometryConfig import ActsTrackingGeometryToolCfg
382 kwargs.setdefault(
383 "TrackingGeometryTool",
384 acc.getPrimaryAndMerge(ActsTrackingGeometryToolCfg(flags)),
385 )
386
387 if 'ExtrapolationTool' not in kwargs:
388 from ActsConfig.ActsGeometryConfig import ActsExtrapolationToolCfg
389 kwargs.setdefault(
390 "ExtrapolationTool",
391 acc.popToolsAndMerge(ActsExtrapolationToolCfg(flags, MaxSteps=10000)),
392 )
393
394 acc.addEventAlgo(
395 CompFactory.ActsTrk.TrackFindingGNNAlg("TrackFindingGNNAlg", **kwargs)
396 )
397
398 return acc
399
400
401
402
404 name: str = "ActsScoreBasedAmbiguityResolutionAlg",
405 **kwargs) -> ComponentAccumulator:
406 acc = ComponentAccumulator()
407
408 kwargs.setdefault('TracksLocation', 'ActsTracks')
409 kwargs.setdefault('ResolvedTracksLocation', 'ActsResolvedTracks')
410 kwargs.setdefault('MinScore',1.0)
411 kwargs.setdefault('MinScoreSharedTracks', 1.0)
412 kwargs.setdefault('MaxSharedTracksPerMeasurement', 20)
413 kwargs.setdefault('MaxShared', 5)
414 kwargs.setdefault('MinUnshared', 5)
415 kwargs.setdefault('UseAmbiguityScoring', True)
416 kwargs.setdefault('jsonFileName', 'ActsAmbiguityConfig.json')
417
418 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
419 from ActsConfig.ActsMonitoringConfig import ActsAmbiguityResolutionMonitoringToolCfg
420 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
421 ActsAmbiguityResolutionMonitoringToolCfg(flags)))
422
423 acc.addEventAlgo(
424 CompFactory.ActsTrk.ScoreBasedAmbiguityResolutionAlg(name, **kwargs))
425 return acc
426
427
429 name: str = "ActsAmbiguityResolutionAlg",
430 **kwargs) -> ComponentAccumulator:
431 acc = ComponentAccumulator()
432
433 kwargs.setdefault('TracksLocation', 'ActsTracks')
434 kwargs.setdefault('ResolvedTracksLocation', 'ActsResolvedTracks')
435 kwargs.setdefault('MaximumSharedHits', 3)
436 kwargs.setdefault('MaximumIterations', 10000)
437 kwargs.setdefault('NMeasurementsMin', 7)
438
439 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
440 from ActsConfig.ActsMonitoringConfig import ActsAmbiguityResolutionMonitoringToolCfg
441 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
442 ActsAmbiguityResolutionMonitoringToolCfg(flags)))
443
444 acc.addEventAlgo(
445 CompFactory.ActsTrk.AmbiguityResolutionAlg(name, **kwargs))
446 return acc
447
448
450 **kwargs) -> ComponentAccumulator:
451 acc = ComponentAccumulator()
452 kwargs.setdefault('TracksLocation', f"{flags.Tracking.ActiveConfig.extension}Tracks")
453 kwargs.setdefault('ResolvedTracksLocation', f"{flags.Tracking.ActiveConfig.extension}ResolvedTracks")
454 from ActsConfig.ActsConfigFlags import AmbiguitySolverStrategy
455
456 if flags.Acts.AmbiguitySolverStrategy is AmbiguitySolverStrategy.ScoreBased:
458 name=f"{flags.Tracking.ActiveConfig.extension}ScoreBasedAmbiguityResolutionAlg",
459 **kwargs))
460 else:
461 acc.merge(ActsMainAmbiguityResolutionAlgCfg(flags,
462 name=f"{flags.Tracking.ActiveConfig.extension}AmbiguityResolutionAlg",
463 **kwargs))
464 # Analysis extensions
465 if flags.Acts.Tracks.doAnalysis:
466 from ActsConfig.ActsAnalysisConfig import ActsTrackAnalysisAlgCfg
467 acc.merge(ActsTrackAnalysisAlgCfg(flags,
468 name=f"{flags.Tracking.ActiveConfig.extension}ResolvedTrackAnalysisAlg",
469 TracksLocation=f"{flags.Tracking.ActiveConfig.extension}ResolvedTracks"))
470
471 # Persistification
472 if flags.Acts.EDM.PersistifyTracks:
473 trackColl = kwargs['ResolvedTracksLocation']
474 from ActsConfig.ActsTrackFindingConfig import ActsToXAODTrackConverterAlgCfg
475 acc.merge(ActsToXAODTrackConverterAlgCfg(flags,
476 name = f'{trackColl}ToXAODConverterAlg',
477 InputActsTracksLocation = trackColl,
478 OutputActsTracksLocation = trackColl))
479
480 prefix = f"{flags.Tracking.ActiveConfig.extension}Resolved"
481 from ActsConfig.ActsPersistificationConfig import PersistifyTracks
482 acc.merge(PersistifyTracks(flags,
483 extensions=[prefix]))
484
485 return acc
486
488 name: str = "ActsTrackToTrackParticleCnvTool",
489 **kwargs) -> ComponentAccumulator:
490 acc = ComponentAccumulator()
491
492 # To produce AtlasFieldCacheCondObj
493 from MagFieldServices.MagFieldServicesConfig import (
494 AtlasFieldCacheCondAlgCfg)
495 acc.merge(AtlasFieldCacheCondAlgCfg(flags))
496
497 from ActsConfig.ActsGeometryConfig import ActsExtrapolationToolCfg
498 kwargs.setdefault('ExtrapolationTool', acc.popToolsAndMerge(ActsExtrapolationToolCfg(flags)) )
499 from ActsConfig.ActsGeometryConfig import ActsTrackingGeometryToolCfg
500 kwargs.setdefault("TrackingGeometryTool", acc.getPrimaryAndMerge(ActsTrackingGeometryToolCfg(flags)))
501 kwargs.setdefault('FirstAndLastParameterOnly',True)
502 kwargs.setdefault('ComputeExpectedLayerPattern',True)
503 kwargs.setdefault('HgtdDecorationLevel', 0 if not flags.Acts.useHGTDClusterInTrackFinding else 1 if not flags.PhysVal.IDPVM.doExpertOutput else 200 )
504
505 acc.setPrivateTools(CompFactory.ActsTrk.TrackToTrackParticleCnvTool(name, **kwargs))
506 return acc
507
508
510 name: str = "ActsTrackToTrackParticleCnvAlg",
511 **kwargs) -> ComponentAccumulator:
512 acc = ComponentAccumulator()
513
514 # Beam Spot Cond is a requirement
515 from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
516 acc.merge(BeamSpotCondAlgCfg(flags))
517
518 # Configure TrackToTrackParticleConvTool
519 tool_kwargs = {}
520 if "ExtrapolationTool" in kwargs:
521 tool_kwargs["ExtrapolationTool"] = kwargs.pop("ExtrapolationTool")
522 if "FirstAndLastParameterOnly" in kwargs:
523 tool_kwargs["FirstAndLastParameterOnly"] = kwargs.pop("FirstAndLastParameterOnly")
524 if "ComputeExpectedLayerPattern" in kwargs:
525 tool_kwargs["ComputeExpectedLayerPattern"] = kwargs.pop("ComputeExpectedLayerPattern")
526 if "MuonSummaryTool" in kwargs:
527 tool_kwargs["MuonSummaryTool"] = kwargs.pop("MuonSummaryTool")
528 if 'TrackToTrackParticleCnvTool' not in kwargs:
529 kwargs['TrackToTrackParticleCnvTool'] = acc.popToolsAndMerge(
530 ActsTrackToTrackParticleCnvToolCfg(flags, **tool_kwargs))
531
532 kwargs.setdefault('BeamSpotKey', 'BeamSpotData')
533 kwargs.setdefault("PerigeeExpression", flags.Tracking.perigeeExpression)
534 kwargs.setdefault('VertexContainerKey', 'PrimaryVertices')
535
536 acc.addEventAlgo(
537 CompFactory.ActsTrk.TrackToTrackParticleCnvAlg(name, **kwargs))
538
539 return acc
540
542 name: str = "ActsToXAODTrackConverterAlg",
543 **kwargs) -> ComponentAccumulator:
544 acc = ComponentAccumulator()
545
546 kwargs.setdefault('InputActsTracksLocation', '')
547 kwargs.setdefault('OutputActsTracksLocation', '')
548
549 if 'TrackingGeometryTool' not in kwargs:
550 from ActsConfig.ActsGeometryConfig import ActsTrackingGeometryToolCfg
551 kwargs.setdefault('TrackingGeometryTool', acc.getPrimaryAndMerge(ActsTrackingGeometryToolCfg(flags)))
552
553 acc.addEventAlgo(CompFactory.ActsTrk.ActsToXAODTrackConverterAlg(name, **kwargs))
554 return acc
ComponentAccumulator ActsTrackToTrackParticleCnvAlgCfg(flags, str name="ActsTrackToTrackParticleCnvAlg", **kwargs)
list seedOrder(flags, *, list pixel=None, list strip=None)
ComponentAccumulator ActsToXAODTrackConverterAlgCfg(flags, str name="ActsToXAODTrackConverterAlg", **kwargs)
ComponentAccumulator ActsTrackStatePrinterToolCfg(flags, str name="ActsTrackStatePrinterTool", **kwargs)
ComponentAccumulator ActsTrackToTrackParticleCnvToolCfg(flags, str name="ActsTrackToTrackParticleCnvTool", **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)