diff options
| author | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2016-10-06 12:30:18 +0200 | 
|---|---|---|
| committer | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2016-10-06 12:30:18 +0200 | 
| commit | 0cec258c5079cc065fa75f82ae8d785986ebdf18 (patch) | |
| tree | e7ca39da75ad5c9d728698295ac9c8ec32e4e499 /python | |
| parent | c2cdbc312196481edd202baa3bd668396e78534c (diff) | |
| parent | 7bb42ddd9e26fc7c01734d26bc114b5a935d9110 (diff) | |
| download | astra-0cec258c5079cc065fa75f82ae8d785986ebdf18.tar.gz astra-0cec258c5079cc065fa75f82ae8d785986ebdf18.tar.bz2 astra-0cec258c5079cc065fa75f82ae8d785986ebdf18.tar.xz astra-0cec258c5079cc065fa75f82ae8d785986ebdf18.zip | |
Merge branch 'master' into FDK
Diffstat (limited to 'python')
| -rw-r--r-- | python/astra/data3d_c.pyx | 2 | ||||
| -rw-r--r-- | python/astra/extrautils.pyx | 2 | ||||
| -rw-r--r-- | python/astra/optomo.py | 96 | ||||
| -rw-r--r-- | python/astra/src/PythonPluginAlgorithm.cpp | 10 | 
4 files changed, 73 insertions, 37 deletions
| diff --git a/python/astra/data3d_c.pyx b/python/astra/data3d_c.pyx index 207d9a5..811d1e4 100644 --- a/python/astra/data3d_c.pyx +++ b/python/astra/data3d_c.pyx @@ -264,7 +264,7 @@ def store(i,data):  def dimensions(i):      cdef CFloat32Data3D * pDataObject = getObject(i) -    return (pDataObject.getWidth(),pDataObject.getHeight(),pDataObject.getDepth()) +    return (pDataObject.getDepth(),pDataObject.getHeight(),pDataObject.getWidth())  def delete(ids):      try: diff --git a/python/astra/extrautils.pyx b/python/astra/extrautils.pyx index 5bc315f..2c7771e 100644 --- a/python/astra/extrautils.pyx +++ b/python/astra/extrautils.pyx @@ -22,6 +22,8 @@  # along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.  #  # ----------------------------------------------------------------------- +# distutils: language = c++ +  def clipCircle(img):  	cdef int i,j diff --git a/python/astra/optomo.py b/python/astra/optomo.py index dd10713..dde719e 100644 --- a/python/astra/optomo.py +++ b/python/astra/optomo.py @@ -111,21 +111,7 @@ class OpTomo(scipy.sparse.linalg.LinearOperator):          :param v: Volume to forward project.          :type v: :class:`numpy.ndarray`          """ -        v = self.__checkArray(v, self.vshape) -        vid = self.data_mod.link('-vol',self.vg,v) -        s = np.zeros(self.sshape,dtype=np.float32) -        sid = self.data_mod.link('-sino',self.pg,s) - -        cfg = creators.astra_dict('FP'+self.appendString) -        cfg['ProjectionDataId'] = sid -        cfg['VolumeDataId'] = vid -        cfg['ProjectorId'] = self.proj_id -        fp_id = algorithm.create(cfg) -        algorithm.run(fp_id) - -        algorithm.delete(fp_id) -        self.data_mod.delete([vid,sid]) -        return s.flatten() +        return self.FP(v, out=None).ravel()      def rmatvec(self,s):          """Implements the transpose operator. @@ -133,21 +119,7 @@ class OpTomo(scipy.sparse.linalg.LinearOperator):          :param s: The projection data.          :type s: :class:`numpy.ndarray`          """ -        s = self.__checkArray(s, self.sshape) -        sid = self.data_mod.link('-sino',self.pg,s) -        v = np.zeros(self.vshape,dtype=np.float32) -        vid = self.data_mod.link('-vol',self.vg,v) - -        cfg = creators.astra_dict('BP'+self.appendString) -        cfg['ProjectionDataId'] = sid -        cfg['ReconstructionDataId'] = vid -        cfg['ProjectorId'] = self.proj_id -        bp_id = algorithm.create(cfg) -        algorithm.run(bp_id) - -        algorithm.delete(bp_id) -        self.data_mod.delete([vid,sid]) -        return v.flatten() +        return self.BP(s, out=None).ravel()      def __mul__(self,v):          """Provides easy forward operator by *. @@ -189,6 +161,70 @@ class OpTomo(scipy.sparse.linalg.LinearOperator):          self.data_mod.delete([vid,sid])          return v +    def FP(self,v,out=None): +        """Perform forward projection. + +        Output must have the right 2D/3D shape. Input may also be flattened. + +        Output must also be contiguous and float32. This isn't required for the +        input, but it is more efficient if it is. + +        :param v: Volume to forward project. +        :type v: :class:`numpy.ndarray` +        :param out: Array to store result in. +        :type out: :class:`numpy.ndarray` +        """ + +        v = self.__checkArray(v, self.vshape) +        vid = self.data_mod.link('-vol',self.vg,v) +        if out is None: +            out = np.zeros(self.sshape,dtype=np.float32) +        sid = self.data_mod.link('-sino',self.pg,out) + +        cfg = creators.astra_dict('FP'+self.appendString) +        cfg['ProjectionDataId'] = sid +        cfg['VolumeDataId'] = vid +        cfg['ProjectorId'] = self.proj_id +        fp_id = algorithm.create(cfg) +        algorithm.run(fp_id) + +        algorithm.delete(fp_id) +        self.data_mod.delete([vid,sid]) +        return out + +    def BP(self,s,out=None): +        """Perform backprojection. + +        Output must have the right 2D/3D shape. Input may also be flattened. + +        Output must also be contiguous and float32. This isn't required for the +        input, but it is more efficient if it is. + +        :param : The projection data. +        :type s: :class:`numpy.ndarray` +        :param out: Array to store result in. +        :type out: :class:`numpy.ndarray` +        """ +        s = self.__checkArray(s, self.sshape) +        sid = self.data_mod.link('-sino',self.pg,s) +        if out is None: +            out = np.zeros(self.vshape,dtype=np.float32) +        vid = self.data_mod.link('-vol',self.vg,out) + +        cfg = creators.astra_dict('BP'+self.appendString) +        cfg['ProjectionDataId'] = sid +        cfg['ReconstructionDataId'] = vid +        cfg['ProjectorId'] = self.proj_id +        bp_id = algorithm.create(cfg) +        algorithm.run(bp_id) + +        algorithm.delete(bp_id) +        self.data_mod.delete([vid,sid]) +        return out + + + +  class OpTomoTranspose(scipy.sparse.linalg.LinearOperator):      """This object provides the transpose operation (``.T``) of the OpTomo object. diff --git a/python/astra/src/PythonPluginAlgorithm.cpp b/python/astra/src/PythonPluginAlgorithm.cpp index 617c0f4..893db94 100644 --- a/python/astra/src/PythonPluginAlgorithm.cpp +++ b/python/astra/src/PythonPluginAlgorithm.cpp @@ -31,8 +31,6 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.  #include "astra/Logging.h"  #include "astra/Utilities.h" -#include <boost/algorithm/string.hpp> -#include <boost/algorithm/string/split.hpp>  #include <iostream>  #include <fstream>  #include <string> @@ -146,7 +144,7 @@ CPythonPluginAlgorithmFactory::~CPythonPluginAlgorithmFactory(){  PyObject * getClassFromString(std::string str){      std::vector<std::string> items; -    boost::split(items, str, boost::is_any_of(".")); +    StringUtil::splitString(items, str, ".");      PyObject *pyclass = PyImport_ImportModule(items[0].c_str());      if(pyclass==NULL){          logPythonError(); @@ -303,10 +301,10 @@ PyObject * pyStringFromString(std::string str){  PyObject* stringToPythonValue(std::string str){      if(str.find(";")!=std::string::npos){          std::vector<std::string> rows, row; -        boost::split(rows, str, boost::is_any_of(";")); +        StringUtil::splitString(rows, str, ";");          PyObject *mat = PyList_New(rows.size());          for(unsigned int i=0; i<rows.size(); i++){ -            boost::split(row, rows[i], boost::is_any_of(",")); +            StringUtil::splitString(row, rows[i], ",");              PyObject *rowlist = PyList_New(row.size());              for(unsigned int j=0;j<row.size();j++){                  PyList_SetItem(rowlist, j, PyFloat_FromDouble(StringUtil::stringToDouble(row[j]))); @@ -317,7 +315,7 @@ PyObject* stringToPythonValue(std::string str){      }      if(str.find(",")!=std::string::npos){          std::vector<std::string> vec; -        boost::split(vec, str, boost::is_any_of(",")); +        StringUtil::splitString(vec, str, ",");          PyObject *veclist = PyList_New(vec.size());          for(unsigned int i=0;i<vec.size();i++){              PyList_SetItem(veclist, i, PyFloat_FromDouble(StringUtil::stringToDouble(vec[i]))); | 
