12def createSimConfigFlags():
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)
27 scf.addFlag("Sim.WorldZRange", False)
28
29 def _barcodeOffsetFromTruthStrategy(prevFlags):
30 if prevFlags.Sim.TruthStrategy in [TruthStrategy.MC15, TruthStrategy.MC18, TruthStrategy.MC18LLP]:
31 return 1000000
32 return 200000
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
46 return 1000000
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
58 scf.addFlag("Sim.SimBarcodeOffset", _checkSimBarcodeOffsetConf)
59
60 scf.addFlag("Sim.RegenerationIncrement", _checkRegenerationIncrementConf)
61
62
63 scf.addFlag("Sim.TwissFileBeam1", False)
64 scf.addFlag("Sim.TwissFileBeam2", False)
65 scf.addFlag("Sim.TwissEnergy", lambda prevFlags : float(prevFlags.Beam.Energy))
66 scf.addFlag("Sim.TwissFileBeta", 90.*m)
67 scf.addFlag("Sim.TwissFileNomReal", 'nominal')
68 scf.addFlag("Sim.TwissFileVersion", "v02")
69
70
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)
82
83
84 scf.addFlag("Sim.DoFullChain", False)
85
86 def _check_G4_version(prevFlags):
87
88
89
90
91
92
93
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
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.)
119 scf.addFlag("Sim.NeutronEnergyCut", -1.)
120 scf.addFlag("Sim.ApplyEMCuts", False)
121 scf.addFlag("Sim.MuonFieldOnlyInCalo", False)
122
123
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
129 scf.addFlag("Sim.TRTRangeCut",
130 lambda prevFlags: float(GetFileMD(prevFlags.Input.Files).
get(
'TRTRangeCut', 30.0)))
131
132
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
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
154 scf.addFlag("Sim.G4Stepper", "AtlasRK4")
155 scf.addFlag("Sim.G4EquationOfMotion", "")
156 scf.addFlag("Sim.UsingGeant4", True)
157
158
159
160
161 scf.addFlag("Sim.CosmicFilterVolumeNames", ["InnerDetector"])
162 scf.addFlag("Sim.CosmicFilterID", False)
163 scf.addFlag("Sim.CosmicFilterPTmin", False)
164 scf.addFlag("Sim.CosmicFilterPTmax", False)
165 scf.addFlag("Sim.CosmicPtSlice", "Off")
166
167
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
180 if simFlavour in ['default']:
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
198 simulator = SimulationFlavour.Unknown
199 return simulator
200
201 scf.addFlag("Sim.ISF.Simulator", _checkSimulationFlavour, type=SimulationFlavour)
202 scf.addFlag("Sim.ISF.DoTimeMonitoring", True)
203 scf.addFlag("Sim.ISF.DoMemoryMonitoring", True)
204 scf.addFlag("Sim.ISF.ValidationMode", False)
205 scf.addFlag("Sim.ISF.ReSimulation", False)
206 scf.addFlag("Sim.ISF.UseTrackingGeometryCond", False)
207
208 def _decideHITSMerging(prevFlags):
209
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
237 scf.addFlag("Sim.FastCalo.ParamsInputFilename", "FastCaloSim/MC23/TFCSparam_AF3_MC23_Sep23.root")
238 scf.addFlag("Sim.FastCalo.RunOnGPU", False)
239 scf.addFlag("Sim.FastCalo.CaloCellsName", "AllCalo")
240 scf.addFlag("Sim.FastCalo.doPunchThrough", lambda prevFlags:
241 prevFlags.Sim.LArParameterization is LArParameterization.FastCaloSim)
242
243
244
245 scf.addFlag("Sim.FastChain.BCID", [1])
246
247 scf.addFlag("Sim.FastChain.PUWeights_lar_em", [1.0])
248 scf.addFlag("Sim.FastChain.PUWeights_lar_hec", [1.0])
249 scf.addFlag("Sim.FastChain.PUWeights_lar_bapre", [1.0])
250 scf.addFlag("Sim.FastChain.PUWeights_tile", [1.0])
251
252
253 scf.addFlag("Sim.Fatras.RandomStreamName", "FatrasRnd")
254 scf.addFlag("Sim.Fatras.G4RandomStreamName", "FatrasG4")
255 scf.addFlag("Sim.Fatras.TrkExRandomStreamName", "TrkExRnd")
256
257 scf.addFlag("Sim.Fatras.MomCutOffSec", 50.)
258 scf.addFlag("Sim.Fatras.HadronIntProb", 1.)
259 scf.addFlag("Sim.Fatras.GaussianMixtureModel", True)
260 scf.addFlag("Sim.Fatras.BetheHeitlerScale", 1.)
261
262 scf.addFlag("Sim.BeamPipeCut", 100.0)
263 scf.addFlag("Sim.TightMuonStepping", False)
264
265 scf.addFlag('Sim.GenerationConfiguration', 'NONE')
266
267 return scf
268
269
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)