ATLAS Offline Software
Loading...
Searching...
No Matches
AtlasExtrapolatorConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
2
3# New configuration for ATLAS extrapolator
4# The extrapolator combines
5#
6# - The mathematical propagation of track
7# parameters to a destination surface via the configured propagators
8# RungeKuttaPropagator or STEP_propagator.
9# They both perform track parameters propagation through
10# the magnetic field. The STEP_propagator
11# additionally includes material effects.
12#
13# - The application of material effects:
14# 1) Either in certain points/surfaces via the
15# relevant MaterialEffectsUpdators, EnergyLoss and
16# MultipleScattering tools,
17# 2) or continuously via the STEP propagator.
18#
19# - The possible navigation procedure determining the starting
20# and destination volume for the extrapolation and provides
21# the boundary surfaces to be be intersected.
22#
23# We need/can configure :
24# The "Global" Propagagor property (usually Runge Kutta )
25# The "Global" Material effects updator property
26# The Navigator property
27# The STEP_Propagator property (for tracking workloads inside dense volumes)
28#
29# Aditionally and for consistency/clarity we might want to have
30# specific settings for each subdetector volume :
31# - ITK/ID,
32# - Calo,
33# - Muon Spectrometer,
34# - BeamPipe,
35# - Cavern
36# Otherwise the global propagator is used.
37#
38#
39# The extrapolator provides many method and one instance can be used
40# in various contexts.
41# Broadly we have 2 cases.
42# - Inner detector and e/gamma rely on RungeKuttaPropagator.
43# They use Material effects updator(s) with no energy loss.
44# As an example e/gamma for extrapolation to calo uses extrapolateDirectly,
45# so not navigation or material effects.
46#
47# - Muons (and PFlow) do full tracking (intersections) inside the calo.
48# They rely on the STEP_Propagator (the intersections code always use it).
49# And Muons prefer to use STEP globally.
50
51
52from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
53from AthenaConfiguration.AccumulatorCache import AccumulatorCache
54from AthenaConfiguration.ComponentFactory import CompFactory
55import TrkConfig.AtlasExtrapolatorToolsConfig as TC
56from TrkConfig.TrkExSTEP_PropagatorConfig import AtlasSTEP_PropagatorCfg
57
58# For debugging comparisons with old-style config
59use_old_names = False
60
61
62@AccumulatorCache
63def AtlasExtrapolatorCfg(flags, name='AtlasExtrapolator'):
64 # Default "ATLAS" with some reasonable defaults
65 # Rk for Global/ID STEP to be used for dense volumes.
66 from TrkConfig.AtlasExtrapolatorToolsConfig import (
67 AtlasMultipleScatteringUpdatorCfg)
68
69 result = ComponentAccumulator()
70
71 # propagator defaults
72 from TrkConfig.TrkExRungeKuttaPropagatorConfig import (
73 RungeKuttaPropagatorCfg)
74 AtlasRungeKuttaPropagator = result.popToolsAndMerge(
75 RungeKuttaPropagatorCfg(flags))
76 AtlasSTEP_Propagator = result.popToolsAndMerge(
77 AtlasSTEP_PropagatorCfg(flags))
78 ITkPropagator = None
79 if flags.Detector.GeometryITk:
80 from TrkConfig.TrkExRungeKuttaPropagatorConfig import ITkPropagatorCfg
81 ITkPropagator = result.popToolsAndMerge(
82 ITkPropagatorCfg(flags))
83
84 AtlasPropagators = []
85 AtlasPropagators += [AtlasRungeKuttaPropagator]
86 AtlasPropagators += [AtlasSTEP_Propagator]
87 if flags.Detector.GeometryITk:
88 AtlasPropagators += [ITkPropagator]
89
90 # updator defaults
91 AtlasMaterialEffectsUpdator = result.popToolsAndMerge(
92 TC.AtlasMaterialEffectsUpdatorCfg(flags))
93 AtlasMaterialEffectsUpdatorLandau = result.popToolsAndMerge(
94 TC.AtlasMaterialEffectsUpdatorLandauCfg(flags))
95 ITkMaterialEffectsUpdator = None
96 if flags.Detector.GeometryITk:
97 ITkMaterialEffectsUpdator = result.popToolsAndMerge(
98 TC.ITkMaterialEffectsUpdatorCfg(flags))
99
100 AtlasUpdators = []
101 AtlasUpdators += [AtlasMaterialEffectsUpdator]
102 AtlasUpdators += [AtlasMaterialEffectsUpdatorLandau]
103 if flags.Detector.GeometryITk:
104 AtlasUpdators += [ITkMaterialEffectsUpdator]
105
106 AtlasNavigator = result.popToolsAndMerge(TC.AtlasNavigatorCfg(flags))
107
108 # configure propagators/updators according to geometry signature
109 AtlasSubPropagators = []
110 AtlasSubPropagators += [AtlasRungeKuttaPropagator.name] # Global
111 if flags.Detector.GeometryITk:
112 AtlasSubPropagators += [ITkPropagator.name] # ITk
113 else:
114 AtlasSubPropagators += [AtlasRungeKuttaPropagator.name] # ID
115 AtlasSubPropagators += [AtlasSTEP_Propagator.name] # BeamPipe
116 AtlasSubPropagators += [AtlasSTEP_Propagator.name] # Calo
117 AtlasSubPropagators += [AtlasSTEP_Propagator.name] # MS
118 AtlasSubPropagators += [AtlasRungeKuttaPropagator.name] # Cavern
119
120 AtlasSubUpdators = []
121 AtlasSubUpdators += [AtlasMaterialEffectsUpdator.name] # Global
122 if flags.Detector.GeometryITk:
123 AtlasSubUpdators += [ITkMaterialEffectsUpdator.name] # ITk
124 else:
125 AtlasSubUpdators += [AtlasMaterialEffectsUpdator.name] # ID
126 AtlasSubUpdators += [AtlasMaterialEffectsUpdator.name] # BeamPipe
127 AtlasSubUpdators += [AtlasMaterialEffectsUpdator.name] # Calo
128 AtlasSubUpdators += [AtlasMaterialEffectsUpdator.name] # MS
129 AtlasSubUpdators += [AtlasMaterialEffectsUpdator.name] # Cavern
130
131 AtlasELossUpdater = result.popToolsAndMerge(
132 TC.AtlasEnergyLossUpdatorCfg(flags))
133 AtlasEnergyLossUpdater = AtlasELossUpdater
134
135 # call the base class constructor
136 Extrapolator = CompFactory.Trk.Extrapolator(
137 name,
138 Navigator=AtlasNavigator,
139 MaterialEffectsUpdators=AtlasUpdators,
140 MultipleScatteringUpdater=result.popToolsAndMerge(
141 AtlasMultipleScatteringUpdatorCfg(flags, UseTrkUtils=True)),
142 STEP_Propagator=AtlasSTEP_Propagator,
143 Propagators=AtlasPropagators,
144 SubPropagators=AtlasSubPropagators,
145 SubMEUpdators=AtlasSubUpdators,
146 EnergyLossUpdater=AtlasEnergyLossUpdater
147 )
148
149 result.setPrivateTools(Extrapolator)
150 return result
151
152
153@AccumulatorCache
154def TrigPFlowExtrapolatorCfg(flags, name='HLT_PFlowExtrapolator'):
155 # This is the extrapolator which is used in PFlow
156 # reconstruction at the level of HLT. It allows to
157 # setup the tolerance which influences speed (but also
158 # precision) of the extrapolation.
159 result = ComponentAccumulator()
160
161 PFlowExtrapolator = result.popToolsAndMerge(
162 AtlasExtrapolatorCfg(flags, name))
163
164 from TrkConfig.TrkExRungeKuttaPropagatorConfig import (
165 RungeKuttaPropagatorCfg)
166 RungeKuttaPropagator = result.popToolsAndMerge(
167 RungeKuttaPropagatorCfg(flags))
168 from TrkConfig.TrkExSTEP_PropagatorConfig import (
169 AtlasSTEP_PropagatorCfg)
170 pflowSTEP_Propagator = result.popToolsAndMerge(
171 AtlasSTEP_PropagatorCfg(flags,Tolerance=flags.Trigger.Jet.PFlowTolerance))
172
173 pflowPropagators = []
174 pflowPropagators += [RungeKuttaPropagator]
175 pflowPropagators += [pflowSTEP_Propagator]
176
177 pflowSubPropagators = []
178 pflowSubPropagators += [RungeKuttaPropagator.name] # for Global
179 pflowSubPropagators += [RungeKuttaPropagator.name] # for ID
180 pflowSubPropagators += [pflowSTEP_Propagator.name] # for BeamPipe
181 pflowSubPropagators += [pflowSTEP_Propagator.name] # for Calo
182 pflowSubPropagators += [pflowSTEP_Propagator.name] # for MS
183 pflowSubPropagators += [RungeKuttaPropagator.name] # for cavern
184
185 PFlowExtrapolator.Propagators = pflowPropagators
186 PFlowExtrapolator.SubPropagators = pflowSubPropagators
187 PFlowExtrapolator.STEP_Propagator = pflowSTEP_Propagator
188
189 result.setPrivateTools(PFlowExtrapolator)
190 return result
191
192
193@AccumulatorCache
194def egammaCaloExtrapolatorCfg(flags, name='egammaCaloExtrapolator'):
195 # e/gamma mainly uses Extrapolate Directly to a particular
196 # surface to the calo. We do not do "tracking"
197 # as electrons/photon have showered.
198 # The means that in practice only the Global
199 # propagator is used with not material effects.
200 # Configure everything in any case for clarity/consistency.
201 result = ComponentAccumulator()
202 egammaExtrapolator = result.popToolsAndMerge(
203 AtlasExtrapolatorCfg(flags, name))
204
205 egammaPropagators = []
206 egammaUpdators = []
207
208 from TrkConfig.TrkExRungeKuttaPropagatorConfig import (
209 RungeKuttaPropagatorCfg)
210 RungeKuttaPropagator = result.popToolsAndMerge(
211 RungeKuttaPropagatorCfg(flags))
212 MaterialEffectsUpdator = result.popToolsAndMerge(
213 TC.AtlasMaterialEffectsUpdatorCfg(flags))
214
215 egammaPropagators += [RungeKuttaPropagator]
216 egammaUpdators += [MaterialEffectsUpdator]
217
218 from TrkConfig.TrkExSTEP_PropagatorConfig import (
219 AtlasNoMatSTEP_PropagatorCfg)
220 NoMatSTEP_Propagator = result.popToolsAndMerge(
221 AtlasNoMatSTEP_PropagatorCfg(flags))
222 NoElossMaterialEffectsUpdator = result.popToolsAndMerge(
223 TC.AtlasNoElossMaterialEffectsUpdatorCfg(flags))
224
225 egammaPropagators += [NoMatSTEP_Propagator]
226 egammaUpdators += [NoElossMaterialEffectsUpdator]
227
228 if flags.Detector.GeometryITk:
229 from TrkConfig.TrkExRungeKuttaPropagatorConfig import ITkPropagatorCfg
230 ITkPropagator = result.popToolsAndMerge(
231 ITkPropagatorCfg(flags))
232 ITkMaterialEffectsUpdator = result.popToolsAndMerge(
233 TC.ITkMaterialEffectsUpdatorCfg(flags))
234
235 egammaPropagators += [ITkPropagator]
236 egammaUpdators += [ITkMaterialEffectsUpdator]
237
238 # configure propagators/updators according to geometry signature
239 egammaSubPropagators = []
240 egammaSubUpdators = []
241 # Global
242 egammaSubPropagators += [RungeKuttaPropagator.name]
243 egammaSubUpdators += [MaterialEffectsUpdator.name]
244 # ID/ITK
245 if flags.Detector.GeometryITk:
246 egammaSubPropagators += [ITkPropagator.name]
247 egammaSubUpdators += [ITkMaterialEffectsUpdator.name]
248 else:
249 egammaSubPropagators += [RungeKuttaPropagator.name]
250 egammaSubUpdators += [MaterialEffectsUpdator.name]
251 # BeamPipe
252 egammaSubPropagators += [RungeKuttaPropagator.name]
253 egammaSubUpdators += [MaterialEffectsUpdator.name]
254 # Calo
255 egammaSubPropagators += [RungeKuttaPropagator.name]
256 egammaSubUpdators += [NoElossMaterialEffectsUpdator.name]
257 # MS
258 egammaSubPropagators += [NoMatSTEP_Propagator.name]
259 egammaSubUpdators += [NoElossMaterialEffectsUpdator.name]
260 # Cavern
261 egammaSubPropagators += [RungeKuttaPropagator.name]
262 egammaSubUpdators += [MaterialEffectsUpdator.name]
263
264 egammaExtrapolator.MaterialEffectsUpdators = egammaUpdators
265 egammaExtrapolator.SubMEUpdators = egammaSubUpdators
266 egammaExtrapolator.Propagators = egammaPropagators
267 egammaExtrapolator.SubPropagators = egammaSubPropagators
268 # egamma STEP with no eloss for calo intersections
269 egammaExtrapolator.STEP_Propagator = NoMatSTEP_Propagator
270 # No material effects at large
271 egammaExtrapolator.ApplyMaterialEffects = False
272
273 result.setPrivateTools(egammaExtrapolator)
274 return result
275
276
277@AccumulatorCache
279 name='MCTruthClassifierExtrapolator'):
280 # MCTruthClassifier. Used to Extrapolate Directly
281 # photons (fwd Electrons) to a specific surface to the calo
282 # for truth matching.
283 # We do not do "tracking" as electrons/photon have showered.
284 # This means that in practice only the 'Global'
285 # propagator and no material effects.
286 # Configure everything in any case for clarity/consistency.
287 result = ComponentAccumulator()
288
289 MCTruthExtrapolator = result.popToolsAndMerge(
290 AtlasExtrapolatorCfg(flags, name))
291
292 MCTruthUpdators = []
293
294 NoElossMaterialEffectsUpdator = result.popToolsAndMerge(
295 TC.AtlasNoElossMaterialEffectsUpdatorCfg(flags))
296 MCTruthUpdators += [NoElossMaterialEffectsUpdator]
297
298 MCTruthSubUpdators = []
299
300 # configure propagators/updators according to geometry signature
301 MCTruthSubUpdators += [NoElossMaterialEffectsUpdator.name] # Global
302 MCTruthSubUpdators += [NoElossMaterialEffectsUpdator.name] # ID
303 MCTruthSubUpdators += [NoElossMaterialEffectsUpdator.name] # beampipe
304 MCTruthSubUpdators += [NoElossMaterialEffectsUpdator.name] # calo
305 MCTruthSubUpdators += [NoElossMaterialEffectsUpdator.name] # MS
306 MCTruthSubUpdators += [NoElossMaterialEffectsUpdator.name] # cavern
307
308 MCTruthExtrapolator.MaterialEffectsUpdators = MCTruthUpdators
309 MCTruthExtrapolator.SubMEUpdators = MCTruthSubUpdators
310 # No material effects at large
311 MCTruthExtrapolator.ApplyMaterialEffects = False
312
313 result.setPrivateTools(MCTruthExtrapolator)
314 return result
315
316
317@AccumulatorCache
318def InDetExtrapolatorCfg(flags, name='InDetExtrapolator', **kwargs):
319 # Inner detector config cares mainly for the "Global".
320 # This is usually the RungeKutta Propagator and a material
321 # effects updator without energy loss.
322 # As extrapolations are to happen inside the InDet volume.
323 result = ComponentAccumulator()
324
325 # FIXME copied from the old config, also needs fixing on the c++ side.
326 if 'Propagators' not in kwargs:
327 from TrkConfig.TrkExRungeKuttaPropagatorConfig import (
328 InDetPropagatorCfg)
329 InDetPropagator = result.popToolsAndMerge(
330 InDetPropagatorCfg(flags))
331 Propagators = [InDetPropagator]
332 kwargs.setdefault("Propagators", Propagators)
333
334 propagator = kwargs.get('Propagators')[0].name if (
335 kwargs.get('Propagators', None) is not None
336 and len(kwargs.get('Propagators', None)) > 0) else None
337
338 if 'MaterialEffectsUpdators' not in kwargs:
339 InDetMaterialEffectsUpdator = result.getPrimaryAndMerge(
340 TC.InDetMaterialEffectsUpdatorCfg(flags))
341 MaterialEffectsUpdators = [InDetMaterialEffectsUpdator]
342 kwargs.setdefault("MaterialEffectsUpdators", MaterialEffectsUpdators)
343 material_updator = kwargs.get('MaterialEffectsUpdators')[0].name if (
344 kwargs.get('MaterialEffectsUpdators', None) is not None
345 and len(kwargs.get('MaterialEffectsUpdators', None)) > 0) else None
346
347 if 'Navigator' not in kwargs:
348 AtlasNavigator = result.popToolsAndMerge(
349 TC.AtlasNavigatorCfg(flags, name="InDetNavigator"))
350 kwargs.setdefault("Navigator", AtlasNavigator)
351
352 sub_propagators = []
353 sub_updators = []
354
355 # configure propagators/updators according to geometry signature
356 # Global entry
357 sub_propagators += [propagator]
358 sub_updators += [material_updator]
359
360 # ID entry
361 sub_propagators += [propagator]
362 sub_updators += [material_updator]
363
364 # beampipe entry
365 sub_updators += [material_updator]
366
367 kwargs.setdefault("SubPropagators", sub_propagators)
368 kwargs.setdefault("SubMEUpdators", sub_updators)
369
370 AtlasELossUpdater = result.popToolsAndMerge(
371 TC.AtlasEnergyLossUpdatorCfg(flags))
372 kwargs.setdefault("EnergyLossUpdater", AtlasELossUpdater)
373
374 extrapolator = CompFactory.Trk.Extrapolator(name, **kwargs)
375 result.setPrivateTools(extrapolator)
376 return result
377
378
379def MuonExtrapolatorCfg(flags, name="MuonExtrapolator", **kwargs):
380 from TrkConfig.AtlasExtrapolatorToolsConfig import (
381 AtlasMultipleScatteringUpdatorCfg)
382
383 # Muons set the STEP also as the single "Global" propagator
384 result = ComponentAccumulator()
385
386 AtlasMaterialEffectsUpdator = result.popToolsAndMerge(
387 TC.AtlasMaterialEffectsUpdatorCfg(flags,
388 name="MuonMaterialEffectsUpdator"))
389 kwargs.setdefault("MaterialEffectsUpdators", [AtlasMaterialEffectsUpdator])
390
391 kwargs.setdefault("MultipleScatteringUpdater",
392 result.popToolsAndMerge(
393 AtlasMultipleScatteringUpdatorCfg(flags,
394 UseTrkUtils=True)))
395
396 AtlasNavigator = result.popToolsAndMerge(TC.AtlasNavigatorCfg(
397 flags, name='InDetNavigator' if use_old_names else None))
398 kwargs.setdefault("Navigator", AtlasNavigator)
399
400 AtlasELossUpdater = result.popToolsAndMerge(
401 TC.AtlasEnergyLossUpdatorCfg(flags))
402 kwargs.setdefault("EnergyLossUpdater", AtlasELossUpdater)
403
404 if 'STEP_Propagator' not in kwargs:
405 AtlasSTEP_Propagator = result.popToolsAndMerge(
406 AtlasSTEP_PropagatorCfg(flags))
407 kwargs.setdefault("STEP_Propagator", AtlasSTEP_Propagator)
408
409 if 'Propagators' not in kwargs:
410 if use_old_names:
411 kwargs.setdefault("Propagators", [result.popToolsAndMerge(
412 AtlasSTEP_PropagatorCfg(flags, name="MuonPropagator"))])
413 else:
414 kwargs.setdefault("Propagators", [kwargs["STEP_Propagator"]])
415
416 kwargs.setdefault("ResolveMuonStation", True)
417 # must be > 1um to avoid missing MTG intersections
418 kwargs.setdefault("Tolerance", 0.0011)
419
420 extrap = CompFactory.Trk.Extrapolator(name, **kwargs)
421 result.setPrivateTools(extrap)
422 return result
423
424
426 name="MuonStraightLineExtrapolator",
427 **kwargs):
428 # Muon set the STEP also as the single "Global" propagator
429 result = ComponentAccumulator()
430
431 muon_prop = None
432 if use_old_names:
433 muon_prop = result.popToolsAndMerge(
434 AtlasSTEP_PropagatorCfg(flags, name='MuonStraightLinePropagator'))
435 else:
436 muon_prop = result.popToolsAndMerge(AtlasSTEP_PropagatorCfg(flags))
437 kwargs.setdefault("Propagators", [muon_prop])
438 kwargs.setdefault("STEP_Propagator", muon_prop)
439 extrap = result.popToolsAndMerge(
440 MuonExtrapolatorCfg(flags, name, **kwargs))
441 result.setPrivateTools(extrap)
442 result.addPublicTool(extrap)
443 # This should be done by the client with the public tool,
444 # but since it's hard to track down
445 # (and since Extrapolators are a specicial case),
446 # just be pragmatic for now.
447 return result
448
449
450def MCTBExtrapolatorCfg(flags, name='MCTBExtrapolator', **kwargs):
451 # Muon set the STEP also as the single "Global" propagator
452 result = ComponentAccumulator()
453 if use_old_names:
454 kwargs.setdefault("Propagators", [result.popToolsAndMerge(
455 AtlasSTEP_PropagatorCfg(flags, name='MCTBPropagator'))])
456 kwargs.setdefault("STEP_Propagator",
457 result.popToolsAndMerge(AtlasSTEP_PropagatorCfg(flags)))
458 else:
459 prop = result.popToolsAndMerge(
460 AtlasSTEP_PropagatorCfg(flags))
461 kwargs.setdefault("Propagators", [prop])
462 kwargs.setdefault("STEP_Propagator", prop)
463 kwargs.setdefault("ResolveMuonStation", False)
464 kwargs.setdefault("Navigator", result.popToolsAndMerge(
465 TC.AtlasNavigatorCfg(flags, name="InDetNavigator")))
466 kwargs.setdefault("EnergyLossUpdater", result.popToolsAndMerge(
467 TC.AtlasEnergyLossUpdatorCfg(flags)))
468
469 result.setPrivateTools(result.popToolsAndMerge(
470 MuonExtrapolatorCfg(flags, name, **kwargs)))
471 return result
472
473
474if __name__ == "__main__":
475
476 from AthenaConfiguration.AllConfigFlags import initConfigFlags
477 flags = initConfigFlags()
478
479 from AthenaConfiguration.ComponentAccumulator import printProperties
480 from AthenaConfiguration.TestDefaults import defaultTestFiles
481 from AthenaCommon.Logging import logging
482
483 flags.Input.Files = defaultTestFiles.RDO_RUN2
484 flags.fillFromArgs()
485 flags.lock()
486 flags.dump()
487
488 cfg = ComponentAccumulator()
489 mlog = logging.getLogger("AtlasExtrapolatorConfigTest")
490 mlog.info("Configuring AtlasExtrapolator : ")
491 printProperties(mlog, cfg.popToolsAndMerge(
492 AtlasExtrapolatorCfg(flags)),
493 nestLevel=1,
494 printDefaults=True)
495 mlog.info("Configuring egammaCaloExtrapolator : ")
496 printProperties(mlog, cfg.popToolsAndMerge(
498 nestLevel=1,
499 printDefaults=True)
500 mlog.info("Configuring MCTruthClassifierExtrapolator : ")
501 printProperties(mlog, cfg.popToolsAndMerge(
503 nestLevel=1,
504 printDefaults=True)
505
506 f = open("atlasextrapolator.pkl", "wb")
507 cfg.store(f)
508 f.close()
MuonStraightLineExtrapolatorCfg(flags, name="MuonStraightLineExtrapolator", **kwargs)
MuonExtrapolatorCfg(flags, name="MuonExtrapolator", **kwargs)
AtlasExtrapolatorCfg(flags, name='AtlasExtrapolator')
InDetExtrapolatorCfg(flags, name='InDetExtrapolator', **kwargs)
TrigPFlowExtrapolatorCfg(flags, name='HLT_PFlowExtrapolator')
MCTruthClassifierExtrapolatorCfg(flags, name='MCTruthClassifierExtrapolator')
egammaCaloExtrapolatorCfg(flags, name='egammaCaloExtrapolator')
MCTBExtrapolatorCfg(flags, name='MCTBExtrapolator', **kwargs)