3 """Functionality core of the Gen_tf transform"""
13 import os, re, string, subprocess
14 import AthenaCommon.AlgSequence
as acas
15 import AthenaCommon.AppMgr
as acam
16 from AthenaCommon.AthenaCommonFlags
import jobproperties
18 from xAODEventInfoCnv.xAODEventInfoCnvConf
import xAODMaker__EventInfoCnvAlg
19 acam.athMasterSeq += xAODMaker__EventInfoCnvAlg(xAODKey=
"TMPEvtInfo")
22 acam.athMasterSeq += acas.AlgSequence(
"EvgenGenSeq")
23 genSeq = acam.athMasterSeq.EvgenGenSeq
24 acam.athMasterSeq += acas.AlgSequence(
"EvgenFixSeq")
25 fixSeq = acam.athMasterSeq.EvgenFixSeq
26 acam.athMasterSeq += acas.AlgSequence(
"EvgenPreFilterSeq")
27 prefiltSeq = acam.athMasterSeq.EvgenPreFilterSeq
28 acam.athMasterSeq += acas.AlgSequence(
"EvgenTestSeq")
29 testSeq = acam.athMasterSeq.EvgenTestSeq
31 from EvgenProdTools.LogicalExpressionFilter
import LogicalExpressionFilter
33 filtSeq = acam.athMasterSeq.EvgenFilterSeq
34 topSeq = acas.AlgSequence()
36 topSeq += acas.AlgSequence(
"EvgenPostSeq")
37 postSeq = topSeq.EvgenPostSeq
46 include(
"AthenaCommon/Atlas_Gen.UnixStandardJob.py")
47 include(
"PartPropSvc/PartPropSvc.py")
50 from PerfMonComps.PerfMonFlags
import jobproperties
as perfmonjp
51 perfmonjp.PerfMonFlags.doMonitoring =
True
52 perfmonjp.PerfMonFlags.doSemiDetailedMonitoring =
True
55 from RngComps.RngCompsConf
import AthRNGSvc
59 jobproperties.AthenaCommonFlags.AllowIgnoreConfigError =
False
63 evgenLog = logging.getLogger(
'Gen_tf')
70 evgenLog.debug(
"****************** CHECKING EVENT GENERATION ARGS *****************")
71 evgenLog.debug(
str(runArgs))
73 if hasattr(runArgs,
"inputGeneratorFile"):
74 evgenLog.info(
"inputGeneratorFile = " + runArgs.inputGeneratorFile)
76 if hasattr(runArgs,
"outputYODAFile"):
77 evgenLog.info(
"specified outputYODAFile = " + runArgs.outputYODAFile)
81 if not hasattr(runArgs,
"outputEVNTFile")
and not hasattr(runArgs,
"outputEVNT_PreFile"):
82 if hasattr(runArgs,
"outputYODAFile"):
83 evgenLog.info(
"No outputEVNTFile specified but outputYODAFile is used")
84 evgenLog.info(
"Will run GENtoEVGEN without saving the output EVNT file, asuming a valid outputYODAFile will be produced")
86 raise RuntimeError(
"No output evgen EVNT or EVNT_Pre file provided.")
89 if not hasattr(runArgs,
"ecmEnergy"):
90 raise RuntimeError(
"No center of mass energy provided.")
92 evgenLog.info(
' ecmEnergy = ' +
str(runArgs.ecmEnergy) )
93 if not hasattr(runArgs,
"randomSeed"):
94 raise RuntimeError(
"No random seed provided.")
96 if not hasattr(runArgs,
"firstEvent"):
97 raise RuntimeError(
"No first number provided.")
98 if ( runArgs.firstEvent <= 0):
99 evgenLog.warning(
"Run argument firstEvent should be > 0")
106 evgenLog.debug(
"****************** CONFIGURING EVENT GENERATION *****************")
110 from EvgenJobTransforms.EvgenConfig
import evgenConfig
111 from GeneratorConfig.GenConfigHelpers
import gens_known, gen_lhef, gens_lhef, gen_sortkey, gens_testhepmc, gens_notune, gen_require_steering
114 from EvgenProdTools.EvgenProdToolsConf
import FixHepMC
115 if not hasattr(fixSeq,
"FixHepMC"):
119 from EvgenProdTools.EvgenProdToolsConf
import TestHepMC
120 testSeq += TestHepMC(CmEnergy=runArgs.ecmEnergy*Units.GeV)
122 if not hasattr(svcMgr,
'THistSvc'):
123 from GaudiSvc.GaudiSvcConf
import THistSvc
125 svcMgr.THistSvc.Output = [
"TestHepMCname DATAFILE='TestHepMC.root' OPT='RECREATE'"]
129 from EvgenProdTools.EvgenProdToolsConf
import CopyEventWeight
130 if not hasattr(postSeq,
"CopyEventWeight"):
131 postSeq += CopyEventWeight(mcEventWeightsKey=
"TMPEvtInfo.mcEventWeights")
133 from EvgenProdTools.EvgenProdToolsConf
import FillFilterValues
134 if not hasattr(postSeq,
"FillFilterValues"):
135 postSeq += FillFilterValues(mcFilterHTKey=
"TMPEvtInfo.mcFilterHT")
139 from EvgenProdTools.EvgenProdToolsConf
import CountHepMC
140 svcMgr.EventSelector.FirstEvent = runArgs.firstEvent
146 if not hasattr(postSeq,
"CountHepMC"):
147 postSeq += CountHepMC(InputEventInfo=
"TMPEvtInfo",
148 OutputEventInfo=
"EventInfo",
149 mcEventWeightsKey=
"TMPEvtInfo.mcEventWeights")
152 postSeq.CountHepMC.FirstEvent = runArgs.firstEvent
153 postSeq.CountHepMC.CorrectHepMC =
True
154 postSeq.CountHepMC.CorrectEventID =
True
158 if hasattr(runArgs,
"printEvts")
and runArgs.printEvts > 0:
159 from TruthIO.TruthIOConf
import PrintMC
161 postSeq.PrintMC.McEventKey =
"GEN_EVENT"
162 postSeq.PrintMC.VerboseOutput =
True
163 postSeq.PrintMC.PrintStyle =
"Barcode"
164 postSeq.PrintMC.FirstEvent = 1
165 postSeq.PrintMC.LastEvent = runArgs.printEvts
168 from EvgenProdTools.EvgenProdToolsConf
import SimTimeEstimate
169 if not hasattr(postSeq,
"SimTimeEstimate"):
170 postSeq += SimTimeEstimate()
174 if hasattr(runArgs,
"rivetAnas"):
175 from Rivet_i.Rivet_iConf
import Rivet_i
177 anaSeq.Rivet_i.Analyses = runArgs.rivetAnas
178 anaSeq.Rivet_i.AnalysisPath = os.environ[
'PWD']
179 if hasattr(runArgs,
"outputYODAFile"):
180 anaSeq.Rivet_i.HistoFile = runArgs.outputYODAFile
183 rel = os.popen(
"echo $AtlasVersion").
read()
185 if not rel
or int(rel[:2]) > 22:
186 from AthenaCommon.AppMgr
import ServiceMgr
187 ServiceMgr.EventSelector.EventsPerRun =
int(2**63 - 1)
194 evgenLog.debug(
"****************** LOADING PRE-INCLUDES AND JOB CONFIG *****************")
197 if hasattr(runArgs,
"preInclude"):
198 for fragment
in runArgs.preInclude:
202 if hasattr(runArgs,
"preExec"):
203 evgenLog.info(
"Transform pre-exec")
204 for cmd
in runArgs.preExec:
209 return [name
for name
in os.listdir(a_dir)
210 if os.path.isdir(os.path.join(a_dir, name))]
215 if hasattr(runArgs,
"outputTXTFile"): outputTXTFile=runArgs.outputTXTFile
219 if len(runArgs.jobConfig) != 1:
220 evgenLog.info(
"runArgs.jobConfig = %s" % runArgs.jobConfig)
221 evgenLog.error(
"You must supply one and only one jobConfig file argument")
224 evgenLog.info(
"Using JOBOPTSEARCHPATH (as seen in skeleton) = '%s'" % os.environ[
"JOBOPTSEARCHPATH"])
225 FIRST_DIR = (os.environ[
'JOBOPTSEARCHPATH']).
split(
":")[0]
227 jofiles = [f
for f
in os.listdir(FIRST_DIR)
if (f.startswith(
'mc')
and f.endswith(
'.py'))]
229 evgenLog.error(
"You must supply one and only one jobOption file in DSID directory")
233 joparts = (os.path.basename(jofile)).
split(
".")
236 if joparts[0].startswith(
"mc")
and all(c
in string.digits
for c
in joparts[0][2:]):
239 if len(joparts) != 3:
240 evgenLog.error(jofile +
" name format is wrong: must be of the form mc.<physicsShort>.py: please rename.")
243 jo_physshortpart = joparts[1]
244 max_jo_physshort_length = 50
245 if len(jo_physshortpart) > max_jo_physshort_length:
246 evgenLog.error(f
"{jofile} contains a physicsShort field of more than {max_jo_physshort_length} characters: please rename.")
249 jo_physshortparts = jo_physshortpart.split(
"_")
250 if len(jo_physshortparts) < 2:
251 evgenLog.error(jofile +
" has too few physicsShort fields separated by '_': should contain <generators>(_<tune+PDF_if_available>)_<process>. Please rename.")
254 check_jofiles=
"/cvmfs/atlas.cern.ch/repo/sw/Generators/MC16JobOptions/scripts/check_jo_consistency.py"
255 if os.path.exists(check_jofiles):
257 check_naming(os.path.basename(jofile))
259 evgenLog.error(
"check_jo_consistency.py not found")
270 evgenLog.debug(
"****************** CHECKING EVGEN CONFIGURATION *****************")
272 if hasattr(runArgs,
'inputGeneratorFile')
and int(evgenConfig.inputFilesPerJob) == 0 :
273 evgenConfig.inputFilesPerJob = 1
276 for opt
in str(evgenConfig).
split(os.linesep):
278 evgenLog.info(
".transform = Gen_tf")
281 evgenLog.info(
".platform = "+
str(os.environ[
'BINARY_TAG']))
286 if evgenConfig.obsolete:
287 evgenLog.error(
"JOs or icludes are obsolete, please check them")
290 if not evgenConfig.generators:
291 evgenLog.error(
"No entries in evgenConfig.generators: invalid configuration, please check your JO")
294 if len(evgenConfig.generators) > len(
set(evgenConfig.generators)):
295 evgenLog.error(
"Duplicate entries in evgenConfig.generators: invalid configuration, please check your JO")
298 gennames =
sorted(evgenConfig.generators, key=gen_sortkey)
300 if joparts[0].startswith(
"MC"):
301 genpart = jo_physshortparts[0]
302 expectedgenpart =
''.
join(gennames)
304 expectedgenpart = expectedgenpart.replace(
"HerwigJimmy",
"Herwig")
309 return s.replace(
"Py",
"Pythia").
replace(
"MG",
"MadGraph").
replace(
"Ph",
"Powheg").
replace(
"Hpp",
"Herwigpp").
replace(
"H7",
"Herwig7").
replace(
"Sh",
"Sherpa").
replace(
"Ag",
"Alpgen").
replace(
"EG",
"EvtGen").
replace(
"PG",
"ParticleGun").
replace(
"Gva",
"Geneva")
312 return s.replace(
"Pythia",
"Py").
replace(
"MadGraph",
"MG").
replace(
"Powheg",
"Ph").
replace(
"Herwigpp",
"Hpp").
replace(
"Herwig7",
"H7").
replace(
"Sherpa",
"Sh").
replace(
"Alpgen",
"Ag").
replace(
"EvtGen",
"EG").
replace(
"PG",
"ParticleGun").
replace(
"Geneva",
"Gva")
314 if genpart !=
_norm(expectedgenpart)
and _norm2(genpart) !=
_norm(expectedgenpart):
315 evgenLog.error(
"Expected first part of JO name to be '%s' or '%s', but found '%s'" % (
_norm(expectedgenpart),
_norm(
_short2(expectedgenpart)), genpart))
316 evgenLog.error(
"gennames '%s' " %(expectedgenpart))
321 if not gens_notune(gennames)
and len(jo_physshortparts) < 3:
322 evgenLog.error(jofile +
" with generators " + expectedgenpart +
323 " has too few physicsShort fields separated by '_'." +
324 " It should contain <generators>_<tune+PDF_<process>. Please rename.")
330 if hasattr(runArgs,
"outputEVNTFile")
and not hasattr(runArgs,
"outputEVNT_PreFile"):
331 raise RuntimeError(
"'EvtGen' found in job options name, please set '--steering=afterburn'")
337 if hasattr(runArgs,
'inputGeneratorFile')
and ',' in runArgs.inputGeneratorFile: multiInput = runArgs.inputGeneratorFile.count(
',')+1
342 if not evgenConfig.nEventsPerJob:
343 evgenLog.info(
'#############################################################')
344 evgenLog.info(
' !!!! no nEventsPerJob set !!! The default 10000 used. !!! ')
345 evgenLog.info(
'#############################################################')
347 evgenLog.info(
' nEventsPerJob = ' +
str(evgenConfig.nEventsPerJob) )
349 if evgenConfig.minevents > 0 :
350 raise RuntimeError(
"evgenConfig.minevents is obsolete and should be removed from the JOs")
351 if evgenConfig.nEventsPerJob < 1:
352 raise RuntimeError(
"evgenConfig.nEventsPerJob must be at least 1")
353 elif evgenConfig.nEventsPerJob > 100000:
354 raise RuntimeError(
"evgenConfig.nEventsPerJob can be max. 100000")
356 allowed_nEventsPerJob_lt1000 = [1, 2, 5, 10, 20, 25, 50, 100, 200, 500, 1000]
357 msg =
"evgenConfig.nEventsPerJob = %d: " % evgenConfig.nEventsPerJob
359 if evgenConfig.nEventsPerJob >= 1000
and evgenConfig.nEventsPerJob <=10000
and (evgenConfig.nEventsPerJob % 1000 != 0
or 10000 % evgenConfig.nEventsPerJob != 0):
360 msg +=
"nEventsPerJob in range [1K, 10K] must be a multiple of 1K and a divisor of 10K"
361 raise RuntimeError(msg)
362 elif evgenConfig.nEventsPerJob > 10000
and evgenConfig.nEventsPerJob % 10000 != 0:
363 msg +=
"nEventsPerJob >10K must be a multiple of 10K"
364 raise RuntimeError(msg)
365 elif evgenConfig.nEventsPerJob < 1000
and evgenConfig.nEventsPerJob
not in allowed_nEventsPerJob_lt1000:
366 msg +=
"nEventsPerJob in range <= 1000 must be one of %s" % allowed_nEventsPerJob_lt1000
367 raise RuntimeError(msg)
368 postSeq.CountHepMC.RequestedOutput = evgenConfig.nEventsPerJob
if runArgs.maxEvents == -1
else runArgs.maxEvents
369 evgenLog.info(
'Requested output events = '+
str(postSeq.CountHepMC.RequestedOutput))
372 if evgenConfig.keywords:
375 kwfile =
"evgenkeywords.txt"
377 for p
in os.environ[
"DATAPATH"].
split(
":"):
378 kwpath = os.path.join(p, kwfile)
379 if os.path.exists(kwpath):
383 allowed_keywords = []
385 evgenLog.info(
"evgenkeywords = "+kwpath)
386 kwf =
open(kwpath,
"r")
388 allowed_keywords += l.strip().lower().
split()
391 for k
in evgenConfig.keywords:
392 if k.lower()
not in allowed_keywords:
393 evil_keywords.append(k)
395 msg =
"evgenConfig.keywords contains non-standard keywords: %s. " %
", ".
join(evil_keywords)
396 msg +=
"Please check the allowed keywords list and fix."
401 evgenLog.warning(
"evgenkeywords = not found ")
404 if evgenConfig.categories:
407 lkwfile =
"CategoryList.txt"
409 for p
in os.environ[
"DATAPATH"].
split(
":"):
410 lkwpath = os.path.join(p, lkwfile)
411 if os.path.exists(lkwpath):
417 with open(lkwpath,
'r')
as catlist:
419 allowed_list = ast.literal_eval(line)
420 allowed_cat.append(allowed_list)
424 it = iter(evgenConfig.categories)
428 if "L1:" in l2
and "L2:" in l1:
430 print (
"first",l1,
"second",l2)
431 bad_cat.extend([l1, l2])
432 for a1,a2
in allowed_cat:
433 if l1.strip().lower()==a1.strip().lower()
and l2.strip().lower()==a2.strip().lower():
436 msg =
"evgenConfig.categories contains non-standard category: %s. " %
", ".
join(bad_cat)
437 msg +=
"Please check the allowed categories list and fix."
442 evgenLog.warning(
"Could not find CategoryList.txt file %s in $DATAPATH" % lkwfile)
444 if hasattr( runArgs,
"outputEVNTFile")
or hasattr( runArgs,
"outputEVNT_PreFile"):
446 from AthenaPoolCnvSvc.WriteAthenaPool
import AthenaPoolOutputStream
447 from AthenaPoolCnvSvc.AthenaPoolCnvSvcConf
import AthenaPoolCnvSvc
450 if hasattr(runArgs,
"outputEVNTFile"):
451 poolFile = runArgs.outputEVNTFile
452 elif hasattr(runArgs,
"outputEVNT_PreFile"):
453 poolFile = runArgs.outputEVNT_PreFile
455 raise RuntimeError(
"Output pool file, either EVNT or EVNT_Pre, is not known.")
459 StreamEVGEN.ForceRead =
True
460 StreamEVGEN.ItemList += [
"EventInfo#*",
"xAOD::EventInfo#EventInfo*",
"xAOD::EventAuxInfo#EventInfoAux.*",
"McEventCollection#*"]
461 StreamEVGEN.RequireAlgs += [
"EvgenFilterSeq"]
463 if evgenConfig.saveJets:
464 StreamEVGEN.ItemList += [
"xAOD::JetContainer#AntiKt4TruthJets",
"xAOD::AuxContainerBase!#AntiKt4TruthJetsAux.-PseudoJet.-constituentLinks.-constituentWeights"]
465 StreamEVGEN.ItemList += [
"xAOD::JetContainer#AntiKt6TruthJets",
"xAOD::AuxContainerBase!#AntiKt6TruthJetsAux.-PseudoJet.-constituentLinks.-constituentWeights"]
466 if evgenConfig.savePileupTruthParticles:
467 StreamEVGEN.ItemList += [
"xAOD::TruthParticleContainer#TruthPileupParticles*"]
468 StreamEVGEN.ItemList += [
"xAOD::TruthParticleAuxContainer#TruthPileupParticlesAux.*"]
471 for removeItem
in evgenConfig.doNotSaveItems: StreamEVGEN.ItemList.remove( removeItem )
474 for addItem
in evgenConfig.extraSaveItems: StreamEVGEN.ItemList += [ addItem ]
477 dsid = os.path.basename(runArgs.jobConfig[0])
478 if not dsid.isdigit():
480 svcMgr.EventSelector.RunNumber =
int(dsid)
483 from GeneratorConfig.Versioning
import generatorsGetInitialVersionedDictionary, generatorsVersionedStringList
487 import EventInfoMgt.EventInfoMgtInit
488 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"hepmc_version":
"HepMC" +
str(os.environ[
'HEPMCVER'])})
489 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"mc_channel_number":
str(dsid)})
490 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"lhefGenerator":
'+'.
join(
filter( gen_lhef, gennames ) ) })
491 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"generators":
'+'.
join(gennamesvers)})
492 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"evgenProcess": evgenConfig.process})
493 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"evgenTune": evgenConfig.tune})
494 if hasattr( evgenConfig,
"hardPDF" ) : svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"hardPDF": evgenConfig.hardPDF})
495 if hasattr( evgenConfig,
"softPDF" ) : svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"softPDF": evgenConfig.softPDF})
496 if hasattr( runArgs,
"randomSeed") : svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"randomSeed":
str(runArgs.randomSeed)})
497 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"keywords":
", ".
join(evgenConfig.keywords).lower()})
500 evgenLog.info(
"HepMC version " +
str(os.environ[
'HEPMCVER']))
503 from PyUtils
import AMITagHelper
504 AMITagHelper.SetAMITag(runArgs=runArgs)
507 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"beam_energy":
str(
int(runArgs.ecmEnergy*Units.GeV/2.0))})
508 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"beam_type":
'collisions'})
512 include(
"EvgenJobTransforms/Generate_ecmenergies.py")
514 if 'ParticleGun' in evgenConfig.generators:
516 from RngComps.RngCompsConf
import AtRndmGenSvc
518 include(
"EvgenJobTransforms/Generate_randomseeds.py")
521 include(
"EvgenJobTransforms/Generate_dsid_ranseed.py")
524 if (hasattr( runArgs,
"VERBOSE")
and runArgs.VERBOSE )
or (hasattr( runArgs,
"loglevel")
and runArgs.loglevel ==
"DEBUG")
or (hasattr( runArgs,
"loglevel")
and runArgs.loglevel ==
"VERBOSE"):
525 include(
"EvgenJobTransforms/Generate_debug_level.py")
528 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"specialConfiguration": evgenConfig.specialConfig })
532 if hasattr(testSeq,
"TestHepMC")
and not gens_testhepmc(evgenConfig.generators):
533 evgenLog.info(
"Removing TestHepMC sanity checker")
534 del testSeq.TestHepMC
542 with open(
'/cvmfs/atlas.cern.ch/repo/sw/Generators/MC16JobOptions/common/BlackList_caches.txt')
as bfile:
543 for line
in bfile.readlines():
547 badRelFlav=line.split(
',')[0].strip()
549 badCache=line.split(
',')[1].strip()
551 badGens=line.split(
',')[2].strip()
553 used_gens =
','.
join(generatorName)
555 if relFlavour==badRelFlav
and cache==badCache
and re.search(badGens,used_gens)
is not None:
556 if badGens==
"": badGens=
"all generators"
557 isError=relFlavour+
","+cache+
" is blacklisted for " + badGens
563 with open(
'/cvmfs/atlas.cern.ch/repo/sw/Generators/MC16JobOptions/common/PurpleList_generators.txt')
as bfile:
564 for line
in bfile.readlines():
568 purpleRelFlav=line.split(
',')[0].strip()
570 purpleCache=line.split(
',')[1].strip()
572 purpleGens=line.split(
',')[2].strip()
574 purpleProcess=line.split(
',')[3].strip()
576 used_gens =
','.
join(generatorName)
578 if relFlavour==purpleRelFlav
and cache==purpleCache
and re.search(purpleGens,used_gens)
is not None:
579 isError=relFlavour+
","+cache+
" is blacklisted for " + purpleGens +
" if it uses " + purpleProcess
584 evgenLog.debug(
"****************** CHECKING RELEASE IS NOT BLACKLISTED *****************")
587 if (hasattr( runArgs,
"ignoreBlackList")
and runArgs.ignoreBlackList):
588 evgenLog.warning(
"This run is blacklisted for this generator, please use a different one for production !! "+ errorBL )
590 raise RuntimeError(
"This run is blacklisted for this generator, please use a different one !! "+ errorBL)
594 evgenLog.warning(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
595 evgenLog.warning(
"!!! WARNING !!! "+ errorPL )
596 evgenLog.warning(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
602 if hasattr(runArgs,
"postInclude"):
603 for fragment
in runArgs.postInclude:
606 if hasattr(runArgs,
"postExec"):
607 evgenLog.info(
"Transform post-exec")
608 for cmd
in runArgs.postExec:
616 acas.dumpMasterSequence()
624 evgenLog.debug(
"****************** HANDLING EVGEN INPUT FILES *****************")
628 if "McAtNlo" in evgenConfig.generators
and "Herwig" in evgenConfig.generators:
629 datFile =
"inparmMcAtNlo.dat"
630 elif "Alpgen" in evgenConfig.generators:
631 datFile =
"inparmAlpGen.dat"
632 elif "Protos" in evgenConfig.generators:
633 datFile =
"protos.dat"
634 elif "ProtosLHEF" in evgenConfig.generators:
635 datFile =
"protoslhef.dat"
636 elif "AcerMC" in evgenConfig.generators:
637 datFile =
"inparmAcerMC.dat"
638 elif "CompHep" in evgenConfig.generators:
639 datFile =
"inparmCompHep.dat"
643 if "Alpgen" in evgenConfig.generators:
644 eventsFile =
"alpgen.unw_events"
645 elif "Protos" in evgenConfig.generators:
646 eventsFile =
"protos.events"
647 elif "ProtosLHEF" in evgenConfig.generators:
648 eventsFile =
"protoslhef.events"
649 elif "BeamHaloGenerator" in evgenConfig.generators:
650 eventsFile =
"beamhalogen.events"
651 elif "HepMCAscii" in evgenConfig.generators:
652 eventsFile =
"events.hepmc"
653 elif "ReadMcAscii" in evgenConfig.generators:
654 eventsFile =
"events.hepmc"
656 eventsFile =
"events.lhe"
661 "Return a matching file, provided it is unique"
663 files = glob.glob(pattern)
666 raise RuntimeError(
"No '%s' file found" % pattern)
668 raise RuntimeError(
"More than one '%s' file found" % pattern)
674 if(os.path.exists(outputFile)):
675 print (
"outputFile ",outputFile,
" already exists. Will rename to ",outputFile,
".OLD")
676 os.rename(outputFile,outputFile+
".OLD")
677 output =
open(outputFile,
'w')
680 for file
in listOfFiles:
681 cmd =
"grep /event "+file+
" | wc -l"
682 nevents+=
int(subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=
True))
684 for file
in listOfFiles:
687 print (
"*** Starting file ",file)
688 for line
in open(file,
"r"):
694 if(
"<event" in line
and inHeader):
696 if(len(holdHeader)<1):
702 elif(
not inHeader
and not (
"</LesHouchesEvents>" in line)):
706 if(
"nevents" in line):
708 tmp = line.split(
"=")
709 line = line.replace(tmp[0],
str(nevents))
710 elif(
"numevts" in line):
712 tmp = line.split(
" ")
714 line = line.replace(tmp[1],nnn)
716 output.write(
"</LesHouchesEvents>\n")
721 "Make a symlink safely"
723 if os.path.exists(dstfile)
and not os.path.samefile(dstfile, srcfile):
725 if not os.path.exists(dstfile):
726 evgenLog.info(
"Symlinking %s to %s" % (srcfile, dstfile))
727 print (
"Symlinking %s to %s" % (srcfile, dstfile))
728 os.symlink(srcfile, dstfile)
730 evgenLog.debug(
"Symlinking: %s is already the same as %s" % (dstfile, srcfile))
733 if eventsFile
or datFile:
734 if not hasattr(runArgs,
"inputGeneratorFile")
or runArgs.inputGeneratorFile ==
"NONE":
735 raise RuntimeError(
"%s needs input file (argument inputGeneratorFile)" % runArgs.jobConfig)
736 if evgenConfig.inputfilecheck
and not re.search(evgenConfig.inputfilecheck, runArgs.inputGeneratorFile):
737 raise RuntimeError(
"inputGeneratorFile=%s is incompatible with inputfilecheck '%s' in %s" %
738 (runArgs.inputGeneratorFile, evgenConfig.inputfilecheck, runArgs.jobConfig))
740 if ".tar" in os.path.basename(runArgs.inputGeneratorFile):
741 inputroot = os.path.basename(runArgs.inputGeneratorFile).
split(
".tar.")[0]
743 inputroot = os.path.basename(runArgs.inputGeneratorFile).
split(
"._")[0]
748 myinputfiles = runArgs.inputGeneratorFile
749 genInputFiles = myinputfiles.split(
',')
750 numberOfFiles = len(genInputFiles)
753 if ".tar" in os.path.basename(runArgs.inputGeneratorFile):
754 inputroot = os.path.basename(runArgs.inputGeneratorFile).
split(
".tar.")[0]
756 inputroot = os.path.basename(runArgs.inputGeneratorFile).
split(
"._")[0]
758 if "events" in inputroot :
759 inputroot = inputroot.replace(
".events",
"")
764 for file
in genInputFiles:
767 if ".tar" in os.path.basename(runArgs.inputGeneratorFile):
768 inputroot = os.path.basename(runArgs.inputGeneratorFile).
split(
".tar.")[0]
770 input0 = os.path.basename(file).
split(
"._")[0]
771 input1 = (os.path.basename(file).
split(
"._")[1]).
split(
".")[0]
772 inputroot = input0+
"._"+input1
773 evgenLog.info(
"inputroot = ",inputroot)
776 with open(realEventsFile,
'r')
as f:
777 first_line = f.readline()
778 if(
not (
"LesHouche" in first_line)):
779 raise RuntimeError(
"%s is NOT a LesHouche file" % realEventsFile)
780 allFiles.append(realEventsFile)
784 if hasattr(runArgs,
"inputGeneratorFile")
and runArgs.inputGeneratorFile !=
"NONE":
785 raise RuntimeError(
"inputGeneratorFile arg specified for %s, but generators %s do not require an input file" %
786 (runArgs.jobConfig,
str(gennames)))
787 if evgenConfig.inputfilecheck:
788 raise RuntimeError(
"evgenConfig.inputfilecheck specified in %s, but generators %s do not require an input file" %
789 (runArgs.jobConfig,
str(gennames)))
792 if evgenConfig.auxfiles:
794 get_files(evgenConfig.auxfiles, keepDir=
False, errorIfNotFound=
True)
802 if not hasattr(evgenConfig, attr)
or not getattr(evgenConfig, attr):
803 msg =
"evgenConfig attribute '%s' not found." % attr
805 raise RuntimeError(
"Required " + msg)
809 if hasattr(runArgs,
"outputTXTFile"):
812 with open(eventsFile)
as f:
814 count_ev += line.count(
'/event')
816 print(
"MetaData: %s = %s" % (
"Number of produced LHE events ", count_ev))
817 elif hasattr(runArgs,
"inputGeneratorFile"):
820 with open(eventsFile)
as f:
822 count_ev += line.count(
'/event')
824 print(
"MetaData: %s = %s" % (
"Number of input LHE events ", count_ev))
828 msg = evgenConfig.description
830 msg +=
" " + evgenConfig.notes
831 print (
"MetaData: %s = %s" % (
"physicsComment", msg))
834 print (
"MetaData: %s = %s" % (
"generatorName",
"+".
join(gennamesvers)))
836 print (
"MetaData: %s = %s" % (
"physicsProcess", evgenConfig.process))
838 print (
"MetaData: %s = %s" % (
"generatorTune", evgenConfig.tune))
840 print (
"MetaData: %s = %s" % (
"hardPDF", evgenConfig.hardPDF))
842 print (
"MetaData: %s = %s" % (
"softPDF", evgenConfig.softPDF))
844 print (
"MetaData: %s = %s" % (
"nEventsPerJob", evgenConfig.nEventsPerJob))
846 print (
"MetaData: %s = %s" % (
"keywords",
", ".
join(evgenConfig.keywords).lower()))
848 print (
"MetaData: %s = %s" % (
"categories",
", ".
join(evgenConfig.categories)))
850 print (
"MetaData: %s = %s" % (
"specialConfig", evgenConfig.specialConfig))
853 print (
"MetaData: %s = %s" % (
"contactPhysicist",
", ".
join(evgenConfig.contact)))
854 print (
"MetaData: %s = %s" % (
"randomSeed",
str(runArgs.randomSeed)))
857 filterNames = [alg.getType()
for alg
in acas.iter_algseq(filtSeq)]
858 excludedNames = [
'AthSequencer',
'PyAthena::Alg',
'TestHepMC']
859 filterNames =
list(
set(filterNames) -
set(excludedNames))
860 print (
"MetaData: %s = %s" % (
"genFilterNames",
", ".
join(filterNames)))
867 from PyJobTransformsCore.runargs
import RunArguments
868 runPars = RunArguments()
869 runPars.nEventsPerJob = evgenConfig.nEventsPerJob
870 runPars.maxeventsstrategy = evgenConfig.maxeventsstrategy
871 with open(
"config.pickle",
"wb")
as f:
873 pickle.dump(runPars, f)
879 evgenLog.info(
"****************** STARTING EVENT GENERATION *****************")