From 18b6d25f7e4f0943b3592f3bb4f6ca5ed9c285d3 Mon Sep 17 00:00:00 2001
From: "Daniel M. Pelt" <D.M.Pelt@cwi.nl>
Date: Fri, 19 Jun 2015 22:28:06 +0200
Subject: Add support for Python algorithm plugins

---
 samples/python/s018_plugin.py | 138 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 138 insertions(+)
 create mode 100644 samples/python/s018_plugin.py

(limited to 'samples/python')

diff --git a/samples/python/s018_plugin.py b/samples/python/s018_plugin.py
new file mode 100644
index 0000000..6677930
--- /dev/null
+++ b/samples/python/s018_plugin.py
@@ -0,0 +1,138 @@
+#-----------------------------------------------------------------------
+#Copyright 2015 Centrum Wiskunde & Informatica, Amsterdam
+#
+#Author: Daniel M. Pelt
+#Contact: D.M.Pelt@cwi.nl
+#Website: http://dmpelt.github.io/pyastratoolbox/
+#
+#
+#This file is part of the Python interface to the
+#All Scale Tomographic Reconstruction Antwerp Toolbox ("ASTRA Toolbox").
+#
+#The Python interface to the ASTRA Toolbox is free software: you can redistribute it and/or modify
+#it under the terms of the GNU General Public License as published by
+#the Free Software Foundation, either version 3 of the License, or
+#(at your option) any later version.
+#
+#The Python interface to the ASTRA Toolbox is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+#GNU General Public License for more details.
+#
+#You should have received a copy of the GNU General Public License
+#along with the Python interface to the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
+#
+#-----------------------------------------------------------------------
+
+import astra
+import numpy as np
+import six
+
+# Define the plugin class (has to subclass astra.plugin.base)
+# Note that usually, these will be defined in a separate package/module
+class SIRTPlugin(astra.plugin.base):
+    """Example of an ASTRA plugin class, implementing a simple 2D SIRT algorithm.
+
+    Optional options:
+
+    'rel_factor': relaxation factor
+    """
+    required_options=[]
+    optional_options=['rel_factor']
+
+    def initialize(self,cfg):
+        self.W = astra.OpTomo(cfg['ProjectorId'])
+        self.vid = cfg['ReconstructionDataId']
+        self.sid = cfg['ProjectionDataId']
+        try:
+            self.rel = cfg['option']['rel_factor']
+        except KeyError:
+            self.rel = 1
+
+    def run(self, its):
+        v = astra.data2d.get_shared(self.vid)
+        s = astra.data2d.get_shared(self.sid)
+        W = self.W
+        for i in range(its):
+            v[:] += self.rel*(W.T*(s - (W*v).reshape(s.shape))).reshape(v.shape)/s.size
+
+if __name__=='__main__':
+
+    vol_geom = astra.create_vol_geom(256, 256)
+    proj_geom = astra.create_proj_geom('parallel', 1.0, 384, np.linspace(0,np.pi,180,False))
+
+    # As before, create a sinogram from a phantom
+    import scipy.io
+    P = scipy.io.loadmat('phantom.mat')['phantom256']
+    proj_id = astra.create_projector('cuda',proj_geom,vol_geom)
+
+    # construct the OpTomo object
+    W = astra.OpTomo(proj_id)
+
+    sinogram = W * P
+    sinogram = sinogram.reshape([180, 384])
+
+    # Register the plugin with ASTRA
+    # A default set of plugins to load can be defined in:
+    #     - /etc/astra-toolbox/plugins.txt
+    #     - [ASTRA_INSTALL_PATH]/python/astra/plugins.txt
+    #     - [USER_HOME_PATH]/.astra-toolbox/plugins.txt
+    #     - [ASTRA_PLUGIN_PATH environment variable]/plugins.txt
+    # In these files, create a separate line for each plugin with:
+    # [PLUGIN_ASTRA_NAME] [FULL_PLUGIN_CLASS]
+    #
+    # So in this case, it would be a line:
+    # SIRT-PLUGIN s018_plugin.SIRTPlugin
+    #
+    astra.plugin.register('SIRT-PLUGIN','s018_plugin.SIRTPlugin')
+
+    # To get help on a registered plugin, use get_help
+    six.print_(astra.plugin.get_help('SIRT-PLUGIN'))
+
+    # Create data structures
+    sid = astra.data2d.create('-sino', proj_geom, sinogram)
+    vid = astra.data2d.create('-vol', vol_geom)
+
+    # Create config using plugin name
+    cfg = astra.astra_dict('SIRT-PLUGIN')
+    cfg['ProjectorId'] = proj_id
+    cfg['ProjectionDataId'] = sid
+    cfg['ReconstructionDataId'] = vid
+
+    # Create algorithm object
+    alg_id = astra.algorithm.create(cfg)
+
+    # Run algorithm for 100 iterations
+    astra.algorithm.run(alg_id, 100)
+
+    # Get reconstruction
+    rec = astra.data2d.get(vid)
+
+    # Options for the plugin go in cfg['option']
+    cfg = astra.astra_dict('SIRT-PLUGIN')
+    cfg['ProjectorId'] = proj_id
+    cfg['ProjectionDataId'] = sid
+    cfg['ReconstructionDataId'] = vid
+    cfg['option'] = {}
+    cfg['option']['rel_factor'] = 1.5
+    alg_id_rel = astra.algorithm.create(cfg)
+    astra.algorithm.run(alg_id_rel, 100)
+    rec_rel = astra.data2d.get(vid)
+
+    # We can also use OpTomo to call the plugin
+    rec_op = W.reconstruct('SIRT-PLUGIN', sinogram, 100, extraOptions={'rel_factor':1.5})
+
+    import pylab as pl
+    pl.gray()
+    pl.figure(1)
+    pl.imshow(rec,vmin=0,vmax=1)
+    pl.figure(2)
+    pl.imshow(rec_rel,vmin=0,vmax=1)
+    pl.figure(3)
+    pl.imshow(rec_op,vmin=0,vmax=1)
+    pl.show()
+
+    # Clean up.
+    astra.projector.delete(proj_id)
+    astra.algorithm.delete([alg_id, alg_id_rel])
+    astra.data2d.delete([vid, sid])
-- 
cgit v1.2.3


