ATLAS Offline Software
Loading...
Searching...
No Matches
SimConfigFlags.py
Go to the documentation of this file.
1# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2
3from AthenaConfiguration.AthConfigFlags import AthConfigFlags, isGaudiEnv
4from AthenaConfiguration.AutoConfigFlags import GetFileMD
5from AthenaConfiguration.Enums import BeamType, LHCPeriod
6from SimulationConfig.SimEnums import BeamPipeSimMode, CalibrationRun, CavernBackground, \
7 LArParameterization, InDetParameterization, SimulationFlavour, TruthStrategy, VertexSource
8from AthenaCommon.SystemOfUnits import m, ns
9
10#todo? add in the explanatory text from previous implementation
11
13 scf = AthConfigFlags()
14 scf.addFlag("Sim.ParticleID", False)
15
16 def _checkCalibrationRun(prevFlags):
17 if prevFlags.Sim.ISF.Simulator not in [SimulationFlavour.FullG4MT, SimulationFlavour.FullG4MT_QS, SimulationFlavour.PassBackG4MT, SimulationFlavour.AtlasG4, SimulationFlavour.AtlasG4_QS] \
18 or prevFlags.Sim.LArParameterization is not LArParameterization.NoFrozenShowers:
19 return CalibrationRun.Off
20 return CalibrationRun.DeadLAr
21
22 scf.addFlag("Sim.CalibrationRun", _checkCalibrationRun, type=CalibrationRun)
23
24 scf.addFlag("Sim.CavernBackground", CavernBackground.Off, type=CavernBackground)
25 scf.addFlag("Sim.ReadTR", False)
26 scf.addFlag("Sim.WorldRRange", False) # 12500. / int or float
27 scf.addFlag("Sim.WorldZRange", False) # 22031. / int or float
28
29 def _barcodeOffsetFromTruthStrategy(prevFlags):
30 if prevFlags.Sim.TruthStrategy in [TruthStrategy.MC15, TruthStrategy.MC18, TruthStrategy.MC18LLP]:
31 return 1000000 # 1M
32 return 200000 # 200k - This is the default value - in practice it has been the same for all campaigns
33
34 def _checkSimBarcodeOffsetConf(prevFlags):
35 simBarcodeOffset = 0
36 if prevFlags.Input.Files:
37 mdstring = GetFileMD(prevFlags.Input.Files).get("SimBarcodeOffset", "0")
38 simBarcodeOffset = eval(mdstring)
39 if not simBarcodeOffset:
40 simBarcodeOffset = _barcodeOffsetFromTruthStrategy(prevFlags)
41 return simBarcodeOffset
42
43 def _regenerationIncrementFromTruthStrategy(prevFlags):
44 if prevFlags.Sim.TruthStrategy in [TruthStrategy.MC15, TruthStrategy.MC18, TruthStrategy.MC18LLP]:
45 return 10000000 # 10M
46 return 1000000 # 1M - This is the default value - in practice it has been the same for all campaigns
47
48 def _checkRegenerationIncrementConf(prevFlags):
49 regenInc = 0
50 if prevFlags.Input.Files:
51 mdstring = GetFileMD(prevFlags.Input.Files).get("RegenerationIncrement", "0")
52 regenInc = eval(mdstring)
53 if not regenInc:
54 regenInc = _regenerationIncrementFromTruthStrategy(prevFlags)
55 return regenInc
56
57 # the G4 offset.
58 scf.addFlag("Sim.SimBarcodeOffset", _checkSimBarcodeOffsetConf)
59 # barcode offset when a particle survives an interaction during simulation
60 scf.addFlag("Sim.RegenerationIncrement", _checkRegenerationIncrementConf)
61
62 # Forward region
63 scf.addFlag("Sim.TwissFileBeam1", False)
64 scf.addFlag("Sim.TwissFileBeam2", False)
65 scf.addFlag("Sim.TwissEnergy", lambda prevFlags : float(prevFlags.Beam.Energy)) # energy of each beam
66 scf.addFlag("Sim.TwissFileBeta", 90.*m)
67 scf.addFlag("Sim.TwissFileNomReal", 'nominal') # "nominal", "real" / default to one of these?!
68 scf.addFlag("Sim.TwissFileVersion", "v02")
69
70 # G4AtlasAlg
71 scf.addFlag("Sim.ReleaseGeoModel", False)
72 scf.addFlag("Sim.SimplifiedGeoPath", "")
73 scf.addFlag("Sim.RecordFlux", False)
74 scf.addFlag("Sim.TruthStrategy", lambda prevFlags : TruthStrategy.Validation if prevFlags.Sim.ISF.ValidationMode else TruthStrategy.MC12,
75 type=TruthStrategy)
76 scf.addFlag("Sim.UseShadowEvent", lambda prevFlags : prevFlags.Sim.ISF.Simulator.isQuasiStable())
77 scf.addFlag("Sim.G4Commands", ["/run/verbose 2"])
78 scf.addFlag("Sim.FlagAbortedEvents", False)
79 scf.addFlag("Sim.KillAbortedEvents", True)
80 scf.addFlag("Sim.IncludeParentsInG4Event", False)
81 scf.addFlag("Sim.UseG4Workers", False) # Run Geant4 workers in separate thread pool managed by Geant4
82
83 # Do full simulation + digitisation + reconstruction chain
84 scf.addFlag("Sim.DoFullChain", False)
85
86 def _check_G4_version(prevFlags):
87 # Determine the Geant4 version which will be used by the
88 # configuration. In jobs where we are running simulation,
89 # then the G4Version should reflect the version in the
90 # release, so the version in environment should take
91 # precedence over any input file metadata. In jobs where
92 # simulation is not run, then the G4Version from the input
93 # file metadata should take precedence.
94 version = ""
95 from AthenaConfiguration.Enums import ProductionStep
96 if prevFlags.Common.ProductionStep not in [ProductionStep.Simulation, ProductionStep.FastChain]:
97 if prevFlags.Input.Files:
98 version = GetFileMD(prevFlags.Input.Files).get("G4Version", "")
99 if not version:
100 from os import environ
101 version = str(environ.get("G4VERS", ""))
102 if prevFlags.Input.isMC and isGaudiEnv() and not version:
103 raise ValueError("Unknown G4 version")
104 return version
105
106 scf.addFlag("Sim.G4Version", _check_G4_version)
107
108 def _checkPhysicsListConf(prevFlags):
109 physicsList = "FTFP_BERT_ATL"
110 if prevFlags.Input.Files:
111 physicsList = GetFileMD(prevFlags.Input.Files).get("PhysicsList", "")
112 if not physicsList:
113 # Currently physicsList is also part of /Digitization/Parameters metadata. TODO migrate away from this.
114 physicsList = GetFileMD(prevFlags.Input.Files).get("physicsList", "FTFP_BERT_ATL")
115 return physicsList
116
117 scf.addFlag("Sim.PhysicsList", _checkPhysicsListConf)
118 scf.addFlag("Sim.NeutronTimeCut", 150.) # Sets the value for the neutron out of time cut in G4
119 scf.addFlag("Sim.NeutronEnergyCut", -1.) # Sets the value for the neutron energy cut in G4
120 scf.addFlag("Sim.ApplyEMCuts", False) # Turns on the G4 option to apply cuts for EM physics
121 scf.addFlag("Sim.MuonFieldOnlyInCalo", False) # Only muons see the B-field in the calo
122
123 # G4AtlasToolsConfig
124 scf.addFlag("Sim.RecordStepInfo", False)
125 scf.addFlag("Sim.StoppedParticleFile", "")
126 scf.addFlag("Sim.BeamPipeSimMode", BeamPipeSimMode.Normal, type=BeamPipeSimMode)
127 scf.addFlag("Sim.LArParameterization", LArParameterization.NoFrozenShowers, type=LArParameterization)
128 scf.addFlag("Sim.InDetParameterization", InDetParameterization.NONE, type=InDetParameterization)
129 # TRT Range cut used in simulation in mm. Should be 0.05 or 30.
130 scf.addFlag("Sim.TRTRangeCut",
131 lambda prevFlags: float(GetFileMD(prevFlags.Input.Files).get('TRTRangeCut', 30.0)))
132
133 # BeameffectsAlg
134 scf.addFlag("Sim.VertexSource", VertexSource.CondDB, type=VertexSource)
135 scf.addFlag("Sim.VertexTimeSmearing", lambda prevFlags:
136 prevFlags.Beam.Type == BeamType.Collisions and prevFlags.GeoModel.Run >= LHCPeriod.Run4)
137
138 def _checkVertexTimeWidth(prevFlags):
139 default = 0.175*ns
140 vertexTimeWidth = default
141 if prevFlags.Input.Files:
142 vertexTimeWidth = GetFileMD(prevFlags.Input.Files).get("VertexTimeWidth", default)
143 return vertexTimeWidth
144
145 scf.addFlag("Sim.VertexTimeWidth", _checkVertexTimeWidth)
146
147 # G4UserActions
148 scf.addFlag("Sim.NRRThreshold", False)
149 scf.addFlag("Sim.NRRWeight", False)
150 scf.addFlag("Sim.PRRThreshold", False)
151 scf.addFlag("Sim.PRRWeight", False)
152 scf.addFlag("Sim.OptionalUserActionList", [])
153
154 # G4FieldConfig
155 scf.addFlag("Sim.G4Stepper", "AtlasRK4")
156 scf.addFlag("Sim.G4EquationOfMotion", "")
157 scf.addFlag("Sim.UsingGeant4", True)
158
159 # Cosmics
160 # volume(s) used to do cosmics filtering
161 # G4 volume names from {"Muon", "Calo", "InnerDetector", "TRT_Barrel", "TRT_EC", "SCT_Barrel", "Pixel"}
162 scf.addFlag("Sim.CosmicFilterVolumeNames", ["InnerDetector"])
163 scf.addFlag("Sim.CosmicFilterID", False) # PDG ID to be filtered ("13")
164 scf.addFlag("Sim.CosmicFilterPTmin", False) # min pT filtered in cosmics processing (MeV) ("5000")
165 scf.addFlag("Sim.CosmicFilterPTmax", False) # max pT filtered in cosmics processing (MeV) ("6000")
166 scf.addFlag("Sim.CosmicPtSlice", "Off") # 'slice1', 'slice2', 'slice3', 'slice4', 'NONE'
167
168 # ISF
169 scf.addFlag("Sim.ISFRun", False)
170
171 def _checkSimulationFlavour(prevFlags):
172 simulator = SimulationFlavour.Unknown
173 if prevFlags.Input.Files:
174 simFlavour = GetFileMD(prevFlags.Input.Files).get("Simulator", "")
175 if not simFlavour:
176 simFlavour = GetFileMD(prevFlags.Input.Files).get("SimulationFlavour", "")
177 try:
178 simulator = SimulationFlavour(simFlavour)
179 except ValueError:
180 # Deal with old non-thread-safe simulators
181 if simFlavour in ['default']: # This is the case when ISF was not configured in sim
182 simulator = SimulationFlavour.AtlasG4
183 elif simFlavour in ['MC12G4', 'FullG4']:
184 simulator = SimulationFlavour.FullG4MT
185 elif simFlavour in ['FullG4_QS', 'FullG4_LongLived']:
186 simulator = SimulationFlavour.FullG4MT_QS
187 elif simFlavour in ['PassBackG4']:
188 simulator = SimulationFlavour.PassBackG4MT
189 elif simFlavour in ['ATLFASTII']:
190 simulator = SimulationFlavour.ATLFASTIIMT
191 elif simFlavour in ['ATLFASTIIF']:
192 simulator = SimulationFlavour.ATLFASTIIFMT
193 elif simFlavour in ['ATLFAST3']:
194 simulator = SimulationFlavour.ATLFAST3MT
195 elif simFlavour in ['ATLFAST3_QS']:
196 simulator = SimulationFlavour.ATLFAST3MT_QS
197 else:
198 # Obscure old-style configuration used - do not try to interpret
199 simulator = SimulationFlavour.Unknown
200 return simulator
201
202 scf.addFlag("Sim.ISF.Simulator", _checkSimulationFlavour, type=SimulationFlavour)
203 scf.addFlag("Sim.ISF.DoTimeMonitoring", True) # bool: run time monitoring
204 scf.addFlag("Sim.ISF.DoMemoryMonitoring", True) # bool: run time monitoring
205 scf.addFlag("Sim.ISF.ValidationMode", False) # bool: run ISF internal validation checks
206 scf.addFlag("Sim.ISF.ReSimulation", False) # Using ReSimulation workflow
207 scf.addFlag("Sim.ISF.UseTrackingGeometryCond", False) # Using Condition for tracking Geometry
208
209 def _decideHITSMerging(prevFlags):
210 # Further specialization possible in future
211 if prevFlags.Sim.ISF.Simulator.isFullSim() and prevFlags.Sim.LArParameterization!=LArParameterization.FastCaloSim:
212 doID = False
213 doITk = False
214 doCALO = False
215 doMUON = False
216 elif prevFlags.Sim.ISF.Simulator.usesFatras() and prevFlags.Sim.ISF.Simulator.usesFastCaloSim():
217 doID = True
218 doITk = True
219 doCALO = True
220 doMUON = True
221 elif prevFlags.Sim.ISF.Simulator.usesFastCaloSim() or prevFlags.Sim.LArParameterization is LArParameterization.FastCaloSim:
222 doID = False
223 doITk = False
224 doCALO = True
225 doMUON = False
226 elif prevFlags.Sim.ISF.Simulator in [SimulationFlavour.Unknown]:
227 doID = True
228 doITk = True
229 doCALO = True
230 doMUON = True
231 else:
232 raise ValueError("Invalid simulator")
233 return {"ID": doID, "CALO": doCALO, "MUON": doMUON, "ITk": doITk}
234
235 scf.addFlag("Sim.ISF.HITSMergingRequired", _decideHITSMerging)
236
237 # FastCalo
238 scf.addFlag("Sim.FastCalo.ParamsInputFilename", "FastCaloSim/MC23/TFCSparam_AF3_MC23_Sep23.root") # filename of the input parametrizations file
239 scf.addFlag("Sim.FastCalo.RunOnGPU", False) # Determines if run the FastCaloSim on GPU or not
240 scf.addFlag("Sim.FastCalo.CaloCellsName", "AllCalo") # StoreGate collection name for FastCaloSim hits
241 scf.addFlag("Sim.FastCalo.doPunchThrough", lambda prevFlags:
242 prevFlags.Sim.LArParameterization is LArParameterization.FastCaloSim)
243
244 # FastChain
245 # Setting the BCID for Out-of-Time PU events, list of int
246 scf.addFlag("Sim.FastChain.BCID", [1])
247 # weights for Out-of-Time PU events
248 scf.addFlag("Sim.FastChain.PUWeights_lar_em", [1.0]) # LAr EM
249 scf.addFlag("Sim.FastChain.PUWeights_lar_hec", [1.0]) # LAr HEC
250 scf.addFlag("Sim.FastChain.PUWeights_lar_bapre", [1.0]) # LAr Barrel presampler
251 scf.addFlag("Sim.FastChain.PUWeights_tile", [1.0]) # Tile
252
253 # Fatras
254 scf.addFlag("Sim.Fatras.RandomStreamName", "FatrasRnd")
255 scf.addFlag("Sim.Fatras.G4RandomStreamName", "FatrasG4")
256 scf.addFlag("Sim.Fatras.TrkExRandomStreamName", "TrkExRnd")
257 # Fatras fine tuning
258 scf.addFlag("Sim.Fatras.MomCutOffSec", 50.) # common momentum cut-off for secondaries
259 scf.addFlag("Sim.Fatras.HadronIntProb", 1.) # hadronic interaction scale factor
260 scf.addFlag("Sim.Fatras.GaussianMixtureModel", True) # use Gaussian mixture model for Multiple Scattering
261 scf.addFlag("Sim.Fatras.BetheHeitlerScale", 1.) # scale to Bethe-Heitler contribution
262
263 scf.addFlag("Sim.BeamPipeCut", 100.0)
264 scf.addFlag("Sim.TightMuonStepping", False)
265
266 scf.addFlag('Sim.GenerationConfiguration', 'NONE') # TODO replace this property with something more central for all Generator configuration
267
268 return scf
269
270
271def simulationRunArgsToFlags(runArgs, flags):
272 """Fill simulation configuration flags from run arguments."""
273 if hasattr(runArgs, "DataRunNumber"):
274 flags.Input.RunNumbers = [runArgs.DataRunNumber]
275 flags.Input.OverrideRunNumber = True
276 flags.Input.LumiBlockNumbers = [1] # dummy value
277
278 if hasattr(runArgs, "jobNumber"):
279 flags.Input.JobNumber = runArgs.jobNumber
280
281 if hasattr(runArgs, "physicsList"):
282 flags.Sim.PhysicsList = runArgs.physicsList
283
284 if hasattr(runArgs, "truthStrategy"):
285 flags.Sim.TruthStrategy = TruthStrategy(runArgs.truthStrategy)
286
287 if hasattr(runArgs, "useG4Workers"):
288 flags.Sim.UseG4Workers = runArgs.useG4Workers
289
290 # Not used as deprecated
291 # '--enableLooperKiller'
292 # '--perfmon'
293 # '--randomSeed'
294 # '--useISF'
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:130
simulationRunArgsToFlags(runArgs, flags)