"""Bake a synthetic noisy calcium movie + clean ground-truth sidecar. The noisy movie (Poisson shot + Gaussian read noise) is the /process input; the clean movie is saved as example_clean.npy so PSNR/SSIM can be computed. No external data dependence — this doubles as the smoke/validator input. """ from __future__ import annotations import sys import numpy as np import tifffile from core.io import APP_TMP_DIR, register_protected from core.synth import add_noise, clean_movie def main() -> int: clean = clean_movie(T=120, H=96, W=96, n_neurons=10, fps=10.0, seed=7) noisy = add_noise(clean, gain=0.15, read_sigma=180.0, seed=7) out = APP_TMP_DIR / "example.tif" tifffile.imwrite(out, noisy.astype("float32")) np.save(APP_TMP_DIR / "example_clean.npy", clean.astype("float32")) # GT sidecar register_protected(out) register_protected(APP_TMP_DIR / "example_clean.npy") print(f"wrote {out} shape={noisy.shape} (+ example_clean.npy sidecar)") return 0 if __name__ == "__main__": sys.exit(main())