4 from AthenaCommon.Logging
import logging
5 evgenLog = logging.getLogger(
'GenConfigHelpers')
9 LHEFGenerators = [
"Lhef",
10 "aMcAtNlo",
"McAtNlo",
"Powheg",
"MadGraph",
"CompHep",
"Geneva",
11 "MCFM",
"JHU",
"MEtop",
"BCVEGPY",
"Dire4Pythia8",
12 "BlackMax",
"QBH",
"gg2ww",
"gg2zz",
"gg2vv",
"HvyN",
13 "VBFNLO",
"FPMC",
"ProtosLHEF",
14 "BCVEGPY",
"STRINGS",
"Phantom"]
18 MainGenerators = [
"Herwig7"]
20 MainGenerators += [
"Pythia8",
"Pythia8B"]
22 MainGenerators += [
"Sherpa"]
24 MainGenerators += [
"Epos"]
26 MainGenerators += [
"ParticleGun"]
27 MainGenerators += [
"CosmicGenerator",
"BeamHaloGenerator"]
29 MainGenerators += [
"AMPT",
"Superchic",
"Starlight",
"Hijing",
"Hydjet"]
31 MainGenerators += [
"HepMCAscii"]
35 AfterburnerGenerators = [
"Photospp",
"TauolaPP",
"EvtGen",
"ParticleDecayer"]
39 KnownGenerators = LHEFGenerators + MainGenerators + AfterburnerGenerators
42 NoTestHepMCGenerators = [
"Superchic",
"ParticleDecayer",
"ParticleGun",
"CosmicGenerator",
43 "BeamHaloGenerator",
"FPMC",
"Hijing",
"Hydjet",
"Starlight"]
46 NoTuneGenerators = [
"ParticleGun",
"CosmicGenerator",
"BeamHaloGenerator",
"HepMCAscii"]
50 """Return a boolean of whether this set of generators requires the steering command line flag"""
51 if "EvtGen" not in gennames:
return False
52 if any((
"Pythia" in gen
and "Pythia8" not in gen)
for gen
in gennames):
return True
53 if any((
"Herwig" in gen
and "Herwig7" not in gen)
for gen
in gennames):
return True
57 """Return whether a generator name is known"""
58 return genname
in KnownGenerators
61 """Return whether all generator names are known"""
65 """Return whether a generator uses LHEF input files"""
66 return genname
in LHEFGenerators
69 """Return whether any of the generators uses LHEF input files"""
70 return any(
gen_lhef(g)
for g
in gennames)
73 """Return whether a generator should be sanity tested with TestHepMC"""
74 return genname
not in NoTestHepMCGenerators
77 """Return whether all of the generators should be sanity tested with TestHepMC"""
81 """Return whether a generator is allowed to not provide PDF and tune information"""
82 return genname
not in NoTuneGenerators
85 """Return whether all of the generators are allowed to not provide PDF and tune information"""
89 """Return a key suitable for sorting a generator name by stage, then alphabetically"""
93 for istage, gens
in enumerate([LHEFGenerators, MainGenerators, AfterburnerGenerators]):
99 return (genstage, genname)
103 import os, sys, string
105 joparts = (os.path.basename(jofile)).
split(
".")
107 if joparts[0].startswith(
"mc")
and all(c
in string.digits
for c
in joparts[0][2:]):
110 if len(joparts) != 3:
111 evgenLog.error(jofile +
" name format is wrong: must be of the form mc.<physicsShort>.py: please rename.")
114 jo_physshortpart = joparts[1]
115 if len(jo_physshortpart) > 50:
116 evgenLog.error(jofile +
" contains a physicsShort field of more than 60 characters: please rename.")
119 jo_physshortparts = jo_physshortpart.split(
"_")
120 if len(jo_physshortparts) < 2:
121 evgenLog.error(jofile +
" has too few physicsShort fields separated by '_': should contain <generators>(_<tune+PDF_if_available>)_<process>. Please rename.")
125 check_jofiles=
"/cvmfs/atlas.cern.ch/repo/sw/Generators/MC16JobOptions/scripts"
126 sys.path.append(check_jofiles)
127 from check_jo_consistency
import check_naming
128 if os.path.exists(check_jofiles):
129 check_naming(os.path.basename(jofile))
131 evgenLog.error(
"check_jo_consistency.py not found")
136 if sample.nEventsPerJob < 1:
137 raise RuntimeError(
"nEventsPerJob must be at least 1")
138 elif sample.nEventsPerJob > 100000:
139 raise RuntimeError(
"nEventsPerJob can be max. 100000")
141 allowed_nEventsPerJob_lt1000 = [1, 2, 5, 10, 20, 25, 50, 100, 200, 500, 1000]
142 if sample.nEventsPerJob >= 1000
and sample.nEventsPerJob <= 10000
and \
143 (sample.nEventsPerJob % 1000 != 0
or 10000 % sample.nEventsPerJob != 0):
144 raise RuntimeError(
"nEventsPerJob in range [1K, 10K] must be a multiple of 1K and a divisor of 10K")
145 elif sample.nEventsPerJob > 10000
and sample.nEventsPerJob % 10000 != 0:
146 raise RuntimeError(
"nEventsPerJob >10K must be a multiple of 10K")
147 elif sample.nEventsPerJob < 1000
and sample.nEventsPerJob
not in allowed_nEventsPerJob_lt1000:
148 raise RuntimeError(
"nEventsPerJob in range <= 1000 must be one of %s" % allowed_nEventsPerJob_lt1000)
152 from AthenaCommon.Utils.unixtools
import find_datafile
156 allowed_keywords = []
158 evgenLog.info(
"evgenkeywords = %s", kwpath)
159 kwf =
open(kwpath,
"r")
161 allowed_keywords += l.strip().lower().
split()
164 for k
in sample.keywords:
165 if k.lower()
not in allowed_keywords:
166 evil_keywords.append(k)
168 msg =
"keywords contains non-standard keywords: %s. " %
", ".
join(evil_keywords)
169 msg +=
"Please check the allowed keywords list and fix."
175 evgenLog.warning(
"evgenkeywords = not found ")
179 from AthenaCommon.Utils.unixtools
import find_datafile
185 from ast
import literal_eval
186 with open(lkwpath,
'r')
as catlist:
188 allowed_list = literal_eval(line)
189 allowed_cat.append(allowed_list)
193 it = iter(sample.categories)
197 if "L1:" in l2
and "L2:" in l1:
199 print (
"first",l1,
"second",l2)
200 bad_cat.extend([l1, l2])
201 for a1,a2
in allowed_cat:
202 if l1.strip().lower()==a1.strip().lower()
and l2.strip().lower()==a2.strip().lower():
205 msg =
"categories contains non-standard category: %s. " %
", ".
join(bad_cat)
206 msg +=
"Please check the allowed categories list and fix."
212 evgenLog.warning(
"Could not find CategoryList.txt file ", lkwpath,
" in $DATAPATH")