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 kwargs.setdefault('DetectorElementsKeys', seedOrder(flags, pixel=['ITkPixelDetectorElementCollection'], strip=['ITkStripDetectorElementCollection']))
92 if flags.Acts.Tracks.doAnalysis:
93 kwargs.setdefault("SeedDestiny", [f'{seedkey}Destiny' for seedkey in kwargs["SeedContainerKeys"]])
94
95 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"]))
96
97 kwargs.setdefault('ACTSTracksLocation', 'ActsTracks')
98
99 kwargs.setdefault("maxPropagationStep", 10000)
100 kwargs.setdefault("skipDuplicateSeeds", flags.Acts.skipDuplicateSeeds)
101 kwargs.setdefault("seedMeasOffset", 1)
102
103 # Ambi strategy 0 means do the ambiguity resolution outside the track finding.
104 kwargs.setdefault("ambiStrategy", flags.Acts.AmbiguitySolverMode.value)
105
106 if (not flags.Acts.doAmbiguityResolution) :
107 kwargs.setdefault("MaximumSharedHits", 3)
108 kwargs.setdefault("MaximumIterations", 10000)
109 kwargs.setdefault("NMeasurementsMin", 7)
110
111 kwargs.setdefault("refitSeeds", seedOrder(flags, pixel=[False], strip=[False]))
112 kwargs.setdefault("doTwoWay", flags.Acts.doTwoWayCKF)
113 kwargs.setdefault("autoReverseSearch", flags.Acts.autoReverseSearchCKF)
114 # forceTrackOnSeed isn't effective with secondary passes, which will have removed most/all of the seed measurements from the measurement containers.
115 kwargs.setdefault("forceTrackOnSeed", flags.Acts.forceTrackOnSeed and not flags.Tracking.ActiveConfig.isSecondaryPass)
116
117 # Borrow many settings from flags.Tracking.ActiveConfig, normally initialised in createITkTrackingPassFlags() at
118 # https://gitlab.cern.ch/atlas/athena/-/blob/main/Tracking/TrkConfig/python/TrackingPassFlags.py#L121
119
120 # bins in |eta|, used for both MeasurementSelectorConfig and TrackSelector::EtaBinnedConfig
121 if flags.Detector.GeometryITk:
122 kwargs.setdefault("etaBins", flags.Tracking.ActiveConfig.etaBins)
123 # new default chi2 cuts optimise efficiency vs speed. Set same value as Athena's Xi2maxNoAdd.
124 kwargs.setdefault("chi2CutOff", flags.Tracking.ActiveConfig.Xi2max)
125 kwargs.setdefault("chi2OutlierCutOff", flags.Tracking.ActiveConfig.Xi2maxNoAdd)
126
127 kwargs.setdefault("branchStopperPtMinFactor", 0.9)
128 kwargs.setdefault("branchStopperAbsEtaMaxExtra", 0.1)
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.Acts.SeedingStrategy is not SeedingStrategy.Gbts2:
159 kwargs.setdefault("ptMinMeasurements", seedOrder(flags, pixel=[3], strip=[6]))
160 kwargs.setdefault("absEtaMaxMeasurements", seedOrder(flags, pixel=[3], strip=[999999]))
161
162 if 'TrackingGeometryTool' not in kwargs:
163 from ActsConfig.ActsGeometryConfig import ActsTrackingGeometryToolCfg
164 kwargs.setdefault(
165 "TrackingGeometryTool",
166 acc.getPrimaryAndMerge(ActsTrackingGeometryToolCfg(flags)),
167 )
168
169 if 'ATLASConverterTool' not in kwargs:
170 from ActsConfig.ActsEventCnvConfig import ActsToTrkConverterToolCfg
171 kwargs.setdefault('ATLASConverterTool', acc.popToolsAndMerge(ActsToTrkConverterToolCfg(flags)))
172
173 if 'TrackParamsEstimationTool' not in kwargs:
174 from ActsConfig.ActsTrackParamsEstimationConfig import ActsTrackParamsEstimationToolCfg
175
176 tpe_tool_kwargs = {}
177 if flags.Tracking.ActiveConfig.extension in ['ActsLargeRadius', 'ActsValidateLargeRadiusStandalone']:
178 tpe_tool_kwargs["allowPropagatorFailure"] = True
179
180 kwargs.setdefault('TrackParamsEstimationTool', acc.popToolsAndMerge(ActsTrackParamsEstimationToolCfg(flags, **tpe_tool_kwargs)))
181
182 if 'ExtrapolationTool' not in kwargs:
183 from ActsConfig.ActsGeometryConfig import ActsExtrapolationToolCfg
184 kwargs.setdefault(
185 "ExtrapolationTool",
186 acc.popToolsAndMerge(ActsExtrapolationToolCfg(flags, MaxSteps=10000)),
187 )
188
189 if flags.Acts.doPrintTrackStates and 'TrackStatePrinter' not in kwargs:
190 kwargs.setdefault(
191 "TrackStatePrinter",
192 acc.popToolsAndMerge(ActsTrackStatePrinterToolCfg(flags)),
193 )
194
195 if 'FitterTool' not in kwargs:
196 from ActsConfig.ActsTrackFittingConfig import ActsFitterCfg
197 kwargs.setdefault(
198 'FitterTool',
199 acc.popToolsAndMerge(ActsFitterCfg(flags,
200 ReverseFilteringPt=0,
201 OutlierChi2Cut=float('inf')))
202 )
203
204 if 'PixelCalibrator' not in kwargs:
205 from AthenaConfiguration.Enums import BeamType
206
207 if not (flags.Beam.Type is BeamType.Cosmics):
208 from ActsConfig.ActsConfigFlags import PixelCalibrationStrategy
209 from ActsConfig.ActsMeasurementCalibrationConfig import ActsAnalogueClusteringToolCfg
210
211 if flags.Acts.PixelCalibrationStrategy in (PixelCalibrationStrategy.AnalogueClustering,
212 PixelCalibrationStrategy.AnalogueClusteringAfterSelection) :
213
214 kwargs.setdefault(
215 'PixelCalibrator',
216 acc.popToolsAndMerge(ActsAnalogueClusteringToolCfg(flags,
217 CalibrateAfterMeasurementSelection = flags.Acts.PixelCalibrationStrategy is PixelCalibrationStrategy.AnalogueClusteringAfterSelection))
218 )
219
220 if 'StripCalibrator' not in kwargs:
221 from AthenaConfiguration.Enums import BeamType
222 if not (flags.Beam.Type is BeamType.Cosmics):
223 from ActsConfig.ActsMeasurementCalibrationConfig import ActsStripCalibrationToolCfg
224 from ActsConfig.ActsConfigFlags import StripCalibrationStrategy
225
226 if flags.Acts.StripCalibrationStrategy in (StripCalibrationStrategy.DigitalCalibration,
227 StripCalibrationStrategy.DigitalCalibrationAfterSelection) :
228
229 kwargs.setdefault(
230 'StripCalibrator',
231 acc.popToolsAndMerge(ActsStripCalibrationToolCfg(flags,
232 CalibrateAfterMeasurementSelection = flags.Acts.StripCalibrationStrategy is StripCalibrationStrategy.DigitalCalibrationAfterSelection))
233 )
234
235
236 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
237 from ActsConfig.ActsMonitoringConfig import ActsTrackFindingMonitoringToolCfg
238 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
239 ActsTrackFindingMonitoringToolCfg(flags)))
240
241 acc.addEventAlgo(CompFactory.ActsTrk.TrackFindingAlg(name, **kwargs))
242 return acc
243
244
245
247 **kwargs) -> ComponentAccumulator:
248 acc = ComponentAccumulator()
249
250 # Define Uncalibrated Measurement keys
251 dataPrepPrefix = f'{flags.Tracking.ActiveConfig.extension.replace("Acts", "")}'
252 if not flags.Tracking.ActiveConfig.isSecondaryPass:
253 dataPrepPrefix = ''
254 pixelClusters = f'ITk{dataPrepPrefix}PixelClusters'
255 stripClusters = f'ITk{dataPrepPrefix}StripClusters'
256 hgtdClusters = f'{dataPrepPrefix}HGTD_Clusters'
257 # If cache is activated the keys have "_Cached" as postfix
258 if flags.Acts.useCache:
259 pixelClusters += '_Cached'
260 stripClusters += '_Cached'
261 # Consider case detectors are not active
262
263 # Understand what are the seeds we need to consider
264 pixelSeedLabels = ['PPP']
265 stripSeedLabels = ['SSS']
266 # Conversion and LRT do not process pixel seeds
267 from InDetConfig.ITkActsHelpers import isFastPrimaryPass
268 if flags.Tracking.ActiveConfig.extension in ['ActsConversion', 'ActsLargeRadius', 'ActsValidateLargeRadiusStandalone']:
269 pixelSeedLabels = None
270 # Main pass does not process strip seeds in the fast tracking configuration
271 elif isFastPrimaryPass(flags):
272 stripSeedLabels = None
273
274 # Now set the seed and estimated parameters keys accordingly
275 pixelSeedKeys = [f'{flags.Tracking.ActiveConfig.extension}PixelSeeds']
276 stripSeedKeys = [f'{flags.Tracking.ActiveConfig.extension}StripSeeds']
277 pixelDetElements = ['ITkPixelDetectorElementCollection']
278 stripDetElements = ['ITkStripDetectorElementCollection']
279
280 pixelRefit = [False]
281 stripRefit = [False]
282 if flags.Tracking.ActiveConfig.extension in ['ActsLargeRadius', 'ActsValidateLargeRadiusStandalone']:
283 stripRefit = [True]
284
285 if pixelSeedLabels is None:
286 pixelSeedKeys = None
287 pixelDetElements = None
288 pixelRefit = None
289 if stripSeedLabels is None:
290 stripSeedKeys = None
291 stripDetElements = None
292 stripRefit = None
293
294 kwargs.setdefault('ACTSTracksLocation', f"{flags.Tracking.ActiveConfig.extension}Tracks")
295 kwargs.setdefault('UncalibratedMeasurementContainerKeys', isdet(flags, pixel=[pixelClusters], strip=[stripClusters], hgtd=[hgtdClusters]))
296 kwargs.setdefault('SeedLabels', seedOrder(flags, pixel=pixelSeedLabels, strip=stripSeedLabels))
297 kwargs.setdefault('SeedContainerKeys', seedOrder(flags, pixel=pixelSeedKeys, strip=stripSeedKeys))
298 kwargs.setdefault('DetectorElementsKeys', seedOrder(flags, pixel=pixelDetElements, strip=stripDetElements))
299 kwargs.setdefault("refitSeeds", seedOrder(flags, pixel=pixelRefit, strip=stripRefit))
300
301 acc.merge(ActsMainTrackFindingAlgCfg(flags,
302 name=f"{flags.Tracking.ActiveConfig.extension}TrackFindingAlg",
303 **kwargs))
304
305 # Analysis extensions
306 if flags.Acts.Tracks.doAnalysis:
307 from ActsConfig.ActsAnalysisConfig import ActsTrackAnalysisAlgCfg
308 acc.merge(ActsTrackAnalysisAlgCfg(flags,
309 name=f"{flags.Tracking.ActiveConfig.extension}TrackAnalysisAlg",
310 TracksLocation=f"{flags.Tracking.ActiveConfig.extension}Tracks"))
311
312 # Seed To Track Monitoring
313 if len(kwargs["SeedContainerKeys"]) != len(kwargs["DetectorElementsKeys"]):
314 raise AttributeError("SeedContainerKeys and DetectorElementsKeys must have same size")
315
316 for i in range(0, len(kwargs["SeedContainerKeys"])):
317 seedKey = kwargs["SeedContainerKeys"][i]
318 detElKey = kwargs["DetectorElementsKeys"][i]
319
320 # make seed params
321 from ActsConfig.ActsAnalysisConfig import ActsBaseSeedsToTrackParamsAlgCfg
322 acc.merge(ActsBaseSeedsToTrackParamsAlgCfg(flags,
323 name = f'{seedKey}SeedsToTrackParamsAlg',
324 InputSeedContainerKey = seedKey,
325 DetectorElementsKey = detElKey,
326 OutputTrackParamsCollectionKey = f'{seedKey}Params'))
327
328 from ActsConfig.ActsAnalysisConfig import ActsSeedToTrackAnalysisAlgCfg
329 acc.merge(ActsSeedToTrackAnalysisAlgCfg(flags,
330 name = f'{seedKey}ToTrackAnalysisAlg',
331 InputSeedCollection = seedKey,
332 InputTrackParamsCollection = f'{seedKey}Params',
333 InputDestinyCollection = f'{seedKey}Destiny'))
334
335 # Persistification
336 if flags.Acts.EDM.PersistifyTracks:
337 trackColl = kwargs['ACTSTracksLocation']
338 from ActsConfig.ActsTrackFindingConfig import ActsToXAODTrackConverterAlgCfg
339 acc.merge(ActsToXAODTrackConverterAlgCfg(flags,
340 name = f'{trackColl}ToXAODConverterAlg',
341 InputActsTracksLocation = trackColl,
342 OutputActsTracksLocation = trackColl))
343
344 toAOD = []
345 prefix = f"{flags.Tracking.ActiveConfig.extension}"
346 toAOD += [f"xAOD::TrackSummaryContainer#{prefix}TrackSummary",
347 f"xAOD::TrackSummaryAuxContainer#{prefix}TrackSummaryAux.",
348 f"xAOD::TrackStateContainer#{prefix}TrackStates",
349 f"xAOD::TrackStateAuxContainer#{prefix}TrackStatesAux.-uncalibratedMeasurement",
350 f"xAOD::TrackParametersContainer#{prefix}TrackParameters",
351 f"xAOD::TrackParametersAuxContainer#{prefix}TrackParametersAux.",
352 f"xAOD::TrackJacobianContainer#{prefix}TrackJacobians",
353 f"xAOD::TrackJacobianAuxContainer#{prefix}TrackJacobiansAux.",
354 f"xAOD::TrackMeasurementContainer#{prefix}TrackMeasurements",
355 f"xAOD::TrackMeasurementAuxContainer#{prefix}TrackMeasurementsAux.",
356 f"xAOD::TrackSurfaceContainer#{prefix}TrackStateSurfaces",
357 f"xAOD::TrackSurfaceAuxContainer#{prefix}TrackStateSurfacesAux.",
358 f"xAOD::TrackSurfaceContainer#{prefix}TrackSurfaces",
359 f"xAOD::TrackSurfaceAuxContainer#{prefix}TrackSurfacesAux."]
360 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD
361 acc.merge(addToAOD(flags, toAOD))
362
363 return acc
364
365
367 name: str = "ActsScoreBasedAmbiguityResolutionAlg",
368 **kwargs) -> ComponentAccumulator:
369 acc = ComponentAccumulator()
370
371 kwargs.setdefault('TracksLocation', 'ActsTracks')
372 kwargs.setdefault('ResolvedTracksLocation', 'ActsResolvedTracks')
373 kwargs.setdefault('MinScore',1.0)
374 kwargs.setdefault('MinScoreSharedTracks', 1.0)
375 kwargs.setdefault('MaxSharedTracksPerMeasurement', 20)
376 kwargs.setdefault('MaxShared', 5)
377 kwargs.setdefault('MinUnshared', 5)
378 kwargs.setdefault('UseAmbiguityScoring', True)
379 kwargs.setdefault('jsonFileName', 'ActsAmbiguityConfig.json')
380
381 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
382 from ActsConfig.ActsMonitoringConfig import ActsAmbiguityResolutionMonitoringToolCfg
383 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
384 ActsAmbiguityResolutionMonitoringToolCfg(flags)))
385
386 acc.addEventAlgo(
387 CompFactory.ActsTrk.ScoreBasedAmbiguityResolutionAlg(name, **kwargs))
388 return acc
389
390
392 name: str = "ActsAmbiguityResolutionAlg",
393 **kwargs) -> ComponentAccumulator:
394 acc = ComponentAccumulator()
395
396 kwargs.setdefault('TracksLocation', 'ActsTracks')
397 kwargs.setdefault('ResolvedTracksLocation', 'ActsResolvedTracks')
398 kwargs.setdefault('MaximumSharedHits', 3)
399 kwargs.setdefault('MaximumIterations', 10000)
400 kwargs.setdefault('NMeasurementsMin', 7)
401
402 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
403 from ActsConfig.ActsMonitoringConfig import ActsAmbiguityResolutionMonitoringToolCfg
404 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
405 ActsAmbiguityResolutionMonitoringToolCfg(flags)))
406
407 acc.addEventAlgo(
408 CompFactory.ActsTrk.AmbiguityResolutionAlg(name, **kwargs))
409 return acc
410
411
413 **kwargs) -> ComponentAccumulator:
414 acc = ComponentAccumulator()
415 kwargs.setdefault('TracksLocation', f"{flags.Tracking.ActiveConfig.extension}Tracks")
416 kwargs.setdefault('ResolvedTracksLocation', f"{flags.Tracking.ActiveConfig.extension}ResolvedTracks")
417 from ActsConfig.ActsConfigFlags import AmbiguitySolverStrategy
418
419 if flags.Acts.AmbiguitySolverStrategy is AmbiguitySolverStrategy.ScoreBased:
421 name=f"{flags.Tracking.ActiveConfig.extension}ScoreBasedAmbiguityResolutionAlg",
422 **kwargs))
423 else:
424 acc.merge(ActsMainAmbiguityResolutionAlgCfg(flags,
425 name=f"{flags.Tracking.ActiveConfig.extension}AmbiguityResolutionAlg",
426 **kwargs))
427 # Analysis extensions
428 if flags.Acts.Tracks.doAnalysis:
429 from ActsConfig.ActsAnalysisConfig import ActsTrackAnalysisAlgCfg
430 acc.merge(ActsTrackAnalysisAlgCfg(flags,
431 name=f"{flags.Tracking.ActiveConfig.extension}ResolvedTrackAnalysisAlg",
432 TracksLocation=f"{flags.Tracking.ActiveConfig.extension}ResolvedTracks"))
433
434 # Persistification
435 if flags.Acts.EDM.PersistifyTracks:
436 trackColl = kwargs['ResolvedTracksLocation']
437 from ActsConfig.ActsTrackFindingConfig import ActsToXAODTrackConverterAlgCfg
438 acc.merge(ActsToXAODTrackConverterAlgCfg(flags,
439 name = f'{trackColl}ToXAODConverterAlg',
440 InputActsTracksLocation = trackColl,
441 OutputActsTracksLocation = trackColl))
442
443 toAOD = []
444 prefix = f"{flags.Tracking.ActiveConfig.extension}Resolved"
445 toAOD += [f"xAOD::TrackSummaryContainer#{prefix}TrackSummary",
446 f"xAOD::TrackSummaryAuxContainer#{prefix}TrackSummaryAux.",
447 f"xAOD::TrackStateContainer#{prefix}TrackStates",
448 f"xAOD::TrackStateAuxContainer#{prefix}TrackStatesAux.-uncalibratedMeasurement",
449 f"xAOD::TrackParametersContainer#{prefix}TrackParameters",
450 f"xAOD::TrackParametersAuxContainer#{prefix}TrackParametersAux.",
451 f"xAOD::TrackJacobianContainer#{prefix}TrackJacobians",
452 f"xAOD::TrackJacobianAuxContainer#{prefix}TrackJacobiansAux.",
453 f"xAOD::TrackMeasurementContainer#{prefix}TrackMeasurements",
454 f"xAOD::TrackMeasurementAuxContainer#{prefix}TrackMeasurementsAux.",
455 f"xAOD::TrackSurfaceContainer#{prefix}TrackStateSurfaces",
456 f"xAOD::TrackSurfaceAuxContainer#{prefix}TrackStateSurfacesAux.",
457 f"xAOD::TrackSurfaceContainer#{prefix}TrackSurfaces",
458 f"xAOD::TrackSurfaceAuxContainer#{prefix}TrackSurfacesAux."]
459 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD
460 acc.merge(addToAOD(flags, toAOD))
461
462 return acc
463
465 name: str = "ActsTrackToTrackParticleCnvAlg",
466 **kwargs) -> ComponentAccumulator:
467 acc = ComponentAccumulator()
468
469 # Beam Spot Cond is a requirement
470 from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
471 acc.merge(BeamSpotCondAlgCfg(flags))
472
473 if 'ExtrapolationTool' not in kwargs:
474 from ActsConfig.ActsGeometryConfig import ActsExtrapolationToolCfg
475 kwargs.setdefault('ExtrapolationTool', acc.popToolsAndMerge(ActsExtrapolationToolCfg(flags)) )
476
477 kwargs.setdefault('BeamSpotKey', 'BeamSpotData')
478 kwargs.setdefault('FirstAndLastParameterOnly',True)
479 kwargs.setdefault('ComputeExpectedLayerPattern',True)
480
481 det_elements=[]
482 element_types=[]
483 if flags.Detector.EnableITkPixel:
484 det_elements += ['ITkPixelDetectorElementCollection']
485 element_types += [1]
486 if flags.Detector.EnableITkStrip:
487 det_elements += ['ITkStripDetectorElementCollection']
488 element_types += [2]
489
490 kwargs.setdefault('SiDetectorElementCollections',det_elements)
491 kwargs.setdefault('SiDetEleCollToMeasurementType',element_types)
492 kwargs.setdefault("PerigeeExpression", flags.Tracking.perigeeExpression)
493 kwargs.setdefault('VertexContainerKey', 'PrimaryVertices')
494 acc.addEventAlgo(
495 CompFactory.ActsTrk.TrackToTrackParticleCnvAlg(name, **kwargs))
496
497 return acc
498
500 name: str = "ActsToXAODTrackConverterAlg",
501 **kwargs) -> ComponentAccumulator:
502 acc = ComponentAccumulator()
503
504 kwargs.setdefault('InputActsTracksLocation', '')
505 kwargs.setdefault('OutputActsTracksLocation', '')
506
507 if 'TrackingGeometryTool' not in kwargs:
508 from ActsConfig.ActsGeometryConfig import ActsTrackingGeometryToolCfg
509 kwargs.setdefault('TrackingGeometryTool', acc.getPrimaryAndMerge(ActsTrackingGeometryToolCfg(flags)))
510
511 acc.addEventAlgo(CompFactory.ActsTrk.ActsToXAODTrackConverterAlg(name, **kwargs))
512 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 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 ActsAmbiguityResolutionCfg(flags, **kwargs)