summaryrefslogtreecommitdiffstats
path: root/Wrappers/Python
diff options
context:
space:
mode:
authorEdoardo Pasca <edo.paskino@gmail.com>2018-04-03 15:45:25 +0100
committerEdoardo Pasca <edo.paskino@gmail.com>2018-04-03 15:45:25 +0100
commitbf2da3ac3484a671815e95d7f4d622586301ba7d (patch)
tree786a7a84da36f4c514c36386ce771cd0303424f0 /Wrappers/Python
parent2aa72d55525739d3a25a2477443eabb1e6b7a7c0 (diff)
downloadastra-wrapper-bf2da3ac3484a671815e95d7f4d622586301ba7d.tar.gz
astra-wrapper-bf2da3ac3484a671815e95d7f4d622586301ba7d.tar.bz2
astra-wrapper-bf2da3ac3484a671815e95d7f4d622586301ba7d.tar.xz
astra-wrapper-bf2da3ac3484a671815e95d7f4d622586301ba7d.zip
removed duplicated files
Diffstat (limited to 'Wrappers/Python')
-rw-r--r--Wrappers/Python/ccpi/astra/astra_ops.py132
-rw-r--r--Wrappers/Python/ccpi/astra/astra_processors.py205
2 files changed, 0 insertions, 337 deletions
diff --git a/Wrappers/Python/ccpi/astra/astra_ops.py b/Wrappers/Python/ccpi/astra/astra_ops.py
deleted file mode 100644
index cd0ef9e..0000000
--- a/Wrappers/Python/ccpi/astra/astra_ops.py
+++ /dev/null
@@ -1,132 +0,0 @@
-# -*- coding: utf-8 -*-
-# This work is independent part of the Core Imaging Library developed by
-# Visual Analytics and Imaging System Group of the Science Technology
-# Facilities Council, STFC
-# This program 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.
-#
-# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
-
-from ccpi.optimisation.ops import Operator
-import numpy
-import astra
-from ccpi.framework import AcquisitionData, ImageData, DataContainer
-from ccpi.optimisation.ops import PowerMethodNonsquare
-from ccpi.astra.processors import AstraForwardProjector, AstraBackProjector, \
- AstraForwardProjectorMC, AstraBackProjectorMC
-
-class AstraProjectorSimple(Operator):
- """ASTRA projector modified to use DataSet and geometry."""
- def __init__(self, geomv, geomp, device):
- super(AstraProjectorSimple, self).__init__()
-
- # Store volume and sinogram geometries.
- self.sinogram_geometry = geomp
- self.volume_geometry = geomv
-
- self.fp = AstraForwardProjector(volume_geometry=geomv,
- sinogram_geometry=geomp,
- proj_id=None,
- device=device)
-
- self.bp = AstraBackProjector(volume_geometry=geomv,
- sinogram_geometry=geomp,
- proj_id=None,
- device=device)
-
- # Initialise empty for singular value.
- self.s1 = None
-
- def direct(self, IM):
- self.fp.set_input(IM)
- out = self.fp.get_output()
- return out
-
- def adjoint(self, DATA):
- self.bp.set_input(DATA)
- out = self.bp.get_output()
- return out
-
- #def delete(self):
- # astra.data2d.delete(self.proj_id)
-
- def get_max_sing_val(self):
- self.s1, sall, svec = PowerMethodNonsquare(self,10)
- return self.s1
-
- def size(self):
- # Only implemented for 2D
- return ( (self.sinogram_geometry.angles.size, \
- self.sinogram_geometry.pixel_num_h), \
- (self.volume_geometry.voxel_num_x, \
- self.volume_geometry.voxel_num_y) )
-
- def create_image_data(self):
- inputsize = self.size()[1]
- return DataContainer(numpy.random.randn(inputsize[0],
- inputsize[1]))
-
-
-class AstraProjectorMC(Operator):
- """ASTRA Multichannel projector"""
- def __init__(self, geomv, geomp, device):
- super(AstraProjectorMC, self).__init__()
-
- # Store volume and sinogram geometries.
- self.sinogram_geometry = geomp
- self.volume_geometry = geomv
-
- self.fp = AstraForwardProjectorMC(volume_geometry=geomv,
- sinogram_geometry=geomp,
- proj_id=None,
- device=device)
-
- self.bp = AstraBackProjectorMC(volume_geometry=geomv,
- sinogram_geometry=geomp,
- proj_id=None,
- device=device)
-
- # Initialise empty for singular value.
- self.s1 = None
-
- def direct(self, IM):
- self.fp.set_input(IM)
- out = self.fp.get_output()
- return out
-
- def adjoint(self, DATA):
- self.bp.set_input(DATA)
- out = self.bp.get_output()
- return out
-
- #def delete(self):
- # astra.data2d.delete(self.proj_id)
-
- def get_max_sing_val(self):
- if self.s1 is None:
- self.s1, sall, svec = PowerMethodNonsquare(self,10)
- return self.s1
- else:
- return self.s1
-
- def size(self):
- # Only implemented for 2D
- return ( (self.sinogram_geometry.angles.size, \
- self.sinogram_geometry.pixel_num_h), \
- (self.volume_geometry.voxel_num_x, \
- self.volume_geometry.voxel_num_y) )
-
- def create_image_data(self):
- inputsize = self.size()[1]
- return DataContainer(numpy.random.randn(self.volume_geometry.channels,
- inputsize[0],
- inputsize[1]))
-
diff --git a/Wrappers/Python/ccpi/astra/astra_processors.py b/Wrappers/Python/ccpi/astra/astra_processors.py
deleted file mode 100644
index 16c1f78..0000000
--- a/Wrappers/Python/ccpi/astra/astra_processors.py
+++ /dev/null
@@ -1,205 +0,0 @@
-from ccpi.framework import DataSetProcessor, ImageData, AcquisitionData
-from ccpi.astra.utils import convert_geometry_to_astra
-import astra
-
-
-class AstraForwardProjector(DataSetProcessor):
- '''AstraForwardProjector
-
- Forward project ImageData to AcquisitionData using ASTRA proj_id.
-
- Input: ImageData
- Parameter: proj_id
- Output: AcquisitionData
- '''
-
- def __init__(self,
- volume_geometry=None,
- sinogram_geometry=None,
- proj_id=None,
- device='cpu'):
- kwargs = {
- 'volume_geometry' : volume_geometry,
- 'sinogram_geometry' : sinogram_geometry,
- 'proj_id' : proj_id,
- 'device' : device
- }
-
- #DataSetProcessor.__init__(self, **kwargs)
- super(AstraForwardProjector, self).__init__(**kwargs)
-
- self.set_ImageGeometry(volume_geometry)
- self.set_AcquisitionGeometry(sinogram_geometry)
-
- # Set up ASTRA Volume and projection geometry, not to be stored in self
- vol_geom, proj_geom = convert_geometry_to_astra(self.volume_geometry,
- self.sinogram_geometry)
-
- # ASTRA projector, to be stored
- if device == 'cpu':
- # Note that 'line' only one option
- if self.sinogram_geometry.geom_type == 'parallel':
- self.set_projector(astra.create_projector('line', proj_geom, vol_geom) )
- elif self.sinogram_geometry.geom_type == 'cone':
- self.set_projector(astra.create_projector('line_fanflat', proj_geom, vol_geom) )
- else:
- NotImplemented
- elif device == 'gpu':
- self.set_projector(astra.create_projector('cuda', proj_geom, vol_geom) )
- else:
- NotImplemented
-
- def check_input(self, dataset):
- if dataset.number_of_dimensions == 3 or\
- dataset.number_of_dimensions == 2:
- return True
- else:
- raise ValueError("Expected input dimensions is 2 or 3, got {0}"\
- .format(dataset.number_of_dimensions))
-
- def set_projector(self, proj_id):
- self.proj_id = proj_id
-
- def set_ImageGeometry(self, volume_geometry):
- self.volume_geometry = volume_geometry
-
- def set_AcquisitionGeometry(self, sinogram_geometry):
- self.sinogram_geometry = sinogram_geometry
-
- def process(self):
- IM = self.get_input()
- DATA = AcquisitionData(geometry=self.sinogram_geometry)
- #sinogram_id, DATA = astra.create_sino( IM.as_array(),
- # self.proj_id)
- sinogram_id, DATA.array = astra.create_sino(IM.as_array(),
- self.proj_id)
- astra.data2d.delete(sinogram_id)
- #return AcquisitionData(array=DATA, geometry=self.sinogram_geometry)
- return DATA
-
-class AstraBackProjector(DataSetProcessor):
- '''AstraBackProjector
-
- Back project AcquisitionData to ImageData using ASTRA proj_id.
-
- Input: AcquisitionData
- Parameter: proj_id
- Output: ImageData
- '''
-
- def __init__(self,
- volume_geometry=None,
- sinogram_geometry=None,
- proj_id=None,
- device='cpu'):
- kwargs = {
- 'volume_geometry' : volume_geometry,
- 'sinogram_geometry' : sinogram_geometry,
- 'proj_id' : proj_id,
- 'device' : device
- }
-
- #DataSetProcessor.__init__(self, **kwargs)
- super(AstraBackProjector, self).__init__(**kwargs)
-
- self.set_ImageGeometry(volume_geometry)
- self.set_AcquisitionGeometry(sinogram_geometry)
-
- # Set up ASTRA Volume and projection geometry, not to be stored in self
- vol_geom, proj_geom = convert_geometry_to_astra(self.volume_geometry,
- self.sinogram_geometry)
-
- # ASTRA projector, to be stored
- if device == 'cpu':
- # Note that 'line' only one option
- if self.sinogram_geometry.geom_type == 'parallel':
- self.set_projector(astra.create_projector('line', proj_geom, vol_geom) )
- elif self.sinogram_geometry.geom_type == 'cone':
- self.set_projector(astra.create_projector('line_fanflat', proj_geom, vol_geom) )
- else:
- NotImplemented
- elif device == 'gpu':
- self.set_projector(astra.create_projector('cuda', proj_geom, vol_geom) )
- else:
- NotImplemented
-
- def check_input(self, dataset):
- if dataset.number_of_dimensions == 3 or dataset.number_of_dimensions == 2:
- return True
- else:
- raise ValueError("Expected input dimensions is 2 or 3, got {0}"\
- .format(dataset.number_of_dimensions))
-
- def set_projector(self, proj_id):
- self.proj_id = proj_id
-
- def set_ImageGeometry(self, volume_geometry):
- self.volume_geometry = volume_geometry
-
- def set_AcquisitionGeometry(self, sinogram_geometry):
- self.sinogram_geometry = sinogram_geometry
-
- def process(self):
- DATA = self.get_input()
- IM = ImageData(geometry=self.volume_geometry)
- rec_id, IM.array = astra.create_backprojection(DATA.as_array(),
- self.proj_id)
- astra.data2d.delete(rec_id)
- return IM
-
-class AstraForwardProjectorMC(AstraForwardProjector):
- '''AstraForwardProjector Multi channel
-
- Forward project ImageData to AcquisitionDataSet using ASTRA proj_id.
-
- Input: ImageDataSet
- Parameter: proj_id
- Output: AcquisitionData
- '''
- def check_input(self, dataset):
- if dataset.number_of_dimensions == 2 or \
- dataset.number_of_dimensions == 3 or \
- dataset.number_of_dimensions == 4:
- return True
- else:
- raise ValueError("Expected input dimensions is 2 or 3, got {0}"\
- .format(dataset.number_of_dimensions))
- def process(self):
- IM = self.get_input()
- #create the output AcquisitionData
- DATA = AcquisitionData(geometry=self.sinogram_geometry)
-
- for k in range(DATA.geometry.channels):
- sinogram_id, DATA.as_array()[k] = astra.create_sino(IM.as_array()[k],
- self.proj_id)
- astra.data2d.delete(sinogram_id)
- return DATA
-
-class AstraBackProjectorMC(AstraBackProjector):
- '''AstraBackProjector Multi channel
-
- Back project AcquisitionData to ImageData using ASTRA proj_id.
-
- Input: AcquisitionData
- Parameter: proj_id
- Output: ImageData
- '''
- def check_input(self, dataset):
- if dataset.number_of_dimensions == 2 or \
- dataset.number_of_dimensions == 3 or \
- dataset.number_of_dimensions == 4:
- return True
- else:
- raise ValueError("Expected input dimensions is 2 or 3, got {0}"\
- .format(dataset.number_of_dimensions))
- def process(self):
- DATA = self.get_input()
-
- IM = ImageData(geometry=self.volume_geometry)
-
- for k in range(IM.geometry.channels):
- rec_id, IM.as_array()[k] = astra.create_backprojection(
- DATA.as_array()[k],
- self.proj_id)
- astra.data2d.delete(rec_id)
- return IM \ No newline at end of file