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::MuonSegmentContainer#xAODNSWSegments"]
24 aod_items += ["xAOD::MuonSegmentAuxContainer#xAODNSWSegmentsAux."]
25
26 aod_items += ["xAOD::MuonSegmentContainer#NCB_MuonSegments"]
27 aod_items += ["xAOD::MuonSegmentAuxContainer#NCB_MuonSegmentsAux."]
28
29 if flags.Muon.scheduleActsReco:
30 aod_items += ["xAOD::MuonSegmentContainer#MuonSegmentsFromR4"]
31 aod_items += ["xAOD::MuonSegmentAuxContainer#MuonSegmentsFromR4Aux.-localSegPars.-parentSegment"]
32
33 # TrackParticles
34 aod_items += ["xAOD::TrackParticleContainer#MuonSpectrometerTrackParticles"]
35 aod_items += ["xAOD::TrackParticleAuxContainer#MuonSpectrometerTrackParticlesAux."]
36 aod_items += ["xAOD::TrackParticleContainer#MuonSpectrometerOnlyTrackParticles"]
37 aod_items += ["xAOD::TrackParticleAuxContainer#MuonSpectrometerOnlyTrackParticlesAux."]
38
39 aod_items += ["xAOD::TrackParticleContainer#MSonlyTracklets"]
40 aod_items += ["xAOD::TrackParticleAuxContainer#MSonlyTrackletsAux."]
41 aod_items += ["xAOD::VertexContainer#MSDisplacedVertex"]
42 aod_items += ["xAOD::VertexAuxContainer#MSDisplacedVertexAux."]
43
44 if flags.Input.isMC or flags.Overlay.DataOverlay:
45 # Truth Particle Container
46 aod_items += ["xAOD::TruthParticleContainer#MuonTruthParticles"]
47 aod_items += ["xAOD::TruthParticleAuxContainer#MuonTruthParticlesAux."]
48
49 # Truth Segment Container
50 aod_items += ["xAOD::MuonSegmentContainer#MuonTruthSegments"]
51 aod_items += ["xAOD::MuonSegmentAuxContainer#MuonTruthSegmentsAux.-localSegPars"]
52
53 # ESD list includes all AOD items
54 esd_items = []
55 esd_items += aod_items
56
57 # PRDs et al
58 if flags.Detector.EnableMM:
59 esd_items += ["Muon::MMPrepDataContainer#MM_Measurements"]
60 esd_items += ["xAOD::NSWMMTPRDOContainer#*", "xAOD::NSWMMTPRDOAuxContainer#*"]
61 if flags.Detector.EnablesTGC:
62 esd_items += ["Muon::sTgcPrepDataContainer#STGC_Measurements"]
63 esd_items += ["Muon::NSW_PadTriggerDataContainer#NSW_PadTrigger_RDO"]
64 esd_items += ["xAOD::NSWTPRDOContainer#*", "xAOD::NSWTPRDOAuxContainer#*"]
65
66
67 if flags.Detector.EnableCSC:
68 esd_items += ["Muon::CscPrepDataContainer#CSC_Clusters"]
69 esd_items += ["Muon::CscStripPrepDataContainer#CSC_Measurements"]
70 esd_items += ["Muon::RpcPrepDataContainer#RPC_Measurements"]
71 esd_items += ["Muon::TgcPrepDataContainer#TGC_MeasurementsAllBCs"]
72 esd_items += ["Muon::MdtPrepDataContainer#MDT_DriftCircles"]
73
74 if flags.Muon.writexAODPRD:
75 esd_items += ["xAOD::MdtDriftCircleContainer#xMdtDriftCircles", "xAOD::MdtDriftCircleAuxContainer#xMdtDriftCirclesAux." ]
76 esd_items += ["xAOD::MdtTwinDriftCircleContainer#xMdtTwinDriftCircles", "xAOD::MdtTwinDriftCircleAuxContainer#xMdtTwinDriftCirclesAux." ]
77 esd_items += ["xAOD::sTgcStripContainer#xAODsTgcStrips", "xAOD::sTgcStripAuxContainer#xAODsTgcStripsAux." ]
78 esd_items += ["xAOD::sTgcPadContainer#xAODsTgcPads", "xAOD::sTgcPadAuxContainer#xAODsTgcPadsAux." ]
79 esd_items += ["xAOD::sTgcWireContainer#xAODsTgcWires", "xAOD::sTgcWireAuxContainer#xAODsTgcWiresAux." ]
80 esd_items += ["xAOD::MMClusterContainer#xAODMMClusters", "xAOD::MMClusterAuxContainer#xAODMMClustersAux." ]
81 esd_items += ["xAOD::TgcStripContainer#xTgcStrips", "xAOD::TgcStripAuxContainer#xTgcStripsAux." ]
82 esd_items += ["xAOD::RpcStripContainer#xRpcStrips", "xAOD::RpcStripAuxContainer#xRpcStripsAux." ]
83 esd_items += ["xAOD::RpcStrip2DContainer#xRpcBILStrips", "xAOD::RpcStrip2DAuxContainer#xRpcBILStripsAux." ]
84 esd_items += ["xAOD::CombinedMuonStripContainer#CombinedMuonPrds", "xAOD::CombinedMuonStripAuxContainer#CombinedMuonPrdsAux."]
85
86
87
88 # trigger related info for offline DQA
89 esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollection"]
90 esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollectionPriorBC"]
91 esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollectionNextBC"]
92 esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollectionNextNextBC"]
93 esd_items += ["Muon::RpcCoinDataContainer#RPC_triggerHits"]
94 esd_items += ["RpcSectorLogicContainer#RPC_SECTORLOGIC"]
95
96 # trigger info for RPC time calibration
97 if flags.Output.doWriteRDO or flags.Muon.doWriteRpcRDO:
98 esd_items += ["RpcPadContainer#RPCPAD"]
99
100 # Segments
101 esd_items += ["Trk::SegmentCollection#NCB_TrackMuonSegments"]
102
105
106 # Tracks
107 esd_items += ["TrackCollection#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
167 # FIXME - this is copied from the old configuration, but I'm not sure it really belongs here.
168 # It's probably better to have as part of TrackBuilding, or Segment building...
169 from AthenaConfiguration.Enums import Format
170 if (flags.Input.isMC or flags.Overlay.DataOverlay) and flags.Input.Format!=Format.BS:
171 # filter TrackRecordCollection (true particles in muon spectrometer)
172 if "MuonEntryLayerFilter" not in flags.Input.Collections and \
173 ("MuonEntryLayer" in flags.Input.Collections):
174 result.addEventAlgo(CompFactory.TrackRecordFilter())
175 if "MuonExitLayerFilter" not in flags.Input.Collections and \
176 ("MuonExitLayer" in flags.Input.Collections):
177 result.addEventAlgo(CompFactory.TrackRecordFilter("TrackRecordFilterMuonExitLayer",
178 inputName="MuonExitLayer",
179 outputName="MuonExitLayerFilter"))
180
181 # Now tracks
182 track_cols = ["MuonSpectrometerTracks"]
183 track_colstp = ["MuonSpectrometerTrackParticles"]
184
185 from MuonConfig.MuonTruthAlgsConfig import MuonDetailedTrackTruthMakerCfg
186 result.merge(MuonDetailedTrackTruthMakerCfg(flags, name="MuonStandaloneDetailedTrackTruthMaker",
187 TrackCollectionNames=track_cols))
188
189 if not flags.Muon.scheduleActsReco:
190 for i in range(len(track_cols)):
191 from TrkConfig.TrkTruthAlgsConfig import TrackTruthSelectorCfg, TrackParticleTruthAlgCfg
192 result.merge(TrackTruthSelectorCfg(flags, tracks=track_cols[i]))
193 result.merge(TrackParticleTruthAlgCfg(flags, tracks=track_cols[i],
194 TrackParticleName=track_colstp[i]))
195
196 # Check if we're making PRDs
197 # 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.
198 if flags.Muon.makePRDs:
199 if not flags.Muon.usePhaseIIGeoSetup:
200 from MuonConfig.MuonTruthAlgsConfig import MuonTruthAlgsCfg
201 result.merge(MuonTruthAlgsCfg(flags))
202 else:
203 from MuonTruthAlgsR4.MuonTruthAlgsConfig import MuonTruthAlgsCfg
204 result.merge(MuonTruthAlgsCfg(flags))
205
206 if flags.Muon.doMSVertex:
207 msvertexrecotool = CompFactory.Muon.MSVertexRecoTool(
208 MyExtrapolator=result.popToolsAndMerge(
209 AtlasExtrapolatorCfg(flags)),
210 TGCKey='TGC_MeasurementsAllBCs')
211 the_alg = CompFactory.MSVertexRecoAlg(
212 name="MSVertexRecoAlg", MSVertexRecoTool=msvertexrecotool)
213 # Not explicitly configuring MSVertexTrackletTool
214 result.addEventAlgo(the_alg)
215
216 # FIXME - work around to fix unconfigured public MuonTrackScoringTool
217 # It wuould be best to find who is using this tool, and add this configuration there
218 # But AFAICS the only parent is MuonCombinedFitTagTool, and it's private there, so I'm a bit confused.
219 result.addPublicTool(result.popToolsAndMerge(
220 MuonTrackScoringToolCfg(flags)))
221 # Ditto
222 result.addPublicTool(result.popToolsAndMerge(
223 MuonTrackSummaryToolCfg(flags)))
224
225 # Setup output
226 if flags.Output.doWriteESD or flags.Output.doWriteAOD:
227 result.merge(StandaloneMuonOutputCfg(flags))
228 return result
229
230# Run with python -m MuonConfig.MuonReconstructionConfig
232
233 if flags is None:
234 from MuonConfig.MuonConfigUtils import SetupMuonStandaloneConfigFlags
235 flags = SetupMuonStandaloneConfigFlags()
236
237 from MuonConfig.MuonConfigUtils import SetupMuonStandaloneCA
238 cfg = SetupMuonStandaloneCA(flags)
239
240 # Run the actual test.
241 acc = MuonReconstructionCfg(flags)
242 cfg.merge(acc)
243
244 from SGComps.AddressRemappingConfig import InputRenameCfg
245 cfg.merge(InputRenameCfg("TrackCollection",
246 "MuonSpectrometerTracks", "MuonSpectrometerTracks_old"))
247
248 cfg.printConfig(withDetails=True)
249 # drop faulty remapping
250 # the evaluation of MuonSegmentNameFixCfg should happen conditionally instead
251 # this is hack that is functioning only because this is top level CA
252 oldRemaps = cfg.getService("AddressRemappingSvc").TypeKeyRenameMaps
253 cfg.getService("AddressRemappingSvc").TypeKeyRenameMaps = [
254 remap for remap in oldRemaps if "Trk::SegmentCollection" not in remap]
255
256 f = open("MuonReconstruction.pkl", "wb")
257 cfg.store(f)
258 f.close()
259
260 from MuonConfig.MuonConfigUtils import executeTest
261 executeTest(cfg)
262
263
264
265
266def MuonNCBTrackCfg(flags, cfg):
267 """
268 This config (made for r24.0 in Nov 2024) is used to:
269 1] Switch setup of the segment making in the NSW to loosen constrain on the IP
270 2] Adapt and switch off various criteria in TrackSteering/building to be able to reconstruct track from the non-standards (non-collision background) segments
271 """
272
273 #Adapting NCB alg setup for the standard segment maker alg
274 cfg.getEventAlgo("MuonSegmentMaker").NSWSegmentMaker.SeedMMStereos=False
275 cfg.getEventAlgo("MuonSegmentMaker").NSWSegmentMaker.IPConstraint=False
276
277
278 #Most of the setup below is to suppress background which now we want to reconstruct
279 cfg.getEventAlgo("MuonCreatorAlg").MuonCreatorTool.RequireMSOEforSA=False
280 cfg.getEventAlgo("MuonCreatorAlg").MuonCreatorTool.RequireCaloForSA=False
281
282 cfg.getEventAlgo("MuonCombinedMuonCandidateAlg").MuonCandidateTool.ExtrapolationStrategy=1
283
284 #Loosen up segment criteria
285 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.SegSeedQCut = -2
286 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.Seg2ndQCut = -2
287 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.SegOtherQCut = -2 #by default already -2
288 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.UseTightSegmentMatching = False
289
290 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.DoTrackSegmentMatching = False
291 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.MooBuilderTool.CandidateMatchingTool.DoTrackSegmentMatching = False
292 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.DoTrackSegmentMatching = False
293 #MuPatTrackBuilder.MuonTrackSteering.MooCandidateMatchingTool
294 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.CandidateMatchingTool.DoTrackSegmentMatching = False
295 #MuPatTrackBuilder.MuonTrackSteering.MooTrackBuilderTemplate.MooCandidateMatchingTool
296 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackRefinementTool.CandidateMatchingTool.DoTrackSegmentMatching = False
297
298 #MuPatTrackBuilder.MuonTrackSteering.MooCandidateMatchingTool.MuonSegmentMatchingTool
299 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.CandidateMatchingTool.SegmentMatchingTool.UseEndcapExtrapolationMatching = False
300 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.CandidateMatchingTool.SegmentMatchingTool.doThetaMatching = False
301 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.CandidateMatchingTool.SegmentMatchingTool.doPhiMatching = False
302
303 #MuPatTrackBuilder.MuonTrackSteering.MooMuonTrackBuilder.MuSt_MooCandidateMatchingTool.MuSt_MuonSegmentMatchingTool
304 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.SegmentMatchingTool.UseEndcapExtrapolationMatching = False
305 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.SegmentMatchingTool.doThetaMatching = False
306 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.SegmentMatchingTool.doPhiMatching = False
307
308 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.MooBuilderTool.CandidateMatchingTool.SegmentMatchingTool.UseEndcapExtrapolationMatching = False
309 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.MooBuilderTool.CandidateMatchingTool.SegmentMatchingTool.doThetaMatching = False
310 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.MooBuilderTool.CandidateMatchingTool.SegmentMatchingTool.doPhiMatching = False
311
312
313
314if __name__ == "__main__":
316