57 lines
1.8 KiB
Python
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"
|
|
)
|