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