From c802a59033406a8ace17ce11931513448732bb5e Mon Sep 17 00:00:00 2001 From: Lars Bogner Date: Wed, 24 Jun 2026 12:42:49 +0200 Subject: [PATCH] Add export script for Tier 4 event-level/pdg-share plots One-off script mirroring export_validation_plots.py, used to export the new event-level and pdg-contribution-share plots into the knowledge-base attachments folder. Co-Authored-By: Claude Sonnet 4.6 --- analysis/export_event_observables.py | 74 ++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 analysis/export_event_observables.py diff --git a/analysis/export_event_observables.py b/analysis/export_event_observables.py new file mode 100644 index 0000000..d4e038b --- /dev/null +++ b/analysis/export_event_observables.py @@ -0,0 +1,74 @@ +"""One-off export of Tier 4 event-level/pdg-share plots for +checkpoints/scan/h1024_n8_d0.1_lr0.0003/best.pt into the knowledge-base +attachments folder. Not part of the package; run manually.""" + +from pathlib import Path + +import giant.analysis as a + +FILE = "/home/lars/Programming/giant/pbwo4_10k_9_predicted_local.parquet" +OUT = Path("/home/lars/knowledge-base/meta/attachments") +PREFIX = "giant-h1024n8d0.1lr3e-4" + +print("=== computing event observables ===") +obs = a.compute_event_observables_pl(FILE) +table = obs.event_table +print("n events:", table.height) + +print("=== total energy / total length ===") +fig = a.plot_total_energy(obs) +fig.savefig(OUT / f"{PREFIX}-event-total-energy.png", dpi=150, bbox_inches="tight") +fig = a.plot_total_length(obs) +fig.savefig(OUT / f"{PREFIX}-event-total-length.png", dpi=150, bbox_inches="tight") + +print("=== mean/median energy & length per step ===") +fig = a.plot_mean_energy_per_step(obs) +fig.savefig(OUT / f"{PREFIX}-event-mean-energy-per-step.png", dpi=150, bbox_inches="tight") +fig = a.plot_mean_length_per_step(obs) +fig.savefig(OUT / f"{PREFIX}-event-mean-length-per-step.png", dpi=150, bbox_inches="tight") + +print("=== longitudinal / transverse profiles ===") +fig = a.plot_longitudinal_profile(obs) +fig.savefig(OUT / f"{PREFIX}-event-longitudinal-profile.png", dpi=150, bbox_inches="tight") +fig = a.plot_transverse_profile(obs) +fig.savefig(OUT / f"{PREFIX}-event-transverse-profile.png", dpi=150, bbox_inches="tight") + +print("=== shower-max depth ===") +fig = a.plot_shower_max_depth(obs) +fig.savefig(OUT / f"{PREFIX}-event-shower-max-depth.png", dpi=150, bbox_inches="tight") + +print("=== pdg contribution shares ===") +pdg_table = a.pdg_contribution_table_pl(FILE) +fig = a.plot_pdg_energy_share(pdg_table) +fig.savefig(OUT / f"{PREFIX}-pdg-energy-share.png", dpi=150, bbox_inches="tight") +fig = a.plot_pdg_length_share(pdg_table) +fig.savefig(OUT / f"{PREFIX}-pdg-length-share.png", dpi=150, bbox_inches="tight") + +print("=== summary stats ===") +import numpy as np # noqa: E402 + +for label, real_col, gen_col in [ + ("total_edep", "real_total_edep", "gen_total_edep"), + ("total_length", "real_total_length", "gen_total_length"), + ("mean_edep", "real_mean_edep", "gen_mean_edep"), + ("mean_length", "real_mean_length", "gen_mean_length"), + ("median_edep", "real_median_edep", "gen_median_edep"), + ("median_length", "real_median_length", "gen_median_length"), + ("centroid_depth", "real_centroid_depth", "gen_centroid_depth"), + ("transverse_rms", "real_transverse_rms", "gen_transverse_rms"), + ("max_depth", "real_max_depth", "gen_max_depth"), +]: + real = table[real_col].to_numpy() + gen = table[gen_col].to_numpy() + print( + f"{label}: real mean={real.mean():.4g} std={real.std():.4g} sigma/mu={real.std() / real.mean():.4f} | " + f"gen mean={gen.mean():.4g} std={gen.std():.4g} sigma/mu={gen.std() / gen.mean():.4f} | " + f"mean_diff%={100 * (gen.mean() - real.mean()) / real.mean():.2f}" + ) + +print("n_steps per event: mean", table["n_steps"].to_numpy().mean()) + +print("=== pdg shares table ===") +print(pdg_table.to_pandas().to_string()) + +print("DONE")