ATLAS Offline Software
DitauMenuSequences.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2 
3 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
4 from AthenaConfiguration.ComponentFactory import CompFactory
5 from TriggerMenuMT.HLT.Config.MenuComponents import MenuSequence, SelectionCA, InViewRecoCA
6 from DiTauRec.DiTauToolsConfig import (
7  SeedJetBuilderCfg, SubjetBuilderCfg,
8  VertexFinderCfg,
9  DiTauTrackFinderCfg,
10  DiTauConstituentFinderCfg,
11  TVAToolCfg,
12  DiTauIDVarDecoratorCfg,
13  DiTauOnnxScoreCalculatorCfg,
14 )
15 
16 
17 from TrigEDMConfig.TriggerEDM import recordable
18 
19 from AthenaCommon.Logging import logging
20 log = logging.getLogger(__name__)
21 
22 
23 def 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 
43 def 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 
60 def 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(DiTauIDVarDecoratorCfg(
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  DiTauPtDecorName = f'{flags_ditau.DiTau.DiTauContainer[0]}.ditau_pt',
130  DiTauFCoreLeadName = f'{flags_ditau.DiTau.DiTauContainer[0]}.f_core_lead',
131  DiTauFCoreSubLeadName = f'{flags_ditau.DiTau.DiTauContainer[0]}.f_core_subl',
132  DiTauSubjetSublName = f'{flags_ditau.DiTau.DiTauContainer[0]}.f_subjet_subl',
133  DiTauSubjetsName = f'{flags_ditau.DiTau.DiTauContainer[0]}.f_subjets',
134  DiTauRMaxLeadName = f'{flags_ditau.DiTau.DiTauContainer[0]}.R_max_lead',
135  DiTauRMaxSubleadName = f'{flags_ditau.DiTau.DiTauContainer[0]}.R_max_subl',
136  DiTauNTrackName = f'{flags_ditau.DiTau.DiTauContainer[0]}.n_track',
137  DiTauRTrackAllName = f'{flags_ditau.DiTau.DiTauContainer[0]}.R_track_all',
138  DiTauRIsoTrackAllName = f'{flags_ditau.DiTau.DiTauContainer[0]}.R_isotrack',
139  DiTauRTrackSubleadName = f'{flags_ditau.DiTau.DiTauContainer[0]}.R_tracks_subl',
140  DiTauMCoreLeadName = f'{flags_ditau.DiTau.DiTauContainer[0]}.m_core_lead',
141  DiTauMCoreSubleadName = f'{flags_ditau.DiTau.DiTauContainer[0]}.m_core_subl',
142  DiTauMTrackLeadName = f'{flags_ditau.DiTau.DiTauContainer[0]}.m_tracks_lead',
143  DiTauD0LeadTrackLeadName = f'{flags_ditau.DiTau.DiTauContainer[0]}.d0_leadtrack_lead',
144  DiTauD0SubleadTrackLeadName = f'{flags_ditau.DiTau.DiTauContainer[0]}.d0_leadtrack_subl',
145  DiTauFIsotracks = f'{flags_ditau.DiTau.DiTauContainer[0]}.f_isotracks',
146  )),
147  ]
148 
149  acc.addEventAlgo(CompFactory.DiTauBuilder(
150  "HLT_DiTauBuilder",
151  DiTauContainer = recordable(flags_ditau.DiTau.DiTauContainer[0]),
152  Tools = tools,
153  SeedJetName = inputJets,
154  minPt = flags_ditau.DiTau.JetSeedPt,
155  maxEta = flags_ditau.DiTau.MaxEta,
156  Rjet = flags_ditau.DiTau.Rjet,
157  Rsubjet = flags_ditau.DiTau.Rsubjet,
158  Rcore = flags_ditau.DiTau.Rcore,
159  ))
160  return acc
161 
162 def ditauSequenceGenCfg(flags, seq_name, jet_name):
163  # input maker and ROI tool
164  prmVtxKey = flags.Trigger.InDetTracking.fullScan.vertex
165  roiTool = CompFactory.ViewCreatorCentredOnJetWithPVConstraintROITool(
166  RoisWriteHandleKey = recordable( 'HLT_Roi_DiTau' ),
167  VertexReadHandleKey = prmVtxKey,
168  PrmVtxLink = prmVtxKey.replace( "HLT_","" ),
169  RoIEtaWidth = 1.0,
170  RoIPhiWidth = 1.0,
171  RoIZWidth = 7.0,
172  )
173  ditauAcc = InViewRecoCA("Ditau", RoITool = roiTool,
174  InViewRoIs = "InViewRoIs",
175  mergeUsingFeature = True,
176  RequireParentView = False,
177  ViewFallThrough = True,
178  InViewJets = f'{jet_name}_DiTau_jets',
179  PlaceJetInView = True)
180  InputMakerAlg = ditauAcc.inputMaker()
181  # Tracking
182  trackingAcc = ditauTrackingCfg(
183  flags,
184  inputRoI=InputMakerAlg.InViewRoIs,
185  inputVertex=prmVtxKey,
186  inputJets=InputMakerAlg.InViewJets
187  )
188  ditauAcc.mergeReco(trackingAcc)
189 
190  # ditau reconstruction
191  inputJets = InputMakerAlg.InViewJets
192  inputVertex = prmVtxKey
193  inputFSTracks = flags.Trigger.InDetTracking.fullScan.tracks_FTF
194  inputIDTracks = flags.Trigger.InDetTracking.diTau.tracks_IDTrig
195  inputCells = "CaloCellsFS"
196  inputClusters = "HLT_TopoCaloClustersFS"
197 
198  recoAcc = ditauRecoCfg(
199  flags,
200  inputJets=inputJets,
201  inputVertex=inputVertex,
202  inputFSTracks=inputFSTracks,
203  inputTracks=inputIDTracks,
204  inputCells=inputCells,
205  inputClusters=inputClusters
206  )
207 
208  ditauAcc.mergeReco(recoAcc)
209 
210  ditauAcc.addRecoAlgo(CompFactory.AthViews.ViewDataVerifier(
211  name=f'{ditauAcc.name}RecoVDV',
212  DataObjects={
213  ('CaloCellContainer', f'StoreGateSvc+{inputCells}'),
214  ('xAOD::CaloClusterContainer', f'StoreGateSvc+{inputClusters}'),
215  ('CaloClusterCellLinkContainer', f'StoreGateSvc+{inputClusters}_links'),
216  ('xAOD::TrackParticleContainer' , f'StoreGateSvc+{inputFSTracks}'),
217  }
218  ))
219 
220  selAcc = SelectionCA(f'Trig_DitauReco_{seq_name}')
221  selAcc.mergeReco(ditauAcc)
222  selAcc.addHypoAlgo(CompFactory.TrigDiTauHypoAlg(
223  f'DiTauHypoAlg_{seq_name}',
224  DiTauJets_key='HLT_DiTauJets',
225  ))
226 
227  from TrigDitauHypo.TrigDiTauHypoTool import TrigDiTauHypoToolFromDict
228  menuSeq = MenuSequence(flags, selAcc, HypoToolGen=TrigDiTauHypoToolFromDict)
229 
230  return menuSeq
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
python.HLT.Ditau.DitauMenuSequences.ditauTrackingCfg
ComponentAccumulator ditauTrackingCfg(flags, str inputRoI, str inputVertex, str inputJets)
Definition: DitauMenuSequences.py:23
python.HLT.Ditau.DitauMenuSequences.ditauSequenceGenCfg
def ditauSequenceGenCfg(flags, seq_name, jet_name)
Definition: DitauMenuSequences.py:162
DiTauToolsConfig.DiTauTrackFinderCfg
def DiTauTrackFinderCfg(flags, name="DiTauRec_DiTauTrackFinder", **kwargs)
Definition: DiTauToolsConfig.py:58
DiTauToolsConfig.SubjetBuilderCfg
def SubjetBuilderCfg(flags, name="DiTauRec_SubjetBuilder")
Definition: DiTauToolsConfig.py:14
python.HLT.Ditau.DitauMenuSequences.JetTVAAlgCfg
def JetTVAAlgCfg(flags, inputTracks, inputVertex, name="HLT_DiTauRec_JetAlgorithm")
Definition: DitauMenuSequences.py:43
python.utils.getFlagsForActiveConfig
AthConfigFlags getFlagsForActiveConfig(AthConfigFlags flags, str config_name, logging.Logger log)
Definition: Trigger/TrigTools/TrigInDetConfig/python/utils.py:9
DiTauConfigFlags.createDiTauConfigFlags
def createDiTauConfigFlags()
Definition: DiTauConfigFlags.py:6
DiTauToolsConfig.VertexFinderCfg
def VertexFinderCfg(flags, name="DiTauRec_VertexFinder", **kwargs)
Definition: DiTauToolsConfig.py:46
DiTauToolsConfig.DiTauConstituentFinderCfg
def DiTauConstituentFinderCfg(flags, name="DiTauRec_DiTauConstituentFinder", **kwargs)
Definition: DiTauToolsConfig.py:85
DiTauToolsConfig.SeedJetBuilderCfg
def SeedJetBuilderCfg(flags, name="DiTauRec_SeedJetBuilder", jetCollection="")
Definition: DiTauToolsConfig.py:6
DiTauToolsConfig.DiTauIDVarDecoratorCfg
def DiTauIDVarDecoratorCfg(flags, name="DiTauRec_IDVarDecorator", **kwargs)
Definition: DiTauToolsConfig.py:94
python.TriggerEDM.recordable
def recordable(arg, runVersion=3)
Definition: TriggerEDM.py:37
python.HLT.Ditau.DitauMenuSequences.ditauRecoCfg
ComponentAccumulator ditauRecoCfg(flags, str inputJets, str inputVertex, str inputFSTracks, str inputTracks, str inputCells, str inputClusters)
Definition: DitauMenuSequences.py:60
DiTauToolsConfig.DiTauOnnxScoreCalculatorCfg
def DiTauOnnxScoreCalculatorCfg(flags, name="DiTauRec_OnnxScoreCalculator", **kwargs)
Definition: DiTauToolsConfig.py:100
DiTauToolsConfig.TVAToolCfg
def TVAToolCfg(flags, name="TVATool_forDiTaus", **kwargs)
Definition: DiTauToolsConfig.py:22