87 lines
3.1 KiB
Python
87 lines
3.1 KiB
Python
import pytest
|
|
import numpy as np
|
|
import unittest.mock
|
|
|
|
import cristallina.analysis
|
|
|
|
__author__ = "Alexander Steppke"
|
|
|
|
|
|
@unittest.mock.patch("jungfrau_utils.file_adapter.locate_gain_file", lambda path, **kwargs: "tests/data/gains.h5")
|
|
@unittest.mock.patch("jungfrau_utils.file_adapter.locate_pedestal_file", lambda path, **kwargs: "tests/data/JF16T03V01.res.h5")
|
|
def test_image_calculations():
|
|
res = cristallina.analysis.perform_image_calculations(['tests/data/p20841/raw/run0185/data/acq0001.*.h5'])
|
|
# these values are only correct when using the specific gain and pedestal files included in the test data
|
|
# they do not correspond to the gain and pedestal files used in the actual analysis (otherwise we need to include several here as test data)
|
|
intensity = [1712858.6,
|
|
693994.06,
|
|
1766390.0,
|
|
1055504.9,
|
|
1516520.9,
|
|
461969.06,
|
|
3148285.5,
|
|
934917.5,
|
|
1866691.6,
|
|
798191.2,
|
|
2250207.0,
|
|
453842.6]
|
|
assert np.allclose(res["JF16T03V01_intensity"], intensity)
|
|
|
|
def test_minimal_2d_gaussian():
|
|
|
|
image = np.array([[0,0,0,0,0],
|
|
[0,0,0,0,0],
|
|
[0,0,1,0,0],
|
|
[0,0,0,0,0],
|
|
[0,0,0,0,0],
|
|
])
|
|
|
|
center_x, center_y, result = cristallina.analysis.fit_2d_gaussian(image)
|
|
assert np.allclose(center_x, 2.0, rtol=1e-04)
|
|
assert np.allclose(center_y, 2.0, rtol=1e-04)
|
|
|
|
|
|
|
|
def test_2d_gaussian():
|
|
|
|
# define normalized 2D gaussian
|
|
def gauss2d(x=0, y=0, mx=0, my=0, sx=1, sy=1):
|
|
return (1 / (2 * np.pi * sx * sy) * np.exp(-((x - mx) ** 2 / (2 * sx**2.0) + (y - my) ** 2 / (2 * sy**2))))
|
|
|
|
x = np.arange(0, 150, 1)
|
|
y = np.arange(0, 100, 1)
|
|
x, y = np.meshgrid(x, y)
|
|
|
|
z = gauss2d(x, y, mx=40, my=50, sx=20, sy=40)
|
|
|
|
center_x, center_y, result = cristallina.analysis.fit_2d_gaussian(z)
|
|
assert np.allclose(center_x, 40, rtol=1e-04)
|
|
assert np.allclose(center_y, 50, rtol=1e-04)
|
|
|
|
|
|
def test_2d_gaussian_rotated():
|
|
|
|
# define normalized 2D gaussian
|
|
def gauss2d_rotated(x=0, y=0, center_x=0, center_y=0, sx=1, sy=1, rotation=0):
|
|
|
|
sr = np.sin(rotation)
|
|
cr = np.cos(rotation)
|
|
|
|
center_x_rot = center_x * cr - center_y * sr
|
|
center_y_rot = center_x * sr + center_y * cr
|
|
|
|
x_rot = x * cr - y * sr
|
|
y_rot = x * sr + y * cr
|
|
|
|
return (1 / (2 * np.pi * sx * sy) * np.exp(-((x_rot - center_x_rot) ** 2 / (2 * sx**2.0) + (y_rot - center_y_rot) ** 2 / (2 * sy**2))))
|
|
|
|
x = np.arange(0, 150, 1)
|
|
y = np.arange(0, 100, 1)
|
|
x, y = np.meshgrid(x, y)
|
|
|
|
z = 100*gauss2d_rotated(x, y, center_x=40, center_y=50, sx=10, sy=20, rotation=0.5)
|
|
|
|
center_x, center_y, result = cristallina.analysis.fit_2d_gaussian_rotated(z, vary_rotation=True, plot=False)
|
|
assert np.allclose(center_x, 40, rtol=1e-04)
|
|
assert np.allclose(center_y, 50, rtol=1e-04)
|
|
assert np.allclose(result.params['rotation'].value, 0.5, rtol=1e-02) |