126def fromRunArgs(runArgs):
127
128 d = release_metadata()
129 evgenLog.info("using release [%(project name)s-%(release)s] [%(platform)s] [%(nightly name)s/%(nightly release)s] -- built on [%(date)s]", d)
130 athenaRel = d["release"]
131
132 evgenLog.info("****************** STARTING EVENT GENERATION *****************")
133
134 evgenLog.info("**** Transformation run arguments")
135 evgenLog.info(runArgs)
136
137 evgenLog.info("**** Setting-up configuration flags")
138
139 from AthenaConfiguration.AllConfigFlags import initConfigFlags
140 flags = initConfigFlags()
141
142 from AthenaConfiguration.Enums import ProductionStep
143 flags.Common.ProductionStep = ProductionStep.Generation
144
145
146 from PyJobTransforms.CommonRunArgsToFlags import commonRunArgsToFlags
147 commonRunArgsToFlags(runArgs, flags)
148
149
150 from GeneratorConfig.GeneratorConfigFlags import generatorRunArgsToFlags
151 generatorRunArgsToFlags(runArgs, flags)
152
153
154 flags.fillFromArgs()
155
156
157 sample = setupSample(runArgs, flags)
158
159
160 flags.Exec.FirstEvent = runArgs.firstEvent
161
162
163 flags.Exec.MaxEvents = -1
164
165 if hasattr(runArgs, "inputEVNT_PreFile"):
166 flags.Input.Files = runArgs.inputEVNT_PreFile
167 else:
168 flags.Input.Files = []
169 flags.Input.RunNumbers = [flags.Generator.DSID]
170 flags.Input.TimeStamps = [0]
171
172 flags.Output.EVNTFileName = runArgs.outputEVNTFile
173
174 flags.Beam.Energy = runArgs.ecmEnergy / 2 * GeV
175
176 flags.PerfMon.doFastMonMT = True
177 flags.PerfMon.doFullMonMT = True
178
179
180 processPreInclude(runArgs, flags)
181
182
183 processPreExec(runArgs, flags)
184
185
186 flags.lock()
187
188 evgenLog.info("**** Configuration flags")
189 if runArgs.VERBOSE:
190 flags.dump()
191 else:
192 flags.dump("Generator.*")
193
194
195 evgenLog.info(".transform = Gen_tf")
196 evgenLog.info(".platform = " + str(os.environ["BINARY_TAG"]))
197
198
199 evgenLog.info("**** Configuring event generation")
200
201
202 from AthenaConfiguration.MainServicesConfig import MainEvgenServicesCfg
203 cfg = MainEvgenServicesCfg(flags, withSequences=True)
204
205
206 if flags.Input.Files:
207 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
208 cfg.merge(PoolReadCfg(flags))
209
210
211 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoCnvAlgCfg
212 cfg.merge(EventInfoCnvAlgCfg(flags, disableBeamSpot=True, xAODKey="TMPEvtInfo"),
213 sequenceName=EvgenSequence.Generator.value)
214
215
216 cfg.merge(sample.setupProcess(flags))
217
218
219 from GeneratorConfig.GenConfigHelpers import gen_sortkey
220 from GeneratorConfig.Versioning import generatorsGetInitialVersionedDictionary, generatorsVersionedStringList
221 generators = sorted(cfg.getService("GeneratorInfoSvc").Generators, key=gen_sortkey)
222 gendict = generatorsGetInitialVersionedDictionary(generators)
223 generatorsWithVersion = generatorsVersionedStringList(gendict)
224
225
226 from GeneratorConfig.GenConfigHelpers import gen_require_steering
227 if gen_require_steering(generators):
228 if hasattr(runArgs, "outputEVNTFile") and not hasattr(runArgs, "outputEVNT_PreFile"):
229 raise RuntimeError("'EvtGen' found in job options name, please set '--steering=afterburn'")
230
231
232 blError = checkBlackList(athenaRel, generators, "black")
233 plError = checkBlackList(athenaRel, generators, "purple")
234 if blError is not None:
235 raise RuntimeError(blError)
236 if plError is not None:
237 evgenLog.warning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
238 evgenLog.warning(f"!!! WARNING {plError} !!!")
239 evgenLog.warning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
240
241
242 if not flags.Input.Files:
243 from EvgenProdTools.EvgenProdToolsConfig import FixHepMCCfg
244 from GeneratorConfig.GenConfigHelpers import gens_purgenoendvtx
245 generatorsList = generators.copy()
246 if "Pythia8" in generatorsList:
247 pythia8Alg = cfg.getEventAlgo("Pythia8_i")
248 if pythia8Alg.Beam1 != "PROTON" or pythia8Alg.Beam2 != "PROTON":
249
250 generatorsList.append("Pythia8-Angantyr")
251 cfg.merge(FixHepMCCfg(flags,
252 PurgeUnstableWithoutEndVtx=gens_purgenoendvtx(generatorsList)))
253
254
255 from GeneratorConfig.GenConfigHelpers import gens_testhepmc
256 if gens_testhepmc(generators):
257 from EvgenProdTools.EvgenProdToolsConfig import TestHepMCCfg
258 cfg.merge(TestHepMCCfg(flags))
259
260
261 from EvgenProdTools.EvgenProdToolsConfig import CopyEventWeightCfg
262 cfg.merge(CopyEventWeightCfg(flags))
263
264 from EvgenProdTools.EvgenProdToolsConfig import FillFilterValuesCfg
265 cfg.merge(FillFilterValuesCfg(flags))
266
267
268 from EvgenProdTools.EvgenProdToolsConfig import CountHepMCCfg
269 cfg.merge(CountHepMCCfg(flags,
270 RequestedOutput=sample.nEventsPerJob if runArgs.maxEvents == -1
271 else runArgs.maxEvents))
272 evgenLog.info("Requested output events = %d", cfg.getEventAlgo("CountHepMC").RequestedOutput)
273
274
275 if hasattr(runArgs, "printEvts") and runArgs.printEvts > 0:
276 from TruthIO.TruthIOConfig import PrintMCCfg
277 cfg.merge(PrintMCCfg(flags,
278 LastEvent=runArgs.printEvts))
279
280
281 from PerfMonComps.PerfMonCompsConfig import PerfMonMTSvcCfg
282 cfg.merge(PerfMonMTSvcCfg(flags), sequenceName=EvgenSequence.Post.value)
283
284
285 from EvgenProdTools.EvgenProdToolsConfig import SimTimeEstimateCfg
286 cfg.merge(SimTimeEstimateCfg(flags))
287
288
289
290
291 from EventInfoMgt.TagInfoMgrConfig import TagInfoMgrCfg
292 from GeneratorConfig.GenConfigHelpers import gen_lhef
293 metadata = {
294 "project_name": "IS_SIMULATION",
295 f"AtlasRelease_{runArgs.trfSubstepName}": flags.Input.Release or "n/a",
296 "beam_energy": str(int(flags.Beam.Energy)),
297 "beam_type": flags.Beam.Type.value,
298 "generators": '+'.join(generatorsWithVersion),
299 "tune": cfg.getService("GeneratorInfoSvc").Tune,
300 "hepmc_version": f"HepMC{os.environ['HEPMCVER']}",
301 "keywords": ", ".join(sample.keywords).lower(),
302 "lhefGenerator": '+'.join(filter(gen_lhef, generators)),
303 "mc_channel_number": str(flags.Generator.DSID),
304 }
305 if hasattr(sample, "process"): metadata.update({"evgenProcess": sample.process})
306 if hasattr(sample, "specialConfig"): metadata.update({"specialConfiguration": sample.specialConfig})
307 if hasattr(sample, "hardPDF"): metadata.update({"hardPDF": sample.hardPDF})
308 if hasattr(sample, "softPDF"): metadata.update({"softPDF": sample.softPDF})
309 if hasattr(sample, "randomSeed"): metadata.update({"randomSeed": str(runArgs.randomSeed)})
310 cfg.merge(TagInfoMgrCfg(flags, tagValuePairs=metadata))
311
312
313 evgenLog.info(f"HepMC version {os.environ["HEPMCVER"]}")
314 evgenLog.info(f"MetaData: generatorTune = {cfg.getService("GeneratorInfoSvc").Tune}")
315 evgenLog.info("MetaData: generatorName = {}".format(generatorsWithVersion))
316
317
318 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
319 cfg.merge(OutputStreamCfg(flags, "EVNT", ["McEventCollection#*"]))
320
321
322 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
323 cfg.merge(SetupMetaDataForStreamCfg(flags, "EVNT"))
324
325
326 processPostInclude(runArgs, flags, cfg)
327
328
329 processPostExec(runArgs, flags, cfg)
330
331
332 from PyUtils.AMITagHelperConfig import AMITagCfg
333 cfg.merge(AMITagCfg(flags, runArgs))
334
335
336 cfg.printConfig(prefix="Gen_tf", printSequenceTreeOnly=not runArgs.VERBOSE)
337
338
339 sys.exit(not cfg.run().isSuccess())