diff --git a/t/check_fifo.py b/t/check_fifo.py deleted file mode 100644 index 2f891a1..0000000 --- a/t/check_fifo.py +++ /dev/null @@ -1,234 +0,0 @@ -""" -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()