From 11af4b554df9a8a5c31d9dcbc1ea849b32394ba3 Mon Sep 17 00:00:00 2001
From: "Daniel M. Pelt" <D.M.Pelt@cwi.nl>
Date: Wed, 24 Jun 2015 18:36:03 +0200
Subject: Better way of passing options to Python plugin using inspect

---
 samples/python/s018_plugin.py | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

(limited to 'samples/python')

diff --git a/samples/python/s018_plugin.py b/samples/python/s018_plugin.py
index 6677930..90e09ac 100644
--- a/samples/python/s018_plugin.py
+++ b/samples/python/s018_plugin.py
@@ -33,21 +33,16 @@ import six
 class SIRTPlugin(astra.plugin.base):
     """Example of an ASTRA plugin class, implementing a simple 2D SIRT algorithm.
 
-    Optional options:
+    Options:
 
-    'rel_factor': relaxation factor
+    'rel_factor': relaxation factor (optional)
     """
-    required_options=[]
-    optional_options=['rel_factor']
 
-    def initialize(self,cfg):
+    def initialize(self,cfg, rel_factor = 1):
         self.W = astra.OpTomo(cfg['ProjectorId'])
         self.vid = cfg['ReconstructionDataId']
         self.sid = cfg['ProjectionDataId']
-        try:
-            self.rel = cfg['option']['rel_factor']
-        except KeyError:
-            self.rel = 1
+        self.rel = rel_factor
 
     def run(self, its):
         v = astra.data2d.get_shared(self.vid)
-- 
cgit v1.2.3


From d91b51f6d58003de84a9d6dd8189fceba0e81a5a Mon Sep 17 00:00:00 2001
From: "Daniel M. Pelt" <D.M.Pelt@cwi.nl>
Date: Mon, 20 Jul 2015 14:07:21 +0200
Subject: Allow registering plugins without explicit name, and fix exception
 handling when running in Matlab

---
 samples/python/s018_plugin.py | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

(limited to 'samples/python')

