27 if len(runArgs.jobConfig) != 1:
28 raise RuntimeError(
"You must supply one and only one jobConfig file argument")
30 evgenLog.info(
"Using JOBOPTSEARCHPATH (as seen in skeleton) = {}".format(os.environ[
"JOBOPTSEARCHPATH"]))
32 FIRST_DIR = (os.environ[
"JOBOPTSEARCHPATH"]).
split(
":")[0]
35 jofiles = [f
for f
in os.listdir(FIRST_DIR)
if (f.startswith(
"mc")
and f.endswith(
".py"))]
37 raise RuntimeError(
"You must supply one and only one jobOption file in DSID directory")
41 from GeneratorConfig.GenConfigHelpers
import checkJOConsistency, checkNEventsPerJob, checkKeywords, checkCategories
42 officialJO = checkJOConsistency(jofile)
49 spec = importlib.util.spec_from_file_location(
51 location=os.path.join(FIRST_DIR,jofile),
53 jo = importlib.util.module_from_spec(spec)
54 spec.loader.exec_module(jo)
55 evgenLog.info(
"including file %s", jofile)
58 sample = jo.Sample(flags)
61 sample.setupFlags(flags)
67 dsid = os.path.basename(runArgs.jobConfig[0])
68 if dsid.startswith(
"Test"):
69 dsid = dsid.split(
"Test")[-1]
73 flags.Generator.DSID = int(dsid)
76 if not sample.nEventsPerJob:
77 evgenLog.info(
"#############################################################")
78 evgenLog.info(
" !!!! no sample.nEventsPerJob set !!! The default 10000 used. !!! ")
79 evgenLog.info(
"#############################################################")
81 checkNEventsPerJob(sample)
82 evgenLog.info(
" nEventsPerJob = " + str(sample.nEventsPerJob))
83 flags.Generator.nEventsPerJob = sample.nEventsPerJob
86 for var, value
in vars(sample).items():
88 raise RuntimeError(
"self.{} should be set in Sample(EvgenConfig)".format(var))
90 if var ==
"generators":
91 from GeneratorConfig.Versioning
import generatorsGetInitialVersionedDictionary, generatorsVersionedStringList
92 from GeneratorConfig.GenConfigHelpers
import gen_sortkey
93 gennames = sorted(sample.generators, key=gen_sortkey)
94 gendict = generatorsGetInitialVersionedDictionary(gennames)
95 gennamesvers = generatorsVersionedStringList(gendict)
96 evgenLog.info(
"MetaData: generatorName = {}".format(gennamesvers))
98 evgenLog.info(
"MetaData: {} = {}".format(var, value))
101 if len(sample.generators) > len(
set(sample.generators)):
102 raise RuntimeError(
"Duplicate entries in generators: invalid configuration, please check your JO")
103 from GeneratorConfig.GenConfigHelpers
import gen_require_steering
104 if gen_require_steering(sample.generators):
105 if hasattr(runArgs,
"outputEVNTFile")
and not hasattr(runArgs,
"outputEVNT_PreFile"):
106 raise RuntimeError(
"'EvtGen' found in job options name, please set '--steering=afterburn'")
109 if hasattr(sample,
"keywords"):
110 checkKeywords(sample, evgenLog, officialJO)
113 if hasattr(sample,
"categories"):
114 checkCategories(sample, evgenLog, officialJO)
144 d = release_metadata()
145 evgenLog.info(
"using release [%(project name)s-%(release)s] [%(platform)s] [%(nightly name)s/%(nightly release)s] -- built on [%(date)s]", d)
146 athenaRel = d[
"release"]
148 evgenLog.info(
"****************** STARTING EVENT GENERATION *****************")
150 evgenLog.info(
"**** Transformation run arguments")
151 evgenLog.info(runArgs)
153 evgenLog.info(
"**** Setting-up configuration flags")
155 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
156 flags = initConfigFlags()
158 from AthenaConfiguration.Enums
import ProductionStep
159 flags.Common.ProductionStep = ProductionStep.Generation
162 from PyJobTransforms.CommonRunArgsToFlags
import commonRunArgsToFlags
163 commonRunArgsToFlags(runArgs, flags)
166 from GeneratorConfig.GeneratorConfigFlags
import generatorRunArgsToFlags
167 generatorRunArgsToFlags(runArgs, flags)
176 from GeneratorConfig.GenConfigHelpers
import gen_sortkey, gen_lhef
177 generatorNames = sorted(sample.generators, key=gen_sortkey)
182 if blError
is not None:
183 raise RuntimeError(blError)
184 if plError
is not None:
185 evgenLog.warning(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
186 evgenLog.warning(f
"!!! WARNING {plError} !!!")
187 evgenLog.warning(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
190 flags.Exec.FirstEvent = runArgs.firstEvent
193 flags.Exec.MaxEvents = -1
195 if hasattr(runArgs,
"inputEVNT_PreFile"):
196 flags.Input.Files = runArgs.inputEVNT_PreFile
198 flags.Input.Files = []
199 flags.Input.RunNumbers = [flags.Generator.DSID]
200 flags.Input.TimeStamps = [0]
202 flags.Output.EVNTFileName = runArgs.outputEVNTFile
204 flags.Beam.Energy = runArgs.ecmEnergy / 2 * GeV
206 flags.PerfMon.doFastMonMT =
True
207 flags.PerfMon.doFullMonMT =
True
210 processPreInclude(runArgs, flags)
213 processPreExec(runArgs, flags)
218 evgenLog.info(
"**** Configuration flags")
222 flags.dump(
"Generator.*")
225 evgenLog.info(
".transform = Gen_tf")
226 evgenLog.info(
".platform = " + str(os.environ[
"BINARY_TAG"]))
229 evgenLog.info(
"**** Configuring event generation")
232 from AthenaConfiguration.MainServicesConfig
import MainEvgenServicesCfg
233 cfg = MainEvgenServicesCfg(flags, withSequences=
True)
236 if flags.Input.Files:
237 from AthenaPoolCnvSvc.PoolReadConfig
import PoolReadCfg
238 cfg.merge(PoolReadCfg(flags))
241 from xAODEventInfoCnv.xAODEventInfoCnvConfig
import EventInfoCnvAlgCfg
242 cfg.merge(EventInfoCnvAlgCfg(flags, disableBeamSpot=
True, xAODKey=
"TMPEvtInfo"),
243 sequenceName=EvgenSequence.Generator.value)
246 cfg.merge(sample.setupProcess(flags))
249 if not flags.Input.Files:
250 from EvgenProdTools.EvgenProdToolsConfig
import FixHepMCCfg
251 from GeneratorConfig.GenConfigHelpers
import gens_purgenoendvtx
252 generatorsList = sample.generators.copy()
253 if "Pythia8" in generatorsList:
254 pythia8Alg = cfg.getEventAlgo(
"Pythia8_i")
255 if pythia8Alg.Beam1 !=
"PROTON" or pythia8Alg.Beam2 !=
"PROTON":
257 generatorsList.append(
"Pythia8-Angantyr")
258 cfg.merge(FixHepMCCfg(flags,
259 PurgeUnstableWithoutEndVtx=gens_purgenoendvtx(generatorsList)))
262 from GeneratorConfig.GenConfigHelpers
import gens_testhepmc
263 if gens_testhepmc(sample.generators):
264 from EvgenProdTools.EvgenProdToolsConfig
import TestHepMCCfg
265 cfg.merge(TestHepMCCfg(flags))
268 from EvgenProdTools.EvgenProdToolsConfig
import CopyEventWeightCfg
269 cfg.merge(CopyEventWeightCfg(flags))
271 from EvgenProdTools.EvgenProdToolsConfig
import FillFilterValuesCfg
272 cfg.merge(FillFilterValuesCfg(flags))
275 from EvgenProdTools.EvgenProdToolsConfig
import CountHepMCCfg
276 cfg.merge(CountHepMCCfg(flags,
277 RequestedOutput=sample.nEventsPerJob
if runArgs.maxEvents == -1
278 else runArgs.maxEvents))
279 evgenLog.info(
"Requested output events = %d", cfg.getEventAlgo(
"CountHepMC").RequestedOutput)
282 if hasattr(runArgs,
"printEvts")
and runArgs.printEvts > 0:
283 from TruthIO.TruthIOConfig
import PrintMCCfg
284 cfg.merge(PrintMCCfg(flags,
285 LastEvent=runArgs.printEvts))
288 from PerfMonComps.PerfMonCompsConfig
import PerfMonMTSvcCfg
289 cfg.merge(PerfMonMTSvcCfg(flags), sequenceName=EvgenSequence.Post.value)
292 from EvgenProdTools.EvgenProdToolsConfig
import SimTimeEstimateCfg
293 cfg.merge(SimTimeEstimateCfg(flags))
298 from GeneratorConfig.Versioning
import generatorsGetInitialVersionedDictionary, generatorsVersionedStringList
299 generatorDictionary = generatorsGetInitialVersionedDictionary(generatorNames)
300 generatorList = generatorsVersionedStringList(generatorDictionary)
304 from EventInfoMgt.TagInfoMgrConfig
import TagInfoMgrCfg
306 "project_name":
"IS_SIMULATION",
307 f
"AtlasRelease_{runArgs.trfSubstepName}": flags.Input.Release
or "n/a",
308 "beam_energy": str(int(flags.Beam.Energy)),
309 "beam_type": flags.Beam.Type.value,
310 "generators":
'+'.join(generatorList),
311 "hepmc_version": f
"HepMC{os.environ['HEPMCVER']}",
312 "keywords":
", ".join(sample.keywords).lower(),
313 "lhefGenerator":
'+'.join(filter(gen_lhef, generatorNames)),
314 "mc_channel_number": str(flags.Generator.DSID),
316 if hasattr(sample,
"process"): metadata.update({
"evgenProcess": sample.process})
317 if hasattr(sample,
"tune"): metadata.update({
"evgenTune": sample.tune})
318 if hasattr(sample,
"specialConfig"): metadata.update({
"specialConfiguration": sample.specialConfig})
319 if hasattr(sample,
"hardPDF"): metadata.update({
"hardPDF": sample.hardPDF})
320 if hasattr(sample,
"softPDF"): metadata.update({
"softPDF": sample.softPDF})
321 if hasattr(sample,
"randomSeed"): metadata.update({
"randomSeed": str(runArgs.randomSeed)})
322 cfg.merge(TagInfoMgrCfg(flags, tagValuePairs=metadata))
325 evgenLog.info(
"HepMC version %s", os.environ[
"HEPMCVER"])
328 from OutputStreamAthenaPool.OutputStreamConfig
import OutputStreamCfg
329 cfg.merge(OutputStreamCfg(flags,
"EVNT", [
"McEventCollection#*"]))
332 from xAODMetaDataCnv.InfileMetaDataConfig
import SetupMetaDataForStreamCfg
333 cfg.merge(SetupMetaDataForStreamCfg(flags,
"EVNT"))
336 processPostInclude(runArgs, flags, cfg)
339 processPostExec(runArgs, flags, cfg)
342 from PyUtils.AMITagHelperConfig
import AMITagCfg
343 cfg.merge(AMITagCfg(flags, runArgs))
346 cfg.printConfig(prefix=
"Gen_tf", printSequenceTreeOnly=
not runArgs.VERBOSE)
349 sys.exit(
not cfg.run().isSuccess())