ATLAS Offline Software
Loading...
Searching...
No Matches
DitauMenuSequences.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
3from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
4from AthenaConfiguration.ComponentFactory import CompFactory
5from TriggerMenuMT.HLT.Config.MenuComponents import MenuSequence, SelectionCA, InViewRecoCA
6from DiTauRec.DiTauToolsConfig import (
7 SeedJetBuilderCfg, SubjetBuilderCfg,
8 VertexFinderCfg,
9 DiTauTrackFinderCfg,
10 DiTauConstituentFinderCfg,
11 TVAToolCfg,
12 DiTauExtraVarDecoratorCfg,
13 DiTauOnnxScoreCalculatorCfg,
14)
15
16
17from TrigEDMConfig.TriggerEDM import recordable
18
19from AthenaCommon.Logging import logging
20log = logging.getLogger(__name__)
21
22
23def ditauTrackingCfg(flags, inputRoI: str, inputVertex: str, inputJets: str) -> ComponentAccumulator:
24 #safety measure to ensure we get the right instance of flags
25 from TrigInDetConfig.utils import getFlagsForActiveConfig
26 trkflags = getFlagsForActiveConfig(flags, "diTau", log)
27
28 from TrigInDetConfig.InnerTrackingTrigSequence import InnerTrackingTrigSequence
29 seq = InnerTrackingTrigSequence.create(trkflags,
30 trkflags.Tracking.ActiveConfig.input_name,
31 rois = inputRoI,
32 inView = "VDVInDetFTF")
33 acc = seq.sequence("FastTrackFinder")
34 acc.merge(seq.sequenceAfterPattern())
35
36 verifier = CompFactory.AthViews.ViewDataVerifier(name = 'VDVsecondStageDitauTracking',
37 DataObjects = {('xAOD::VertexContainer', f'StoreGateSvc+{inputVertex}'),
38 ('xAOD::JetContainer', f'StoreGateSvc+{inputJets}')} )
39 acc.addEventAlgo(verifier)
40
41 return acc
42
43def JetTVAAlgCfg(flags, inputTracks, inputVertex, name="HLT_DiTauRec_JetAlgorithm"): # Name changed wrt legacy config DiTauRec_TVATool
44 """Configure the JetAlgorithm"""
45 acc = ComponentAccumulator()
46
47 tools = [acc.popToolsAndMerge(
48 TVAToolCfg(
49 flags,
50 TrackParticleContainer = inputTracks,
51 VertexContainer = inputVertex,
52 TrackVertexAssociation = "HLT_JetTrackVtxAssoc_forDiTaus"
53 )
54 )]
55 tools = tools
56
57 acc.addEventAlgo(CompFactory.JetAlgorithm(name, Tools = tools))
58 return acc
59
60def ditauRecoCfg(flags, inputJets: str, inputVertex: str, inputFSTracks: str, inputTracks: str, inputCells: str, inputClusters: str) -> ComponentAccumulator:
61 from .DitauConfigFlagsHLT import createDiTauConfigFlags
62 flags_ditau = createDiTauConfigFlags()
63
64 acc = ComponentAccumulator()
65 acc.merge(JetTVAAlgCfg(
66 flags,
67 inputTracks=inputFSTracks,
68 inputVertex=inputVertex,
69 ))
70 tools = [
71 acc.popToolsAndMerge(SeedJetBuilderCfg(flags, jetCollection=inputJets)),
72 acc.popToolsAndMerge(SubjetBuilderCfg(flags)),
73 acc.popToolsAndMerge(VertexFinderCfg(
74 flags,
75 TrackVertexAssociation = "HLT_JetTrackVtxAssoc_forDiTaus",
76 PrimVtxContainerName = inputVertex,
77 AssociatedTracks = "GhostTrack_ftf"
78 )),
79 acc.popToolsAndMerge(DiTauTrackFinderCfg(
80 flags,
81 TrackParticleContainer=inputTracks
82 )),
83 acc.popToolsAndMerge(DiTauConstituentFinderCfg(
84 flags,
85 UseRawConstit=False, # no raw constituents for DiTau reconstruction with PFO jets
86 )),
87 acc.popToolsAndMerge(DiTauExtraVarDecoratorCfg(
88 flags,
89 ditauPtDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.ditau_pt",
90 fCoreLeadDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.f_core_lead",
91 fCoreSublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.f_core_subl",
92 fSubjetLeadDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.f_subjet_lead",
93 fSubjetSublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.f_subjet_subl",
94 fSubjetsDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.f_subjets",
95 fTrackLeadDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.f_track_lead",
96 fTrackSublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.f_track_subl",
97 RMaxLeadDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.R_max_lead",
98 RMaxSublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.R_max_subl",
99 nTrackDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.n_track",
100 nTracksLeadDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.n_tracks_lead",
101 nTracksSublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.n_tracks_subl",
102 nIsotrackDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.n_isotrack",
103 RTrackDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.R_track",
104 RTrackCoreDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.R_track_core",
105 RTrackAllDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.R_track_all",
106 RIsotrackDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.R_isotrack",
107 RCoreLeadDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.R_core_lead",
108 RCoreSublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.R_core_subl",
109 RTracksLeadDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.R_tracks_lead",
110 RTracksSublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.R_tracks_subl",
111 MTrackDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.m_track",
112 MTrackCoreDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.m_track_core",
113 MCoreLeadDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.m_core_lead",
114 MCoreSublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.m_core_subl",
115 MTrackAllDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.m_track_all",
116 MTracksLeadDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.m_tracks_lead",
117 MTracksSublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.m_tracks_subl",
118 EFracSublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.E_frac_subl",
119 EFracSubsublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.E_frac_subsubl",
120 RSubjetsSublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.R_subjets_subl",
121 RSubjetsSubsublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.R_subjets_subsubl",
122 d0LeadtrackLeadDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.d0_leadtrack_lead",
123 d0LeadtrackSublDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.d0_leadtrack_subl",
124 fIsotracksDecName = f"{flags_ditau.DiTau.DiTauContainer[0]}.f_isotracks",
125 )),
126 acc.popToolsAndMerge(DiTauOnnxScoreCalculatorCfg(
127 flags,
128 onnxModelPath = f"{flags_ditau.DiTau.CalibFolder}{flags_ditau.DiTau.DiTauIDModel}",
129 )),
130 ]
131
132 acc.addEventAlgo(CompFactory.DiTauBuilder(
133 "HLT_DiTauBuilder",
134 DiTauContainer = recordable(flags_ditau.DiTau.DiTauContainer[0]),
135 Tools = tools,
136 SeedJetName = inputJets,
137 minPt = flags_ditau.DiTau.JetSeedPt,
138 maxEta = flags_ditau.DiTau.MaxEta,
139 Rjet = flags_ditau.DiTau.Rjet,
140 Rsubjet = flags_ditau.DiTau.Rsubjet,
141 Rcore = flags_ditau.DiTau.Rcore,
142 ))
143 return acc
144
145def ditauSequenceGenCfg(flags, seq_name, jet_name):
146 # input maker and ROI tool
147 prmVtxKey = flags.Trigger.InDetTracking.fullScan.vertex
148 roiTool = CompFactory.ViewCreatorCentredOnJetWithPVConstraintROITool(
149 RoisWriteHandleKey = recordable( 'HLT_Roi_DiTau' ),
150 VertexReadHandleKey = prmVtxKey,
151 PrmVtxLink = prmVtxKey.replace( "HLT_","" ),
152 RoIEtaWidth = 1.0,
153 RoIPhiWidth = 1.0,
154 RoIZWidth = 7.0,
155 )
156 ditauAcc = InViewRecoCA("Ditau", RoITool = roiTool,
157 InViewRoIs = "InViewRoIs",
158 mergeUsingFeature = True,
159 RequireParentView = False,
160 ViewFallThrough = True,
161 InViewJets = f'{jet_name}_DiTau_jets',
162 PlaceJetInView = True)
163 InputMakerAlg = ditauAcc.inputMaker()
164 # Tracking
165 trackingAcc = ditauTrackingCfg(
166 flags,
167 inputRoI=InputMakerAlg.InViewRoIs,
168 inputVertex=prmVtxKey,
169 inputJets=InputMakerAlg.InViewJets
170 )
171 ditauAcc.mergeReco(trackingAcc)
172
173 # ditau reconstruction
174 inputJets = InputMakerAlg.InViewJets
175 inputVertex = prmVtxKey
176 inputFSTracks = flags.Trigger.InDetTracking.fullScan.tracks_FTF
177 inputIDTracks = flags.Trigger.InDetTracking.diTau.tracks_IDTrig
178 inputCells = "CaloCellsFS"
179 inputClusters = "HLT_TopoCaloClustersFS"
180
181 recoAcc = ditauRecoCfg(
182 flags,
183 inputJets=inputJets,
184 inputVertex=inputVertex,
185 inputFSTracks=inputFSTracks,
186 inputTracks=inputIDTracks,
187 inputCells=inputCells,
188 inputClusters=inputClusters
189 )
190
191 ditauAcc.mergeReco(recoAcc)
192
193 ditauAcc.addRecoAlgo(CompFactory.AthViews.ViewDataVerifier(
194 name=f'{ditauAcc.name}RecoVDV',
195 DataObjects={
196 ('CaloCellContainer', f'StoreGateSvc+{inputCells}'),
197 ('xAOD::CaloClusterContainer', f'StoreGateSvc+{inputClusters}'),
198 ('CaloClusterCellLinkContainer', f'StoreGateSvc+{inputClusters}_links'),
199 ('xAOD::TrackParticleContainer' , f'StoreGateSvc+{inputFSTracks}'),
200 }
201 ))
202
203 selAcc = SelectionCA(f'Trig_DitauReco_{seq_name}')
204 selAcc.mergeReco(ditauAcc)
205 selAcc.addHypoAlgo(CompFactory.TrigDiTauHypoAlg(
206 f'DiTauHypoAlg_{seq_name}',
207 DiTauJets_key='HLT_DiTauJets',
208 ))
209
210 from TrigDitauHypo.TrigDiTauHypoTool import TrigDiTauHypoToolFromDict
211 menuSeq = MenuSequence(flags, selAcc, HypoToolGen=TrigDiTauHypoToolFromDict)
212
213 return menuSeq
ComponentAccumulator ditauRecoCfg(flags, str inputJets, str inputVertex, str inputFSTracks, str inputTracks, str inputCells, str inputClusters)
ComponentAccumulator ditauTrackingCfg(flags, str inputRoI, str inputVertex, str inputJets)
ditauSequenceGenCfg(flags, seq_name, jet_name)
JetTVAAlgCfg(flags, inputTracks, inputVertex, name="HLT_DiTauRec_JetAlgorithm")