Files
tono/tests/node_tests/psf_estimation.py
2026-04-04 00:25:53 -07:00

57 lines
1.8 KiB
Python

import numpy as np
from scipy.ndimage import gaussian_filter
from tests.node_tests._shared import make_field
def _make_test_pair(shape=(64, 64), sigma=2.0):
"""Return (measured, ideal) where measured = gaussian_filter(ideal)."""
ideal = make_field(shape=shape)
measured_data = gaussian_filter(ideal.data, sigma=sigma)
measured = make_field(data=measured_data)
return measured, ideal
def test_output_shape():
from backend.nodes.psf_estimation import PSFEstimation
node = PSFEstimation()
measured, ideal = _make_test_pair()
psf_field, _ = node.process(measured, ideal, "wiener", 0.01, 32)
assert psf_field.data.shape == (32, 32)
def test_psf_normalized():
from backend.nodes.psf_estimation import PSFEstimation
node = PSFEstimation()
measured, ideal = _make_test_pair()
for method in ("wiener", "least_squares", "gaussian_fit"):
psf_field, _ = node.process(measured, ideal, method, 0.01, 32)
assert abs(psf_field.data.sum() - 1.0) < 1e-6, (
f"{method}: PSF sum = {psf_field.data.sum()}"
)
def test_gaussian_fit_parameters():
from backend.nodes.psf_estimation import PSFEstimation
node = PSFEstimation()
measured, ideal = _make_test_pair()
_, parameters = node.process(measured, ideal, "gaussian_fit", 0.01, 32)
names = {row["quantity"] for row in parameters}
assert "sigma_x" in names
assert "sigma_y" in names
assert "amplitude" in names
def test_all_methods_finite():
from backend.nodes.psf_estimation import PSFEstimation
node = PSFEstimation()
measured, ideal = _make_test_pair()
for method in ("wiener", "least_squares", "gaussian_fit"):
psf_field, _ = node.process(measured, ideal, method, 0.01, 32)
assert np.isfinite(psf_field.data).all(), (
f"{method}: PSF contains non-finite values"
)