summaryrefslogtreecommitdiffstats
path: root/Wrappers
diff options
context:
space:
mode:
Diffstat (limited to 'Wrappers')
-rw-r--r--Wrappers/Python/ccpi/reconstruction/geoms.py26
-rwxr-xr-x[-rw-r--r--]Wrappers/Python/wip/simple_mc_demo.py (renamed from Wrappers/Python/test/simple_mc_demo.py)55
2 files changed, 50 insertions, 31 deletions
diff --git a/Wrappers/Python/ccpi/reconstruction/geoms.py b/Wrappers/Python/ccpi/reconstruction/geoms.py
index 9f81fa0..a887c0c 100644
--- a/Wrappers/Python/ccpi/reconstruction/geoms.py
+++ b/Wrappers/Python/ccpi/reconstruction/geoms.py
@@ -2,12 +2,12 @@
class VolumeGeometry:
def __init__(self,
- voxel_num_x=None,
- voxel_num_y=None,
- voxel_num_z=None,
- voxel_size_x=None,
- voxel_size_y=None,
- voxel_size_z=None,
+ voxel_num_x=0,
+ voxel_num_y=0,
+ voxel_num_z=0,
+ voxel_size_x=1,
+ voxel_size_y=1,
+ voxel_size_z=1,
center_x=0,
center_y=0,
center_z=0,
@@ -37,10 +37,16 @@ class VolumeGeometry:
return self.center_y + 0.5*self.voxel_num_y*self.voxel_size_y
def getMinZ(self):
- return self.center_z - 0.5*self.voxel_num_z*self.voxel_size_z
+ if not voxel_num_z == 0:
+ return self.center_z - 0.5*self.voxel_num_z*self.voxel_size_z
+ else:
+ return 0
def getMaxZ(self):
- return self.center_z + 0.5*self.voxel_num_z*self.voxel_size_z
+ if not voxel_num_z == 0:
+ return self.center_z + 0.5*self.voxel_num_z*self.voxel_size_z
+ else:
+ return 0
class SinogramGeometry:
@@ -49,9 +55,9 @@ class SinogramGeometry:
geom_type,
dimension,
angles,
- pixel_num_h=None,
+ pixel_num_h=0,
pixel_size_h=1,
- pixel_num_v=None,
+ pixel_num_v=0,
pixel_size_v=1,
dist_source_center=None,
dist_center_detector=None,
diff --git a/Wrappers/Python/test/simple_mc_demo.py b/Wrappers/Python/wip/simple_mc_demo.py
index a6959f9..54c9134 100644..100755
--- a/Wrappers/Python/test/simple_mc_demo.py
+++ b/Wrappers/Python/wip/simple_mc_demo.py
@@ -11,44 +11,57 @@ from ccpi.reconstruction.ops import *
from ccpi.reconstruction.astra_ops import *
from ccpi.reconstruction.geoms import *
-import numpy as np
+import numpy
import matplotlib.pyplot as plt
-test_case = 2 # 1=parallel2D, 2=cone2D
+test_case = 1 # 1=parallel2D, 2=cone2D
# Set up phantom
N = 128
-
+M = 100
numchannels = 3
-x = np.zeros((N,N,1,numchannels))
+vg = VolumeGeometry(voxel_num_x=N,voxel_num_y=N,channels=numchannels)
+Phantom = VolumeData(geometry=vg)
+
+x = Phantom.as_array()
+x[0 , round(N/4):round(3*N/4) , round(N/4):round(3*N/4) ] = 1.0
+x[0 , round(N/8):round(7*N/8) , round(3*N/8):round(5*N/8)] = 2.0
+
+x[1 , round(N/4):round(3*N/4) , round(N/4):round(3*N/4) ] = 0.7
+x[1 , round(N/8):round(7*N/8) , round(3*N/8):round(5*N/8)] = 1.2
+
+x[2 , round(N/4):round(3*N/4) , round(N/4):round(3*N/4) ] = 1.5
+x[2 , round(N/8):round(7*N/8) , round(3*N/8):round(5*N/8)] = 2.2
+
+#x = numpy.zeros((N,N,1,numchannels))
-x[round(N/4):round(3*N/4),round(N/4):round(3*N/4),:,0] = 1.0
-x[round(N/8):round(7*N/8),round(3*N/8):round(5*N/8),:,0] = 2.0
+#x[round(N/4):round(3*N/4),round(N/4):round(3*N/4),:,0] = 1.0
+#x[round(N/8):round(7*N/8),round(3*N/8):round(5*N/8),:,0] = 2.0
-x[round(N/4):round(3*N/4),round(N/4):round(3*N/4),:,1] = 0.7
-x[round(N/8):round(7*N/8),round(3*N/8):round(5*N/8),:,1] = 1.2
+#x[round(N/4):round(3*N/4),round(N/4):round(3*N/4),:,1] = 0.7
+#x[round(N/8):round(7*N/8),round(3*N/8):round(5*N/8),:,1] = 1.2
-x[round(N/4):round(3*N/4),round(N/4):round(3*N/4),:,2] = 1.5
-x[round(N/8):round(7*N/8),round(3*N/8):round(5*N/8),:,2] = 2.2
+#x[round(N/4):round(3*N/4),round(N/4):round(3*N/4),:,2] = 1.5
+#x[round(N/8):round(7*N/8),round(3*N/8):round(5*N/8),:,2] = 2.2
f, axarr = plt.subplots(1,numchannels)
for k in numpy.arange(3):
- axarr[k].imshow(x[:,:,0,k],vmin=0,vmax=2.5)
+ axarr[k].imshow(x[k],vmin=0,vmax=2.5)
plt.show()
-vg = VolumeGeometry(N,N,None, 1,1,None,channels=numchannels)
+#vg = VolumeGeometry(N,N,None, 1,1,None,channels=numchannels)
-Phantom = VolumeData(x,geometry=vg)
+#Phantom = VolumeData(x,geometry=vg)
# Set up measurement geometry
angles_num = 20; # angles number
if test_case==1:
- angles = np.linspace(0,np.pi,angles_num,endpoint=False)
+ angles = numpy.linspace(0,numpy.pi,angles_num,endpoint=False)
elif test_case==2:
- angles = np.linspace(0,2*np.pi,angles_num,endpoint=False)
+ angles = numpy.linspace(0,2*numpy.pi,angles_num,endpoint=False)
else:
NotImplemented
@@ -76,7 +89,7 @@ elif test_case==2:
channels=numchannels)
# ASTRA operator using volume and sinogram geometries
-Aop = AstraProjectorMC(vg, pg, 'gpu')
+Aop = AstraProjectorMC(vg, pg, 'cpu')
# Try forward and backprojection
@@ -84,21 +97,21 @@ b = Aop.direct(Phantom)
fb, axarrb = plt.subplots(1,numchannels)
for k in numpy.arange(3):
- axarrb[k].imshow(b.as_array()[:,:,0,k],vmin=0,vmax=250)
+ axarrb[k].imshow(b.as_array()[k],vmin=0,vmax=250)
plt.show()
out2 = Aop.adjoint(b)
fo, axarro = plt.subplots(1,numchannels)
for k in range(3):
- axarro[k].imshow(out2.as_array()[:,:,0,k],vmin=0,vmax=3500)
+ axarro[k].imshow(out2.as_array()[k],vmin=0,vmax=3500)
plt.show()
# Create least squares object instance with projector and data.
f = Norm2sq(Aop,b,c=0.5)
# Initial guess
-x_init = VolumeData(np.zeros(x.shape),geometry=vg)
+x_init = VolumeData(numpy.zeros(x.shape),geometry=vg)
# FISTA options
opt = {'tol': 1e-4, 'iter': 200}
@@ -109,7 +122,7 @@ x_fista0, it0, timing0, criter0 = FISTA(x_init, f, None, opt)
ff0, axarrf0 = plt.subplots(1,numchannels)
for k in numpy.arange(3):
- axarrf0[k].imshow(x_fista0.as_array()[:,:,0,k],vmin=0,vmax=2.5)
+ axarrf0[k].imshow(x_fista0.as_array()[k],vmin=0,vmax=2.5)
plt.show()
plt.semilogy(criter0)
@@ -126,7 +139,7 @@ x_fista1, it1, timing1, criter1 = FISTA(x_init, f, g0, opt)
ff1, axarrf1 = plt.subplots(1,numchannels)
for k in numpy.arange(3):
- axarrf1[k].imshow(x_fista1.as_array()[:,:,0,k],vmin=0,vmax=2.5)
+ axarrf1[k].imshow(x_fista1.as_array()[k],vmin=0,vmax=2.5)
plt.show()
plt.semilogy(criter1)