diff --git a/samples/python/s018_plugin.py b/samples/python/s018_plugin.py
index 90e09ac..31cca95 100644
--- a/samples/python/s018_plugin.py
+++ b/samples/python/s018_plugin.py
@@ -38,6 +38,10 @@ class SIRTPlugin(astra.plugin.base):
     'rel_factor': relaxation factor (optional)
     """
 
+    # The astra_name variable defines the name to use to
+    # call the plugin from ASTRA
+    astra_name = "SIRT-PLUGIN"
+
     def initialize(self,cfg, rel_factor = 1):
         self.W = astra.OpTomo(cfg['ProjectorId'])
         self.vid = cfg['ReconstructionDataId']
@@ -68,18 +72,13 @@ if __name__=='__main__':
     sinogram = sinogram.reshape([180, 384])
 
     # Register the plugin with ASTRA
-    # A default set of plugins to load can be defined in:
-    #     - /etc/astra-toolbox/plugins.txt
-    #     - [ASTRA_INSTALL_PATH]/python/astra/plugins.txt
-    #     - [USER_HOME_PATH]/.astra-toolbox/plugins.txt
-    #     - [ASTRA_PLUGIN_PATH environment variable]/plugins.txt
-    # In these files, create a separate line for each plugin with:
-    # [PLUGIN_ASTRA_NAME] [FULL_PLUGIN_CLASS]
-    #
-    # So in this case, it would be a line:
-    # SIRT-PLUGIN s018_plugin.SIRTPlugin
-    #
-    astra.plugin.register('SIRT-PLUGIN','s018_plugin.SIRTPlugin')
+    # First we import the package that contains the plugin
+    import s018_plugin
+    # Then, we register the plugin class with ASTRA
+    astra.plugin.register(s018_plugin.SIRTPlugin)
+
+    # Get a list of registered plugins
+    six.print_(astra.plugin.get_registered())
 
     # To get help on a registered plugin, use get_help
     six.print_(astra.plugin.get_help('SIRT-PLUGIN'))
-- 
cgit v1.2.3


From e07449189a05e3bcdc8ad4a9fbb95c0751f567bb Mon Sep 17 00:00:00 2001
From: Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>
Date: Fri, 4 Dec 2015 15:15:16 +0100
Subject: Add sample for experimental composite geometry code

---
 samples/python/s018_experimental_multires.py | 84 ++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)
 create mode 100644 samples/python/s018_experimental_multires.py

(limited to 'samples/python')

diff --git a/samples/python/s018_experimental_multires.py b/samples/python/s018_experimental_multires.py
new file mode 100644
index 0000000..cf38e53
--- /dev/null
+++ b/samples/python/s018_experimental_multires.py
@@ -0,0 +1,84 @@
+#-----------------------------------------------------------------------
+#Copyright 2013 Centrum Wiskunde & Informatica, Amsterdam
+#
+#Author: Daniel M. Pelt
+#Contact: D.M.Pelt@cwi.nl
+#Website: http://dmpelt.github.io/pyastratoolbox/
+#
+#
+#This file is part of the Python interface to the
+#All Scale Tomographic Reconstruction Antwerp Toolbox ("ASTRA Toolbox").
+#
+#The Python interface to the ASTRA Toolbox is free software: you can redistribute it and/or modify
+#it under the terms of the GNU General Public License as published by
+#the Free Software Foundation, either version 3 of the License, or
+#(at your option) any later version.
+#
+#The Python interface to the ASTRA Toolbox is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+#GNU General Public License for more details.
+#
+#You should have received a copy of the GNU General Public License
+#along with the Python interface to the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
+#
+#-----------------------------------------------------------------------
+
+import astra
+import numpy as np
+from astra.experimental import do_composite_FP
+
+astra.log.setOutputScreen(astra.log.STDERR, astra.log.DEBUG)
+
+# low res part (voxels of 4x4x4)
+vol_geom1 = astra.create_vol_geom(32, 16, 32, -64, 0, -64, 64, -64, 64)
+
+# high res part (voxels of 1x1x1)
+vol_geom2 = astra.create_vol_geom(128, 64, 128, 0, 64, -64, 64, -64, 64)
+
+
+# Split the output in two parts as well, for demonstration purposes
+angles1 = np.linspace(0, np.pi/2, 90, False)
+angles2 = np.linspace(np.pi/2, np.pi, 90, False)
+proj_geom1 = astra.create_proj_geom('parallel3d', 1.0, 1.0, 128, 192, angles1)
+proj_geom2 = astra.create_proj_geom('parallel3d', 1.0, 1.0, 128, 192, angles2)
+
+# Create a simple hollow cube phantom
+cube1 = np.zeros((32,32,16))
+cube1[4:28,4:28,4:16] = 1
+
+cube2 = np.zeros((128,128,64))
+cube2[16:112,16:112,0:112] = 1
+cube2[33:97,33:97,4:28] = 0
+
+vol1 = astra.data3d.create('-vol', vol_geom1, cube1)
+vol2 = astra.data3d.create('-vol', vol_geom2, cube2)
+
+proj1 = astra.data3d.create('-proj3d', proj_geom1, 0)
+proj2 = astra.data3d.create('-proj3d', proj_geom2, 0)
+
+# The actual geometries don't matter for this composite FP/BP case
+projector = astra.create_projector('cuda3d', proj_geom1, vol_geom1)
+
+do_composite_FP(projector, [vol1, vol2], [proj1, proj2])
+
+proj_data1 = astra.data3d.get(proj1)
+proj_data2 = astra.data3d.get(proj2)
+
+# Display a single projection image
+import pylab
+pylab.gray()
+pylab.figure(1)
+pylab.imshow(proj_data1[:,0,:])
+pylab.figure(2)
+pylab.imshow(proj_data2[:,0,:])
+pylab.show()
+
+
+# Clean up. Note that GPU memory is tied up in the algorithm object,
+# and main RAM in the data objects.
+astra.data3d.delete(vol1)
+astra.data3d.delete(vol2)
+astra.data3d.delete(proj1)
+astra.data3d.delete(proj2)
+astra.projector3d.delete(projector)
-- 
cgit v1.2.3


From f2227eaca7248b6b01a5776f0cb750cff4c0279a Mon Sep 17 00:00:00 2001
From: Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>
Date: Thu, 7 Jan 2016 13:29:37 +0100
Subject: Rename sample with conflicting filename

---
 samples/python/s018_experimental_multires.py | 84 ----------------------------
 samples/python/s019_experimental_multires.py | 84 ++++++++++++++++++++++++++++
 2 files changed, 84 insertions(+), 84 deletions(-)
 delete mode 100644 samples/python/s018_experimental_multires.py
 create mode 100644 samples/python/s019_experimental_multires.py

(limited to 'samples/python')

diff --git a/samples/python/s018_experimental_multires.py b/samples/python/s018_experimental_multires.py
deleted file mode 100644
index cf38e53..0000000
--- a/samples/python/s018_experimental_multires.py
+++ /dev/null
@@ -1,84 +0,0 @@
-#-----------------------------------------------------------------------
-#Copyright 2013 Centrum Wiskunde & Informatica, Amsterdam
-#
-#Author: Daniel M. Pelt
-#Contact: D.M.Pelt@cwi.nl
-#Website: http://dmpelt.github.io/pyastratoolbox/
-#
-#
-#This file is part of the Python interface to the
-#All Scale Tomographic Reconstruction Antwerp Toolbox ("ASTRA Toolbox").
-#
-#The Python interface to the ASTRA Toolbox is free software: you can redistribute it and/or modify
-#it under the terms of the GNU General Public License as published by
-#the Free Software Foundation, either version 3 of the License, or
-#(at your option) any later version.
-#
-#The Python interface to the ASTRA Toolbox is distributed in the hope that it will be useful,
-#but WITHOUT ANY WARRANTY; without even the implied warranty of
-#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-#GNU General Public License for more details.
-#
-#You should have received a copy of the GNU General Public License
-#along with the Python interface to the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
-#
-#-----------------------------------------------------------------------
-
-import astra
-import numpy as np
-from astra.experimental import do_composite_FP
-
-astra.log.setOutputScreen(astra.log.STDERR, astra.log.DEBUG)
-
-# low res part (voxels of 4x4x4)
-vol_geom1 = astra.create_vol_geom(32, 16, 32, -64, 0, -64, 64, -64, 64)
-
-# high res part (voxels of 1x1x1)
-vol_geom2 = astra.create_vol_geom(128, 64, 128, 0, 64, -64, 64, -64, 64)
-
-
-# Split the output in two parts as well, for demonstration purposes
-angles1 = np.linspace(0, np.pi/2, 90, False)
-angles2 = np.linspace(np.pi/2, np.pi, 90, False)
-proj_geom1 = astra.create_proj_geom('parallel3d', 1.0, 1.0, 128, 192, angles1)
-proj_geom2 = astra.create_proj_geom('parallel3d', 1.0, 1.0, 128, 192, angles2)
-
-# Create a simple hollow cube phantom
-cube1 = np.zeros((32,32,16))
-cube1[4:28,4:28,4:16] = 1
-
-cube2 = np.zeros((128,128,64))
-cube2[16:112,16:112,0:112] = 1
-cube2[33:97,33:97,4:28] = 0
-
-vol1 = astra.data3d.create('-vol', vol_geom1, cube1)
-vol2 = astra.data3d.create('-vol', vol_geom2, cube2)
-
-proj1 = astra.data3d.create('-proj3d', proj_geom1, 0)
-proj2 = astra.data3d.create('-proj3d', proj_geom2, 0)
-
-# The actual geometries don't matter for this composite FP/BP case
-projector = astra.create_projector('cuda3d', proj_geom1, vol_geom1)
-
-do_composite_FP(projector, [vol1, vol2], [proj1, proj2])
-
-proj_data1 = astra.data3d.get(proj1)
-proj_data2 = astra.data3d.get(proj2)
-
-# Display a single projection image
-import pylab
-pylab.gray()
-pylab.figure(1)
-pylab.imshow(proj_data1[:,0,:])
-pylab.figure(2)
-pylab.imshow(proj_data2[:,0,:])
-pylab.show()
-
-
-# Clean up. Note that GPU memory is tied up in the algorithm object,
-# and main RAM in the data objects.
-astra.data3d.delete(vol1)
-astra.data3d.delete(vol2)
-astra.data3d.delete(proj1)
-astra.data3d.delete(proj2)
-astra.projector3d.delete(projector)
diff --git a/samples/python/s019_experimental_multires.py b/samples/python/s019_experimental_multires.py
new file mode 100644
index 0000000..cf38e53
--- /dev/null
+++ b/samples/python/s019_experimental_multires.py
@@ -0,0 +1,84 @@
+#-----------------------------------------------------------------------
+#Copyright 2013 Centrum Wiskunde & Informatica, Amsterdam
+#
+#Author: Daniel M. Pelt
+#Contact: D.M.Pelt@cwi.nl
+#Website: http://dmpelt.github.io/pyastratoolbox/
+#
+#
+#This file is part of the Python interface to the
+#All Scale Tomographic Reconstruction Antwerp Toolbox ("ASTRA Toolbox").
+#
+#The Python interface to the ASTRA Toolbox is free software: you can redistribute it and/or modify
+#it under the terms of the GNU General Public License as published by
+#the Free Software Foundation, either version 3 of the License, or
+#(at your option) any later version.
+#
+#The Python interface to the ASTRA Toolbox is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+#GNU General Public License for more details.
+#
+#You should have received a copy of the GNU General Public License
+#along with the Python interface to the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
+#
+#-----------------------------------------------------------------------
+
+import astra
+import numpy as np
+from astra.experimental import do_composite_FP
+
+astra.log.setOutputScreen(astra.log.STDERR, astra.log.DEBUG)
+
+# low res part (voxels of 4x4x4)
+vol_geom1 = astra.create_vol_geom(32, 16, 32, -64, 0, -64, 64, -64, 64)
+
+# high res part (voxels of 1x1x1)
+vol_geom2 = astra.create_vol_geom(128, 64, 128, 0, 64, -64, 64, -64, 64)
+
+
+# Split the output in two parts as well, for demonstration purposes
+angles1 = np.linspace(0, np.pi/2, 90, False)
+angles2 = np.linspace(np.pi/2, np.pi, 90, False)
+proj_geom1 = astra.create_proj_geom('parallel3d', 1.0, 1.0, 128, 192, angles1)
+proj_geom2 = astra.create_proj_geom('parallel3d', 1.0, 1.0, 128, 192, angles2)
+
+# Create a simple hollow cube phantom
+cube1 = np.zeros((32,32,16))
+cube1[4:28,4:28,4:16] = 1
+
+cube2 = np.zeros((128,128,64))
+cube2[16:112,16:112,0:112] = 1
+cube2[33:97,33:97,4:28] = 0
+
+vol1 = astra.data3d.create('-vol', vol_geom1, cube1)
+vol2 = astra.data3d.create('-vol', vol_geom2, cube2)
+
+proj1 = astra.data3d.create('-proj3d', proj_geom1, 0)
+proj2 = astra.data3d.create('-proj3d', proj_geom2, 0)
+
+# The actual geometries don't matter for this composite FP/BP case
+projector = astra.create_projector('cuda3d', proj_geom1, vol_geom1)
+
+do_composite_FP(projector, [vol1, vol2], [proj1, proj2])
+
+proj_data1 = astra.data3d.get(proj1)
+proj_data2 = astra.data3d.get(proj2)
+
+# Display a single projection image
+import pylab
+pylab.gray()
+pylab.figure(1)
+pylab.imshow(proj_data1[:,0,:])
+pylab.figure(2)
+pylab.imshow(proj_data2[:,0,:])
+pylab.show()
+
+
+# Clean up. Note that GPU memory is tied up in the algorithm object,
+# and main RAM in the data objects.
+astra.data3d.delete(vol1)
+astra.data3d.delete(vol2)
+astra.data3d.delete(proj1)
+astra.data3d.delete(proj2)
+astra.projector3d.delete(projector)
-- 
cgit v1.2.3


From b529ff854f0e1191108e31d6be294d31b50c666e Mon Sep 17 00:00:00 2001
From: Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>
Date: Thu, 7 Jan 2016 13:36:02 +0100
Subject: Add multi-GPU sample

---
 samples/python/s020_3d_multiGPU.py | 57 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)
 create mode 100644 samples/python/s020_3d_multiGPU.py

(limited to 'samples/python')

diff --git a/samples/python/s020_3d_multiGPU.py b/samples/python/s020_3d_multiGPU.py
new file mode 100644
index 0000000..d6799c4
--- /dev/null
+++ b/samples/python/s020_3d_multiGPU.py
@@ -0,0 +1,57 @@
+#-----------------------------------------------------------------------
+#Copyright 2013 Centrum Wiskunde & Informatica, Amsterdam
+#
+#Author: Daniel M. Pelt
+#Contact: D.M.Pelt@cwi.nl
+#Website: http://dmpelt.github.io/pyastratoolbox/
+#
+#
+#This file is part of the Python interface to the
+#All Scale Tomographic Reconstruction Antwerp Toolbox ("ASTRA Toolbox").
+#
+#The Python interface to the ASTRA Toolbox is free software: you can redistribute it and/or modify
+#it under the terms of the GNU General Public License as published by
+#the Free Software Foundation, either version 3 of the License, or
+#(at your option) any later version.
+#
+#The Python interface to the ASTRA Toolbox is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+#GNU General Public License for more details.
+#
+#You should have received a copy of the GNU General Public License
+#along with the Python interface to the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
+#
+#-----------------------------------------------------------------------
+
+import astra
+import numpy as np
+
+# Set up multi-GPU usage.
+# This only works for 3D GPU forward projection and back projection.
+astra.astra.set_gpu_index([0,1])
+
+# Optionally, you can also restrict the amount of GPU memory ASTRA will use.
+# The line commented below sets this to 1GB.
+#astra.astra.set_gpu_index([0,1], memory=1024*1024*1024)
+
+vol_geom = astra.create_vol_geom(1024, 1024, 1024)
+
+angles = np.linspace(0, np.pi, 1024,False)
+proj_geom = astra.create_proj_geom('parallel3d', 1.0, 1.0, 1024, 1024, angles)
+
+# Create a simple hollow cube phantom
+cube = np.zeros((1024,1024,1024))
+cube[128:895,128:895,128:895] = 1
+cube[256:767,256:767,256:767] = 0
+
+# Create projection data from this
+proj_id, proj_data = astra.create_sino3d_gpu(cube, proj_geom, vol_geom)
+
+# Backproject projection data
+bproj_id, bproj_data = astra.create_backprojection3d_gpu(proj_data, proj_geom, vol_geom)
+
+# Clean up. Note that GPU memory is tied up in the algorithm object,
+# and main RAM in the data objects.
+astra.data3d.delete(proj_id)
+astra.data3d.delete(bproj_id)
-- 
cgit v1.2.3


From 1e26f7602b6685c584fd4d857353f390622e3a34 Mon Sep 17 00:00:00 2001
From: "Daniel M. Pelt" <D.M.Pelt@cwi.nl>
Date: Mon, 25 Apr 2016 10:47:59 +0200
Subject: Change flatten to ravel in Python code

---
 samples/python/s009_projection_matrix.py | 2 +-
 samples/python/s015_fp_bp.py             | 6 +++---
 samples/python/s017_OpTomo.py            | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

(limited to 'samples/python')

diff --git a/samples/python/s009_projection_matrix.py b/samples/python/s009_projection_matrix.py
index c4c4557..e20d58c 100644
--- a/samples/python/s009_projection_matrix.py
+++ b/samples/python/s009_projection_matrix.py
@@ -46,7 +46,7 @@ W = astra.matrix.get(matrix_id)
 # Manually use this projection matrix to do a projection:
 import scipy.io
 P = scipy.io.loadmat('phantom.mat')['phantom256']
-s = W.dot(P.flatten())
+s = W.dot(P.ravel())
 s = np.reshape(s, (len(proj_geom['ProjectionAngles']),proj_geom['DetectorCount']))
 
 import pylab
diff --git a/samples/python/s015_fp_bp.py b/samples/python/s015_fp_bp.py
index fa0bf86..ff0b30a 100644
--- a/samples/python/s015_fp_bp.py
+++ b/samples/python/s015_fp_bp.py
@@ -46,12 +46,12 @@ class astra_wrap(object):
     def matvec(self,v):
         sid, s = astra.create_sino(np.reshape(v,(vol_geom['GridRowCount'],vol_geom['GridColCount'])),self.proj_id)
         astra.data2d.delete(sid)
-        return s.flatten()
+        return s.ravel()
     
     def rmatvec(self,v):
         bid, b = astra.create_backprojection(np.reshape(v,(len(proj_geom['ProjectionAngles']),proj_geom['DetectorCount'],)),self.proj_id)
         astra.data2d.delete(bid)
-        return b.flatten()
+        return b.ravel()
 
 vol_geom = astra.create_vol_geom(256, 256)
 proj_geom = astra.create_proj_geom('parallel', 1.0, 384, np.linspace(0,np.pi,180,False))
@@ -65,7 +65,7 @@ proj_id = astra.create_projector('cuda',proj_geom,vol_geom)
 sinogram_id, sinogram = astra.create_sino(P, proj_id)
 
 # Reshape the sinogram into a vector
-b = sinogram.flatten()
+b = sinogram.ravel()
 
 # Call lsqr with ASTRA FP and BP
 import scipy.sparse.linalg
diff --git a/samples/python/s017_OpTomo.py b/samples/python/s017_OpTomo.py
index 967fa64..214e9a7 100644
--- a/samples/python/s017_OpTomo.py
+++ b/samples/python/s017_OpTomo.py
@@ -50,7 +50,7 @@ pylab.figure(2)
 pylab.imshow(sinogram)
 
 # Run the lsqr linear solver
-output = scipy.sparse.linalg.lsqr(W, sinogram.flatten(), iter_lim=150)
+output = scipy.sparse.linalg.lsqr(W, sinogram.ravel(), iter_lim=150)
 rec = output[0].reshape([256, 256])
 
 pylab.figure(3)
-- 
cgit v1.2.3


From ed717202a0c917958892e26322d6ea5173f7b32c Mon Sep 17 00:00:00 2001
From: Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>
Date: Mon, 25 Apr 2016 17:04:39 +0200
Subject: Use FP/BP out argument in sample plugin

---
 samples/python/s018_plugin.py | 34 +++++++++++++++++++++-------------
 1 file changed, 21 insertions(+), 13 deletions(-)

(limited to 'samples/python')

diff --git a/samples/python/s018_plugin.py b/samples/python/s018_plugin.py
index 31cca95..85b5486 100644
--- a/samples/python/s018_plugin.py
+++ b/samples/python/s018_plugin.py
@@ -30,30 +30,38 @@ import six
 
 # Define the plugin class (has to subclass astra.plugin.base)
 # Note that usually, these will be defined in a separate package/module
-class SIRTPlugin(astra.plugin.base):
-    """Example of an ASTRA plugin class, implementing a simple 2D SIRT algorithm.
+class LandweberPlugin(astra.plugin.base):
+    """Example of an ASTRA plugin class, implementing a simple 2D Landweber algorithm.
 
     Options:
 
-    'rel_factor': relaxation factor (optional)
+    'Relaxation': relaxation factor (optional)
     """
 
     # The astra_name variable defines the name to use to
     # call the plugin from ASTRA
