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 import AthenaCommon.AtlasUnixGeneratorJob
47 include(
"PartPropSvc/PartPropSvc.py")
50 from PerfMonComps.PerfMonFlags
import jobproperties
as perfmonjp
51 perfmonjp.PerfMonFlags.doFastMonMT =
True
54 from RngComps.RngCompsConf
import AthRNGSvc
58 jobproperties.AthenaCommonFlags.AllowIgnoreConfigError =
False
61 from AthenaCommon.Logging
import logging
62 evgenLog = logging.getLogger(
'Gen_tf')
69 evgenLog.debug(
"****************** CHECKING EVENT GENERATION ARGS *****************")
70 evgenLog.debug(
str(runArgs))
72 if hasattr(runArgs,
"inputGeneratorFile"):
73 evgenLog.info(
"inputGeneratorFile = " + runArgs.inputGeneratorFile)
75 if hasattr(runArgs,
"outputYODAFile"):
76 evgenLog.info(
"specified outputYODAFile = " + runArgs.outputYODAFile)
80 if not hasattr(runArgs,
"outputEVNTFile")
and not hasattr(runArgs,
"outputEVNT_PreFile"):
81 if hasattr(runArgs,
"outputYODAFile"):
82 evgenLog.info(
"No outputEVNTFile specified but outputYODAFile is used")
83 evgenLog.info(
"Will run GENtoEVGEN without saving the output EVNT file, asuming a valid outputYODAFile will be produced")
85 raise RuntimeError(
"No output evgen EVNT or EVNT_Pre file provided.")
88 if not hasattr(runArgs,
"ecmEnergy"):
89 raise RuntimeError(
"No center of mass energy provided.")
91 evgenLog.info(
' ecmEnergy = ' +
str(runArgs.ecmEnergy) )
92 if not hasattr(runArgs,
"randomSeed"):
93 raise RuntimeError(
"No random seed provided.")
95 if not hasattr(runArgs,
"firstEvent"):
96 raise RuntimeError(
"No first number provided.")
97 if ( runArgs.firstEvent <= 0):
98 evgenLog.warning(
"Run argument firstEvent should be > 0")
105 evgenLog.debug(
"****************** CONFIGURING EVENT GENERATION *****************")
109 from EvgenJobTransforms.EvgenConfig
import evgenConfig
110 from GeneratorConfig.GenConfigHelpers
import gens_known, gen_lhef, gens_lhef, gen_sortkey, gens_testhepmc, gens_notune, gen_require_steering
113 from EvgenProdTools.EvgenProdToolsConf
import FixHepMC
114 if not hasattr(fixSeq,
"FixHepMC"):
118 from EvgenProdTools.EvgenProdToolsConf
import TestHepMC
119 testSeq += TestHepMC(CmEnergy=runArgs.ecmEnergy*Units.GeV)
121 if not hasattr(svcMgr,
'THistSvc'):
122 from GaudiSvc.GaudiSvcConf
import THistSvc
124 svcMgr.THistSvc.Output = [
"TestHepMCname DATAFILE='TestHepMC.root' OPT='RECREATE'"]
128 from EvgenProdTools.EvgenProdToolsConf
import CopyEventWeight
129 if not hasattr(postSeq,
"CopyEventWeight"):
130 postSeq += CopyEventWeight(mcEventWeightsKey=
"TMPEvtInfo.mcEventWeights")
132 from EvgenProdTools.EvgenProdToolsConf
import FillFilterValues
133 if not hasattr(postSeq,
"FillFilterValues"):
134 postSeq += FillFilterValues(mcFilterHTKey=
"TMPEvtInfo.mcFilterHT")
138 from EvgenProdTools.EvgenProdToolsConf
import CountHepMC
139 svcMgr.EventSelector.FirstEvent = runArgs.firstEvent
145 if not hasattr(postSeq,
"CountHepMC"):
146 postSeq += CountHepMC(InputEventInfo=
"TMPEvtInfo",
147 OutputEventInfo=
"EventInfo",
148 mcEventWeightsKey=
"TMPEvtInfo.mcEventWeights")
151 postSeq.CountHepMC.FirstEvent = runArgs.firstEvent
152 postSeq.CountHepMC.CorrectHepMC =
True
153 postSeq.CountHepMC.CorrectEventID =
True
157 if hasattr(runArgs,
"printEvts")
and runArgs.printEvts > 0:
158 from TruthIO.TruthIOConf
import PrintMC
160 postSeq.PrintMC.McEventKey =
"GEN_EVENT"
161 postSeq.PrintMC.VerboseOutput =
True
162 postSeq.PrintMC.PrintStyle =
"Barcode"
163 postSeq.PrintMC.FirstEvent = 1
164 postSeq.PrintMC.LastEvent = runArgs.printEvts
167 from EvgenProdTools.EvgenProdToolsConf
import SimTimeEstimate
168 if not hasattr(postSeq,
"SimTimeEstimate"):
169 postSeq += SimTimeEstimate()
173 if hasattr(runArgs,
"rivetAnas"):
174 from Rivet_i.Rivet_iConf
import Rivet_i
176 anaSeq.Rivet_i.Analyses = runArgs.rivetAnas
177 anaSeq.Rivet_i.AnalysisPath = os.environ[
'PWD']
178 if hasattr(runArgs,
"outputYODAFile"):
179 anaSeq.Rivet_i.HistoFile = runArgs.outputYODAFile
182 rel = os.popen(
"echo $AtlasVersion").
read()
184 if not rel
or int(rel[:2]) > 22:
185 from AthenaCommon.AppMgr
import ServiceMgr
186 ServiceMgr.EventSelector.EventsPerRun =
int(2**63 - 1)
193 evgenLog.debug(
"****************** LOADING PRE-INCLUDES AND JOB CONFIG *****************")
196 if hasattr(runArgs,
"preInclude"):
197 for fragment
in runArgs.preInclude:
201 if hasattr(runArgs,
"preExec"):
202 evgenLog.info(
"Transform pre-exec")
203 for cmd
in runArgs.preExec:
208 return [name
for name
in os.listdir(a_dir)
209 if os.path.isdir(os.path.join(a_dir, name))]
214 if hasattr(runArgs,
"outputTXTFile"): outputTXTFile=runArgs.outputTXTFile
218 if len(runArgs.jobConfig) != 1:
219 evgenLog.info(
"runArgs.jobConfig = %s" % runArgs.jobConfig)
220 evgenLog.error(
"You must supply one and only one jobConfig file argument")
223 evgenLog.info(
"Using JOBOPTSEARCHPATH (as seen in skeleton) = '%s'" % os.environ[
"JOBOPTSEARCHPATH"])
224 FIRST_DIR = (os.environ[
'JOBOPTSEARCHPATH']).
split(
":")[0]
226 jofiles = [f
for f
in os.listdir(FIRST_DIR)
if (f.startswith(
'mc')
and f.endswith(
'.py'))]
228 evgenLog.error(
"You must supply one and only one jobOption file in DSID directory")
232 joparts = (os.path.basename(jofile)).
split(
".")
235 if joparts[0].startswith(
"mc")
and all(c
in string.digits
for c
in joparts[0][2:]):
238 if len(joparts) != 3:
239 evgenLog.error(jofile +
" name format is wrong: must be of the form mc.<physicsShort>.py: please rename.")
242 jo_physshortpart = joparts[1]
243 max_jo_physshort_length = 50
244 if len(jo_physshortpart) > max_jo_physshort_length:
245 evgenLog.error(f
"{jofile} contains a physicsShort field of more than {max_jo_physshort_length} characters: please rename.")
248 jo_physshortparts = jo_physshortpart.split(
"_")
249 if len(jo_physshortparts) < 2:
250 evgenLog.error(jofile +
" has too few physicsShort fields separated by '_': should contain <generators>(_<tune+PDF_if_available>)_<process>. Please rename.")
253 check_jofiles=
"/cvmfs/atlas.cern.ch/repo/sw/Generators/MC16JobOptions/scripts/check_jo_consistency.py"
254 if os.path.exists(check_jofiles):
256 check_naming(os.path.basename(jofile))
258 evgenLog.waring(
"check_jo_consistency.py not found, will proceed without JOs check.")
269 evgenLog.debug(
"****************** CHECKING EVGEN CONFIGURATION *****************")
271 if hasattr(runArgs,
'inputGeneratorFile')
and int(evgenConfig.inputFilesPerJob) == 0 :
272 evgenConfig.inputFilesPerJob = 1
275 for opt
in str(evgenConfig).
split(os.linesep):
277 evgenLog.info(
".transform = Gen_tf")
280 evgenLog.info(
".platform = "+
str(os.environ[
'BINARY_TAG']))
285 if evgenConfig.obsolete:
286 evgenLog.error(
"JOs or icludes are obsolete, please check them")
289 if not evgenConfig.generators:
290 evgenLog.error(
"No entries in evgenConfig.generators: invalid configuration, please check your JO")
293 if len(evgenConfig.generators) > len(
set(evgenConfig.generators)):
294 evgenLog.error(
"Duplicate entries in evgenConfig.generators: invalid configuration, please check your JO")
297 gennames =
sorted(evgenConfig.generators, key=gen_sortkey)
299 if joparts[0].startswith(
"Mc"):
300 genpart = jo_physshortparts[0]
301 expectedgenpart =
''.
join(gennames)
303 expectedgenpart = expectedgenpart.replace(
"HerwigJimmy",
"Herwig")
318 if genpart !=
_norm(expectedgenpart)
and _norm2(genpart) !=
_norm(expectedgenpart):
319 evgenLog.error(
"Expected first part of JO name to be '%s' or '%s', but found '%s'" % (
_norm(expectedgenpart),
_norm(
_short2(expectedgenpart)), genpart))
320 evgenLog.error(
"gennames '%s' " %(expectedgenpart))
325 if not gens_notune(gennames)
and len(jo_physshortparts) < 3:
326 evgenLog.error(jofile +
" with generators " + expectedgenpart +
327 " has too few physicsShort fields separated by '_'." +
328 " It should contain <generators>_<tune+PDF_<process>. Please rename.")
334 if hasattr(runArgs,
"outputEVNTFile")
and not hasattr(runArgs,
"outputEVNT_PreFile"):
335 raise RuntimeError(
"'EvtGen' found in job options name, please set '--steering=afterburn'")
341 if hasattr(runArgs,
'inputGeneratorFile')
and ',' in runArgs.inputGeneratorFile: multiInput = runArgs.inputGeneratorFile.count(
',')+1
346 if not evgenConfig.nEventsPerJob:
347 evgenLog.info(
'#############################################################')
348 evgenLog.info(
' !!!! no nEventsPerJob set !!! The default 10000 used. !!! ')
349 evgenLog.info(
'#############################################################')
351 evgenLog.info(
' nEventsPerJob = ' +
str(evgenConfig.nEventsPerJob) )
353 if evgenConfig.minevents > 0 :
354 raise RuntimeError(
"evgenConfig.minevents is obsolete and should be removed from the JOs")
355 if evgenConfig.nEventsPerJob < 1:
356 raise RuntimeError(
"evgenConfig.nEventsPerJob must be at least 1")
357 elif evgenConfig.nEventsPerJob > 100000:
358 raise RuntimeError(
"evgenConfig.nEventsPerJob can be max. 100000")
360 allowed_nEventsPerJob_lt1000 = [1, 2, 5, 10, 20, 25, 50, 100, 200, 500, 1000]
361 msg =
"evgenConfig.nEventsPerJob = %d: " % evgenConfig.nEventsPerJob
363 if evgenConfig.nEventsPerJob >= 1000
and evgenConfig.nEventsPerJob <=10000
and (evgenConfig.nEventsPerJob % 1000 != 0
or 10000 % evgenConfig.nEventsPerJob != 0):
364 msg +=
"nEventsPerJob in range [1K, 10K] must be a multiple of 1K and a divisor of 10K"
365 raise RuntimeError(msg)
366 elif evgenConfig.nEventsPerJob > 10000
and evgenConfig.nEventsPerJob % 10000 != 0:
367 msg +=
"nEventsPerJob >10K must be a multiple of 10K"
368 raise RuntimeError(msg)
369 elif evgenConfig.nEventsPerJob < 1000
and evgenConfig.nEventsPerJob
not in allowed_nEventsPerJob_lt1000:
370 msg +=
"nEventsPerJob in range <= 1000 must be one of %s" % allowed_nEventsPerJob_lt1000
371 raise RuntimeError(msg)
372 postSeq.CountHepMC.RequestedOutput = evgenConfig.nEventsPerJob
if runArgs.maxEvents == -1
else runArgs.maxEvents
373 evgenLog.info(
'Requested output events = '+
str(postSeq.CountHepMC.RequestedOutput))
378 if hasattr(testSeq,
"TestHepMC")
and postSeq.CountHepMC.RequestedOutput<100:
379 testSeq.TestHepMC.EffFailThreshold = postSeq.CountHepMC.RequestedOutput/(postSeq.CountHepMC.RequestedOutput+1) - 0.01
382 if evgenConfig.keywords:
383 from GeneratorConfig.GenConfigHelpers
import checkKeywords
387 if evgenConfig.categories:
390 lkwfile =
"CategoryList.txt"
392 for p
in os.environ[
"DATAPATH"].
split(
":"):
393 lkwpath = os.path.join(p, lkwfile)
394 if os.path.exists(lkwpath):
400 with open(lkwpath,
'r')
as catlist:
402 allowed_list = ast.literal_eval(line)
403 allowed_cat.append(allowed_list)
407 it = iter(evgenConfig.categories)
411 if "L1:" in l2
and "L2:" in l1:
413 print (
"first",l1,
"second",l2)
414 bad_cat.extend([l1, l2])
415 for a1,a2
in allowed_cat:
416 if l1.strip().lower()==a1.strip().lower()
and l2.strip().lower()==a2.strip().lower():
419 msg =
"evgenConfig.categories contains non-standard category: %s. " %
", ".
join(bad_cat)
420 msg +=
"Please check the allowed categories list and fix."
425 evgenLog.warning(
"Could not find CategoryList.txt file %s in $DATAPATH" % lkwfile)
427 if hasattr( runArgs,
"outputEVNTFile")
or hasattr( runArgs,
"outputEVNT_PreFile"):
429 from AthenaPoolCnvSvc.WriteAthenaPool
import AthenaPoolOutputStream
430 from AthenaPoolCnvSvc.AthenaPoolCnvSvcConf
import AthenaPoolCnvSvc
431 if hasattr(runArgs,
"outputEVNTFile"):
432 poolFile = runArgs.outputEVNTFile
433 elif hasattr(runArgs,
"outputEVNT_PreFile"):
434 poolFile = runArgs.outputEVNT_PreFile
436 raise RuntimeError(
"Output pool file, either EVNT or EVNT_Pre, is not known.")
441 svcMgr.AthenaPoolCnvSvc.PoolAttributes += [ f
"DatabaseName = '{poolFile}'; FILEFORWARD_COMPATIBILITY = '1'" ]
442 svcMgr.AthenaPoolCnvSvc.OneDataHeaderForm =
False
446 StreamEVGEN.ForceRead =
True
447 StreamEVGEN.ItemList += [
"EventInfo#*",
"xAOD::EventInfo#EventInfo*",
"xAOD::EventAuxInfo#EventInfoAux.*",
"McEventCollection#*"]
448 StreamEVGEN.RequireAlgs += [
"EvgenFilterSeq"]
450 if evgenConfig.saveJets:
451 StreamEVGEN.ItemList += [
"xAOD::JetContainer#AntiKt4TruthJets",
"xAOD::AuxContainerBase!#AntiKt4TruthJetsAux.-PseudoJet.-constituentLinks.-constituentWeights"]
452 StreamEVGEN.ItemList += [
"xAOD::JetContainer#AntiKt6TruthJets",
"xAOD::AuxContainerBase!#AntiKt6TruthJetsAux.-PseudoJet.-constituentLinks.-constituentWeights"]
453 if evgenConfig.savePileupTruthParticles:
454 StreamEVGEN.ItemList += [
"xAOD::TruthParticleContainer#TruthPileupParticles*"]
455 StreamEVGEN.ItemList += [
"xAOD::TruthParticleAuxContainer#TruthPileupParticlesAux.*"]
458 for removeItem
in evgenConfig.doNotSaveItems: StreamEVGEN.ItemList.remove( removeItem )
461 for addItem
in evgenConfig.extraSaveItems: StreamEVGEN.ItemList += [ addItem ]
464 dsid = os.path.basename(runArgs.jobConfig[0])
465 if not dsid.isdigit():
467 svcMgr.EventSelector.RunNumber =
int(dsid)
470 from GeneratorConfig.Versioning
import generatorsGetInitialVersionedDictionary, generatorsVersionedStringList
474 import EventInfoMgt.EventInfoMgtInit
475 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"hepmc_version":
"HepMC" +
str(os.environ[
'HEPMCVER'])})
476 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"mc_channel_number":
str(dsid)})
477 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"lhefGenerator":
'+'.
join(
filter( gen_lhef, gennames ) ) })
478 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"generators":
'+'.
join(gennamesvers)})
479 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"evgenProcess": evgenConfig.process})
480 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"evgenTune": evgenConfig.tune})
481 if hasattr( evgenConfig,
"hardPDF" ) : svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"hardPDF": evgenConfig.hardPDF})
482 if hasattr( evgenConfig,
"softPDF" ) : svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"softPDF": evgenConfig.softPDF})
483 if hasattr( runArgs,
"randomSeed") : svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"randomSeed":
str(runArgs.randomSeed)})
484 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"keywords":
", ".
join(evgenConfig.keywords).lower()})
487 evgenLog.info(
"HepMC version " +
str(os.environ[
'HEPMCVER']))
490 from PyUtils
import AMITagHelper
491 AMITagHelper.SetAMITag(runArgs=runArgs)
494 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"beam_energy":
str(
int(runArgs.ecmEnergy*Units.GeV/2.0))})
495 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"beam_type":
'collisions'})
498 from OutputStreamAthenaPool.OutputStreamAthenaPoolConf
import CopyEventStreamInfo
499 streamInfoTool = CopyEventStreamInfo(
"StreamEVGEN_CopyEventStreamInfo" )
500 ToolSvc += streamInfoTool
501 svcMgr.MetaDataSvc.MetaDataTools += [ streamInfoTool ]
505 include(
"EvgenJobTransforms/Generate_ecmenergies.py")
507 if 'ParticleGun' in evgenConfig.generators:
509 from RngComps.RngCompsConf
import AtRndmGenSvc
511 include(
"EvgenJobTransforms/Generate_randomseeds.py")
514 include(
"EvgenJobTransforms/Generate_dsid_ranseed.py")
517 if 'Hijing' in evgenConfig.generators:
518 fixSeq.FixHepMC.PurgeUnstableWithoutEndVtx =
True
521 if (hasattr( runArgs,
"VERBOSE")
and runArgs.VERBOSE )
or (hasattr( runArgs,
"loglevel")
and runArgs.loglevel ==
"DEBUG")
or (hasattr( runArgs,
"loglevel")
and runArgs.loglevel ==
"VERBOSE"):
522 include(
"EvgenJobTransforms/Generate_debug_level.py")
525 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({
"specialConfiguration": evgenConfig.specialConfig })
529 if hasattr(testSeq,
"TestHepMC")
and not gens_testhepmc(evgenConfig.generators):
530 evgenLog.info(
"Removing TestHepMC sanity checker")
531 del testSeq.TestHepMC
539 with open(
'/cvmfs/atlas.cern.ch/repo/sw/Generators/MC16JobOptions/common/BlackList_caches.txt')
as bfile:
540 for line
in bfile.readlines():
544 badRelFlav=line.split(
',')[0].strip()
546 badCache=line.split(
',')[1].strip()
548 badGens=line.split(
',')[2].strip()
550 used_gens =
','.
join(generatorName)
552 if relFlavour==badRelFlav
and cache==badCache
and re.search(badGens,used_gens)
is not None:
553 if badGens==
"": badGens=
"all generators"
554 isError=relFlavour+
","+cache+
" is blacklisted for " + badGens
560 with open(
'/cvmfs/atlas.cern.ch/repo/sw/Generators/MC16JobOptions/common/PurpleList_generators.txt')
as bfile:
561 for line
in bfile.readlines():
565 purpleRelFlav=line.split(
',')[0].strip()
567 purpleCache=line.split(
',')[1].strip()
569 purpleGens=line.split(
',')[2].strip()
571 purpleProcess=line.split(
',')[3].strip()
573 used_gens =
','.
join(generatorName)
575 if relFlavour==purpleRelFlav
and cache==purpleCache
and re.search(purpleGens,used_gens)
is not None:
576 isError=relFlavour+
","+cache+
" is blacklisted for " + purpleGens +
" if it uses " + purpleProcess
581 evgenLog.debug(
"****************** CHECKING RELEASE IS NOT BLACKLISTED *****************")
582 if os.path.exists(
'/cvmfs/atlas.cern.ch/repo/sw/Generators/MC16JobOptions/common'):
585 if (hasattr( runArgs,
"ignoreBlackList")
and runArgs.ignoreBlackList):
586 evgenLog.warning(
"This run is blacklisted for this generator, please use a different one for production !! "+ errorBL )
588 raise RuntimeError(
"This run is blacklisted for this generator, please use a different one !! "+ errorBL)
592 evgenLog.warning(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
593 evgenLog.warning(
"!!! WARNING !!! "+ errorPL )
594 evgenLog.warning(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
597 msg.waring(
"No access to cvmfs, so blacklisted runs will not be checked")
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)))
862 if (hasattr( runArgs,
"allowOldFilter")
and runArgs.allowOldFilter):
863 for alg
in acas.iter_algseq(filtSeq):
864 filtName = alg.getType()
865 exceptName =[
'xAOD',
'Jet']
866 if filtName
not in excludedNames:
867 if not any(ex
in filtName
for ex
in exceptName):
868 alg.AllowOldFilter=
True
869 print(
"eA old filter allowed via transform param.")
875 from PyJobTransformsCore.runargs
import RunArguments
876 runPars = RunArguments()
877 runPars.nEventsPerJob = evgenConfig.nEventsPerJob
878 runPars.maxeventsstrategy = evgenConfig.maxeventsstrategy
879 with open(
"config.pickle",
"wb")
as f:
881 pickle.dump(runPars, f)
887 evgenLog.info(
"****************** STARTING EVENT GENERATION *****************")