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 scf.addFlag("Sim.InDetParameterization", InDetParameterization.NONE, type=InDetParameterization)
129
130 scf.addFlag("Sim.TRTRangeCut",
131 lambda prevFlags: float(GetFileMD(prevFlags.Input.Files).
get(
'TRTRangeCut', 30.0)))
132
133
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
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
155 scf.addFlag("Sim.G4Stepper", "AtlasRK4")
156 scf.addFlag("Sim.G4EquationOfMotion", "")
157 scf.addFlag("Sim.UsingGeant4", True)
158
159
160
161
162 scf.addFlag("Sim.CosmicFilterVolumeNames", ["InnerDetector"])
163 scf.addFlag("Sim.CosmicFilterID", False)
164 scf.addFlag("Sim.CosmicFilterPTmin", False)
165 scf.addFlag("Sim.CosmicFilterPTmax", False)
166 scf.addFlag("Sim.CosmicPtSlice", "Off")
167
168
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
181 if simFlavour in ['default']:
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
199 simulator = SimulationFlavour.Unknown
200 return simulator
201
202 scf.addFlag("Sim.ISF.Simulator", _checkSimulationFlavour, type=SimulationFlavour)
203 scf.addFlag("Sim.ISF.DoTimeMonitoring", True)
204 scf.addFlag("Sim.ISF.DoMemoryMonitoring", True)
205 scf.addFlag("Sim.ISF.ValidationMode", False)
206 scf.addFlag("Sim.ISF.ReSimulation", False)
207 scf.addFlag("Sim.ISF.UseTrackingGeometryCond", False)
208
209 def _decideHITSMerging(prevFlags):
210
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
238 scf.addFlag("Sim.FastCalo.ParamsInputFilename", "FastCaloSim/MC23/TFCSparam_AF3_MC23_Sep23.root")
239 scf.addFlag("Sim.FastCalo.RunOnGPU", False)
240 scf.addFlag("Sim.FastCalo.CaloCellsName", "AllCalo")
241 scf.addFlag("Sim.FastCalo.doPunchThrough", lambda prevFlags:
242 prevFlags.Sim.LArParameterization is LArParameterization.FastCaloSim)
243
244
245
246 scf.addFlag("Sim.FastChain.BCID", [1])
247
248 scf.addFlag("Sim.FastChain.PUWeights_lar_em", [1.0])
249 scf.addFlag("Sim.FastChain.PUWeights_lar_hec", [1.0])
250 scf.addFlag("Sim.FastChain.PUWeights_lar_bapre", [1.0])
251 scf.addFlag("Sim.FastChain.PUWeights_tile", [1.0])
252
253
254 scf.addFlag("Sim.Fatras.RandomStreamName", "FatrasRnd")
255 scf.addFlag("Sim.Fatras.G4RandomStreamName", "FatrasG4")
256 scf.addFlag("Sim.Fatras.TrkExRandomStreamName", "TrkExRnd")
257
258 scf.addFlag("Sim.Fatras.MomCutOffSec", 50.)
259 scf.addFlag("Sim.Fatras.HadronIntProb", 1.)
260 scf.addFlag("Sim.Fatras.GaussianMixtureModel", True)
261 scf.addFlag("Sim.Fatras.BetheHeitlerScale", 1.)
262
263 scf.addFlag("Sim.BeamPipeCut", 100.0)
264 scf.addFlag("Sim.TightMuonStepping", False)
265
266 scf.addFlag('Sim.GenerationConfiguration', 'NONE')
267
268 return scf
269
270
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)