[ismrmrd] 154/177: updating SWIG build to use C-API only

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Wed Jan 14 20:02:14 UTC 2015


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to annotated tag v1.1.0.beta.1
in repository ismrmrd.

commit 695e0bad283e80832cd3012f4a8c9245fe3ed632
Author: Joseph Naegele <joseph.naegele at gmail.com>
Date:   Fri Sep 26 13:38:44 2014 -0400

    updating SWIG build to use C-API only
---
 bindings/python/CMakeLists.txt   |  23 +--
 bindings/python/Makefile         |   2 +
 bindings/python/ismrmrd_python.i | 295 +--------------------------------------
 3 files changed, 21 insertions(+), 299 deletions(-)

diff --git a/bindings/python/CMakeLists.txt b/bindings/python/CMakeLists.txt
index a0e6dd7..579be6b 100644
--- a/bindings/python/CMakeLists.txt
+++ b/bindings/python/CMakeLists.txt
@@ -1,28 +1,31 @@
-include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
+include_directories(${CMAKE_SOURCE_DIR}/include)
 include_directories(${PYTHON_INCLUDE_PATH} ${NUMPY_INCLUDE_DIRS})
-include_directories(${HDF5_INCLUDE_DIR} ${HDF5_INCLUDE_DIR}/cpp ${Boost_INCLUDE_DIR})
+include_directories(${HDF5_INCLUDE_DIR} ${HDF5_INCLUDE_DIR}/cpp)
 
 if ( WIN32 )
     add_definitions(-Dismrmrd_EXPORTS)
 endif ( WIN32 )
 
-set_source_files_properties(ismrmrd_python.i PROPERTIES CPLUSPLUS ON)
+swig_add_module(ismrmrd python ismrmrd_python.i
+    ${CMAKE_SOURCE_DIR}/libsrc/ismrmrd.c
+    ${CMAKE_SOURCE_DIR}/libsrc/dataset.c
+)
 
-swig_add_module(ismrmrd python ismrmrd_python.i ${CMAKE_SOURCE_DIR}/ismrmrd_hdf5.cpp)
+swig_link_libraries(ismrmrd ${HDF5_LIBRARIES} ${PYTHON_LIBRARIES})
 
-swig_link_libraries(ismrmrd ${HDF5_LIBRARIES} ${Boost_THREAD_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${PYTHON_LIBRARIES})
+set(PYTHON_INSTALL_DIR share/ismrmrd/python)
 
 install(TARGETS ${SWIG_MODULE_ismrmrd_REAL_NAME}
-    DESTINATION ${ISMRMRD_INSTALL_PYTHON_DIR})
+    DESTINATION ${PYTHON_INSTALL_DIR})
 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ismrmrd.py
-    DESTINATION ${ISMRMRD_INSTALL_PYTHON_DIR})
+    DESTINATION ${PYTHON_INSTALL_DIR})
 
 find_program(PYXBGEN pyxbgen
     HINTS ${PYTHON_HOME} ${PYTHON_LIBRARY}/..
     PATH_SUFFIXES bin)
 
 if(PYXBGEN)
-    set(SCHEMA "${ISMRMRD_SCHEMA_DIR}/ismrmrd.xsd")
+    set(SCHEMA "${CMAKE_SOURCE_DIR}/schema/ismrmrd.xsd")
     set(XSD_PY_FILE "${CMAKE_CURRENT_BINARY_DIR}/ismrmrd_xsd.py")
     set(XSD_PY_DIR "${CMAKE_CURRENT_BINARY_DIR}/raw")
 
@@ -36,9 +39,9 @@ if(PYXBGEN)
     add_custom_target(pyismrmrd_xsd ALL DEPENDS ${XSD_PY_FILE})
 
     install(FILES ${XSD_PY_FILE}
-        DESTINATION ${ISMRMRD_INSTALL_PYTHON_DIR})
+        DESTINATION ${PYTHON_INSTALL_DIR})
     install(DIRECTORY ${XSD_PY_DIR}
-        DESTINATION ${ISMRMRD_INSTALL_PYTHON_DIR})
+        DESTINATION ${PYTHON_INSTALL_DIR})
 else(PYXBGEN)
     message("Can't find pyxbgen executable. Not building ismrmrd_xsd.py")
 endif(PYXBGEN)
diff --git a/bindings/python/Makefile b/bindings/python/Makefile
index c60d1a4..c2543a2 100644
--- a/bindings/python/Makefile
+++ b/bindings/python/Makefile
@@ -5,3 +5,5 @@ LDFLAGS = -I$(ISMRMRD_HOME)/lib
 
 ismrmrd: ismrmrd.pyx cismrmrd.pxd setup.py
 	python setup.py build_ext -i
