summaryrefslogtreecommitdiffstats
path: root/Wrappers/Python
diff options
context:
space:
mode:
authorEdoardo Pasca <edo.paskino@gmail.com>2018-03-08 11:13:54 +0000
committerEdoardo Pasca <edo.paskino@gmail.com>2018-03-08 11:13:54 +0000
commit997e2b22710cba68be023a8d85c0f844710c7e9b (patch)
treebc66e50996d85bed606b2c737e15c1310f2f6fd9 /Wrappers/Python
parent87b2b8a08034eccd676cd49430220cf511f1f8b1 (diff)
downloadframework-997e2b22710cba68be023a8d85c0f844710c7e9b.tar.gz
framework-997e2b22710cba68be023a8d85c0f844710c7e9b.tar.bz2
framework-997e2b22710cba68be023a8d85c0f844710c7e9b.tar.xz
framework-997e2b22710cba68be023a8d85c0f844710c7e9b.zip
SinogramData and VolumeData use geometry for initialization
One can now pass the sinogram geometry or volume geometry to initialize the SinogramData or VolumeData. It handles multichannel data.
Diffstat (limited to 'Wrappers/Python')
-rw-r--r--Wrappers/Python/ccpi/framework.py200
1 files changed, 148 insertions, 52 deletions
diff --git a/Wrappers/Python/ccpi/framework.py b/Wrappers/Python/ccpi/framework.py
index 82ad65c..7324a5c 100644
--- a/Wrappers/Python/ccpi/framework.py
+++ b/Wrappers/Python/ccpi/framework.py
@@ -23,6 +23,7 @@ import numpy
import sys
from datetime import timedelta, datetime
import warnings
+from ccpi.reconstruction import geoms
if sys.version_info[0] >= 3 and sys.version_info[1] >= 4:
ABC = abc.ABC
@@ -119,7 +120,7 @@ class DataSet(object):
if deep_copy:
self.array = array[:]
else:
- self.array = array
+ self.array = array
else:
raise TypeError('Array must be NumpyArray, passed {0}'\
.format(type(array)))
@@ -430,40 +431,81 @@ class DataSet(object):
class VolumeData(DataSet):
'''DataSet for holding 2D or 3D dataset'''
def __init__(self,
- array,
+ array = None,
deep_copy=True,
dimension_labels=None,
**kwargs):
- if type(array) == DataSet:
- # if the array is a DataSet get the info from there
- #if not ( array.number_of_dimensions == 2 or \
- # array.number_of_dimensions == 3 ):
- # raise ValueError('Number of dimensions are not 2 or 3: {0}'\
- # .format(array.number_of_dimensions))
-
- #DataSet.__init__(self, array.as_array(), deep_copy,
- # array.dimension_labels, **kwargs)
- super(VolumeData, self).__init__(array.as_array(), deep_copy,
- array.dimension_labels, **kwargs)
- elif type(array) == numpy.ndarray:
- #if not ( array.ndim == 3 or array.ndim == 2 ):
- # raise ValueError(
- # 'Number of dimensions are not 3 or 2 : {0}'\
- # .format(array.ndim))
+ self.geometry = None
+ if array is None:
+ if 'geometry' in kwargs.keys():
+ geometry = kwargs['geometry']
+ self.geometry = geometry
+ channels = geometry.channels
+ horiz_x = geometry.voxel_num_x
+ horiz_y = geometry.voxel_num_y
+ vert = 1 if geometry.voxel_num_z is None\
+ else geometry.voxel_num_z # this should be 1 for 2D
- if dimension_labels is None:
- if array.ndim == 3:
- dimension_labels = ['horizontal_x' ,
- 'horizontal_y' ,
- 'vertical']
+ if channels > 1:
+ if vert > 1:
+ shape = (channels, vert, horiz_y, horiz_x)
+ dim_labels = ['channel' ,'vertical' , 'horizontal_y' ,
+ 'horizontal_x']
+ else:
+ shape = (channels , horiz_y, horiz_x)
+ dim_labels = ['channel' , 'horizontal_y' ,
+ 'horizontal_x']
else:
- dimension_labels = ['horizontal' ,
- 'vertical']
-
- #DataSet.__init__(self, array, deep_copy, dimension_labels, **kwargs)
- super(VolumeData, self).__init__(array, deep_copy,
- dimension_labels, **kwargs)
+ if vert > 1:
+ shape = (vert, horiz_y, horiz_x)
+ dim_labels = ['vertical' , 'horizontal_y' ,
+ 'horizontal_x']
+ else:
+ shape = (horiz_y, horiz_x)
+ dim_labels = ['horizontal_y' ,
+ 'horizontal_x']
+
+ array = numpy.zeros( shape , dtype=numpy.float32)
+ super(VolumeData, self).__init__(array, deep_copy,
+ dim_labels, **kwargs)
+
+ else:
+ raise ValueError('Please pass either a DataSet, ' +\
+ 'a numpy array or a geometry')
+ else:
+ if type(array) == DataSet:
+ # if the array is a DataSet get the info from there
+ if not ( array.number_of_dimensions == 2 or \
+ array.number_of_dimensions == 3 or \
+ array.number_of_dimensions == 4):
+ raise ValueError('Number of dimensions are not 2 or 3 or 4: {0}'\
+ .format(array.number_of_dimensions))
+
+ #DataSet.__init__(self, array.as_array(), deep_copy,
+ # array.dimension_labels, **kwargs)
+ super(VolumeData, self).__init__(array.as_array(), deep_copy,
+ array.dimension_labels, **kwargs)
+ elif type(array) == numpy.ndarray:
+ if not ( array.ndim == 2 or array.ndim == 3 or array.ndim == 4 ):
+ raise ValueError(
+ 'Number of dimensions are not 2 or 3 or 4 : {0}'\
+ .format(array.ndim))
+
+ if dimension_labels is None:
+ if array.ndim == 4:
+ dimension_labels = ['channel' ,'vertical' , 'horizontal_y' ,
+ 'horizontal_x']
+ elif array.ndim == 3:
+ dimension_labels = ['vertical' , 'horizontal_y' ,
+ 'horizontal_x']
+ else:
+ dimension_labels = ['horizontal_y' ,
+ 'horizontal_x']
+
+ #DataSet.__init__(self, array, deep_copy, dimension_labels, **kwargs)
+ super(VolumeData, self).__init__(array, deep_copy,
+ dimension_labels, **kwargs)
# load metadata from kwargs if present
for key, value in kwargs.items():
@@ -478,34 +520,79 @@ class VolumeData(DataSet):
class SinogramData(DataSet):
'''DataSet for holding 2D or 3D sinogram'''
def __init__(self,
- array,
+ array = None,
deep_copy=True,
dimension_labels=None,
**kwargs):
-
- if type(array) == DataSet:
- # if the array is a DataSet get the info from there
- #if not ( array.number_of_dimensions == 2 or \
- # array.number_of_dimensions == 3 ):
- # raise ValueError('Number of dimensions are not 2 or 3: {0}'\
- # .format(array.number_of_dimensions))
-
- DataSet.__init__(self, array.as_array(), deep_copy,
- array.dimension_labels, **kwargs)
- elif type(array) == numpy.ndarray:
- #if not ( array.ndim == 3 or array.ndim == 2 ):
- # raise ValueError('Number of dimensions are != 3: {0}'\
- # .format(array.ndim))
- if dimension_labels is None:
- if array.ndim == 3:
- dimension_labels = ['angle' ,
- 'horizontal' ,
- 'vertical']
+ self.geometry = None
+ if array is None:
+ if 'geometry' in kwargs.keys():
+ geometry = kwargs['geometry']
+ self.geometry = geometry
+ channels = geometry.channels
+ horiz = geometry.pixel_num_h
+ vert = geometry.pixel_num_v
+ angles = geometry.angles
+ num_of_angles = numpy.shape(angles)[0]
+
+
+ if channels > 1:
+ if vert > 1:
+ shape = (channels, num_of_angles , vert, horiz)
+ dim_labels = ['channel' , ' angle' ,
+ 'vertical' , 'horizontal']
+ else:
+ shape = (channels , num_of_angles, horiz)
+ dim_labels = ['angle' , 'angle' ,
+ 'horizontal']
else:
- dimension_labels = ['angle' ,
- 'horizontal']
- DataSet.__init__(self, array, deep_copy, dimension_labels, **kwargs)
+ if vert > 1:
+ shape = (num_of_angles, vert, horiz)
+ dim_labels = ['angles' , 'vertical' ,
+ 'horizontal']
+ else:
+ shape = (num_of_angles, horiz)
+ dim_labels = ['angles' ,
+ 'horizontal']
+
+ array = numpy.zeros( shape , dtype=numpy.float32)
+ super(SinogramData, self).__init__(array, deep_copy,
+ dim_labels, **kwargs)
+ else:
+ if type(array) == DataSet:
+ # if the array is a DataSet get the info from there
+ if not ( array.number_of_dimensions == 2 or \
+ array.number_of_dimensions == 3 or \
+ array.number_of_dimensions == 4):
+ raise ValueError('Number of dimensions are not 2 or 3 or 4: {0}'\
+ .format(array.number_of_dimensions))
+
+ #DataSet.__init__(self, array.as_array(), deep_copy,
+ # array.dimension_labels, **kwargs)
+ super(SinogramData, self).__init__(array.as_array(), deep_copy,
+ array.dimension_labels, **kwargs)
+ elif type(array) == numpy.ndarray:
+ if not ( array.ndim == 2 or array.ndim == 3 or array.ndim == 4 ):
+ raise ValueError(
+ 'Number of dimensions are not 2 or 3 or 4 : {0}'\
+ .format(array.ndim))
+
+ if dimension_labels is None:
+ if array.ndim == 4:
+ dimension_labels = ['channel' ,'angle' , 'vertical' ,
+ 'horizontal']
+ elif array.ndim == 3:
+ dimension_labels = ['angle' , 'vertical' ,
+ 'horizontal']
+ else:
+ dimension_labels = ['angle' ,
+ 'horizontal']
+
+ #DataSet.__init__(self, array, deep_copy, dimension_labels, **kwargs)
+ super(SinogramData, self).__init__(array, deep_copy,
+ dimension_labels, **kwargs)
+
class DataSetProcessor(object):
'''Defines a generic DataSet processor
@@ -799,4 +886,13 @@ if __name__ == '__main__':
b1 = ds.subset( subset , Z=1)
print ("shape b 2,3? {0}".format(numpy.shape(b1.as_array())))
+
+ # create VolumeData from geometry
+ vgeometry = geoms.VolumeGeometry(voxel_num_x=2, voxel_num_y=3, channels=2)
+ vol = VolumeData(geometry=vgeometry)
+
+ sgeometry = geoms.SinogramGeometry(dimension=2, angles=10,
+ geom_type='parallel', pixel_num_v=3,
+ pixel_num_h=5 , channels=2)
+ sino = SinogramData(geometry=sgeometry)
\ No newline at end of file