ATLAS Offline Software
Loading...
Searching...
No Matches
MuonTrackBuildingConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2
3from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
4from AthenaConfiguration.ComponentFactory import CompFactory
5from AthenaConfiguration.AccumulatorCache import AccumulatorCache
6from TrkConfig.TrkGlobalChi2FitterConfig import MCTBFitterCfg, MCTBSLFitterCfg
7from MuonConfig.MuonRecToolsConfig import MuonTrackCleanerCfg, MuonSegmentMomentumFromFieldCfg, MuonSeededSegmentFinderCfg, MuonEDMPrinterToolCfg
8from AthenaConfiguration.Enums import BeamType
9from MuonConfig.MuonSegmentFindingConfig import MuonSegmentFittingToolCfg
10
11def MooTrackFitterCfg(flags, name = 'MooTrackFitter', prefix='', **kwargs):
12 # Based on https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MooreTools.py#L179
13 # (Tons of explicit configuration missing from there though)
14 Muon__MooTrackFitter=CompFactory.Muon.MooTrackFitter
15 MuonSegmentMomentum=CompFactory.MuonSegmentMomentum
16 from MuonConfig.MuonRecToolsConfig import MuonPhiHitSelectorCfg, MuonTrackToSegmentToolCfg, MuonTrackSummaryHelperToolCfg, MuPatHitToolCfg
17
18 result = ComponentAccumulator()
19 mctb_fitter = result.getPrimaryAndMerge(MCTBFitterCfg(flags, name = prefix+'MCTBFitter'))
20 kwargs.setdefault("Fitter", mctb_fitter)
21
22 mu_pat_hit_tool = result.popToolsAndMerge(MuPatHitToolCfg(flags))
23 result.addPublicTool(mu_pat_hit_tool)
24 kwargs.setdefault("HitTool", mu_pat_hit_tool)
25
26 from TrkConfig.TrkExSTEP_PropagatorConfig import AtlasSTEP_PropagatorCfg
27 muon_prop = result.popToolsAndMerge(AtlasSTEP_PropagatorCfg(flags, name='MuonPropagator'))
28
29 kwargs.setdefault("Propagator", muon_prop)
30 kwargs.setdefault("SLFit" , not (flags.BField.barrelToroidOn and flags.BField.endcapToroidOn) )
31 if flags.Muon.MuonTrigger:
32 kwargs.setdefault("SLFit", False)
33 kwargs.setdefault("ReducedChi2Cut", flags.Muon.Chi2NDofCut)
34
35 momentum_estimator=""
36 if flags.Beam.Type is BeamType.Cosmics:
37 momentum_estimator = MuonSegmentMomentum(DoCosmics = True)
38 else:
39 momentum_estimator=result.popToolsAndMerge(MuonSegmentMomentumFromFieldCfg(flags))
40
41 result.addPublicTool(momentum_estimator)
42 kwargs.setdefault("SegmentMomentum", momentum_estimator )
43
44 kwargs.setdefault("MuonPrinterTool", result.getPrimaryAndMerge(MuonEDMPrinterToolCfg(flags) ))
45
46 track_to_segment_tool = result.popToolsAndMerge(MuonTrackToSegmentToolCfg(flags))
47 kwargs.setdefault("TrackToSegmentTool", track_to_segment_tool)
48
49 kwargs.setdefault("PhiHitSelector", result.popToolsAndMerge(MuonPhiHitSelectorCfg(flags)))
50 kwargs.setdefault("TrackCleaner", result.popToolsAndMerge(MuonTrackCleanerCfg(flags)))
51 kwargs.setdefault("SegmentInOverlapTool", result.popToolsAndMerge(MuonSegmentInOverlapResolvingToolCfg(flags)))
52
53 # Leaving "SegmentInOverlapTool" as default, which is what happens in the current configuration.
54
55 track_summary_helper = result.popToolsAndMerge(MuonTrackSummaryHelperToolCfg(flags))
56 kwargs.setdefault("TrackSummaryTool", track_summary_helper)
57
58 kwargs.setdefault("CleanPhiHits", True)
59 kwargs.setdefault("UsePreciseHits", True)
60 kwargs.setdefault("UsePrefit", False)
61 kwargs.setdefault("SeedAtStartOfTrack", False)
62
63 fitter = Muon__MooTrackFitter(prefix + name, **kwargs)
64 result.setPrivateTools(fitter)
65 return result
66
67@AccumulatorCache
68def MooTrackBuilderCfg(flags, name="MooTrackBuilderTemplate", prefix="", doSegmentPhiMatching=True, **kwargs):
69 Muon__MooTrackBuilder=CompFactory.Muon.MooTrackBuilder
70 from MuonConfig.MuonRIO_OnTrackCreatorToolConfig import MdtDriftCircleOnTrackCreatorCfg, TriggerChamberClusterOnTrackCreatorCfg
71 from MuonConfig.MuonRecToolsConfig import MuonTrackToSegmentToolCfg, MuonTrackExtrapolationToolCfg
72 from MagFieldServices.MagFieldServicesConfig import AtlasFieldCacheCondAlgCfg
73
74 # Based on this: https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MooreTools.py#L221
75 # ignoring all the name_prefix stuff for the moment, since I'm not sure it's necessary any more.
76 result = ComponentAccumulator()
77 moo_track_fitter = result.popToolsAndMerge(MooTrackFitterCfg(flags, name='MooTrackFitter', prefix=prefix))
78 kwargs.setdefault("Fitter", moo_track_fitter)
79
80 # Now setup SL fitter (MooSLTrackFitter as defined here:
81 # https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonRecExampleConfigDb.py#L203)
82 mctbslfitter = result.popToolsAndMerge(MCTBSLFitterCfg(flags, name=prefix+'MCTBSLFitter'))
83
84 # Just take the default configuration, as per https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonRecExampleConfigDb.py#L56
85 from TrkConfig.TrkExSTEP_PropagatorConfig import AtlasSTEP_PropagatorCfg
86 muon_prop = result.popToolsAndMerge(AtlasSTEP_PropagatorCfg(flags, name = 'MuonStraightLinePropagator'))
87
88 moo_sl_track_fitter = result.popToolsAndMerge(MooTrackFitterCfg( flags, name="MooSLTrackFitter", prefix=prefix, Fitter = mctbslfitter, Propagator=muon_prop, ReducedChi2Cut=10.0, SLFit=True))
89
90 kwargs.setdefault("SLFitter", moo_sl_track_fitter)
91 kwargs.setdefault("RecalibrateMDTHitsOnTrack", ( (not flags.Muon.doSegmentT0Fit) and flags.Beam.Type is BeamType.Collisions) )
92
93 muon_seeded_segment_finder = result.popToolsAndMerge(MuonSeededSegmentFinderCfg(flags))
94 kwargs.setdefault("SeededSegmentFinder", muon_seeded_segment_finder)
95
96 mdt_dcot_creator = result.popToolsAndMerge(MdtDriftCircleOnTrackCreatorCfg(flags))
97 kwargs.setdefault("MdtRotCreator", mdt_dcot_creator)
98
99 muon_comp_cluster_creator = result.popToolsAndMerge(TriggerChamberClusterOnTrackCreatorCfg(flags))
100 kwargs.setdefault("CompetingClustersCreator", muon_comp_cluster_creator)
101
102 kwargs.setdefault("Propagator", muon_prop)
103 kwargs.setdefault("ChamberHoleRecoveryTool",
104 result.popToolsAndMerge(MuonChamberHoleRecoveryToolCfg(flags)))
105
106 result.merge(AtlasFieldCacheCondAlgCfg(flags) )
107
108 kwargs.setdefault("TrackToSegmentTool", result.popToolsAndMerge(MuonTrackToSegmentToolCfg(flags)))
109 kwargs.setdefault("Printer", result.getPrimaryAndMerge(MuonEDMPrinterToolCfg(flags)))
110 kwargs.setdefault('Extrapolator', result.popToolsAndMerge( MuonTrackExtrapolationToolCfg(flags) ) )
111
112 # FIXME - remove ErrorOptimisationTool from cxx?
113 # declareProperty("ErrorOptimisationTool","" );Extrapolator
114 kwargs.setdefault("CandidateTool", result.popToolsAndMerge(MuPatCandidateToolCfg(flags)))
115
116 kwargs.setdefault("CandidateMatchingTool",
117 result.popToolsAndMerge(MooCandidateMatchingToolCfg(flags, name = 'MooCandidateMatchingTool',
118 doSegmentPhiMatching=doSegmentPhiMatching, prefix=prefix)))
119
120 from TrkConfig.TrkTrackSummaryToolConfig import MuonTrackSummaryToolCfg
121 kwargs.setdefault("TrackSummaryTool", result.popToolsAndMerge(MuonTrackSummaryToolCfg(flags)))
122
123 if "PullCalculator" not in kwargs:
124 from TrkConfig.TrkResidualPullCalculatorConfig import (
125 ResidualPullCalculatorCfg)
126 kwargs.setdefault("PullCalculator", result.popToolsAndMerge(
127 ResidualPullCalculatorCfg(flags)))
128
129 result.setPrivateTools(Muon__MooTrackBuilder(name, **kwargs))
130 return result
131
132def MuonSegmentInOverlapResolvingToolCfg(flags, name="MuonSegmentInOverlapResolvingTool", **kwargs):
133 from MuonConfig.MuonRecToolsConfig import MuonEDMHelperSvcCfg
134 from TrkConfig.TrkExRungeKuttaPropagatorConfig import RungeKuttaPropagatorCfg
135 result = ComponentAccumulator()
136 kwargs.setdefault("edmHelper", result.getPrimaryAndMerge(MuonEDMHelperSvcCfg(flags)) )
137 kwargs.setdefault("Printer", result.getPrimaryAndMerge(MuonEDMPrinterToolCfg(flags)) )
138 kwargs.setdefault("AtlasRungeKuttaPropagator", result.popToolsAndMerge(
139 RungeKuttaPropagatorCfg(flags)))
140
141 if "ResidualPullCalculator" not in kwargs:
142 from TrkConfig.TrkResidualPullCalculatorConfig import (
143 ResidualPullCalculatorCfg)
144 kwargs.setdefault("ResidualPullCalculator", result.popToolsAndMerge(
145 ResidualPullCalculatorCfg(flags)))
146
147 result.setPrivateTools(CompFactory.Muon.MuonSegmentInOverlapResolvingTool(name, **kwargs))
148 return result
149
150# Taken from https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MooreTools.py#L268
151# Not bothering with MuonSegmentMatchingToolTight - just pass in TightSegmentMatching=True
152def MuonSegmentMatchingToolCfg(flags, name="MuonSegmentMatchingTool", **kwargs):
153 Muon__MuonSegmentMatchingTool=CompFactory.Muon.MuonSegmentMatchingTool
154
155 kwargs.setdefault( "doThetaMatching", flags.Muon.useSegmentMatching)
156 kwargs.setdefault( "doPhiMatching", False )
157 if flags.Beam.Type is BeamType.Cosmics:
158 kwargs.setdefault("OverlapMatchAveragePhiHitPullCut", 200.)
159 kwargs.setdefault( "ToroidOn", False ) # Was "not jobproperties.BField.allToroidOn()" but do not have access to Field here.
160
161 # There are two tools which this depends on which aren't properties and which weren't defined in old configuration
162 # Ignore for now, but FIXME one day
163
164 # m_pairMatchingTool("Muon::MuonSegmentPairMatchingTool/MuonSegmentPairMatchingTool"),
165 # Also, residual pull calculator not yet configured. #FIXME
166
167 result = MuonEDMPrinterToolCfg(flags)
168 kwargs.setdefault("Printer", result.getPrimary() )
169 kwargs.setdefault("MuonSegmentInOverlapResolvingTool", result.popToolsAndMerge(
171 kwargs.setdefault("MuonSegmentPairMatchingTool", CompFactory.Muon.MuonSegmentPairMatchingTool('MuonSegmentPairMatchingTool'))
172
173 matching = Muon__MuonSegmentMatchingTool(name, **kwargs)
174 result.setPrivateTools(matching)
175 return result
176
177def MooCandidateMatchingToolCfg(flags, name="MooCandidateMatchingTool", doSegmentPhiMatching=False, prefix="", **kwargs):
178 Muon__MooCandidateMatchingTool=CompFactory.Muon.MooCandidateMatchingTool
179 from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg
180
181 result = ComponentAccumulator()
182
183 # Won't explicitly configure MuonEDMHelperSvc
184 kwargs.setdefault("MuonPrinterTool", result.getPrimaryAndMerge(MuonEDMPrinterToolCfg(flags) ))
185 kwargs.setdefault("Extrapolator", result.popToolsAndMerge(AtlasExtrapolatorCfg(flags)))
186
187 acc = MuonSegmentMatchingToolCfg(flags, name=prefix+"MuonSegmentMatchingTool", doPhiMatching = doSegmentPhiMatching)
188 muon_seg_matching = acc.getPrimary()
189 result.merge(acc)
190 kwargs.setdefault("SegmentMatchingTool", muon_seg_matching)
191
192 acc = MuonSegmentMatchingToolCfg(flags, name = prefix+"MuonSegmentMatchingToolTight", TightSegmentMatching=True, doPhiMatching = doSegmentPhiMatching)
193 muon_seg_matching_tight = acc.getPrimary()
194 result.merge(acc)
195 kwargs.setdefault("SegmentMatchingToolTight", muon_seg_matching_tight)
196
197 kwargs.setdefault("DoTrackSegmentMatching", flags.Muon.useTrackSegmentMatching)
198 kwargs.setdefault("RequireSameSide", flags.Beam.Type is not BeamType.Collisions)
199 if flags.Muon.useAlignmentCorrections:
200 kwargs.setdefault("AlignmentErrorPosX", 5.0)
201 kwargs.setdefault("AlignmentErrorPosY", 0.2)
202 kwargs.setdefault("AlignmentErrorAngleX", 0.002)
203 kwargs.setdefault("AlignmentErrorAngleY", 0.001)
204
205 else: # no alignment corrections
206 kwargs.setdefault("AlignmentErrorPosX", 10.0)
207 kwargs.setdefault("AlignmentErrorPosY", 5.0)
208 kwargs.setdefault("AlignmentErrorAngleX", 0.004)
209 kwargs.setdefault("AlignmentErrorAngleY", 0.002)
210
211 kwargs.setdefault("MuPatCandidateTool", result.popToolsAndMerge(MuPatCandidateToolCfg(flags)))
212
213 moo_cand_matching_tool = Muon__MooCandidateMatchingTool(prefix+name,**kwargs)
214 result.setPrivateTools(moo_cand_matching_tool)
215 return result
216
217def MuonSegmentRegionRecoveryToolCfg(flags, name="MuonSegmentRegionRecoveryTool", **kwargs):
218 from TrkConfig.AtlasExtrapolatorConfig import MuonExtrapolatorCfg
219 from TrkConfig.TrkTrackSummaryToolConfig import MuonTrackSummaryToolCfg
220 from MuonConfig.MuonCondAlgConfig import MuonStationIntersectCondAlgCfg
221 from MuonCombinedConfig.MuonCombinedRecToolsConfig import CombinedMuonTrackBuilderFitCfg
222 from MuonConfig.MuonRecToolsConfig import MuonHitSummaryToolCfg
223
224 # Based on https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MooreTools.py#L426
225
226 result = ComponentAccumulator()
227 kwargs.setdefault("SeededSegmentFinder",
228 result.popToolsAndMerge(MuonSeededSegmentFinderCfg(flags)))
229
230 kwargs.setdefault("TrackSegmentMatchingTool",
231 result.popToolsAndMerge(MooCandidateMatchingToolCfg(flags)))
232
233 kwargs.setdefault("ChamberHoleRecoveryTool",
234 result.popToolsAndMerge(MuonChamberHoleRecoveryToolCfg(flags)))
235
236 kwargs.setdefault("Extrapolator",
237 result.popToolsAndMerge(MuonExtrapolatorCfg(flags)))
238 if 'OnlyEO' in kwargs:
239 #MuonEORecoveryTool's CombinedMuonTrackBuilderFit apparently *should* have MuonHoleRecovery
240 kwargs.setdefault("Builder", result.popToolsAndMerge(
241 CombinedMuonTrackBuilderFitCfg(flags)))
242 else:
243 kwargs.setdefault("Builder", result.popToolsAndMerge(
244 CombinedMuonTrackBuilderFitCfg(flags, MuonHoleRecovery= "")))
245
246
247 kwargs.setdefault("Fitter",
248 result.popToolsAndMerge(MCTBSLFitterCfg(flags, name='MCTBSLFitter')))
249 kwargs.setdefault("HitSummaryTool", result.popToolsAndMerge( MuonHitSummaryToolCfg(flags)))
250 kwargs.setdefault("EDMPrinter", result.getPrimaryAndMerge(
251 MuonEDMPrinterToolCfg(flags)))
252 result.merge( MuonStationIntersectCondAlgCfg(flags))
253
254 # Not bothering to handle IDHelper or EDMHelper. Default is okay.
255
256 from RegionSelector.RegSelToolConfig import regSelTool_MDT_Cfg, regSelTool_RPC_Cfg, regSelTool_TGC_Cfg
257 if flags.Detector.GeometryMDT:
258 kwargs.setdefault("MDTRegionSelector", result.popToolsAndMerge(regSelTool_MDT_Cfg(flags)))
259
260 if flags.Detector.GeometryTGC:
261 kwargs.setdefault("TGCRegionSelector", result.popToolsAndMerge(regSelTool_TGC_Cfg(flags)))
262
263 if flags.Detector.GeometryRPC:
264 kwargs.setdefault("RPCRegionSelector", result.popToolsAndMerge(regSelTool_RPC_Cfg(flags)))
265
266 if flags.Detector.GeometryCSC:
267 from RegionSelector.RegSelToolConfig import regSelTool_CSC_Cfg
268 kwargs.setdefault("CSCRegionSelector", result.popToolsAndMerge(regSelTool_CSC_Cfg(flags)))
269
270 if flags.Detector.GeometrysTGC:
271 from RegionSelector.RegSelToolConfig import regSelTool_STGC_Cfg
272 kwargs.setdefault("STGCRegionSelector", result.popToolsAndMerge(regSelTool_STGC_Cfg(flags)))
273
274 if flags.Detector.GeometryMM:
275 from RegionSelector.RegSelToolConfig import regSelTool_MM_Cfg
276 kwargs.setdefault("MMRegionSelector", result.popToolsAndMerge(regSelTool_MM_Cfg(flags)))
277
278 kwargs.setdefault("TrackSummaryTool", result.popToolsAndMerge(MuonTrackSummaryToolCfg(flags)))
279
280 segment_region_recovery_tool = CompFactory.Muon.MuonSegmentRegionRecoveryTool(name, **kwargs)
281 result.setPrivateTools(segment_region_recovery_tool)
282 return result
283
284def MuPatCandidateToolCfg(flags, name="MuPatCandidateTool", **kwargs):
285 # https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuPatTools.py#L32
286
287 from MuonConfig.MuonRIO_OnTrackCreatorToolConfig import MdtDriftCircleOnTrackCreatorCfg, TriggerChamberClusterOnTrackCreatorCfg
288 from MuonCombinedConfig.MuonCombinedRecToolsConfig import MuonSegmentSelectionToolCfg
289 result = MdtDriftCircleOnTrackCreatorCfg(flags)
290 kwargs.setdefault("MdtRotCreator", result.getPrimary())
291
292 if flags.Detector.GeometryCSC:
293 from MuonConfig.MuonRIO_OnTrackCreatorToolConfig import CscClusterOnTrackCreatorCfg
294 kwargs.setdefault("CscRotCreator", result.popToolsAndMerge(CscClusterOnTrackCreatorCfg(flags)))
295 else:
296 kwargs.setdefault("CscRotCreator", "")
297
298 kwargs.setdefault("CompetingClustersCreator", result.popToolsAndMerge(TriggerChamberClusterOnTrackCreatorCfg(flags)))
299
300 kwargs.setdefault("MuonPrinterTool", result.getPrimaryAndMerge(MuonEDMPrinterToolCfg(flags) ))
301
302 from MuonConfig.MuonRecToolsConfig import MuPatHitToolCfg
303 kwargs.setdefault("HitTool", result.getPrimaryAndMerge(MuPatHitToolCfg(flags)))
304 kwargs.setdefault("SegmentSelector", result.popToolsAndMerge(MuonSegmentSelectionToolCfg(flags)))
305
306 result.setPrivateTools(CompFactory.Muon.MuPatCandidateTool(name, **kwargs))
307 return result
308
309def MuonChamberHoleRecoveryToolCfg(flags, name="MuonChamberHoleRecoveryTool", **kwargs):
310 result=ComponentAccumulator()
311 # Not setting explicitly MuonStationIntersectSvc
312
313 from TrkConfig.AtlasExtrapolatorConfig import MuonExtrapolatorCfg
314 kwargs.setdefault("Extrapolator", result.popToolsAndMerge(MuonExtrapolatorCfg(flags)))
315
316 from MuonConfig.MuonGeometryConfig import TrackingVolumesSvcCfg
317 kwargs.setdefault("TrackingVolumesSvc", result.getPrimaryAndMerge(TrackingVolumesSvcCfg(flags)))
318
319 if not flags.Detector.GeometryMDT:
320 kwargs.setdefault("MdtPrepDataContainer","")
321 else:
322 from MuonConfig.MuonRIO_OnTrackCreatorToolConfig import MdtDriftCircleOnTrackCreatorCfg
323 kwargs.setdefault("MdtRotCreator", result.getPrimaryAndMerge(MdtDriftCircleOnTrackCreatorCfg(flags)))
324
325 if not flags.Detector.GeometryRPC:
326 kwargs.setdefault("RpcPrepDataContainer","")
327 if not flags.Detector.GeometryTGC:
328 kwargs.setdefault("TgcPrepDataContainer","")
329
330 kwargs.setdefault("AddMeasurements", not flags.Muon.doSegmentT0Fit )
331
332
333 if flags.Detector.GeometryCSC:
334 from MuonConfig.MuonRIO_OnTrackCreatorToolConfig import CscClusterOnTrackCreatorCfg
335 kwargs.setdefault("CscRotCreator", result.popToolsAndMerge(CscClusterOnTrackCreatorCfg(flags)))
336 else:
337 kwargs.setdefault("CscPrepDataContainer","")
338
339 from MuonConfig.MuonRIO_OnTrackCreatorToolConfig import MuonClusterOnTrackCreatorCfg
340 kwargs.setdefault("ClusterRotCreator", result.popToolsAndMerge(MuonClusterOnTrackCreatorCfg(flags)))
341
342 if not flags.Detector.GeometrysTGC:
343 kwargs.setdefault("sTgcPrepDataContainer","")
344
345 if not flags.Detector.GeometryMM:
346 kwargs.setdefault("MMPrepDataContainer","")
347
348 kwargs.setdefault('TgcPrepDataContainer', 'TGC_MeasurementsAllBCs')
349 kwargs.setdefault("EDMPrinter", result.getPrimaryAndMerge(MuonEDMPrinterToolCfg(flags) ))
350
351 if "PullCalculator" not in kwargs:
352 from TrkConfig.TrkResidualPullCalculatorConfig import (
353 ResidualPullCalculatorCfg)
354 kwargs.setdefault("PullCalculator", result.popToolsAndMerge(
355 ResidualPullCalculatorCfg(flags)))
356
357 result.setPrivateTools(CompFactory.Muon.MuonChamberHoleRecoveryTool(name, **kwargs))
358 return result
359
360def MuonTrackSteeringCfg(flags, name="MuonTrackSteering", **kwargs):
361 Muon__MuonTrackSteering=CompFactory.Muon.MuonTrackSteering
362 # This is based on https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py#L35
363 result=ComponentAccumulator()
364
365 # This was originally defined here: https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandaloneFlags.py#L137
366 MoorelikeStrategy=[
367 "BarrelCombined[CombineSegInStation,DoRefinement,DoAmbiSolving,CutSeedsOnTracks]:BML,BMS;BOL,BOS;BIL,BIS",
368 "EndcapCombined[CombineSegInStation,DoRefinement,DoAmbiSolving,CutSeedsOnTracks]:EML,EMS;EOL,EOS;EIL,EIS;CSL,CSS;EEL,EES;BEE",
369 "BarrelEndcap[CombineSegInStation,DoRefinement,DoAmbiSolving,CutSeedsOnTracks,BarrelEndcapFilter]:EML,EMS;EEL,EES;BML,BMS;EIL,EIS;BIL,BIS;BOL,BOS"]
370
371 kwargs.setdefault("StrategyList", MoorelikeStrategy)
372
373 # Set properties which were set in MuonStandalone.py, and which aren't default (fix this later, because we don't want to break existing configuration)
374 # extraFlags are ignored (don't believe they're necessary)
375
376 result = MCTBSLFitterCfg(flags)
377 mctbslfitter = result.getPrimary()
378
379 acc = MuonSegmentRegionRecoveryToolCfg(flags, name='MuonEORecoveryTool', OnlyEO = True, Fitter=mctbslfitter, UseFitterOutlierLogic=False)
380 muon_eo_recovery_tool = acc.getPrimary()
381 result.merge(acc)
382
383 kwargs.setdefault("HoleRecoveryTool", muon_eo_recovery_tool)
384 kwargs.setdefault("SegSeedQCut", 2 if flags.Beam.Type != BeamType.Cosmics else 1)
385 kwargs.setdefault("Seg2ndQCut", 1)
386
387 if "TrackBuilderTool" not in kwargs:
388 # Old config had: kwargs["TrackBuilderTool"] = getPublicToolClone("MooMuonTrackBuilder", "MooTrackBuilderTemplate",
389 # extraFlags=extraFlags)
390 # For some strange reason, MooTrackBuilderTemplate was just a MooTrackBuilder i.e. they had:
391 # addTool( "MuonRecExample.MooreTools.MooTrackBuilder", "MooTrackBuilderTemplate") but passing in extraFlags
392 # I have simplified this. Also, in the old configuration there was the possiblity to set optimiseMomentumResolutionUsingChi2 to true in extraflags (which were passed to TrackBuilderTool but not TrackRefinementTool) - however I don't think this was used, and have removed it.
393 # However some other things were set in extraFlags here: https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py#L39
394 # So I might well have made a mistake. TODO check
395 kwargs["TrackBuilderTool"] = result.popToolsAndMerge( MooTrackBuilderCfg(flags, name='MooMuonTrackBuilder', prefix="MuSt_"))
396
397 if "TrackRefinementTool" not in kwargs:
398 kwargs["TrackRefinementTool"] = result.popToolsAndMerge( MooTrackBuilderCfg(flags, name='MooTrackBuilderTemplate', doSegmentPhiMatching=False))
399
400 acc=MuPatCandidateToolCfg(flags)
401 cand_tool = acc.getPrimary()
402 result.merge(acc)
403 kwargs.setdefault("MuPatCandidateTool", cand_tool)
404
405 from MuonConfig.MuonRecToolsConfig import MuonAmbiProcessorCfg
406 acc = MuonAmbiProcessorCfg(flags, name='MuonAmbiProcessor')
407 ambi = acc.getPrimary()
408 result.merge(acc)
409 kwargs.setdefault("AmbiguityTool", ambi)
410
411 kwargs.setdefault("MooBuilderTool", result.popToolsAndMerge( MooTrackBuilderCfg(flags, name='MooMuonTrackBuilder', prefix="MuSt_")))
412
413 kwargs.setdefault("CandidateMatchingTool",
414 result.popToolsAndMerge(MooCandidateMatchingToolCfg(flags, doSegmentPhiMatching=True)))
415
416 kwargs.setdefault("MuonSegmentFittingTool",
417 result.popToolsAndMerge(MuonSegmentFittingToolCfg(flags)))
418 kwargs.setdefault("MuonTrackSelector",
419 result.popToolsAndMerge(MuonTrackSelectorCfg(flags)))
420
421 kwargs.setdefault("HoleRecoveryTool",
422 result.popToolsAndMerge(MuonChamberHoleRecoveryToolCfg(flags)))
423
424 from TrkConfig.TrkTrackSummaryToolConfig import MuonTrackSummaryToolCfg
425 kwargs.setdefault("TrackSummaryTool", result.popToolsAndMerge(MuonTrackSummaryToolCfg(flags)))
426 kwargs.setdefault("DoSummary", flags.Muon.printSummary)
427
428
429 track_maker_steering = Muon__MuonTrackSteering(name,**kwargs)
430 result.setPrivateTools(track_maker_steering)
431 return result
432
433def MuonTrackSelectorCfg(flags, name = "MuonTrackSelectorTool", **kwargs):
434 from MuonConfig.MuonRecToolsConfig import MuonTrackSummaryHelperToolCfg
435
436 result = ComponentAccumulator()
437 if flags.Beam.Type in [BeamType.Cosmics, BeamType.SingleBeam] or not flags.Input.isMC:
438 kwargs.setdefault("UseRPCHoles", False)
439 kwargs.setdefault("UseTGCHoles", False)
440 kwargs.setdefault("MaxMdtHolesOnTwoStationTrack", 10)
441 kwargs.setdefault("MaxMdtHolesOnTrack", 30)
442 kwargs.setdefault("HolesToHitsRatioCutPerStation", 2)
443 kwargs.setdefault("CountMDTOutlierAsHoles", False)
444 else:
445 kwargs.setdefault("MaxMdtHolesOnTwoStationTrack", 4)
446 kwargs.setdefault("MaxMdtHolesOnTrack", 5)
447 kwargs.setdefault("CountMDTOutlierAsHoles", True)
448
449 kwargs.setdefault("TrackSummaryHelperTool", result.popToolsAndMerge(MuonTrackSummaryHelperToolCfg(flags)))
450
451 theTool = CompFactory.Muon.MuonTrackSelectorTool(name, **kwargs)
452 result.setPrivateTools(theTool)
453 return result
454
455
456def MuPatTrackBuilderCfg(flags, name = "MuPatTrackBuilder", **kwargs):
457 result=ComponentAccumulator()
458 acc = MuonTrackSteeringCfg(flags)
459 track_steering = acc.getPrimary()
460 result.merge(acc)
461
462 kwargs.setdefault("TrackSteering", track_steering)
463 kwargs.setdefault("MuonSegmentCollection", "TrackMuonSegments")
464 kwargs.setdefault("SpectrometerTrackOutputLocation", "MuonSpectrometerTracks")
465
466 track_builder = CompFactory.MuPatTrackBuilder(name=name, **kwargs)
467 result.addEventAlgo( track_builder, primary=True )
468
469 return result
470def MuonTrackBuildingCfg(flags, name = "MuPatTrackBuilder", **kwargs):
471 # This is based on https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py#L162
472 result=ComponentAccumulator()
473
474 #Arguably this should be somewhere deeper - not quite sure where yet though. FIXME
475 from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg
476 result.merge( MuonGeoModelCfg(flags) )
477 from MuonConfig.MuonRecToolsConfig import MuonEDMHelperSvcCfg
478 result.merge(MuonEDMHelperSvcCfg(flags))
479
480 # release 21 ESDs contain a Trk::SegmentCollection named 'MuonSegments' instead of 'TrackMuonSegments', the following 2 lines account for that
481 from MuonConfig.MuonSegmentNameFixConfig import MuonSegmentNameFixCfg
482 result.merge(MuonSegmentNameFixCfg(flags))
483 result.merge(MuPatTrackBuilderCfg(flags))
484
485 return result
486
487
488if __name__=="__main__":
489 # To run this, do e.g.
490 # python -m MuonConfig.MuonTrackBuildingConfig --run --threads=
491 from MuonConfig.MuonConfigUtils import SetupMuonStandaloneConfigFlags, SetupMuonStandaloneOutput, SetupMuonStandaloneCA
492
493 flags = SetupMuonStandaloneConfigFlags()
494 cfg = SetupMuonStandaloneCA(flags)
495
496 # Run the actual test.
497 cfg.merge(MuonTrackBuildingCfg(flags))
498
499
500 # This is a temporary fix - it should go someplace central as it replaces the functionality of addInputRename from here:
501 # https://gitlab.cern.ch/atlas/athena/blob/master/Control/SGComps/python/AddressRemappingSvc.py
502 AddressRemappingSvc, ProxyProviderSvc=CompFactory.getComps("AddressRemappingSvc","ProxyProviderSvc",)
505 pps.ProviderNames += [ 'AddressRemappingSvc' ]
506 ars.TypeKeyRenameMaps += [ '%s#%s->%s' % ("TrackCollection", "MuonSpectrometerTracks", "MuonSpectrometerTracks_old") ]
507
508 cfg.addService(pps)
509 cfg.addService(ars)
510
511 itemsToRecord = ["TrackCollection#MuonSpectrometerTracks"]
512 SetupMuonStandaloneOutput(cfg, flags, itemsToRecord)
513
514 cfg.printConfig(withDetails = True)
515
516 f=open("MuonTrackBuilding.pkl","wb")
517 cfg.store(f)
518 f.close()
519
520 from MuonConfig.MuonConfigUtils import executeTest
521 executeTest(cfg)
522
This class provides the interface to the LCG POOL persistency software.
manages the address providers and add proxies on demand to the store
MuonSegmentRegionRecoveryToolCfg(flags, name="MuonSegmentRegionRecoveryTool", **kwargs)
MuonSegmentMatchingToolCfg(flags, name="MuonSegmentMatchingTool", **kwargs)
MuonTrackSteeringCfg(flags, name="MuonTrackSteering", **kwargs)
MuPatCandidateToolCfg(flags, name="MuPatCandidateTool", **kwargs)
MuonSegmentInOverlapResolvingToolCfg(flags, name="MuonSegmentInOverlapResolvingTool", **kwargs)
MuPatTrackBuilderCfg(flags, name="MuPatTrackBuilder", **kwargs)
MooCandidateMatchingToolCfg(flags, name="MooCandidateMatchingTool", doSegmentPhiMatching=False, prefix="", **kwargs)
MooTrackBuilderCfg(flags, name="MooTrackBuilderTemplate", prefix="", doSegmentPhiMatching=True, **kwargs)
MuonTrackSelectorCfg(flags, name="MuonTrackSelectorTool", **kwargs)
MooTrackFitterCfg(flags, name='MooTrackFitter', prefix='', **kwargs)
MuonTrackBuildingCfg(flags, name="MuPatTrackBuilder", **kwargs)
MuonChamberHoleRecoveryToolCfg(flags, name="MuonChamberHoleRecoveryTool", **kwargs)