+clean:
+	rm ismrmrd.c ismrmrd.so
diff --git a/bindings/python/ismrmrd_python.i b/bindings/python/ismrmrd_python.i
index 8753046..81ceeed 100644
--- a/bindings/python/ismrmrd_python.i
+++ b/bindings/python/ismrmrd_python.i
@@ -4,7 +4,8 @@
 
 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
 
-#include "ismrmrd_hdf5.h"
+#include "ismrmrd/ismrmrd.h"
+#include "ismrmrd/dataset.h"
 #include "numpy/arrayobject.h"
 
 // for compatibility with Numpy version <= 1.6
@@ -33,43 +34,6 @@
         swig_c_err_num = 1;
         strncpy(swig_c_err_msg, msg, 256);
     }
-
-    // typedef for complex numbers
-    typedef std::complex<float>  cxfloat;
-    typedef std::complex<double> cxdouble;
-
-
-    template <typename T> PyObject *make_image_array(boost::shared_ptr< ISMRMRD::NDArrayContainer<T> > cont, unsigned int numpy_type)
-    {
-        size_t all_dims = cont->dimensions_.size();
-        size_t ndim = cont->ndims();
-
-        npy_intp* dims = new npy_intp[ndim];
-	for (int d = 0; d < all_dims; d++){
-            int dimension = cont->dimensions_[d];
-            if (dimension > 1) {
-                dims[d] = dimension;
-            }
-        }
-	PyObject *array = PyArray_New(&PyArray_Type, ndim, dims, numpy_type, NULL, NULL, 0, NPY_ARRAY_FARRAY, NULL);
-	delete[] dims;
-
-        return array;
-    }
-
-    template <typename T> PyObject* readTArray(ISMRMRD::IsmrmrdDataset *dset, const char* varname, unsigned long index, unsigned int numpy_type)
-    {
-        boost::shared_ptr< ISMRMRD::NDArrayContainer<T> > container = dset->readArray<T>(varname,index);
-        PyObject *array = make_image_array<T>(container, numpy_type);
-
-        T *raw = (T*)PyArray_DATA((PyArrayObject*)array);
-        npy_intp raw_size = PyArray_NBYTES((PyArrayObject*)array);
-
-        memcpy(raw, &container->data_[0], raw_size);
-
-        return array;
-    }
-
 %}
 
 // Initialize NumPy
@@ -77,9 +41,6 @@
     import_array();
 %}
 
-%include "stdint.i"
-%include "std_string.i"
-%include "std_vector.i"
 %include "carrays.i"
 
 %array_class(uint16_t, ushortArray);
@@ -98,256 +59,12 @@
     }
 }
 
