summaryrefslogtreecommitdiffstats
path: root/python/astra
diff options
context:
space:
mode:
authorDaniel M. Pelt <D.M.Pelt@cwi.nl>2015-03-02 17:22:42 +0100
committerDaniel M. Pelt <D.M.Pelt@cwi.nl>2015-03-03 12:11:51 +0100
commit46eb9cce2bc172514096c761cd50b0fc74e6c8e6 (patch)
treeea54ff6dc4b1c8bb759fee58181904b81c1054e2 /python/astra
parente468c6c546dbb4d9665ccb95b1571a160753d50e (diff)
downloadastra-46eb9cce2bc172514096c761cd50b0fc74e6c8e6.tar.gz
astra-46eb9cce2bc172514096c761cd50b0fc74e6c8e6.tar.bz2
astra-46eb9cce2bc172514096c761cd50b0fc74e6c8e6.tar.xz
astra-46eb9cce2bc172514096c761cd50b0fc74e6c8e6.zip
Make Python get_geometry code match Matlab (after 03a9dd972ada50eedb83386910cecf02fe8d0e35)
Diffstat (limited to 'python/astra')
-rw-r--r--python/astra/PyIncludes.pxd41
-rw-r--r--python/astra/algorithm_c.pyx12
-rw-r--r--python/astra/data2d_c.pyx60
-rw-r--r--python/astra/data3d.py38
-rw-r--r--python/astra/data3d_c.pyx41
-rw-r--r--python/astra/projector_c.pyx14
-rw-r--r--python/astra/utils.pxd6
-rw-r--r--python/astra/utils.pyx156
8 files changed, 181 insertions, 187 deletions
diff --git a/python/astra/PyIncludes.pxd b/python/astra/PyIncludes.pxd
index fc5980f..434546a 100644
--- a/python/astra/PyIncludes.pxd
+++ b/python/astra/PyIncludes.pxd
@@ -40,6 +40,7 @@ cdef extern from "astra/Globals.h" namespace "astra":
cdef extern from "astra/Config.h" namespace "astra":
cdef cppclass Config:
Config()
+ void initialize(string rootname)
XMLNode *self
cdef extern from "astra/VolumeGeometry2D.h" namespace "astra":
@@ -58,6 +59,7 @@ cdef extern from "astra/VolumeGeometry2D.h" namespace "astra":
float32 getWindowMinY()
float32 getWindowMaxX()
float32 getWindowMaxY()
+ Config* getConfiguration()
cdef extern from "astra/Float32VolumeData2D.h" namespace "astra":
@@ -67,6 +69,7 @@ cdef extern from "astra/Float32VolumeData2D.h" namespace "astra":
int getWidth()
int getHeight()
void changeGeometry(CVolumeGeometry2D*)
+ Config* getConfiguration()
@@ -79,10 +82,18 @@ cdef extern from "astra/ProjectionGeometry2D.h" namespace "astra":
bool isOfType(string)
float32 getProjectionAngle(int)
float32 getDetectorWidth()
+ Config* getConfiguration()
cdef extern from "astra/Float32Data2D.h" namespace "astra::CFloat32Data2D":
- cdef enum EDataType:
- BASE,PROJECTION,VOLUME
+ cdef enum TWOEDataType "astra::CFloat32Data2D::EDataType":
+ TWOPROJECTION "astra::CFloat32Data2D::PROJECTION"
+ TWOVOLUME "astra::CFloat32Data2D::VOLUME"
+
+cdef extern from "astra/Float32Data3D.h" namespace "astra::CFloat32Data3D":
+ cdef enum THREEEDataType "astra::CFloat32Data3D::EDataType":
+ THREEPROJECTION "astra::CFloat32Data3D::PROJECTION"
+ THREEVOLUME "astra::CFloat32Data3D::VOLUME"
+
cdef extern from "astra/Float32Data2D.h" namespace "astra":
cdef cppclass CFloat32Data2D:
@@ -92,7 +103,7 @@ cdef extern from "astra/Float32Data2D.h" namespace "astra":
float32 **getData2D()
int getWidth()
int getHeight()
- EDataType getType()
+ TWOEDataType getType()
@@ -104,7 +115,7 @@ cdef extern from "astra/SparseMatrixProjectionGeometry2D.h" namespace "astra":
cdef extern from "astra/FanFlatProjectionGeometry2D.h" namespace "astra":
cdef cppclass CFanFlatProjectionGeometry2D:
CFanFlatProjectionGeometry2D()
-
+
cdef extern from "astra/FanFlatVecProjectionGeometry2D.h" namespace "astra":
cdef cppclass CFanFlatVecProjectionGeometry2D:
CFanFlatVecProjectionGeometry2D()
@@ -149,8 +160,8 @@ cdef extern from "astra/SparseMatrix.h" namespace "astra":
float32* m_pfValues
unsigned int* m_piColIndices
unsigned long* m_plRowStarts
-
-cdef extern from "astra/Float32Data3DMemory.h" namespace "astra":
+
+cdef extern from "astra/Float32Data3DMemory.h" namespace "astra":
cdef cppclass CFloat32Data3DMemory:
CFloat32Data3DMemory()
bool isInitialized()
@@ -161,22 +172,26 @@ cdef extern from "astra/Float32Data3DMemory.h" namespace "astra":
void updateStatistics()
float32 *getData()
float32 ***getData3D()
+ THREEEDataType getType()
cdef extern from "astra/VolumeGeometry3D.h" namespace "astra":
cdef cppclass CVolumeGeometry3D:
CVolumeGeometry3D()
bool initialize(Config)
+ Config * getConfiguration()
cdef extern from "astra/ProjectionGeometry3D.h" namespace "astra":
cdef cppclass CProjectionGeometry3D:
CProjectionGeometry3D()
bool initialize(Config)
-
-
+ Config * getConfiguration()
+
+
cdef extern from "astra/Float32VolumeData3DMemory.h" namespace "astra":
cdef cppclass CFloat32VolumeData3DMemory:
CFloat32VolumeData3DMemory(CVolumeGeometry3D*)
+ CVolumeGeometry3D* getGeometry()
cdef extern from "astra/ParallelProjectionGeometry3D.h" namespace "astra":
@@ -191,7 +206,7 @@ cdef extern from "astra/ConeProjectionGeometry3D.h" namespace "astra":
cdef cppclass CConeProjectionGeometry3D:
CConeProjectionGeometry3D()
bool initialize(Config)
-
+
cdef extern from "astra/ConeVecProjectionGeometry3D.h" namespace "astra":
cdef cppclass CConeVecProjectionGeometry3D:
CConeVecProjectionGeometry3D()
@@ -199,9 +214,10 @@ cdef extern from "astra/ConeVecProjectionGeometry3D.h" namespace "astra":
cdef extern from "astra/Float32ProjectionData3DMemory.h" namespace "astra":
cdef cppclass CFloat32ProjectionData3DMemory:
CFloat32ProjectionData3DMemory(CProjectionGeometry3D*)
- CFloat32ProjectionData3DMemory(CConeProjectionGeometry3D*)
+ CFloat32ProjectionData3DMemory(CConeProjectionGeometry3D*)
+ CProjectionGeometry3D* getGeometry()
-cdef extern from "astra/Float32Data3D.h" namespace "astra":
+cdef extern from "astra/Float32Data3D.h" namespace "astra":
cdef cppclass CFloat32Data3D:
CFloat32Data3D()
bool isInitialized()
@@ -210,6 +226,3 @@ cdef extern from "astra/Float32Data3D.h" namespace "astra":
int getHeight()
int getDepth()
void updateStatistics()
-
-
-
diff --git a/python/astra/algorithm_c.pyx b/python/astra/algorithm_c.pyx
index 0c2999c..966d3d7 100644
--- a/python/astra/algorithm_c.pyx
+++ b/python/astra/algorithm_c.pyx
@@ -49,19 +49,17 @@ cdef extern from *:
def create(config):
- cdef XMLDocument * xml = utils.dict2XML(six.b('Algorithm'), config)
- cdef Config cfg
+ cdef Config * cfg = utils.dictToConfig(six.b('Algorithm'), config)
cdef CAlgorithm * alg
- cfg.self = xml.getRootNode()
alg = PyAlgorithmFactory.getSingletonPtr().create(cfg.self.getAttribute(six.b('type')))
if alg == NULL:
- del xml
+ del cfg
raise Exception("Unknown algorithm.")
- if not alg.initialize(cfg):
- del xml
+ if not alg.initialize(cfg[0]):
+ del cfg
del alg
raise Exception("Algorithm not initialized.")
- del xml
+ del cfg
return manAlg.store(alg)
cdef CAlgorithm * getAlg(i) except NULL:
diff --git a/python/astra/data2d_c.pyx b/python/astra/data2d_c.pyx
index ec1b478..b9c105e 100644
--- a/python/astra/data2d_c.pyx
+++ b/python/astra/data2d_c.pyx
@@ -47,10 +47,8 @@ from .PyIncludes cimport *
cimport utils
from .utils import wrap_from_bytes
-
cdef CData2DManager * man2d = <CData2DManager * >PyData2DManager.getSingletonPtr()
-
def clear():
man2d.clear()
@@ -64,25 +62,22 @@ def delete(ids):
def create(datatype, geometry, data=None):
- cdef XMLDocument * xml
- cdef Config cfg
+ cdef Config *cfg
cdef CVolumeGeometry2D * pGeometry
cdef CProjectionGeometry2D * ppGeometry
cdef CFloat32Data2D * pDataObject2D
if datatype == '-vol':
- xml = utils.dict2XML(six.b('VolumeGeometry'), geometry)
- cfg.self = xml.getRootNode()
+ cfg = utils.dictToConfig(six.b('VolumeGeometry'), geometry)
pGeometry = new CVolumeGeometry2D()
- if not pGeometry.initialize(cfg):
- del xml
+ if not pGeometry.initialize(cfg[0]):
+ del cfg
del pGeometry
raise Exception('Geometry class not initialized.')
pDataObject2D = <CFloat32Data2D * > new CFloat32VolumeData2D(pGeometry)
- del xml
+ del cfg
del pGeometry
elif datatype == '-sino':
- xml = utils.dict2XML(six.b('ProjectionGeometry'), geometry)
- cfg.self = xml.getRootNode()
+ cfg = utils.dictToConfig(six.b('ProjectionGeometry'), geometry)
tpe = wrap_from_bytes(cfg.self.getAttribute(six.b('type')))
if (tpe == 'sparse_matrix'):
ppGeometry = <CProjectionGeometry2D * >new CSparseMatrixProjectionGeometry2D()
@@ -92,13 +87,13 @@ def create(datatype, geometry, data=None):
ppGeometry = <CProjectionGeometry2D * >new CFanFlatVecProjectionGeometry2D()
else:
ppGeometry = <CProjectionGeometry2D * >new CParallelProjectionGeometry2D()
- if not ppGeometry.initialize(cfg):
- del xml
+ if not ppGeometry.initialize(cfg[0]):
+ del cfg
del ppGeometry
raise Exception('Geometry class not initialized.')
pDataObject2D = <CFloat32Data2D * > new CFloat32ProjectionData2D(ppGeometry)
del ppGeometry
- del xml
+ del cfg
else:
raise Exception("Invalid datatype. Please specify '-vol' or '-sino'.")
@@ -151,29 +146,27 @@ def get_geometry(i):
cdef CFloat32Data2D * pDataObject = getObject(i)
cdef CFloat32ProjectionData2D * pDataObject2
cdef CFloat32VolumeData2D * pDataObject3
- if pDataObject.getType() == PROJECTION:
+ if pDataObject.getType() == TWOPROJECTION:
pDataObject2 = <CFloat32ProjectionData2D * >pDataObject
- geom = utils.createProjectionGeometryStruct(pDataObject2.getGeometry())
- elif pDataObject.getType() == VOLUME:
+ geom = utils.configToDict(pDataObject2.getGeometry().getConfiguration())
+ elif pDataObject.getType() == TWOVOLUME:
pDataObject3 = <CFloat32VolumeData2D * >pDataObject
- geom = utils.createVolumeGeometryStruct(pDataObject3.getGeometry())
+ geom = utils.configToDict(pDataObject3.getGeometry().getConfiguration())
else:
raise Exception("Not a known data object")
return geom
def change_geometry(i, geom):
- cdef XMLDocument * xml
- cdef Config cfg
+ cdef Config *cfg
cdef CVolumeGeometry2D * pGeometry
cdef CProjectionGeometry2D * ppGeometry
cdef CFloat32Data2D * pDataObject = getObject(i)
cdef CFloat32ProjectionData2D * pDataObject2
cdef CFloat32VolumeData2D * pDataObject3
- if pDataObject.getType() == PROJECTION:
+ if pDataObject.getType() == TWOPROJECTION:
pDataObject2 = <CFloat32ProjectionData2D * >pDataObject
- xml = utils.dict2XML(six.b('ProjectionGeometry'), geom)
- cfg.self = xml.getRootNode()
+ cfg = utils.dictToConfig(six.b('ProjectionGeometry'), geom)
tpe = wrap_from_bytes(cfg.self.getAttribute(six.b('type')))
if (tpe == 'sparse_matrix'):
ppGeometry = <CProjectionGeometry2D * >new CSparseMatrixProjectionGeometry2D()
@@ -183,34 +176,33 @@ def change_geometry(i, geom):
ppGeometry = <CProjectionGeometry2D * >new CFanFlatVecProjectionGeometry2D()
else:
ppGeometry = <CProjectionGeometry2D * >new CParallelProjectionGeometry2D()
- if not ppGeometry.initialize(cfg):
- del xml
+ if not ppGeometry.initialize(cfg[0]):
+ del cfg
del ppGeometry
raise Exception('Geometry class not initialized.')
if (ppGeometry.getDetectorCount() != pDataObject2.getDetectorCount() or ppGeometry.getProjectionAngleCount() != pDataObject2.getAngleCount()):
del ppGeometry
- del xml
+ del cfg
raise Exception(
"The dimensions of the data do not match those specified in the geometry.")
pDataObject2.changeGeometry(ppGeometry)
del ppGeometry
- del xml
- elif pDataObject.getType() == VOLUME:
+ del cfg
+ elif pDataObject.getType() == TWOVOLUME:
pDataObject3 = <CFloat32VolumeData2D * >pDataObject
- xml = utils.dict2XML(six.b('VolumeGeometry'), geom)
- cfg.self = xml.getRootNode()
+ cfg = utils.dictToConfig(six.b('VolumeGeometry'), geom)
pGeometry = new CVolumeGeometry2D()
- if not pGeometry.initialize(cfg):
- del xml
+ if not pGeometry.initialize(cfg[0]):
+ del cfg
del pGeometry
raise Exception('Geometry class not initialized.')
if (pGeometry.getGridColCount() != pDataObject3.getWidth() or pGeometry.getGridRowCount() != pDataObject3.getHeight()):
- del xml
+ del cfg
del pGeometry
raise Exception(
'The dimensions of the data do not match those specified in the geometry.')
pDataObject3.changeGeometry(pGeometry)
- del xml
+ del cfg
del pGeometry
else:
raise Exception("Not a known data object")
diff --git a/python/astra/data3d.py b/python/astra/data3d.py
index 33bde51..a2e9201 100644
--- a/python/astra/data3d.py
+++ b/python/astra/data3d.py
@@ -27,7 +27,7 @@ from . import data3d_c as d
def create(datatype,geometry,data=None):
"""Create a 3D object.
-
+
:param datatype: Data object type, '-vol' or '-sino'.
:type datatype: :class:`string`
:param geometry: Volume or projection geometry.
@@ -35,67 +35,77 @@ def create(datatype,geometry,data=None):
:param data: Data to fill the constructed object with, either a scalar or array.
:type data: :class:`float` or :class:`numpy.ndarray`
:returns: :class:`int` -- the ID of the constructed object.
-
+
"""
return d.create(datatype,geometry,data)
def get(i):
"""Get a 3D object.
-
+
:param i: ID of object to get.
:type i: :class:`int`
:returns: :class:`numpy.ndarray` -- The object data.
-
+
"""
return d.get(i)
def get_shared(i):
"""Get a 3D object with memory shared between the ASTRA toolbox and numpy array.
-
+
:param i: ID of object to get.
:type i: :class:`int`
:returns: :class:`numpy.ndarray` -- The object data.
-
+
"""
return d.get_shared(i)
def get_single(i):
"""Get a 3D object in single precision.
-
+
:param i: ID of object to get.
:type i: :class:`int`
:returns: :class:`numpy.ndarray` -- The object data.
-
+
"""
return g.get_single(i)
def store(i,data):
"""Fill existing 3D object with data.
-
+
:param i: ID of object to fill.
:type i: :class:`int`
:param data: Data to fill the object with, either a scalar or array.
:type data: :class:`float` or :class:`numpy.ndarray`
-
+
"""
return d.store(i,data)
+def get_geometry(i):
+ """Get the geometry of a 3D object.
+
+ :param i: ID of object.
+ :type i: :class:`int`
+ :returns: :class:`dict` -- The geometry of object with ID ``i``.
+
+ """
+ return d.get_geometry(i)
+
def dimensions(i):
"""Get dimensions of a 3D object.
-
+
:param i: ID of object.
:type i: :class:`int`
:returns: :class:`tuple` -- dimensions of object with ID ``i``.
-
+
"""
return d.dimensions(i)
def delete(ids):
"""Delete a 2D object.
-
+
:param ids: ID or list of ID's to delete.
:type ids: :class:`int` or :class:`list`
-
+
"""
return d.delete(ids)
diff --git a/python/astra/data3d_c.pyx b/python/astra/data3d_c.pyx
index f821aaf..4b069f7 100644
--- a/python/astra/data3d_c.pyx
+++ b/python/astra/data3d_c.pyx
@@ -51,26 +51,23 @@ cdef extern from *:
CFloat32Data3DMemory * dynamic_cast_mem "dynamic_cast<astra::CFloat32Data3DMemory*>" (CFloat32Data3D * ) except NULL
def create(datatype,geometry,data=None):
- cdef XMLDocument * xml
- cdef Config cfg
+ cdef Config *cfg
cdef CVolumeGeometry3D * pGeometry
cdef CProjectionGeometry3D * ppGeometry
cdef CFloat32Data3DMemory * pDataObject3D
cdef CConeProjectionGeometry3D* pppGeometry
if datatype == '-vol':
- xml = utils.dict2XML(six.b('VolumeGeometry'), geometry)
- cfg.self = xml.getRootNode()
+ cfg = utils.dictToConfig(six.b('VolumeGeometry'), geometry)
pGeometry = new CVolumeGeometry3D()
- if not pGeometry.initialize(cfg):
- del xml
+ if not pGeometry.initialize(cfg[0]):
+ del cfg
del pGeometry
raise Exception('Geometry class not initialized.')
pDataObject3D = <CFloat32Data3DMemory * > new CFloat32VolumeData3DMemory(pGeometry)
- del xml
+ del cfg
del pGeometry
elif datatype == '-sino' or datatype == '-proj3d':
- xml = utils.dict2XML(six.b('ProjectionGeometry'), geometry)
- cfg.self = xml.getRootNode()
+ cfg = utils.dictToConfig(six.b('ProjectionGeometry'), geometry)
tpe = wrap_from_bytes(cfg.self.getAttribute(six.b('type')))
if (tpe == "parallel3d"):
ppGeometry = <CProjectionGeometry3D*> new CParallelProjectionGeometry3D();
@@ -83,19 +80,18 @@ def create(datatype,geometry,data=None):
else:
raise Exception("Invalid geometry type.")
- if not ppGeometry.initialize(cfg):
- del xml
+ if not ppGeometry.initialize(cfg[0]):
+ del cfg
del ppGeometry
raise Exception('Geometry class not initialized.')
pDataObject3D = <CFloat32Data3DMemory * > new CFloat32ProjectionData3DMemory(ppGeometry)
del ppGeometry
- del xml
+ del cfg
elif datatype == "-sinocone":
- xml = utils.dict2XML(six.b('ProjectionGeometry'), geometry)
- cfg.self = xml.getRootNode()
+ cfg = utils.dictToConfig(six.b('ProjectionGeometry'), geometry)
pppGeometry = new CConeProjectionGeometry3D()
- if not pppGeometry.initialize(cfg):
- del xml
+ if not pppGeometry.initialize(cfg[0]):
+ del cfg
del pppGeometry
raise Exception('Geometry class not initialized.')
pDataObject3D = <CFloat32Data3DMemory * > new CFloat32ProjectionData3DMemory(pppGeometry)
@@ -112,6 +108,19 @@ def create(datatype,geometry,data=None):
return man3d.store(<CFloat32Data3D*>pDataObject3D)
+def get_geometry(i):
+ cdef CFloat32Data3DMemory * pDataObject = dynamic_cast_mem(getObject(i))
+ cdef CFloat32ProjectionData3DMemory * pDataObject2
+ cdef CFloat32VolumeData3DMemory * pDataObject3
+ if pDataObject.getType() == THREEPROJECTION:
+ pDataObject2 = <CFloat32ProjectionData3DMemory * >pDataObject
+ geom = utils.configToDict(pDataObject2.getGeometry().getConfiguration())
+ elif pDataObject.getType() == THREEVOLUME:
+ pDataObject3 = <CFloat32VolumeData3DMemory * >pDataObject
+ geom = utils.configToDict(pDataObject3.getGeometry().getConfiguration())
+ else:
+ raise Exception("Not a known data object")
+ return geom
cdef fillDataObject(CFloat32Data3DMemory * obj, data):
if data is None:
diff --git a/python/astra/projector_c.pyx b/python/astra/projector_c.pyx
index 978ca09..f91a8dd 100644
--- a/python/astra/projector_c.pyx
+++ b/python/astra/projector_c.pyx
@@ -49,15 +49,13 @@ cdef CMatrixManager * manM = <CMatrixManager * >PyMatrixManager.getSingletonPtr(
def create(config):
- cdef XMLDocument * xml = utils.dict2XML(six.b('Projector2D'), config)
- cdef Config cfg
+ cdef Config * cfg = utils.dictToConfig(six.b('Projector2D'), config)
cdef CProjector2D * proj
- cfg.self = xml.getRootNode()
- proj = PyProjector2DFactory.getSingletonPtr().create(cfg)
+ proj = PyProjector2DFactory.getSingletonPtr().create(cfg[0])
if proj == NULL:
- del xml
+ del cfg
raise Exception("Error creating projector.")
- del xml
+ del cfg
return manProj.store(proj)
@@ -87,12 +85,12 @@ cdef CProjector2D * getObject(i) except NULL:
def projection_geometry(i):
cdef CProjector2D * proj = getObject(i)
- return utils.createProjectionGeometryStruct(proj.getProjectionGeometry())
+ return utils.configToDict(proj.getProjectionGeometry().getConfiguration())
def volume_geometry(i):
cdef CProjector2D * proj = getObject(i)
- return utils.createVolumeGeometryStruct(proj.getVolumeGeometry())
+ return utils.configToDict(proj.getVolumeGeometry().getConfiguration())
def weights_single_ray(i, projection_index, detector_index):
diff --git a/python/astra/utils.pxd b/python/astra/utils.pxd
index 55db9d3..ca84836 100644
--- a/python/astra/utils.pxd
+++ b/python/astra/utils.pxd
@@ -31,7 +31,5 @@ from .PyXMLDocument cimport XMLNode
from .PyIncludes cimport *
-cdef XMLDocument *dict2XML(string rootname, dc)
-cdef XML2dict(XMLDocument *)
-cdef createVolumeGeometryStruct(CVolumeGeometry2D* geom)
-cdef createProjectionGeometryStruct(CProjectionGeometry2D* geom)
+cdef configToDict(Config *)
+cdef Config * dictToConfig(string rootname, dc)
diff --git a/python/astra/utils.pyx b/python/astra/utils.pyx
index 53e84a9..0439f1b 100644
--- a/python/astra/utils.pyx
+++ b/python/astra/utils.pyx
@@ -31,7 +31,7 @@ import six
from libcpp.string cimport string
from libcpp.list cimport list
from libcpp.vector cimport vector
-from cython.operator cimport dereference as deref
+from cython.operator cimport dereference as deref, preincrement as inc
from cpython.version cimport PY_MAJOR_VERSION
cimport PyXMLDocument
@@ -40,18 +40,16 @@ from .PyXMLDocument cimport XMLNode
from .PyIncludes cimport *
-cdef XMLDocument * dict2XML(string rootname, dc):
- cdef XMLDocument * doc = PyXMLDocument.createDocument(rootname)
- cdef XMLNode * node = doc.getRootNode()
+cdef Config * dictToConfig(string rootname, dc):
+ cdef Config * cfg = new Config()
+ cfg.initialize(rootname)
try:
- readDict(node, dc)
- except:
- six.print_('Error reading XML')
- del doc
- doc = NULL
- finally:
- del node
- return doc
+ readDict(cfg.self, dc)
+ except Exception as e:
+ del cfg
+ six.print_(e.strerror)
+ return NULL
+ return cfg
def convert_item(item):
if isinstance(item, six.string_types):
@@ -166,95 +164,73 @@ cdef void readOptions(XMLNode * node, dc):
else:
node.addOption(item, wrap_to_bytes(val))
-cdef vectorToNumpy(vector[float32] inp):
- cdef int i
- cdef int sz = inp.size()
- ret = np.empty(sz)
- for i in range(sz):
- ret[i] = inp[i]
- return ret
+cdef configToDict(Config *cfg):
+ return XMLNode2dict(cfg.self)
+
+def castString3(input):
+ return input.decode('utf-8')
+
+def castString2(input):
+ return input
+
+if six.PY3:
+ castString = castString3
+else:
+ castString = castString2
+
+def stringToPythonValue(inputIn):
+ input = castString(inputIn)
+ # matrix
+ if ';' in input:
+ row_strings = input.split(';')
+ col_strings = row_strings[0].split(',')
+ nRows = len(row_strings)
+ nCols = len(col_strings)
+
+ out = np.empty((nRows,nCols))
+ for ridx, row in enumerate(row_strings):
+ col_strings = row.split(',')
+ for cidx, col in enumerate(col_strings):
+ out[ridx,cidx] = float(col)
+ return out
+
+ # vector
+ if ',' in input:
+ items = input.split(',')
+ out = np.empty(len(items))
+ for idx,item in enumerate(items):
+ out[idx] = float(item)
+ return out
+
+ try:
+ # integer
+ return int(input)
+ except ValueError:
+ try:
+ #float
+ return float(input)
+ except ValueError:
+ # string
+ return str(input)
+
cdef XMLNode2dict(XMLNode * node):
cdef XMLNode * subnode
cdef list[XMLNode * ] nodes
cdef list[XMLNode * ].iterator it
dct = {}
+ opts = {}
if node.hasAttribute(six.b('type')):
- dct['type'] = node.getAttribute(six.b('type'))
+ dct['type'] = castString(node.getAttribute(six.b('type')))
nodes = node.getNodes()
it = nodes.begin()
while it != nodes.end():
subnode = deref(it)
- if subnode.hasAttribute(six.b('listsize')):
- dct[subnode.getName(
- )] = vectorToNumpy(subnode.getContentNumericalArray())
+ if castString(subnode.getName())=="Option":
+ opts[castString(subnode.getAttribute('key'))] = stringToPythonValue(subnode.getAttribute('value'))
else:
- dct[subnode.getName()] = subnode.getContent()
+ dct[castString(subnode.getName())] = stringToPythonValue(subnode.getContent())
del subnode
+ inc(it)
+ if len(opts)>0: dct['options'] = opts
return dct
-
-cdef XML2dict(XMLDocument * xml):
- cdef XMLNode * node = xml.getRootNode()
- dct = XMLNode2dict(node)
- del node;
- return dct;
-
-cdef createProjectionGeometryStruct(CProjectionGeometry2D * geom):
- cdef int i
- cdef CFanFlatVecProjectionGeometry2D * fanvecGeom
- # cdef SFanProjection* p
- dct = {}
- dct['DetectorCount'] = geom.getDetectorCount()
- if not geom.isOfType(< string > six.b('fanflat_vec')):
- dct['DetectorWidth'] = geom.getDetectorWidth()
- angles = np.empty(geom.getProjectionAngleCount())
- for i in range(geom.getProjectionAngleCount()):
- angles[i] = geom.getProjectionAngle(i)
- dct['ProjectionAngles'] = angles
- else:
- raise Exception("Not yet implemented")
- # fanvecGeom = <CFanFlatVecProjectionGeometry2D*> geom
- # vecs = np.empty(fanvecGeom.getProjectionAngleCount()*6)
- # iDetCount = pVecGeom.getDetectorCount()
- # for i in range(fanvecGeom.getProjectionAngleCount()):
- # p = &fanvecGeom.getProjectionVectors()[i];
- # out[6*i + 0] = p.fSrcX
- # out[6*i + 1] = p.fSrcY
- # out[6*i + 2] = p.fDetSX + 0.5f*iDetCount*p.fDetUX
- # out[6*i + 3] = p.fDetSY + 0.5f*iDetCount*p.fDetUY
- # out[6*i + 4] = p.fDetUX
- # out[6*i + 5] = p.fDetUY
- # dct['Vectors'] = vecs
- if (geom.isOfType(< string > six.b('parallel'))):
- dct["type"] = "parallel"
- elif (geom.isOfType(< string > six.b('fanflat'))):
- raise Exception("Not yet implemented")
- # astra::CFanFlatProjectionGeometry2D* pFanFlatGeom = dynamic_cast<astra::CFanFlatProjectionGeometry2D*>(_pProjGeom)
- # mGeometryInfo["DistanceOriginSource"] = mxCreateDoubleScalar(pFanFlatGeom->getOriginSourceDistance())
- # mGeometryInfo["DistanceOriginDetector"] =
- # mxCreateDoubleScalar(pFanFlatGeom->getOriginDetectorDistance())
- dct["type"] = "fanflat"
- elif (geom.isOfType(< string > six.b('sparse_matrix'))):
- raise Exception("Not yet implemented")
- # astra::CSparseMatrixProjectionGeometry2D* pSparseMatrixGeom =
- # dynamic_cast<astra::CSparseMatrixProjectionGeometry2D*>(_pProjGeom);
- dct["type"] = "sparse_matrix"
- # dct["MatrixID"] =
- # mxCreateDoubleScalar(CMatrixManager::getSingleton().getIndex(pSparseMatrixGeom->getMatrix()))
- elif(geom.isOfType(< string > six.b('fanflat_vec'))):
- dct["type"] = "fanflat_vec"
- return dct
-
-cdef createVolumeGeometryStruct(CVolumeGeometry2D * geom):
- mGeometryInfo = {}
- mGeometryInfo["GridColCount"] = geom.getGridColCount()
- mGeometryInfo["GridRowCount"] = geom.getGridRowCount()
-
- mGeometryOptions = {}
- mGeometryOptions["WindowMinX"] = geom.getWindowMinX()
- mGeometryOptions["WindowMaxX"] = geom.getWindowMaxX()
- mGeometryOptions["WindowMinY"] = geom.getWindowMinY()
- mGeometryOptions["WindowMaxY"] = geom.getWindowMaxY()
-
- mGeometryInfo["option"] = mGeometryOptions
- return mGeometryInfo