Files
aare/python/tests/test_calibration.py
Erik Fröjdh cb439efb48
All checks were successful
Build on RHEL8 / build (push) Successful in 3m0s
Build on RHEL9 / build (push) Successful in 3m8s
added tests
2025-07-23 11:34:47 +02:00

135 lines
3.6 KiB
Python

import pytest
import numpy as np
import aare
def test_apply_calibration_small_data():
# The raw data consists of 10 4x5 images
raw = np.zeros((10, 4, 5), dtype=np.uint16)
# We need a pedestal for each gain, so 3
pedestal = np.zeros((3, 4, 5), dtype=np.float32)
# And the same for calibration
calibration = np.ones((3, 4, 5), dtype=np.float32)
# Set the known values, probing one pixel in each gain
raw[0, 0, 0] = 100 #ADC value of 100, gain 0
pedestal[0, 0, 0] = 10
calibration[0, 0, 0] = 43.7
raw[2, 3, 3] = (1<<14) + 1000 #ADC value of 1000, gain 1
pedestal[1, 3, 3] = 500
calibration[1, 3, 3] = 2.0
raw[1,1,4] = (3<<14) + 857 #ADC value of 857, gain 2
pedestal[2,1,4] = 100
calibration[2,1,4] = 3.0
data = aare.apply_calibration(raw, pd = pedestal, cal = calibration)
# The formula that is applied is:
# calibrated = (raw - pedestal) / calibration
assert data.shape == (10, 4, 5)
assert data[0, 0, 0] == (100 - 10) / 43.7
assert data[2, 3, 3] == (1000 - 500) / 2.0
assert data[1, 1, 4] == (857 - 100) / 3.0
# Other pixels should be zero
assert data[2,2,2] == 0
assert data[0,1,1] == 0
assert data[1,3,0] == 0
@pytest.fixture
def raw_data_3x2x2():
raw = np.zeros((3, 2, 2), dtype=np.uint16)
raw[0, 0, 0] = 100
raw[1,0, 0] = 200
raw[2, 0, 0] = 300
raw[0, 0, 1] = (1<<14) + 100
raw[1, 0, 1] = (1<<14) + 200
raw[2, 0, 1] = (1<<14) + 300
raw[0, 1, 0] = (1<<14) + 37
raw[1, 1, 0] = 38
raw[2, 1, 0] = (3<<14) + 39
raw[0, 1, 1] = (3<<14) + 100
raw[1, 1, 1] = (3<<14) + 200
raw[2, 1, 1] = (3<<14) + 300
return raw
def test_calculate_pedestal(raw_data_3x2x2):
# Calculate the pedestal
pd = aare.calculate_pedestal(raw_data_3x2x2)
assert pd.shape == (3, 2, 2)
assert pd.dtype == np.float64
assert pd[0, 0, 0] == 200
assert pd[1, 0, 0] == 0
assert pd[2, 0, 0] == 0
assert pd[0, 0, 1] == 0
assert pd[1, 0, 1] == 200
assert pd[2, 0, 1] == 0
assert pd[0, 1, 0] == 38
assert pd[1, 1, 0] == 37
assert pd[2, 1, 0] == 39
assert pd[0, 1, 1] == 0
assert pd[1, 1, 1] == 0
assert pd[2, 1, 1] == 200
def test_calculate_pedestal_float(raw_data_3x2x2):
#results should be the same for float
pd2 = aare.calculate_pedestal_float(raw_data_3x2x2)
assert pd2.shape == (3, 2, 2)
assert pd2.dtype == np.float32
assert pd2[0, 0, 0] == 200
assert pd2[1, 0, 0] == 0
assert pd2[2, 0, 0] == 0
assert pd2[0, 0, 1] == 0
assert pd2[1, 0, 1] == 200
assert pd2[2, 0, 1] == 0
assert pd2[0, 1, 0] == 38
assert pd2[1, 1, 0] == 37
assert pd2[2, 1, 0] == 39
assert pd2[0, 1, 1] == 0
assert pd2[1, 1, 1] == 0
assert pd2[2, 1, 1] == 200
def test_calculate_pedestal_g0(raw_data_3x2x2):
pd = aare.calculate_pedestal_g0(raw_data_3x2x2)
assert pd.shape == (2, 2)
assert pd.dtype == np.float64
assert pd[0, 0] == 200
assert pd[1, 0] == 38
assert pd[0, 1] == 0
assert pd[1, 1] == 0
def test_calculate_pedestal_g0_float(raw_data_3x2x2):
pd = aare.calculate_pedestal_g0_float(raw_data_3x2x2)
assert pd.shape == (2, 2)
assert pd.dtype == np.float32
assert pd[0, 0] == 200
assert pd[1, 0] == 38
assert pd[0, 1] == 0
assert pd[1, 1] == 0
def test_count_switching_pixels(raw_data_3x2x2):
# Count the number of pixels that switched gain
count = aare.count_switching_pixels(raw_data_3x2x2)
assert count.shape == (2, 2)
assert count.sum() == 8
assert count[0, 0] == 0
assert count[1, 0] == 2
assert count[0, 1] == 3
assert count[1, 1] == 3