ATLAS Offline Software
G4AtlasUserActionConfig.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 
3 from AthenaCommon.SystemOfUnits import MeV
4 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
5 from AthenaConfiguration.ComponentFactory import CompFactory
6 from AthenaConfiguration.Enums import BeamType, LHCPeriod
7 from CaloG4Sim.CaloG4SimConfig import CalibrationDefaultProcessingToolCfg
8 from SimulationConfig.SimEnums import CalibrationRun, CavernBackground, SimulationFlavour
9 from G4CosmicFilter.G4CosmicFilterConfig import CosmicFilterToolCfg
10 from G4UserActions.G4UserActionsConfig import (
11  AthenaStackingActionToolCfg, AthenaTrackingActionToolCfg,
12  G4SimTimerToolCfg, G4TrackCounterToolCfg, HitWrapperToolCfg,
13  LooperKillerToolCfg, StoppedParticleActionToolCfg
14 )
15 from ISF_Geant4CommonTools.ISF_Geant4CommonToolsConfig import EntryLayerToolCfg, EntryLayerToolMTCfg
16 from ISF_Services.ISF_ServicesCoreConfig import ATLFAST_GeoIDSvcCfg, GeoIDSvcCfg
17 from ISF_Services.ISF_ServicesConfig import (
18  ATLFAST_ParticleBrokerSvcCfg, ParticleBrokerSvcCfg, TruthServiceCfg
19 )
20 from ISF_Tools.ISF_ToolsConfig import StoppedParticleFilterToolCfg
21 from 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 
34 def 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
48 def 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)).name)
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 
63 def PhysicsValidationUserActionToolCfg(flags, name="ISFG4PhysicsValidationUserActionTool", **kwargs):
64  result = ComponentAccumulator()
65  result.setPrivateTools(CompFactory.G4UA.iGeant4.PhysicsValidationUserActionTool(name, **kwargs))
66  return result
67 
68 
69 def MCTruthUserActionToolCfg(flags, name="ISFMCTruthUserActionTool", **kwargs):
70  result = ComponentAccumulator()
71  kwargs.setdefault("TruthRecordSvc", result.getPrimaryAndMerge(TruthServiceCfg(flags)).name)
72  result.setPrivateTools(CompFactory.G4UA.iGeant4.MCTruthUserActionTool(name, **kwargs))
73  return result
74 
75 
76 def TrackProcessorUserActionToolCfg(flags, name="ISFG4TrackProcessorUserActionTool", **kwargs):
77  result = ComponentAccumulator()
78  if "ParticleBroker" not in kwargs:
79  kwargs.setdefault("ParticleBroker", result.getPrimaryAndMerge(ParticleBrokerSvcCfg(flags)).name)
80  kwargs.setdefault("GeoIDSvc", result.getPrimaryAndMerge(GeoIDSvcCfg(flags)).name)
81  result.setPrivateTools(CompFactory.G4UA.iGeant4.TrackProcessorUserActionPassBackTool(name, **kwargs))
82  return result
83 
84 
85 def 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 
91 def 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)).name)
97  kwargs.setdefault("GeoIDSvc", result.getPrimaryAndMerge(ATLFAST_GeoIDSvcCfg(flags)).name)
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
106 def getDefaultActions(flags):
107  result = ComponentAccumulator()
108 
109  actions = []
110 
111  # System stacking action
112  actions += [result.popToolsAndMerge(AthenaStackingActionToolCfg(flags))]
113 
114  # Some truth handling actions (and timing)
115  if not flags.Sim.ISFRun:
116  actions += [result.popToolsAndMerge(AthenaTrackingActionToolCfg(flags)),
117  result.popToolsAndMerge(MCTruthSteppingActionToolCfg(flags)),
118  result.popToolsAndMerge(G4SimTimerToolCfg(flags))]
119  # Track counter
120  actions += [result.popToolsAndMerge(G4TrackCounterToolCfg(flags))]
121 
122  # Cosmic Perigee action
123  if flags.Beam.Type is BeamType.Cosmics and flags.Sim.CavernBackground is CavernBackground.Off:
124  actions += [CompFactory.G4UA.CosmicPerigeeActionTool()]
125  # Cosmic filter
126  if flags.Beam.Type is BeamType.Cosmics and not flags.Sim.ISFRun:
127  actions += [result.popToolsAndMerge(CosmicFilterToolCfg(flags))]
128  if flags.Sim.StoppedParticleFile:
129  actions += [result.popToolsAndMerge(StoppedParticleFilterToolCfg(flags)),
130  result.popToolsAndMerge(StoppedParticleActionToolCfg(flags))]
131  # Hit wrapper action
132  if flags.Sim.CavernBackground is CavernBackground.Read:
133  actions += [result.popToolsAndMerge(HitWrapperToolCfg(flags))]
134  # Photon killer
135  if flags.Sim.PhysicsList == "QGSP_BERT_HP":
136  actions += [CompFactory.G4UA.PhotonKillerTool()]
137  # Calo calibration default processing
138  if flags.Sim.CalibrationRun in [CalibrationRun.LArTile, CalibrationRun.LArTileZDC]:
139  actions += [result.popToolsAndMerge(CalibrationDefaultProcessingToolCfg(flags))]
140 
141  actions += [result.popToolsAndMerge(LooperKillerToolCfg(flags))]
142 
143  result.setPrivateTools(actions)
144  return result
145 
146 
147 def UserActionSvcCfg(flags, name="G4UA::UserActionSvc", **kwargs):
148  """
149  Get the standard UA svc configurable with all default actions added.
150  This function is normally called by the configured factory, not users.
151  """
152  result = ComponentAccumulator()
153 
154  generalActions = ( result.popToolsAndMerge(getDefaultActions(flags)) +
155  result.popToolsAndMerge(OptionalUserActionCfg(flags)) )
156 
157  # New user action tools
158  kwargs.setdefault("UserActionTools", generalActions)
159 
160  # placeholder for more advanced config, if needed
161  result.addService(CompFactory.G4UA.UserActionSvc(name, **kwargs), primary = True)
162 
163  return result
164 
165 
166 def CTBUserActionSvcCfg(flags, name="G4UA::CTBUserActionSvc", **kwargs):
167  result = ComponentAccumulator()
168  # FIXME migrate an alternative to this
169  generalActions = ( result.popToolsAndMerge(getDefaultActions(flags)) +
170  result.popToolsAndMerge(OptionalUserActionCfg(flags)) )
171  # This comment carried over from old style:
172  # FIXME: ADS these actions are not yet migrated to Hive
173  #if simFlags.SimLayout.get_Value()=="tb_LArH6_2004":
174  # eoe=["LArHitsH6EventAction"]+eoe
175  # eoe+=["LArGeoH62004EventAction"]
176  # if simFlags.LArTB_H6Step.statusOn:
177  # if simFlags.LArTB_H6Step.get_Value():
178  # stepping+=["LArGeoH62004SteppingAction"]
179  # event+=["RadLenNtuple"]
180  # eoe+=["RadLenNtuple"]
181  # stepping+=["RadLenNtuple"]
182 
183  # New user action tools
184  kwargs.setdefault("UserActionTools", generalActions)
185 
186  # placeholder for more advanced config, if needed
187  result.addService(CompFactory.G4UA.UserActionSvc(name, **kwargs), primary = True)
188  return result
189 
190 
191 def ISFUserActionSvcCfg(flags, name="G4UA::ISFUserActionSvc", **kwargs):
192  result = ComponentAccumulator()
193  TrackProcessorUserAction = kwargs.pop("TrackProcessorUserAction",[])
194 
195  PhysicsValidationUserAction = []
196  if flags.Sim.ISF.ValidationMode:
197  PhysicsValidationUserAction = [result.popPrivateTools(PhysicsValidationUserActionToolCfg(flags))]
198 
199  MCTruthUserAction = kwargs.pop("MCTruthUserAction",
200  [result.popToolsAndMerge(MCTruthUserActionToolCfg(flags))])
201 
202  generalActions = ( TrackProcessorUserAction + MCTruthUserAction +
203  result.popToolsAndMerge(getDefaultActions(flags)) +
204  result.popToolsAndMerge(OptionalUserActionCfg(flags)) +
205  PhysicsValidationUserAction )
206 
207  # New user action tools
208  kwargs.setdefault("UserActionTools", generalActions)
209  result.addService(CompFactory.G4UA.UserActionSvc(name, **kwargs), primary = True)
210  return result
211 
212 
213 def ISFFullUserActionSvcCfg(flags, name="G4UA::ISFFullUserActionSvc", **kwargs):
214  # this configuration needs ISFMCTruthUserAction
215  # and FullG4TrackProcessorUserAction
217  kwargs.setdefault("TrackProcessorUserAction", [tpAcc.popPrivateTools()])
218  result = ISFUserActionSvcCfg(flags, name, **kwargs)
219  result.merge(tpAcc)
220  return result
221 
222 
223 def ISFPassBackUserActionSvcCfg(flags, name="G4UA::ISFPassBackUserActionSvc", **kwargs):
224  # this configuration needs ISFMCTruthUserAction and
225  # PassBackG4TrackProcessorUserAction
226  tpAcc = ComponentAccumulator()
227  kwargs.setdefault("TrackProcessorUserAction",
228  [tpAcc.popToolsAndMerge(PassBackG4TrackProcessorUserActionToolCfg(flags))])
229  result = ISFUserActionSvcCfg(flags, name, **kwargs)
230  result.merge(tpAcc)
231  return result
232 
233 
234 def ISF_ATLFAST_UserActionSvcCfg(flags, name="G4UA::ISF_ATLFAST_UserActionSvc", **kwargs):
235  # this configuration needs ISFMCTruthUserAction and
236  # ATLFAST_G4TrackProcessorUserAction
237  tpAcc = ComponentAccumulator()
238  kwargs.setdefault("TrackProcessorUserAction",
239  [tpAcc.popToolsAndMerge(ATLFAST_G4TrackProcessorUserActionToolCfg(flags))])
240  result = ISFUserActionSvcCfg(flags, name, **kwargs)
241  result.merge(tpAcc)
242  return result
G4AtlasUserActionConfig.ATLFAST_G4TrackProcessorUserActionToolCfg
def ATLFAST_G4TrackProcessorUserActionToolCfg(flags, name="ATLFAST_G4TrackProcessorUserActionTool", **kwargs)
Definition: G4AtlasUserActionConfig.py:91
G4CosmicFilterConfig.CosmicFilterToolCfg
def CosmicFilterToolCfg(flags, name="G4UA::G4CosmicFilterTool", **kwargs)
Definition: G4CosmicFilterConfig.py:27
SystemOfUnits
G4CosmicFilterConfig.StoppedParticleFilterToolCfg
def StoppedParticleFilterToolCfg(flags, name="G4UA::StoppedParticleFilterTool", **kwargs)
Definition: G4CosmicFilterConfig.py:61
python.G4UserActionsConfig.AthenaStackingActionToolCfg
def AthenaStackingActionToolCfg(flags, name='G4UA::AthenaStackingActionTool', **kwargs)
Definition: G4UserActionsConfig.py:13
G4AtlasUserActionConfig.getOptionalUACfg
def getOptionalUACfg(flags, userActionString)
Definition: G4AtlasUserActionConfig.py:34
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
G4AtlasUserActionConfig.ISFFullUserActionSvcCfg
def ISFFullUserActionSvcCfg(flags, name="G4UA::ISFFullUserActionSvc", **kwargs)
Definition: G4AtlasUserActionConfig.py:213
python.G4UserActionsConfig.StoppedParticleActionToolCfg
def StoppedParticleActionToolCfg(flags, name="G4UA::StoppedParticleActionTool", **kwargs)
Definition: G4UserActionsConfig.py:68
ISF_ServicesConfig.ATLFAST_ParticleBrokerSvcCfg
def ATLFAST_ParticleBrokerSvcCfg(flags, name="ISF_ATLFAST_ParticleBrokerSvc", **kwargs)
Definition: ISF_ServicesConfig.py:70
G4AtlasUserActionConfig.OptionalUserActionCfg
def OptionalUserActionCfg(flags)
Definition: G4AtlasUserActionConfig.py:24
CaloG4SimConfig.CalibrationDefaultProcessingToolCfg
def CalibrationDefaultProcessingToolCfg(flags, name="G4UA::CaloG4::CalibrationDefaultProcessing", **kwargs)
Definition: CaloG4SimConfig.py:10
MCTruthBaseConfig.MCTruthSteppingActionToolCfg
def MCTruthSteppingActionToolCfg(flags, name='G4UA::MCTruthSteppingActionTool', **kwargs)
Definition: MCTruthBaseConfig.py:37
ISF_ServicesCoreConfig.ATLFAST_GeoIDSvcCfg
def ATLFAST_GeoIDSvcCfg(flags, name="ISF_ATLFAST_GeoIDSvc", **kwargs)
Definition: ISF_ServicesCoreConfig.py:39
G4AtlasUserActionConfig.MCTruthUserActionToolCfg
def MCTruthUserActionToolCfg(flags, name="ISFMCTruthUserActionTool", **kwargs)
Definition: G4AtlasUserActionConfig.py:69
G4AtlasUserActionConfig.UserActionSvcCfg
def UserActionSvcCfg(flags, name="G4UA::UserActionSvc", **kwargs)
Definition: G4AtlasUserActionConfig.py:147
python.G4UserActionsConfig.AthenaTrackingActionToolCfg
def AthenaTrackingActionToolCfg(flags, name='G4UA::AthenaTrackingActionTool', **kwargs)
Definition: G4UserActionsConfig.py:39
ISF_Geant4CommonToolsConfig.EntryLayerToolMTCfg
def EntryLayerToolMTCfg(flags, name="ISF_EntryLayerToolMT", **kwargs)
Definition: ISF_Geant4CommonToolsConfig.py:35
G4AtlasUserActionConfig.PhysicsValidationUserActionToolCfg
def PhysicsValidationUserActionToolCfg(flags, name="ISFG4PhysicsValidationUserActionTool", **kwargs)
Definition: G4AtlasUserActionConfig.py:63
ISF_ServicesConfig.ParticleBrokerSvcCfg
def ParticleBrokerSvcCfg(flags, name="ISF_ParticleBrokerSvc", **kwargs)
Definition: ISF_ServicesConfig.py:60
python.G4UserActionsConfig.HitWrapperToolCfg
def HitWrapperToolCfg(flags, name="G4UA::HitWrapperTool", **kwargs)
Definition: G4UserActionsConfig.py:86
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
G4AtlasUserActionConfig.ISFPassBackUserActionSvcCfg
def ISFPassBackUserActionSvcCfg(flags, name="G4UA::ISFPassBackUserActionSvc", **kwargs)
Definition: G4AtlasUserActionConfig.py:223
G4AtlasUserActionConfig.ISF_ATLFAST_UserActionSvcCfg
def ISF_ATLFAST_UserActionSvcCfg(flags, name="G4UA::ISF_ATLFAST_UserActionSvc", **kwargs)
Definition: G4AtlasUserActionConfig.py:234
ISF_ServicesConfig.TruthServiceCfg
def TruthServiceCfg(flags, **kwargs)
Definition: ISF_ServicesConfig.py:80
python.G4UserActionsConfig.G4TrackCounterToolCfg
def G4TrackCounterToolCfg(flags, name='G4UA::G4TrackCounterTool', **kwargs)
Definition: G4UserActionsConfig.py:62
G4AtlasUserActionConfig.FullG4TrackProcessorUserActionToolCfg
def FullG4TrackProcessorUserActionToolCfg(flags, name="FullG4TrackProcessorUserActionTool", **kwargs)
Definition: G4AtlasUserActionConfig.py:48
G4AtlasUserActionConfig.CTBUserActionSvcCfg
def CTBUserActionSvcCfg(flags, name="G4UA::CTBUserActionSvc", **kwargs)
Definition: G4AtlasUserActionConfig.py:166
G4AtlasUserActionConfig.getDefaultActions
def getDefaultActions(flags)
Definition: G4AtlasUserActionConfig.py:106
G4AtlasUserActionConfig.TrackProcessorUserActionToolCfg
def TrackProcessorUserActionToolCfg(flags, name="ISFG4TrackProcessorUserActionTool", **kwargs)
Definition: G4AtlasUserActionConfig.py:76
ISF_ServicesCoreConfig.GeoIDSvcCfg
def GeoIDSvcCfg(flags, name="ISF_GeoIDSvc", **kwargs)
Definition: ISF_ServicesCoreConfig.py:22
G4AtlasUserActionConfig.PassBackG4TrackProcessorUserActionToolCfg
def PassBackG4TrackProcessorUserActionToolCfg(flags, name="PassBackG4TrackProcessorUserActionTool", **kwargs)
Definition: G4AtlasUserActionConfig.py:85
python.G4UserActionsConfig.LooperKillerToolCfg
def LooperKillerToolCfg(flags, name='G4UA::LooperKillerTool', **kwargs)
Definition: G4UserActionsConfig.py:51
G4AtlasUserActionConfig.ISFUserActionSvcCfg
def ISFUserActionSvcCfg(flags, name="G4UA::ISFUserActionSvc", **kwargs)
Definition: G4AtlasUserActionConfig.py:191
python.G4UserActionsConfig.G4SimTimerToolCfg
def G4SimTimerToolCfg(flags, name='G4UA::G4SimTimerTool', **kwargs)
Definition: G4UserActionsConfig.py:56