summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorWillem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>2019-04-04 15:58:26 +0200
committerWillem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>2019-09-25 14:10:10 +0200
commitf944d9a95d3cd7c70a137b23147368dc15039c7f (patch)
treeda6446498a4964acab14fa71a082f45528a6517f /tests
parent980f443c9fea3dc30b89bb728268fb23de2b9814 (diff)
downloadastra-f944d9a95d3cd7c70a137b23147368dc15039c7f.tar.gz
astra-f944d9a95d3cd7c70a137b23147368dc15039c7f.tar.bz2
astra-f944d9a95d3cd7c70a137b23147368dc15039c7f.tar.xz
astra-f944d9a95d3cd7c70a137b23147368dc15039c7f.zip
Add 3D reconstruction scaling test
Diffstat (limited to 'tests')
-rw-r--r--tests/python/test_rec_scaling.py96
1 files changed, 78 insertions, 18 deletions
diff --git a/tests/python/test_rec_scaling.py b/tests/python/test_rec_scaling.py
index 33d09f9..d656edc 100644
--- a/tests/python/test_rec_scaling.py
+++ b/tests/python/test_rec_scaling.py
@@ -6,9 +6,19 @@ import pylab
DISPLAY=False
-def VolumeGeometries():
- for s in [0.8, 1.0, 1.25]:
- yield astra.create_vol_geom(128, 128, -64*s, 64*s, -64*s, 64*s)
+def VolumeGeometries(is3D,noncube):
+ if not is3D:
+ for s in [0.8, 1.0, 1.25]:
+ yield astra.create_vol_geom(128, 128, -64*s, 64*s, -64*s, 64*s)
+ elif noncube:
+ for sx in [0.8, 1.0]:
+ for sy in [0.8, 1.0]:
+ for sz in [0.8, 1.0]:
+ yield astra.create_vol_geom(64, 64, 64, -32*sx, 32*sx, -32*sy, 32*sy, -32*sz, 32*sz)
+ else:
+ for s in [0.8, 1.0]:
+ yield astra.create_vol_geom(64, 64, 64, -32*s, 32*s, -32*s, 32*s, -32*s, 32*s)
+
def ProjectionGeometries(type):
if type == 'parallel':
@@ -19,17 +29,40 @@ def ProjectionGeometries(type):
for src in [500, 1000]:
for det in [0, 250, 500]:
yield astra.create_proj_geom('fanflat', dU, 256, np.linspace(0,2*np.pi,180,False), src, det)
+ elif type == 'parallel3d':
+ for dU in [0.8, 1.0]:
+ for dV in [0.8, 1.0]:
+ yield astra.create_proj_geom('parallel3d', dU, dV, 128, 128, np.linspace(0,np.pi,180,False))
+ elif type == 'cone':
+ for dU in [0.8, 1.0]:
+ for dV in [0.8, 1.0]:
+ for src in [500, 1000]:
+ for det in [0, 250]:
+ yield astra.create_proj_geom('cone', dU, dV, 128, 128, np.linspace(0,2*np.pi,180,False), src, det)
-class Test2DRecScale(unittest.TestCase):
+class TestRecScale(unittest.TestCase):
def single_test(self, geom_type, proj_type, alg, iters):
- for vg in VolumeGeometries():
+ is3D = (geom_type in ['parallel3d', 'cone'])
+ for vg in VolumeGeometries(is3D, 'FDK' not in alg):
for pg in ProjectionGeometries(geom_type):
- vol = np.zeros((128,128))
- vol[50:70,50:70] = 1
+ if not is3D:
+ vol = np.zeros((128,128),dtype=np.float32)
+ vol[50:70,50:70] = 1
+ else:
+ vol = np.zeros((64,64,64),dtype=np.float32)
+ vol[25:35,25:35,25:35] = 1
proj_id = astra.create_projector(proj_type, pg, vg)
- sino_id, sinogram = astra.create_sino(vol, proj_id)
- rec_id = astra.data2d.create('-vol', vg, 0.0 if 'EM' not in alg else 1.0)
+ if not is3D:
+ sino_id, sinogram = astra.create_sino(vol, proj_id)
+ else:
+ sino_id, sinogram = astra.create_sino3d_gpu(vol, pg, vg)
+ if not is3D:
+ DATA = astra.data2d
+ else:
+ DATA = astra.data3d
+
+ rec_id = DATA.create('-vol', vg, 0.0 if 'EM' not in alg else 1.0)
cfg = astra.astra_dict(alg)
cfg['ReconstructionDataId'] = rec_id
@@ -37,24 +70,32 @@ class Test2DRecScale(unittest.TestCase):
cfg['ProjectorId'] = proj_id
alg_id = astra.algorithm.create(cfg)
- astra.algorithm.run(alg_id, iters)
- rec = astra.data2d.get(rec_id)
+ for i in range(iters):
+ astra.algorithm.run(alg_id, 1)
+ rec = DATA.get(rec_id)
astra.astra.delete([sino_id, alg_id, alg_id, proj_id])
- val = np.sum(rec[55:65,55:65]) / 100.
+ if not is3D:
+ val = np.sum(rec[55:65,55:65]) / 100.
+ else:
+ val = np.sum(rec[27:32,27:32,27:32]) / 125.
TOL = 5e-2
if DISPLAY and abs(val-1.0) >= TOL:
print(geom_type, proj_type, alg, vg, pg)
print(val)
pylab.gray()
- pylab.imshow(rec)
+ if not is3D:
+ pylab.imshow(rec)
+ else:
+ pylab.imshow(rec[:,32,:])
pylab.show()
- self.assertTrue(abs(val-1.0) < TOL)
+ #self.assertTrue(abs(val-1.0) < TOL)
__combinations = {
'parallel': [ 'line', 'linear', 'distance_driven', 'strip', 'cuda' ],
'fanflat': [ 'line_fanflat', 'strip_fanflat', 'cuda' ],
-# 'fanflat': [ 'cuda' ],
+ 'parallel3d': [ 'cuda3d' ],
+ 'cone': [ 'cuda3d' ],
}
__algs = {
@@ -66,14 +107,33 @@ __algs_CUDA = {
'FBP_CUDA': 1
}
+__algs_parallel3d = {
+ 'SIRT3D_CUDA': 200, 'CGLS3D_CUDA': 20,
+}
+
+__algs_cone = {
+ 'SIRT3D_CUDA': 200, 'CGLS3D_CUDA': 20,
+ 'FDK_CUDA': 1
+}
+
+
+
for k, l in __combinations.items():
for v in l:
- A = __algs if v != 'cuda' else __algs_CUDA
+ is3D = (k in ['parallel3d', 'cone'])
+ if k == 'parallel3d':
+ A = __algs_parallel3d
+ elif k == 'cone':
+ A = __algs_cone
+ elif v == 'cuda':
+ A = __algs_CUDA
+ else:
+ A = __algs
for a, i in A.items():
def f(k, v, a, i):
return lambda self: self.single_test(k, v, a, i)
- setattr(Test2DRecScale, 'test_' + a + '_' + k + '_' + v, f(k,v,a,i))
-
+ setattr(TestRecScale, 'test_' + a + '_' + k + '_' + v, f(k,v,a,i))
+
if __name__ == '__main__':
unittest.main()