-    astra_name = "SIRT-PLUGIN"
+    astra_name = "LANDWEBER-PLUGIN"
 
-    def initialize(self,cfg, rel_factor = 1):
+    def initialize(self,cfg, Relaxation = 1):
         self.W = astra.OpTomo(cfg['ProjectorId'])
         self.vid = cfg['ReconstructionDataId']
         self.sid = cfg['ProjectionDataId']
-        self.rel = rel_factor
+        self.rel = Relaxation
 
     def run(self, its):
         v = astra.data2d.get_shared(self.vid)
         s = astra.data2d.get_shared(self.sid)
+        tv = np.zeros(v.shape, dtype=np.float32)
+        ts = np.zeros(s.shape, dtype=np.float32)
         W = self.W
         for i in range(its):
-            v[:] += self.rel*(W.T*(s - (W*v).reshape(s.shape))).reshape(v.shape)/s.size
+            W.FP(v,out=ts)
+            ts -= s # ts = W*v - s
+
+            W.BP(ts,out=tv)
+            tv *= self.rel / s.size
+
+            v -= tv # v = v - rel * W'*(W*v-s) / s.size
 
 if __name__=='__main__':
 
@@ -75,20 +83,20 @@ if __name__=='__main__':
     # First we import the package that contains the plugin
     import s018_plugin
     # Then, we register the plugin class with ASTRA
