"""Run read_idf_file across the corpus and report per-channel accuracy vs sidecars.""" from __future__ import annotations import sys from pathlib import Path REPO = Path(__file__).resolve().parents[1] sys.path.insert(0, str(REPO)) from micromate.idf_file import read_idf_file from analysis_idf.recon import load_sidecar_samples def sidecar_path(idfw: Path) -> Path: return idfw.parent / "TXT" / f"{idfw.name}.txt" def main(): root = REPO / "tests/fixtures/THORDATA_example" files = [f for f in root.rglob("*.IDFW") if not str(f).endswith(".CDB")] files.sort() GEO_LSB = 0.0003 n_ok = n_skip = 0 overall = {"Tran": [], "Vert": [], "Long": []} for f in files: try: res = read_idf_file(f) except Exception: n_skip += 1 continue sc_path = sidecar_path(f) if not sc_path.exists(): n_skip += 1 continue try: sc = load_sidecar_samples(sc_path) except Exception: n_skip += 1 continue per_file = {} for ch in ("Tran", "Vert", "Long"): sc_counts = [int(round(v / GEO_LSB)) for v in sc[ch]] dec = res.samples.get(ch, []) n = min(len(sc_counts), len(dec)) if n == 0: per_file[ch] = 0.0 continue exact = sum(1 for i in range(n) if sc_counts[i] == dec[i]) pct = 100.0 * exact / n per_file[ch] = pct overall[ch].append(pct) n_ok += 1 print(f"Processed {n_ok} files (skipped {n_skip})") print("Per-channel exact-match % (mean / min / max):") for ch, vals in overall.items(): if vals: avg = sum(vals) / len(vals) print(f" {ch}: mean={avg:.2f}% min={min(vals):.2f}% max={max(vals):.2f}% n={len(vals)}") if __name__ == "__main__": main()