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/data3d_c.pyx | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) (limited to 'python/astra/data3d_c.pyx') 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" (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 = 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 = 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 = 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 = new CFloat32ProjectionData3DMemory(pppGeometry) @@ -112,6 +108,19 @@ def create(datatype,geometry,data=None): return man3d.store(pDataObject3D) +def get_geometry(i): + cdef CFloat32Data3DMemory * pDataObject = dynamic_cast_mem(getObject(i)) + cdef CFloat32ProjectionData3DMemory * pDataObject2 + cdef CFloat32VolumeData3DMemory * pDataObject3 + if pDataObject.getType() == THREEPROJECTION: + pDataObject2 = pDataObject + geom = utils.configToDict(pDataObject2.getGeometry().getConfiguration()) + elif pDataObject.getType() == THREEVOLUME: + pDataObject3 = 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: -- cgit v1.2.3