From 46eb9cce2bc172514096c761cd50b0fc74e6c8e6 Mon Sep 17 00:00:00 2001 From: "Daniel M. Pelt" Date: Mon, 2 Mar 2015 17:22:42 +0100 Subject: Make Python get_geometry code match Matlab (after 03a9dd972ada50eedb83386910cecf02fe8d0e35) --- python/astra/data2d_c.pyx | 60 ++++++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 34 deletions(-) (limited to 'python/astra/data2d_c.pyx') 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 = 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 = 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 = new CSparseMatrixProjectionGeometry2D() @@ -92,13 +87,13 @@ def create(datatype, geometry, data=None): ppGeometry = new CFanFlatVecProjectionGeometry2D() else: ppGeometry = 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 = 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 = pDataObject - geom = utils.createProjectionGeometryStruct(pDataObject2.getGeometry()) - elif pDataObject.getType() == VOLUME: + geom = utils.configToDict(pDataObject2.getGeometry().getConfiguration()) + elif pDataObject.getType() == TWOVOLUME: pDataObject3 = 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 = 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 = new CSparseMatrixProjectionGeometry2D() @@ -183,34 +176,33 @@ def change_geometry(i, geom): ppGeometry = new CFanFlatVecProjectionGeometry2D() else: ppGeometry = 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 = 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") -- cgit v1.2.3