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, 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 # TRT Range cut used in simulation in mm. Should be 0.05 or 30.
129 scf.addFlag("Sim.TRTRangeCut",
130 lambda prevFlags: float(GetFileMD(prevFlags.Input.Files).get('TRTRangeCut', 30.0)))
131
132 # BeameffectsAlg
133 scf.addFlag("Sim.VertexSource", VertexSource.CondDB, type=VertexSource)
134 scf.addFlag("Sim.VertexTimeSmearing", lambda prevFlags:
135 prevFlags.Beam.Type == BeamType.Collisions and prevFlags.GeoModel.Run >= LHCPeriod.Run4)
136
137 def _checkVertexTimeWidth(prevFlags):
138 default = 0.175*ns
139 vertexTimeWidth = default
140 if prevFlags.Input.Files:
141 vertexTimeWidth = GetFileMD(prevFlags.Input.Files).get("VertexTimeWidth", default)
142 return vertexTimeWidth
143
144 scf.addFlag("Sim.VertexTimeWidth", _checkVertexTimeWidth)
145
146 # G4UserActions
147 scf.addFlag("Sim.NRRThreshold", False)
148 scf.addFlag("Sim.NRRWeight", False)
149 scf.addFlag("Sim.PRRThreshold", False)
150 scf.addFlag("Sim.PRRWeight", False)
151 scf.addFlag("Sim.OptionalUserActionList", [])
152
153 # G4FieldConfig
154 scf.addFlag("Sim.G4Stepper", "AtlasRK4")
155 scf.addFlag("Sim.G4EquationOfMotion", "")
156 scf.addFlag("Sim.UsingGeant4", True)
157
158 # Cosmics
159 # volume(s) used to do cosmics filtering
160 # G4 volume names from {"Muon", "Calo", "InnerDetector", "TRT_Barrel", "TRT_EC", "SCT_Barrel", "Pixel"}
161 scf.addFlag("Sim.CosmicFilterVolumeNames", ["InnerDetector"])
162 scf.addFlag("Sim.CosmicFilterID", False) # PDG ID to be filtered ("13")
163 scf.addFlag("Sim.CosmicFilterPTmin", False) # min pT filtered in cosmics processing (MeV) ("5000")
164 scf.addFlag("Sim.CosmicFilterPTmax", False) # max pT filtered in cosmics processing (MeV) ("6000")
165 scf.addFlag("Sim.CosmicPtSlice", "Off") # 'slice1', 'slice2', 'slice3', 'slice4', 'NONE'
166
167 # ISF
168 scf.addFlag("Sim.ISFRun", False)
169
170 def _checkSimulationFlavour(prevFlags):
171 simulator = SimulationFlavour.Unknown
172 if prevFlags.Input.Files:
173 simFlavour = GetFileMD(prevFlags.Input.Files).get("Simulator", "")
174 if not simFlavour:
175 simFlavour = GetFileMD(prevFlags.Input.Files).get("SimulationFlavour", "")
176 try:
177 simulator = SimulationFlavour(simFlavour)
178 except ValueError:
179 # Deal with old non-thread-safe simulators
180 if simFlavour in ['default']: # This is the case when ISF was not configured in sim
181 simulator = SimulationFlavour.AtlasG4
182 elif simFlavour in ['MC12G4', 'FullG4']:
183 simulator = SimulationFlavour.FullG4MT
184 elif simFlavour in ['FullG4_QS', 'FullG4_LongLived']:
185 simulator = SimulationFlavour.FullG4MT_QS
186 elif simFlavour in ['PassBackG4']:
187 simulator = SimulationFlavour.PassBackG4MT
188 elif simFlavour in ['ATLFASTII']:
189 simulator = SimulationFlavour.ATLFASTIIMT
190 elif simFlavour in ['ATLFASTIIF']:
191 simulator = SimulationFlavour.ATLFASTIIFMT
192 elif simFlavour in ['ATLFAST3']:
193 simulator = SimulationFlavour.ATLFAST3MT
194 elif simFlavour in ['ATLFAST3_QS']:
195 simulator = SimulationFlavour.ATLFAST3MT_QS
196 else:
197 # Obscure old-style configuration used - do not try to interpret
198 simulator = SimulationFlavour.Unknown
199 return simulator
200
201 scf.addFlag("Sim.ISF.Simulator", _checkSimulationFlavour, type=SimulationFlavour)
202 scf.addFlag("Sim.ISF.DoTimeMonitoring", True) # bool: run time monitoring
203 scf.addFlag("Sim.ISF.DoMemoryMonitoring", True) # bool: run time monitoring
204 scf.addFlag("Sim.ISF.ValidationMode", False) # bool: run ISF internal validation checks
205 scf.addFlag("Sim.ISF.ReSimulation", False) # Using ReSimulation workflow
206 scf.addFlag("Sim.ISF.UseTrackingGeometryCond", False) # Using Condition for tracking Geometry
207
208 def _decideHITSMerging(prevFlags):
209 # Further specialization possible in future
210 if prevFlags.Sim.ISF.Simulator.isFullSim() and prevFlags.Sim.LArParameterization!=LArParameterization.FastCaloSim:
211 doID = False
212 doITk = False
213 doCALO = False
214 doMUON = False
215 elif prevFlags.Sim.ISF.Simulator.usesFatras() and prevFlags.Sim.ISF.Simulator.usesFastCaloSim():
216 doID = True
217 doITk = True
218 doCALO = True
219 doMUON = True
220 elif prevFlags.Sim.ISF.Simulator.usesFastCaloSim() or prevFlags.Sim.LArParameterization is LArParameterization.FastCaloSim:
221 doID = False
222 doITk = False
223 doCALO = True
224 doMUON = False
225 elif prevFlags.Sim.ISF.Simulator in [SimulationFlavour.Unknown]:
226 doID = True
227 doITk = True
228 doCALO = True
229 doMUON = True
230 else:
231 raise ValueError("Invalid simulator")
232 return {"ID": doID, "CALO": doCALO, "MUON": doMUON, "ITk": doITk}
233
234 scf.addFlag("Sim.ISF.HITSMergingRequired", _decideHITSMerging)
235
236 # FastCalo
237 scf.addFlag("Sim.FastCalo.ParamsInputFilename", "FastCaloSim/MC23/TFCSparam_AF3_MC23_Sep23.root") # filename of the input parametrizations file
238 scf.addFlag("Sim.FastCalo.RunOnGPU", False) # Determines if run the FastCaloSim on GPU or not
239 scf.addFlag("Sim.FastCalo.CaloCellsName", "AllCalo") # StoreGate collection name for FastCaloSim hits
240 scf.addFlag("Sim.FastCalo.doPunchThrough", lambda prevFlags:
241 prevFlags.Sim.LArParameterization is LArParameterization.FastCaloSim)
242
243 # FastChain
244 # Setting the BCID for Out-of-Time PU events, list of int
245 scf.addFlag("Sim.FastChain.BCID", [1])
246 # weights for Out-of-Time PU events
247 scf.addFlag("Sim.FastChain.PUWeights_lar_em", [1.0]) # LAr EM
248 scf.addFlag("Sim.FastChain.PUWeights_lar_hec", [1.0]) # LAr HEC
249 scf.addFlag("Sim.FastChain.PUWeights_lar_bapre", [1.0]) # LAr Barrel presampler
250 scf.addFlag("Sim.FastChain.PUWeights_tile", [1.0]) # Tile
251
252 # Fatras
253 scf.addFlag("Sim.Fatras.RandomStreamName", "FatrasRnd")
254 scf.addFlag("Sim.Fatras.G4RandomStreamName", "FatrasG4")
255 scf.addFlag("Sim.Fatras.TrkExRandomStreamName", "TrkExRnd")
256 # Fatras fine tuning
257 scf.addFlag("Sim.Fatras.MomCutOffSec", 50.) # common momentum cut-off for secondaries
258 scf.addFlag("Sim.Fatras.HadronIntProb", 1.) # hadronic interaction scale factor
259 scf.addFlag("Sim.Fatras.GaussianMixtureModel", True) # use Gaussian mixture model for Multiple Scattering
260 scf.addFlag("Sim.Fatras.BetheHeitlerScale", 1.) # scale to Bethe-Heitler contribution
261
262 scf.addFlag("Sim.BeamPipeCut", 100.0)
263 scf.addFlag("Sim.TightMuonStepping", False)
264
265 scf.addFlag('Sim.GenerationConfiguration', 'NONE') # TODO replace this property with something more central for all Generator configuration
266
267 return scf
268
269
270def simulationRunArgsToFlags(runArgs, flags):
271 """Fill simulation configuration flags from run arguments."""
272 if hasattr(runArgs, "DataRunNumber"):
273 flags.Input.RunNumbers = [runArgs.DataRunNumber]
274 flags.Input.OverrideRunNumber = True
275 flags.Input.LumiBlockNumbers = [1] # dummy value
276
277 if hasattr(runArgs, "jobNumber"):
278 flags.Input.JobNumber = runArgs.jobNumber
279
280 if hasattr(runArgs, "physicsList"):
281 flags.Sim.PhysicsList = runArgs.physicsList
282
283 if hasattr(runArgs, "truthStrategy"):
284 flags.Sim.TruthStrategy = TruthStrategy(runArgs.truthStrategy)
285
286 if hasattr(runArgs, "useG4Workers"):
287 flags.Sim.UseG4Workers = runArgs.useG4Workers
288
289 # Not used as deprecated
290 # '--enableLooperKiller'
291 # '--perfmon'
292 # '--randomSeed'
293 # '--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)