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, G4SimTimerToolCfg,
12 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, SimulationFlavour.ATLFAST3F_ACTSMT]:
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(MCTruthSteppingActionToolCfg(flags)),
124 result.popToolsAndMerge(G4SimTimerToolCfg(flags))]
125 # Track counter
126 actions += [result.popToolsAndMerge(G4TrackCounterToolCfg(flags))]
127
128 # Cosmic Perigee action
129 if flags.Beam.Type is BeamType.Cosmics and flags.Sim.CavernBackground is CavernBackground.Off:
130 actions += [CompFactory.G4UA.CosmicPerigeeActionTool()]
131 # Cosmic filter
132 if flags.Beam.Type is BeamType.Cosmics and not flags.Sim.ISFRun:
133 actions += [result.popToolsAndMerge(CosmicFilterToolCfg(flags))]
134 if flags.Sim.StoppedParticleFile:
135 actions += [result.popToolsAndMerge(StoppedParticleFilterToolCfg(flags)),
136 result.popToolsAndMerge(StoppedParticleActionToolCfg(flags))]
137 # Hit wrapper action
138 if flags.Sim.CavernBackground is CavernBackground.Read:
139 actions += [result.popToolsAndMerge(HitWrapperToolCfg(flags))]
140 # Photon killer
141 if flags.Sim.PhysicsList == "QGSP_BERT_HP":
142 actions += [CompFactory.G4UA.PhotonKillerTool()]
143 # Calo calibration default processing
144 if flags.Sim.CalibrationRun in [CalibrationRun.LArTile, CalibrationRun.LArTileZDC]:
145 actions += [result.popToolsAndMerge(CalibrationDefaultProcessingToolCfg(flags))]
146 if 'G4UserActions.G4UserActionsConfig.MonopoleLooperKillerToolCfg' not in flags.Sim.OptionalUserActionList:
147 actions += [result.popToolsAndMerge(LooperKillerToolCfg(flags))]
148
149 result.setPrivateTools(actions)
150 return result
151
152
153def UserActionSvcCfg(flags, name="G4UA::UserActionSvc", **kwargs):
154 """
155 Get the standard UA svc configurable with all default actions added.
156 This function is normally called by the configured factory, not users.
157 """
158 result = ComponentAccumulator()
159
160 generalActions = ( result.popToolsAndMerge(getDefaultActions(flags)) +
161 result.popToolsAndMerge(OptionalUserActionCfg(flags)) )
162
163 # New user action tools
164 kwargs.setdefault("UserActionTools", generalActions)
165
166 # placeholder for more advanced config, if needed
167 result.addService(CompFactory.G4UA.UserActionSvc(name, **kwargs), primary = True)
168
169 return result
170
171
172def CTBUserActionSvcCfg(flags, name="G4UA::CTBUserActionSvc", **kwargs):
173 result = ComponentAccumulator()
174 # FIXME migrate an alternative to this
175 generalActions = ( result.popToolsAndMerge(getDefaultActions(flags)) +
176 result.popToolsAndMerge(OptionalUserActionCfg(flags)) )
177 # This comment carried over from old style:
178 # FIXME: ADS these actions are not yet migrated to Hive
179 #if simFlags.SimLayout.get_Value()=="tb_LArH6_2004":
180 # eoe=["LArHitsH6EventAction"]+eoe
181 # eoe+=["LArGeoH62004EventAction"]
182 # if simFlags.LArTB_H6Step.statusOn:
183 # if simFlags.LArTB_H6Step.get_Value():
184 # stepping+=["LArGeoH62004SteppingAction"]
185 # event+=["RadLenNtuple"]
186 # eoe+=["RadLenNtuple"]
187 # stepping+=["RadLenNtuple"]
188
189 # New user action tools
190 kwargs.setdefault("UserActionTools", generalActions)
191
192 # placeholder for more advanced config, if needed
193 result.addService(CompFactory.G4UA.UserActionSvc(name, **kwargs), primary = True)
194 return result
195
196
197def ISFUserActionSvcCfg(flags, name="G4UA::ISFUserActionSvc", **kwargs):
198 result = ComponentAccumulator()
199 TrackProcessorUserAction = kwargs.pop("TrackProcessorUserAction",[])
200
201 PhysicsValidationUserAction = []
202 if flags.Sim.ISF.ValidationMode:
203 PhysicsValidationUserAction = [result.popPrivateTools(PhysicsValidationUserActionToolCfg(flags))]
204
205 MCTruthUserAction = kwargs.pop("MCTruthUserAction",
206 [result.popToolsAndMerge(MCTruthUserActionToolCfg(flags))])
207
208 generalActions = ( TrackProcessorUserAction + MCTruthUserAction +
209 result.popToolsAndMerge(getDefaultActions(flags)) +
210 result.popToolsAndMerge(OptionalUserActionCfg(flags)) +
211 PhysicsValidationUserAction )
212
213 # New user action tools
214 kwargs.setdefault("UserActionTools", generalActions)
215 result.addService(CompFactory.G4UA.UserActionSvc(name, **kwargs), primary = True)
216 return result
217
218
219def ISFFullUserActionSvcCfg(flags, name="G4UA::ISFFullUserActionSvc", **kwargs):
220 # this configuration needs ISFMCTruthUserAction
221 # and FullG4TrackProcessorUserAction
223 kwargs.setdefault("TrackProcessorUserAction", [tpAcc.popPrivateTools()])
224 result = ISFUserActionSvcCfg(flags, name, **kwargs)
225 result.merge(tpAcc)
226 return result
227
228
229def ISFPassBackUserActionSvcCfg(flags, name="G4UA::ISFPassBackUserActionSvc", **kwargs):
230 # this configuration needs ISFMCTruthUserAction and
231 # PassBackG4TrackProcessorUserAction
232 tpAcc = ComponentAccumulator()
233 kwargs.setdefault("TrackProcessorUserAction",
234 [tpAcc.popToolsAndMerge(PassBackG4TrackProcessorUserActionToolCfg(flags))])
235 result = ISFUserActionSvcCfg(flags, name, **kwargs)
236 result.merge(tpAcc)
237 return result
238
239
240def ISF_ATLFAST_UserActionSvcCfg(flags, name="G4UA::ISF_ATLFAST_UserActionSvc", **kwargs):
241 # this configuration needs ISFMCTruthUserAction and
242 # ATLFAST_G4TrackProcessorUserAction
243 tpAcc = ComponentAccumulator()
244 kwargs.setdefault("TrackProcessorUserAction",
245 [tpAcc.popToolsAndMerge(ATLFAST_G4TrackProcessorUserActionToolCfg(flags))])
246 result = ISFUserActionSvcCfg(flags, name, **kwargs)
247 result.merge(tpAcc)
248 return result
MCTruthUserActionToolCfg(flags, name="ISFMCTruthUserActionTool", **kwargs)
ATLFAST_G4TrackProcessorUserActionToolCfg(flags, name="ATLFAST_G4TrackProcessorUserActionTool", **kwargs)
ISF_ATLFAST_UserActionSvcCfg(flags, name="G4UA::ISF_ATLFAST_UserActionSvc", **kwargs)
TrackProcessorUserActionToolCfg(flags, name="ISFG4TrackProcessorUserActionTool", **kwargs)
PhysicsValidationUserActionToolCfg(flags, name="ISFG4PhysicsValidationUserActionTool", **kwargs)
ISFUserActionSvcCfg(flags, name="G4UA::ISFUserActionSvc", **kwargs)
getOptionalUACfg(flags, userActionString)
UserActionSvcCfg(flags, name="G4UA::UserActionSvc", **kwargs)
CTBUserActionSvcCfg(flags, name="G4UA::CTBUserActionSvc", **kwargs)
FullG4TrackProcessorUserActionToolCfg(flags, name="FullG4TrackProcessorUserActionTool", **kwargs)
ISFPassBackUserActionSvcCfg(flags, name="G4UA::ISFPassBackUserActionSvc", **kwargs)
PassBackG4TrackProcessorUserActionToolCfg(flags, name="PassBackG4TrackProcessorUserActionTool", **kwargs)
ISFFullUserActionSvcCfg(flags, name="G4UA::ISFFullUserActionSvc", **kwargs)