import os
import pkgutil
import stat
import warnings
from string import Template
from typing import List
import pyslha
from uncertainties import ufloat
from hepi.input import Input, Order, is_gluino, is_squark
from hepi.results import Result
from hepi.run import Runner, RunParam
[docs]class NLLfastRunner(Runner):
# TODO treat stop sbot separately
# TODO separate nll and nnll
[docs] def orders(self) -> List[Order]:
return [Order.LO, Order.NLO, Order.NLO_PLUS_NLL]
[docs] def _get_nf_proc(self, p: Input):
d = pyslha.read(self.get_output_dir() + p.slha)
mg = d.blocks["MASS"][1000021]
ms = 0.0
for r in range(1000001, 1000007):
ms += d.blocks["MASS"][r]
for r in range(2000001, 2000007):
ms += d.blocks["MASS"][r]
ms /= 12
if p.has_gluino() and p.has_squark():
return "sg", "cteq", ms, mg
if is_gluino(p.particle1) and is_gluino(p.particle2):
return "gg", "cteq", ms, mg
if is_squark(p.particle1) and is_squark(p.particle2):
if p.particle1 > 0 and p.particle2 > 0:
return "ss", "cteq", ms, mg
elif (p.particle1 > 0 and p.particle2 < 0) or (
p.particle1 < 0 and p.particle2 > 0
):
s = p.particle1 if p.particle1 > p.particle2 else p.particle2
b = p.particle2 if p.particle1 > p.particle2 else p.particle1
return "sb", "cteq", s, b
return "UNKNOWN_PROCESS_OR_UNIMPLEMENTED_PROCESS"
[docs] def _is_valid(self, file: str, p: Input, d) -> bool:
return super()._is_valid(file, p, d)
[docs] def _parse_file(self, file: str) -> Result:
# TODO parse result
ret = []
with open(file) as output:
for line in output:
if (
line.startswith("nn")
or line.startswith("ng")
or line.startswith("ns")
or line.startswith("sg")
or line.startswith("ll")
or line.startswith("gg")
or line.startswith("ss")
or line.startswith("sb")
): # TODO generalize
for s in line[2:].split():
ret.append(float(s))
return Result(
ufloat(ret[8], ret[8] * ret[9]),
ufloat(ret[10], ret[10] * ret[11]) if ret[10] != 0.0 else None,
None,
)
[docs] def _prepare(self, p: Input, **kwargs) -> RunParam:
rp = super()._prepare(p, **kwargs)
if not rp.skip:
d = p.__dict__
data = pkgutil.get_data(__name__, "prospino_main.f90_template").decode(
"utf-8"
)
src = Template(data)
# compute dependent pieces for template
for k, v in self._get_nf_input(p).items():
d[k] = v
result = src.substitute(d)
# open(rp.in_file, "w").write(result)
open(rp.out_file, "w").write(result + "\n\n")
# rdir = self.get_output_dir() + rp.name + ".rdir"
# if os.path.exists(rdir) and os.path.isdir(rdir):
# shutil.rmtree(rdir)
# shutil.copytree(self.get_path(),rdir)
# open(rdir +"/prospino_main.f90", "w").write(result)
## compile
# subprocess.Popen("cd " + rdir + " && make", shell=True,stdout=subprocess.DEVNULL).wait()
open(rp.execute, "w").write(
"#!/bin/sh\n"
+ "{path}/nll-fast {proc} {pdf} {sq} {gl}> {out}".format(
path=self.get_path(),
out=rp.out_file,
proc=d["nf_final_state_in"],
sq=d["nf_squark_mass"],
gl=d["nf_gluino_mass"],
pdf=d["nf_pdf"],
)
)
st = os.stat(rp.execute)
os.chmod(rp.execute, st.st_mode | stat.S_IEXEC)
sname = d["slha"]
with open(self.get_output_dir() + sname, "r") as f:
open(rp.out_file, "a").write(f.read() + "\n\n")
return rp
# Legacy
[docs]default_nllfast_runner = NLLfastRunner("~/git/nll-fast/")
"""Default Prospino Runner to provide backward compatibility"""
[docs]run = default_nllfast_runner.run
[docs]set_path = default_nllfast_runner.set_path
[docs]get_path = default_nllfast_runner.get_path