1"""! @package generators
2Event generation tools."""
14 """! Event generator base class."""
16 def __init__(self, name, command=None, **kwargs):
17 Component.__init__(self, name, command=command, description=
'', **kwargs)
23 if os.getenv(
"HPSMC_DIR")
is None:
24 raise Exception(
"HPSMC_DIR is not set!")
25 return "{}/share/generators".format(os.getenv(
"HPSMC_DIR",
None))
30 Run the EGS5 event generator to produce a StdHep file.
32 Required parameters are **seed**, **target_thickness**, **beam_energy**, **num_electrons** \n
33 Optional parameters are: **bunches**
47 EventGenerator.__init__(self, name,
"egs5_" + name, **kwargs)
50 """! Get installation directory."""
51 return EventGenerator.get_install_dir(self) +
"/egs5"
54 """! Setup of egs5 event generator."""
55 EventGenerator.setup(self)
69 if os.path.exists(
"data"):
73 if os.path.exists(
"pgs5job.pegs5inp"):
74 os.unlink(
"pgs5job.pegs5inp")
80 self.
logger.debug(
"Target thickness set from job param: {}".format(self.
target_dz))
82 raise Exception(
"Target thickness not set!")
88 seed_data =
" ".join(str(item)
for item
in [self.
seed, self.
target_dz, ebeam, electrons])
89 self.
logger.debug(
"Seed data (seed, target_dz, ebeam, electrons): {}".format(seed_data))
90 seed_file = open(
"seed.dat",
'w')
91 seed_file.write(seed_data)
95 """! Generate output file name.
96 @return moller.stdhep if name of generator contains moller; beam.stdhep else"""
98 if 'moller' in self.
name:
99 return [
'moller.stdhep']
101 return [
'beam.stdhep']
104 """! Execute event generator.
105 @param log_out name of log file for output
106 @param log_err name of log file for error
108 EventGenerator.execute(self, log_out, log_err)
109 if 'moller' not in self.
name:
110 src = os.path.join(self.rundir,
'brems.stdhep')
112 self.
logger.debug(
"Copying '%s' to '%s'" % (src, dest))
113 shutil.copy(src, dest)
117 Return required parameters.
119 Required parameters are **seed**, **target_thickness**, **beam_energy**, **num_electrons**
121 return [
'seed',
'target_thickness',
'beam_energy',
'num_electrons']
125 Return optional parameters.
127 Optional parameters are: **bunches**
136 """! Target processing and conversion of LHE files to StdHep using EGS5."""
139 EGS5.__init__(self, name, **kwargs)
141 if self.
namename not in [
"lhe_v1",
"lhe_rad",
"lhe_prompt",
"lhe_uniform",
"lhe_exponential"]:
142 raise Exception(
"The name '%s' is not valid for StdHepConverter tools." % self.
namename)
145 EGS5.config(self, parser)
148 """! Setup egs5 generator.
149 Throws exception if input LHE file is missing."""
152 raise Exception(
"Missing required input LHE file.")
155 """! Execute converter.
156 Calls egs5 generator.
158 @param log_out name of log file for output
159 @param log_err name of log file for error
160 @return egs5 error code
163 base, ext = os.path.splitext(input_file)
165 os.symlink(input_file,
"egs5job.inp")
167 with open(
"egs5job.inp",
'wb')
as outfile:
169 outfile.write(infile.read())
171 raise Exception(
'Input file has an unknown extension: %s' % input_file)
172 return EGS5.execute(self, log_out, log_err)
175 """! Converts *.lhe.gz and *.lhe to *.stdhep files."""
176 return [self.
input_files()[0].replace(
".lhe.gz",
".stdhep").replace(
".lhe",
".stdhep")]
181 Abstract class for MadGraph generators.
183 Required parameters are: **nevents**, **run_params** \n
184 Optional parameters are: **seed**, **param_card**, **apmass**, **map**, **mpid**, **mrhod**
214 if 'event_types' in kwargs:
220 EventGenerator.__init__(self, name, **kwargs)
223 """! Generate output file name."""
226 o.append(self.
namename +
"_unweighted_events.lhe.gz")
228 o.append(self.
namename +
"_events.lhe.gz")
232 """! Set parameters."""
233 Component.set_parameters(self, params)
234 self.
run_card =
"run_card_" + self.run_params +
".dat"
239 Return required parameters.
241 Required parameters are: **nevents**, **run_params**
243 return [
'nevents',
'run_params']
247 Return optional parameters.
249 Optional parameters are: **seed**, **param_card**, **apmass**, **map**, **mpid**, **mrhod**, **Map**, **mchi**, **dmchi**
251 return [
'seed',
'param_card',
'apmass',
'map',
'mpid',
'mrhod',
'Map',
'mchi',
'dmchi']
257 """! Make run card."""
261 with open(run_card,
'r')
as cardin:
262 data = cardin.readlines()
264 for i
in range(0, len(data)):
265 if "= nevents" in data[i]:
267 data[i] =
" " + str(self.
neventsnevents) +
" = nevents ! Number of unweighted events requested" +
'\n'
268 if "= iseed" in data[i]:
270 data[i] =
" " + str(self.
seedseed) +
" = iseed ! rnd seed (0=assigned automatically=default))" +
'\n'
272 with open(run_card,
'w')
as cardout:
273 cardout.writelines(data)
276 """! Make parameter card."""
278 self.
logger.debug(
"Making param card '%s'" % param_card)
280 with open(param_card,
'r')
as paramin:
281 data = paramin.readlines()
283 for i
in range(0, len(data)):
284 if "APMASS" in data[i]
and self.
apmass is not None:
285 data[i] =
" 622 %.7fe-03 # APMASS" % (self.
apmass) +
'\n'
286 self.
logger.debug(
"APMASS in param card set to %d" % self.
apmass)
287 if "MAp" in data[i]
and "622" in data[i]
and self.
apmass is not None:
288 data[i] =
" 622 %.7fe-03 # MAp" % (self.
apmass) +
'\n'
289 if "map" in data[i]
and self.
map is not None:
290 data[i] =
" 622 %.7fe-03 # map" % (self.
map) +
'\n'
291 if "mpid" in data[i]
and self.
mpid is not None:
292 data[i] =
" 624 %.7fe-03 # mpid" % (self.
mpid) +
'\n'
293 if "mrhod" in data[i]
and self.
mrhod is not None:
294 data[i] =
" 625 %.7fe-03 # mrhod" % (self.
mrhod) +
'\n'
295 if "Map" in data[i]
and "ap :" not in data[i]
and self.
Map is not None:
296 data[i] =
" 1 %.7e # Map\n" % (self.
Map/1000)
297 if "Mchi" in data[i]
and "dMchi" not in data[i]
and self.
mchi is not None:
298 data[i] =
" 1 %.7e # Mchi\n" % (self.
mchi/1000)
299 if "dMchi" in data[i]
and "Mchi/2" not in data[i]
and self.
dmchi is not None:
300 data[i] =
" 2 %.7e # dMchi" % (self.
dmchi/1000)
302 with open(param_card,
'w')
as paramout:
303 paramout.writelines(data)
306 """! Return command arguments."""
310 """! Execute MadGraph generator.
311 @param log_out name of log file for output
312 @param log_err name of log file for error
320 return Component.execute(self, log_out, log_err)
323 """! Setup event generator."""
324 EventGenerator.setup(self)
331 raise Exception(
"Missing apmass param for AP generation.")
335 """! Run the MadGraph 4 event generator."""
338 dir_map = {
"BH":
"BH/MG_mini_BH/apBH",
339 "RAD":
"RAD/MG_mini_Rad/apRad",
340 "TM":
"TM/MG_mini/ap",
341 "ap":
"ap/MG_mini/ap",
342 "trigg":
"trigg/MG_mini_Trigg/apTri",
343 "tritrig":
"tritrig/MG_mini_Tri_W/apTri",
344 "wab":
"wab/MG_mini_WAB/AP_6W_XSec2_HallB"}
348 MG.__init__(self, name, **kwargs)
351 raise Exception(
"The name '%s' is not valid for MG4." % self.
namenamename)
354 """! Get installation directory of MadGraph4."""
355 return EventGenerator.get_install_dir(self) +
"/madgraph4/src"
358 """! Setup MadGraph4 generator."""
361 proc_dirs = MG4.dir_map[self.
namenamename].split(os.sep)
362 src = os.path.join(self.
madgraph_dir, proc_dirs[0], proc_dirs[1])
364 self.
logger.debug(
"Copying '%s' to '%s'" % (src, dest))
365 shutil.copytree(src, dest, symlinks=
True)
375 run_card_dest = os.path.join(self.
rundir, proc_dirs[1], proc_dirs[2],
"Cards",
"run_card.dat")
376 self.
logger.debug(
"Copying run card from '%s' to '%s'" % (run_card_src, run_card_dest))
377 shutil.copyfile(run_card_src, run_card_dest)
382 param_card_dest = os.path.join(self.
rundir, proc_dirs[1], proc_dirs[2],
"Cards",
"param_card.dat")
383 self.
logger.debug(
"Copying param card from '%s' to '%s'" % (param_card_src, param_card_dest))
384 shutil.copyfile(param_card_src, param_card_dest)
389 """! Execute MadGraph4 generator.
390 @param log_out name of log file for output
391 @param log_err name of log file for error
394 returncode = MG.execute(self, log_out, log_err)
395 lhe_files = glob.glob(os.path.join(self.
event_dir,
"*.lhe.gz"))
397 dest = os.path.join(self.
rundir, os.path.basename(f))
398 self.
logger.debug(
"Copying '%s' to '%s'" % (f, dest))
405 """! Run the MadGraph 5 event generator."""
408 dir_map = {
"BH":
"BH",
410 "tritrig":
"tritrig",
412 "simp-3body":
"simp-3body",
420 MG.__init__(self, name, **kwargs)
423 raise Exception(
"The name '%s' is not valid for MG5." % self.
namenamename)
426 """! Get installation directory of MadGraph5."""
427 return EventGenerator.get_install_dir(self) +
"/madgraph5/src"
430 """! Setup MadGraph5 generator."""
438 self.
logger.debug(
"Copying '%s' to '%s'" % (src, dest))
439 shutil.copytree(src, dest, symlinks=
True)
443 input_dir = os.path.join(self.madgraph_dir, "input")
444 dest_input_dir = os.path.join(self.rundir, self.proc_dir, "input")
445 self.logger.info("Copying '%s' to '%s'" % (input_dir, dest_input_dir))
446 shutil.copytree(input_dir, dest_input_dir)
452 run_card_src = os.path.join(src,
"Cards", self.
run_card)
453 run_card_dest = os.path.join(dest,
"Cards",
"run_card.dat")
454 self.
logger.debug(
"Copying run card from '%s' to '%s'" % (run_card_src, run_card_dest))
455 shutil.copyfile(run_card_src, run_card_dest)
459 param_card_src = os.path.join(src,
"Cards", self.
param_card)
460 param_card_dest = os.path.join(dest,
"Cards",
"param_card.dat")
461 self.
logger.debug(
"Copying param card from '%s' to '%s'" % (param_card_src, param_card_dest))
462 shutil.copyfile(param_card_src, param_card_dest)
467 """! Execute MadGraph5 generator.
468 @param log_out name of log file for output
469 @param log_err name of log file for error
477 returncode = Component.execute(self, log_out, log_err)
480 lhe_files = glob.glob(os.path.join(self.
event_dir,
"*.lhe.gz"))
483 self.
logger.debug(
"Copying '%s' to '%s'" % (f, dest))
Base class for components in a job.
output_files(self)
Return a list of output files created by this component.
input_files(self)
Get a list of input files for this component.
Run the EGS5 event generator to produce a StdHep file.
egs5_dir
egs5 installation directory
execute(self, log_out, log_err)
Execute event generator.
egs5_data_dir
data directory
output_files(self)
Generate output file name.
beam_energy
beam energy in MeV
optional_parameters(self)
Return optional parameters.
target_thickness
target thickness in $\mu$m,
required_parameters(self)
Return required parameters.
setup(self)
Setup of egs5 event generator.
egs5_config_dir
config directory
num_electrons
number of electrons
get_install_dir(self)
Get installation directory.
__init__(self, name='', **kwargs)
Event generator base class.
required_parameters(self)
Return a list of required parameters.
__init__(self, name, command=None, **kwargs)
Run the MadGraph 4 event generator.
execute(self, log_out, log_err)
Execute MadGraph4 generator.
setup(self)
Setup MadGraph4 generator.
__init__(self, name='ap', **kwargs)
get_install_dir(self)
Get installation directory of MadGraph4.
Run the MadGraph 5 event generator.
execute(self, log_out, log_err)
Execute MadGraph5 generator.
__init__(self, name='tritrig', **kwargs)
setup(self)
Setup MadGraph5 generator.
get_install_dir(self)
Get installation directory of MadGraph5.
Abstract class for MadGraph generators.
execute(self, log_out, log_err)
Execute MadGraph generator.
output_files(self)
Generate output file name.
make_run_card(self, run_card)
Make run card.
optional_parameters(self)
Return optional parameters.
event_types
event types: weighted or unweighted
make_param_card(self, param_card)
Make parameter card.
required_parameters(self)
Return required parameters.
setup(self)
Setup event generator.
mchi
average dark fermion mass when running idm
set_parameters(self, params)
Set parameters.
param_card
Default name of param card.
__init__(self, name, **kwargs)
madgraph_dir
Install dir or user config will be used for this.
cmd_args(self)
Return command arguments.
dmchi
difference between dark fermion masses when running idm
Target processing and conversion of LHE files to StdHep using EGS5.
execute(self, log_out, log_err)
Execute converter.
output_files(self)
Converts *.lhe.gz and *.lhe to *.stdhep files.
setup(self)
Setup egs5 generator.
config(self, parser)
Automatic configuration.
__init__(self, name="lhe_v1", **kwargs)