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 # The LRT second pass carries the whole inward leg, where the hits run out
110 # at the displaced origin. Measured on the other passes it is a ~1% effect.
111 kwargs.setdefault("doSecondPassBranchStopper", flags.Tracking.ActiveConfig.isLargeD0)
112 # drop the track states on material-only surfaces: nothing downstream reads them, and the CKF is faster without
113 kwargs.setdefault("recordMaterialStates", False)
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 # chi2 cuts in sigma of a 1D Gaussian, converted to the same p-value for each measurement dimension
124 kwargs.setdefault("chi2CutOffSigma", flags.Tracking.ActiveConfig.Xi2maxSigma)
125 kwargs.setdefault("chi2OutlierCutOffSigma", flags.Tracking.ActiveConfig.Xi2maxNoAddSigma)
126
127 kwargs.setdefault("branchStopperPtMinFactor", 0.9)
128 kwargs.setdefault("branchStopperAbsEtaMaxExtra", 0.1)
129 if flags.Tracking.ActiveConfig.isLargeD0:
130 # cut on the pT of the LRT strip seed parameters, from the KF prefit or the calibrated estimate
131 kwargs.setdefault("seedPtMinFactor", 0.9)
132
133 doBremRecovery = kwargs.setdefault(
134 "doBremRecovery",
135 flags.Acts.doBremRecovery
136 and flags.Tracking.ActiveConfig.doBremRecoverySi
137 and flags.Tracking.doCaloSeededBrem)
138 if doBremRecovery:
139 from InDetConfig.InDetCaloClusterROISelectorConfig import (
140 ITkCaloClusterROIPhiRZContainerMakerCfg,
141 )
142 acc.merge(ITkCaloClusterROIPhiRZContainerMakerCfg(flags))
143 kwargs.setdefault("phiWidthROI", flags.Acts.phiWidthROI)
144 kwargs.setdefault("etaWidthROI", flags.Acts.etaWidthROI)
145 kwargs.setdefault("bremMaxComponents", flags.Acts.GsfMaxComponents)
146 kwargs.setdefault("bremWeightCutoff", flags.Acts.GsfWeightCutoff)
147 kwargs.setdefault("bremMergeMethod", flags.Acts.GsfComponentMergeMethod)
148 # Loosen the requirement on the minimum number of measurements on track candidate
149 # during track finding for tracks above a certain eta
150 kwargs.setdefault("branchStopperMeasCutReduce", flags.Acts.branchStopperMeasCutReduce)
151 kwargs.setdefault("branchStopperAbsEtaMeasCut", flags.Acts.branchStopperAbsEtaMeasCut)
152
153 kwargs.setdefault("numMeasurementsCutOff", [1])
154
155 # there is always an over and underflow bin so the first bin will be 0. - 0.5 the last bin 3.5 - inf.
156 # if all eta bins are >=0. the counter will be categorized by abs(eta) otherwise eta
157 kwargs.setdefault("StatisticEtaBins", [eta/10. for eta in range(5, 40, 5)]) # eta 0.0 - 4.0 in steps of 0.5
158
159 kwargs.setdefault("absEtaMax", flags.Tracking.ActiveConfig.maxEta)
160 kwargs.setdefault("ptMin", [p / Units.GeV * UnitConstants.GeV for p in tolist(flags.Tracking.ActiveConfig.minPT)])
161 # 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.
162 kwargs.setdefault("z0Min", [-flags.Tracking.ActiveConfig.maxZImpactSeed / Units.mm * UnitConstants.mm for etabin in flags.Tracking.ActiveConfig.etaBins[:-1]])
163 kwargs.setdefault("z0Max", [ flags.Tracking.ActiveConfig.maxZImpactSeed / Units.mm * UnitConstants.mm for etabin in flags.Tracking.ActiveConfig.etaBins[:-1]])
164 kwargs.setdefault("d0Min", [-d0 / Units.mm * UnitConstants.mm for d0 in tolist(flags.Tracking.ActiveConfig.maxPrimaryImpact)])
165 kwargs.setdefault("d0Max", [ d0 / Units.mm * UnitConstants.mm for d0 in tolist(flags.Tracking.ActiveConfig.maxPrimaryImpact)])
166 kwargs.setdefault("minMeasurements", tolist(flags.Tracking.ActiveConfig.minClusters))
167 kwargs.setdefault("maxHoles", tolist(flags.Tracking.ActiveConfig.maxHoles))
168 kwargs.setdefault("maxOutliers", tolist(flags.Tracking.ActiveConfig.maxOutliers))
169 if flags.Tracking.ActiveConfig.maxHolesAndOutliers:
170 kwargs.setdefault("maxHolesAndOutliers", tolist(flags.Tracking.ActiveConfig.maxHolesAndOutliers))
171 kwargs.setdefault("minPixelHits", tolist(flags.Tracking.ActiveConfig.minPixel))
172 kwargs.setdefault("maxPixelHoles", tolist(flags.Tracking.ActiveConfig.maxPixelHoles))
173 kwargs.setdefault("maxStripHoles", tolist(flags.Tracking.ActiveConfig.maxSctHoles))
174 # The shared hits are not calculated until *after* the track selection, so maxSharedHits is not used.
175 # Even if that were not the case, we need the ambiguity solver to decide which track to drop.
176
177
178 # GBTS produces much purer seeds, so the branch stopper selections aren't needed with GBTS seeds.
179 if flags.Tracking.ActiveConfig.PixelSeedingStrategy is not SeedingStrategy.Gbts:
180 kwargs.setdefault("ptMinMeasurements", seedOrder(flags, pixel=[3], strip=[6]))
181 kwargs.setdefault("absEtaMaxMeasurements", seedOrder(flags, pixel=[3], strip=[999999]))
182
183 if 'TrackParamsEstimationTool' not in kwargs:
184 from ActsConfig.ActsTrackParamsEstimationConfig import ActsTrackParamsEstimationToolCfg
185
186 # set TrackParamsEstimationTool in case not defined by caller
187 tpe_tool_kwargs = {}
188 if flags.Tracking.ActiveConfig.isLargeD0:
189 tpe_tool_kwargs["allowPropagatorFailure"] = True
190 tpe_tool_kwargs["stripCalibrationIterations"] = flags.Acts.stripCalibrationIterations
191 tpe = acc.popToolsAndMerge(ActsTrackParamsEstimationToolCfg(flags, **tpe_tool_kwargs))
192
193 kwargs.setdefault('TrackParamsEstimationTool', seedOrder(flags, pixel=[tpe], strip=[tpe]))
194
195 if flags.Acts.doPrintTrackStates and 'TrackStatePrinter' not in kwargs:
196 kwargs.setdefault(
197 "TrackStatePrinter",
198 acc.popToolsAndMerge(ActsTrackStatePrinterToolCfg(flags)),
199 )
200
201 if 'PixelCalibrator' not in kwargs:
202 from AthenaConfiguration.Enums import BeamType
203
204 if flags.Beam.Type is not BeamType.Cosmics and flags.Acts.PixelCalibrationStrategy.usesCalibration():
205 from ActsConfig.ActsMeasurementCalibrationConfig import ActsPixelCalibrationToolCfg
206
207 kwargs.setdefault(
208 'PixelCalibrator',
209 acc.popToolsAndMerge(ActsPixelCalibrationToolCfg(flags))
210 )
211
212 if 'StripCalibrator' not in kwargs:
213 from AthenaConfiguration.Enums import BeamType
214
215 if flags.Beam.Type is not BeamType.Cosmics and flags.Acts.StripCalibrationStrategy.usesCalibration():
216 from ActsConfig.ActsMeasurementCalibrationConfig import ActsStripCalibrationToolCfg
217
218 kwargs.setdefault(
219 'StripCalibrator',
220 acc.popToolsAndMerge(ActsStripCalibrationToolCfg(flags))
221 )
222
223
224 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
225 from ActsConfig.ActsMonitoringConfig import ActsTrackFindingMonitoringToolCfg
226 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
227 ActsTrackFindingMonitoringToolCfg(flags)))
228
229 acc.addEventAlgo(CompFactory.ActsTrk.TrackFindingAlg(name, **kwargs))
230 return acc
231
232
233
235 **kwargs) -> ComponentAccumulator:
236 acc = ComponentAccumulator()
237
238 # Define Uncalibrated Measurement keys
239 dataPrepPrefix = f'{flags.Tracking.ActiveConfig.extension.replace("Acts", "")}'
240 if not flags.Tracking.ActiveConfig.isSecondaryPass:
241 dataPrepPrefix = ''
242 pixelClusters = f'ITk{dataPrepPrefix}PixelClusters'
243 stripClusters = f'ITk{dataPrepPrefix}StripClusters'
244 hgtdClusters = f'{dataPrepPrefix}HGTD_Clusters'
245 # If cache is activated the keys have "_Cached" as postfix
246 if flags.Acts.useCache:
247 pixelClusters += '_Cached'
248 stripClusters += '_Cached'
249 # Consider case detectors are not active
250
251 # Understand what are the seeds we need to consider
252 pixelSeedLabels = ['PPP']
253 stripSeedLabels = ['SSS']
254 if not flags.Tracking.ActiveConfig.useITkPixelSeeding:
255 pixelSeedLabels = None
256 if not flags.Tracking.ActiveConfig.useITkStripSeeding:
257 stripSeedLabels = None
258
259 # Now set the seed and estimated parameters keys accordingly
260 pixelSeedKeys = [f'{flags.Tracking.ActiveConfig.extension}PixelSeeds']
261 stripSeedKeys = [f'{flags.Tracking.ActiveConfig.extension}StripSeeds']
262 pixelDetElements = ['ITkPixelDetectorElementCollection']
263 stripDetElements = ['ITkStripDetectorElementCollection']
264
265 tpe_tool_kwargs = {}
266 if flags.Tracking.ActiveConfig.isLargeD0:
267 tpe_tool_kwargs["allowPropagatorFailure"] = True
268 tpe_tool_kwargs["stripCalibrationIterations"] = flags.Acts.stripCalibrationIterations
269
270 if pixelSeedLabels is None:
271 pixelSeedKeys = None
272 pixelDetElements = None
273 pixelTpe = None
274 elif 'TrackParamsEstimationTool' not in kwargs:
275 from ActsConfig.ActsTrackParamsEstimationConfig import ActsTrackParamsEstimationToolCfg
276 pixelTpe = [acc.popToolsAndMerge(ActsTrackParamsEstimationToolCfg(flags, "PixelTrackParamsEstimationTool", **tpe_tool_kwargs))]
277
278 if stripSeedLabels is None:
279 stripSeedKeys = None
280 stripDetElements = None
281 stripTpe = None
282 elif 'TrackParamsEstimationTool' not in kwargs:
283 from ActsConfig.ActsTrackParamsEstimationConfig import ActsTrackParamsEstimationToolCfg
284 if flags.Tracking.ActiveConfig.isLargeD0 and flags.Acts.LrtStripSeedRefit:
285 tpe_tool_kwargs["refitSeeds"] = True
286 stripTpe = [acc.popToolsAndMerge(ActsTrackParamsEstimationToolCfg(flags, "StripTrackParamsEstimationTool", **tpe_tool_kwargs))]
287
288 kwargs.setdefault("TrackParamsEstimationTool", seedOrder(flags, pixel=pixelTpe, strip=stripTpe))
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
294 acc.merge(ActsMainTrackFindingAlgCfg(flags,
295 name=f"{flags.Tracking.ActiveConfig.extension}TrackFindingAlg",
296 **kwargs))
297
298 # Analysis extensions
299 if flags.Acts.Tracks.doAnalysis:
300 from ActsConfig.ActsAnalysisConfig import ActsTrackAnalysisAlgCfg
301 acc.merge(ActsTrackAnalysisAlgCfg(flags,
302 name=f"{flags.Tracking.ActiveConfig.extension}TrackAnalysisAlg",
303 TracksLocation=f"{flags.Tracking.ActiveConfig.extension}Tracks"))
304
305 # Seed To Track Monitoring
306 DetectorElementsKeys=seedOrder(flags, pixel=pixelDetElements, strip=stripDetElements)
307 if len(kwargs["SeedContainerKeys"]) != len(DetectorElementsKeys):
308 raise AttributeError("SeedContainerKeys and DetectorElementsKeys must have same size")
309
310 for i in range(0, len(kwargs["SeedContainerKeys"])):
311 seedKey = kwargs["SeedContainerKeys"][i]
312 detElKey = DetectorElementsKeys[i]
313
314 # make seed params
315 from ActsConfig.ActsAnalysisConfig import ActsBaseSeedsToTrackParamsAlgCfg
316 acc.merge(ActsBaseSeedsToTrackParamsAlgCfg(flags,
317 name = f'{seedKey}SeedsToTrackParamsAlg',
318 InputSeedContainerKey = seedKey,
319 DetectorElementsKey = detElKey,
320 OutputTrackParamsCollectionKey = f'{seedKey}Params'))
321
322 from ActsConfig.ActsAnalysisConfig import ActsSeedToTrackAnalysisAlgCfg
323 acc.merge(ActsSeedToTrackAnalysisAlgCfg(flags,
324 name = f'{seedKey}ToTrackAnalysisAlg',
325 InputSeedCollection = seedKey,
326 InputTrackParamsCollection = f'{seedKey}Params',
327 InputDestinyCollection = f'{seedKey}Destiny'))
328
329 # Persistification
330 if flags.Acts.EDM.PersistifyTracks or flags.Output.doWriteESD:
331 trackColl = kwargs['ACTSTracksLocation']
332 from ActsConfig.ActsEventCnvConfig import ActsToXAODTrackConverterAlgCfg
333 acc.merge(ActsToXAODTrackConverterAlgCfg(flags,
334 name = f'{trackColl}ToXAODConverterAlg',
335 InputActsTracksLocation = trackColl,
336 OutputActsTracksLocation = trackColl))
337
338 prefix = f"{flags.Tracking.ActiveConfig.extension}"
339 from ActsConfig.ActsPersistificationConfig import PersistifyTracks
340 acc.merge(PersistifyTracks(flags,
341 extensions=[prefix]))
342
343 return acc
344
345
347 name: str = "GnnPipelineTool",
348 **kwargs) -> ComponentAccumulator:
349 acc = ComponentAccumulator()
350
351 kwargs.setdefault('moduleMapPath', flags.Acts.GNN.ModuleMapPath)
352 kwargs.setdefault('gnnPath', flags.Acts.GNN.ModelPath)
353 kwargs.setdefault('numTrtContexts', flags.Acts.GNN.NumTrtContexts)
354 kwargs.setdefault('maxGpuInstances', flags.Acts.GNN.MaxGpuInstances)
355 kwargs.setdefault('edgeCut', flags.Acts.GNN.EdgeCut)
356 kwargs.setdefault('minCandidateMeasurements', flags.Acts.GNN.MinCandidateMeasurements)
357 kwargs.setdefault('numFeatures', flags.Acts.GNN.NumFeatures)
358
359 acc.setPrivateTools(CompFactory.ActsTrk.GnnPipelineTool(name, **kwargs))
360 return acc
361
362def ActsTrackFindingGNNCfg(flags, **kwargs) -> ComponentAccumulator:
363 acc = ComponentAccumulator()
364
365 # This is added in the seeding step of the CKF chain...
366 from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
367 acc.merge(BeamSpotCondAlgCfg(flags))
368
369 # Adopt standard convention
370 kwargs.setdefault('ACTSTracksLocation', f"{flags.Tracking.ActiveConfig.extension}Tracks")
371
372 # The GNN inference (graph construction, edge classification, track building)
373 if 'GnnPipelineTool' not in kwargs:
374 kwargs.setdefault('GnnPipelineTool', acc.popToolsAndMerge(
375 ActsGnnPipelineToolCfg(flags, name="GnnPipeline")))
376
377 kwargs.setdefault("varianceInflation", flags.Acts.GNN.VarianceInflation)
378 kwargs.setdefault("tightSeeds", flags.Acts.GNN.TightSeeds)
379 kwargs.setdefault("relaxCentralHoleSel", flags.Acts.GNN.RelaxCentralHoleSel)
380 kwargs.setdefault("relaxMeasurementSel", flags.Acts.GNN.RelaxMeasurementSel)
381 kwargs.setdefault("offlineZ0Sel", flags.Acts.GNN.OfflineZ0Sel)
382
383 # Wire parameter estimation and fitter tools like the main Acts path
384 if 'TrackParamsEstimationTool' not in kwargs:
385 from ActsConfig.ActsTrackParamsEstimationConfig import ActsTrackParamsEstimationToolCfg
386 kwargs.setdefault('TrackParamsEstimationTool', acc.popToolsAndMerge(ActsTrackParamsEstimationToolCfg(
387 flags, parameterEstimationMode=flags.Acts.GNN.ParameterEstimationMode.value)))
388
389 # The fitter tool is used in the GNN track finding to fit the track candidates after the GNN has selected the measurements.
390 if 'FitterTool' not in kwargs:
391 from ActsConfig.ActsTrackFittingConfig import ActsFitterCfg
392 kwargs.setdefault('FitterTool', acc.popToolsAndMerge(ActsFitterCfg(flags,
393 ReverseFilteringPt=0,
394 OutlierChi2Cut=float('inf'))))
395
396 from ActsAlignmentAlgs.AlignmentAlgsConfig import ActsGeometryContextAlgCfg
397 from ActsConfig.ActsGeometryConfig import ActsTrackingGeometrySvcCfg
398 acc.merge(ActsGeometryContextAlgCfg(flags))
399 acc.merge(ActsTrackingGeometrySvcCfg(flags))
400
401 acc.addEventAlgo(
402 CompFactory.ActsTrk.TrackFindingGNNAlg("TrackFindingGNNAlg", **kwargs)
403 )
404
405 return acc
406
407
408
409
411 name: str = "ActsScoreBasedAmbiguityResolutionAlg",
412 **kwargs) -> ComponentAccumulator:
413 acc = ComponentAccumulator()
414
415 kwargs.setdefault('TracksLocation', 'ActsTracks')
416 kwargs.setdefault('ResolvedTracksLocation', 'ActsResolvedTracks')
417 kwargs.setdefault('MinScore',1.0)
418 kwargs.setdefault('MinScoreSharedTracks', 1.0)
419 kwargs.setdefault('MaxSharedTracksPerMeasurement', 20)
420 kwargs.setdefault('MaxShared', 5)
421 kwargs.setdefault('MinUnshared', 5)
422 kwargs.setdefault('UseAmbiguityScoring', True)
423 kwargs.setdefault('jsonFileName', 'ActsAmbiguityConfig.json')
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.ScoreBasedAmbiguityResolutionAlg(name, **kwargs))
432 return acc
433
434
436 name: str = "ActsAmbiguityResolutionAlg",
437 **kwargs) -> ComponentAccumulator:
438 acc = ComponentAccumulator()
439
440 kwargs.setdefault('TracksLocation', 'ActsTracks')
441 kwargs.setdefault('ResolvedTracksLocation', 'ActsResolvedTracks')
442 kwargs.setdefault('MaximumSharedHits', 3)
443 kwargs.setdefault('MaximumIterations', 10000)
444 kwargs.setdefault('NMeasurementsMin', 7)
445
446 if flags.Acts.doMonitoring and 'MonTool' not in kwargs:
447 from ActsConfig.ActsMonitoringConfig import ActsAmbiguityResolutionMonitoringToolCfg
448 kwargs.setdefault('MonTool', acc.popToolsAndMerge(
449 ActsAmbiguityResolutionMonitoringToolCfg(flags)))
450
451 acc.addEventAlgo(
452 CompFactory.ActsTrk.AmbiguityResolutionAlg(name, **kwargs))
453 return acc
454
455
457 **kwargs) -> ComponentAccumulator:
458 acc = ComponentAccumulator()
459 kwargs.setdefault('TracksLocation', f"{flags.Tracking.ActiveConfig.extension}Tracks")
460 kwargs.setdefault('ResolvedTracksLocation', f"{flags.Tracking.ActiveConfig.extension}ResolvedTracks")
461 from ActsConfig.ActsConfigFlags import AmbiguitySolverStrategy
462
463 if flags.Acts.AmbiguitySolverStrategy is AmbiguitySolverStrategy.ScoreBased:
465 name=f"{flags.Tracking.ActiveConfig.extension}ScoreBasedAmbiguityResolutionAlg",
466 **kwargs))
467 else:
468 acc.merge(ActsMainAmbiguityResolutionAlgCfg(flags,
469 name=f"{flags.Tracking.ActiveConfig.extension}AmbiguityResolutionAlg",
470 **kwargs))
471 # Analysis extensions
472 if flags.Acts.Tracks.doAnalysis:
473 from ActsConfig.ActsAnalysisConfig import ActsTrackAnalysisAlgCfg
474 acc.merge(ActsTrackAnalysisAlgCfg(flags,
475 name=f"{flags.Tracking.ActiveConfig.extension}ResolvedTrackAnalysisAlg",
476 TracksLocation=f"{flags.Tracking.ActiveConfig.extension}ResolvedTracks"))
477
478 # Persistification
479 if flags.Acts.EDM.PersistifyTracks or flags.Output.doWriteESD:
480 trackColl = kwargs['ResolvedTracksLocation']
481 from ActsConfig.ActsEventCnvConfig import ActsToXAODTrackConverterAlgCfg
482 acc.merge(ActsToXAODTrackConverterAlgCfg(flags,
483 name = f'{trackColl}ToXAODConverterAlg',
484 InputActsTracksLocation = trackColl,
485 OutputActsTracksLocation = trackColl))
486
487 prefix = f"{flags.Tracking.ActiveConfig.extension}Resolved"
488 from ActsConfig.ActsPersistificationConfig import PersistifyTracks
489 acc.merge(PersistifyTracks(flags,
490 extensions=[prefix]))
491
492 return acc
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)