-%ignore *::operator=;
-%ignore *::operator[];
-%ignore ISMRMRD::AcquisitionHeader_with_data;
-%ignore ISMRMRD::ImageHeader_with_data;
-%ignore ISMRMRD::Image;
-%ignore ISMRMRD::NDArrayContainer;
-
-
-%extend ISMRMRD::Acquisition {
-    /* Returns 1-D Numpy Array */
-    PyObject* getData()
-    {
-        npy_intp dims[] = { $self->getData().size() };
-	PyObject *array = PyArray_New(&PyArray_Type, 1, dims, NPY_FLOAT,
-                NULL, NULL, 0, NPY_ARRAY_FARRAY, NULL);
-
-        char *raw = PyArray_BYTES((PyArrayObject*)array);
-        int data_size = PyArray_ITEMSIZE((PyArrayObject*)array);
-        npy_intp raw_size = PyArray_NBYTES((PyArrayObject*)array);
-
-        std::valarray<float> data = $self->getData();
-        memcpy(raw, &data[0], dims[0] * data_size);
-
-        return array;
-    }
-
-    void setData(PyObject *in_array)
-    {
-        if (!PyArray_Check((PyArrayObject*)in_array) || !PyArray_ISFLOAT((PyArrayObject*)in_array)) {
-            set_err("Argument to setData is not a numpy float array\n");
-            return;
-        } else if (!PyArray_ISBEHAVED_RO((PyArrayObject*)in_array)) {
-            set_err("Argument to setData must be aligned\n");
-            return;
-        } else if (!PyArray_ISONESEGMENT((PyArrayObject*)in_array)) {
-            set_err("Data is not one segment\n");
-            return;
-        }
-
-        PyObject *array = NULL;
-        /* if array is C-style contiguous, make a Fortran-style contiguous copy */
-        if (PyArray_ISCONTIGUOUS((PyArrayObject*)in_array)) {
-            array = PyArray_NewCopy((PyArrayObject*)in_array, NPY_FORTRANORDER);
-        } else {
-            array = in_array;
-        }
-
-        int ndim = PyArray_NDIM((PyArrayObject*)array);
-        int itemsize = PyArray_ITEMSIZE((PyArrayObject*)array);
-        npy_intp nbytes = PyArray_NBYTES((PyArrayObject*)array);
-        npy_intp nelements = PyArray_SIZE((PyArrayObject*)array);
-        npy_intp* dims = PyArray_DIMS((PyArrayObject*)array);
-        npy_intp* strides = PyArray_STRIDES((PyArrayObject*)array);
-        void *raw = PyArray_DATA((PyArrayObject*)array);
-
-        std::valarray<float> data(0.0, nelements);
-        memcpy(&(data[0]), raw, nbytes);
-        $self->setData(data);
-    }
-
-    PyObject* getTraj()
-    {
-        npy_intp dims[] = { $self->getTraj().size() };
-        PyObject *array = PyArray_New(&PyArray_Type, 1, dims, NPY_FLOAT,
-                NULL, NULL, 0, NPY_ARRAY_FARRAY, NULL);
-
-        char *raw = PyArray_BYTES((PyArrayObject*)array);
-        int data_size = PyArray_ITEMSIZE((PyArrayObject*)array);
-        npy_intp raw_size = PyArray_NBYTES((PyArrayObject*)array);
-
-        std::valarray<float> traj = $self->getTraj();
-        memcpy(raw, &traj[0], dims[0]*data_size);
-
-        return array;
-    }
-
-    void setTraj(PyObject *in_array)
-    {
-        if (!PyArray_Check((PyArrayObject*)in_array) || !PyArray_ISFLOAT((PyArrayObject*)in_array)) {
-            set_err("Argument to setData is not a numpy float array\n");
-            return;
-        } else if (!PyArray_ISBEHAVED_RO((PyArrayObject*)in_array)) {
-            set_err("Argument to setData must be aligned\n");
-            return;
-        } else if (!PyArray_ISONESEGMENT((PyArrayObject*)in_array)) {
-            set_err("Data is not one segment\n");
-            return;
-        }
-
-        PyObject *array = NULL;
-        /* if array is C-style contiguous, make a Fortran-style contiguous copy */
-        if (PyArray_ISCONTIGUOUS((PyArrayObject*)in_array)) {
-            array = PyArray_NewCopy((PyArrayObject*)in_array, NPY_FORTRANORDER);
-        } else {
-            array = in_array;
-        }
-
-        int ndim = PyArray_NDIM((PyArrayObject*)array);
-        int itemsize = PyArray_ITEMSIZE((PyArrayObject*)array);
-        npy_intp nbytes = PyArray_NBYTES((PyArrayObject*)array);
-        npy_intp nelements = PyArray_SIZE((PyArrayObject*)array);
-        npy_intp* dims = PyArray_DIMS((PyArrayObject*)array);
-        npy_intp* strides = PyArray_STRIDES((PyArrayObject*)array);
-        void *raw = PyArray_DATA((PyArrayObject*)array);
-
-        std::valarray<float> traj(0.0, nelements);
-        memcpy(&(traj[0]), raw, nbytes);
-        $self->setTraj(traj);
-    }
-}
-
-%ignore ISMRMRD::Acquisition::getData;
-%ignore ISMRMRD::Acquisition::setData;
-%ignore ISMRMRD::Acquisition::getTraj;
-%ignore ISMRMRD::Acquisition::setTraj;
-
-// IsmrmrdDataset
-
-%extend ISMRMRD::IsmrmrdDataset {
-
-    // XML
-    std::string readHeader() {
-        boost::shared_ptr<std::string> hdr = $self->readHeader();
-        return *(hdr.get()); 
-    }
-
-    // Acquisition
-    ISMRMRD::Acquisition* readAcquisition(unsigned long index = 0) {
-        ISMRMRD::Acquisition* acq = new ISMRMRD::Acquisition(*$self->readAcquisition(index).get());
-        return acq;
-    }
-
-    // Image Header
-    ISMRMRD::ImageHeader* readImageHeader(const char* varname, unsigned long index = 0) {
-        ISMRMRD::ImageHeader* imghdr = new ISMRMRD::ImageHeader(*$self->readImageHeader(varname,index).get());
-        return imghdr;
-    }
-
-    // Image Data
-    PyObject* readArray(ISMRMRD::ImageHeader *hdr, const char* varname, unsigned long index = 0)
-    {
-        PyObject *array = NULL;
-        if (!hdr) {
-            return NULL;
-        }
-
-        switch (hdr->image_data_type) {
-        case ISMRMRD::DATA_UNSIGNED_SHORT: {
-            return readTArray<unsigned short>($self, varname, index, NPY_USHORT);
-            break;
-        }
-        case ISMRMRD::DATA_FLOAT: {
-            return readTArray<float>($self, varname, index, NPY_FLOAT);
-            break;
-        }
-        case ISMRMRD::DATA_DOUBLE: {
-            return readTArray<double>($self, varname, index, NPY_DOUBLE);
-            break;
-        }
-        case ISMRMRD::DATA_COMPLEX_FLOAT: {
-            return readTArray<cxfloat>($self, varname, index, NPY_CFLOAT);
-            break;
-        }
-        case ISMRMRD::DATA_COMPLEX_DOUBLE: {
-            return readTArray<cxdouble>($self, varname, index, NPY_CDOUBLE);
-            break;
-        }
-        default:
-            array = NULL;
-        }
-        return array;
-    }
-
-    int appendArray(PyObject *in_array, const char* varname)
-    {
-        if (!PyArray_Check((PyArrayObject*)in_array)) {
-            set_err("array arg to appendArray is not a numpy array\n");
-            return -1;
-        } else if (!PyArray_ISBEHAVED_RO((PyArrayObject*)in_array)) {
-            set_err("array arg to appendArray must be aligned and in machine byte-order\n");
-            return -1;
-        }
-
-        PyObject *array = NULL;
-        /* if in_array is C-style contiguous, make it a Fortran-style contiguous copy */
-        if (PyArray_ISCONTIGUOUS((PyArrayObject*)in_array)) {
-            array = PyArray_NewCopy((PyArrayObject*)in_array, NPY_FORTRANORDER);
-        } else {
-            array = in_array;
-        }
-
-        int ndim = PyArray_NDIM((PyArrayObject*)array);
-        npy_intp* dims = PyArray_DIMS((PyArrayObject*)array);
-
-        std::vector<unsigned int> dimensions;
-        for (int d = 0; d < ndim; d++) {
-            dimensions.push_back(dims[d]);
-        }
-
-        int ret = 0;
-        switch (PyArray_TYPE((PyArrayObject*)array)) {
-            case NPY_USHORT: {
-                npy_ushort *raw = (npy_ushort*)PyArray_DATA((PyArrayObject*)array);
-                ret = $self->appendArray(dimensions, raw, varname);
-                break;
-            }
-            case NPY_FLOAT: {
-                npy_float *raw = (npy_float*)PyArray_DATA((PyArrayObject*)array);
-                ret = $self->appendArray(dimensions, raw, varname);
-                break;
-            }
-            case NPY_DOUBLE: {
-                npy_double *raw = (npy_double*)PyArray_DATA((PyArrayObject*)array);
-                ret = $self->appendArray(dimensions, raw, varname);
-                break;
-            }
-            case NPY_CFLOAT: {
-                npy_cfloat *raw = (npy_cfloat*)PyArray_DATA((PyArrayObject*)array);
-                ret = $self->appendArray(dimensions, (std::complex<float>*)raw, varname);
-                break;
-            }
-            case NPY_CDOUBLE: {
-                npy_cdouble *raw = (npy_cdouble*)PyArray_DATA((PyArrayObject*)array);
-                ret = $self->appendArray(dimensions, (std::complex<float>*)raw, varname);
-                break;
-            }
-            default:
-                set_err("Invalid array dtype\n");
-                return -1;
-        }
-        return ret;
-    }
-
-}
-
-%ignore readHeader;
-%ignore readAcquisition;
-%ignore readImageHeader;
-%ignore readImage;
-%ignore readArray;
-%ignore appendImage;
-%ignore appendArray;
-
 // Process the main ISMRMRD header
-%include "ismrmrd.h"
+%include "ismrmrd/export.h"
+%include "ismrmrd/ismrmrd.h"
 
 // These definitions are needed for the HDF5 stuff to work
-%define EXPORTISMRMRD %enddef
-namespace H5 { }
+// %define EXPORTISMRMRD %enddef
 
 // Process the HDF5 ISMRMD headers
-%include "ismrmrd_hdf5.h"
-%include "ismrmrd_hdf5_datatypes.h"
+%include "ismrmrd/dataset.h"

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ismrmrd.git



More information about the debian-science-commits mailing list