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 # TrackParticles
30 aod_items += ["xAOD::TrackParticleContainer#MuonSpectrometerTrackParticles"]
31 aod_items += ["xAOD::TrackParticleAuxContainer#MuonSpectrometerTrackParticlesAux."]
32 aod_items += ["xAOD::TrackParticleContainer#MuonSpectrometerOnlyTrackParticles"]
33 aod_items += ["xAOD::TrackParticleAuxContainer#MuonSpectrometerOnlyTrackParticlesAux."]
34
35 aod_items += ["xAOD::TrackParticleContainer#MSonlyTracklets"]
36 aod_items += ["xAOD::TrackParticleAuxContainer#MSonlyTrackletsAux."]
37 aod_items += ["xAOD::VertexContainer#MSDisplacedVertex"]
38 aod_items += ["xAOD::VertexAuxContainer#MSDisplacedVertexAux."]
39
40 if flags.Input.isMC or flags.Overlay.DataOverlay:
41 # Truth Particle Container
42 aod_items += ["xAOD::TruthParticleContainer#MuonTruthParticles"]
43 aod_items += ["xAOD::TruthParticleAuxContainer#MuonTruthParticlesAux."]
44
45 # Truth Segment Container
46 aod_items += ["xAOD::MuonSegmentContainer#MuonTruthSegments"]
47 aod_items += ["xAOD::MuonSegmentAuxContainer#MuonTruthSegmentsAux.-localSegPars"]
48
49 # ESD list includes all AOD items
50 esd_items = []
51 esd_items += aod_items
52
53 # PRDs et al
54 if flags.Detector.EnableMM:
55 esd_items += ["Muon::MMPrepDataContainer#MM_Measurements"]
56 esd_items += ["xAOD::NSWMMTPRDOContainer#*", "xAOD::NSWMMTPRDOAuxContainer#*"]
57 if flags.Detector.EnablesTGC:
58 esd_items += ["Muon::sTgcPrepDataContainer#STGC_Measurements"]
59 esd_items += ["Muon::NSW_PadTriggerDataContainer#NSW_PadTrigger_RDO"]
60 esd_items += ["xAOD::NSWTPRDOContainer#*", "xAOD::NSWTPRDOAuxContainer#*"]
61
62
63 if flags.Detector.EnableCSC:
64 esd_items += ["Muon::CscPrepDataContainer#CSC_Clusters"]
65 esd_items += ["Muon::CscStripPrepDataContainer#CSC_Measurements"]
66 esd_items += ["Muon::RpcPrepDataContainer#RPC_Measurements"]
67 esd_items += ["Muon::TgcPrepDataContainer#TGC_MeasurementsAllBCs"]
68 esd_items += ["Muon::MdtPrepDataContainer#MDT_DriftCircles"]
69
70
71 # trigger related info for offline DQA
72 esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollection"]
73 esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollectionPriorBC"]
74 esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollectionNextBC"]
75 esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollectionNextNextBC"]
76 esd_items += ["Muon::RpcCoinDataContainer#RPC_triggerHits"]
77 esd_items += ["RpcSectorLogicContainer#RPC_SECTORLOGIC"]
78
79 # trigger info for RPC time calibration
80 if flags.Output.doWriteRDO or flags.Muon.doWriteRpcRDO:
81 esd_items += ["RpcPadContainer#RPCPAD"]
82
83 # Segments
84 esd_items += ["Trk::SegmentCollection#NCB_TrackMuonSegments"]
85
88
89 # Tracks
90 esd_items += ["TrackCollection#MuonSpectrometerTracks"]
91 if flags.Detector.EnableMM or flags.Detector.EnablesTGC:
92 esd_items += ["Trk::SegmentCollection#TrackMuonNSWSegments"]
93
94 # Truth
95 if flags.Input.isMC:
96 esd_items += ["TrackRecordCollection#MuonEntryLayerFilter"]
97 esd_items += ["TrackRecordCollection#MuonExitLayerFilter"]
98
99 esd_items += ["PRD_MultiTruthCollection#MDT_TruthMap",
100 "PRD_MultiTruthCollection#RPC_TruthMap", "PRD_MultiTruthCollection#TGC_TruthMap"]
101 if flags.Detector.EnableCSC:
102 esd_items += ["PRD_MultiTruthCollection#CSC_TruthMap"]
103 if flags.Detector.EnablesTGC:
104 esd_items += ["PRD_MultiTruthCollection#STGC_TruthMap"]
105 if flags.Detector.EnableMM:
106 esd_items += ["PRD_MultiTruthCollection#MM_TruthMap"]
107
108 # Track truth
109 esd_items += ["DetailedTrackTruthCollection#MuonSpectrometerTracksTruth"]
110 esd_items += ["TrackTruthCollection#MuonSpectrometerTracksTruth"]
111
112 if flags.Muon.writeSDOs:
113 if flags.Detector.EnableCSC: esd_items+=["CscSimDataCollection#CSC_SDO"]
114 esd_items+=["MuonSimDataCollection#MDT_SDO"]
115 esd_items+=["MuonSimDataCollection#RPC_SDO"]
116 esd_items+=["MuonSimDataCollection#TGC_SDO"]
117 if flags.Detector.EnablesTGC: esd_items+=["MuonSimDataCollection#sTGC_SDO"]
118 if flags.Detector.EnableMM: esd_items+=["MuonSimDataCollection#MM_SDO"]
119
120
121 if flags.Output.doWriteESD:
122 result.merge(OutputStreamCfg(flags, "ESD", esd_items))
123 if flags.Output.doWriteAOD:
124 result.merge(OutputStreamCfg(flags, "AOD", aod_items))
125 return result
126
127
129 # https://gitlab.cern.ch/atlas/athena/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py
130 from MuonConfig.MuonPrepDataConvConfig import MuonPrepDataConvCfg
131 from MuonConfig.MuonRecToolsConfig import MuonTrackScoringToolCfg
132 from MuonConfig.MuonGeometryConfig import MuonIdHelperSvcCfg
133 from MuonConfig.MuonRecToolsConfig import MuonEDMHelperSvcCfg
134 from TrkConfig.TrkTrackSummaryToolConfig import MuonTrackSummaryToolCfg
135 from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg
136
137 # Many components need these services, so setup once here.
138 result = MuonIdHelperSvcCfg(flags)
139 result.merge(MuonEDMHelperSvcCfg(flags))
140
141 # Now setup reconstruction steps
142 result.merge(MuonPrepDataConvCfg(flags))
143 result.merge(MuonSegmentFindingCfg(flags))
144 result.merge(MuonTrackBuildingCfg(flags))
145 result.merge(MuonStandaloneTrackParticleCnvAlgCfg(flags))
146
147 # FIXME - this is copied from the old configuration, but I'm not sure it really belongs here.
148 # It's probably better to have as part of TrackBuilding, or Segment building...
149 from AthenaConfiguration.Enums import Format
150 if (flags.Input.isMC or flags.Overlay.DataOverlay) and flags.Input.Format!=Format.BS:
151 # filter TrackRecordCollection (true particles in muon spectrometer)
152 if "MuonEntryLayerFilter" not in flags.Input.Collections and \
153 ("MuonEntryLayer" in flags.Input.Collections):
154 result.addEventAlgo(CompFactory.TrackRecordFilter())
155 if "MuonExitLayerFilter" not in flags.Input.Collections and \
156 ("MuonExitLayer" in flags.Input.Collections):
157 result.addEventAlgo(CompFactory.TrackRecordFilter("TrackRecordFilterMuonExitLayer",
158 inputName="MuonExitLayer",
159 outputName="MuonExitLayerFilter"))
160
161 # Now tracks
162 track_cols = ["MuonSpectrometerTracks"]
163 track_colstp = ["MuonSpectrometerTrackParticles"]
164
165 from MuonConfig.MuonTruthAlgsConfig import MuonDetailedTrackTruthMakerCfg
166 result.merge(MuonDetailedTrackTruthMakerCfg(flags, name="MuonStandaloneDetailedTrackTruthMaker",
167 TrackCollectionNames=track_cols))
168
169 if not flags.Muon.scheduleActsReco:
170 for i in range(len(track_cols)):
171 from TrkConfig.TrkTruthAlgsConfig import TrackTruthSelectorCfg, TrackParticleTruthAlgCfg
172 result.merge(TrackTruthSelectorCfg(flags, tracks=track_cols[i]))
173 result.merge(TrackParticleTruthAlgCfg(flags, tracks=track_cols[i],
174 TrackParticleName=track_colstp[i]))
175
176 # Check if we're making PRDs
177 # 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.
178 if flags.Muon.makePRDs:
179 if not flags.Muon.usePhaseIIGeoSetup:
180 from MuonConfig.MuonTruthAlgsConfig import MuonTruthAlgsCfg
181 result.merge(MuonTruthAlgsCfg(flags))
182 else:
183 from MuonTruthAlgsR4.MuonTruthAlgsConfig import MuonTruthAlgsCfg
184 result.merge(MuonTruthAlgsCfg(flags))
185
186 if flags.Muon.doMSVertex:
187 msvertexrecotool = CompFactory.Muon.MSVertexRecoTool(
188 MyExtrapolator=result.popToolsAndMerge(
189 AtlasExtrapolatorCfg(flags)),
190 TGCKey='TGC_MeasurementsAllBCs')
191 the_alg = CompFactory.MSVertexRecoAlg(
192 name="MSVertexRecoAlg", MSVertexRecoTool=msvertexrecotool)
193 # Not explicitly configuring MSVertexTrackletTool
194 result.addEventAlgo(the_alg)
195
196 # FIXME - work around to fix unconfigured public MuonTrackScoringTool
197 # It wuould be best to find who is using this tool, and add this configuration there
198 # But AFAICS the only parent is MuonCombinedFitTagTool, and it's private there, so I'm a bit confused.
199 result.addPublicTool(result.popToolsAndMerge(
200 MuonTrackScoringToolCfg(flags)))
201 # Ditto
202 result.addPublicTool(result.popToolsAndMerge(
203 MuonTrackSummaryToolCfg(flags)))
204
205 # Setup output
206 if flags.Output.doWriteESD or flags.Output.doWriteAOD:
207 result.merge(StandaloneMuonOutputCfg(flags))
208 if flags.Muon.scheduleActsReco:
209 from MuonConfig.ReconstructionConfigR4 import MuonReconstructionConfig
210 result.merge(MuonReconstructionConfig(flags))
211 return result
212
213# Run with python -m MuonConfig.MuonReconstructionConfig
215
216 if flags is None:
217 from MuonConfig.MuonConfigUtils import SetupMuonStandaloneConfigFlags
218 flags = SetupMuonStandaloneConfigFlags()
219
220 from MuonConfig.MuonConfigUtils import SetupMuonStandaloneCA
221 cfg = SetupMuonStandaloneCA(flags)
222
223 # Run the actual test.
224 acc = MuonReconstructionCfg(flags)
225 cfg.merge(acc)
226
227 from SGComps.AddressRemappingConfig import InputRenameCfg
228 cfg.merge(InputRenameCfg("TrackCollection",
229 "MuonSpectrometerTracks", "MuonSpectrometerTracks_old"))
230
231 cfg.printConfig(withDetails=True)
232 # drop faulty remapping
233 # the evaluation of MuonSegmentNameFixCfg should happen conditionally instead
234 # this is hack that is functioning only because this is top level CA
235 oldRemaps = cfg.getService("AddressRemappingSvc").TypeKeyRenameMaps
236 cfg.getService("AddressRemappingSvc").TypeKeyRenameMaps = [
237 remap for remap in oldRemaps if "Trk::SegmentCollection" not in remap]
238
239 f = open("MuonReconstruction.pkl", "wb")
240 cfg.store(f)
241 f.close()
242
243 from MuonConfig.MuonConfigUtils import executeTest
244 executeTest(cfg)
245
246
247
248
249def MuonNCBTrackCfg(flags, cfg):
250 """
251 This config (made for r24.0 in Nov 2024) is used to:
252 1] Switch setup of the segment making in the NSW to loosen constrain on the IP
253 2] Adapt and switch off various criteria in TrackSteering/building to be able to reconstruct track from the non-standards (non-collision background) segments
254 """
255
256 #Adapting NCB alg setup for the standard segment maker alg
257 cfg.getEventAlgo("MuonSegmentMaker").NSWSegmentMaker.SeedMMStereos=False
258 cfg.getEventAlgo("MuonSegmentMaker").NSWSegmentMaker.IPConstraint=False
259
260
261 #Most of the setup below is to suppress background which now we want to reconstruct
262 cfg.getEventAlgo("MuonCreatorAlg").MuonCreatorTool.RequireMSOEforSA=False
263 cfg.getEventAlgo("MuonCreatorAlg").MuonCreatorTool.RequireCaloForSA=False
264
265 cfg.getEventAlgo("MuonCombinedMuonCandidateAlg").MuonCandidateTool.ExtrapolationStrategy=1
266
267 #Loosen up segment criteria
268 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.SegSeedQCut = -2
269 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.Seg2ndQCut = -2
270 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.SegOtherQCut = -2 #by default already -2
271 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.UseTightSegmentMatching = False
272
273 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.DoTrackSegmentMatching = False
274 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.MooBuilderTool.CandidateMatchingTool.DoTrackSegmentMatching = False
275 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.DoTrackSegmentMatching = False
276 #MuPatTrackBuilder.MuonTrackSteering.MooCandidateMatchingTool
277 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.CandidateMatchingTool.DoTrackSegmentMatching = False
278 #MuPatTrackBuilder.MuonTrackSteering.MooTrackBuilderTemplate.MooCandidateMatchingTool
279 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackRefinementTool.CandidateMatchingTool.DoTrackSegmentMatching = False
280
281 #MuPatTrackBuilder.MuonTrackSteering.MooCandidateMatchingTool.MuonSegmentMatchingTool
282 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.CandidateMatchingTool.SegmentMatchingTool.UseEndcapExtrapolationMatching = False
283 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.CandidateMatchingTool.SegmentMatchingTool.doThetaMatching = False
284 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.CandidateMatchingTool.SegmentMatchingTool.doPhiMatching = False
285
286 #MuPatTrackBuilder.MuonTrackSteering.MooMuonTrackBuilder.MuSt_MooCandidateMatchingTool.MuSt_MuonSegmentMatchingTool
287 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.SegmentMatchingTool.UseEndcapExtrapolationMatching = False
288 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.SegmentMatchingTool.doThetaMatching = False
289 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.TrackBuilderTool.CandidateMatchingTool.SegmentMatchingTool.doPhiMatching = False
290
291 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.MooBuilderTool.CandidateMatchingTool.SegmentMatchingTool.UseEndcapExtrapolationMatching = False
292 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.MooBuilderTool.CandidateMatchingTool.SegmentMatchingTool.doThetaMatching = False
293 cfg.getEventAlgo("MuPatTrackBuilder").TrackSteering.MooBuilderTool.CandidateMatchingTool.SegmentMatchingTool.doPhiMatching = False
294
295
296
297if __name__ == "__main__":
299