summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgfardell <47746591+gfardell@users.noreply.github.com>2019-07-05 17:18:56 +0100
committerGitHub <noreply@github.com>2019-07-05 17:18:56 +0100
commitb0c8d3c31fc5d58e74da4745169b2426d2206975 (patch)
tree24785455875d51d9a7b94328c0f652a0f5486bc2
parenta6ef951c12daeaefe1c9e77198d0bedd653e7342 (diff)
parent5765d24708cce587f658bf284f724dcaa585fd86 (diff)
downloadastra-wrapper-b0c8d3c31fc5d58e74da4745169b2426d2206975.tar.gz
astra-wrapper-b0c8d3c31fc5d58e74da4745169b2426d2206975.tar.bz2
astra-wrapper-b0c8d3c31fc5d58e74da4745169b2426d2206975.tar.xz
astra-wrapper-b0c8d3c31fc5d58e74da4745169b2426d2206975.zip
Merge pull request #29 from vais-ral/Remove_demos
Deleted demos folder (wip)
-rwxr-xr-xWrappers/Python/wip/demo_astra_mc.py148
-rw-r--r--Wrappers/Python/wip/demo_astra_nexus.py207
-rwxr-xr-xWrappers/Python/wip/demo_astra_simple.py197
-rwxr-xr-xWrappers/Python/wip/demo_astra_sophiabeads.py134
-rw-r--r--Wrappers/Python/wip/demo_astra_sophiabeads3D.py103
5 files changed, 0 insertions, 789 deletions
diff --git a/Wrappers/Python/wip/demo_astra_mc.py b/Wrappers/Python/wip/demo_astra_mc.py
deleted file mode 100755
index fde0120..0000000
--- a/Wrappers/Python/wip/demo_astra_mc.py
+++ /dev/null
@@ -1,148 +0,0 @@
-
-# This demo demonstrates a simple multichannel reconstruction case. A
-# synthetic 3-channel phantom image is set up, data is simulated and the FISTA
-# algorithm is used to compute least squares and least squares with 1-norm
-# regularisation reconstructions.
-
-# Do all imports
-from ccpi.framework import ImageData, AcquisitionData, ImageGeometry, \
- AcquisitionGeometry
-from ccpi.optimisation.algorithms import FISTA
-from ccpi.optimisation.functions import Norm2Sq, L1Norm
-from ccpi.astra.operators import AstraProjectorMC
-
-import numpy
-import matplotlib.pyplot as plt
-
-# Choose either a parallel-beam (1=parallel2D) or fan-beam (2=cone2D) test case
-test_case = 1
-
-# Set up phantom NxN pixels and 3 channels. Set up the ImageGeometry and fill
-# some test data in each of the channels. Display each channel as image.
-N = 128
-numchannels = 3
-
-ig = ImageGeometry(voxel_num_x=N,voxel_num_y=N,channels=numchannels)
-Phantom = ImageData(geometry=ig)
-
-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
-
-f, axarr = plt.subplots(1,numchannels)
-for k in numpy.arange(3):
- axarr[k].imshow(x[k],vmin=0,vmax=2.5)
-plt.show()
-
-# Set up AcquisitionGeometry object to hold the parameters of the measurement
-# setup geometry: # Number of angles, the actual angles from 0 to
-# pi for parallel beam and 0 to 2pi for fanbeam, set the width of a detector
-# pixel relative to an object pixel, the number of detector pixels, and the
-# source-origin and origin-detector distance (here the origin-detector distance
-# set to 0 to simulate a "virtual detector" with same detector pixel size as
-# object pixel size).
-angles_num = 20
-det_w = 1.0
-det_num = N
-SourceOrig = 200
-OrigDetec = 0
-
-if test_case==1:
- angles = numpy.linspace(0,numpy.pi,angles_num,endpoint=False)
- ag = AcquisitionGeometry('parallel',
- '2D',
- angles,
- det_num,
- det_w,
- channels=numchannels)
-elif test_case==2:
- angles = numpy.linspace(0,2*numpy.pi,angles_num,endpoint=False)
- ag = AcquisitionGeometry('cone',
- '2D',
- angles,
- det_num,
- det_w,
- dist_source_center=SourceOrig,
- dist_center_detector=OrigDetec,
- channels=numchannels)
-else:
- NotImplemented
-
-# Set up Operator object combining the ImageGeometry and AcquisitionGeometry
-# wrapping calls to ASTRA as well as specifying whether to use CPU or GPU.
-Aop = AstraProjectorMC(ig, ag, 'gpu')
-
-# Forward and backprojection are available as methods direct and adjoint. Here
-# generate test data b and do simple backprojection to obtain z. Applies
-# channel by channel
-b = Aop.direct(Phantom)
-
-fb, axarrb = plt.subplots(1,numchannels)
-for k in numpy.arange(3):
- axarrb[k].imshow(b.as_array()[k],vmin=0,vmax=250)
-plt.show()
-
-z = Aop.adjoint(b)
-
-fo, axarro = plt.subplots(1,numchannels)
-for k in range(3):
- axarro[k].imshow(z.as_array()[k],vmin=0,vmax=3500)
-plt.show()
-
-# Using the test data b, different reconstruction methods can now be set up as
-# demonstrated in the rest of this file. In general all methods need an initial
-# guess and some algorithm options to be set:
-x_init = ig.allocate(0.0)
-opt = {'tol': 1e-4, 'iter': 200}
-
-# Create least squares object instance with projector, test data and a constant
-# coefficient of 0.5. Note it is least squares over all channels:
-f = Norm2Sq(Aop,b,c=0.5)
-
-# Run FISTA for least squares without regularization
-FISTA_alg = FISTA()
-FISTA_alg.set_up(x_init=x_init, f=f, opt=opt)
-FISTA_alg.max_iteration = 2000
-FISTA_alg.run(opt['iter'])
-x_FISTA = FISTA_alg.get_output()
-
-# Display reconstruction and criterion
-ff0, axarrf0 = plt.subplots(1,numchannels)
-for k in numpy.arange(3):
- axarrf0[k].imshow(x_FISTA.as_array()[k],vmin=0,vmax=2.5)
-plt.show()
-
-plt.figure()
-plt.semilogy(FISTA_alg.objective)
-plt.title('Criterion vs iterations, least squares')
-plt.show()
-
-# FISTA can also solve regularised forms by specifying a second function object
-# such as 1-norm regularisation with choice of regularisation parameter lam.
-# Again the regulariser is over all channels:
-lam = 10
-g1 = lam * L1Norm()
-
-# Run FISTA for least squares plus 1-norm regularisation.
-FISTA_alg1 = FISTA()
-FISTA_alg1.set_up(x_init=x_init, f=f, g=g1, opt=opt)
-FISTA_alg1.max_iteration = 2000
-FISTA_alg1.run(opt['iter'])
-x_FISTA1 = FISTA_alg1.get_output()
-
-# Display reconstruction and criterion
-ff1, axarrf1 = plt.subplots(1,numchannels)
-for k in numpy.arange(3):
- axarrf1[k].imshow(x_FISTA1.as_array()[k],vmin=0,vmax=2.5)
-plt.show()
-
-plt.figure()
-plt.semilogy(FISTA_alg1.objective)
-plt.title('Criterion vs iterations, least squares plus 1-norm regu')
-plt.show()
diff --git a/Wrappers/Python/wip/demo_astra_nexus.py b/Wrappers/Python/wip/demo_astra_nexus.py
deleted file mode 100644
index bb23e81..0000000
--- a/Wrappers/Python/wip/demo_astra_nexus.py
+++ /dev/null
@@ -1,207 +0,0 @@
-
-# This script demonstrates how to load a parallel beam data set in Nexus
-# format and reconstruct using the
-# modular optimisation framework and the ASTRA Tomography toolbox.
-#
-# The data set is available from
-# https://github.com/DiamondLightSource/Savu/blob/master/test_data/data/24737_fd.nxs
-# and should be downloaded to a local directory to be specified below.
-# The data should be flat-field and dark-field corrected.
-
-# All own imports
-from ccpi.framework import ImageData, ImageGeometry
-from ccpi.optimisation.algorithms import CGLS, FISTA
-from ccpi.optimisation.functions import Norm2Sq, L1Norm
-from ccpi.processors import CenterOfRotationFinder
-from ccpi.io import NEXUSDataReader
-from ccpi.astra.operators import AstraProjector3DSimple
-
-# All external imports
-import numpy
-import matplotlib.pyplot as plt
-
-## Set up a reader object pointing to the Nexus data set. Revise path as needed.
-# The data is already corrected for by flat and dark field.
-myreader = NEXUSDataReader(nexus_file="REPLACE_THIS_BY_PATH_TO_DATASET/24737_fd_normalised.nxs" )
-data= myreader.load_data()
-
-# Negative logarithm transoform.
-data.fill( -numpy.log(data.as_array() ))
-
-# Set up CenterOfRotationFinder object to center data.
-# Set the output of the normaliser as the input and execute to determine center.
-cor = CenterOfRotationFinder()
-cor.set_input(data)
-center_of_rotation = cor.get_output()
-
-# From computed center, determine amount of zero-padding to apply, apply
-# and update geometry to wider detector.
-cor_pad = int(2*(center_of_rotation - data.shape[2]/2))
-data_pad = numpy.zeros((data.shape[0],data.shape[1],data.shape[2]+cor_pad))
-data_pad[:,:,:-cor_pad] = data.as_array()
-data.geometry.pixel_num_h = data.geometry.pixel_num_h + cor_pad
-data.array = data_pad
-
-# Permute array and convert angles to radions for ASTRA
-padded_data = data.subset(dimensions=['vertical','angle','horizontal'])
-padded_data.geometry = data.geometry
-padded_data.geometry.angles = padded_data.geometry.angles/180*numpy.pi
-
-# Create Acquisition and Image Geometries for setting up projector.
-ag = padded_data.geometry
-ig = ImageGeometry(voxel_num_x=ag.pixel_num_h,
- voxel_num_y=ag.pixel_num_h,
- voxel_num_z=ag.pixel_num_v)
-
-# Define the projector object
-print ("Define projector")
-Cop = AstraProjector3DSimple(ig, ag)
-
-# Test backprojection and projection
-z1 = Cop.adjoint(padded_data)
-z2 = Cop.direct(z1)
-
-plt.imshow(z1.subset(horizontal_x=68).array)
-plt.show()
-
-# Set initial guess for reconstruction algorithms.
-print ("Initial guess")
-x_init = ImageData(geometry=ig)
-
-# Set tolerance and number of iterations for reconstruction algorithms.
-opt = {'tol': 1e-4, 'iter': 100}
-
-# First a CGLS reconstruction can be done:
-CGLS_alg = CGLS()
-CGLS_alg.set_up(x_init, Cop, padded_data)
-CGLS_alg.max_iteration = 2000
-CGLS_alg.run(opt['iter'])
-
-x_CGLS = CGLS_alg.get_output()
-
-# Fix color and slices for display
-v1 = -0.01
-v2 = 0.13
-hx=80
-hy=80
-v=68
-
-# Display ortho slices of reconstruction
-# Display all reconstructions and decay of objective function
-cols = 3
-rows = 1
-fig = plt.figure()
-
-current = 1
-a=fig.add_subplot(rows,cols,current)
-a.set_title('horizontal_x')
-imgplot = plt.imshow(x_CGLS.subset(horizontal_x=hx).as_array(),vmin=v1,vmax=v2)
-
-current = current + 1
-a=fig.add_subplot(rows,cols,current)
-a.set_title('horizontal_y')
-imgplot = plt.imshow(x_CGLS.subset(horizontal_y=hy).as_array(),vmin=v1,vmax=v2)
-
-current = current + 1
-a=fig.add_subplot(rows,cols,current)
-a.set_title('vertical')
-imgplot = plt.imshow(x_CGLS.subset(vertical=v).as_array(),vmin=v1,vmax=v2)
-plt.colorbar()
-
-plt.suptitle('CGLS reconstruction slices')
-plt.show()
-
-plt.figure()
-plt.semilogy(CGLS_alg.objective)
-plt.title('CGLS criterion')
-plt.show()
-
-# Create least squares object instance with projector and data.
-print ("Create least squares object instance with projector and data.")
-f = Norm2Sq(Cop,padded_data,c=0.5)
-
-
-# Run FISTA for least squares without constraints
-FISTA_alg = FISTA()
-FISTA_alg.set_up(x_init=x_init, f=f, opt=opt)
-FISTA_alg.max_iteration = 2000
-FISTA_alg.run(opt['iter'])
-x_FISTA = FISTA_alg.get_output()
-
-# Display ortho slices of reconstruction
-# Display all reconstructions and decay of objective function
-
-fig = plt.figure()
-
-current = 1
-a=fig.add_subplot(rows,cols,current)
-a.set_title('horizontal_x')
-imgplot = plt.imshow(x_FISTA.subset(horizontal_x=hx).as_array(),vmin=v1,vmax=v2)
-
-current = current + 1
-a=fig.add_subplot(rows,cols,current)
-a.set_title('horizontal_y')
-imgplot = plt.imshow(x_FISTA.subset(horizontal_y=hy).as_array(),vmin=v1,vmax=v2)
-
-current = current + 1
-a=fig.add_subplot(rows,cols,current)
-a.set_title('vertical')
-imgplot = plt.imshow(x_FISTA.subset(vertical=v).as_array(),vmin=v1,vmax=v2)
-plt.colorbar()
-
-plt.suptitle('FISTA Least squares reconstruction slices')
-plt.show()
-
-plt.figure()
-plt.semilogy(FISTA_alg.objective)
-plt.title('FISTA Least squares criterion')
-plt.show()
-
-# Create 1-norm function object
-lam = 30.0
-g0 = lam * L1Norm()
-
-# Run FISTA for least squares plus 1-norm function.
-FISTA_alg1 = FISTA()
-FISTA_alg1.set_up(x_init=x_init, f=f, g=g0, opt=opt)
-FISTA_alg1.max_iteration = 2000
-FISTA_alg1.run(opt['iter'])
-x_FISTA1 = FISTA_alg1.get_output()
-
-# Display all reconstructions and decay of objective function
-fig = plt.figure()
-
-current = 1
-a=fig.add_subplot(rows,cols,current)
-a.set_title('horizontal_x')
-imgplot = plt.imshow(x_FISTA1.subset(horizontal_x=hx).as_array(),vmin=v1,vmax=v2)
-
-current = current + 1
-a=fig.add_subplot(rows,cols,current)
-a.set_title('horizontal_y')
-imgplot = plt.imshow(x_FISTA1.subset(horizontal_y=hy).as_array(),vmin=v1,vmax=v2)
-
-current = current + 1
-a=fig.add_subplot(rows,cols,current)
-a.set_title('vertical')
-imgplot = plt.imshow(x_FISTA1.subset(vertical=v).as_array(),vmin=v1,vmax=v2)
-plt.colorbar()
-
-plt.suptitle('FISTA LS+1 reconstruction slices')
-plt.show()
-
-
-plt.figure()
-plt.semilogy(FISTA_alg1.objective)
-plt.title('FISTA LS+1 criterion')
-plt.show()
-
-
-fig = plt.figure()
-b=fig.add_subplot(1,1,1)
-b.set_title('criteria')
-imgplot = plt.loglog(CGLS_alg.objective , label='CGLS')
-imgplot = plt.loglog(FISTA_alg.objective , label='FISTA LS')
-imgplot = plt.loglog(FISTA_alg1.objective, label='FISTA LS+1')
-b.legend(loc='right')
-plt.show()
diff --git a/Wrappers/Python/wip/demo_astra_simple.py b/Wrappers/Python/wip/demo_astra_simple.py
deleted file mode 100755
index 925df77..0000000
--- a/Wrappers/Python/wip/demo_astra_simple.py
+++ /dev/null
@@ -1,197 +0,0 @@
-
-# This demo illustrates how ASTRA 2D projectors can be used with
-# the modular optimisation framework. The demo sets up a 2D test case and
-# demonstrates reconstruction using CGLS, as well as FISTA for least squares
-# and 1-norm regularisation.
-
-# First make all imports
-from ccpi.framework import ImageData , ImageGeometry, AcquisitionGeometry
-from ccpi.optimisation.algorithms import FISTA, CGLS
-from ccpi.optimisation.functions import Norm2Sq, L1Norm
-from ccpi.astra.operators import AstraProjectorSimple
-
-import numpy as np
-import matplotlib.pyplot as plt
-
-# Choose either a parallel-beam (1=parallel2D) or fan-beam (2=cone2D) test case
-test_case = 1
-
-# Set up phantom size NxN by creating ImageGeometry, initialising the
-# ImageData object with this geometry and empty array and finally put some
-# data into its array, and display as image.
-N = 128
-ig = ImageGeometry(voxel_num_x=N,voxel_num_y=N)
-Phantom = ImageData(geometry=ig)
-
-x = Phantom.as_array()
-x[round(N/4):round(3*N/4),round(N/4):round(3*N/4)] = 0.5
-x[round(N/8):round(7*N/8),round(3*N/8):round(5*N/8)] = 1
-
-plt.imshow(x)
-plt.title('Phantom image')
-plt.show()
-
-# Set up AcquisitionGeometry object to hold the parameters of the measurement
-# setup geometry: # Number of angles, the actual angles from 0 to
-# pi for parallel beam and 0 to 2pi for fanbeam, set the width of a detector
-# pixel relative to an object pixel, the number of detector pixels, and the
-# source-origin and origin-detector distance (here the origin-detector distance
-# set to 0 to simulate a "virtual detector" with same detector pixel size as
-# object pixel size).
-angles_num = 20
-det_w = 1.0
-det_num = N
-SourceOrig = 200
-OrigDetec = 0
-
-if test_case==1:
- angles = np.linspace(0,np.pi,angles_num,endpoint=False)
- ag = AcquisitionGeometry('parallel',
- '2D',
- angles,
- det_num,det_w)
-elif test_case==2:
- angles = np.linspace(0,2*np.pi,angles_num,endpoint=False)
- ag = AcquisitionGeometry('cone',
- '2D',
- angles,
- det_num,
- det_w,
- dist_source_center=SourceOrig,
- dist_center_detector=OrigDetec)
-else:
- NotImplemented
-
-# Set up Operator object combining the ImageGeometry and AcquisitionGeometry
-# wrapping calls to ASTRA as well as specifying whether to use CPU or GPU.
-Aop = AstraProjectorSimple(ig, ag, 'gpu')
-
-# Forward and backprojection are available as methods direct and adjoint. Here
-# generate test data b and do simple backprojection to obtain z.
-b = Aop.direct(Phantom)
-z = Aop.adjoint(b)
-
-plt.imshow(b.array)
-plt.title('Simulated data')
-plt.show()
-
-plt.imshow(z.array)
-plt.title('Backprojected data')
-plt.colorbar()
-plt.show()
-
-# Using the test data b, different reconstruction methods can now be set up as
-# demonstrated in the rest of this file. In general all methods need an initial
-# guess and some algorithm options to be set:
-x_init = ImageData(geometry=ig)
-opt = {'tol': 1e-4, 'iter': 100}
-
-# First a CGLS reconstruction can be done:
-CGLS_alg = CGLS()
-CGLS_alg.set_up(x_init, Aop, b )
-CGLS_alg.max_iteration = 2000
-CGLS_alg.run(opt['iter'])
-
-x_CGLS = CGLS_alg.get_output()
-
-plt.figure()
-plt.imshow(x_CGLS.array)
-plt.title('CGLS')
-plt.show()
-
-plt.figure()
-plt.semilogy(CGLS_alg.objective)
-plt.title('CGLS criterion')
-plt.show()
-
-# CGLS solves the simple least-squares problem. The same problem can be solved
-# by FISTA by setting up explicitly a least squares function object and using
-# no regularisation:
-
-# Create least squares object instance with projector, test data and a constant
-# coefficient of 0.5:
-f = Norm2Sq(Aop,b,c=0.5)
-
-# Run FISTA for least squares without constraints
-FISTA_alg = FISTA()
-FISTA_alg.set_up(x_init=x_init, f=f, opt=opt)
-FISTA_alg.max_iteration = 2000
-FISTA_alg.run(opt['iter'])
-x_FISTA = FISTA_alg.get_output()
-
-plt.figure()
-plt.imshow(x_FISTA.array)
-plt.title('FISTA Least squares reconstruction')
-plt.colorbar()
-plt.show()
-
-plt.figure()
-plt.semilogy(FISTA_alg.objective)
-plt.title('FISTA Least squares criterion')
-plt.show()
-
-
-# FISTA can also solve regularised forms by specifying a second function object
-# such as 1-norm regularisation with choice of regularisation parameter lam:
-
-# Create 1-norm function object
-lam = 1.0
-g0 = lam * L1Norm()
-
-# Run FISTA for least squares plus 1-norm function.
-FISTA_alg1 = FISTA()
-FISTA_alg1.set_up(x_init=x_init, f=f, g=g0, opt=opt)
-FISTA_alg1.max_iteration = 2000
-FISTA_alg1.run(opt['iter'])
-x_FISTA1 = FISTA_alg1.get_output()
-
-plt.figure()
-plt.imshow(x_FISTA1.array)
-plt.title('FISTA LS+L1Norm reconstruction')
-plt.colorbar()
-plt.show()
-
-plt.figure()
-plt.semilogy(FISTA_alg1.objective)
-plt.title('FISTA LS+L1norm criterion')
-plt.show()
-
-
-# Compare all reconstruction and criteria
-clims = (0,1)
-cols = 2
-rows = 2
-current = 1
-
-fig = plt.figure()
-a=fig.add_subplot(rows,cols,current)
-a.set_title('phantom {0}'.format(np.shape(Phantom.as_array())))
-imgplot = plt.imshow(Phantom.as_array(),vmin=clims[0],vmax=clims[1])
-plt.axis('off')
-
-current = current + 1
-a=fig.add_subplot(rows,cols,current)
-a.set_title('CGLS')
-imgplot = plt.imshow(x_CGLS.as_array(),vmin=clims[0],vmax=clims[1])
-plt.axis('off')
-
-current = current + 1
-a=fig.add_subplot(rows,cols,current)
-a.set_title('FISTA LS')
-imgplot = plt.imshow(x_FISTA.as_array(),vmin=clims[0],vmax=clims[1])
-plt.axis('off')
-
-current = current + 1
-a=fig.add_subplot(rows,cols,current)
-a.set_title('FISTA LS+1')
-imgplot = plt.imshow(x_FISTA1.as_array(),vmin=clims[0],vmax=clims[1])
-plt.axis('off')
-
-fig = plt.figure()
-a=fig.add_subplot(1,1,1)
-a.set_title('criteria')
-imgplot = plt.loglog(CGLS_alg.objective, label='CGLS')
-imgplot = plt.loglog(FISTA_alg.objective , label='FISTA LS')
-imgplot = plt.loglog(FISTA_alg1.objective , label='FISTA LS+1')
-a.legend(loc='lower left')
-plt.show()
diff --git a/Wrappers/Python/wip/demo_astra_sophiabeads.py b/Wrappers/Python/wip/demo_astra_sophiabeads.py
deleted file mode 100755
index dce3d91..0000000
--- a/Wrappers/Python/wip/demo_astra_sophiabeads.py
+++ /dev/null
@@ -1,134 +0,0 @@
-
-# This demo shows how to load a Nikon XTek micro-CT data set and reconstruct
-# the central slice using the CGLS and FISTA methods. The SophiaBeads dataset
-# with 64 projections is used as test data and can be obtained from here:
-# https://zenodo.org/record/16474
-# The filename with full path to the .xtekct file should be given as string
-# input to NikonDataReader to load in the data.
-
-# Do all imports
-import numpy as np
-import matplotlib.pyplot as plt
-from ccpi.io import NikonDataReader
-from ccpi.framework import ImageGeometry, AcquisitionGeometry, AcquisitionData, ImageData
-from ccpi.astra.operators import AstraProjectorSimple
-from ccpi.optimisation.algorithms import FISTA, CGLS
-from ccpi.optimisation.functions import Norm2Sq, L1Norm
-
-# Set up reader object and read in central slice the data
-datareader = NikonDataReader(xtek_file="REPLACE_THIS_BY_PATH_TO_DATASET/SophiaBeads_64_averaged.xtekct",
- roi=[(1000,1001),(0,2000)])
-data = datareader.load_projections()
-
-# Extract central slice, scale and negative-log transform
-sino = -np.log(data.as_array()[:,0,:]/60000.0)
-
-# Apply centering correction by zero padding, amount found manually
-cor_pad = 30
-sino_pad = np.zeros((sino.shape[0],sino.shape[1]+cor_pad))
-sino_pad[:,cor_pad:] = sino
-
-# Extract AcquisitionGeometry for central slice for 2D fanbeam reconstruction
-ag2d = AcquisitionGeometry('cone',
- '2D',
- angles=-np.pi/180*data.geometry.angles,
- pixel_num_h=data.geometry.pixel_num_h + cor_pad,
- pixel_size_h=data.geometry.pixel_size_h,
- dist_source_center=-data.geometry.dist_source_center,
- dist_center_detector=data.geometry.dist_center_detector)
-
-# Set up AcquisitionData object for central slice 2D fanbeam
-data2d = AcquisitionData(sino_pad,geometry=ag2d)
-
-# Choose the number of voxels to reconstruct onto as number of detector pixels
-N = data.geometry.pixel_num_h
-
-# Geometric magnification
-mag = (np.abs(data.geometry.dist_center_detector) + \
- np.abs(data.geometry.dist_source_center)) / \
- np.abs(data.geometry.dist_source_center)
-
-# Voxel size is detector pixel size divided by mag
-voxel_size_h = data.geometry.pixel_size_h / mag
-
-# Construct the appropriate ImageGeometry
-ig2d = ImageGeometry(voxel_num_x=N,
- voxel_num_y=N,
- voxel_size_x=voxel_size_h,
- voxel_size_y=voxel_size_h)
-
-# Set up the Projector (AcquisitionModel) using ASTRA on GPU
-Aop = AstraProjectorSimple(ig2d, ag2d,"gpu")
-
-# Set initial guess for CGLS reconstruction
-x_init = ImageData(geometry=ig2d)
-
-# Set tolerance and number of iterations for reconstruction algorithms.
-opt = {'tol': 1e-4, 'iter': 50}
-
-# First a CGLS reconstruction can be done:
-CGLS_alg = CGLS()
-CGLS_alg.set_up(x_init, Aop, data2d)
-CGLS_alg.max_iteration = 2000
-CGLS_alg.run(opt['iter'])
-
-x_CGLS = CGLS_alg.get_output()
-
-plt.figure()
-plt.imshow(x_CGLS.array)
-plt.title('CGLS')
-plt.colorbar()
-plt.show()
-
-plt.figure()
-plt.semilogy(CGLS_alg.objective)
-plt.title('CGLS criterion')
-plt.show()
-
-# CGLS solves the simple least-squares problem. The same problem can be solved
-# by FISTA by setting up explicitly a least squares function object and using
-# no regularisation:
-
-# Create least squares object instance with projector, test data and a constant
-# coefficient of 0.5:
-f = Norm2Sq(Aop,data2d)
-
-# Run FISTA for least squares without constraints
-FISTA_alg = FISTA()
-FISTA_alg.set_up(x_init=x_init, f=f, opt=opt)
-FISTA_alg.max_iteration = 2000
-FISTA_alg.run(opt['iter'])
-x_FISTA = FISTA_alg.get_output()
-
-plt.figure()
-plt.imshow(x_FISTA.array)
-plt.title('FISTA Least squares reconstruction')
-plt.colorbar()
-plt.show()
-
-plt.figure()
-plt.semilogy(FISTA_alg.objective)
-plt.title('FISTA Least squares criterion')
-plt.show()
-
-# Create 1-norm function object
-lam = 1.0
-g0 = lam * L1Norm()
-
-# Run FISTA for least squares plus 1-norm function.
-FISTA_alg1 = FISTA()
-FISTA_alg1.set_up(x_init=x_init, f=f, g=g0, opt=opt)
-FISTA_alg1.max_iteration = 2000
-FISTA_alg1.run(opt['iter'])
-x_FISTA1 = FISTA_alg1.get_output()
-
-plt.figure()
-plt.imshow(x_FISTA1.array)
-plt.title('FISTA LS+L1Norm reconstruction')
-plt.colorbar()
-plt.show()
-
-plt.figure()
-plt.semilogy(FISTA_alg1.objective)
-plt.title('FISTA LS+L1norm criterion')
-plt.show() \ No newline at end of file
diff --git a/Wrappers/Python/wip/demo_astra_sophiabeads3D.py b/Wrappers/Python/wip/demo_astra_sophiabeads3D.py
deleted file mode 100644
index 624f121..0000000
--- a/Wrappers/Python/wip/demo_astra_sophiabeads3D.py
+++ /dev/null
@@ -1,103 +0,0 @@
-
-# This demo shows how to load a Nikon XTek micro-CT data set and reconstruct
-# a volume of 200 slices using the CGLS method. The SophiaBeads dataset with 64
-# projections is used as test data and can be obtained from here:
-# https://zenodo.org/record/16474
-# The filename with full path to the .xtekct file should be given as string
-# input to NikonDataReader to load in the data.
-
-# Do all imports
-import numpy as np
-import matplotlib.pyplot as plt
-from ccpi.io import NikonDataReader
-from ccpi.framework import ImageGeometry, ImageData
-from ccpi.astra.operators import AstraProjector3DSimple
-from ccpi.optimisation.algorithms import CGLS
-
-# Set up reader object and read in 200 central slices of the data
-datareader= NikonDataReader(xtek_file="REPLACE_THIS_BY_PATH_TO_DATASET/SophiaBeads_64_averaged.xtekct",
- roi=[(901,1101),(0,2000)])
-data = datareader.load_projections()
-
-# Scale and negative-log transform
-data.fill(-np.log(data.as_array()/60000.0))
-
-# Apply centering correction by zero padding, amount found manually
-cor_pad = 30
-data_pad = np.zeros((data.shape[0],data.shape[1],data.shape[2]+cor_pad))
-data_pad[:,:,cor_pad:] = data.array
-data.geometry.pixel_num_h = data.geometry.pixel_num_h + cor_pad
-data.array = data_pad
-
-# Choose the number of voxels to reconstruct onto as number of detector pixels
-N = data.geometry.pixel_num_h
-
-# Geometric magnification
-mag = (np.abs(data.geometry.dist_center_detector) + \
- np.abs(data.geometry.dist_source_center)) / \
- np.abs(data.geometry.dist_source_center)
-
-# Voxel size is detector pixel size divided by mag
-voxel_size_h = data.geometry.pixel_size_h / mag
-
-# Construct the appropriate ImageGeometry
-ig = ImageGeometry(voxel_num_x=N,
- voxel_num_y=N,
- voxel_num_z=data.geometry.pixel_num_v,
- voxel_size_x=voxel_size_h,
- voxel_size_y=voxel_size_h,
- voxel_size_z=voxel_size_h)
-
-# Permute array and convert angles to radions for ASTRA; delete old data.
-data2 = data.subset(dimensions=['vertical','angle','horizontal'])
-data2.geometry = data.geometry
-data2.geometry.angles = -data2.geometry.angles/180*np.pi
-del data
-
-# Extract the Acquisition geometry for setting up projector.
-ag = data2.geometry
-
-# Set up the Projector (AcquisitionModel) using ASTRA on GPU
-Aop = AstraProjector3DSimple(ig, ag)
-
-# Do and show simple backprojection
-z = Aop.adjoint(data2)
-plt.figure()
-plt.imshow(z.subset(horizontal_x=1000).as_array())
-plt.show()
-plt.figure()
-plt.imshow(z.subset(horizontal_y=1000).as_array())
-plt.show()
-plt.figure()
-plt.imshow(z.subset(vertical=100).array)
-plt.show()
-
-# Set initial guess for CGLS reconstruction
-x_init = ImageData(geometry=ig)
-
-# Set tolerance and number of iterations for reconstruction algorithms.
-opt = {'tol': 1e-4, 'iter': 30}
-
-# Run a CGLS reconstruction can be done:
-CGLS_alg = CGLS()
-CGLS_alg.set_up(x_init, Aop, data2)
-CGLS_alg.max_iteration = 2000
-CGLS_alg.run(opt['iter'])
-
-x_CGLS = CGLS_alg.get_output()
-
-# Display ortho slices of reconstruction
-plt.figure()
-plt.imshow(x_CGLS.subset(horizontal_x=1000).as_array())
-plt.show()
-plt.figure()
-plt.imshow(x_CGLS.subset(horizontal_y=1000).as_array())
-plt.show()
-plt.figure()
-plt.imshow(x_CGLS.subset(vertical=100).as_array())
-plt.show()
-
-plt.figure()
-plt.semilogy(CGLS_alg.objective)
-plt.title('CGLS criterion')
-plt.show() \ No newline at end of file