ATLAS Offline Software
Loading...
Searching...
No Matches
MuonCombinedReconstructionConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
3from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
4from AthenaConfiguration.ComponentFactory import CompFactory
5from AthenaConfiguration.Enums import BeamType
6
7
8def MuonCaloTagAlgCfg(flags, name="MuonCaloTagAlg", **kwargs):
9 from MuonCombinedConfig.MuonCombinedRecToolsConfig import MuonCaloTagToolCfg
10 result = ComponentAccumulator()
11 kwargs.setdefault("MuonCombinedInDetExtensionTool",
12 result.popToolsAndMerge(MuonCaloTagToolCfg(flags)))
13 kwargs.setdefault("TagMap", "caloTagMap")
14 kwargs.setdefault("CombinedTrackCollection", "")
15 kwargs.setdefault("METrackCollection", "")
16 kwargs.setdefault("usePRDs", False)
17 alg = CompFactory.MuonCombinedInDetExtensionAlg(name, **kwargs)
18 result.addEventAlgo(alg, primary=True)
19 return result
20
21
22def LRT_MuonCaloTagAlgCfg(flags, name="MuonCaloTagAlg_LRT", **kwargs):
23 kwargs.setdefault("TagMap", "caloTagMap_LRT")
24 kwargs.setdefault("InDetCandidateLocation", "TrackParticleCandidateLRT")
25 return MuonCaloTagAlgCfg(flags, name, **kwargs)
26
27
28def MuonSegmentTagAlgCfg(flags, name="MuonSegmentTagAlg", **kwargs):
29 from MuonCombinedConfig.MuonCombinedRecToolsConfig import MuonSegmentTagToolCfg
30 result = MuonSegmentTagToolCfg(flags)
31 muon_segment_tag_tool = result.popPrivateTools()
32 kwargs.setdefault("MuonSegmentTagTool", muon_segment_tag_tool)
33 kwargs.setdefault("InDetCandidateLocation",
34 "InDetCandidates" if not flags.MuonCombined.doCombinedFit else "InDetCandidatesSystemExtened")
35 alg = CompFactory.MuonSegmentTagAlg(name, **kwargs)
36 result.addEventAlgo(alg, primary=True)
37 return result
38
39
40def LRT_MuonSegmentTagAlgCfg(flags, name="MuonSegmentTagAlg_LRT", **kwargs):
41 kwargs.setdefault("TagMap", "segmentTagMap_LRT")
42 kwargs.setdefault("InDetCandidateLocation", "TrackParticleCandidateLRT"
43 if not flags.MuonCombined.doCombinedFit else "InDetCandidateLRT_SystemExtended")
44 return MuonSegmentTagAlgCfg(flags, name, **kwargs)
45
46
47def MuonInsideOutRecoAlgCfg(flags, name="MuonInsideOutRecoAlg", **kwargs):
48 from MuonCombinedConfig.MuonCombinedRecToolsConfig import MuonInsideOutRecoToolCfg
49 result = ComponentAccumulator()
50 kwargs.setdefault("MuonCombinedInDetExtensionTool",
51 result.popToolsAndMerge(MuonInsideOutRecoToolCfg(flags)))
52 kwargs.setdefault("usePRDs", True)
53 kwargs.setdefault("HasCSC", flags.Detector.GeometryCSC)
54 kwargs.setdefault("HasSTgc", flags.Detector.GeometrysTGC)
55 kwargs.setdefault("HasMM", flags.Detector.GeometryMM)
56 kwargs.setdefault("TagMap", "muGirlTagMap")
57 kwargs.setdefault("SegmentCollection", "MuGirlSegments")
58 kwargs.setdefault("TGCPrepDataLocation",
59 'TGC_MeasurementsAllBCs')
60 kwargs.setdefault("InDetCandidateLocation",
61 "InDetCandidates" if not flags.MuonCombined.doCombinedFit else "InDetCandidatesSystemExtened")
62
63 alg = CompFactory.MuonCombinedInDetExtensionAlg(name, **kwargs)
64 result.addEventAlgo(alg, primary=True)
65 return result
66
67
68def LRT_MuGirlAlgCfg(flags, name="MuGirlAlg_LRT", **kwargs):
69 kwargs.setdefault("TagMap", "MuGirlMap_LRT")
70 kwargs.setdefault("METrackCollection", "MuGirlMETracks_LRT")
71 kwargs.setdefault("SegmentCollection", "MuGirlSegments_LRT")
72 kwargs.setdefault("CombinedTrackCollection",
73 "MuGirlCombinedMuonContainerLRT")
74 kwargs.setdefault("InDetCandidateLocation", "TrackParticleCandidateLRT"
75 if not flags.MuonCombined.doCombinedFit else "InDetCandidateLRT_SystemExtended")
76 return MuonInsideOutRecoAlgCfg(flags, name, **kwargs)
77
78
79def MuGirlStauAlgCfg(flags, name="MuGirlStauAlg", **kwargs):
80 from MuonCombinedConfig.MuonCombinedRecToolsConfig import MuonStauRecoToolCfg
81 result = ComponentAccumulator()
82 kwargs.setdefault("MuonCombinedInDetExtensionTool",
83 result.popToolsAndMerge(MuonStauRecoToolCfg(flags)))
84 kwargs.setdefault("TagMap", "stauTagMap")
85 kwargs.setdefault("HasCSC", flags.Detector.GeometryCSC)
86 kwargs.setdefault("HasSTgc", False)
87 kwargs.setdefault("HasMM", False)
88 kwargs.setdefault("TGCPrepDataLocation", 'TGC_MeasurementsAllBCs')
89 kwargs.setdefault("CombinedTrackCollection", "MuGirlStauCombinedTracks")
90 kwargs.setdefault("METrackCollection", "")
91 kwargs.setdefault("SegmentCollection", "TrkStauSegments")
92 kwargs.setdefault("InDetCandidateLocation",
93 "InDetCandidates" if not flags.MuonCombined.doCombinedFit else "InDetCandidatesStaus")
94 alg = CompFactory.MuonCombinedInDetExtensionAlg(name, **kwargs)
95 result.addEventAlgo(alg, primary=True)
96 return result
97
98
99def MuonCombinedMuonCandidateAlgCfg(flags, name="MuonCombinedMuonCandidateAlg", **kwargs):
100 from MuonCombinedConfig.MuonCombinedRecToolsConfig import MuonCandidateToolCfg
101
102 result = ComponentAccumulator()
103
104 # EJWM - not completely sure where this comes from. Perhaps should be retrieved by a sub-tool?
105 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
106 result.merge(CaloNoiseCondAlgCfg(flags, "totalNoise"))
107
108 tool_kwargs = {}
109 if flags.Beam.Type is BeamType.Cosmics:
110 tool_kwargs.setdefault("ExtrapolationStrategy", 1)
111
112 acc = MuonCandidateToolCfg(flags, **tool_kwargs)
113 kwargs.setdefault("MuonCandidateTool", acc.popPrivateTools())
114 result.merge(acc)
115
116 alg = CompFactory.MuonCombinedMuonCandidateAlg(name, **kwargs)
117 result.addEventAlgo(alg, primary=True)
118 return result
119
120def MuonCombinedInDetCandidateAlgCfg(flags, name="MuonCombinedInDetCandidateAlg", **kwargs):
121 from InDetConfig.InDetTrackSelectorToolConfig import MuonCombinedInDetDetailedTrackSelectorToolCfg, MuonCombinedInDetDetailedForwardTrackSelectorToolCfg
122 from MuonCombinedConfig.MuonCombinedRecToolsConfig import MuonSystemExtensionToolCfg
123 result = MuonCombinedInDetDetailedTrackSelectorToolCfg(flags)
124 kwargs.setdefault("TrackSelector", result.popPrivateTools())
125 if flags.MuonCombined.doSiAssocForwardMuons and flags.Tracking.doForwardTracks:
126 kwargs.setdefault("DoSiliconAssocForwardMuons", True)
127 kwargs.setdefault("InDetForwardTrackSelector", result.popToolsAndMerge(
128 MuonCombinedInDetDetailedForwardTrackSelectorToolCfg(flags)))
129
130 muon_ext_tool = result.popToolsAndMerge(
131 MuonSystemExtensionToolCfg(flags))
132 kwargs.setdefault("MuonSystemExtensionTool", muon_ext_tool)
133
134 # Switch off the muon system extensions if we fit combined muons
135 # The MuonInDetToSystemExtensionAlg will perform the system extensions then
136 kwargs.setdefault("ExtendBulk", not flags.MuonCombined.doCombinedFit)
137
138 if flags.Reco.EnableCaloExtension and not flags.Muon.MuonTrigger:
139 kwargs.setdefault("CaloExtensionLocation", ["ParticleCaloExtension"])
140
141 alg = CompFactory.MuonCombinedInDetCandidateAlg(name, **kwargs)
142 result.addEventAlgo(alg, primary=True)
143 return result
144
145
146def MuonInDetToMuonSystemExtensionAlgCfg(flags, name="MuonInDetToMuonSystemExtensionAlg", **kwargs):
147 result = ComponentAccumulator()
148 from MuonCombinedConfig.MuonCombinedRecToolsConfig import MuonSystemExtensionToolCfg
149 muon_ext_tool = result.popToolsAndMerge(
150 MuonSystemExtensionToolCfg(flags))
151 kwargs.setdefault("MuonSystemExtensionTool", muon_ext_tool)
152 kwargs.setdefault("noNSWforSeeding", True)
153 kwargs.setdefault("WriteStauCandidates", "InDetCandidatesStausPrompt"
154 if flags.Tracking.doLargeD0 else "InDetCandidatesStaus")
155
156 if not flags.Muon.MuonTrigger:
157 from MuonConfig.MuonSegmentFindingConfig import MuonLayerHoughAlgCfg
158 result.merge(MuonLayerHoughAlgCfg(flags))
159 kwargs.setdefault("UseOnlyHitSectors",
160 not flags.Muon.MuonTrigger and flags.Beam.Type is BeamType.Collisions)
161 alg = CompFactory.MuonInDetToMuonSystemExtensionAlg(name, **kwargs)
162 result.addEventAlgo(alg, primary=True)
163 return result
164
165
166def LRT_MuonInDetToMuonSystemExtensionAlgCfg(flags, name="MuonInDetToMuonSystemExtensionAlg_LRT", **kwargs):
167 kwargs.setdefault("WriteStauCandidates", "InDetCandidatesStausLRT")
168 kwargs.setdefault("WriteInDetCandidates",
169 "InDetCandidateLRT_SystemExtended")
170 kwargs.setdefault("InputInDetCandidates", "TrackParticleCandidateLRT")
171 kwargs.setdefault("CombinedTagMap", "muidcoTagMap_LRT")
172 return MuonInDetToMuonSystemExtensionAlgCfg(flags, name, **kwargs)
173
174
175def LRT_MuonCombinedInDetCandidateAlgCfg(flags, name="MuonCombinedInDetCandidateAlg_LRT", **kwargs):
176 from InDetConfig.InDetTrackSelectorToolConfig import MuonCombinedInDetDetailedForwardTrackSelectorToolCfg, MuonCombinedInDetDetailedTrackSelectorTool_LRTCfg
177 result = ComponentAccumulator()
178
179 kwargs.setdefault("TrackSelector", result.popToolsAndMerge(
180 MuonCombinedInDetDetailedTrackSelectorTool_LRTCfg(flags)))
181
182 # Use the Standard Track particle container in cases where no separate containters will be
183 # saved for the LRT tracking
184 kwargs.setdefault("TrackParticleLocation", ["InDetLargeD0TrackParticles"])
185 kwargs.setdefault("InDetCandidateLocation", "TrackParticleCandidateLRT")
186 kwargs.setdefault("DoSiliconAssocForwardMuons", False)
187
188 kwargs.setdefault("InDetForwardTrackSelector", result.popToolsAndMerge(
189 MuonCombinedInDetDetailedForwardTrackSelectorToolCfg(flags)))
190
191 if flags.Reco.EnableCaloExtension and not flags.Muon.MuonTrigger:
192 kwargs.setdefault("CaloExtensionLocation", [
193 "ParticleCaloExtension_LRT"])
194 cand_alg = MuonCombinedInDetCandidateAlgCfg(flags, name, **kwargs)
195 result.merge(cand_alg)
196 return result
197
198
199def MuonCombinedAlgCfg(flags, name="MuonCombinedAlg", **kwargs):
200 from MuonCombinedConfig.MuonCombinedRecToolsConfig import MuonCombinedToolCfg
201 result = ComponentAccumulator()
202 kwargs.setdefault("MuonCombinedTool", result.popToolsAndMerge(
203 MuonCombinedToolCfg(flags)))
204 tagmaps = []
205 # CombinedTagMaps must be in a 1-1 correspondence
206 # with MuonCombinedTagTools.
207 for h in kwargs['MuonCombinedTool'].MuonCombinedTagTools:
208 if str(h).find('FitTagTool') >= 0:
209 tagmaps.append('muidcoTagMap')
210 elif str(h).find('StacoTagTool') >= 0:
211 tagmaps.append('stacoTagMap')
212 kwargs.setdefault("CombinedTagMaps", tagmaps)
213 alg = CompFactory.MuonCombinedAlg(name, **kwargs)
214 result.addEventAlgo(alg, primary=True)
215 return result
216
217def LRT_MuonCombinedAlgCfg(flags, name="MuonCombinedAlg_LRT", **kwargs):
218 kwargs.setdefault("InDetCandidateLocation", "TrackParticleCandidateLRT")
219 kwargs.setdefault("CombinedTagMaps", [
220 "muidcoTagMap_LRT", "stacoTagMap_LRT"])
221 kwargs.setdefault("MuidCombinedTracksLocation", "MuidCombinedTracks_LRT")
222 kwargs.setdefault("MuidMETracksLocation", "MuidMETracks_LRT")
223 return MuonCombinedAlgCfg(flags, name, **kwargs)
224
225
226def MuonCreatorAlgCfg(flags, name="MuonCreatorAlg", **kwargs):
227 from MuonCombinedConfig.MuonCombinedRecToolsConfig import MuonCreatorToolCfg
228 result = MuonCreatorToolCfg(flags, name="MuonCreatorTool")
229 kwargs.setdefault("MuonCreatorTool", result.popPrivateTools())
230
231 # if muGirl is off, remove "muGirlTagMap" from "TagMaps"
232 # but don't set this default in case the StauCreatorAlg is created (see below)
233 tag_maps = []
234 if flags.MuonCombined.doMuGirl:
235 tag_maps += ["muGirlTagMap"]
236 if flags.MuonCombined.doStatisticalCombination:
237 tag_maps += ["stacoTagMap"]
238 if flags.MuonCombined.doCombinedFit:
239 tag_maps += ["muidcoTagMap"]
240 if flags.MuonCombined.doCaloTrkMuId:
241 tag_maps += ["caloTagMap"]
242 if flags.MuonCombined.doMuonSegmentTagger:
243 tag_maps += ["segmentTagMap"]
244 kwargs.setdefault("TagMaps", tag_maps)
245 if flags.Muon.MuonTrigger:
246 kwargs.setdefault("MakeClusters", False)
247 kwargs.setdefault("ClusterContainerName", "")
248 kwargs.setdefault("SegmentContainerName", "")
249 kwargs.setdefault("TagToSegmentKey", "")
250 if flags.Muon.SAMuonTrigger:
251 kwargs.setdefault("CreateSAmuons", True)
252 kwargs.setdefault("TagMaps", [])
253
254 alg = CompFactory.MuonCreatorAlg(name, **kwargs)
255 result.addEventAlgo(alg, primary=True)
256 return result
257
258
259def LRT_MuonCreatorAlgCfg(flags, name="MuonCreatorAlg_LRT", **kwargs):
260 result = ComponentAccumulator()
261 from MuonCombinedConfig.MuonCombinedRecToolsConfig import MuonCreatorToolCfg
262 creatorTool = result.popToolsAndMerge(
263 MuonCreatorToolCfg(flags, "MuonCreatorTool_LRT", RequireIDTrack=True))
264 kwargs.setdefault("MuonCreatorTool", creatorTool)
265 # In cases we want to switch them off we should add the flags here
266 tag_maps = []
267 if flags.MuonCombined.doMuGirl:
268 tag_maps += ["MuGirlMap_LRT"]
269 if flags.MuonCombined.doStatisticalCombination:
270 tag_maps += ["stacoTagMap_LRT"]
271 if flags.MuonCombined.doCombinedFit:
272 tag_maps += ["muidcoTagMap_LRT"]
273 if flags.MuonCombined.doCaloTrkMuId:
274 tag_maps += ["caloTagMap_LRT"]
275 if flags.MuonCombined.doMuonSegmentTagger:
276 tag_maps += ["segmentTagMap_LRT"]
277 kwargs.setdefault("TagMaps", tag_maps)
278 kwargs.setdefault("MuonContainerLocation", "MuonsLRT")
279 kwargs.setdefault("ExtrapolatedLocation", "ExtraPolatedMuonsLRT")
280 kwargs.setdefault("MSOnlyExtrapolatedLocation",
281 "MSOnlyExtraPolatedMuonsLRT")
282 kwargs.setdefault("CombinedLocation", "CombinedMuonsLRT")
283 kwargs.setdefault("BuildSlowMuon", False)
284 kwargs.setdefault("MakeClusters", False)
285 kwargs.setdefault("ClusterContainerName", "")
286 result.merge(MuonCreatorAlgCfg(flags, name=name, **kwargs))
287 return result
288
289def StauCreatorAlgCfg(flags, name="StauCreatorAlg", **kwargs):
290 from MuonCombinedConfig.MuonCombinedRecToolsConfig import MuonCreatorToolCfg
291 result = MuonCreatorToolCfg(
292 flags, BuildStauContainer=True, name='StauCreatorTool')
293 kwargs.setdefault("MuonCreatorTool", result.popPrivateTools())
294 kwargs.setdefault("MuonContainerLocation", "Staus")
295 kwargs.setdefault("CombinedLocation", "CombinedStau")
296 kwargs.setdefault("ExtrapolatedLocation", "ExtrapolatedStau")
297 kwargs.setdefault("MSOnlyExtrapolatedLocation", "MSOnlyExtrapolatedStau")
298 kwargs.setdefault("MuonCandidateLocation", [])
299 kwargs.setdefault("SegmentContainerName", "StauSegments")
300 kwargs.setdefault("TagToSegmentKey", "")
301 kwargs.setdefault("BuildSlowMuon", 1)
302 kwargs.setdefault("ClusterContainerName", "SlowMuonClusterCollection")
303 kwargs.setdefault("TagMaps", ["stauTagMap"])
304 acc = MuonCreatorAlgCfg(flags, name, **kwargs)
305 result.merge(acc)
306 return result # don't have the right algorithm being primary here, but should be okay?
307
308
309def MuonSegContainerMergerAlgCfg(flags, name="MuonSegContainerMergerAlg", **kwargs):
310 result = ComponentAccumulator()
311 kwargs.setdefault("saveUnusedSegments",
312 flags.MuonCombined.writeUnAssocSegments)
313 tag_maps = []
314 if flags.MuonCombined.doMuGirl:
315 tag_maps += ["muGirlTagMap"]
316 if flags.MuonCombined.doStatisticalCombination:
317 tag_maps += ["stacoTagMap"]
318 if flags.MuonCombined.doCombinedFit:
319 tag_maps += ["muidcoTagMap"]
320 if flags.MuonCombined.doMuonSegmentTagger:
321 tag_maps += ["segmentTagMap"]
322 muon_maps = ["MuonCandidates"]
323 if flags.Tracking.doLargeD0:
324 if flags.MuonCombined.doMuGirl:
325 tag_maps += ["MuGirlMap_LRT"]
326 if flags.MuonCombined.doStatisticalCombination:
327 tag_maps += ["stacoTagMap_LRT"]
328 if flags.MuonCombined.doCombinedFit:
329 tag_maps += ["muidcoTagMap_LRT"]
330 if flags.MuonCombined.doMuonSegmentTagger:
331 tag_maps += ["segmentTagMap_LRT"]
332 kwargs.setdefault("MuonCandidateMaps", muon_maps)
333 kwargs.setdefault("TagMaps", tag_maps)
334 from MuonConfig.MuonRecToolsConfig import MuonAmbiProcessorCfg
335 kwargs.setdefault("AmbiguityProcessor", result.popToolsAndMerge(
336 MuonAmbiProcessorCfg(flags)))
337
338 the_alg = CompFactory.MuonSegContainerMergerAlg(name, **kwargs)
339 result.addEventAlgo(the_alg)
340 return result
341
342
343def MuonInDetExtensionMergerAlgCfg(flags, name="MuonInDetExtensionMergerAlg", **kwargs):
344 result = ComponentAccumulator()
345 kwargs.setdefault(
346 "ToMerge", ["InDetCandidatesStausPrompt", "InDetCandidatesStausLRT"])
347 kwargs.setdefault("ToWrite", "InDetCandidatesStaus")
348 the_alg = CompFactory.MuonInDetExtensionMergerAlg(name, **kwargs)
349 result.addEventAlgo(the_alg, primary=True)
350 return result
351
352# Returns a pair vectors containing th names of the
353# track particle collections associated with combined muon tracks
354
355
357 tp_coll = []
358 track_coll = []
359 tp_coll = ["ExtrapolatedMuonTrackParticles",
360 "CombinedMuonTrackParticles",
361 "MSOnlyExtrapolatedMuonTrackParticles"]
362 track_coll = ["ExtrapolatedMuonTracks",
363 "CombinedMuonTracks",
364 "MSOnlyExtrapolatedTracks"]
365 if flags.MuonCombined.doMuGirl and flags.MuonCombined.doMuGirlLowBeta:
366 tp_coll += ["CombinedStauTrackParticles",
367 "ExtrapolatedStauTrackParticles"]
368 track_coll += ["CombinedStauTracks",
369 "ExtrapolatedStauTracks"]
370 if flags.Tracking.doLargeD0:
371 tp_coll += ["CombinedMuonsLRTTrackParticles",
372 "ExtraPolatedMuonsLRTTrackParticles",
373 "MSOnlyExtraPolatedMuonsLRTTrackParticles"]
374 track_coll += ["CombinedMuonsLRTTracks",
375 "ExtraPolatedMuonsLRTTracks",
376 "MSOnlyExtraPolatedMuonsLRTTrackParticlesTracks"]
377 return tp_coll, track_coll
378
379
380def MuonTrkIDMSScatterDecorAlgCfg(flags, name="MuonCombIDMSScatterDecorAlg", **kwargs):
381 result = ComponentAccumulator()
382 the_alg = CompFactory.MuonTrkIDMSScatterDecorAlg(name=name, **kwargs)
383 result.addEventAlgo(the_alg)
384 return result
385
386
387def MuonTrkAEOTDecorAlgCfg(flags, name="MuonCombAEOTDecorAlg", **kwargs):
388 result = ComponentAccumulator()
389 the_alg = CompFactory.MuonTrkAEOTDecorationAlg(name=name, **kwargs)
390 result.addEventAlgo(the_alg)
391 return result
392
393
394def MuonPrecisionLayerDecorAlgCfg(flags, name="MuonPrecisionLayerDecorAlg", **kwargs):
395 result = ComponentAccumulator()
396 the_alg = CompFactory.MuonPrecisionLayerDecorAlg(name=name, **kwargs)
397 result.addEventAlgo(the_alg)
398 return result
399
400
402 result = ComponentAccumulator()
403 trk_cols = ["ExtrapolatedMuonTrackParticles",
404 "CombinedMuonTrackParticles",
405 "MSOnlyExtrapolatedMuonTrackParticles"]
406 stau_coll = ["CombinedStauTrackParticles",
407 "ExtrapolatedStauTrackParticles"] if flags.MuonCombined.doMuGirl and flags.MuonCombined.doMuGirlLowBeta else []
408 track_coll_lrt = ["CombinedMuonsLRTTrackParticles",
409 "ExtraPolatedMuonsLRTTrackParticles",
410 "MSOnlyExtraPolatedMuonsLRTTrackParticles"] if flags.Tracking.doLargeD0 else []
411
412 # Decorate the muon tracks
413 for coll in trk_cols + stau_coll + track_coll_lrt:
414 result.merge(MuonTrkIDMSScatterDecorAlgCfg(flags, "MuonCombIDMSScatterDecorAlg"+coll,
415 TrackContainer=coll))
416
417 result.merge(MuonTrkAEOTDecorAlgCfg(flags, "MuonCombAEOTDecorAlg"+coll,
418 TrackContainer=coll))
419 # Proceed with the precision layer decoration
420 prec_trk_cols = ["ExtrapolatedMuonTrackParticles",
421 "CombinedMuonTrackParticles",
422 "MSOnlyExtrapolatedMuonTrackParticles"]
423 result.merge(MuonPrecisionLayerDecorAlgCfg(flags, "MuonCombPrecisionLayerDecorAlg",
424 MuonContainer="Muons",
425 TrackContainer=prec_trk_cols))
426 if flags.MuonCombined.doMuGirl and flags.MuonCombined.doMuGirlLowBeta:
427
428 result.merge(MuonPrecisionLayerDecorAlgCfg(flags, "MuonCombStauPrecisionLayerDecorAlg",
429 MuonContainer="Staus",
430 TrackContainer=stau_coll))
431 if flags.Tracking.doLargeD0:
432
433 result.merge(MuonPrecisionLayerDecorAlgCfg(flags, "MuonCombLRTPrecisionLayerDecorAlg",
434 MuonContainer="MuonsLRT",
435 TrackContainer=track_coll_lrt))
436
437 return result
438
439
441 result = ComponentAccumulator()
442 particle_cols, trk_cols = GetCombinedTrkContainers(flags)
443
444 from MuonConfig.MuonTruthAlgsConfig import MuonDetailedTrackTruthMakerCfg
445 result.merge(MuonDetailedTrackTruthMakerCfg(flags, name="MuonCombinedDetailedTrackTruthMaker",
446 TrackCollectionNames=trk_cols))
447
448 if(not flags.Muon.scheduleActsReco):
449 for i in range(len(trk_cols)):
450 from TrkConfig.TrkTruthAlgsConfig import TrackTruthSelectorCfg, TrackParticleTruthAlgCfg
451 result.merge(TrackTruthSelectorCfg(flags, tracks=trk_cols[i]))
452 result.merge(TrackParticleTruthAlgCfg(flags, tracks=trk_cols[i],
453 TrackParticleName=particle_cols[i]))
454
455 return result
456
457
459 result = ComponentAccumulator()
460 trk_cols = GetCombinedTrkContainers(flags)[0]
461
462 from MuonConfig.MuonTruthAlgsConfig import MuonTruthAssociationAlgCfg
463 result.merge(MuonTruthAssociationAlgCfg(flags))
464
465 if flags.Tracking.doLargeD0:
466 result.merge(MuonTruthAssociationAlgCfg(flags, name="MuonTruthAssociationAlgLRT",
467 MuonContainerName="MuonsLRT",
468 RecoLinkName="recoMuonLinkLRT",
469 TrackContainers=trk_cols))
470
471 if flags.MuonCombined.doMuGirl and flags.MuonCombined.doMuGirlLowBeta:
472 result.merge(MuonTruthAssociationAlgCfg(flags, name="MuonTruthAssociationAlgStau",
473 MuonContainerName="Staus",
474 RecoLinkName="",
475 TrackContainers=trk_cols))
476
477 return result
478
480 from OutputStreamAthenaPool.OutputStreamConfig import addToESD, addToAOD
481 result = ComponentAccumulator()
482
483 # FIXME! Fix for ATLASRECTS-5151. Remove when better solution found.
484 from TrkEventCnvTools.TrkEventCnvToolsConfig import (
485 TrkEventCnvSuperToolCfg)
486 result.merge(TrkEventCnvSuperToolCfg(flags))
487
488 # Avoid old-style import from from IsolationAlgs.IsoUpdatedTrackCones import iso_vars
489 # But shouldn't be here.
490 iso_vars = []
491 for track_pt in 500, 1000:
492 for cone_str in "", "LooseCone":
493 name = f"Nonprompt_All_MaxWeightTTVA{cone_str}_pt{track_pt}"
494 iso_vars += ["ptconeCorrBitset_"+name,
495 "ptconecoreTrackPtrCorrection_"+name]
496 for cone_size in 20, 30, 40:
497 for var_str in "", "var":
498 iso_vars.append(f"pt{var_str}cone{cone_size}_{name}")
499
500 aod_items = []
501 # Segments
502 aod_items += ["xAOD::MuonSegmentContainer#MuonSegments"]
503 aod_items += ["xAOD::MuonSegmentAuxContainer#MuonSegmentsAux."]
504 if flags.MuonCombined.writeUnAssocSegments:
505 aod_items += ["xAOD::MuonSegmentContainer#UnAssocMuonSegments"]
506 aod_items += ["xAOD::MuonSegmentAuxContainer#UnAssocMuonSegmentsAux."]
507 if flags.MuonCombined.doMuGirlLowBeta:
508 aod_items += ["xAOD::MuonSegmentContainer#StauSegments"]
509 aod_items += ["xAOD::MuonSegmentAuxContainer#StauSegmentsAux."]
510
511 particle_col, trk_col = GetCombinedTrkContainers(flags)
512 if flags.Detector.EnableCalo:
513 aod_items += ["xAOD::CaloClusterContainer#MuonClusterCollection"]
514 aod_items += ["xAOD::CaloClusterAuxContainer#MuonClusterCollectionAux."]
515 aod_items += ["CaloClusterCellLinkContainer#MuonClusterCollection_links"]
516 from CaloRec.CaloThinCellsByClusterAlgConfig import CaloThinCellsByClusterAlgCfg
517 result.merge(CaloThinCellsByClusterAlgCfg(flags, streamName="StreamAOD",
518 clusters="MuonClusterCollection",
519 samplings=["TileGap1", "TileGap2", "TileGap3", "TileBar0", "TileExt0", "HEC0"]))
520
521 # Adding the xAOD content by default
522 excludedAuxData = '-clusterAssociation'
523 aod_items += ["xAOD::TrackParticleContainer#"+col for col in particle_col]
524 aod_items += ["xAOD::TrackParticleAuxContainer#"+col +
525 "Aux." + excludedAuxData for col in particle_col]
526
527 aod_items += ["xAOD::MuonContainer#Muons"]
528 aod_items += ["xAOD::MuonContainer#MuonsLRT"]
529
530 # FIXME! Next two lines are hack to remove derivation framework variables that are added by DRAW building and are supposed to be transient
531 wp_decors = ["DFCommonMuonsTight", "DFCommonGoodMuon", "DFCommonMuonsMedium",
532 "DFCommonMuonsLoose", "InnerDetectorPt", "MuonSpectrometerPt", "isMedium_DRAWZmumu"]
533 # Remove GlobalFELinks and related variables - these are links between FlowElement (FE) containers created in jet finding and muons.
534 # Since these transient FE containers are not in the ESD/AOD, we should not write out these links.
535 gpf_vars = ["chargedGlobalFELinks", "neutralGlobalFELinks",
536 "deltaR_muon_clus_GlobalFEalg", "muon_efrac_matched_GlobalFE"]
537
538 excludedMuonAuxData = ".-"+".-".join(iso_vars+wp_decors+gpf_vars)
539
540 aod_items += ["xAOD::MuonAuxContainer#MuonsAux" + excludedMuonAuxData]
541 aod_items += ["xAOD::MuonAuxContainer#MuonsLRTAux" + excludedMuonAuxData]
542
543 # stau
544 aod_items += ["xAOD::MuonContainer#Staus"]
545 aod_items += ["xAOD::MuonAuxContainer#StausAux" + excludedMuonAuxData]
546 aod_items += ["xAOD::SlowMuonContainer#SlowMuons"]
547 aod_items += ["xAOD::SlowMuonAuxContainer#SlowMuonsAux."]
548
549 # +++++ ESD +++++
550
551 # Tracks
552 esd_items = ["TrackCollection#"+col for col in trk_col]
553 esd_items += ["Trk::SegmentCollection#TrkMuonSegments"]
554 if flags.MuonCombined.writeUnAssocSegments:
555 esd_items += ["Trk::SegmentCollection#UnAssocMuonTrkSegments"]
556 # Truth
557 if flags.Input.isMC:
558 esd_items += ["DetailedTrackTruthCollection#ExtrapolatedMuonTracksTruth"]
559 esd_items += ["DetailedTrackTruthCollection#CombinedMuonTracksTruth"]
560 esd_items += ["DetailedTrackTruthCollection#ExtrapolatedMuonTrackParticlesTruth"]
561 esd_items += ["DetailedTrackTruthCollection#CombinedMuonTrackParticlesTruth"]
562
563 if flags.MuonCombined.doCosmicSplitTracks:
564 esd_items += ["TrackCollection#Combined_Tracks_split"]
565 esd_items += ["TrackCollection#Tracks_split"]
566 esd_items += ["Rec::TrackParticleContainer#TrackParticleCandidate_split"]
567
568 esd_items += aod_items
569
570 result.merge(addToESD(flags, esd_items))
571 result.merge(addToAOD(flags, aod_items))
572
573 # Leaving in for the moment, because we might still need this. Will remove once it's confirmed we don't
574 # if flags.Output.doWriteESD:
575 #
576 # if runOnESD:
577 # # Need to make it possible to write Object ... so rename read containers
578 # from AthenaCommon.Logging import log
579 # from SGComps.AddressRemappingConfig import AddressRemappingCfg
580 # rename_maps = list(map(lambda item:'%s->%s' % (item, 'old_'+item.split('#')[1]), esd_items))
581 # log.info('Since we are running on ESD, rename inputs as follows:'+str(rename_maps))
582 # cfg.merge( AddressRemappingCfg(rename_maps) )
583
584 return result
585
586
588 from MuonConfig.MuonGeometryConfig import MuonIdHelperSvcCfg
589
590 # Many components need these services, so setup once here.
591 result = MuonIdHelperSvcCfg(flags)
592
593 from CaloRec.CaloTopoClusterConfig import CaloTopoClusterCfg
594 result.merge(CaloTopoClusterCfg(flags))
595 from TrackToCalo.CaloExtensionBuilderAlgCfg import CaloExtensionBuilderCfg
596 result.merge(CaloExtensionBuilderCfg(flags))
597
598 from TrackingGeometryCondAlg.AtlasTrackingGeometryCondAlgConfig import TrackingGeometryCondAlgCfg
599 result.merge(TrackingGeometryCondAlgCfg(flags))
600 from MuonConfig.MuonRecToolsConfig import MuonEDMHelperSvcCfg
601 result.merge(MuonEDMHelperSvcCfg(flags))
602
603 # Set up to read Tracks.
604 from TrkConfig.TrackCollectionReadConfig import TrackCollectionReadCfg
605 result.merge(TrackCollectionReadCfg(flags, 'Tracks'))
606
607 # We do not need to schedule the Inner detector selector algs if none
608 # of the combined algs executed
609 if flags.MuonCombined.doMuGirl or \
610 flags.MuonCombined.doStatisticalCombination or \
611 flags.MuonCombined.doCaloTrkMuId or \
612 flags.MuonCombined.doCombinedFit or \
613 flags.MuonCombined.doMuonSegmentTagger:
614
615 result.merge(MuonCombinedInDetCandidateAlgCfg(flags))
616 if flags.Tracking.doLargeD0:
617 result.merge(LRT_MuonCombinedInDetCandidateAlgCfg(flags))
618
619 result.merge(MuonCombinedMuonCandidateAlgCfg(flags))
620
621 if flags.MuonCombined.doStatisticalCombination or flags.MuonCombined.doCombinedFit:
622 result.merge(MuonCombinedAlgCfg(flags))
623 if flags.Tracking.doLargeD0:
624 result.merge(LRT_MuonCombinedAlgCfg(flags))
625
626 # Perform system extensions on ID tracks where MuidCo did not succeed
627 if flags.MuonCombined.doCombinedFit:
628 result.merge(MuonInDetToMuonSystemExtensionAlgCfg(flags))
629 if flags.Tracking.doLargeD0:
631 if flags.MuonCombined.doMuGirl:
632 # Use only ID tracks rejected by MuidCo
633 result.merge(MuonInsideOutRecoAlgCfg(flags, name="MuonInsideOutRecoAlg",
634 InDetCandidateLocation="InDetCandidates"
635 if not flags.MuonCombined.doCombinedFit else "InDetCandidatesSystemExtened"))
636 if flags.MuonCombined.doMuGirlLowBeta:
637 if flags.Tracking.doLargeD0:
638 result.merge(MuonInDetExtensionMergerAlgCfg(flags))
639 # Use the InDetCandidateStaus as InDetCandidates as they've also the extensions
640 # from the MuidCo tracks
641 result.merge(MuGirlStauAlgCfg(flags))
642 if flags.Tracking.doLargeD0:
643 result.merge(LRT_MuGirlAlgCfg(flags))
644
645 if flags.MuonCombined.doCaloTrkMuId:
646 result.merge(MuonCaloTagAlgCfg(flags))
647 if flags.Tracking.doLargeD0:
648 result.merge(LRT_MuonCaloTagAlgCfg(flags))
649
650 if flags.MuonCombined.doMuonSegmentTagger:
651 result.merge(MuonSegmentTagAlgCfg(flags))
652 if flags.Tracking.doLargeD0:
653 result.merge(LRT_MuonSegmentTagAlgCfg(flags))
654
655 result.merge(MuonSegContainerMergerAlgCfg(flags))
656 from MuonConfig.MuonSegmentFindingConfig import MuonSegmentCnvAlgCfg
657 result.merge(MuonSegmentCnvAlgCfg(flags, "MuonSegmentCnvAlg",
658 SegmentContainerName="TrkMuonSegments",
659 xAODContainerName="MuonSegments"))
660 if flags.MuonCombined.writeUnAssocSegments:
661 result.merge(MuonSegmentCnvAlgCfg(flags, "UnAssocMuonSegmentCnvAlg",
662 SegmentContainerName="UnAssocMuonTrkSegments",
663 xAODContainerName="UnAssocMuonSegments"))
664 if flags.MuonCombined.doMuGirlLowBeta:
665 result.merge(MuonSegmentCnvAlgCfg(flags, "MuonStauSegmentCnvAlg",
666 SegmentContainerName="TrkStauSegments",
667 xAODContainerName="StauSegments"))
668 # runs over outputs and create xAODMuon collection
669 result.merge(MuonCreatorAlgCfg(flags))
670 if flags.Tracking.doLargeD0:
671 result.merge(LRT_MuonCreatorAlgCfg(flags))
672
673 if flags.MuonCombined.doMuGirlLowBeta:
674 # Has to be at end if not using sequencer. If we drop this requirement, can be moved above
675 result.merge(StauCreatorAlgCfg(flags))
676
677 # FIXME
678 # I see errors related to unconfigured public tools. This is a quick fix, but should really move to where it is called.
679 from MuonConfig.MuonRecToolsConfig import MuonTrackScoringToolCfg
680 result.addPublicTool(result.popToolsAndMerge(
681 MuonTrackScoringToolCfg(flags)))
682 from TrkConfig.TrkTrackSummaryToolConfig import MuonCombinedTrackSummaryToolCfg
683 result.addPublicTool(result.popToolsAndMerge(
684 MuonCombinedTrackSummaryToolCfg(flags)))
685
686 # post processing
687 from AthenaConfiguration.Enums import Format
688 if flags.Input.isMC and flags.Input.Format != Format.BS:
689 result.merge(CombinedMuonTrackTruthAlgsCfg(flags))
690 result.merge(CombinedMuonTruthAssociationAlgsCfg(flags))
691 if not flags.Muon.usePhaseIIGeoSetup and \
692 "MuonSegments" not in flags.Input.Collections:
693 # Segment truth association decorations, but only if they are not already there (e.g. when running on ESDs)
694 from MuonConfig.MuonTruthAlgsConfig import MuonSegmentTruthAssociationAlgCfg
695 result.merge(MuonSegmentTruthAssociationAlgCfg(flags))
696
697 result.addEventAlgo(CompFactory.ClusterMatching.CaloClusterMatchLinkAlg(
698 "MuonTCLinks", ClustersToDecorate="MuonClusterCollection"))
699 result.merge(MuonDecorationAlgsCfg(flags))
700 # Setup output
701 result.merge(CombinedMuonOutputCfg(flags))
702
703 return result
704
705
706if __name__ == "__main__":
707 # To run this, do e.g.
708 # python -m MuonCombinedConfig.MuonCombinedReconstructionConfig --run --threads=1
709
710 from MuonConfig.MuonConfigUtils import SetupMuonStandaloneCA
711 from AthenaConfiguration.AllConfigFlags import initConfigFlags
712 flags = initConfigFlags()
713 flags.Input.Files = [
714 '/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/MuonCombinedConfig/myESD_q454_unslimmedTracks.pool.root']
715 from MuonConfig.MuonConfigUtils import configureCondTag
716 configureCondTag(flags)
717
718 # This fails due to "Hough data per sector vector not found"
719 flags.MuonCombined.doMuGirlLowBeta = False
720
721
722 flags.fillFromArgs()
723
724 flags.lock()
725 flags.dump()
726
727 cfg = SetupMuonStandaloneCA(flags)
728
729 from MuonConfig.MuonPrepDataConvConfig import MuonPrepDataConvCfg
730 cfg.merge(MuonPrepDataConvCfg(flags))
731
732 # "Fixes" to get this working standalone i.e. from ESD
733 # Configure topocluster algorithms, and associated conditions
734 cfg.merge(MuonCombinedReconstructionCfg(flags))
735
736 # This causes a stall due to missing HoughDataPerSectorVec
737 cfg.getEventAlgo("MuonInDetToMuonSystemExtensionAlg").UseOnlyHitSectors = False
738 cfg.getEventAlgo("MuonInDetToMuonSystemExtensionAlg_LRT").UseOnlyHitSectors = False
739
740 # This causes a stall. See https://its.cern.ch/jira/browse/ATEAM-825
741 # Leaving here for the moment, for convenience investigating this bug.
742 # muonSegmentCnvTool = cfg.popToolsAndMerge( MuonSegmentConverterToolCfg(ConfigFlags, OutputLevel=0) )
743 # cfg.addEventAlgo(CompFactory.xAODMaker.MuonSegmentCnvAlg("MuonSegmentCnvAlg", MuonSegmentConverterTool=muonSegmentCnvTool))
744
745 # Keep this in, since it makes debugging easier to simply uncomment and change Algo/Service name,
746 # from AthenaCommon.Constants import VERBOSE
747 # tmp = cfg.getEventAlgo("MuonCombinedMuonCandidateAlg")
748 # tmp.OutputLevel=VERBOSE
749 # tmp = cfg.getService("StoreGateSvc")
750 # tmp.OutpuDumptLevel=True
751
752 # Need to make it possible to write Muons ... so rename read containers
753 from SGComps.AddressRemappingConfig import AddressRemappingCfg
754
755 rename_maps = ['%s#%s->%s' % ("xAOD::MuonContainer", "Muons", "old_Muons"),
756 '%s#%s->%s' % ("xAOD::MuonAuxContainer",
757 "MuonsAux.", "old_MuonsAux."),
758 '%s#%s->%s' % ("xAOD::MuonContainer",
759 "Muons.rpcHitIdentifier", "old_Muons.rpcHitIdentifier"),
760 '%s#%s->%s' % ("xAOD::TruthParticleContainer",
761 "MuonTruthParticles.recoMuonLink", "MuonTruthParticles.old_recoMuonLink")
762 ]
763 cfg.merge(AddressRemappingCfg(rename_maps))
764
765 from MuonConfig.MuonConfigUtils import executeTest
766 executeTest(cfg)
767
if(pathvar)
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:140
MuonCombinedMuonCandidateAlgCfg(flags, name="MuonCombinedMuonCandidateAlg", **kwargs)
MuonInDetExtensionMergerAlgCfg(flags, name="MuonInDetExtensionMergerAlg", **kwargs)
MuonSegmentTagAlgCfg(flags, name="MuonSegmentTagAlg", **kwargs)
MuonTrkIDMSScatterDecorAlgCfg(flags, name="MuonCombIDMSScatterDecorAlg", **kwargs)
LRT_MuGirlAlgCfg(flags, name="MuGirlAlg_LRT", **kwargs)
MuonCaloTagAlgCfg(flags, name="MuonCaloTagAlg", **kwargs)
LRT_MuonInDetToMuonSystemExtensionAlgCfg(flags, name="MuonInDetToMuonSystemExtensionAlg_LRT", **kwargs)
MuonPrecisionLayerDecorAlgCfg(flags, name="MuonPrecisionLayerDecorAlg", **kwargs)
LRT_MuonCaloTagAlgCfg(flags, name="MuonCaloTagAlg_LRT", **kwargs)
MuonInsideOutRecoAlgCfg(flags, name="MuonInsideOutRecoAlg", **kwargs)
StauCreatorAlgCfg(flags, name="StauCreatorAlg", **kwargs)
MuonSegContainerMergerAlgCfg(flags, name="MuonSegContainerMergerAlg", **kwargs)
MuonInDetToMuonSystemExtensionAlgCfg(flags, name="MuonInDetToMuonSystemExtensionAlg", **kwargs)
MuonCombinedInDetCandidateAlgCfg(flags, name="MuonCombinedInDetCandidateAlg", **kwargs)
MuGirlStauAlgCfg(flags, name="MuGirlStauAlg", **kwargs)
LRT_MuonSegmentTagAlgCfg(flags, name="MuonSegmentTagAlg_LRT", **kwargs)
MuonCombinedAlgCfg(flags, name="MuonCombinedAlg", **kwargs)
MuonTrkAEOTDecorAlgCfg(flags, name="MuonCombAEOTDecorAlg", **kwargs)
LRT_MuonCombinedInDetCandidateAlgCfg(flags, name="MuonCombinedInDetCandidateAlg_LRT", **kwargs)
LRT_MuonCreatorAlgCfg(flags, name="MuonCreatorAlg_LRT", **kwargs)
LRT_MuonCombinedAlgCfg(flags, name="MuonCombinedAlg_LRT", **kwargs)
MuonCreatorAlgCfg(flags, name="MuonCreatorAlg", **kwargs)