ATLAS Offline Software
Loading...
Searching...
No Matches
MuonReconstructionConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
3# Core configuration
4from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
5from AthenaConfiguration.ComponentFactory import CompFactory
6
7# Local
8from MuonConfig.MuonSegmentFindingConfig import MuonSegmentFindingCfg
9from MuonConfig.MuonTrackBuildingConfig import MuonTrackBuildingCfg
10from xAODTrackingCnv.xAODTrackingCnvConfig import MuonStandaloneTrackParticleCnvAlgCfg
11
13 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
14 result = ComponentAccumulator()
15
16 # FIXME! Fix for ATLASRECTS-5151. Remove when better solution found.
17 from TrkEventCnvTools.TrkEventCnvToolsConfig import (
18 TrkEventCnvSuperToolCfg)
19 result.merge(TrkEventCnvSuperToolCfg(flags))
20
21 aod_items = []
22 if flags.Detector.EnableMM or flags.Detector.EnablesTGC:
23 aod_items += ["xAOD::TrackParticleContainer#EMEO_MuonSpectrometerTrackParticles"]
24 aod_items += ["xAOD::TrackParticleAuxContainer#EMEO_MuonSpectrometerTrackParticlesAux."]
25 aod_items += ["xAOD::MuonSegmentContainer#xAODNSWSegments"]
26 aod_items += ["xAOD::MuonSegmentAuxContainer#xAODNSWSegmentsAux."]
27
28 aod_items += ["xAOD::MuonSegmentContainer#NCB_MuonSegments"]
29 aod_items += ["xAOD::MuonSegmentAuxContainer#NCB_MuonSegmentsAux."]
30
31 if flags.Muon.scheduleActsReco:
32 aod_items += ["xAOD::MuonSegmentContainer#MuonSegmentsFromR4"]
33 aod_items += ["xAOD::MuonSegmentAuxContainer#MuonSegmentsFromR4Aux.-localSegPars.-parentSegment"]
34
35 # TrackParticles
36 aod_items += ["xAOD::TrackParticleContainer#MuonSpectrometerTrackParticles"]
37 aod_items += ["xAOD::TrackParticleAuxContainer#MuonSpectrometerTrackParticlesAux."]
38 aod_items += ["xAOD::TrackParticleContainer#MuonSpectrometerOnlyTrackParticles"]
39 aod_items += ["xAOD::TrackParticleAuxContainer#MuonSpectrometerOnlyTrackParticlesAux."]
40
41 aod_items += ["xAOD::TrackParticleContainer#MSonlyTracklets"]
42 aod_items += ["xAOD::TrackParticleAuxContainer#MSonlyTrackletsAux."]
43 aod_items += ["xAOD::VertexContainer#MSDisplacedVertex"]
44 aod_items += ["xAOD::VertexAuxContainer#MSDisplacedVertexAux."]
45
46 if flags.Input.isMC or flags.Overlay.DataOverlay:
47 # Truth Particle Container
48 aod_items += ["xAOD::TruthParticleContainer#MuonTruthParticles"]
49 aod_items += ["xAOD::TruthParticleAuxContainer#MuonTruthParticlesAux."]
50
51 # Truth Segment Container
52 aod_items += ["xAOD::MuonSegmentContainer#MuonTruthSegments"]
53 aod_items += ["xAOD::MuonSegmentAuxContainer#MuonTruthSegmentsAux.-localSegPars"]
54
55 # ESD list includes all AOD items
56 esd_items = []
57 esd_items += aod_items
58
59 # PRDs et al
60 if flags.Detector.EnableMM:
61 esd_items += ["Muon::MMPrepDataContainer#MM_Measurements"]
62 esd_items += ["xAOD::NSWMMTPRDOContainer#*", "xAOD::NSWMMTPRDOAuxContainer#*"]
63 if flags.Detector.EnablesTGC:
64 esd_items += ["Muon::sTgcPrepDataContainer#STGC_Measurements"]
65 esd_items += ["Muon::NSW_PadTriggerDataContainer#NSW_PadTrigger_RDO"]
66 esd_items += ["xAOD::NSWTPRDOContainer#*", "xAOD::NSWTPRDOAuxContainer#*"]
67
68
69 if flags.Detector.EnableCSC:
70 esd_items += ["Muon::CscPrepDataContainer#CSC_Clusters"]
71 esd_items += ["Muon::CscStripPrepDataContainer#CSC_Measurements"]
72 esd_items += ["Muon::RpcPrepDataContainer#RPC_Measurements"]
73 esd_items += ["Muon::TgcPrepDataContainer#TGC_MeasurementsAllBCs"]
74 esd_items += ["Muon::MdtPrepDataContainer#MDT_DriftCircles"]
75
76 if flags.Muon.writexAODPRD:
77 esd_items += ["xAOD::MdtDriftCircleContainer#xMdtDriftCircles", "xAOD::MdtDriftCircleAuxContainer#xMdtDriftCirclesAux." ]
78 esd_items += ["xAOD::MdtTwinDriftCircleContainer#xMdtTwinDriftCircles", "xAOD::MdtTwinDriftCircleAuxContainer#xMdtTwinDriftCirclesAux." ]
79 esd_items += ["xAOD::sTgcStripContainer#xAODsTgcStrips", "xAOD::sTgcStripAuxContainer#xAODsTgcStripsAux." ]
80 esd_items += ["xAOD::sTgcPadContainer#xAODsTgcPads", "xAOD::sTgcPadAuxContainer#xAODsTgcPadsAux." ]
81 esd_items += ["xAOD::sTgcWireContainer#xAODsTgcWires", "xAOD::sTgcWireAuxContainer#xAODsTgcWiresAux." ]
82 esd_items += ["xAOD::MMClusterContainer#xAODMMClusters", "xAOD::MMClusterAuxContainer#xAODMMClustersAux." ]
83 esd_items += ["xAOD::TgcStripContainer#xTgcStrips", "xAOD::TgcStripAuxContainer#xTgcStripsAux." ]
84 esd_items += ["xAOD::RpcStripContainer#xRpcStrips", "xAOD::RpcStripAuxContainer#xRpcStripsAux." ]
85 esd_items += ["xAOD::RpcStrip2DContainer#xRpcBILStrips", "xAOD::RpcStrip2DAuxContainer#xRpcBILStripsAux." ]
86
87
88
89 # trigger related info for offline DQA
90 esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollection"]
91 esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollectionPriorBC"]
92 esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollectionNextBC"]
93 esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollectionNextNextBC"]
94 esd_items += ["Muon::RpcCoinDataContainer#RPC_triggerHits"]
95 esd_items += ["RpcSectorLogicContainer#RPC_SECTORLOGIC"]
96
97 # trigger info for RPC time calibration
98 if flags.Output.doWriteRDO or flags.Muon.doWriteRpcRDO:
99 esd_items += ["RpcPadContainer#RPCPAD"]
100
101 # Segments
102 esd_items += ["Trk::SegmentCollection#NCB_TrackMuonSegments"]
103
104 # Tracks
105 esd_items += ["TrackCollection#MuonSpectrometerTracks"]
106 if flags.Muon.runCommissioningChain:
107 esd_items += ["TrackCollection#EMEO_MuonSpectrometerTracks"]
108 if flags.Detector.EnableMM or flags.Detector.EnablesTGC:
109 esd_items += ["Trk::SegmentCollection#TrackMuonNSWSegments"]
110
111 # Truth
112 if flags.Input.isMC:
113 esd_items += ["TrackRecordCollection#MuonEntryLayerFilter"]
114 esd_items += ["TrackRecordCollection#MuonExitLayerFilter"]
115
116 esd_items += ["PRD_MultiTruthCollection#MDT_TruthMap",
117 "PRD_MultiTruthCollection#RPC_TruthMap", "PRD_MultiTruthCollection#TGC_TruthMap"]
118 if flags.Detector.EnableCSC:
119 esd_items += ["PRD_MultiTruthCollection#CSC_TruthMap"]
120 if flags.Detector.EnablesTGC:
121 esd_items += ["PRD_MultiTruthCollection#STGC_TruthMap"]
122 if flags.Detector.EnableMM:
123 esd_items += ["PRD_MultiTruthCollection#MM_TruthMap"]
124
125 # Track truth
126 esd_items += ["DetailedTrackTruthCollection#MuonSpectrometerTracksTruth"]
127 esd_items += ["TrackTruthCollection#MuonSpectrometerTracksTruth"]
128
129 if flags.Muon.writeSDOs:
130 if flags.Detector.EnableCSC: esd_items+=["CscSimDataCollection#CSC_SDO"]
131 esd_items+=["MuonSimDataCollection#MDT_SDO"]
132 esd_items+=["MuonSimDataCollection#RPC_SDO"]
133 esd_items+=["MuonSimDataCollection#TGC_SDO"]
134 if flags.Detector.EnablesTGC: esd_items+=["MuonSimDataCollection#sTGC_SDO"]
135 if flags.Detector.EnableMM: esd_items+=["MuonSimDataCollection#MM_SDO"]
136
137 if flags.Muon.writexAODPRD:
138 for item in ["MDT_SDO","RPC_SDO","TGC_SDO","MM_SDO","sTGC_SDO"]:
139 esd_items += [f"xAOD::MuonSimHitContainer#{item}", f"xAOD::MuonSimHitAuxContainer#{item}Aux."]
140
141 if flags.Output.doWriteESD:
142 result.merge(OutputStreamCfg(flags, "ESD", esd_items))
143 if flags.Output.doWriteAOD:
144 result.merge(OutputStreamCfg(flags, "AOD", aod_items))
145 return result
146
147
149 # https://gitlab.cern.ch/atlas/athena/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py
150 from MuonConfig.MuonPrepDataConvConfig import MuonPrepDataConvCfg
151 from MuonConfig.MuonRecToolsConfig import MuonTrackScoringToolCfg
152 from MuonConfig.MuonGeometryConfig import MuonIdHelperSvcCfg
153 from MuonConfig.MuonRecToolsConfig import MuonEDMHelperSvcCfg
154 from TrkConfig.TrkTrackSummaryToolConfig import MuonTrackSummaryToolCfg
155 from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg
156
157 # Many components need these services, so setup once here.
158 result = MuonIdHelperSvcCfg(flags)
159 result.merge(MuonEDMHelperSvcCfg(flags))
160
161 # Now setup reconstruction steps
162 result.merge(MuonPrepDataConvCfg(flags))
163 result.merge(MuonSegmentFindingCfg(flags))
164 result.merge(MuonTrackBuildingCfg(flags))
165 result.merge(MuonStandaloneTrackParticleCnvAlgCfg(flags))
166 if flags.Muon.runCommissioningChain:
167 result.merge(MuonStandaloneTrackParticleCnvAlgCfg(flags,
168 "MuonStandaloneTrackParticleCnvAlg_EMEO",
169 TrackContainerName="EMEO_MuonSpectrometerTracks",
170 xAODTrackParticlesFromTracksContainerName="EMEO_MuonSpectrometerTrackParticles"))
171
172 # FIXME - this is copied from the old configuration, but I'm not sure it really belongs here.
173 # It's probably better to have as part of TrackBuilding, or Segment building...
174 if flags.Input.isMC or flags.Overlay.DataOverlay:
175 # filter TrackRecordCollection (true particles in muon spectrometer)
176 if "MuonEntryLayerFilter" not in flags.Input.Collections and \
177 ("MuonEntryLayer" in flags.Input.Collections):
178 result.addEventAlgo(CompFactory.TrackRecordFilter())
179 if "MuonExitLayerFilter" not in flags.Input.Collections and \
180 ("MuonExitLayer" in flags.Input.Collections):
181 result.addEventAlgo(CompFactory.TrackRecordFilter("TrackRecordFilterMuonExitLayer",
182 inputName="MuonExitLayer",
183 outputName="MuonExitLayerFilter"))
184
185 # Now tracks
186 track_cols = ["MuonSpectrometerTracks"]
187 track_colstp = ["MuonSpectrometerTrackParticles"]
188 if flags.Muon.runCommissioningChain:
189 track_cols += ["EMEO_MuonSpectrometerTracks"]
190 track_colstp += ["EMEO_MuonSpectrometerTrackParticles"]
191
192 from MuonConfig.MuonTruthAlgsConfig import MuonDetailedTrackTruthMakerCfg
193 result.merge(MuonDetailedTrackTruthMakerCfg(flags, name="MuonStandaloneDetailedTrackTruthMaker",
194 TrackCollectionNames=track_cols))
195
196 if not flags.Muon.scheduleActsReco:
197 for i in range(len(track_cols)):
198 from TrkConfig.TrkTruthAlgsConfig import TrackTruthSelectorCfg, TrackParticleTruthAlgCfg
199 result.merge(TrackTruthSelectorCfg(flags, tracks=track_cols[i]))
200 result.merge(TrackParticleTruthAlgCfg(flags, tracks=track_cols[i],
201 TrackParticleName=track_colstp[i]))
202
203 # Check if we're making PRDs
204 # FIXME - I think we can remove this flag if we shift this to where PRDs are being created. However, this will involve some refactoring, so temporary fix is this.
205 if flags.Muon.makePRDs:
206 if not flags.Muon.usePhaseIIGeoSetup:
207 from MuonConfig.MuonTruthAlgsConfig import MuonTruthAlgsCfg
208 result.merge(MuonTruthAlgsCfg(flags))
209 else:
210 from MuonTruthAlgsR4.MuonTruthAlgsConfig import MuonTruthAlgsCfg
211 result.merge(MuonTruthAlgsCfg(flags))
212
213 if flags.Muon.doMSVertex:
214 msvertexrecotool = CompFactory.Muon.MSVertexRecoTool(
215 MyExtrapolator=result.popToolsAndMerge(
216 AtlasExtrapolatorCfg(flags)),
217 TGCKey='TGC_MeasurementsAllBCs' if not flags.Muon.useTGCPriorNextBC else 'TGC_Measurements')
218 the_alg = CompFactory.MSVertexRecoAlg(
219 name="MSVertexRecoAlg", MSVertexRecoTool=msvertexrecotool)
220 # Not explicitly configuring MSVertexTrackletTool
221 result.addEventAlgo(the_alg)
222
223 # FIXME - work around to fix unconfigured public MuonTrackScoringTool
224 # It wuould be best to find who is using this tool, and add this configuration there
225 # But AFAICS the only parent is MuonCombinedFitTagTool, and it's private there, so I'm a bit confused.
226 result.addPublicTool(result.popToolsAndMerge(
227 MuonTrackScoringToolCfg(flags)))
228 # Ditto
229 result.addPublicTool(result.popToolsAndMerge(
230 MuonTrackSummaryToolCfg(flags)))
231
232 # Setup output
233 if flags.Output.doWriteESD or flags.Output.doWriteAOD:
234 result.merge(StandaloneMuonOutputCfg(flags))
235 return result
236
237# Run with python -m MuonConfig.MuonReconstructionConfig
239
240 if flags is None:
241 from MuonConfig.MuonConfigUtils import SetupMuonStandaloneConfigFlags
242 flags = SetupMuonStandaloneConfigFlags()
243
244 from MuonConfig.MuonConfigUtils import SetupMuonStandaloneCA
245 cfg = SetupMuonStandaloneCA(flags)
246
247 # Run the actual test.
248 acc = MuonReconstructionCfg(flags)
249 cfg.merge(acc)
250
251 from SGComps.AddressRemappingConfig import InputRenameCfg
252 cfg.merge(InputRenameCfg("TrackCollection",
253 "MuonSpectrometerTracks", "MuonSpectrometerTracks_old"))
254
255 cfg.printConfig(withDetails=True)
256 # drop faulty remapping
257 # the evaluation of MuonSegmentNameFixCfg should happen conditionally instead
258 # this is hack that is functioning only because this is top level CA
259 oldRemaps = cfg.getService("AddressRemappingSvc").TypeKeyRenameMaps
260 cfg.getService("AddressRemappingSvc").TypeKeyRenameMaps = [
261 remap for remap in oldRemaps if "Trk::SegmentCollection" not in remap]
262
263 f = open("MuonReconstruction.pkl", "wb")
264 cfg.store(f)
265 f.close()
266
267 from MuonConfig.MuonConfigUtils import executeTest
268 executeTest(cfg)
269
270
271
272
273def MuonNCBTrackCfg(flags, cfg):
274 """
275 This config (made for r24.0 in Nov 2024) is used to:
276 1] Switch setup of the segment making in the NSW to loosen constrain on the IP
277 2] Adapt and switch off various criteria in TrackSteering/building to be able to reconstruct track from the non-standards (non-collision background) segments
278 """
279
280 #Adapting NCB alg setup for the standard segment maker alg
281 cfg.getEventAlgo("MuonSegmentMaker").NSWSegmentMaker.SeedMMStereos=False
282 cfg.getEventAlgo("MuonSegmentMaker").NSWSegmentMaker.IPConstraint=False
283
284
285 #Most of the setup below is to suppress background which now we want to reconstruct
286 cfg.getEventAlgo("MuonCreatorAlg").MuonCreatorTool.RequireMSOEforSA=False
287 cfg.getEventAlgo("MuonCreatorAlg").MuonCreatorTool.RequireCaloForSA=False
288
289 cfg.getEventAlgo("MuonCombinedMuonCandidateAlg").MuonCandidateTool.ExtrapolationStrategy=1
290
291 #Loosen up segment criteria
292 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.SegSeedQCut = -2
293 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.Seg2ndQCut = -2
294 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.SegOtherQCut = -2 #by default already -2
295 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.UseTightSegmentMatching = False
296
297 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.DoTrackSegmentMatching = False
298 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.MooBuilderTool.CandidateMatchingTool.DoTrackSegmentMatching = False
299 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.DoTrackSegmentMatching = False
300 #MuPatTrackBuilder.MuonTrackSteering.MooCandidateMatchingTool
301 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.CandidateMatchingTool.DoTrackSegmentMatching = False
302 #MuPatTrackBuilder.MuonTrackSteering.MooTrackBuilderTemplate.MooCandidateMatchingTool
303 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackRefinementTool.CandidateMatchingTool.DoTrackSegmentMatching = False
304
305 #MuPatTrackBuilder.MuonTrackSteering.MooCandidateMatchingTool.MuonSegmentMatchingTool
306 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.CandidateMatchingTool.SegmentMatchingTool.UseEndcapExtrapolationMatching = False
307 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.CandidateMatchingTool.SegmentMatchingTool.doThetaMatching = False
308 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.CandidateMatchingTool.SegmentMatchingTool.doPhiMatching = False
309
310 #MuPatTrackBuilder.MuonTrackSteering.MooMuonTrackBuilder.MuSt_MooCandidateMatchingTool.MuSt_MuonSegmentMatchingTool
311 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.SegmentMatchingTool.UseEndcapExtrapolationMatching = False
312 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.SegmentMatchingTool.doThetaMatching = False
313 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.SegmentMatchingTool.doPhiMatching = False
314
315 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.MooBuilderTool.CandidateMatchingTool.SegmentMatchingTool.UseEndcapExtrapolationMatching = False
316 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.MooBuilderTool.CandidateMatchingTool.SegmentMatchingTool.doThetaMatching = False
317 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.MooBuilderTool.CandidateMatchingTool.SegmentMatchingTool.doPhiMatching = False
318
319
320
321if __name__ == "__main__":
323