Page MenuHomeHEPForge

No OneTemporary

diff --git a/t/check_fifo.py b/t/check_fifo.py
new file mode 100644
index 0000000..2f891a1
--- /dev/null
+++ b/t/check_fifo.py
@@ -0,0 +1,234 @@
+"""
+Unit test for running HEJ with named pipes (fifo)
+
+
+Author: CE
+Date: 04/11/22
+"""
+from __future__ import print_function
+import math
+import os
+import sys
+import subprocess as sp
+
+# Import CE custom yofor testing dafile library
+sys.path.append("/home/s1533104/Documents/yodatools/yodafile/")
+from yodafile import Yodafile
+
+def get_integral(histo):
+ """
+ Get XS of a yodafile histogram. Different functions depending on if
+ histoND or ScatterND.
+ """
+ try:
+ #HistoND
+ total = histo.sumW()
+ except:
+ try:
+ #ScatterND
+ total = 0.
+ for i in range(len(histo.points())):
+ total += histo.yVals()[i] * (histo.xMaxs()[i]-histo.xMins()[i])
+ except:
+ print("[-] Could not test", histo.name(),"of type",histo.type())
+ return total
+
+def get_xs(hej_output):
+ """
+ Search HEJ output for xs and error
+ """
+ results = []
+ for line in hej_output.split("\n"):
+ if "+-" in line:
+ tokens = line.split(" ")
+ idl = 0
+ ids = 10000
+ for idx,token in enumerate(tokens):
+ if token == "+-":
+ idl = idx
+ elif len(token) > 1:
+ ids = min(ids, idx)
+ results.append([tokens[ids],float(tokens[idl-1]),\
+ float(tokens[idl+1])])
+ return results
+
+def check_yoda(yodafile):
+ """
+ Returns the content of a yodafile in a way which can then be compared
+ with other files to check equality.
+
+ Input expects a yodafile type object.
+ """
+ # Need to check multiple histo types
+ results = []
+ for histo in yodafile.histos:
+ if not histo.name().startswith("_") and not math.isnan(get_integral(histo)):
+ results.append([histo.name(), get_integral(histo)])
+ return results
+
+def make_fifo(fifoname):
+ """
+ Function to create a fifo file with name specified.
+ """
+ sp.call(["mkfifo", fifoname], shell=False)
+ return None
+
+def run_hej_with_fifo(fifoname, lhefile, ymlconfig, checkyoda):
+ """
+ Stream the contents of an lhefile to the fifo file
+ and at the same time read the lhefile in HEJ2.
+ """
+ print("[+] Starting to cat LHE file")
+ sp.Popen(["cat " + lhefile + " >> " +\
+ fifoname +" && echo [+] Finished cating file"], shell=True)
+ print("[+] Starting to read LHE file")
+ proc = sp.Popen(["HEJ", ymlconfig, fifoname], stdout=sp.PIPE)
+ stdout, stderr = proc.communicate()
+ results = stdout.decode('utf-8')
+ print(results)
+ results = results[results.find("Events processed"): results.find("Finished")]
+ print("\033[92m[+] Fifo XS results:",get_xs(results),"\033[0m")
+
+ # Wait for HEJto finish and then tidy up files
+ proc.wait()
+ sp.call(["rm", fifoname])
+
+ if checkyoda:
+ yodares = check_yoda(Yodafile.readfile("HEJ.yoda"))
+ print("\033[92m[+] Fifo yodafile results:",yodares,"\033[0m")
+
+ return get_xs(results)
+
+def run_hej_without_fifo(lhefile, ymlconfig, checkyoda):
+ """
+ Run HEJ "normally" without using fifo pipes to make sure result is the
+ same as when using the pipes.
+ """
+ print("[+] Running HEJ from LHE file")
+ proc = sp.Popen(["HEJ", ymlconfig, lhefile], stdout=sp.PIPE)
+ stdout, stderr = proc.communicate()
+ results = stdout.decode('utf-8')
+ results = results[results.find("Events processed"): results.find("Finished")]
+ print("\033[94m[+] Baseline XS results:",get_xs(results),"\033[0m")
+
+ # Wait for HEJto finish
+ proc.wait()
+
+ if checkyoda:
+ yodares = check_yoda(Yodafile.readfile("HEJ.yoda"))
+ print("\033[94m[+] Baseline yodafile results:",yodares,"\033[0m")
+ return get_xs(results)
+
+def test_fifo(fifoname, lhefile, ymlconfig, checkyoda=False):
+ """
+ Main method to test all fifo related changes
+ """
+ make_fifo(fifoname)
+ run_hej_with_fifo(fifoname, lhefile, ymlconfig, checkyoda)
+ return None
+
+def test_nofifo(lhefile, ymlconfig, checkyoda=False):
+ """
+ Main method to test all fifo related changes
+ """
+ run_hej_without_fifo(lhefile, ymlconfig, checkyoda)
+ return None
+
+def test_hepmc(lhefile, ymlconfig, checkyoda=False):
+ ymlconfig_hepmc = "config.yml"[0:-3]+"hepmc.yml"
+ make_hepmc_ymlfile(lhefile, ymlconfig, ymlconfig_hepmc)
+ run_hej_without_fifo("Sherpa.lhe", ymlconfig_hepmc, False)
+ proc = sp.Popen(["rivet","-q", "-a","MC_WJETS","-a","MC_XS","HEJ.hepmc3"],stdout=sp.PIPE)
+ stdout, stderr = proc.communicate()
+ results = stdout.decode('utf-8')
+
+ proc.wait()
+ sp.call(["rm", ymlconfig_hepmc])
+ if checkyoda:
+ yodares = check_yoda(Yodafile.readfile("Rivet.yoda"))
+ print("\033[96m[+] Baseline yodafile results:",yodares,"\033[0m")
+
+ return None
+
+
+def test_hepmc_fifo(fifoname, lhefile, ymlconfig, checkyoda=False):
+ ymlconfig_hepmc = "config.yml"[0:-3]+"hepmc.yml"
+ make_hepmc_ymlfile(lhefile, ymlconfig, ymlconfig_hepmc)
+ make_fifo("HEJ.hepmc3")
+
+ print("[+] Starting HEJ with rivet output")
+ #sp.Popen(["cat " + lhefile + " >> " +\
+ # fifoname +" && echo [+] Finished cating file"], shell=True)
+ #print("[+] Starting to read LHE file")
+ proc = sp.Popen(["HEJ", ymlconfig_hepmc, lhefile], stdout=sp.PIPE)
+ #proc2 = sp.Popen(["cat HEJ.hepmc3 >> op.hepmc3"], stdout=sp.PIPE, shell=True)
+ proc2 = sp.Popen(["rivet","-v","-a","MC_WJETS","-a","MC_XS", "HEJ.hepmc3"],stdout=sp.PIPE)
+
+ stdout, stderr = proc.communicate()
+ results = stdout.decode('utf-8')
+ results = results[results.find("Events processed"): results.find("Finished")]
+ print("\033[92m[+] HEPMC Fifo XS results:",get_xs(results),"\033[0m")
+
+ # Wait for HEJto finish and then tidy up files
+ proc.wait()
+ proc2.wait()
+ #sp.call(["rm", fifoname, "HEJ.hepmc3", ymlconfig_hepmc])
+
+ if checkyoda:
+ yodares = check_yoda(Yodafile.readfile("Rivet.yoda"))
+ print("\033[92m[+] Fifo yodafile results:",yodares,"\033[0m")
+
+ return None
+
+
+def make_hepmc_ymlfile(lhefile, ymlconfig, hepmcconfig):
+ """
+ Run HEJ with hepmc output in serial without pipes
+ """
+
+ # Modify config file to include hepmc output
+ with open(ymlconfig, "r") as f:
+ contents = f.readlines()
+
+ contents.insert(20, "event output:\n")
+ contents.insert(21, " - HEJ.hepmc3\n")
+ contents.insert(22, "\n")
+
+ with open(hepmcconfig, "w") as f:
+ contents = "".join(contents)
+ f.write(contents)
+ return None
+
+
+def force_clean():
+ sp.call(["rm -rf *.yoda *.hepmc3"], shell=True)
+ return None
+
+def main():
+ """
+ Main test method
+ """
+ print("[+] Checking total XS from HEJ")
+ test_fifo("fifo.lhe", "Sherpa.lhe", "config.yml")
+ force_clean()
+ test_nofifo("Sherpa.lhe", "config.yml")
+ force_clean()
+
+ print("[+] Checking rivet output from HEJ")
+ test_fifo("fifo.lhe", "Sherpa.lhe", "config.yml", checkyoda=True)
+ force_clean()
+ test_nofifo( "Sherpa.lhe", "config.yml", checkyoda=True)
+ force_clean()
+
+
+ #HepMC output not working due to a problem in rivet.
+
+ #print("[+] Checking rivet output from hepmc")
+ #test_hepmc("Sherpa.lhe", "config.yml", checkyoda=True)
+ #force_clean()
+ #test_hepmc_fifo("Sherpa.lhe","Sherpa.lhe", "config.yml", checkyoda=True)
+ #force_clean()
+
+if __name__ == "__main__":
+
+ main()

File Metadata

Mime Type
text/x-diff
Expires
Mon, Jan 20, 8:27 PM (12 h, 7 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4242227
Default Alt Text
(7 KB)

Event Timeline