Newer
Older
import os.path as path
import numpy as np
import pytest
from nabu.testutils import get_data
from nabu.cuda.utils import __has_pycuda__
from nabu.preproc.sinogram import SinoNormalization
if __has_pycuda__:
from nabu.preproc.sinogram_cuda import CudaSinoNormalization
import pycuda.gpuarray as garray
@pytest.fixture(scope="class")
def bootstrap(request):
cls = request.cls
cls.sino = get_data("sino_refill.npy")
cls.tol = 1e-7
@pytest.mark.usefixtures("bootstrap")
class TestSinoNormalization:
def test_sino_normalization(self):
sino_proc = SinoNormalization(
kind="chebyshev", sinos_shape=self.sino.shape
)
sino = self.sino.copy()
sino_proc.normalize(sino)
@pytest.mark.skipif(not(__has_pycuda__), reason="Need pycuda for sinogram normalization with cuda backend")
def test_sino_normalization_cuda(self):
sino_proc = SinoNormalization(
kind="chebyshev", sinos_shape=self.sino.shape
)
sino = self.sino.copy()
ref = sino_proc.normalize(sino)
cuda_sino_proc = CudaSinoNormalization(
kind="chebyshev", sinos_shape=self.sino.shape
)
d_sino = garray.to_gpu(self.sino)
cuda_sino_proc.normalize(d_sino)
res = d_sino.get()
assert np.max(np.abs(res - ref)) < self.tol
def test_sino_array_subtraction(self):
with pytest.raises(ValueError):
SinoNormalization(kind="subtract_array", sinos_shape=self.sino.shape)
array_1D = np.arange(self.sino.shape[-1])
array_2D = np.arange(self.sino.size).reshape(self.sino.shape)
def compare_normalizations(normalization_arr):
sino_normalization = SinoNormalization(
kind="subtract_array", sinos_shape=self.sino.shape,
normalization_array=normalization_arr
)
sino = self.sino.copy()
sino_normalization.normalize(sino)
ref = self.sino - normalization_arr
assert np.allclose(sino, ref)
compare_normalizations(array_1D)
compare_normalizations(array_2D)
@pytest.mark.skipif(not(__has_pycuda__), reason="Need pycuda for sinogram normalization with cuda backend")
def test_sino_array_subtraction_cuda(self):
with pytest.raises(ValueError):
CudaSinoNormalization(kind="subtract_array", sinos_shape=self.sino.shape)
array_1D = np.arange(self.sino.shape[-1])
array_2D = np.arange(self.sino.size).reshape(self.sino.shape)
def compare_normalizations(normalization_arr):
sino_normalization = CudaSinoNormalization(
kind="subtract_array", sinos_shape=self.sino.shape,
normalization_array=normalization_arr
)
sino = garray.to_gpu(self.sino)
sino_normalization.normalize(sino)
ref = self.sino - normalization_arr
assert np.allclose(sino.get(), ref)
compare_normalizations(array_1D)
compare_normalizations(array_2D)