152def fromRunArgs(runArgs):
153
154 d = release_metadata()
155 evgenLog.info("using release [%(project name)s-%(release)s] [%(platform)s] [%(nightly name)s/%(nightly release)s] -- built on [%(date)s]", d)
156 athenaRel = d["release"]
157
158 evgenLog.info("****************** STARTING EVENT GENERATION *****************")
159
160 evgenLog.info("**** Transformation run arguments")
161 evgenLog.info(runArgs)
162
163 evgenLog.info("**** Setting-up configuration flags")
164
165 from AthenaConfiguration.AllConfigFlags import initConfigFlags
166 flags = initConfigFlags()
167
168 from AthenaConfiguration.Enums import ProductionStep
169 flags.Common.ProductionStep = ProductionStep.Generation
170
171
172 from PyJobTransforms.CommonRunArgsToFlags import commonRunArgsToFlags
173 commonRunArgsToFlags(runArgs, flags)
174
175
176 from GeneratorConfig.GeneratorConfigFlags import generatorRunArgsToFlags
177 generatorRunArgsToFlags(runArgs, flags)
178
179
180 flags.fillFromArgs()
181
182
183 requested_max_events = flags.Exec.MaxEvents
184
185
186 sample = setupSample(flags)
187
188
189 output_pool_file = (
190 flags.Output.EVNTFileName
191 or getattr(runArgs, "outputEVNTFile", None)
192 or getattr(runArgs, "outputEVNT_PreFile", None)
193 )
194 flags.Output.EVNTFileName = output_pool_file or ""
195 output_txt_file = (
196 flags.Output.TXTFileName
197 or getattr(runArgs, "outputTXTFile", None)
198 )
199 flags.Output.TXTFileName = output_txt_file or ""
200
201
202
203 txt_only_mode = _is_txt_only_run(flags)
204 if not output_pool_file and not (flags.Generator.outputYODAFile or txt_only_mode):
205 raise RuntimeError("No output evgen EVNT or EVNT_Pre file provided.")
206
207
208 flags.Exec.FirstEvent = flags.Generator.firstEvent
209
210
211
212 if hasattr(runArgs, "inputEVNT_PreFile") and runArgs.inputEVNT_PreFile:
213 flags.Input.Files = runArgs.inputEVNT_PreFile
214 else:
215 flags.Input.Files = []
216
217 if not flags.Input.Files:
218 flags.Input.Files = []
219 flags.Input.RunNumbers = [flags.Generator.DSID]
220 flags.Input.TimeStamps = [0]
221
222 flags.PerfMon.doFastMonMT = True
223 flags.PerfMon.doFullMonMT = True
224
225
226 processPreInclude(runArgs, flags)
227
228
229 processPreExec(runArgs, flags)
230
231
232 flags.lock()
233
234 evgenLog.info("**** Configuration flags")
235 if runArgs.VERBOSE:
236 flags.dump()
237 else:
238 flags.dump("Generator.*")
239
240
241 evgenLog.info(".transform = Gen_tf")
242 evgenLog.info(".platform = " + str(os.environ["BINARY_TAG"]))
243
244
245 evgenLog.info("**** Configuring event generation")
246
247
248 from AthenaConfiguration.MainServicesConfig import MainEvgenServicesCfg
249 cfg = MainEvgenServicesCfg(flags, withSequences=True)
250
251
252 if flags.Input.Files and not txt_only_mode:
253 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
254 cfg.merge(PoolReadCfg(flags))
255
256
257 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoCnvAlgCfg
258 cfg.merge(EventInfoCnvAlgCfg(flags, disableBeamSpot=True, xAODKey="TMPEvtInfo"),
259 sequenceName=EvgenSequence.Generator.value)
260
261
262 cfg.merge(sample.setupProcess(flags))
263
264
265 from GeneratorConfig.GenConfigHelpers import gen_sortkey
266 from GeneratorConfig.Versioning import generatorsGetInitialVersionedDictionary, generatorsVersionedStringList
267 generators = sorted(cfg.getService("GeneratorInfoSvc").Generators, key=gen_sortkey)
268 gendict = generatorsGetInitialVersionedDictionary(generators)
269 generatorsWithVersion = generatorsVersionedStringList(gendict)
270
271
272 from GeneratorConfig.GenConfigHelpers import gen_require_steering
273 if gen_require_steering(generators):
274 if hasattr(runArgs, "outputEVNTFile") and not hasattr(runArgs, "outputEVNT_PreFile"):
275 raise RuntimeError("'EvtGen' found in job options name, please set '--steering=afterburn'")
276
277
278 nEventsLHE = None
279 if flags.Generator.inputFilesPerJob > 0:
280 if not flags.Generator.inputGeneratorFile:
281 raise RuntimeError(f"Sample sets inputFilesPerJob = {flags.Generator.inputFilesPerJob} but Gen_tf run without inputGeneratorFile")
282 else:
283 nEventsLHE = _handle_input_files(generators, flags)
284
285
286 blError = checkBlackList(athenaRel, generators, "black")
287 plError = checkBlackList(athenaRel, generators, "purple")
288 if blError is not None:
289 raise RuntimeError(blError)
290 if plError is not None:
291 evgenLog.warning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
292 evgenLog.warning(f"!!! WARNING {plError} !!!")
293 evgenLog.warning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
294
295
296 if not txt_only_mode and not flags.Input.Files:
297 from EvgenProdTools.EvgenProdToolsConfig import FixHepMCCfg
298 from GeneratorConfig.GenConfigHelpers import gens_purgenoendvtx
299 generatorsList = generators.copy()
300 if "Pythia8" in generatorsList:
301 pythia8Alg = cfg.getEventAlgo("Pythia8_i")
302 if pythia8Alg.Beam1 != "PROTON" or pythia8Alg.Beam2 != "PROTON":
303
304 generatorsList.append("Pythia8-Angantyr")
305 cfg.merge(FixHepMCCfg(flags,
306 PurgeUnstableWithoutEndVtx=gens_purgenoendvtx(generatorsList)))
307
308
309 from GeneratorConfig.GenConfigHelpers import gens_testhepmc
310 if not txt_only_mode and gens_testhepmc(generators):
311 from EvgenProdTools.EvgenProdToolsConfig import TestHepMCCfg
312 cfg.merge(TestHepMCCfg(flags))
313
314
315
316 if not txt_only_mode:
317 from EvgenProdTools.EvgenProdToolsConfig import CopyEventWeightCfg
318 cfg.merge(CopyEventWeightCfg(flags))
319
320 from EvgenProdTools.EvgenProdToolsConfig import FillFilterValuesCfg
321 cfg.merge(FillFilterValuesCfg(flags))
322
323
324 from EvgenProdTools.EvgenProdToolsConfig import CountHepMCCfg
325 requested_output = (
326 1 if txt_only_mode else
327 (sample.nEventsPerJob if requested_max_events == -1 else requested_max_events)
328 )
329 count_kwargs = {"RequestedOutput": requested_output}
330 if txt_only_mode:
331
332
333 count_kwargs["CorrectHepMC"] = False
334 count_kwargs["CorrectEventID"] = False
335 count_kwargs["CorrectRunNumber"] = False
336 count_kwargs["CopyRunNumber"] = False
337 count_kwargs["InputEventInfo"] = ""
338 count_kwargs["OutputEventInfo"] = ""
339 count_kwargs["mcEventWeightsKey"] = ""
340 cfg.merge(CountHepMCCfg(flags, **count_kwargs))
341 evgenLog.info(f"Requested output events = {cfg.getEventAlgo('CountHepMC').RequestedOutput}")
342
343
344 if not txt_only_mode and flags.Generator.printEvts > 0:
345 from TruthIO.TruthIOConfig import PrintMCCfg
346 cfg.merge(PrintMCCfg(flags,
347 LastEvent=flags.Generator.printEvts))
348
349
350 from PerfMonComps.PerfMonCompsConfig import PerfMonMTSvcCfg
351 cfg.merge(PerfMonMTSvcCfg(flags), sequenceName=EvgenSequence.Post.value)
352
353
354 if not txt_only_mode:
355 from EvgenProdTools.EvgenProdToolsConfig import SimTimeEstimateCfg
356 cfg.merge(SimTimeEstimateCfg(flags))
357
358
359
360
361 from EventInfoMgt.TagInfoMgrConfig import TagInfoMgrCfg
362 from GeneratorConfig.GenConfigHelpers import gen_lhef
363 metadata = {
364 "project_name": "IS_SIMULATION",
365 f"AtlasRelease_{runArgs.trfSubstepName}": flags.Input.Release or "n/a",
366 "beam_energy": str(int(flags.Beam.Energy)),
367 "beam_type": flags.Beam.Type.value,
368 "generators": '+'.join(generatorsWithVersion),
369 "tune": cfg.getService("GeneratorInfoSvc").Tune,
370 "hepmc_version": f"HepMC{os.environ['HEPMCVER']}",
371 "keywords": ", ".join(sample.keywords).lower(),
372 "lhefGenerator": '+'.join(filter(gen_lhef, generators)),
373 "mc_channel_number": str(flags.Generator.DSID),
374 }
375 if hasattr(sample, "process"): metadata.update({"evgenProcess": sample.process})
376 if hasattr(sample, "specialConfig"): metadata.update({"specialConfiguration": sample.specialConfig})
377 if hasattr(sample, "hardPDF"): metadata.update({"hardPDF": sample.hardPDF})
378 if hasattr(sample, "softPDF"): metadata.update({"softPDF": sample.softPDF})
379 if hasattr(sample, "randomSeed"): metadata.update({"randomSeed": str(flags.Random.SeedOffset)})
380 cfg.merge(TagInfoMgrCfg(flags, tagValuePairs=metadata))
381
382
383 evgenLog.info(f"HepMC version {os.environ['HEPMCVER']}")
384 evgenLog.info(f"MetaData: generatorTune = {cfg.getService('GeneratorInfoSvc').Tune}")
385 evgenLog.info("MetaData: generatorName = {}".format(generatorsWithVersion))
386 if nEventsLHE is not None:
387 print(f
"MetaData: Number of input LHE events = {nEventsLHE}")
388 elif txt_only_mode:
389 produced_lhe = None
390 for candidate in (flags.Output.TXTFileName, "events.lhe"):
391 if candidate and os.path.exists(candidate):
392 produced_lhe = candidate
393 break
394 if produced_lhe:
395 nEventsTXT = _count_lhe_events(produced_lhe)
396 print(f
"MetaData: Number of produced LHE events = {nEventsTXT}")
397
398 if output_pool_file:
399
400 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
401 cfg.merge(OutputStreamCfg(flags, "EVNT", ["McEventCollection#*"]))
402
403
404 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
405 cfg.merge(SetupMetaDataForStreamCfg(flags, "EVNT"))
406
407
408 processPostInclude(runArgs, flags, cfg)
409
410
411 processPostExec(runArgs, flags, cfg)
412
413
414 from PyUtils.AMITagHelperConfig import AMITagCfg
415 cfg.merge(AMITagCfg(flags, runArgs))
416
417
418 cfg.printConfig(prefix="Gen_tf", printSequenceTreeOnly=not runArgs.VERBOSE)
419
420
421 sys.exit(not cfg.run().isSuccess())
void print(char *figname, TCanvas *c1)