ATLAS Offline Software
Loading...
Searching...
No Matches
MuonRecoSequences.py
Go to the documentation of this file.
2# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3#
4
5from AthenaCommon.Logging import logging
6log = logging.getLogger(__name__)
7
8
9from TrigEDMConfig.TriggerEDM import recordable
10from MuonConfig.MuonBytestreamDecodeConfig import RpcBytestreamDecodeCfg, NrpcBytestreamDecodeCfg, TgcBytestreamDecodeCfg, MdtBytestreamDecodeCfg, CscBytestreamDecodeCfg, sTgcBytestreamDecodeCfg, MmBytestreamDecodeCfg
11from MuonConfig.MuonRdoDecodeConfig import RpcRDODecodeCfg, TgcRDODecodeCfg, MdtRDODecodeCfg, CscRDODecodeCfg, CscClusterBuildCfg, StgcRDODecodeCfg, MMRDODecodeCfg
12from MuonConfig.MuonRdoDecodeConfig import MuonPrdCacheNames
13from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
14from AthenaConfiguration.ComponentFactory import CompFactory
15from TrigInDetConfig.utils import getFlagsForActiveConfig
16
17CBTPname = recordable("HLT_CBCombinedMuon_RoITrackParticles")
18CBTPnameFS = recordable("HLT_CBCombinedMuon_FSTrackParticles")
19CBTPnameLRT = recordable("HLT_CBCombinedMuon_LRTTrackParticles")
20ExtrpTPname = recordable("HLT_MSExtrapolatedMuons_RoITrackParticles")
21ExtrpTPnameFS = recordable("HLT_MSExtrapolatedMuons_FSTrackParticles")
22MSextrpTPname = recordable("HLT_MSOnlyExtrapolatedMuons_FSTrackParticles")
23
24
25from AthenaConfiguration.Enums import BeamType, LHCPeriod
26
27class muonNames(object):
28 def __init__(self):
29 #EFSA and EFCB containers have different names
30 #for RoI and FS running. Other containers are
31 #produced in RoIs only.
32
33 self.L2SAName = recordable("HLT_MuonL2SAInfo")
34 self.L2CBName = recordable("HLT_MuonL2CBInfo")
35 self.EFSAName = "Muons"
36 self.EFCBName = "MuonsCB"
37 self.EFCBOutInName = "MuonsCBOutsideIn"
38 self.EFCBInOutName = "HLT_MuonsCBInsideOut"
39 self.EFIsoMuonName = recordable("HLT_MuonsIso")
40 self.L2forIDName = "RoIs_fromL2SAViews"
41
42 def getNames(self, name):
43
44 if "FS" in name:
45 self.EFSAName = recordable("HLT_Muons_FS")
46 self.EFCBName = recordable("HLT_MuonsCB_FS")
47 self.EFCBOutInName = "MuonsCBOutsideIn_FS"
48 if "RoI" in name:
49 self.EFSAName = recordable("HLT_Muons_RoI")
50 self.EFCBName = recordable("HLT_MuonsCB_RoI")
51 if "LRT" in name:
52 self.L2CBName = recordable("HLT_MuonL2CBInfoLRT")
53 self.EFSAName = recordable("HLT_Muons_RoI")
54 self.EFCBName = recordable("HLT_MuonsCB_LRT")
55 return self
56
57muNames = muonNames().getNames('RoI')
58muNamesFS = muonNames().getNames('FS')
59muNamesLRT = muonNames().getNames('LRT')
60
61def isCosmic(flags):
62 #FIXME: this might not be ideal criteria to determine if this is cosmic chain but used to work in Run2 and will do for now, ATR-22758
63 return (flags.Beam.Type == BeamType.Cosmics)
64
65def isLRT(name):
66 return "LRT" in name
67
68#Returns relevant track collection name
69def getIDTracks(flags, name='', muonIDreuse=False, precision=False, suffix=''):
70
71 if muonIDreuse or suffix != '':
72 if isLRT(name):
73 return 'HLT_IDTrack_MuonComb_FTF_LRT'
74 elif isCosmic(flags):
75 return 'HLT_IDTrack_MuonComb_FTF'
76 else:
77 return 'HLT_IDTrack_MuonComb_FTF'+suffix
78
79 else:
80 if precision:
81 return flags.Tracking.ActiveConfig.tracks_IDTrig
82 else:
83 if isLRT(name):
84 return flags.Trigger.InDetTracking.muonLRT.tracks_FTF
85 elif isCosmic(flags):
86 return flags.Trigger.InDetTracking.cosmics.tracks_IDTrig
87 else:
88 return flags.Trigger.InDetTracking.muon.tracks_FTF
89
90
92 result = ComponentAccumulator()
93
94 # Cache
95 dataObjects=[( 'RpcPrepDataCollection_Cache' , 'StoreGateSvc+RpcPrdCache' ),
96 ( 'TgcRdo_Cache' , 'StoreGateSvc+TgcRdoCache' ),
97 ( 'MdtCsm_Cache' , 'StoreGateSvc+MdtCsmRdoCache' ),
98 ( 'RpcPad_Cache' , 'StoreGateSvc+RpcRdoCache' ),
99 ( 'RpcCoinDataCollection_Cache' , 'StoreGateSvc+RpcCoinCache' ),
100 ( 'TgcPrepDataCollection_Cache' , 'StoreGateSvc+' + MuonPrdCacheNames.TgcCache + 'AllBCs' ),
101 ( 'TgcCoinDataCollection_Cache' , 'StoreGateSvc+' + MuonPrdCacheNames.TgcCoinCache + 'PriorBC' ),
102 ( 'TgcCoinDataCollection_Cache' , 'StoreGateSvc+' + MuonPrdCacheNames.TgcCoinCache + 'NextBC' ),
103 ( 'TgcCoinDataCollection_Cache' , 'StoreGateSvc+' + MuonPrdCacheNames.TgcCoinCache + 'NextNextBC' ),
104 ( 'TgcCoinDataCollection_Cache' , 'StoreGateSvc+' + MuonPrdCacheNames.TgcCoinCache )
105 ]
106
107 if flags.Detector.GeometrysTGC:
108 dataObjects += [( 'sTgcPrepDataCollection_Cache' , 'StoreGateSvc+' + MuonPrdCacheNames.sTgcCache)]
109 if flags.Input.isMC:
110 dataObjects += [( 'Muon::STGC_RawDataContainer' , 'StoreGateSvc+sTGCRDO' )]
111
112 if flags.Detector.GeometryMM:
113 dataObjects += [( 'MMPrepDataCollection_Cache' , 'StoreGateSvc+' + MuonPrdCacheNames.MmCache)]
114 if flags.Input.isMC:
115 dataObjects += [( 'Muon::MM_RawDataContainer' , 'StoreGateSvc+MMRDO' )]
116
117 if flags.Detector.GeometryCSC:
118 dataObjects+=[( 'CscRawDataCollection_Cache' , 'StoreGateSvc+CscRdoCache' )]
119 if flags.Input.isMC:
120 dataObjects += [( 'CscRawDataContainer' , 'StoreGateSvc+CSCRDO' ),
121 ( 'CscRawDataCollection_Cache' , 'StoreGateSvc+CscRdoCache' )]
122
123 if flags.Input.isMC:
124 dataObjects += [( 'MdtCsmContainer' , 'StoreGateSvc+MDTCSM' ),
125 *( [( 'RpcPadContainer' , 'StoreGateSvc+RPCPAD' )] if "RPCPAD" in flags.Input.Collections else [] ),
126 *( [( 'xAOD::NRPCRDOContainer' , 'StoreGateSvc+NRPCRDO' )] if flags.Muon.enableNRPC else [] ),
127 ('TgcRdoContainer' , 'StoreGateSvc+TGCRDO' )]
128
129 if flags.Muon.usePhaseIIGeoSetup:
130 dataObjects += [('ActsTrk::GeometryContext' , 'StoreGateSvc+ActsAlignment' )]
131
132 alg = CompFactory.AthViews.ViewDataVerifier( name = "VDVMuDataPrep",
133 DataObjects = dataObjects)
134 result.addEventAlgo(alg)
135 return result
136
137
138def muonDecodeCfg(flags, RoIs):
139 acc = ComponentAccumulator()
140
141 doSeededDecoding =True
142 if 'FSRoI' in RoIs:
143 doSeededDecoding = False
144 acc.merge(MuDataPrepViewDataVerifierCfg(flags))
145
146 # Get RPC BS decoder
147 if not flags.Input.isMC:
148 rpcAcc = RpcBytestreamDecodeCfg( flags, name = "RpcRawDataProvider_"+RoIs, RoIs = RoIs, DoSeededDecoding = doSeededDecoding )
149 acc.merge( rpcAcc )
150 if flags.Muon.enableNRPC:
151 acc.merge(NrpcBytestreamDecodeCfg( flags, name="NRpcRawDataProvider_"+RoIs ))
152 # Get RPC RDO convertor
153 rpcAcc = RpcRDODecodeCfg( flags, name= "RpcRdoToRpcPrepData_"+RoIs, RoIs = RoIs, DoSeededDecoding = doSeededDecoding )
154 acc.merge( rpcAcc )
155 # Get TGC BS decoder
156 if not flags.Input.isMC:
157 tgcAcc = TgcBytestreamDecodeCfg( flags, name="TgcRawDataProvider_"+RoIs, RoIs = RoIs, DoSeededDecoding = doSeededDecoding )
158 acc.merge( tgcAcc )
159 # Get TGC RDO convertor
160 tgcAcc = TgcRDODecodeCfg( flags, name="TgcRdoToTgcPrepData_"+RoIs, RoIs = RoIs, DoSeededDecoding = doSeededDecoding )
161 acc.merge( tgcAcc )
162 # Get MDT BS decoder
163 if not flags.Input.isMC:
164 mdtAcc = MdtBytestreamDecodeCfg( flags, name="MdtRawDataProvider_"+RoIs, RoIs = RoIs, DoSeededDecoding = doSeededDecoding )
165 acc.merge( mdtAcc )
166 # Get MDT RDO convertor
167 mdtAcc = MdtRDODecodeCfg( flags, name="MdtRdoToMdtPrepData_"+RoIs, RoIs = RoIs, DoSeededDecoding = doSeededDecoding )
168 acc.merge( mdtAcc )
169 # Get CSC BS decoder
170 if flags.Detector.GeometryCSC:
171 if not flags.Input.isMC:
172 cscAcc = CscBytestreamDecodeCfg( flags, name="CscRawDataProvider_"+RoIs, RoIs = RoIs, DoSeededDecoding = doSeededDecoding )
173 acc.merge( cscAcc )
174 # Get CSC RDO convertor
175 cscAcc = CscRDODecodeCfg( flags, name="CscRdoToCscPrepData_"+RoIs, RoIs = RoIs, DoSeededDecoding = doSeededDecoding )
176 acc.merge( cscAcc )
177 # Get CSC cluster builder
178 cscAcc = CscClusterBuildCfg( flags, name="CscThresholdClusterBuilder_"+RoIs )
179 acc.merge( cscAcc )
180 #sTGC and MM BS decoder
181 if flags.Detector.GeometrysTGC and flags.Detector.GeometryMM:
182 if not flags.Input.isMC:
183 stgcAcc = sTgcBytestreamDecodeCfg(flags, name="sTgcRawDataProvider_"+RoIs, RoIs = RoIs, DoSeededDecoding = doSeededDecoding)
184 acc.merge( stgcAcc )
185 mmAcc = MmBytestreamDecodeCfg(flags, name="MMRawDataProvider_"+RoIs, RoIs = RoIs, DoSeededDecoding = doSeededDecoding)
186 acc.merge( mmAcc )
187 #sTGC and MM RDO converter
188 stgcAcc = StgcRDODecodeCfg( flags, name="StgcRdoToStgcPrepData_"+RoIs, RoIs = RoIs, DoSeededDecoding = doSeededDecoding )
189 acc.merge( stgcAcc )
190
191 mmAcc = MMRDODecodeCfg( flags, name="MMRdoToMMPrepData_"+RoIs, RoIs = RoIs, DoSeededDecoding = doSeededDecoding)
192 acc.merge( mmAcc )
193
194 return acc
195
196def muFastVDVCfg(flags, RoIs, postFix, InsideOutMode, extraLoads):
197 result=ComponentAccumulator()
198 # In insideout mode, need to inherit muon decoding objects for TGC, RPC, MDT, CSC
199 dataObjects=[]
200 if InsideOutMode:
201 dataObjects = [('Muon::TgcPrepDataContainer','StoreGateSvc+TGC_MeasurementsAllBCs'),
202 ('TgcRdoContainer' , 'StoreGateSvc+TGCRDO'),
203 ('Muon::RpcPrepDataContainer','StoreGateSvc+RPC_Measurements'),
204 ('Muon::MdtPrepDataContainer','StoreGateSvc+MDT_DriftCircles'),
205 *( [( 'RpcPadContainer' , 'StoreGateSvc+RPCPAD' )] if "RPCPAD" in flags.Input.Collections else [] )]
206 if flags.Detector.GeometryCSC:
207 dataObjects += [('Muon::CscPrepDataContainer','StoreGateSvc+CSC_Clusters')]
208 if flags.Detector.GeometrysTGC:
209 dataObjects += [('Muon::sTgcPrepDataContainer','StoreGateSvc+STGC_Measurements')]
210 if flags.Detector.GeometryMM:
211 dataObjects += [('Muon::MMPrepDataContainer','StoreGateSvc+MM_Measurements')]
212
213 if flags.Muon.usePhaseIIGeoSetup:
214 dataObjects += [('ActsTrk::GeometryContext' , 'StoreGateSvc+ActsAlignment' )]
215
216 else:
217 dataObjects += [( 'TrigRoiDescriptorCollection' , 'StoreGateSvc+%s' % RoIs )]
218 dataObjects += [( 'xAOD::EventInfo' , 'StoreGateSvc+EventInfo' )]
219 if flags.Trigger.enableL1MuonPhase1:
220 dataObjects += [( 'xAOD::MuonRoIContainer' , 'StoreGateSvc+LVL1MuonRoIs' )]
221 else:
222 dataObjects += [( 'DataVector< LVL1::RecMuonRoI >' , 'StoreGateSvc+HLT_RecMURoIs' )]
223
224 #For L2 multi-track SA mode
225 if extraLoads:
226 dataObjects += extraLoads
227 ViewVerify = CompFactory.AthViews.ViewDataVerifier("muFastRecoVDV"+postFix, DataObjects = dataObjects)
228
229 result.addEventAlgo(ViewVerify)
230 return result
231
232def muFastRecoSequenceCfg( flags, RoIs, doFullScanID = False, InsideOutMode=False, extraLoads=None, l2mtmode=False, calib=False ):
233
234 acc = ComponentAccumulator()
235 postFix = ""
236 if InsideOutMode:
237 postFix = "IOmode"
238 elif l2mtmode:
239 postFix = "l2mtmode"
240 elif calib:
241 postFix = "Calib"
242
243 acc.merge(muFastVDVCfg(flags, RoIs, postFix, InsideOutMode, extraLoads))
244
245
246
247 from TrigL2MuonSA.TrigL2MuonSAConfig import l2MuFastAlgCfg
248 acc.merge(l2MuFastAlgCfg(flags,
249 roisKey = RoIs,
250 setup = postFix,
251 FILL_FSIDRoI = doFullScanID,
252 MuonL2SAInfo = muNames.L2SAName+postFix,
253 L2IOCB = muNames.L2CBName+postFix,
254 forID = muNames.L2forIDName+postFix,
255 forMS = "forMS"+postFix,
256 TrackParticlesContainerName = getIDTracks(flags)))
257
258
259 return acc
260
261def muonIDtrackVDVCfg( flags, name, RoIs, extraLoads=None, extraLoadsForl2mtmode=None ):
262 result=ComponentAccumulator()
263 dataObjects=[( 'TrigRoiDescriptorCollection' , 'StoreGateSvc+%s' % RoIs )]
264 if extraLoads:
265 dataObjects += extraLoads
266 if extraLoadsForl2mtmode:
267 dataObjects += extraLoadsForl2mtmode
268 ViewVerify = CompFactory.AthViews.ViewDataVerifier("muCombVDV"+name, DataObjects = dataObjects)
269
270 result.addEventAlgo(ViewVerify)
271 return result
272
273def muonIDFastTrackingSequenceCfg( flags, RoIs, name, extraLoads=None, extraLoadsForl2mtmode=None, doLRT=False, trackingMode="FTF" ):
274
275 acc = ComponentAccumulator()
276 from TrigInDetConfig.TrigInDetConfig import trigInDetFastTrackingCfg
277 acc.merge(trigInDetFastTrackingCfg( flags, roisKey=RoIs, signatureName=name, patternMode=trackingMode ))
278
279 acc.merge(muonIDtrackVDVCfg(flags, name, RoIs, extraLoads, extraLoadsForl2mtmode))
280
281 return acc
282
283def muonIDCosmicTrackingSequenceCfg( flags, RoIs, name, extraLoads=None, extraLoadsForl2mtmode=None ):
284
285 acc = ComponentAccumulator()
286
287 acc.merge(muonIDtrackVDVCfg(flags, 'cosmics', RoIs, extraLoads, extraLoadsForl2mtmode))
288
289 flagsWithTrk = getFlagsForActiveConfig(flags, "cosmics", log)
290
291 from TrigInDetConfig.InnerTrackingTrigSequence import InnerTrackingTrigSequence
292 seq = InnerTrackingTrigSequence.create(flagsWithTrk,
293 flagsWithTrk.Tracking.ActiveConfig.input_name,
294 rois = RoIs,
295 inView = "muCombVDVcosmics")
296 acc.merge(seq.sequence("Offline"))
297
298
299 return acc
300
301def muCombVDVCfg( flags, postFix):
302 result=ComponentAccumulator()
303 dataObjects=[('xAOD::L2StandAloneMuonContainer','StoreGateSvc+%s' % muNames.L2SAName+postFix)]
304 ViewVerify = CompFactory.AthViews.ViewDataVerifier("muCombAlgVDV"+postFix, DataObjects = dataObjects)
305 result.addEventAlgo(ViewVerify)
306 return result
307
308
309def muCombRecoSequenceCfg( flags, RoIs, name, l2mtmode=False, l2CBname="" ):
310
311 acc = ComponentAccumulator()
312 postFix = ""
313 if l2mtmode:
314 postFix = "l2mtmode"
315
316 acc.merge(muCombVDVCfg(flags, postFix))
317 from TrigmuComb.TrigmuCombConfig import muCombCfg
318 l2trackname = getIDTracks(flags) if l2mtmode else getIDTracks(flags, name)
319 acc.merge(muCombCfg(flags, f'{postFix}_{name}', useBackExtrp=True,
320 L2StandAloneMuonContainerName = muNames.L2SAName+postFix,
321 L2CombinedMuonContainerName = l2CBname, TrackParticleContainerName = l2trackname ))
322
323 return acc
324
325def EFMuSADataPrepViewDataVerifierCfg(flags, RoIs, roiName):
326 result=ComponentAccumulator()
327 dataObjects=[( 'xAOD::EventInfo' , 'StoreGateSvc+EventInfo' ),
328 ( 'TrigRoiDescriptorCollection' , 'StoreGateSvc+%s' % RoIs )]
329
330 if flags.Muon.usePhaseIIGeoSetup:
331 dataObjects += [( 'ActsGeometryContext' , 'StoreGateSvc+ActsAlignment' )]
332
333 if flags.Input.isMC and flags.Muon.scheduleActsReco:
334 dataObjects += [( 'xAOD::MuonSimHitContainer' , 'StoreGateSvc+MDT_SDO' ),
335 ( 'xAOD::MuonSimHitContainer' , 'StoreGateSvc+MM_SDO' ),
336 ( 'xAOD::MuonSimHitContainer' , 'StoreGateSvc+RPC_SDO' ),
337 ( 'xAOD::MuonSimHitContainer' , 'StoreGateSvc+TGC_SDO' ),
338 ( 'xAOD::MuonSimHitContainer' , 'StoreGateSvc+sTGC_SDO' ),
339 ( 'McEventCollection' , 'StoreGateSvc+TruthEvent' )]
340
341 alg = CompFactory.AthViews.ViewDataVerifier( name = "VDVMuEFSA_"+roiName,
342 DataObjects = dataObjects)
343 result.addEventAlgo(alg)
344 return result
345
346
347def muEFSARecoSequenceCfg( flags, RoIs, name, useBucketFilter=False):
348
349 from MuonCombinedAlgs.MuonCombinedAlgsMonitoring import MuonCreatorAlgMonitoring
350 from MuonConfig.MuonSegmentFindingConfig import MuonSegmentFinderAlgCfg, MuonLayerHoughAlgCfg, MuonSegmentFilterAlgCfg
351 from MuonConfig.MuonTrackBuildingConfig import MuPatTrackBuilderCfg, EMEO_MuPatTrackBuilderCfg
352 from xAODTrackingCnv.xAODTrackingCnvConfig import MuonStandaloneTrackParticleCnvAlgCfg
353 from MuonCombinedConfig.MuonCombinedReconstructionConfig import MuonCombinedMuonCandidateAlgCfg, MuonCreatorAlgCfg
354
355 acc = ComponentAccumulator()
356
357 acc.merge(EFMuSADataPrepViewDataVerifierCfg(flags, RoIs, name))
358
359 if flags.Muon.usePhaseIIGeoSetup and flags.Muon.scheduleActsReco:
360
361 # Schedule truth segment maker and truth hit association.
362 if flags.Input.isMC:
363 from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
364 acc.merge(GEN_AOD2xAODCfg(flags))
365 from MuonTruthAlgsR4.MuonTruthAlgsConfig import MuonTruthAlgsCfg
366 acc.merge(MuonTruthAlgsCfg(flags))
367 # Schedule muon EF reco
368 from MuonSpacePointFormation.SpacePointFormationConfig import MuonSpacePointFormationCfg
369 acc.merge( MuonSpacePointFormationCfg( flags, suffix =f'_{name}' ) )
370
371
372 if useBucketFilter:
373 from MuonInference.InferenceConfig import GraphBucketFilterToolCfg, GraphInferenceAlgCfg
374 bucketTool = acc.popToolsAndMerge( GraphBucketFilterToolCfg(flags, name=f"GraphBucketFilterTool_{name}",
375 WriteSpacePointKey=f"FilteredMlBuckets_{name}"))
376 acc.merge(GraphInferenceAlgCfg(flags, name=f"GraphInferenceAlg_{name}", InferenceTools=[bucketTool]))
377
378
379 from MuonPatternRecognitionAlgs.MuonPatternRecognitionConfig import MuonPatternRecognitionCfg
380 acc.merge(MuonPatternRecognitionCfg(flags, suffix = f'_{name}'))
381
382 if useBucketFilter:
383 # Change the input container to use filtered buckets
384 acc.getEventAlgo(f"MuonEtaHoughTransformAlg_{name}").SpacePointContainer = f"FilteredMlBuckets_{name}"
385
386 else:
387 acc.merge(MuonLayerHoughAlgCfg(flags, "TrigMuonLayerHoughAlg"))
388
389 # if NSW is excluded from reconstruction (during commissioning)
390 if flags.Muon.runCommissioningChain:
391 acc.merge(MuonSegmentFinderAlgCfg(flags, name="TrigMuonSegmentMaker_"+name,SegmentCollectionName="TrackMuonSegments_withNSW"))
392 acc.merge(MuonSegmentFilterAlgCfg(flags, name="TrigMuonSegmentFilter_"+name,SegmentCollectionName="TrackMuonSegments_withNSW",
393 FilteredCollectionName="TrackMuonSegments", TrashUnFiltered=False, ThinStations=()))
394 else:
395 acc.merge(MuonSegmentFinderAlgCfg(flags, "TrigMuonSegmentMaker_"+name))
396
397
398 from MuonSegmentTrackMaker.MuonTrackMakerAlgsMonitoring import MuPatTrackBuilderMonitoring
399 if flags.Muon.runCommissioningChain:
400 acc.merge(EMEO_MuPatTrackBuilderCfg(flags, name="TrigMuPatTrackBuilder_"+name ,MuonSegmentCollection = "TrackMuonSegments", MonTool = MuPatTrackBuilderMonitoring(flags, "MuPatTrackBuilderMonitoringSA_"+name), SpectrometerTrackOutputLocation="MuonSpectrometerTracks"))
401 else:
402 acc.merge(MuPatTrackBuilderCfg(flags, name="TrigMuPatTrackBuilder_"+name ,MuonSegmentCollection = "TrackMuonSegments", MonTool = MuPatTrackBuilderMonitoring(flags, "MuPatTrackBuilderMonitoringSA_"+name)))
403
404 acc.merge(MuonStandaloneTrackParticleCnvAlgCfg(flags, name = "TrigMuonStandaloneTrackParticleCnvAlg_"+name))
405 acc.merge(MuonCombinedMuonCandidateAlgCfg(flags, name="TrigMuonCandidateAlg_"+name))
406
407 msMuonName = muNames.EFSAName
408 if 'FS' in name:
409 msMuonName = muNamesFS.EFSAName
410
411 acc.merge(MuonCreatorAlgCfg(flags, name="TrigMuonCreatorAlg_"+name, CreateSAmuons=True, TagMaps=[], MuonContainerLocation=msMuonName,
412 ExtrapolatedLocation = "HLT_MSExtrapolatedMuons_"+name, MSOnlyExtrapolatedLocation = "HLT_MSOnlyExtrapolatedMuons_"+name,
413 MonTool = MuonCreatorAlgMonitoring(flags, "MuonCreatorAlgSA_"+name)))
414
415 sequenceOut = msMuonName
416
417 return acc, sequenceOut
418
419
420
421def VDVEFMuCBCfg(flags, RoIs, name, suffix):
422 acc = ComponentAccumulator()
423 dataObjects = [( 'Muon::MdtPrepDataContainer' , 'StoreGateSvc+MDT_DriftCircles' ),
424 ( 'Muon::TgcPrepDataContainer' , 'StoreGateSvc+TGC_MeasurementsAllBCs' ),
425 ( 'Muon::RpcPrepDataContainer' , 'StoreGateSvc+RPC_Measurements' ),
426 ( 'TrigRoiDescriptorCollection' , 'StoreGateSvc+%s' % RoIs ),
427 ( 'xAOD::EventInfo' , 'StoreGateSvc+EventInfo' ),
428 ]
429 if "FS" in name:
430 dataObjects +=[( 'MuonCandidateCollection' , 'StoreGateSvc+MuonCandidates_FS' )]
431 else:
432 dataObjects +=[( 'MuonCandidateCollection' , 'StoreGateSvc+MuonCandidates')]
433
434 if flags.Detector.GeometryCSC:
435 dataObjects += [( 'Muon::CscStripPrepDataContainer' , 'StoreGateSvc+CSC_Measurements' )]
436 if flags.Detector.GeometrysTGC and flags.Detector.GeometryMM:
437 dataObjects += [( 'Muon::MMPrepDataContainer' , 'StoreGateSvc+MM_Measurements'),
438 ( 'Muon::sTgcPrepDataContainer' , 'StoreGateSvc+STGC_Measurements') ]
439 if flags.Muon.usePhaseIIGeoSetup:
440 dataObjects += [( 'MuonR4::SpacePointContainer' , 'StoreGateSvc+MuonSpacePoints' )]
441 if flags.Detector.GeometrysTGC or flags.Detector.GeometryMM:
442 dataObjects += [( 'MuonR4::SpacePointContainer' , 'StoreGateSvc+NswSpacePoints' )]
443
444 alg = CompFactory.AthViews.ViewDataVerifier( name = "VDVMuEFCB_"+name+suffix,
445 DataObjects = dataObjects)
446 acc.addEventAlgo(alg)
447 return acc
448
449
450
451def VDVPrecMuTrkCfg(flags, name, suffix):
452 acc = ComponentAccumulator()
453
454 vdvName = "VDVMuTrkLRT" if "LRT" in name else "VDVMuTrk"
455 trkname = "LRT" if "LRT" in name else ''
456 dataObjects = [( 'xAOD::IParticleContainer' , 'StoreGateSvc+'+ getIDTracks(flags, trkname) )]
457
458 if not flags.Muon.enableTrigIDtrackReuse and suffix == '':
459 dataObjects += [( 'xAOD::TrackParticleContainer' , 'StoreGateSvc+'+getIDTracks(flags, trkname, muonIDreuse=flags.Muon.enableTrigIDtrackReuse) )]
460 else:
461 if suffix != 'idReuse':
462 MuonL2CBContainer = muNames.L2CBName+suffix
463 else:
464 MuonL2CBContainer = muNames.L2CBName
465 dataObjects += [( 'xAOD::L2CombinedMuonContainer', 'StoreGateSvc+'+MuonL2CBContainer)]
466
467 if not flags.Input.isMC:
468 dataObjects += [( 'IDCInDetBSErrContainer' , 'StoreGateSvc+PixelByteStreamErrs' ),
469 ( 'IDCInDetBSErrContainer' , 'StoreGateSvc+SCT_ByteStreamErrs' )]
470
471 alg = CompFactory.AthViews.ViewDataVerifier( name = vdvName+suffix,
472 DataObjects = dataObjects)
473 acc.addEventAlgo(alg)
474 return acc
475
476
477def VDVidReuseITkCfg(flags, suffix):
478 acc = ComponentAccumulator()
479
480 vdvName = "VDVidReuseITk"
481 dataObjects = []
482
483 from TrigInDetConfig.TrigInDetConfig import InDetExtraDataObjectsFromDataPrep
484 InDetExtraDataObjectsFromDataPrep(flags, dataObjects)
485
486 alg = CompFactory.AthViews.ViewDataVerifier( name = vdvName+suffix,
487 DataObjects = dataObjects)
488 acc.addEventAlgo(alg)
489 return acc
490
491
492def muEFCBRecoSequenceCfg( flags, RoIs, name, suffix ):
493
494
495 from MuonCombinedAlgs.MuonCombinedAlgsMonitoring import MuonCreatorAlgMonitoring
496 from MuonCombinedConfig.MuonCombinedReconstructionConfig import MuonCreatorAlgCfg, MuonCombinedAlgCfg, MuonCombinedInDetCandidateAlgCfg
497 acc = ComponentAccumulator()
498
499 acc.merge(VDVEFMuCBCfg(flags, RoIs, name, suffix))
500
501 if "FS" in name:
502 #Need to run tracking for full scan chains
503 from TrigInDetConfig.TrigInDetConfig import trigInDetFastTrackingCfg
504 acc.merge(trigInDetFastTrackingCfg( flags, roisKey=RoIs, signatureName="muonFS" ))
505
506 else:
507 acc.merge(VDVPrecMuTrkCfg(flags, name, suffix))
508
509
510 #Precision Tracking
511 from TrigInDetConfig.TrigInDetConfig import trigInDetPrecisionTrackingCfg
512 #When run in a different view than FTF some data dependencies needs to be loaded through verifier
513 #Pass verifier as an argument and it will automatically append necessary DataObjects
514 #@NOTE: Don't provide any verifier if loaded in the same view as FTF
515 if isCosmic(flags) and 'LRT' not in name:
516 trackParticles=getIDTracks(flags, name, muonIDreuse=flags.Muon.enableTrigIDtrackReuse)
517 elif 'LRT' in name:
518 muLrtFlags = getFlagsForActiveConfig(flags, "muonLRT", log)
519 acc.merge(trigInDetPrecisionTrackingCfg(muLrtFlags, rois= RoIs, signatureName="muonLRT"))
520 trackParticles = getIDTracks(muLrtFlags, name, precision=True)
521 elif 'FS' in name:
522 muFsFlags = getFlagsForActiveConfig(flags, "muonFS", log)
523 acc.merge(trigInDetPrecisionTrackingCfg(muFsFlags, rois= RoIs, signatureName="muonFS", in_view=False))
524 trackParticles = getIDTracks(muFsFlags, precision=True)
525 else:
526 muFlags = getFlagsForActiveConfig(flags, "muon", log)
527 if not flags.Muon.enableTrigIDtrackReuse and suffix == '':
528 acc.merge(trigInDetPrecisionTrackingCfg(muFlags, rois= RoIs, signatureName="muon"))
529 trackParticles=getIDTracks(muFlags, name, muonIDreuse=flags.Muon.enableTrigIDtrackReuse, precision=True, suffix=suffix)
530
531 if flags.Muon.enableTrigIDtrackReuse or suffix != '':
532 if 'LRT' not in name or 'FS' not in name:
533 if flags.GeoModel.Run > LHCPeriod.Run3:
534 acc.merge(VDVidReuseITkCfg(flags, suffix))
535 if suffix != 'idReuse':
536 MuonL2CBInputContainer = muNames.L2CBName+suffix
537 else:
538 MuonL2CBInputContainer = muNames.L2CBName
539 from TrigMuonEF.TrigMuonEFConfig import GetL2CBmuonInDetTracksAlgCfg
540 acc.merge(GetL2CBmuonInDetTracksAlgCfg(flags, name="GetL2CBInDetTracks"+suffix,
541 MuonL2CBContainerLocation=MuonL2CBInputContainer,
542 IDtrackOutputLocation="HLT_IDTrack_MuonComb_FTF"+suffix))
543
544 #Make InDetCandidates
545 acc.merge(MuonCombinedInDetCandidateAlgCfg(flags, name="TrigMuonCombinedInDetCandidateAlg_"+name+suffix,TrackParticleLocation = [trackParticles], InDetCandidateLocation="InDetCandidates_"+name+suffix))
546
547
548 #MS ID combination
549 candidatesName = "MuonCandidates"
550 if 'FS' in name:
551 candidatesName = "MuonCandidates_FS"
552
553 acc.merge(MuonCombinedAlgCfg(flags,name="TrigMuonCombinedAlg_"+name+suffix, MuonCandidateLocation=candidatesName, InDetCandidateLocation="InDetCandidates_"+name+suffix))
554
555 cbMuonName = muNames.EFCBOutInName
556 if 'FS' in name:
557 cbMuonName = muNamesFS.EFCBOutInName
558 elif 'LRT' in name:
559 cbMuonName = muNamesLRT.EFCBName
560
561
562 acc.merge(MuonCreatorAlgCfg(flags, name="TrigMuonCreatorAlgCB_"+name+suffix, MuonCandidateLocation=[candidatesName], TagMaps=["muidcoTagMap"], InDetCandidateLocation="InDetCandidates_"+name+suffix,
563 MuonContainerLocation = cbMuonName+suffix, ExtrapolatedLocation = "CBExtrapolatedMuons"+suffix,
564 MSOnlyExtrapolatedLocation = "CBMSonlyExtrapolatedMuons"+suffix, CombinedLocation = "HLT_CBCombinedMuon_"+name+suffix,
565 MonTool = MuonCreatorAlgMonitoring(flags, "MuonCreatorAlgCB_"+name+suffix)))
566
567
568
569 return acc
570
571
572def VDVMuInsideOutCfg(flags, name, candidatesName, suffix):
573 acc = ComponentAccumulator()
574 dataObjects = [( 'Muon::RpcPrepDataContainer' , 'StoreGateSvc+RPC_Measurements' ),
575 ( 'Muon::TgcPrepDataContainer' , 'StoreGateSvc+TGC_MeasurementsAllBCs' ),
576 ( 'MuonCandidateCollection' , 'StoreGateSvc+'+candidatesName ),
577 ('Trk::SegmentCollection' , 'StoreGateSvc+TrackMuonSegments')]
578 if not isCosmic(flags): dataObjects += [( 'Muon::HoughDataPerSectorVec' , 'StoreGateSvc+HoughDataPerSectorVec')]
579 if flags.Detector.GeometryCSC:
580 dataObjects += [( 'Muon::CscPrepDataContainer' , 'StoreGateSvc+CSC_Clusters' )]
581 if flags.Detector.GeometrysTGC and flags.Detector.GeometryMM:
582 dataObjects += [( 'Muon::MMPrepDataContainer' , 'StoreGateSvc+MM_Measurements'),
583 ( 'Muon::sTgcPrepDataContainer' , 'StoreGateSvc+STGC_Measurements') ]
584
585 alg = CompFactory.AthViews.ViewDataVerifier( name = "VDVMuInsideOut_"+name+suffix,
586 DataObjects = dataObjects)
587 acc.addEventAlgo(alg)
588 return acc
589
590
591def muEFInsideOutRecoSequenceCfg(flags, RoIs, name, suffix ):
592
593 from MuonConfig.MuonSegmentFindingConfig import MuonSegmentFinderAlgCfg, MuonLayerHoughAlgCfg, MuonSegmentFilterAlgCfg
594 from MuonCombinedAlgs.MuonCombinedAlgsMonitoring import MuonCreatorAlgMonitoring
595 from MuonCombinedConfig.MuonCombinedReconstructionConfig import MuonCreatorAlgCfg, MuGirlStauAlgCfg, StauCreatorAlgCfg, MuonInDetToMuonSystemExtensionAlgCfg, MuonInsideOutRecoAlgCfg, MuonCombinedInDetCandidateAlgCfg
596 from MuonCombinedConfig.MuonCombinedRecToolsConfig import MuonInsideOutRecoToolCfg
597
598 acc = ComponentAccumulator()
599
600 candidatesName = "MuonCandidates"
601 if 'FS' in name:
602 candidatesName = "MuonCandidates_FS"
603
604 if "Late" in name:
605
606 #Need to run hough transform at start of late muon chain
607 acc.merge(MuonLayerHoughAlgCfg(flags, "TrigMuonLayerHoughAlg_"+name,MuonPatternCombinationCollection="MuonLayerHoughCombis_"+name,
608 Key_MuonLayerHoughToolHoughDataPerSectorVec="HoughDataPerSectorVec_"+name))
609
610
611 # if NSW is excluded from reconstruction (during commissioning)
612 if flags.Muon.runCommissioningChain:
613 acc.merge(MuonSegmentFinderAlgCfg(flags, name="TrigMuonSegmentMaker_"+name,SegmentCollectionName="TrackMuonSegments_withNSW",MuonLayerHoughCombisKey="MuonLayerHoughCombis_"+name))
614 acc.merge(MuonSegmentFilterAlgCfg(flags, name="TrigMuonSegmentFilter_"+name,SegmentCollectionName="TrackMuonSegments_withNSW",
615 FilteredCollectionName="TrackMuonSegments", TrashUnFiltered=False, ThinStations=()))
616 else:
617 acc.merge(MuonSegmentFinderAlgCfg(flags, "TrigMuonSegmentMaker_"+name,MuonLayerHoughCombisKey="MuonLayerHoughCombis_"+name))
618
619
620 # need to run precisions tracking for late muons, since we don't run it anywhere else
621 from TrigInDetConfig.TrigInDetConfig import trigInDetPrecisionTrackingCfg
622 muLateFlags = getFlagsForActiveConfig(flags, "muonLate", log)
623 acc.merge(trigInDetPrecisionTrackingCfg(muLateFlags, rois= RoIs, signatureName="muonLate", in_view=False))
624 trackParticles = muLateFlags.Tracking.ActiveConfig.tracks_IDTrig
625
626 #Make InDetCandidates
627 acc.merge(MuonCombinedInDetCandidateAlgCfg(flags, name="TrigMuonCombinedInDetCandidateAlg_"+name,TrackParticleLocation=[trackParticles],ForwardParticleLocation=trackParticles,InDetCandidateLocation="InDetCandidates_"+name,ExtendBulk=True))
628
629 else:
630 # for non-latemu chains, the decoding/hough transform is run in an earlier step
631 #Need PRD containers for inside-out reco
632 acc.merge(VDVMuInsideOutCfg(flags, name, candidatesName, suffix))
633
634 #Inside-out reconstruction
635
636 cbMuonName = muNames.EFCBInOutName+suffix
637 if 'Late' in name:
638 cbMuonName = recordable(cbMuonName+"_Late")
639 acc.merge(MuGirlStauAlgCfg(flags, name="TrigMuonLateInsideOutRecoAlg_"+name,InDetCandidateLocation="InDetCandidates_"+name))
640 acc.merge(StauCreatorAlgCfg(flags, name="TrigLateMuonCreatorAlg_"+name, TagMaps=["stauTagMap"], SegmentContainerName="", InDetCandidateLocation="InDetCandidates_"+name,
641 MuonContainerLocation=cbMuonName, MonTool=MuonCreatorAlgMonitoring(flags, "LateMuonCreatorAlg_"+name)))
642 else:
643 acc.merge(MuonInDetToMuonSystemExtensionAlgCfg(flags, name="TrigInDetMuonExtensionAlg_"+name+suffix, InputInDetCandidates="InDetCandidates_"+name+suffix,
644 WriteInDetCandidates="InDetCandidatesSystemExtended_"+name+suffix))
645 if 'RoI' in name:
646 ioTool = MuonInsideOutRecoToolCfg(flags, MuonLayerSegmentFinderTool="", InputSegments="TrackMuonSegments")
647 else:
648 ioTool = MuonInsideOutRecoToolCfg(flags)
649 InsideOutRecoTool = acc.popToolsAndMerge(ioTool)
650
651 acc.merge(MuonInsideOutRecoAlgCfg(flags, name="TrigMuonInsideOutRecoAlg_"+name+suffix,InDetCandidateLocation="InDetCandidatesSystemExtended_"+name+suffix, MuonCombinedInDetExtensionTool=InsideOutRecoTool))
652
653 acc.merge(MuonCreatorAlgCfg(flags, name="TrigMuonCreatorAlgInsideOut_"+name+suffix, MuonCandidateLocation=[candidatesName], TagMaps=["muGirlTagMap"],InDetCandidateLocation="InDetCandidates_"+name+suffix,
654 MuonContainerLocation = cbMuonName, ExtrapolatedLocation = "InsideOutCBExtrapolatedMuons"+suffix,
655 MSOnlyExtrapolatedLocation = "InsideOutCBMSOnlyExtrapolatedMuons"+suffix, CombinedLocation = "InsideOutCBCombinedMuon"+suffix, MonTool = MuonCreatorAlgMonitoring(flags, "MuonCreatorAlgInsideOut_"+name+suffix)))
656
657 return acc
658
659
660def VDVMuIsoCfg(flags, name, RoIs):
661 acc = ComponentAccumulator()
662 dataObjects = [( 'TrigRoiDescriptorCollection' , 'StoreGateSvc+'+RoIs ),
663 ( 'xAOD::MuonContainer' , 'StoreGateSvc+IsoViewMuons'+name )]
664
665 alg = CompFactory.AthViews.ViewDataVerifier( name = "efMuIsoVDV"+name,
666 DataObjects = dataObjects)
667 acc.addEventAlgo(alg)
668 return acc
669
670
671def efmuisoRecoSequenceCfg( flags, RoIs, Muons, doMSiso=False ):
672
673 name = ""
674 if doMSiso:
675 name = "MS"
676 acc = VDVMuIsoCfg(flags, name, RoIs)
677
678 acc.merge(muonIDFastTrackingSequenceCfg(flags, RoIs, "muonIso"+name ))
679
680 from TrigInDetConfig.TrigInDetConfig import trigInDetPrecisionTrackingCfg
681 muIsoFlags = getFlagsForActiveConfig(flags, "muonIso"+name, log)
682 acc.merge(trigInDetPrecisionTrackingCfg(muIsoFlags, rois= RoIs, signatureName="muonIso"+name, in_view=False))
683 trackParticles = muIsoFlags.Tracking.ActiveConfig.tracks_IDTrig
684
685 # Isolation alg
686 from TrigMuonEF.TrigMuonEFConfig import TrigMuonEFTrackIsolationAlgCfg
687 acc.merge(TrigMuonEFTrackIsolationAlgCfg(flags,name="TrigEFMuIso"+name, requireCombinedMuon = not doMSiso,
688 MuonEFContainer = Muons,IdTrackParticles = trackParticles, MuonContName = muNames.EFIsoMuonName+name,
689 ptcone02Name = muNames.EFIsoMuonName+name + ".ptcone02",
690 ptcone03Name = muNames.EFIsoMuonName+name + ".ptcone03"))
691
692 return acc
693
694def VDVLateMuCfg(flags):
695 acc = ComponentAccumulator()
696 dataObjects = [( 'xAOD::MuonRoIContainer', 'StoreGateSvc+LVL1MuonRoIsBCm2' ),
697 ( 'xAOD::MuonRoIContainer', 'StoreGateSvc+LVL1MuonRoIsBCm1' ),
698 ( 'xAOD::MuonRoIContainer', 'StoreGateSvc+LVL1MuonRoIsBCp1' ),
699 ( 'xAOD::MuonRoIContainer', 'StoreGateSvc+LVL1MuonRoIsBCp2' )]
700
701 alg = CompFactory.AthViews.ViewDataVerifier( name = "efLateMuRoIVDV",
702 DataObjects = dataObjects)
703 acc.addEventAlgo(alg)
704 return acc
705
706
708
709 acc = VDVLateMuCfg(flags)
710
711 from TrigmuRoI.TrigmuRoIConfig import TrigmuRoIConfig
712 sequenceOut = "LateMuRoIs"
713 acc.merge(TrigmuRoIConfig(flags, "TrigmuRoI", outputRoIs=sequenceOut))
714
715 return acc, sequenceOut
muEFSARecoSequenceCfg(flags, RoIs, name, useBucketFilter=False)
EFMuSADataPrepViewDataVerifierCfg(flags, RoIs, roiName)
muonIDFastTrackingSequenceCfg(flags, RoIs, name, extraLoads=None, extraLoadsForl2mtmode=None, doLRT=False, trackingMode="FTF")
muonIDCosmicTrackingSequenceCfg(flags, RoIs, name, extraLoads=None, extraLoadsForl2mtmode=None)
muonIDtrackVDVCfg(flags, name, RoIs, extraLoads=None, extraLoadsForl2mtmode=None)
muEFInsideOutRecoSequenceCfg(flags, RoIs, name, suffix)
getIDTracks(flags, name='', muonIDreuse=False, precision=False, suffix='')
muCombRecoSequenceCfg(flags, RoIs, name, l2mtmode=False, l2CBname="")
VDVMuInsideOutCfg(flags, name, candidatesName, suffix)
muFastVDVCfg(flags, RoIs, postFix, InsideOutMode, extraLoads)
muEFCBRecoSequenceCfg(flags, RoIs, name, suffix)
VDVEFMuCBCfg(flags, RoIs, name, suffix)
muFastRecoSequenceCfg(flags, RoIs, doFullScanID=False, InsideOutMode=False, extraLoads=None, l2mtmode=False, calib=False)
efmuisoRecoSequenceCfg(flags, RoIs, Muons, doMSiso=False)