Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F8723399
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
7 KB
Subscribers
None
View Options
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
Details
Attached
Mime Type
text/x-diff
Expires
Mon, Jan 20, 8:27 PM (9 h, 15 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4242227
Default Alt Text
(7 KB)
Attached To
rHEJ HEJ
Event Timeline
Log In to Comment