21 from TrkConfig.TrkConfigFlags
import TrackingComponent
22 validation_configurations = {
23 TrackingComponent.ActsValidateClusters :
"ActsValidateClusters",
24 TrackingComponent.ActsValidateLargeRadiusStandalone:
"ActsValidateLargeRadiusStandalone",
25 TrackingComponent.ActsValidateTracks :
"ActsValidateTracks",
26 TrackingComponent.ActsValidateAmbiguityResolution :
"ActsValidateAmbiguityResolution",
27 TrackingComponent.ActsValidateF100 :
"ActsValidateF100",
28 TrackingComponent.ActsValidateF150 :
"ActsValidateF150",
32 if TrackingComponent.AthenaChain
in flags.Tracking.recoChain:
33 flags_set += [flags.cloneAndReplace(
34 "Tracking.ActiveConfig",
35 f
"Tracking.{flags.Tracking.ITkPrimaryPassConfig.value}Pass")]
38 if TrackingComponent.ActsLegacyChain
in flags.Tracking.recoChain:
39 flags_set += [flags.cloneAndReplace(
40 "Tracking.ActiveConfig",
41 "Tracking.ITkActsLegacyPass")]
44 if TrackingComponent.ActsChain
in flags.Tracking.recoChain:
45 flags_set += [flags.cloneAndReplace(
46 "Tracking.ActiveConfig",
47 "Tracking.ITkActsPass")]
50 if TrackingComponent.ActsHeavyIon
in flags.Tracking.recoChain:
51 flags_set += [flags.cloneAndReplace(
52 "Tracking.ActiveConfig",
53 "Tracking.ITkActsHeavyIonPass")]
56 if TrackingComponent.GNNChain
in flags.Tracking.recoChain:
57 flags_set += [flags.cloneAndReplace(
58 "Tracking.ActiveConfig",
59 "Tracking.ITkGNNPass")]
62 if flags.Detector.EnableCalo
and flags.Acts.doITkConversion:
63 flags_set += [flags.cloneAndReplace(
64 "Tracking.ActiveConfig",
65 "Tracking.ITkActsConversionPass")]
68 if flags.Acts.doLargeRadius:
69 flags_set += [flags.cloneAndReplace(
70 "Tracking.ActiveConfig",
71 "Tracking.ITkActsLargeRadiusPass")]
74 if flags.Acts.doLowPt:
75 flags_set += [flags.cloneAndReplace(
76 "Tracking.ActiveConfig",
77 "Tracking.ITkActsLowPtPass")]
80 for [configuration, key]
in validation_configurations.items():
81 if configuration
in flags.Tracking.recoChain:
82 toAdd = eval(f
"flags.cloneAndReplace('Tracking.ActiveConfig', 'Tracking.ITk{key}Pass')")
86 if flags.Detector.EnableCalo
and flags.Tracking.doITkConversion:
87 flagsConv = flags.cloneAndReplace(
"Tracking.ActiveConfig",
88 "Tracking.ITkConversionPass")
89 flags_set += [flagsConv]
92 if flags.Tracking.doLargeD0:
93 if flags.Tracking.useITkFTF:
94 flagsLRT = flags.cloneAndReplace(
"Tracking.ActiveConfig",
95 "Tracking.ITkFTFLargeD0Pass")
96 elif flags.Tracking.doITkFastTracking:
97 flagsLRT = flags.cloneAndReplace(
"Tracking.ActiveConfig",
98 "Tracking.ITkLargeD0FastPass")
100 flagsLRT = flags.cloneAndReplace(
"Tracking.ActiveConfig",
101 "Tracking.ITkLargeD0Pass")
102 flags_set += [flagsLRT]
105 if TrackingComponent.FPGAChain
in flags.Tracking.recoChain:
106 flags_set += [flags.cloneAndReplace(
107 "Tracking.ActiveConfig",
108 "Tracking.ITkFPGAPass")]
111 if flags.Tracking.doLowPt:
112 flagsLowPt = flags.cloneAndReplace(
"Tracking.ActiveConfig",
113 "Tracking.ITkLowPtPass")
114 flags_set += [flagsLowPt]
116 _flags_set = flags_set
129 TrackContainer: str =
"",
130 ClusterSplitProbContainer: str =
"") -> ComponentAccumulator:
131 result = ComponentAccumulator()
132 extension = flags.Tracking.ActiveConfig.extension
133 doTrackOverlay = flags.TrackOverlay.isTrackOverlaySeq
136 InputTracks = [flags.Overlay.SigPrefix+TrackContainer,
137 flags.Overlay.BkgPrefix+TrackContainer]
138 AssociationMapName = (
"PRDtoTrackMapMerge_Resolved" +
139 extension +
"Tracks")
140 MergerOutputTracks = TrackContainer
142 from TrkConfig.TrkTrackCollectionMergerConfig
import TrackCollectionMergerAlgCfg
143 result.merge(TrackCollectionMergerAlgCfg(
145 name=
"TrackCollectionMergerAlgCfg"+extension,
146 InputCombinedTracks=InputTracks,
147 OutputCombinedTracks=MergerOutputTracks,
148 AssociationMapName=AssociationMapName))
151 if flags.Tracking.doTruth
and extension
not in _actsExtensions:
152 from InDetConfig.ITkTrackTruthConfig
import ITkTrackTruthCfg
153 result.merge(ITkTrackTruthCfg(
155 Tracks=TrackContainer,
156 DetailedTruth=TrackContainer+
"DetailedTruth",
157 TracksTruth=TrackContainer+
"TruthCollection"))
161 if extension
not in _actsExtensions:
163 from xAODTrackingCnv.xAODTrackingCnvConfig
import ITkTrackParticleCnvAlgCfg
164 result.merge(ITkTrackParticleCnvAlgCfg(
166 name=extension +
"TrackParticleCnvAlg",
167 TrackContainerName=TrackContainer,
168 xAODTrackParticlesFromTracksContainerName=(
169 "InDet" + extension +
"TrackParticles"),
170 ClusterSplitProbabilityName=(
171 "" if flags.Tracking.doITkFastTracking
else
172 ClusterSplitProbContainer),
173 AssociationMapName=
""))
176 from ActsConfig.ActsTrackFindingConfig
import ActsTrackToTrackParticleCnvAlgCfg
178 prefix = flags.Tracking.ActiveConfig.extension
179 result.merge(ActsTrackToTrackParticleCnvAlgCfg(flags, f
"{prefix}ResolvedTrackToAltTrackParticleCnvAlg",
180 ACTSTracksLocation=[TrackContainer],
181 TrackParticlesOutKey=f
'InDet{prefix}TrackParticles'))
183 if flags.Tracking.doTruth :
184 from ActsConfig.ActsTruthConfig
import ActsTrackParticleTruthDecorationAlgCfg
185 result.merge(ActsTrackParticleTruthDecorationAlgCfg(flags,
186 name=f
'{TrackContainer}ParticleTruthDecorationAlg',
187 TrackToTruthAssociationMaps = [f
'{TrackContainer}ToTruthParticleAssociation'],
188 TrackParticleContainerName = f
'InDet{prefix}TrackParticles'
195 previousActsExtension: str =
None,
196 InputCombinedITkTracks: list[str] =
None,
197 InputCombinedActsTracks: list[str] =
None,
198 InputExtendedITkTracks: list[str] =
None,
199 StatTrackCollections: list[str] =
None,
200 StatTrackTruthCollections: list[str] =
None,
201 ClusterSplitProbContainer: str =
""):
204 assert InputCombinedITkTracks
is not None and isinstance(InputCombinedITkTracks, list)
205 assert InputCombinedActsTracks
is not None and isinstance(InputCombinedActsTracks, list)
206 assert InputExtendedITkTracks
is not None and isinstance(InputExtendedITkTracks, list)
207 assert StatTrackCollections
is not None and isinstance(StatTrackCollections, list)
208 assert StatTrackTruthCollections
is not None and isinstance(StatTrackTruthCollections ,list)
211 extension = flags.Tracking.ActiveConfig.extension
213 result = ComponentAccumulator()
216 doTrackOverlay = flags.TrackOverlay.isTrackOverlaySeq
217 TrackContainer =
"Resolved" + extension +
"Tracks"
219 if extension
in _actsExtensions:
220 TrackContainer = extension +
"ResolvedTracks" if flags.Acts.doAmbiguityResolution
else extension +
"Tracks"
221 if doTrackOverlay
and extension ==
"Conversion":
222 TrackContainer = flags.Overlay.SigPrefix + TrackContainer
225 SiSPSeededTracks =
"SiSPSeeded" + extension +
"Tracks"
227 if extension
in _actsExtensions:
228 SiSPSeededTracks = extension +
"Tracks"
231 from InDetConfig.ITkTrackingSiPatternConfig
import ITkTrackingSiPatternCfg
232 result.merge(ITkTrackingSiPatternCfg(
234 previousActsExtension=previousActsExtension,
235 InputCollections=InputExtendedITkTracks,
236 ResolvedTrackCollectionKey=TrackContainer,
237 SiSPSeededTrackCollectionKey=SiSPSeededTracks,
238 ClusterSplitProbContainer=ClusterSplitProbContainer))
239 StatTrackCollections += [SiSPSeededTracks, TrackContainer]
240 StatTrackTruthCollections += [SiSPSeededTracks+
"TruthCollection",
241 TrackContainer+
"TruthCollection"]
243 if doTrackOverlay
and extension ==
"Conversion":
244 TrackContainer =
"Resolved" + extension +
"Tracks"
247 TrackContainer=TrackContainer,
248 ClusterSplitProbContainer=ClusterSplitProbContainer))
250 if flags.Tracking.ActiveConfig.storeSeparateContainer:
256 inputTrack = TrackContainer
257 if extension
in _actsExtensions
and not flags.Tracking.ActiveConfig.doActsAmbiguityResolution:
258 inputTrack = SiSPSeededTracks
262 TrackContainer=inputTrack,
263 ClusterSplitProbContainer=ClusterSplitProbContainer))
267 ClusterSplitProbContainer = (
268 "ITkAmbiguityProcessorSplitProb" + extension)
271 if extension
not in _actsExtensions:
272 InputCombinedITkTracks += [TrackContainer]
274 InputCombinedActsTracks += [TrackContainer]
278 if extension
not in _actsExtensions:
279 InputExtendedITkTracks += [TrackContainer]
281 return result, ClusterSplitProbContainer
285 InputCombinedITkTracks: list[str] =
None,
286 ActsTrackContainerName=
"InDetActsTrackParticles") -> ComponentAccumulator:
288 assert InputCombinedITkTracks
is not None and isinstance(InputCombinedITkTracks, list)
290 acc = ComponentAccumulator()
291 if len(InputCombinedITkTracks) == 0:
295 from ActsConfig.ActsTrackFindingConfig
import ActsTrackToTrackParticleCnvAlgCfg
296 acc.merge(ActsTrackToTrackParticleCnvAlgCfg(flags,
"ActsCombinedTrackToTrackParticleCnvAlg",
297 ACTSTracksLocation=InputCombinedITkTracks,
298 TrackParticlesOutKey=ActsTrackContainerName))
299 if flags.Tracking.doTruth :
300 from ActsConfig.ActsTruthConfig
import ActsTrackParticleTruthDecorationAlgCfg
301 track_to_truth_maps=[]
302 for track_container
in InputCombinedITkTracks :
303 track_to_truth_maps += [f
'{track_container}ToTruthParticleAssociation']
307 acc.merge(ActsTrackParticleTruthDecorationAlgCfg(
309 name=f
'{ActsTrackContainerName}TruthDecorationAlg',
310 TrackToTruthAssociationMaps = track_to_truth_maps,
311 TrackParticleContainerName = ActsTrackContainerName,
312 OutputLevel=WARNING
if len(InputCombinedITkTracks)==1
else INFO,
313 ComputeTrackRecoEfficiency=
False if len(InputCombinedITkTracks)==1
else True
318 InputCombinedITkTracks: list[str] =
None,
319 StatTrackCollections: list[str] =
None,
320 StatTrackTruthCollections: list[str] =
None):
322 assert InputCombinedITkTracks
is not None and isinstance(InputCombinedITkTracks, list)
323 assert StatTrackCollections
is not None and isinstance(StatTrackCollections, list)
324 assert StatTrackTruthCollections
is not None and isinstance(StatTrackTruthCollections, list)
327 result = ComponentAccumulator()
328 if len(InputCombinedITkTracks) == 0:
331 doTrackOverlay = flags.TrackOverlay.isTrackOverlaySeq
332 TrackContainer =
"CombinedITkTracks"
335 InputCombinedITkTracks += [flags.Overlay.BkgPrefix + TrackContainer]
337 from TrkConfig.TrkConfigFlags
import TrackingComponent
338 doGNNWithoutAmbiReso = (TrackingComponent.GNNChain
in flags.Tracking.recoChain
and (
not flags.Tracking.GNN.doAmbiResolution))
339 skipClusterMerge = doGNNWithoutAmbiReso
or flags.Tracking.doITkFastTracking
341 from TrkConfig.TrkTrackCollectionMergerConfig
import (
342 ITkTrackCollectionMergerAlgCfg)
343 result.merge(ITkTrackCollectionMergerAlgCfg(
345 InputCombinedTracks=InputCombinedITkTracks,
346 OutputCombinedTracks=TrackContainer,
348 "" if skipClusterMerge
else
349 f
"PRDtoTrackMapMerge_{TrackContainer}")))
351 if flags.Tracking.doTruth:
352 from InDetConfig.ITkTrackTruthConfig
import ITkTrackTruthCfg
353 result.merge(ITkTrackTruthCfg(
355 Tracks=TrackContainer,
356 DetailedTruth=f
"{TrackContainer}DetailedTruth",
357 TracksTruth=f
"{TrackContainer}TruthCollection"))
359 StatTrackCollections += [TrackContainer]
360 StatTrackTruthCollections += [f
"{TrackContainer}TruthCollection"]
362 if flags.Tracking.doSlimming:
363 from TrkConfig.TrkTrackSlimmerConfig
import TrackSlimmerCfg
364 result.merge(TrackSlimmerCfg(
366 TrackLocation=[TrackContainer]))
371 if flags.Tracking.perigeeExpression ==
"BeamLine":
372 from xAODTrackingCnv.xAODTrackingCnvConfig
import ITkTrackParticleCnvAlgCfg
373 result.merge(ITkTrackParticleCnvAlgCfg(
375 ClusterSplitProbabilityName=(
376 "" if skipClusterMerge
else
379 "" if skipClusterMerge
else
380 f
"PRDtoTrackMapMerge_{TrackContainer}"),
381 isActsAmbi =
'ActsValidateResolvedTracks' in splitProbName
or \
382 'ActsValidateAmbiguityResolution' in splitProbName
or \
383 'ActsValidateScoreBasedAmbiguityResolution' in splitProbName
or \
384 'ActsConversion' in splitProbName
or \
385 'ActsLargeRadius' in splitProbName
or \
386 'ActsValidateLargeRadiusStandalone' in splitProbName
or \
387 'ActsLowPt' in splitProbName
or \
388 (
'Acts' in splitProbName
and 'Validate' not in splitProbName) ))
394 StatTrackTruthCollections=None):
395 result = ComponentAccumulator()
397 from InDetConfig.InDetRecStatisticsConfig
import (
398 ITkRecStatisticsAlgCfg)
399 result.merge(ITkRecStatisticsAlgCfg(
401 TrackCollectionKeys=StatTrackCollections,
402 TrackTruthCollectionKeys=(
403 StatTrackTruthCollections
if flags.Tracking.doTruth
else [])))
405 if flags.Tracking.doTruth:
406 from InDetConfig.InDetTrackClusterAssValidationConfig
import (
407 ITkTrackClusterAssValidationCfg)
408 result.merge(ITkTrackClusterAssValidationCfg(
410 TracksLocation=StatTrackCollections))
425 result = ComponentAccumulator()
427 if flags.Tracking.doTIDE_AmbiTrackMonitoring:
428 from InDetConfig.InDetPrepRawDataToxAODConfig
import (
429 ITkPixelPrepDataToxAOD_ExtraTruthCfg
as PixelPrepDataToxAODCfg,
430 ITkStripPrepDataToxAOD_ExtraTruthCfg
as StripPrepDataToxAODCfg)
432 from InDetConfig.InDetPrepRawDataToxAODConfig
import (
433 ITkPixelPrepDataToxAODCfg
as PixelPrepDataToxAODCfg,
434 ITkStripPrepDataToxAODCfg
as StripPrepDataToxAODCfg)
436 result.merge(PixelPrepDataToxAODCfg(
438 ClusterSplitProbabilityName=(
439 "" if flags.Tracking.doITkFastTracking
else
441 result.merge(StripPrepDataToxAODCfg(flags))
443 from DerivationFrameworkInDet.InDetToolsConfig
import (
444 ITkTSOS_CommonKernelCfg)
449 listOfExtensionsRequesting = [
450 e
for e
in _extensions_list
if (e ==
'')
451 or (flags.Tracking[f
"ITk{e}Pass"].storeTrackSeeds)
452 or (flags.Tracking[f
"ITk{e}Pass"].storeSiSPSeededTracks)
453 or (flags.Tracking[f
"ITk{e}Pass"].storeSeparateContainer) ]
455 result.merge(ITkTSOS_CommonKernelCfg(
456 flags, listOfExtensions = listOfExtensionsRequesting))
458 if flags.Tracking.doStoreTrackSeeds:
459 from DerivationFrameworkInDet.InDetToolsConfig
import (
460 ITkSiSPSeedsTSOS_CommonKernelCfg)
462 listOfExtensionsRequesting = [
463 e
for e
in _extensions_list
if (e ==
'')
or
464 flags.Tracking[f
"ITk{e}Pass"].storeTrackSeeds ]
465 result.merge(ITkSiSPSeedsTSOS_CommonKernelCfg(
466 flags, listOfExtensions = listOfExtensionsRequesting))
468 if flags.Tracking.doStoreSiSPSeededTracks:
469 listOfExtensionsRequesting = [
470 e
for e
in _extensions_list
if (e==
'')
or
471 flags.Tracking[f
"ITk{e}Pass"].storeSiSPSeededTracks ]
472 from DerivationFrameworkInDet.InDetToolsConfig
import (
473 ITkSiSPTSOS_CommonKernelCfg)
474 result.merge(ITkSiSPTSOS_CommonKernelCfg(flags, listOfExtensions = listOfExtensionsRequesting))
477 listOfExtensionsRequesting = [
478 e
for e
in _extensions_list
if (e==
'')
or
479 (flags.Tracking[f
"ITk{e}Pass"].storeSiSPSeededTracks
and
480 flags.Tracking[f
"ITk{e}Pass"].storeSeparateContainer) ]
481 from InDetPhysValMonitoring.InDetPhysValDecorationConfig
import (
482 ITkPhysHitDecoratorAlgCfg)
483 for extension
in listOfExtensionsRequesting:
484 result.merge(ITkPhysHitDecoratorAlgCfg(
486 name=f
"ITkPhysHit{extension}DecoratorAlg",
487 TrackParticleContainerName=f
"InDet{extension}TrackParticles"))
498 """Configures complete ITk tracking """
500 from InDetConfig.ITkActsHelpers
import primaryPassUsesActs
501 if primaryPassUsesActs(flags):
502 from InDetConfig.ITkActsTrackRecoConfig
import ITkActsTrackRecoCfg
503 return ITkActsTrackRecoCfg(flags)
505 result = ComponentAccumulator()
507 if flags.Input.Format
is Format.BS:
509 raise RuntimeError(
"ByteStream inputs not supported")
518 InputCombinedITkTracks = []
520 InputCombinedActsTracks = []
522 InputExtendedITkTracks = []
524 ClusterSplitProbContainer =
""
526 StatTrackCollections = []
527 StatTrackTruthCollections = []
529 previousActsExtension =
None
531 from InDetConfig.SiliconPreProcessing
import ITkRecPreProcessingSiliconCfg
533 for current_flags
in flags_set:
534 printActiveConfig(current_flags)
537 extension = current_flags.Tracking.ActiveConfig.extension
538 if extension
not in _actsExtensions:
539 _extensions_list.append(extension)
542 _outputExtensions.append(extension)
550 result.merge(ITkRecPreProcessingSiliconCfg(current_flags,
551 previousActsExtension=previousActsExtension))
562 previousActsExtension,
563 InputCombinedITkTracks=InputCombinedITkTracks,
564 InputCombinedActsTracks=InputCombinedActsTracks,
565 InputExtendedITkTracks=InputExtendedITkTracks,
566 StatTrackCollections=StatTrackCollections,
567 StatTrackTruthCollections=StatTrackTruthCollections,
568 ClusterSplitProbContainer=ClusterSplitProbContainer)
572 if 'Acts' in extension:
573 previousActsExtension = extension
577 if InputCombinedITkTracks:
581 InputCombinedITkTracks=InputCombinedITkTracks,
582 StatTrackCollections=StatTrackCollections,
583 StatTrackTruthCollections=StatTrackTruthCollections))
589 if InputCombinedActsTracks:
595 ActsTrackContainerName =
"InDetTrackParticles" if not InputCombinedITkTracks
else "InDetActsTrackParticles"
596 ActsPrimaryVertices =
"PrimaryVertices" if not InputCombinedITkTracks
else "ActsPrimaryVertices"
599 InputCombinedITkTracks=InputCombinedActsTracks,
600 ActsTrackContainerName=ActsTrackContainerName))
603 if flags.Tracking.doVertexFinding:
605 from InDetConfig.InDetPriVxFinderConfig
import primaryVertexFindingCfg
609 if InputCombinedITkTracks:
610 result.merge(primaryVertexFindingCfg(flags))
616 if InputCombinedActsTracks:
617 result.merge(primaryVertexFindingCfg(flags,
618 name=
"ActsPriVxFinderAlg",
619 TracksName=ActsTrackContainerName,
620 vxCandidatesOutputName=ActsPrimaryVertices))
624 print(
"-------- POST PROCESSING --------")
625 for current_flags
in flags_set:
626 extension = current_flags.Tracking.ActiveConfig.extension
627 print(f
"- Running post-processing for extension: {extension}")
640 if current_flags.Tracking.ActiveConfig.doAthenaTrack:
641 if current_flags.Tracking.doStoreTrackSeeds:
642 from InDetConfig.ITkPersistificationConfig
import ITkTrackSeedsFinalCfg
643 result.merge(ITkTrackSeedsFinalCfg(current_flags))
651 if current_flags.Tracking.ActiveConfig.doAthenaTrack
or current_flags.Tracking.ActiveConfig.doActsToAthenaTrack:
652 if current_flags.Tracking.doStoreSiSPSeededTracks:
653 from InDetConfig.ITkPersistificationConfig
import ITkSiSPSeededTracksFinalCfg
654 result.merge(ITkSiSPSeededTracksFinalCfg(current_flags))
656 if flags.Tracking.doStats:
660 StatTrackCollections=StatTrackCollections,
661 StatTrackTruthCollections=StatTrackTruthCollections))
665 if flags.Tracking.writeExtendedSi_PRDInfo:
674 from InDetConfig.ITkTrackOutputConfig
import ITkTrackRecoOutputCfg
675 result.merge(ITkTrackRecoOutputCfg(flags, _outputExtensions))
676 result.printConfig(withDetails =
False, summariseProps =
False)