Files
navigate/test/model/analysis/test_camera.py
2025-12-04 16:07:30 +08:00

57 lines
1.7 KiB
Python

import numpy as np
import pytest
@pytest.mark.skip("volatile")
def test_compute_scmos_offset_and_variance_map():
from navigate.model.analysis.camera import compute_scmos_offset_and_variance_map
mu, sig = 100 * np.random.rand() + 1, 100 * np.random.rand() + 1
im = sig * np.random.randn(256, 256, 256) + mu
offset, variance = compute_scmos_offset_and_variance_map(im)
print(mu, sig)
# TODO: 1 is a bit high?
np.testing.assert_allclose(offset, mu, rtol=1)
np.testing.assert_allclose(variance, sig * sig, rtol=1)
@pytest.mark.parametrize("local", [True, False])
def test_compute_flatfield_map(local):
from navigate.model.analysis.camera import compute_flatfield_map
image = np.ones((256, 256))
offset = np.zeros((256, 256))
ffmap = compute_flatfield_map(image, offset, local)
np.testing.assert_allclose(ffmap, 0.5)
def test_compute_noise_sigma():
from navigate.model.analysis.camera import compute_noise_sigma
Fn = np.random.rand()
qe = np.random.rand()
S = np.random.rand(256, 256)
Ib = np.random.rand()
Nr = np.random.rand()
M = np.random.rand()
sigma = compute_noise_sigma(Fn=Fn, qe=qe, S=S, Ib=Ib, Nr=Nr, M=M)
sigma_true = np.sqrt(Fn * Fn * qe * (S + Ib) + (Nr / M) ** 2)
np.testing.assert_allclose(sigma, sigma_true)
def test_compute_signal_to_noise():
from navigate.model.analysis.camera import compute_signal_to_noise
A = np.random.rand() * 100 + 10
image = A * np.ones((256, 256))
offset = np.zeros((256, 256))
variance = 3 * A * A * np.ones((256, 256))
snr = compute_signal_to_noise(image, offset, variance)
np.testing.assert_allclose(snr, 0.5, rtol=0.2)