298def fromRunArgs(runArgs):
299
300 d = release_metadata()
301 evgenLog.info("using release [%(project name)s-%(release)s] [%(platform)s] [%(nightly name)s/%(nightly release)s] -- built on [%(date)s]", d)
302 athenaRel = d["release"]
303
304 evgenLog.info("****************** STARTING EVENT GENERATION *****************")
305
306 evgenLog.info("**** Transformation run arguments")
307 evgenLog.info(runArgs)
308
309 evgenLog.info("**** Setting-up configuration flags")
310
311 from AthenaConfiguration.AllConfigFlags import initConfigFlags
312 flags = initConfigFlags()
313
314 from AthenaConfiguration.Enums import ProductionStep
315 flags.Common.ProductionStep = ProductionStep.Generation
316
317
318 from PyJobTransforms.CommonRunArgsToFlags import commonRunArgsToFlags
319 commonRunArgsToFlags(runArgs, flags)
320
321
322 from GeneratorConfig.GeneratorConfigFlags import generatorRunArgsToFlags
323 generatorRunArgsToFlags(runArgs, flags)
324
325
326 flags.fillFromArgs()
327
328
329 sample = setupSample(runArgs, flags)
330
331
332 flags.Exec.FirstEvent = runArgs.firstEvent
333
334
335 flags.Exec.MaxEvents = -1
336
337 if hasattr(runArgs, "inputEVNT_PreFile"):
338 flags.Input.Files = runArgs.inputEVNT_PreFile
339 else:
340 flags.Input.Files = []
341 flags.Input.RunNumbers = [flags.Generator.DSID]
342 flags.Input.TimeStamps = [0]
343
344 flags.Output.EVNTFileName = runArgs.outputEVNTFile
345
346 flags.Beam.Energy = runArgs.ecmEnergy / 2 * GeV
347
348 flags.PerfMon.doFastMonMT = True
349 flags.PerfMon.doFullMonMT = True
350
351
352 processPreInclude(runArgs, flags)
353
354
355 processPreExec(runArgs, flags)
356
357
358 flags.lock()
359
360 evgenLog.info("**** Configuration flags")
361 if runArgs.VERBOSE:
362 flags.dump()
363 else:
364 flags.dump("Generator.*")
365
366
367 evgenLog.info(".transform = Gen_tf")
368 evgenLog.info(
".platform = " +
str(os.environ[
"BINARY_TAG"]))
369
370
371 evgenLog.info("**** Configuring event generation")
372
373
374 from AthenaConfiguration.MainServicesConfig import MainEvgenServicesCfg
375 cfg = MainEvgenServicesCfg(flags, withSequences=True)
376
377
378 if flags.Input.Files:
379 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
380 cfg.merge(PoolReadCfg(flags))
381
382
383 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoCnvAlgCfg
384 cfg.merge(EventInfoCnvAlgCfg(flags, disableBeamSpot=True, xAODKey="TMPEvtInfo"),
385 sequenceName=EvgenSequence.Generator.value)
386
387
388 cfg.merge(sample.setupProcess(flags))
389
390
391 from GeneratorConfig.GenConfigHelpers import gen_sortkey
392 from GeneratorConfig.Versioning import generatorsGetInitialVersionedDictionary, generatorsVersionedStringList
393 generators = sorted(cfg.getService("GeneratorInfoSvc").Generators, key=gen_sortkey)
394 gendict = generatorsGetInitialVersionedDictionary(generators)
395 generatorsWithVersion = generatorsVersionedStringList(gendict)
396
397
398 from GeneratorConfig.GenConfigHelpers import gen_require_steering
399 if gen_require_steering(generators):
400 if hasattr(runArgs, "outputEVNTFile") and not hasattr(runArgs, "outputEVNT_PreFile"):
401 raise RuntimeError("'EvtGen' found in job options name, please set '--steering=afterburn'")
402
403
404 if flags.Generator.inputFilesPerJob > 0:
405 if not flags.Generator.inputGeneratorFile:
406 raise RuntimeError(f"Sample sets inputFilesPerJob = {flags.Generator.inputFilesPerJob} but Gen_tf run without inputGeneratorFile")
407 else:
408 nEventsLHE = _handle_input_files(generators, flags)
409
410
411 blError = checkBlackList(athenaRel, generators, "black")
412 plError = checkBlackList(athenaRel, generators, "purple")
413 if blError is not None:
414 raise RuntimeError(blError)
415 if plError is not None:
416 evgenLog.warning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
417 evgenLog.warning(f"!!! WARNING {plError} !!!")
418 evgenLog.warning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
419
420
421 if not flags.Input.Files:
422 from EvgenProdTools.EvgenProdToolsConfig import FixHepMCCfg
423 from GeneratorConfig.GenConfigHelpers import gens_purgenoendvtx
424 generatorsList = generators.copy()
425 if "Pythia8" in generatorsList:
426 pythia8Alg = cfg.getEventAlgo("Pythia8_i")
427 if pythia8Alg.Beam1 != "PROTON" or pythia8Alg.Beam2 != "PROTON":
428
429 generatorsList.append("Pythia8-Angantyr")
430 cfg.merge(FixHepMCCfg(flags,
431 PurgeUnstableWithoutEndVtx=gens_purgenoendvtx(generatorsList)))
432
433
434 from GeneratorConfig.GenConfigHelpers import gens_testhepmc
435 if gens_testhepmc(generators):
436 from EvgenProdTools.EvgenProdToolsConfig import TestHepMCCfg
437 cfg.merge(TestHepMCCfg(flags))
438
439
440 from EvgenProdTools.EvgenProdToolsConfig import CopyEventWeightCfg
441 cfg.merge(CopyEventWeightCfg(flags))
442
443 from EvgenProdTools.EvgenProdToolsConfig import FillFilterValuesCfg
444 cfg.merge(FillFilterValuesCfg(flags))
445
446
447 from EvgenProdTools.EvgenProdToolsConfig import CountHepMCCfg
448 cfg.merge(CountHepMCCfg(flags,
449 RequestedOutput=sample.nEventsPerJob if runArgs.maxEvents == -1
450 else runArgs.maxEvents))
451 evgenLog.info("Requested output events = %d", cfg.getEventAlgo("CountHepMC").RequestedOutput)
452
453
454 if hasattr(runArgs, "printEvts") and runArgs.printEvts > 0:
455 from TruthIO.TruthIOConfig import PrintMCCfg
456 cfg.merge(PrintMCCfg(flags,
457 LastEvent=runArgs.printEvts))
458
459
460 from PerfMonComps.PerfMonCompsConfig import PerfMonMTSvcCfg
461 cfg.merge(PerfMonMTSvcCfg(flags), sequenceName=EvgenSequence.Post.value)
462
463
464 from EvgenProdTools.EvgenProdToolsConfig import SimTimeEstimateCfg
465 cfg.merge(SimTimeEstimateCfg(flags))
466
467
468
469
470 from EventInfoMgt.TagInfoMgrConfig import TagInfoMgrCfg
471 from GeneratorConfig.GenConfigHelpers import gen_lhef
472 metadata = {
473 "project_name": "IS_SIMULATION",
474 f"AtlasRelease_{runArgs.trfSubstepName}": flags.Input.Release or "n/a",
475 "beam_energy":
str(int(flags.Beam.Energy)),
476 "beam_type": flags.Beam.Type.value,
477 "generators": '+'.join(generatorsWithVersion),
478 "tune": cfg.getService("GeneratorInfoSvc").Tune,
479 "hepmc_version": f"HepMC{os.environ['HEPMCVER']}",
480 "keywords": ", ".join(sample.keywords).lower(),
481 "lhefGenerator": '+'.join(filter(gen_lhef, generators)),
482 "mc_channel_number":
str(flags.Generator.DSID),
483 }
484 if hasattr(sample, "process"): metadata.update({"evgenProcess": sample.process})
485 if hasattr(sample, "specialConfig"): metadata.update({"specialConfiguration": sample.specialConfig})
486 if hasattr(sample, "hardPDF"): metadata.update({"hardPDF": sample.hardPDF})
487 if hasattr(sample, "softPDF"): metadata.update({"softPDF": sample.softPDF})
488 if hasattr(sample,
"randomSeed"): metadata.update({
"randomSeed":
str(runArgs.randomSeed)})
489 cfg.merge(TagInfoMgrCfg(flags, tagValuePairs=metadata))
490
491
492 evgenLog.info(f"HepMC version {os.environ['HEPMCVER']}")
493 evgenLog.info(f"MetaData: generatorTune = {cfg.getService('GeneratorInfoSvc').Tune}")
494 evgenLog.info("MetaData: generatorName = {}".format(generatorsWithVersion))
495 if flags.Generator.inputGeneratorFile:
496 print(f
"MetaData: Number of input LHE events = {nEventsLHE}")
497
498
499 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
500 cfg.merge(OutputStreamCfg(flags, "EVNT", ["McEventCollection#*"]))
501
502
503 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
504 cfg.merge(SetupMetaDataForStreamCfg(flags, "EVNT"))
505
506
507 processPostInclude(runArgs, flags, cfg)
508
509
510 processPostExec(runArgs, flags, cfg)
511
512
513 from PyUtils.AMITagHelperConfig import AMITagCfg
514 cfg.merge(AMITagCfg(flags, runArgs))
515
516
517 cfg.printConfig(prefix="Gen_tf", printSequenceTreeOnly=not runArgs.VERBOSE)
518
519
520 sys.exit(not cfg.run().isSuccess())