ATLAS Offline Software
MuonReconstructionConfig.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
2 
3 # Core configuration
4 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
5 from AthenaConfiguration.ComponentFactory import CompFactory
6 
7 # Local
8 from MuonConfig.MuonSegmentFindingConfig import MuonSegmentFindingCfg
9 from MuonConfig.MuonTrackBuildingConfig import MuonTrackBuildingCfg
10 from 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  # TrackParticles
32  aod_items += ["xAOD::TrackParticleContainer#MuonSpectrometerTrackParticles"]
33  aod_items += ["xAOD::TrackParticleAuxContainer#MuonSpectrometerTrackParticlesAux."]
34  aod_items += ["xAOD::TrackParticleContainer#MuonSpectrometerOnlyTrackParticles"]
35  aod_items += ["xAOD::TrackParticleAuxContainer#MuonSpectrometerOnlyTrackParticlesAux."]
36 
37  aod_items += ["xAOD::TrackParticleContainer#MSonlyTracklets"]
38  aod_items += ["xAOD::TrackParticleAuxContainer#MSonlyTrackletsAux."]
39  aod_items += ["xAOD::VertexContainer#MSDisplacedVertex"]
40  aod_items += ["xAOD::VertexAuxContainer#MSDisplacedVertexAux."]
41 
42  if flags.Input.isMC:
43  # Truth Particle Container
44  aod_items += ["xAOD::TruthParticleContainer#MuonTruthParticles"]
45  aod_items += ["xAOD::TruthParticleAuxContainer#MuonTruthParticlesAux."]
46 
47  # Truth Segment Container
48  aod_items += ["xAOD::MuonSegmentContainer#MuonTruthSegments"]
49  aod_items += ["xAOD::MuonSegmentAuxContainer#MuonTruthSegmentsAux."]
50 
51  if flags.Muon.prdToxAOD:
52  aod_items += ["xAOD::TrackMeasurementValidationContainer#MDT_DriftCircles"]
53  aod_items += ["xAOD::TrackMeasurementValidationAuxContainer#MDT_DriftCirclesAux."]
54  aod_items += ["xAOD::TrackMeasurementValidationContainer#RPC_Measurements"]
55  aod_items += ["xAOD::TrackMeasurementValidationAuxContainer#RPC_MeasurementsAux."]
56  aod_items += ["xAOD::TrackMeasurementValidationContainer#TGC_MeasurementsAllBCs"]
57  aod_items += ["xAOD::TrackMeasurementValidationAuxContainer#TGC_MeasurementsAllBCsAux."]
58  if flags.Detector.EnableCSC:
59  aod_items += ["xAOD::TrackMeasurementValidationContainer#CSC_Clusters"]
60  aod_items += ["xAOD::TrackMeasurementValidationAuxContainer#CSC_ClustersAux."]
61 
62  if flags.Muon.rpcRawToxAOD:
63  aod_items += ["xAOD::TrackMeasurementValidationContainer#RPC_RDO_Measurements"]
64  aod_items += ["xAOD::TrackMeasurementValidationAuxContainer#RPC_RDO_MeasurementsAux."]
65 
66  # ESD list includes all AOD items
67  esd_items = []
68  esd_items += aod_items
69 
70  # PRDs et al
71  if flags.Detector.EnableMM:
72  esd_items += ["Muon::MMPrepDataContainer#MM_Measurements"]
73  esd_items += ["xAOD::NSWMMTPRDOContainer#*", "xAOD::NSWMMTPRDOAuxContainer#*"]
74  if flags.Detector.EnablesTGC:
75  esd_items += ["Muon::sTgcPrepDataContainer#STGC_Measurements"]
76  esd_items += ["Muon::NSW_PadTriggerDataContainer#NSW_PadTrigger_RDO"]
77  esd_items += ["xAOD::NSWTPRDOContainer#*", "xAOD::NSWTPRDOAuxContainer#*"]
78 
79 
80  if flags.Detector.EnableCSC:
81  esd_items += ["Muon::CscPrepDataContainer#CSC_Clusters"]
82  esd_items += ["Muon::CscStripPrepDataContainer#CSC_Measurements"]
83  esd_items += ["Muon::RpcPrepDataContainer#RPC_Measurements"]
84  esd_items += ["Muon::TgcPrepDataContainer#TGC_MeasurementsAllBCs"]
85  esd_items += ["Muon::MdtPrepDataContainer#MDT_DriftCircles"]
86 
87  # trigger related info for offline DQA
88  esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollection"]
89  esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollectionPriorBC"]
90  esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollectionNextBC"]
91  esd_items += ["Muon::TgcCoinDataContainer#TrigT1CoinDataCollectionNextNextBC"]
92  esd_items += ["Muon::RpcCoinDataContainer#RPC_triggerHits"]
93  esd_items += ["RpcSectorLogicContainer#RPC_SECTORLOGIC"]
94 
95  # trigger info for RPC time calibration
96  if flags.Output.doWriteRDO or flags.Muon.doWriteRpcRDO:
97  esd_items += ["RpcPadContainer#RPCPAD"]
98 
99  # Segments
100  esd_items += ["Trk::SegmentCollection#NCB_TrackMuonSegments"]
101 
102  # Tracks
103  esd_items += ["TrackCollection#MuonSpectrometerTracks"]
104  if flags.Muon.runCommissioningChain:
105  esd_items += ["TrackCollection#EMEO_MuonSpectrometerTracks"]
106  if flags.Detector.EnableMM or flags.Detector.EnablesTGC:
107  esd_items += ["Trk::SegmentCollection#TrackMuonNSWSegments"]
108 
109  # Truth
110  if flags.Input.isMC:
111  esd_items += ["TrackRecordCollection#MuonEntryLayerFilter"]
112  esd_items += ["TrackRecordCollection#MuonExitLayerFilter"]
113 
114  esd_items += ["PRD_MultiTruthCollection#MDT_TruthMap",
115  "PRD_MultiTruthCollection#RPC_TruthMap", "PRD_MultiTruthCollection#TGC_TruthMap"]
116  if flags.Detector.EnableCSC:
117  esd_items += ["PRD_MultiTruthCollection#CSC_TruthMap"]
118  if flags.Detector.EnablesTGC:
119  esd_items += ["PRD_MultiTruthCollection#STGC_TruthMap"]
120  if flags.Detector.EnableMM:
121  esd_items += ["PRD_MultiTruthCollection#MM_TruthMap"]
122 
123  # Track truth
124  esd_items += ["DetailedTrackTruthCollection#MuonSpectrometerTracksTruth"]
125  esd_items += ["TrackTruthCollection#MuonSpectrometerTracksTruth"]
126 
127  if flags.Muon.writeSDOs:
128  if flags.Detector.EnableCSC: esd_items+=["CscSimDataCollection#CSC_SDO"]
129  esd_items+=["MuonSimDataCollection#MDT_SDO"]
130  esd_items+=["MuonSimDataCollection#RPC_SDO"]
131  esd_items+=["MuonSimDataCollection#TGC_SDO"]
132  if flags.Detector.EnablesTGC: esd_items+=["MuonSimDataCollection#sTGC_SDO"]
133  if flags.Detector.EnableMM: esd_items+=["MuonSimDataCollection#MM_SDO"]
134 
135  if flags.Output.doWriteESD:
136  result.merge(OutputStreamCfg(flags, "ESD", esd_items))
137  if flags.Output.doWriteAOD:
138  result.merge(OutputStreamCfg(flags, "AOD", aod_items))
139  return result
140 
141 
143  # https://gitlab.cern.ch/atlas/athena/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py
144  from MuonConfig.MuonPrepDataConvConfig import MuonPrepDataConvCfg
145  from MuonConfig.MuonRecToolsConfig import MuonTrackScoringToolCfg
146  from MuonConfig.MuonGeometryConfig import MuonIdHelperSvcCfg
147  from MuonConfig.MuonRecToolsConfig import MuonEDMHelperSvcCfg
148  from TrkConfig.TrkTrackSummaryToolConfig import MuonTrackSummaryToolCfg
149  from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg
150 
151  # Many components need these services, so setup once here.
152  result = MuonIdHelperSvcCfg(flags)
153  result.merge(MuonEDMHelperSvcCfg(flags))
154 
155  # Now setup reconstruction steps
156  result.merge(MuonPrepDataConvCfg(flags))
157  result.merge(MuonSegmentFindingCfg(flags))
158  result.merge(MuonTrackBuildingCfg(flags))
159  result.merge(MuonStandaloneTrackParticleCnvAlgCfg(flags))
160  if flags.Muon.runCommissioningChain:
161  result.merge(MuonStandaloneTrackParticleCnvAlgCfg(flags,
162  "MuonStandaloneTrackParticleCnvAlg_EMEO",
163  TrackContainerName="EMEO_MuonSpectrometerTracks",
164  xAODTrackParticlesFromTracksContainerName="EMEO_MuonSpectrometerTrackParticles"))
165 
166  # FIXME - this is copied from the old configuration, but I'm not sure it really belongs here.
167  # It's probably better to have as part of TrackBuilding, or Segment building...
168  if flags.Input.isMC:
169  # filter TrackRecordCollection (true particles in muon spectrometer)
170  if "MuonEntryLayerFilter" not in flags.Input.Collections:
171  result.addEventAlgo(CompFactory.TrackRecordFilter())
172  if "MuonExitLayerFilter" not in flags.Input.Collections:
173  result.addEventAlgo(CompFactory.TrackRecordFilter("TrackRecordFilterMuonExitLayer",
174  inputName="MuonExitLayer",
175  outputName="MuonExitLayerFilter"))
176 
177  # Now tracks
178  track_cols = ["MuonSpectrometerTracks"]
179  track_colstp = ["MuonSpectrometerTrackParticles"]
180  if flags.Muon.runCommissioningChain:
181  track_cols += ["EMEO_MuonSpectrometerTracks"]
182  track_colstp += ["EMEO_MuonSpectrometerTrackParticles"]
183 
184  from MuonConfig.MuonTruthAlgsConfig import MuonDetailedTrackTruthMakerCfg
185  result.merge(MuonDetailedTrackTruthMakerCfg(flags, name="MuonStandaloneDetailedTrackTruthMaker",
186  TrackCollectionNames=track_cols))
187 
188  for i in range(len(track_cols)):
189  from TrkConfig.TrkTruthAlgsConfig import TrackTruthSelectorCfg, TrackParticleTruthAlgCfg
190  result.merge(TrackTruthSelectorCfg(flags, tracks=track_cols[i]))
191 
192  result.merge(TrackParticleTruthAlgCfg(flags, tracks=track_cols[i],
193  TrackParticleName=track_colstp[i]))
194 
195  # Check if we're making PRDs
196  # 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.
197  if flags.Muon.makePRDs:
198  from MuonConfig.MuonRdoDecodeConfig import MuonPRD_MultiTruthMakerCfg
199  result.merge(MuonPRD_MultiTruthMakerCfg(flags))
200 
201  from MuonConfig.MuonTruthAlgsConfig import MuonTruthDecorationAlgCfg
202  result.merge(MuonTruthDecorationAlgCfg(flags))
203 
204  if flags.Muon.doMSVertex:
205  msvertexrecotool = CompFactory.Muon.MSVertexRecoTool(
206  MyExtrapolator=result.popToolsAndMerge(
207  AtlasExtrapolatorCfg(flags)),
208  TGCKey='TGC_MeasurementsAllBCs' if not flags.Muon.useTGCPriorNextBC else 'TGC_Measurements')
209  the_alg = CompFactory.MSVertexRecoAlg(
210  name="MSVertexRecoAlg", MSVertexRecoTool=msvertexrecotool)
211  # Not explicitly configuring MSVertexTrackletTool
212  result.addEventAlgo(the_alg)
213 
214  # FIXME - work around to fix unconfigured public MuonTrackScoringTool
215  # It wuould be best to find who is using this tool, and add this configuration there
216  # But AFAICS the only parent is MuonCombinedFitTagTool, and it's private there, so I'm a bit confused.
217  result.addPublicTool(result.popToolsAndMerge(
218  MuonTrackScoringToolCfg(flags)))
219  # Ditto
220  result.addPublicTool(result.popToolsAndMerge(
221  MuonTrackSummaryToolCfg(flags)))
222 
223  # Setup output
224  if flags.Output.doWriteESD or flags.Output.doWriteAOD:
225  result.merge(StandaloneMuonOutputCfg(flags))
226  return result
227 
228 
229 if __name__ == "__main__":
230  # To run this, do e.g.
231  # python -m MuonConfig.MuonReconstructionConfig --threads=1
232  from MuonConfig.MuonConfigUtils import SetupMuonStandaloneConfigFlags, SetupMuonStandaloneCA
233 
235  cfg = SetupMuonStandaloneCA(args, flags)
236  # Run the actual test.
238  cfg.merge(acc)
239 
240  from SGComps.AddressRemappingConfig import InputRenameCfg
241  cfg.merge(InputRenameCfg("TrackCollection",
242  "MuonSpectrometerTracks", "MuonSpectrometerTracks_old"))
243 
244  cfg.printConfig(withDetails=True)
245  # drop faulty remapping
246  # the evaluation of MuonSegmentNameFixCfg should happen conditionally instead
247  # this is hack that is functioning only because this is top level CA
248  oldRemaps = cfg.getService("AddressRemappingSvc").TypeKeyRenameMaps
249  cfg.getService("AddressRemappingSvc").TypeKeyRenameMaps = [
250  remap for remap in oldRemaps if "Trk::SegmentCollection" not in remap]
251 
252  f = open("MuonReconstruction.pkl", "wb")
253  cfg.store(f)
254  f.close()
255  if not args.config_only:
256  sc = cfg.run(20)
257  if not sc.isSuccess():
258  import sys
259  sys.exit("Execution failed")
260  else:
261  cfg.wasMerged()
python.TrkTruthAlgsConfig.TrackTruthSelectorCfg
def TrackTruthSelectorCfg(flags, name="Selector", tracks="", **kwargs)
Definition: TrkTruthAlgsConfig.py:28
python.TrkTruthAlgsConfig.TrackParticleTruthAlgCfg
def TrackParticleTruthAlgCfg(flags, name="TruthAlg", tracks="", **kwargs)
Definition: TrkTruthAlgsConfig.py:35
python.MuonReconstructionConfig.StandaloneMuonOutputCfg
def StandaloneMuonOutputCfg(flags)
Definition: MuonReconstructionConfig.py:12
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
python.MuonSegmentFindingConfig.MuonSegmentFindingCfg
def MuonSegmentFindingCfg(flags, setup_bytestream=True, cardinality=1)
Definition: MuonSegmentFindingConfig.py:566
python.OutputStreamConfig.OutputStreamCfg
def OutputStreamCfg(flags, streamName, ItemList=[], MetadataItemList=[], disableEventTag=False, trigNavThinningSvc=None, takeItemsFromInput=False, extendProvenanceRecord=True, AcceptAlgs=[], HelperTools=[])
Definition: OutputStreamConfig.py:12
python.MuonRecToolsConfig.MuonTrackScoringToolCfg
def MuonTrackScoringToolCfg(flags, name="MuonTrackScoringTool", **kwargs)
Definition: MuonRecToolsConfig.py:123
xAODTrackingCnvConfig.MuonStandaloneTrackParticleCnvAlgCfg
def MuonStandaloneTrackParticleCnvAlgCfg(flags, name="MuonStandaloneTrackParticleCnvAlg", **kwargs)
Definition: xAODTrackingCnvConfig.py:327
python.TrkTrackSummaryToolConfig.MuonTrackSummaryToolCfg
def MuonTrackSummaryToolCfg(flags, name="MuonTrackSummaryTool", **kwargs)
Definition: TrkTrackSummaryToolConfig.py:143
python.MuonReconstructionConfig.MuonReconstructionCfg
def MuonReconstructionCfg(flags)
Definition: MuonReconstructionConfig.py:142
python.MuonConfigUtils.SetupMuonStandaloneCA
def SetupMuonStandaloneCA(args, flags)
Definition: MuonConfigUtils.py:29
python.AtlasExtrapolatorConfig.AtlasExtrapolatorCfg
def AtlasExtrapolatorCfg(flags, name='AtlasExtrapolator')
Definition: AtlasExtrapolatorConfig.py:63
python.MuonTruthAlgsConfig.MuonDetailedTrackTruthMakerCfg
def MuonDetailedTrackTruthMakerCfg(flags, name="MuonDetailedTrackTruthMaker", **kwargs)
Definition: MuonTruthAlgsConfig.py:6
python.TrkEventCnvToolsConfig.TrkEventCnvSuperToolCfg
def TrkEventCnvSuperToolCfg(flags, name='EventCnvSuperTool', **kwargs)
Definition: TrkEventCnvToolsConfig.py:51
python.MuonGeometryConfig.MuonIdHelperSvcCfg
def MuonIdHelperSvcCfg(flags)
Definition: MuonGeometryConfig.py:15
python.MuonTrackBuildingConfig.MuonTrackBuildingCfg
def MuonTrackBuildingCfg(flags, name="MuPatTrackBuilder", **kwargs)
Definition: MuonTrackBuildingConfig.py:507
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
python.MuonTruthAlgsConfig.MuonTruthDecorationAlgCfg
def MuonTruthDecorationAlgCfg(flags, name="MuonTruthDecorationAlg", **kwargs)
Definition: MuonTruthAlgsConfig.py:21
python.MuonRdoDecodeConfig.MuonPRD_MultiTruthMakerCfg
def MuonPRD_MultiTruthMakerCfg(flags, name="MuonPRD_MultiTruthMaker", **kwargs)
Definition: MuonRdoDecodeConfig.py:298
python.MuonRecToolsConfig.MuonEDMHelperSvcCfg
def MuonEDMHelperSvcCfg(flags, name="MuonEDMHelperSvc", **kwargs)
Definition: MuonRecToolsConfig.py:29
Trk::open
@ open
Definition: BinningType.h:40
python.MuonConfigUtils.SetupMuonStandaloneConfigFlags
def SetupMuonStandaloneConfigFlags(default_input=['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecExRecoTest/ESD.16747874._000011_100events.pool.root'])
Definition: MuonConfigUtils.py:6
python.MuonPrepDataConvConfig.MuonPrepDataConvCfg
def MuonPrepDataConvCfg(flags)
Definition: MuonPrepDataConvConfig.py:6
AddressRemappingConfig.InputRenameCfg
def InputRenameCfg(type, from_name, to_name)
Definition: AddressRemappingConfig.py:28