ATLAS Offline Software
Loading...
Searching...
No Matches
G4AtlasUserActionConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2
3from AthenaCommon.SystemOfUnits import MeV
4from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
5from AthenaConfiguration.ComponentFactory import CompFactory
6from AthenaConfiguration.Enums import BeamType, LHCPeriod
7from CaloG4Sim.CaloG4SimConfig import CalibrationDefaultProcessingToolCfg
8from SimulationConfig.SimEnums import CalibrationRun, CavernBackground, SimulationFlavour
9from G4CosmicFilter.G4CosmicFilterConfig import CosmicFilterToolCfg, StoppedParticleFilterToolCfg
10from G4UserActions.G4UserActionsConfig import (
11 AthenaStackingActionToolCfg, AthenaTrackingActionToolCfg,
12 G4SimTimerToolCfg, G4TrackCounterToolCfg, HitWrapperToolCfg,
13 LooperKillerToolCfg, StoppedParticleActionToolCfg
14)
15from G4RunManagement.G4RunManagementUAConfig import SyncPrimaryGeneratorActionToolCfg, SyncRunActionToolCfg, SyncEventActionToolCfg
16from ISF_Geant4CommonTools.ISF_Geant4CommonToolsConfig import EntryLayerToolCfg, EntryLayerToolMTCfg
17from ISF_Services.ISF_ServicesCoreConfig import ATLFAST_GeoIDSvcCfg, GeoIDSvcCfg
18from ISF_Services.ISF_ServicesConfig import (
19 ATLFAST_ParticleBrokerSvcCfg, ParticleBrokerSvcCfg, TruthServiceCfg
20)
21from MCTruthBase.MCTruthBaseConfig import MCTruthSteppingActionToolCfg
22
23
25 """ flags.Sim.OptionalUserActionList = ['G4UserActions.G4UserActionsConfig.FixG4CreatorProcessToolCfg']"""
26 result = ComponentAccumulator()
27 optionalUserActions = []
28 for userActionString in flags.Sim.OptionalUserActionList:
29 optionalUserActions += [result.popToolsAndMerge(getOptionalUACfg(flags, userActionString))]
30 result.setPrivateTools(optionalUserActions)
31 return result
32
33
34def getOptionalUACfg(flags, userActionString):
35 """Execute a function to configure and optional UserAction"""
36 parts = userActionString.split('.')
37 if len(parts) < 2:
38 raise ValueError('OptionalUserAction strings should be of the form Package.Module.Function or Package.Function if defined in __init__.py')
39 function = parts[-1]
40 module = '.'.join(parts[:-1])
41 from importlib import import_module
42 loaded_module = import_module(module)
43 function_def = getattr(loaded_module, function)
44 return function_def(flags)
45
46
47# Pulled in from ISF G4 to avoid circular dependence
48def FullG4TrackProcessorUserActionToolCfg(flags, name="FullG4TrackProcessorUserActionTool", **kwargs):
49 result = ComponentAccumulator()
50 if flags.Sim.ISF.Simulator in [SimulationFlavour.FullG4MT, SimulationFlavour.FullG4MT_QS]:
51 tool = result.popToolsAndMerge(EntryLayerToolMTCfg(flags))
52 else:
53 tool = result.popToolsAndMerge(EntryLayerToolCfg(flags))
54 kwargs.setdefault("EntryLayerTool", result.addPublicTool(tool))
55 kwargs.setdefault("GeoIDSvc", result.getPrimaryAndMerge(GeoIDSvcCfg(flags)))
56 if flags.Detector.GeometryCavern:
57 kwargs.setdefault("TruthVolumeLevel", 2)
58 kwargs.setdefault("IsITkGeometry", flags.GeoModel.Run >= LHCPeriod.Run4)
59 result.setPrivateTools(CompFactory.G4UA.iGeant4.TrackProcessorUserActionFullG4Tool(name, **kwargs))
60 return result
61
62
63def PhysicsValidationUserActionToolCfg(flags, name="ISFG4PhysicsValidationUserActionTool", **kwargs):
64 result = ComponentAccumulator()
65 result.setPrivateTools(CompFactory.G4UA.iGeant4.PhysicsValidationUserActionTool(name, **kwargs))
66 return result
67
68
69def MCTruthUserActionToolCfg(flags, name="ISFMCTruthUserActionTool", **kwargs):
70 result = ComponentAccumulator()
71 kwargs.setdefault("TruthRecordSvc", result.getPrimaryAndMerge(TruthServiceCfg(flags)))
72 result.setPrivateTools(CompFactory.G4UA.iGeant4.MCTruthUserActionTool(name, **kwargs))
73 return result
74
75
76def TrackProcessorUserActionToolCfg(flags, name="ISFG4TrackProcessorUserActionTool", **kwargs):
77 result = ComponentAccumulator()
78 if "ParticleBroker" not in kwargs:
79 kwargs.setdefault("ParticleBroker", result.getPrimaryAndMerge(ParticleBrokerSvcCfg(flags)))
80 kwargs.setdefault("GeoIDSvc", result.getPrimaryAndMerge(GeoIDSvcCfg(flags)))
81 result.setPrivateTools(CompFactory.G4UA.iGeant4.TrackProcessorUserActionPassBackTool(name, **kwargs))
82 return result
83
84
85def PassBackG4TrackProcessorUserActionToolCfg(flags, name="PassBackG4TrackProcessorUserActionTool", **kwargs):
86 if flags.Sim.ISF.Simulator in [SimulationFlavour.PassBackG4MT]:
87 kwargs.setdefault("ParticleBroker", "")
88 return TrackProcessorUserActionToolCfg(flags, name, **kwargs)
89
90
91def ATLFAST_G4TrackProcessorUserActionToolCfg(flags, name="ATLFAST_G4TrackProcessorUserActionTool", **kwargs):
92 result = ComponentAccumulator()
93 if flags.Sim.ISF.Simulator in [SimulationFlavour.PassBackG4MT, SimulationFlavour.ATLFASTIIMT, SimulationFlavour.ATLFAST3MT, SimulationFlavour.ATLFAST3MT_QS]:
94 kwargs.setdefault("ParticleBroker", "")
95 elif flags.Sim.ISF.Simulator in [SimulationFlavour.ATLFASTIIF_G4MS, SimulationFlavour.ATLFAST3F_G4MS]:
96 kwargs.setdefault("ParticleBroker", result.getPrimaryAndMerge(ATLFAST_ParticleBrokerSvcCfg(flags)))
97 kwargs.setdefault("GeoIDSvc", result.getPrimaryAndMerge(ATLFAST_GeoIDSvcCfg(flags)))
98 kwargs.setdefault("PassBackEkinThreshold", 0.05*MeV)
99 kwargs.setdefault("KillBoundaryParticlesBelowThreshold", True)
100 tool = result.popToolsAndMerge(PassBackG4TrackProcessorUserActionToolCfg(flags, name, **kwargs))
101 result.setPrivateTools(tool)
102 return result
103
104
105# New function for all user action types
107 result = ComponentAccumulator()
108
109 actions = []
110
111 # Sync actions should be added first
112 # TODO: have dedicated array/handle for sync actions instead of relying on order
113 if flags.Sim.UseG4Workers:
114 actions += [result.popToolsAndMerge(SyncPrimaryGeneratorActionToolCfg(flags)),
115 result.popToolsAndMerge(SyncRunActionToolCfg(flags)),
116 result.popToolsAndMerge(SyncEventActionToolCfg(flags))]
117
118 # System stacking action
119 actions += [result.popToolsAndMerge(AthenaStackingActionToolCfg(flags))]
120
121 # Some truth handling actions (and timing)
122 if not flags.Sim.ISFRun:
123 actions += [result.popToolsAndMerge(AthenaTrackingActionToolCfg(flags)),
124 result.popToolsAndMerge(MCTruthSteppingActionToolCfg(flags)),
125 result.popToolsAndMerge(G4SimTimerToolCfg(flags))]
126 # Track counter
127 actions += [result.popToolsAndMerge(G4TrackCounterToolCfg(flags))]
128
129 # Cosmic Perigee action
130 if flags.Beam.Type is BeamType.Cosmics and flags.Sim.CavernBackground is CavernBackground.Off:
131 actions += [CompFactory.G4UA.CosmicPerigeeActionTool()]
132 # Cosmic filter
133 if flags.Beam.Type is BeamType.Cosmics and not flags.Sim.ISFRun:
134 actions += [result.popToolsAndMerge(CosmicFilterToolCfg(flags))]
135 if flags.Sim.StoppedParticleFile:
136 actions += [result.popToolsAndMerge(StoppedParticleFilterToolCfg(flags)),
137 result.popToolsAndMerge(StoppedParticleActionToolCfg(flags))]
138 # Hit wrapper action
139 if flags.Sim.CavernBackground is CavernBackground.Read:
140 actions += [result.popToolsAndMerge(HitWrapperToolCfg(flags))]
141 # Photon killer
142 if flags.Sim.PhysicsList == "QGSP_BERT_HP":
143 actions += [CompFactory.G4UA.PhotonKillerTool()]
144 # Calo calibration default processing
145 if flags.Sim.CalibrationRun in [CalibrationRun.LArTile, CalibrationRun.LArTileZDC]:
146 actions += [result.popToolsAndMerge(CalibrationDefaultProcessingToolCfg(flags))]
147 if 'G4UserActions.G4UserActionsConfig.MonopoleLooperKillerToolCfg' not in flags.Sim.OptionalUserActionList:
148 actions += [result.popToolsAndMerge(LooperKillerToolCfg(flags))]
149
150 result.setPrivateTools(actions)
151 return result
152
153
154def UserActionSvcCfg(flags, name="G4UA::UserActionSvc", **kwargs):
155 """
156 Get the standard UA svc configurable with all default actions added.
157 This function is normally called by the configured factory, not users.
158 """
159 result = ComponentAccumulator()
160
161 generalActions = ( result.popToolsAndMerge(getDefaultActions(flags)) +
162 result.popToolsAndMerge(OptionalUserActionCfg(flags)) )
163
164 # New user action tools
165 kwargs.setdefault("UserActionTools", generalActions)
166
167 # placeholder for more advanced config, if needed
168 result.addService(CompFactory.G4UA.UserActionSvc(name, **kwargs), primary = True)
169
170 return result
171
172
173def CTBUserActionSvcCfg(flags, name="G4UA::CTBUserActionSvc", **kwargs):
174 result = ComponentAccumulator()
175 # FIXME migrate an alternative to this
176 generalActions = ( result.popToolsAndMerge(getDefaultActions(flags)) +
177 result.popToolsAndMerge(OptionalUserActionCfg(flags)) )
178 # This comment carried over from old style:
179 # FIXME: ADS these actions are not yet migrated to Hive
180 #if simFlags.SimLayout.get_Value()=="tb_LArH6_2004":
181 # eoe=["LArHitsH6EventAction"]+eoe
182 # eoe+=["LArGeoH62004EventAction"]
183 # if simFlags.LArTB_H6Step.statusOn:
184 # if simFlags.LArTB_H6Step.get_Value():
185 # stepping+=["LArGeoH62004SteppingAction"]
186 # event+=["RadLenNtuple"]
187 # eoe+=["RadLenNtuple"]
188 # stepping+=["RadLenNtuple"]
189
190 # New user action tools
191 kwargs.setdefault("UserActionTools", generalActions)
192
193 # placeholder for more advanced config, if needed
194 result.addService(CompFactory.G4UA.UserActionSvc(name, **kwargs), primary = True)
195 return result
196
197
198def ISFUserActionSvcCfg(flags, name="G4UA::ISFUserActionSvc", **kwargs):
199 result = ComponentAccumulator()
200 TrackProcessorUserAction = kwargs.pop("TrackProcessorUserAction",[])
201
202 PhysicsValidationUserAction = []
203 if flags.Sim.ISF.ValidationMode:
204 PhysicsValidationUserAction = [result.popPrivateTools(PhysicsValidationUserActionToolCfg(flags))]
205
206 MCTruthUserAction = kwargs.pop("MCTruthUserAction",
207 [result.popToolsAndMerge(MCTruthUserActionToolCfg(flags))])
208
209 generalActions = ( TrackProcessorUserAction + MCTruthUserAction +
210 result.popToolsAndMerge(getDefaultActions(flags)) +
211 result.popToolsAndMerge(OptionalUserActionCfg(flags)) +
212 PhysicsValidationUserAction )
213
214 # New user action tools
215 kwargs.setdefault("UserActionTools", generalActions)
216 result.addService(CompFactory.G4UA.UserActionSvc(name, **kwargs), primary = True)
217 return result
218
219
220def ISFFullUserActionSvcCfg(flags, name="G4UA::ISFFullUserActionSvc", **kwargs):
221 # this configuration needs ISFMCTruthUserAction
222 # and FullG4TrackProcessorUserAction
224 kwargs.setdefault("TrackProcessorUserAction", [tpAcc.popPrivateTools()])
225 result = ISFUserActionSvcCfg(flags, name, **kwargs)
226 result.merge(tpAcc)
227 return result
228
229
230def ISFPassBackUserActionSvcCfg(flags, name="G4UA::ISFPassBackUserActionSvc", **kwargs):
231 # this configuration needs ISFMCTruthUserAction and
232 # PassBackG4TrackProcessorUserAction
233 tpAcc = ComponentAccumulator()
234 kwargs.setdefault("TrackProcessorUserAction",
235 [tpAcc.popToolsAndMerge(PassBackG4TrackProcessorUserActionToolCfg(flags))])
236 result = ISFUserActionSvcCfg(flags, name, **kwargs)
237 result.merge(tpAcc)
238 return result
239
240
241def ISF_ATLFAST_UserActionSvcCfg(flags, name="G4UA::ISF_ATLFAST_UserActionSvc", **kwargs):
242 # this configuration needs ISFMCTruthUserAction and
243 # ATLFAST_G4TrackProcessorUserAction
244 tpAcc = ComponentAccumulator()
245 kwargs.setdefault("TrackProcessorUserAction",
246 [tpAcc.popToolsAndMerge(ATLFAST_G4TrackProcessorUserActionToolCfg(flags))])
247 result = ISFUserActionSvcCfg(flags, name, **kwargs)
248 result.merge(tpAcc)
249 return result
UserActionSvcCfg(flags, name="G4UA::UserActionSvc", **kwargs)
MCTruthUserActionToolCfg(flags, name="ISFMCTruthUserActionTool", **kwargs)
ISFPassBackUserActionSvcCfg(flags, name="G4UA::ISFPassBackUserActionSvc", **kwargs)
ISFFullUserActionSvcCfg(flags, name="G4UA::ISFFullUserActionSvc", **kwargs)
FullG4TrackProcessorUserActionToolCfg(flags, name="FullG4TrackProcessorUserActionTool", **kwargs)
PassBackG4TrackProcessorUserActionToolCfg(flags, name="PassBackG4TrackProcessorUserActionTool", **kwargs)
ISF_ATLFAST_UserActionSvcCfg(flags, name="G4UA::ISF_ATLFAST_UserActionSvc", **kwargs)
TrackProcessorUserActionToolCfg(flags, name="ISFG4TrackProcessorUserActionTool", **kwargs)
CTBUserActionSvcCfg(flags, name="G4UA::CTBUserActionSvc", **kwargs)
ISFUserActionSvcCfg(flags, name="G4UA::ISFUserActionSvc", **kwargs)
ATLFAST_G4TrackProcessorUserActionToolCfg(flags, name="ATLFAST_G4TrackProcessorUserActionTool", **kwargs)
PhysicsValidationUserActionToolCfg(flags, name="ISFG4PhysicsValidationUserActionTool", **kwargs)
getOptionalUACfg(flags, userActionString)