| """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()) | |