diff --git a/.github/workflows/generate_madtrex_assets.py b/.github/workflows/generate_madtrex_assets.py new file mode 100644 index 0000000000..35212c0900 --- /dev/null +++ b/.github/workflows/generate_madtrex_assets.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 +"""Script to (re)generate the MadtRex CI test assets for one process: + - an LHE event sample (test/MadtRex_baseline/_events.lhe.gz) + - the corresponding reweight baseline (test/MadtRex_baseline/_rwgt.csv) + +This is NOT run in CI. The idea is to run it locally every now and then +(whenever the generated *.mad code or something crucial changes) and commit the +resulting files, the same way epochX/cudacpp/CODEGEN/allGenerateAndCompare.sh +is used to regenerate reference outputs. + +Usage (from epochX/cudacpp): + ../../.github/workflows/generate_madtrex_assets.py gg_tt.mad +""" +import shutil +import subprocess +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import madtrex_common as common + +MADGRAPH_CLI = Path.cwd() / ".." / ".." / "MG5aMC" / "mg5amcnlo" / "bin" / "mg5_aMC" + +def generate_dat_content(process_dir: Path, rwgt_card_path: Path, process: str) -> str: + dat = common.model_import_lines(process) + dat += f"launch {process_dir}\n" + dat += "reweight=madtrex\n" + dat += "set nevents 10000\n" + dat += f"set iseed {common.ISEED}\n" + dat += f"{rwgt_card_path}\n" + return dat + +def main() -> int: + process_dir = Path(sys.argv[1]) + process = process_dir.name.replace(".mad", "") + + HOME = Path.cwd() + process_path = (HOME / process_dir).resolve() + if not process_path.exists(): + print(f"ERROR: Process {process} not found at: {process_path}", file=sys.stderr) + return 1 + + if process not in common.ALLOWED_PROCESSES: + print( + f"ERROR: PROCESS '{process}' is not in the allowed list.\n" + f"Allowed: {sorted(common.ALLOWED_PROCESSES)}", + file=sys.stderr, + ) + return 1 + + rwgt_card_path = HOME / "rwgt_card.dat" + common.write_rwgt_card(rwgt_card_path) + + dat_path = HOME / f"{process}.dat" + dat_path.write_text(generate_dat_content(process_dir, rwgt_card_path, process), encoding="utf-8") + + # Check that the CUDACPP_OUTPUT plugin is present: required for MadtRex reweighting + error = common.check_cudacpp_plugin_present(HOME) + if error: + print(error, file=sys.stderr) + return 1 + + LOGS = HOME / "logs" + LOGS.mkdir(exist_ok=True) + stdout_log = LOGS / f"mg5_{process}.stdout.log" + stderr_log = LOGS / f"mg5_{process}.stderr.log" + print(f"Launching: {MADGRAPH_CLI} {dat_path}") + with stdout_log.open("wb") as out, stderr_log.open("wb") as err: + result = subprocess.run( + [str(MADGRAPH_CLI), str(dat_path)], + cwd=str(HOME), + stdout=out, + stderr=err, + check=False, + ) + if result.returncode != 0: + print(f"ERROR: mg5_aMC exited with code {result.returncode}.", file=sys.stderr) + common.dump_logs(stdout_log, stderr_log) + return result.returncode + print(f"mg5_aMC finished. Logs:\n stdout: {stdout_log}\n stderr: {stderr_log}") + + dat_path.unlink(missing_ok=True) + + # Locate the generated run's LHE file (the only run in a freshly generated process dir) + run_dirs = sorted((process_path / "Events").glob("run_*")) + if not run_dirs: + print(f"ERROR: No Events/run_* directory found under {process_path}", file=sys.stderr) + common.dump_logs(stdout_log, stderr_log) + return 1 + if len(run_dirs) > 1: + print(f"WARNING: Multiple runs found, using the last one: {[d.name for d in run_dirs]}") + run_dir = run_dirs[-1] + lhe_src = run_dir / "unweighted_events.lhe.gz" + if not lhe_src.exists(): + print(f"ERROR: Expected LHE file not found at: {lhe_src}", file=sys.stderr) + common.dump_logs(stdout_log, stderr_log) + return 1 + + madtrex_csv = process_path / "rw_me" / "SubProcesses" / "rwgt_results.csv" + if not madtrex_csv.exists(): + print(f"ERROR: Expected results not found at: {madtrex_csv}", file=sys.stderr) + common.dump_logs(stdout_log, stderr_log) + return 1 + + lhe_dst = common.baseline_lhe_path(HOME, process) + csv_dst = common.baseline_csv_path(HOME, process) + lhe_dst.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(lhe_src, lhe_dst) + shutil.copyfile(madtrex_csv, csv_dst) + print(f"Updated asset: {lhe_dst}") + print(f"Updated asset: {csv_dst}") + print("Please review and commit these files.") + + return 0 + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.github/workflows/madtrex_common.py b/.github/workflows/madtrex_common.py new file mode 100644 index 0000000000..e4f638a91c --- /dev/null +++ b/.github/workflows/madtrex_common.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +"""Shared constants/helpers for the MadtRex CI test (run_madtrex.py) and the +dev-only asset regeneration script (generate_madtrex_assets.py).""" +import csv +import os +import re +from pathlib import Path + +ALLOWED_PROCESSES = [ "ee_mumu", "gg_tt", "gg_tt01g", "gg_ttg", "gg_ttgg", "gg_ttggg", "gq_ttq", "heft_gg_bb", "nobm_pp_ttW", "pp_tt012j", "smeft_gg_tttt", "susy_gg_t1t1", "susy_gg_tt" ] + +# Run name used for the (real or restored) event sample: must match MadGraph's +# default first-run naming, since the asset is restored without a results database. +RUN_NAME = "run_01" + +ISEED = 489 + +BASELINE_DIR = Path("CODEGEN") / "PLUGIN" / "CUDACPP_SA_OUTPUT" / "test" / "MadtRex_baseline" + +def baseline_csv_path(home: Path, process: str) -> Path: + return home / BASELINE_DIR / f"{process}_rwgt.csv" + +def baseline_lhe_path(home: Path, process: str) -> Path: + return home / BASELINE_DIR / f"{process}_events.lhe.gz" + +def is_executable(path: Path) -> bool: + return path.is_file() and os.access(path, os.X_OK) + +def mg5amcnlo_dir(home: Path) -> Path: + """Location of the MG5aMC/mg5amcnlo checkout relative to HOME (epochX/cudacpp).""" + return home / ".." / ".." / "MG5aMC" / "mg5amcnlo" + +def check_cudacpp_plugin_present(home: Path) -> str: + """Check that PLUGIN/CUDACPP_OUTPUT exists (directory or symlink to one) inside + the mg5amcnlo checkout: it is required for MadtRex reweighting to work. + Returns an error message if missing, or an empty string if the check passes.""" + plugin_dir = mg5amcnlo_dir(home) / "PLUGIN" / "CUDACPP_OUTPUT" + if not plugin_dir.is_dir(): + return ( + f"ERROR: CUDACPP_OUTPUT plugin not found at:\n {plugin_dir}\n" + f"It is required for MadtRex reweighting. Create it, e.g. with:\n" + f" cd {plugin_dir.parent} && ln -s ../../MG5aMC_PLUGIN/CUDACPP_OUTPUT ./" + ) + return "" + +def set_mg5_path(me5_configuration_path: Path, mg5_path: Path) -> None: + """Set (uncomment/overwrite) the mg5_path entry in me5_configuration.txt so that + bin/madevent can find the mg5amcnlo checkout needed for MadtRex reweighting, + without going through bin/mg5_aMC's 'launch' command.""" + text = me5_configuration_path.read_text(encoding="utf-8") + text = re.sub(r"^#?\s*mg5_path\s*=.*$", f"mg5_path = {mg5_path}", text, flags=re.MULTILINE) + me5_configuration_path.write_text(text, encoding="utf-8") + +def write_rwgt_card(path: Path) -> None: + if path.exists(): + return + content = """launch\nset sminputs 1 scan:[j for j in range(100,200,10)]\n""" + path.write_text(content, encoding="utf-8") + +def load_csv(path): + with open(path, newline="") as f: + reader = csv.DictReader(f, fieldnames=["RWGT", "VALUE", "ERROR"]) + for row in reader: + yield float(row["VALUE"]), float(row["ERROR"]) + +def dump_logs(stdout_log, stderr_log): + print("Dumping run logs...") + print("==== STDOUT ====") + with open(stdout_log, "r") as file: + print(file.read()) + print("\n\n==== STDERR ====") + with open(stderr_log, "r") as file: + print(file.read()) + print("================") + +def compare_csv(baseline_csv: Path, madtrex_csv: Path) -> bool: + all_ok = True + for i, ((v_base, _), (v_mad, _)) in enumerate(zip(load_csv(baseline_csv), load_csv(madtrex_csv)), start=1): + diff = abs(v_base - v_mad) + tol = 0.05 * v_mad + if diff >= tol: + print(f"Error: Row {i}: |{v_base} - {v_mad}| = {diff} >= {tol}") + all_ok = False + return all_ok diff --git a/.github/workflows/run_madtrex.py b/.github/workflows/run_madtrex.py new file mode 100755 index 0000000000..1a404c7a44 --- /dev/null +++ b/.github/workflows/run_madtrex.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python3 +import shutil +import subprocess +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import madtrex_common as common + +def generate_dat_content(process: str) -> str: + dat = f"reweight {common.RUN_NAME} -from_cards --plugin=madtrex\n" + return dat + +def restore_lhe(lhe_asset: Path, process_path: Path) -> Path: + """Decompress the committed LHE asset into Events//unweighted_events.lhe.gz, + the location MadGraph expects for an existing run (no run database needed: the banner + is read straight from the LHE file itself).""" + events_dir = process_path / "Events" / common.RUN_NAME + events_dir.mkdir(parents=True, exist_ok=True) + lhe_dst = events_dir / "unweighted_events.lhe.gz" + shutil.copyfile(lhe_asset, lhe_dst) + return lhe_dst + +def main() -> int: + # Name of the directory of the process to test + process_dir = Path(sys.argv[1]) + # Label for the process (must be in the allowed list) + process = process_dir.name.replace(".mad", "") + + # Treat current working directory as HOME + HOME = Path.cwd() + + process_path = (HOME / process_dir).resolve() + if not process_path.exists(): + print(f"ERROR: Process {process} not found at: {process_path}", file=sys.stderr) + return 1 + + if process not in common.ALLOWED_PROCESSES: + print( + f"ERROR: PROCESS '{process}' is not in the allowed list.\n" + f"Allowed: {sorted(common.ALLOWED_PROCESSES)}", + file=sys.stderr, + ) + return 1 + + # Check that baseline rwgt.csv exists + baseline_csv = common.baseline_csv_path(HOME, process) + if not baseline_csv.exists(): + print( + f"ERROR: Baseline rwgt.csv not found at:\n {baseline_csv}\n" + f"Ensure the baseline file exists before running.", + file=sys.stderr, + ) + return 1 + + # Check that the pre-generated LHE asset exists, and restore it into the run directory + lhe_asset = common.baseline_lhe_path(HOME, process) + if not lhe_asset.exists(): + print( + f"ERROR: LHE asset not found at:\n {lhe_asset}\n" + f"Generate it with generate_madtrex_assets.py and commit it before running.", + file=sys.stderr, + ) + return 1 + restore_lhe(lhe_asset, process_path) + + # Write reweight_card.dat directly into the process Cards directory (consumed via -from_cards) + rwgt_card_path = process_path / "Cards" / "reweight_card.dat" + common.write_rwgt_card(rwgt_card_path) + + # Write PROCESS.dat to HOME + dat_path = HOME / f"{process}.dat" + dat_path.write_text(generate_dat_content(process), encoding="utf-8") + + # Check that the CUDACPP_OUTPUT plugin is present: required for MadtRex reweighting + error = common.check_cudacpp_plugin_present(HOME) + if error: + print(error, file=sys.stderr) + return 1 + + # Point me5_configuration.txt at this repo's mg5amcnlo checkout: required for + # MadtRex reweighting, which uses it directly instead of going through bin/mg5_aMC + common.set_mg5_path( + process_path / "Cards" / "me5_configuration.txt", + common.mg5amcnlo_dir(HOME).resolve(), + ) + + # Run bin/madevent with PROCESS.dat as argument, wait for completion + madevent_bin = process_path / "bin" / "madevent" + LOGS = HOME / "logs" + LOGS.mkdir(exist_ok=True) + stdout_log = LOGS / f"mg5_{process}.stdout.log" + stderr_log = LOGS / f"mg5_{process}.stderr.log" + print(f"Launching: {madevent_bin} {dat_path}") + try: + with stdout_log.open("wb") as out, stderr_log.open("wb") as err: + result = subprocess.run( + [str(madevent_bin), str(dat_path)], + cwd=str(process_path), + stdout=out, + stderr=err, + check=False, + ) + if result.returncode != 0: + print( + f"ERROR: bin/madevent exited with code {result.returncode}. " + f"See logs:\n stdout: {stdout_log}\n stderr: {stderr_log}", + file=sys.stderr, + ) + common.dump_logs(stdout_log, stderr_log) + return result.returncode + else: + print(f"bin/madevent finished. Logs:\n stdout: {stdout_log}\n stderr: {stderr_log}") + except FileNotFoundError: + print(f"ERROR: Failed to launch {madevent_bin}", file=sys.stderr) + return 1 + except Exception as e: + print(f"ERROR: bin/madevent run failed: {e}", file=sys.stderr) + return 1 + + # Remove process.dat + dat_path.unlink(missing_ok=True) + + # Get rwgt_results.csv results file + madtrex_csv = process_path / "rw_me" / "SubProcesses" / "rwgt_results.csv" + if not madtrex_csv.exists(): + print( + f"ERROR: Expected results not found at:\n {madtrex_csv}\n" + f"Ensure the run produced rwgt_results.csv.", + file=sys.stderr, + ) + common.dump_logs(stdout_log, stderr_log) + return 1 + + if not common.compare_csv(baseline_csv, madtrex_csv): + print(f"Some checks failed for process {process}.", file=sys.stderr) + sys.exit(1) + print(f"All checks passed for process {process}.") + + return 0 + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.github/workflows/testsuite_oneprocess.yml b/.github/workflows/testsuite_oneprocess.yml index 478b5eac3c..8d9d428480 100644 --- a/.github/workflows/testsuite_oneprocess.yml +++ b/.github/workflows/testsuite_oneprocess.yml @@ -1,7 +1,7 @@ -# Copyright (C) 2020-2024 CERN and UCLouvain. +# Copyright (C) 2020-2025 CERN and UCLouvain. # Licensed under the GNU Lesser General Public License (version 3 or later). # Created by: A. Valassi (Oct 2023) for the MG5aMC CUDACPP plugin. -# Further modified by: A. Valassi (2023-2024) for the MG5aMC CUDACPP plugin. +# Further modified by: A. Valassi, D. Massaro (2023-2025) for the MG5aMC CUDACPP plugin. #---------------------------------------------------------------------------------------------------------------------------------- @@ -279,4 +279,110 @@ jobs: env: GH_TOKEN: ${{ github.token }} + madtrex: + if: ${{ endsWith(inputs.process, '.mad') }} # Reweighting test to do only in case of madevent + runs-on: ubuntu-22.04 # Python 3.12 not yet supported for reweighting + needs: codegen + + steps: + - uses: actions/checkout@v4 + with: + submodules: 'true' + + - name: split_prnum + # See https://stackoverflow.com/a/73467112 + id: split + run: echo "prnum=PR${GITHUB_REF_NAME%%/*}" >> $GITHUB_OUTPUT + + - name: HELLO_MADTREX + run: | + echo "HELLO_MADTREX ${{ inputs.process }} $(date)" + echo "Workflow run_id is ${{ github.run_id }}" + echo "Workflow ref_name is ${{ github.ref_name }}" + echo "Workflow PR number is ${{ steps.split.outputs.prnum }}" + echo "Current directory is $(pwd)" + echo "Current git commit is $(git log --oneline -n1 | cut -d' ' -f1)" + gh extension install actions/gh-actions-cache + REPO=${{ github.repository }} + echo "List codegencache keys for this run_id (start)" + gh actions-cache list -R $REPO --sort created-at --order asc --key codegencache-${{ runner.os }}-${{ inputs.process }}-${{ github.run_id }} + echo "List codegencache keys for this run_id (end)" + env: + GH_TOKEN: ${{ github.token }} + + - name: restore_codegen_cache + id: codegen-cache-restore + uses: actions/cache/restore@v4 + with: + path: | + epochX/cudacpp/${{ inputs.process }} + key: codegencache-${{ runner.os }}-${{ inputs.process }}-${{ github.run_id }} + restore-keys: | + codegencache-${{ runner.os }}-${{ inputs.process }}-${{ github.run_id }} + + - name: symlink_plugin + run: | + cd MG5aMC/mg5amcnlo/PLUGIN + ln -s ../../MG5aMC_PLUGIN/CUDACPP_OUTPUT ./ + + - name: check_f2py + run: | + # check if f2py is installed, if not, install it + if type -P "f2py" &>/dev/null; then + echo "f2py is installed" + else + echo "f2py not found" + echo "check if numpy.f2py is present" + if python3 -m numpy.f2py -v &>/dev/null; then + echo "numpy.f2py is installed correctly, creating wrapper" + else + echo "numpy.f2py not found, it will be installed" + sudo apt update && sudo apt install -y python3-numpy + echo "Installation done, now create wrapper" + fi + mkdir -p "$HOME/.local/bin" + echo '#!/usr/bin/env bash' > "$HOME/.local/bin/f2py" + echo 'exec python3 -m numpy.f2py "$@"' >> "$HOME/.local/bin/f2py" + chmod +x "$HOME/.local/bin/f2py" + echo "$HOME/.local/bin" >> "$GITHUB_PATH" # this updates path for the subsequent steps + export PATH="$HOME/.local/bin:$PATH" # this for the current step + fi + + # Validate that "f2py" actually executes (not just resolves) + if ! f2py -v &>/dev/null; then + echo "f2py resolves but does not execute correctly." + echo "Cannot run reweighting!" + exit 1 + fi + + - name: init_madgraph_configuration_and_model + # Run mg5_aMC once (and immediately exit) so it generates input/mg5_configuration.txt: + # required for reweighting, which uses the mg5amcnlo checkout directly without + # going through bin/mg5_aMC's 'launch' command. + # additionally, re-import any needed model after having cleared the cache + # so that the model is re-built correctly to be used during reweighting + run: | + model=$(awk '/import model/ { print $3 }' epochX/cudacpp/${{ inputs.process }}/mg5.in) + rm -rf "MG5aMC/mg5amcnlo/models/$model/__pycache__" 2>/dev/null + echo "set auto_convert_model T; import model $model; exit" | MG5aMC/mg5amcnlo/bin/mg5_aMC + + - name: madtrex_test + run: | + cd epochX/cudacpp + ../../.github/workflows/run_madtrex.py ${{ inputs.process }} + + - name: GOODBYE_MADTREX + run: | + echo "GOODBYE_MADTREX ${{ inputs.process }} $(date)" + echo "Workflow run_id is ${{ github.run_id }}" + echo "Workflow ref_name is ${{ github.ref_name }}" + echo "Workflow PR number is ${{ steps.split.outputs.prnum }}" + echo "Current directory is $(pwd)" + echo "Current git commit is $(git log --oneline -n1 | cut -d' ' -f1)" + REPO=${{ github.repository }} + echo "List codegencache keys for this run_id (start)" + gh actions-cache list -R $REPO --sort created-at --order asc --key codegencache-${{ runner.os }}-${{ inputs.process }}-${{ github.run_id }} + echo "List codegencache keys for this run_id (end)" + env: + GH_TOKEN: ${{ github.token }} #---------------------------------------------------------------------------------------------------------------------------------- diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MadtRex/makefiles/cudacpp_rex_src.mk b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MadtRex/makefiles/cudacpp_rex_src.mk index f70a3406f0..9012e7070a 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MadtRex/makefiles/cudacpp_rex_src.mk +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MadtRex/makefiles/cudacpp_rex_src.mk @@ -175,10 +175,12 @@ define ATOMIC_COPY endef # Rex and teaRex: copy .so from src to LIBDIR atomically -$(LIBDIR)/librex.so : ../src/librex.so +# (NB: $(LIBDIR)/.build.$(TAG) is listed as an extra prerequisite only to ensure that +# $(LIBDIR) has already been created: otherwise this races against it under parallel make) +$(LIBDIR)/librex.so : ../src/librex.so $(LIBDIR)/.build.$(TAG) $(ATOMIC_COPY) -$(LIBDIR)/libtearex.so : ../src/libtearex.so +$(LIBDIR)/libtearex.so : ../src/libtearex.so $(LIBDIR)/.build.$(TAG) $(ATOMIC_COPY) #------------------------------------------------------------------------------- diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/ee_mumu_events.lhe.gz b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/ee_mumu_events.lhe.gz new file mode 100644 index 0000000000..3875beec73 Binary files /dev/null and b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/ee_mumu_events.lhe.gz differ diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/ee_mumu_rwgt.csv b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/ee_mumu_rwgt.csv new file mode 100644 index 0000000000..b5d6dea383 --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/ee_mumu_rwgt.csv @@ -0,0 +1,10 @@ +rwgt_1, 0.192643, 0.000369955 +rwgt_2, 0.147917, 0.000209707 +rwgt_3, 0.123296, 0.000121504 +rwgt_4, 0.10742, 6.46169e-05 +rwgt_5, 0.0963473, 7.37224e-05 +rwgt_6, 0.0882291, 9.45315e-05 +rwgt_7, 0.0820625, 0.000110353 +rwgt_8, 0.0772502, 0.000122714 +rwgt_9, 0.073413, 0.000132581 +rwgt_10, 0.0702989, 0.000140599 diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_tt01g_events.lhe.gz b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_tt01g_events.lhe.gz new file mode 100644 index 0000000000..2180f2a49e Binary files /dev/null and b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_tt01g_events.lhe.gz differ diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_tt01g_rwgt.csv b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_tt01g_rwgt.csv new file mode 100644 index 0000000000..9acb3ea56c --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_tt01g_rwgt.csv @@ -0,0 +1,10 @@ +rwgt_1, 844.414, 1.5072 +rwgt_2, 844.414, 1.5072 +rwgt_3, 844.414, 1.5072 +rwgt_4, 844.414, 1.5072 +rwgt_5, 844.414, 1.5072 +rwgt_6, 844.414, 1.5072 +rwgt_7, 844.414, 1.5072 +rwgt_8, 844.414, 1.5072 +rwgt_9, 844.414, 1.5072 +rwgt_10, 844.414, 1.5072 diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_tt_events.lhe.gz b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_tt_events.lhe.gz new file mode 100644 index 0000000000..7d00e3e58c Binary files /dev/null and b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_tt_events.lhe.gz differ diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_tt_rwgt.csv b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_tt_rwgt.csv new file mode 100644 index 0000000000..641e4f62b1 --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_tt_rwgt.csv @@ -0,0 +1,10 @@ +rwgt_1, 440.675, 0.366505 +rwgt_2, 440.675, 0.366505 +rwgt_3, 440.675, 0.366505 +rwgt_4, 440.675, 0.366505 +rwgt_5, 440.675, 0.366505 +rwgt_6, 440.675, 0.366505 +rwgt_7, 440.675, 0.366505 +rwgt_8, 440.675, 0.366505 +rwgt_9, 440.675, 0.366505 +rwgt_10, 440.675, 0.366505 diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttg_events.lhe.gz b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttg_events.lhe.gz new file mode 100644 index 0000000000..6a8db0629d Binary files /dev/null and b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttg_events.lhe.gz differ diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttg_rwgt.csv b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttg_rwgt.csv new file mode 100644 index 0000000000..54934204e7 --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttg_rwgt.csv @@ -0,0 +1,10 @@ +rwgt_1, 414.034, 0.923405 +rwgt_2, 414.034, 0.923405 +rwgt_3, 414.034, 0.923405 +rwgt_4, 414.034, 0.923405 +rwgt_5, 414.034, 0.923405 +rwgt_6, 414.034, 0.923405 +rwgt_7, 414.034, 0.923405 +rwgt_8, 414.034, 0.923405 +rwgt_9, 414.034, 0.923405 +rwgt_10, 414.034, 0.923405 diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttgg_events.lhe.gz b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttgg_events.lhe.gz new file mode 100644 index 0000000000..95d4d977f8 Binary files /dev/null and b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttgg_events.lhe.gz differ diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttgg_rwgt.csv b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttgg_rwgt.csv new file mode 100644 index 0000000000..ebd20f4329 --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttgg_rwgt.csv @@ -0,0 +1,10 @@ +rwgt_1, 252.787, 0.602929 +rwgt_2, 252.787, 0.602929 +rwgt_3, 252.787, 0.602929 +rwgt_4, 252.787, 0.602929 +rwgt_5, 252.787, 0.602929 +rwgt_6, 252.787, 0.602929 +rwgt_7, 252.787, 0.602929 +rwgt_8, 252.787, 0.602929 +rwgt_9, 252.787, 0.602929 +rwgt_10, 252.787, 0.602929 diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttggg_events.lhe.gz b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttggg_events.lhe.gz new file mode 100644 index 0000000000..5117c63630 Binary files /dev/null and b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttggg_events.lhe.gz differ diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttggg_rwgt.csv b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttggg_rwgt.csv new file mode 100644 index 0000000000..42772663bd --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gg_ttggg_rwgt.csv @@ -0,0 +1,10 @@ +rwgt_1, 126.127, 0.305447 +rwgt_2, 126.127, 0.305447 +rwgt_3, 126.127, 0.305447 +rwgt_4, 126.127, 0.305447 +rwgt_5, 126.127, 0.305447 +rwgt_6, 126.127, 0.305447 +rwgt_7, 126.127, 0.305447 +rwgt_8, 126.127, 0.305447 +rwgt_9, 126.127, 0.305447 +rwgt_10, 126.127, 0.305447 diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gq_ttq_events.lhe.gz b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gq_ttq_events.lhe.gz new file mode 100644 index 0000000000..4a347d6d45 Binary files /dev/null and b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gq_ttq_events.lhe.gz differ diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gq_ttq_rwgt.csv b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gq_ttq_rwgt.csv new file mode 100644 index 0000000000..106c001b68 --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/gq_ttq_rwgt.csv @@ -0,0 +1,10 @@ +rwgt_1, 70.4123, 0.195415 +rwgt_2, 70.4123, 0.195415 +rwgt_3, 70.4123, 0.195415 +rwgt_4, 70.4123, 0.195415 +rwgt_5, 70.4123, 0.195415 +rwgt_6, 70.4123, 0.195415 +rwgt_7, 70.4123, 0.195415 +rwgt_8, 70.4123, 0.195415 +rwgt_9, 70.4123, 0.195415 +rwgt_10, 70.4123, 0.195415 diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/heft_gg_bb_events.lhe.gz b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/heft_gg_bb_events.lhe.gz new file mode 100644 index 0000000000..cecc7cc4c5 Binary files /dev/null and b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/heft_gg_bb_events.lhe.gz differ diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/heft_gg_bb_rwgt.csv b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/heft_gg_bb_rwgt.csv new file mode 100644 index 0000000000..de922d2fa1 --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/heft_gg_bb_rwgt.csv @@ -0,0 +1,10 @@ +rwgt_1, 4.11283e+08, 296306 +rwgt_2, 4.11283e+08, 296306 +rwgt_3, 4.11283e+08, 296306 +rwgt_4, 4.11283e+08, 296306 +rwgt_5, 4.11283e+08, 296306 +rwgt_6, 4.11283e+08, 296306 +rwgt_7, 4.11283e+08, 296306 +rwgt_8, 4.11283e+08, 296306 +rwgt_9, 4.11283e+08, 296306 +rwgt_10, 4.11283e+08, 296306 diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/nobm_pp_ttW_events.lhe.gz b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/nobm_pp_ttW_events.lhe.gz new file mode 100644 index 0000000000..b4715df9cb Binary files /dev/null and b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/nobm_pp_ttW_events.lhe.gz differ diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/nobm_pp_ttW_rwgt.csv b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/nobm_pp_ttW_rwgt.csv new file mode 100644 index 0000000000..7ad4fe7167 --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/nobm_pp_ttW_rwgt.csv @@ -0,0 +1,10 @@ +rwgt_1, 0.639215, 0.00156704 +rwgt_2, 0.679344, 0.00149345 +rwgt_3, 0.705431, 0.00144561 +rwgt_4, 0.724621, 0.00141042 +rwgt_5, 0.739593, 0.00146483 +rwgt_6, 0.751707, 0.00153369 +rwgt_7, 0.76176, 0.00159083 +rwgt_8, 0.770263, 0.00163917 +rwgt_9, 0.777564, 0.00168067 +rwgt_10, 0.78391, 0.00171674 diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/pp_tt012j_events.lhe.gz b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/pp_tt012j_events.lhe.gz new file mode 100644 index 0000000000..d2bf45c9d1 Binary files /dev/null and b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/pp_tt012j_events.lhe.gz differ diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/pp_tt012j_rwgt.csv b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/pp_tt012j_rwgt.csv new file mode 100644 index 0000000000..0ca377f5dd --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/pp_tt012j_rwgt.csv @@ -0,0 +1,10 @@ +rwgt_1, 1463.96, 2.37937 +rwgt_2, 1463.96, 2.37937 +rwgt_3, 1463.96, 2.37937 +rwgt_4, 1463.96, 2.37937 +rwgt_5, 1463.96, 2.37937 +rwgt_6, 1463.96, 2.37937 +rwgt_7, 1463.96, 2.37937 +rwgt_8, 1463.96, 2.37937 +rwgt_9, 1463.96, 2.37937 +rwgt_10, 1463.96, 2.37937 diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/smeft_gg_tttt_events.lhe.gz b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/smeft_gg_tttt_events.lhe.gz new file mode 100644 index 0000000000..5dbe54ba13 Binary files /dev/null and b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/smeft_gg_tttt_events.lhe.gz differ diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/smeft_gg_tttt_rwgt.csv b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/smeft_gg_tttt_rwgt.csv new file mode 100644 index 0000000000..e33339fb68 --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/smeft_gg_tttt_rwgt.csv @@ -0,0 +1,10 @@ +rwgt_1, 0.00846001, 2.51131e-05 +rwgt_2, 0.00846001, 2.51131e-05 +rwgt_3, 0.00846001, 2.51131e-05 +rwgt_4, 0.00846001, 2.51131e-05 +rwgt_5, 0.00846001, 2.51131e-05 +rwgt_6, 0.00846001, 2.51131e-05 +rwgt_7, 0.00846001, 2.51131e-05 +rwgt_8, 0.00846001, 2.51131e-05 +rwgt_9, 0.00846001, 2.51131e-05 +rwgt_10, 0.00846001, 2.51131e-05 diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/susy_gg_t1t1_events.lhe.gz b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/susy_gg_t1t1_events.lhe.gz new file mode 100644 index 0000000000..0efca29465 Binary files /dev/null and b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/susy_gg_t1t1_events.lhe.gz differ diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/susy_gg_t1t1_rwgt.csv b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/susy_gg_t1t1_rwgt.csv new file mode 100644 index 0000000000..880f87d59c --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/susy_gg_t1t1_rwgt.csv @@ -0,0 +1,10 @@ +rwgt_1, 1.09888, 0.00124231 +rwgt_2, 1.09888, 0.00124231 +rwgt_3, 1.09888, 0.00124231 +rwgt_4, 1.09888, 0.00124231 +rwgt_5, 1.09888, 0.00124231 +rwgt_6, 1.09888, 0.00124231 +rwgt_7, 1.09888, 0.00124231 +rwgt_8, 1.09888, 0.00124231 +rwgt_9, 1.09888, 0.00124231 +rwgt_10, 1.09888, 0.00124231 diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/susy_gg_tt_events.lhe.gz b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/susy_gg_tt_events.lhe.gz new file mode 100644 index 0000000000..718dc02ce6 Binary files /dev/null and b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/susy_gg_tt_events.lhe.gz differ diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/susy_gg_tt_rwgt.csv b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/susy_gg_tt_rwgt.csv new file mode 100644 index 0000000000..c1eaf0034d --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/test/MadtRex_baseline/susy_gg_tt_rwgt.csv @@ -0,0 +1,10 @@ +rwgt_1, 416.949, 0.336379 +rwgt_2, 416.949, 0.336379 +rwgt_3, 416.949, 0.336379 +rwgt_4, 416.949, 0.336379 +rwgt_5, 416.949, 0.336379 +rwgt_6, 416.949, 0.336379 +rwgt_7, 416.949, 0.336379 +rwgt_8, 416.949, 0.336379 +rwgt_9, 416.949, 0.336379 +rwgt_10, 416.949, 0.336379