39 job_config = flags.Generator.jobConfig
40 if isinstance(job_config, str):
41 job_config = [job_config]
42 if len(job_config) != 1:
43 raise RuntimeError(
"You must supply one and only one jobConfig file argument")
45 evgenLog.info(
"Using JOBOPTSEARCHPATH (as seen in skeleton) = {}".format(os.environ[
"JOBOPTSEARCHPATH"]))
47 FIRST_DIR = (os.environ[
"JOBOPTSEARCHPATH"]).
split(
":")[0]
50 jofiles = [f
for f
in os.listdir(FIRST_DIR)
if (f.startswith(
"mc")
and f.endswith(
".py"))]
52 raise RuntimeError(
"You must supply one and only one jobOption file in DSID directory")
56 from GeneratorConfig.GenConfigHelpers
import (
69 spec = importlib.util.spec_from_file_location(
71 location=os.path.join(FIRST_DIR,jofile),
73 jo = importlib.util.module_from_spec(spec)
75 spec.loader.exec_module(jo)
76 evgenLog.info(f
"including file {jofile}")
79 sample = jo.Sample(flags)
82 sample.setupFlags(flags)
88 dsid = os.path.basename(job_config[0])
89 if dsid.startswith(
"Test"):
90 dsid = dsid.split(
"Test")[-1]
94 flags.Generator.DSID = int(dsid)
97 if not sample.nEventsPerJob:
98 evgenLog.info(
"#############################################################")
99 evgenLog.info(
" !!!! no sample.nEventsPerJob set !!!")
100 evgenLog.info(
"#############################################################")
103 checkNEventsPerJob(sample)
104 evgenLog.info(
" nEventsPerJob = " + str(sample.nEventsPerJob))
105 flags.Generator.nEventsPerJob = sample.nEventsPerJob
108 _validate_sample_properties(sample)
111 flags.Generator.inputFilesPerJob = sample.inputFilesPerJob
112 flags.Generator.MEgenerator = sample.MEgenerator
or ""
115 for var, value
in vars(sample).items():
116 evgenLog.info(
"MetaData: {} = {}".format(var, value))
119 if hasattr(sample,
"keywords"):
120 checkKeywords(sample, evgenLog)
123 if hasattr(sample,
"categories"):
124 checkCategories(sample, evgenLog)
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"]
158 evgenLog.info(
"****************** STARTING EVENT GENERATION *****************")
160 evgenLog.info(
"**** Transformation run arguments")
161 evgenLog.info(runArgs)
163 evgenLog.info(
"**** Setting-up configuration flags")
165 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
166 flags = initConfigFlags()
168 from AthenaConfiguration.Enums
import ProductionStep
169 flags.Common.ProductionStep = ProductionStep.Generation
172 from PyJobTransforms.CommonRunArgsToFlags
import commonRunArgsToFlags
173 commonRunArgsToFlags(runArgs, flags)
176 from GeneratorConfig.GeneratorConfigFlags
import generatorRunArgsToFlags
177 generatorRunArgsToFlags(runArgs, flags)
187 flags.Output.EVNTFileName
188 or getattr(runArgs,
"outputEVNTFile",
None)
189 or getattr(runArgs,
"outputEVNT_PreFile",
None)
191 flags.Output.EVNTFileName = output_pool_file
or ""
193 flags.Output.TXTFileName
194 or getattr(runArgs,
"outputTXTFile",
None)
196 flags.Output.TXTFileName = output_txt_file
or ""
200 txt_only_mode = _is_txt_only_run(flags)
201 if not output_pool_file
and not (flags.Generator.outputYODAFile
or txt_only_mode):
202 raise RuntimeError(
"No output evgen EVNT or EVNT_Pre file provided.")
205 flags.Exec.FirstEvent = flags.Generator.firstEvent
208 flags.Input.isMC =
True
212 if hasattr(runArgs,
"inputEVNT_PreFile")
and runArgs.inputEVNT_PreFile:
213 flags.Input.Files = runArgs.inputEVNT_PreFile
215 flags.Input.Files = []
217 if not flags.Input.Files:
218 flags.Input.Files = []
219 flags.Input.RunNumbers = [flags.Generator.DSID]
220 flags.Input.TimeStamps = [0]
222 flags.PerfMon.doFastMonMT =
True
223 flags.PerfMon.doFullMonMT =
True
226 processPreInclude(runArgs, flags)
229 processPreExec(runArgs, flags)
234 evgenLog.info(
"**** Configuration flags")
238 flags.dump(
"Generator.*")
241 evgenLog.info(
".transform = Gen_tf")
242 evgenLog.info(
".platform = " + str(os.environ[
"BINARY_TAG"]))
245 evgenLog.info(
"**** Configuring event generation")
248 from AthenaConfiguration.MainServicesConfig
import MainEvgenServicesCfg
249 cfg = MainEvgenServicesCfg(flags, withSequences=
True)
253 cfg.setAppProperty(
"EvtMax", -1, overwrite=
True)
256 if flags.Input.Files
and not txt_only_mode:
257 from AthenaPoolCnvSvc.PoolReadConfig
import PoolReadCfg
258 cfg.merge(PoolReadCfg(flags))
261 from xAODEventInfoCnv.xAODEventInfoCnvConfig
import EventInfoCnvAlgCfg
262 cfg.merge(EventInfoCnvAlgCfg(flags, disableBeamSpot=
True, xAODKey=
"TMPEvtInfo"),
263 sequenceName=EvgenSequence.Generator.value)
266 cfg.merge(sample.setupProcess(flags))
269 from GeneratorConfig.GenConfigHelpers
import gen_sortkey
270 from GeneratorConfig.Versioning
import generatorsGetInitialVersionedDictionary, generatorsVersionedStringList
271 if not flags.Input.Files:
272 generators = sorted(cfg.getService(
"GeneratorInfoSvc").Generators, key=gen_sortkey)
273 gendict = generatorsGetInitialVersionedDictionary(generators)
274 generatorsWithVersion = generatorsVersionedStringList(gendict)
278 generatorsWithVersion = []
281 from GeneratorConfig.GenConfigHelpers
import gen_require_steering
282 if gen_require_steering(generators):
283 if hasattr(runArgs,
"outputEVNTFile")
and not hasattr(runArgs,
"outputEVNT_PreFile"):
284 raise RuntimeError(
"'EvtGen' found in job options name, please set '--steering=afterburn'")
288 if flags.Generator.inputFilesPerJob > 0:
289 if not flags.Generator.inputGeneratorFile:
290 raise RuntimeError(f
"Sample sets inputFilesPerJob = {flags.Generator.inputFilesPerJob} but Gen_tf run without inputGeneratorFile")
292 nEventsLHE = _handle_input_files(generators, flags)
297 if blError
is not None:
298 raise RuntimeError(blError)
299 if plError
is not None:
300 evgenLog.warning(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
301 evgenLog.warning(f
"!!! WARNING {plError} !!!")
302 evgenLog.warning(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
305 if not txt_only_mode
and not flags.Input.Files:
306 from EvgenProdTools.EvgenProdToolsConfig
import FixHepMCCfg
307 from GeneratorConfig.GenConfigHelpers
import gens_purgenoendvtx
308 generatorsList = generators.copy()
309 if "Pythia8" in generatorsList:
310 pythia8Alg = cfg.getEventAlgo(
"Pythia8_i")
311 if pythia8Alg.Beam1 !=
"PROTON" or pythia8Alg.Beam2 !=
"PROTON":
313 generatorsList.append(
"Pythia8-Angantyr")
314 cfg.merge(FixHepMCCfg(flags,
315 PurgeUnstableWithoutEndVtx=gens_purgenoendvtx(generatorsList)))
319 if output_pool_file
and not flags.Input.Files:
320 from EvgenProdTools.EvgenProdToolsConfig
import GenWeightDeclarationCfg
321 cfg.merge(GenWeightDeclarationCfg(flags))
324 from GeneratorConfig.GenConfigHelpers
import gens_testhepmc
325 if not txt_only_mode
and gens_testhepmc(generators):
326 from EvgenProdTools.EvgenProdToolsConfig
import TestHepMCCfg
327 cfg.merge(TestHepMCCfg(flags))
331 if not txt_only_mode:
332 from EvgenProdTools.EvgenProdToolsConfig
import CopyEventWeightCfg
333 cfg.merge(CopyEventWeightCfg(flags))
335 from EvgenProdTools.EvgenProdToolsConfig
import FillFilterValuesCfg
336 cfg.merge(FillFilterValuesCfg(flags))
339 from EvgenProdTools.EvgenProdToolsConfig
import CountHepMCCfg
341 1
if txt_only_mode
else
342 (sample.nEventsPerJob
if flags.Exec.MaxEvents == -1
else flags.Exec.MaxEvents)
344 count_kwargs = {
"RequestedOutput": requested_output}
348 count_kwargs[
"CorrectHepMC"] =
False
349 count_kwargs[
"CorrectEventID"] =
False
350 count_kwargs[
"CorrectRunNumber"] =
False
351 count_kwargs[
"CopyRunNumber"] =
False
352 count_kwargs[
"InputEventInfo"] =
""
353 count_kwargs[
"OutputEventInfo"] =
""
354 count_kwargs[
"mcEventWeightsKey"] =
""
355 cfg.merge(CountHepMCCfg(flags, **count_kwargs))
356 evgenLog.info(f
"Requested output events = {cfg.getEventAlgo('CountHepMC').RequestedOutput}")
359 if not txt_only_mode
and flags.Generator.printEvts > 0:
360 from TruthIO.TruthIOConfig
import PrintMCCfg
361 cfg.merge(PrintMCCfg(flags,
362 LastEvent=flags.Generator.printEvts))
365 from PerfMonComps.PerfMonCompsConfig
import PerfMonMTSvcCfg
366 cfg.merge(PerfMonMTSvcCfg(flags), sequenceName=EvgenSequence.Post.value)
369 if not txt_only_mode:
370 from EvgenProdTools.EvgenProdToolsConfig
import SimTimeEstimateCfg
371 cfg.merge(SimTimeEstimateCfg(flags))
376 from EventInfoMgt.TagInfoMgrConfig
import TagInfoMgrCfg
377 from GeneratorConfig.GenConfigHelpers
import gen_lhef
379 "project_name":
"IS_SIMULATION",
380 f
"AtlasRelease_{runArgs.trfSubstepName}": flags.Input.Release
or "n/a",
381 "beam_energy": str(int(flags.Beam.Energy)),
382 "beam_type": flags.Beam.Type.value,
383 "hepmc_version": f
"HepMC{os.environ['HEPMCVER']}",
384 "keywords":
", ".join(sample.keywords).lower(),
385 "lhefGenerator":
'+'.join(filter(gen_lhef, generators)),
386 "mc_channel_number": str(flags.Generator.DSID),
388 if not flags.Input.Files:
390 "generators":
'+'.join(generatorsWithVersion),
391 "tune": cfg.getService(
"GeneratorInfoSvc").Tune
393 if hasattr(sample,
"process"): metadata.update({
"evgenProcess": sample.process})
394 if hasattr(sample,
"tune"): metadata.update({
"evgenTune": sample.tune})
395 if hasattr(sample,
"hadronizationModel"): metadata.update({
"hadronizationModel": sample.hadronizationModel})
396 if hasattr(sample,
"partonShowerModel"): metadata.update({
"partonShowerModel": sample.partonShowerModel})
397 if hasattr(sample,
"specialConfig"): metadata.update({
"specialConfiguration": sample.specialConfig})
398 if hasattr(sample,
"hardPDF"): metadata.update({
"hardPDF": sample.hardPDF})
399 if hasattr(sample,
"softPDF"): metadata.update({
"softPDF": sample.softPDF})
400 if hasattr(sample,
"randomSeed"): metadata.update({
"randomSeed": str(flags.Random.SeedOffset)})
401 cfg.merge(TagInfoMgrCfg(flags, tagValuePairs=metadata))
404 evgenLog.info(f
"HepMC version {os.environ['HEPMCVER']}")
405 if not flags.Input.Files:
406 evgenLog.info(f
"MetaData: generatorTune = {cfg.getService('GeneratorInfoSvc').Tune}")
407 evgenLog.info(
"MetaData: generatorName = {}".format(generatorsWithVersion))
408 if nEventsLHE
is not None:
409 print(f
"MetaData: Number of input LHE events = {nEventsLHE}")
412 for candidate
in (flags.Output.TXTFileName,
"events.lhe"):
413 if candidate
and os.path.exists(candidate):
414 produced_lhe = candidate
417 nEventsTXT = _count_lhe_events(produced_lhe)
418 print(f
"MetaData: Number of produced LHE events = {nEventsTXT}")
422 from EventBookkeeperTools.EventBookkeeperToolsConfig
import AllWrittenEventsCounterAlgCfg
423 cfg.merge(AllWrittenEventsCounterAlgCfg(flags))
426 from OutputStreamAthenaPool.OutputStreamConfig
import OutputStreamCfg
427 cfg.merge(OutputStreamCfg(flags,
"EVNT", [
"McEventCollection#*"],
428 MetadataItemList=[
"IOVMetaDataContainer#*"]))
431 from AthenaConfiguration.Enums
import MetadataCategory
432 from xAODMetaDataCnv.InfileMetaDataConfig
import SetupMetaDataForStreamCfg
433 cfg.merge(SetupMetaDataForStreamCfg(flags,
"EVNT",
434 createMetadata=[MetadataCategory.CutFlowMetaData,
435 MetadataCategory.TruthMetaData]))
438 processPostInclude(runArgs, flags, cfg)
441 processPostExec(runArgs, flags, cfg)
444 from PyUtils.AMITagHelperConfig
import AMITagCfg
445 cfg.merge(AMITagCfg(flags, runArgs))
449 cfg.getSequence(
"AthAlgSeq").IgnoreFilterPassed =
False
452 cfg.printConfig(prefix=
"Gen_tf", printSequenceTreeOnly=
not runArgs.VERBOSE)
455 sys.exit(
not cfg.run().isSuccess())