summaryrefslogtreecommitdiff
path: root/src/silx/opencl/test/test_backprojection.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/silx/opencl/test/test_backprojection.py')
-rw-r--r--src/silx/opencl/test/test_backprojection.py49
1 files changed, 26 insertions, 23 deletions
diff --git a/src/silx/opencl/test/test_backprojection.py b/src/silx/opencl/test/test_backprojection.py
index 501cf2f..b08c972 100644
--- a/src/silx/opencl/test/test_backprojection.py
+++ b/src/silx/opencl/test/test_backprojection.py
@@ -35,11 +35,13 @@ import logging
import numpy as np
import unittest
from math import pi
+
try:
import mako
except ImportError:
mako = None
from ..common import ocl
+
if ocl:
from .. import backprojection
from ...image.tomography import compute_fourier_filter
@@ -56,7 +58,7 @@ def generate_coords(img_shp, center=None):
l_r, l_c = float(img_shp[0]), float(img_shp[1])
R, C = np.mgrid[:l_r, :l_c]
if center is None:
- center0, center1 = l_r / 2., l_c / 2.
+ center0, center1 = l_r / 2.0, l_c / 2.0
else:
center0, center1 = center
R = R + 0.5 - center0
@@ -72,7 +74,7 @@ def clip_circle(img, center=None, radius=None):
M = R * R + C * C
res = np.zeros_like(img)
if radius is None:
- radius = img.shape[0] / 2. - 1
+ radius = img.shape[0] / 2.0 - 1
mask = M < radius * radius
res[mask] = img[mask]
return res
@@ -80,20 +82,21 @@ def clip_circle(img, center=None, radius=None):
@unittest.skipUnless(ocl and mako, "PyOpenCl is missing")
class TestFBP(unittest.TestCase):
-
def setUp(self):
if ocl is None:
return
self.getfiles()
self.fbp = backprojection.Backprojection(self.sino.shape, profile=True)
if self.fbp.compiletime_workgroup_size < 16 * 16:
- self.skipTest("Current implementation of OpenCL backprojection is "
- "not supported on this platform yet")
+ self.skipTest(
+ "Current implementation of OpenCL backprojection is "
+ "not supported on this platform yet"
+ )
# Astra does not use the same backprojector implementation.
# Therefore, we cannot expect results to be the "same" (up to float32
# numerical error)
self.tol = 5e-2
- if not(self.fbp._use_textures) or self.fbp.device.type == "CPU":
+ if not (self.fbp._use_textures) or self.fbp.device.type == "CPU":
# Precision is less when using CPU
# (either CPU textures or "manual" linear interpolation)
self.tol *= 2
@@ -130,8 +133,12 @@ class TestFBP(unittest.TestCase):
ref_clipped = clip_circle(self.reference_rec)
delta = abs(res_clipped - ref_clipped)
bad = delta > 1
- logger.debug("Absolute difference: %s with %s outlier pixels out of %s"
- "", delta.max(), bad.sum(), np.prod(bad.shape))
+ logger.debug(
+ "Absolute difference: %s with %s outlier pixels out of %s" "",
+ delta.max(),
+ bad.sum(),
+ np.prod(bad.shape),
+ )
return delta.max()
@unittest.skipUnless(ocl and mako, "pyopencl is missing")
@@ -157,17 +164,14 @@ class TestFBP(unittest.TestCase):
for i in range(10):
res = self.fbp.filtered_backprojection(self.sino)
errmax = np.max(np.abs(res - res0))
- self.assertTrue(errmax < 1.e-6, "Max error is too high")
+ self.assertTrue(errmax < 1.0e-6, "Max error is too high")
@unittest.skipUnless(ocl and mako, "pyopencl is missing")
def test_fbp_filters(self):
"""
Test the different available filters of silx FBP.
"""
- avail_filters = [
- "ramlak", "shepp-logan", "cosine", "hamming",
- "hann"
- ]
+ avail_filters = ["ramlak", "shepp-logan", "cosine", "hamming", "hann"]
# Create a Dirac delta function at a single angle view.
# As the filters are radially invarant:
# - backprojection yields an image where each line is a Dirac.
@@ -176,7 +180,7 @@ class TestFBP(unittest.TestCase):
# test will also ensure that backprojection behaves well.
dirac = np.zeros_like(self.sino)
na, dw = dirac.shape
- dirac[0, dw//2] = na / pi * 2
+ dirac[0, dw // 2] = na / pi * 2
for filter_name in avail_filters:
B = backprojection.Backprojection(dirac.shape, filter_name=filter_name)
@@ -184,17 +188,15 @@ class TestFBP(unittest.TestCase):
# Check that radial invariance is kept
std0 = np.max(np.abs(np.std(r, axis=0)))
self.assertTrue(
- std0 < 5.e-6,
- "Something wrong with FBP(filter=%s)" % filter_name
+ std0 < 5.0e-6, "Something wrong with FBP(filter=%s)" % filter_name
)
# Check that the filter is retrieved
- r_f = np.fft.fft(np.fft.fftshift(r[0])).real / 2. # filter factor
+ r_f = np.fft.fft(np.fft.fftshift(r[0])).real / 2.0 # filter factor
ref_filter_f = compute_fourier_filter(dw, filter_name)
errmax = np.max(np.abs(r_f - ref_filter_f))
logger.info("FBP filter %s: max error=%e" % (filter_name, errmax))
self.assertTrue(
- errmax < 1.e-3,
- "Something wrong with FBP(filter=%s)" % filter_name
+ errmax < 1.0e-3, "Something wrong with FBP(filter=%s)" % filter_name
)
@unittest.skipUnless(ocl and mako, "pyopencl is missing")
@@ -202,13 +204,14 @@ class TestFBP(unittest.TestCase):
# Generate a 513-sinogram.
# The padded width will be nextpow(513*2).
# silx [0.10, 0.10.1] will give 1029, which makes R2C transform fail.
- sino = np.pad(self.sino, ((0, 0), (1, 0)), mode='edge')
- B = backprojection.Backprojection(sino.shape, axis_position=self.fbp.axis_pos+1)
+ sino = np.pad(self.sino, ((0, 0), (1, 0)), mode="edge")
+ B = backprojection.Backprojection(
+ sino.shape, axis_position=self.fbp.axis_pos + 1
+ )
res = B(sino)
# Compare with self.reference_rec. Tolerance is high as backprojector
# is not fully shift-invariant.
errmax = np.max(np.abs(clip_circle(res[1:, 1:] - self.reference_rec)))
self.assertLess(
- errmax, 1.e-1,
- "Something wrong with FBP on odd-sized sinogram"
+ errmax, 1.0e-1, "Something wrong with FBP on odd-sized sinogram"
)