-    astra.plugin.register(s018_plugin.SIRTPlugin)
+    astra.plugin.register(s018_plugin.LandweberPlugin)
 
     # Get a list of registered plugins
     six.print_(astra.plugin.get_registered())
 
     # To get help on a registered plugin, use get_help
-    six.print_(astra.plugin.get_help('SIRT-PLUGIN'))
+    six.print_(astra.plugin.get_help('LANDWEBER-PLUGIN'))
 
     # Create data structures
     sid = astra.data2d.create('-sino', proj_geom, sinogram)
     vid = astra.data2d.create('-vol', vol_geom)
 
     # Create config using plugin name
-    cfg = astra.astra_dict('SIRT-PLUGIN')
+    cfg = astra.astra_dict('LANDWEBER-PLUGIN')
     cfg['ProjectorId'] = proj_id
     cfg['ProjectionDataId'] = sid
     cfg['ReconstructionDataId'] = vid
@@ -103,18 +111,18 @@ if __name__=='__main__':
     rec = astra.data2d.get(vid)
 
     # Options for the plugin go in cfg['option']
-    cfg = astra.astra_dict('SIRT-PLUGIN')
+    cfg = astra.astra_dict('LANDWEBER-PLUGIN')
     cfg['ProjectorId'] = proj_id
     cfg['ProjectionDataId'] = sid
     cfg['ReconstructionDataId'] = vid
     cfg['option'] = {}
-    cfg['option']['rel_factor'] = 1.5
+    cfg['option']['Relaxation'] = 1.5
     alg_id_rel = astra.algorithm.create(cfg)
     astra.algorithm.run(alg_id_rel, 100)
     rec_rel = astra.data2d.get(vid)
 
     # We can also use OpTomo to call the plugin
-    rec_op = W.reconstruct('SIRT-PLUGIN', sinogram, 100, extraOptions={'rel_factor':1.5})
+    rec_op = W.reconstruct('LANDWEBER-PLUGIN', sinogram, 100, extraOptions={'Relaxation':1.5})
 
     import pylab as pl
     pl.gray()
-- 
cgit v1.2.3