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 evgenLog.info(
"MetaData: {} = {}".format(var, value))
93 if hasattr(sample,
"keywords"):
94 checkKeywords(sample, evgenLog, officialJO)
97 if hasattr(sample,
"categories"):
98 checkCategories(sample, evgenLog, officialJO)
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"]
132 evgenLog.info(
"****************** STARTING EVENT GENERATION *****************")
134 evgenLog.info(
"**** Transformation run arguments")
135 evgenLog.info(runArgs)
137 evgenLog.info(
"**** Setting-up configuration flags")
139 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
140 flags = initConfigFlags()
142 from AthenaConfiguration.Enums
import ProductionStep
143 flags.Common.ProductionStep = ProductionStep.Generation
146 from PyJobTransforms.CommonRunArgsToFlags
import commonRunArgsToFlags
147 commonRunArgsToFlags(runArgs, flags)
150 from GeneratorConfig.GeneratorConfigFlags
import generatorRunArgsToFlags
151 generatorRunArgsToFlags(runArgs, flags)
160 flags.Exec.FirstEvent = runArgs.firstEvent
163 flags.Exec.MaxEvents = -1
165 if hasattr(runArgs,
"inputEVNT_PreFile"):
166 flags.Input.Files = runArgs.inputEVNT_PreFile
168 flags.Input.Files = []
169 flags.Input.RunNumbers = [flags.Generator.DSID]
170 flags.Input.TimeStamps = [0]
172 flags.Output.EVNTFileName = runArgs.outputEVNTFile
174 flags.Beam.Energy = runArgs.ecmEnergy / 2 * GeV
176 flags.PerfMon.doFastMonMT =
True
177 flags.PerfMon.doFullMonMT =
True
180 processPreInclude(runArgs, flags)
183 processPreExec(runArgs, flags)
188 evgenLog.info(
"**** Configuration flags")
192 flags.dump(
"Generator.*")
195 evgenLog.info(
".transform = Gen_tf")
196 evgenLog.info(
".platform = " + str(os.environ[
"BINARY_TAG"]))
199 evgenLog.info(
"**** Configuring event generation")
202 from AthenaConfiguration.MainServicesConfig
import MainEvgenServicesCfg
203 cfg = MainEvgenServicesCfg(flags, withSequences=
True)
206 if flags.Input.Files:
207 from AthenaPoolCnvSvc.PoolReadConfig
import PoolReadCfg
208 cfg.merge(PoolReadCfg(flags))
211 from xAODEventInfoCnv.xAODEventInfoCnvConfig
import EventInfoCnvAlgCfg
212 cfg.merge(EventInfoCnvAlgCfg(flags, disableBeamSpot=
True, xAODKey=
"TMPEvtInfo"),
213 sequenceName=EvgenSequence.Generator.value)
216 cfg.merge(sample.setupProcess(flags))
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)
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'")
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(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
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":
250 generatorsList.append(
"Pythia8-Angantyr")
251 cfg.merge(FixHepMCCfg(flags,
252 PurgeUnstableWithoutEndVtx=gens_purgenoendvtx(generatorsList)))
255 from GeneratorConfig.GenConfigHelpers
import gens_testhepmc
256 if gens_testhepmc(generators):
257 from EvgenProdTools.EvgenProdToolsConfig
import TestHepMCCfg
258 cfg.merge(TestHepMCCfg(flags))
261 from EvgenProdTools.EvgenProdToolsConfig
import CopyEventWeightCfg
262 cfg.merge(CopyEventWeightCfg(flags))
264 from EvgenProdTools.EvgenProdToolsConfig
import FillFilterValuesCfg
265 cfg.merge(FillFilterValuesCfg(flags))
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)
275 if hasattr(runArgs,
"printEvts")
and runArgs.printEvts > 0:
276 from TruthIO.TruthIOConfig
import PrintMCCfg
277 cfg.merge(PrintMCCfg(flags,
278 LastEvent=runArgs.printEvts))
281 from PerfMonComps.PerfMonCompsConfig
import PerfMonMTSvcCfg
282 cfg.merge(PerfMonMTSvcCfg(flags), sequenceName=EvgenSequence.Post.value)
285 from EvgenProdTools.EvgenProdToolsConfig
import SimTimeEstimateCfg
286 cfg.merge(SimTimeEstimateCfg(flags))
291 from EventInfoMgt.TagInfoMgrConfig
import TagInfoMgrCfg
292 from GeneratorConfig.GenConfigHelpers
import gen_lhef
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),
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))
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))
318 from OutputStreamAthenaPool.OutputStreamConfig
import OutputStreamCfg
319 cfg.merge(OutputStreamCfg(flags,
"EVNT", [
"McEventCollection#*"]))
322 from xAODMetaDataCnv.InfileMetaDataConfig
import SetupMetaDataForStreamCfg
323 cfg.merge(SetupMetaDataForStreamCfg(flags,
"EVNT"))
326 processPostInclude(runArgs, flags, cfg)
329 processPostExec(runArgs, flags, cfg)
332 from PyUtils.AMITagHelperConfig
import AMITagCfg
333 cfg.merge(AMITagCfg(flags, runArgs))
336 cfg.printConfig(prefix=
"Gen_tf", printSequenceTreeOnly=
not runArgs.VERBOSE)
339 sys.exit(
not cfg.run().isSuccess())