[ismrmrd] 161/281: heavily cleansing Python binding/API

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


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

ghisvail-guest pushed a commit to annotated tag ismrmrd0.5
in repository ismrmrd.

commit 7c73447b91096afd3dd0bde906201abfaf623224
Author: Joseph Naegele <joseph.naegele at gmail.com>
Date:   Thu Aug 1 15:17:02 2013 -0400

    heavily cleansing Python binding/API
---
 bindings/python/ismrmrd_python.i | 839 ++++++++-------------------------------
 1 file changed, 169 insertions(+), 670 deletions(-)

diff --git a/bindings/python/ismrmrd_python.i b/bindings/python/ismrmrd_python.i
index 544db80..c3cdbd2 100644
--- a/bindings/python/ismrmrd_python.i
+++ b/bindings/python/ismrmrd_python.i
@@ -6,445 +6,110 @@
 
 #define SWIG_FILE_WITH_INIT
 
-/* exception helpers */
-static int swig_c_err_num = 0;
-static char swig_c_err_msg[256];
-
-const char *err_occurred()
-{
-    if (swig_c_err_num) {
-        swig_c_err_num = 0;
-        return (const char*)swig_c_err_msg;
-    }
-    return NULL;
-}
-
-void set_err(const char *msg)
-{
-    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;
-
-%}
-
-%init %{
-import_array();
-%}
-
-%include "stdint.i"
-%include "std_string.i"
-%include "std_vector.i"
-%include "carrays.i"
-
-%array_class(unsigned short, ushortArray);
-%array_class(uint16_t, ushortArray);
-%array_class(unsigned int, uintArray);
-%array_class(uint32_t, uintArray);
-%array_class(float, floatArray);
-
-%exception {
-    const char *err;
-    $action
-    if ((err = err_occurred())) {
-        PyErr_SetString(PyExc_RuntimeError, err);
-        return NULL;
-    }
-}
-
-%extend ISMRMRD::Acquisition {
-    PyObject* getData()
-    {
-        npy_intp dims[] = { $self->getData().size() };
-        PyObject *array = PyArray_SimpleNew(1, dims, NPY_FLOAT);
-
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        npy_intp raw_size = PyArray_NBYTES(array);
-
-        //printf("# elements: %d\n", $self->getData().size());
-        //printf("data size:  %d\n", data_size);
-        //printf("total size: %d\n", raw_size);
-
-        std::valarray<float> data = $self->getData();
-        int i;
-        for (i = 0; i < dims[0]; i++) {
-            npy_float *addr = (npy_float*)(raw + (i * data_size));
-            *addr = data[i];
-
-            /* slower method */
-            //PyObject *o = PyFloat_FromDouble((double)data[i]);
-            //PyArray_SETITEM(array, addr, o);
-            //Py_DECREF(o);
-        }
+    /* exception helpers */
+    static int swig_c_err_num = 0;
+    static char swig_c_err_msg[256];
 
-        return array;
-    }
-
-    void setData(PyObject *array)
-    {
-        if (!PyArray_Check(array) || !PyArray_ISFLOAT(array)) {
-            set_err("Argument to setData is not a numpy float array\n");
-            return;
-        } 
-
-        int ndim = PyArray_NDIM(array);
-        npy_intp *dims = PyArray_DIMS(array);
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        if (ndim != 1) {
-            set_err("Argument to setData must be a 1-D array\n");
-            return;
-        }
-
-        int i;
-        for (i = 0; i < dims[0]; i++) {
-            npy_float *addr = (npy_float*)(raw + i * data_size);
-            (*$self)[i] = (float)*addr;
-        }
-    }
-
-}
-%ignore ISMRMRD::Acquisition::getData;
-%ignore ISMRMRD::Acquisition::setData;
-
-
-//
-// The Image class is overloaded so we need to do some renaming
-//
-%rename(Image_ushort_getData)   Image<unsigned short int>::getData;
-%rename(Image_ushort_setData)   Image<unsigned short int>::setData;
-%rename(Image_float_getData)    Image<float>::getData;
-%rename(Image_float_setData)    Image<float>::setData;
-%rename(Image_double_getData)   Image<double>::getData;
-%rename(Image_double_setData)   Image<double>::setData;
-%rename(Image_cxfloat_getData)  Image<cxfloat>::getData;
-%rename(Image_cxfloat_setData)  Image<cxfloat>::setData;
-%rename(Image_cxdouble_getData) Image<cxdouble>::getData;
-%rename(Image_cxdouble_setData) Image<cxdouble>::setData;
-
-%extend ISMRMRD::Image<unsigned short int>
-{
-    PyObject *getData()
+    const char *err_occurred()
     {
-        npy_intp dims[] = { $self->getData().size() };
-        PyObject *array = PyArray_SimpleNew(1, dims, NPY_USHORT);
-
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        npy_intp raw_size = PyArray_NBYTES(array);
-
-        int i;
-        for (i = 0; i < $self->getNumberOfElements(); i++) {
-            npy_ushort *addr = (npy_ushort*)(raw + (i * data_size));
-            *addr = (*self)[i];
-        }
-
-        return array;
-    }
-
-    void setData(PyObject *array)
-    {
-        if (!PyArray_Check(array) || !PyArray_ISINTEGER(array)) {
-            set_err("Argument to setData is not a numpy integer array\n");
-            return;
-        } 
-
-        int ndim = PyArray_NDIM(array);
-        npy_intp *dims = PyArray_DIMS(array);
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        if (ndim != 1) {
-            set_err("Argument to setData must be a 1-D array\n");
-            return;
-        }
-
-        int i;
-        for (i = 0; i < dims[0]; i++) {
-            npy_ushort *addr = (npy_ushort*)(raw + i * data_size);
-            (*$self)[i] = (unsigned short)*addr;
+        if (swig_c_err_num) {
+            swig_c_err_num = 0;
+            return (const char*)swig_c_err_msg;
         }
+        return NULL;
     }
-}
-%ignore ISMRMRD::Image<unsigned short int>::getData;
-%ignore ISMRMRD::Image<unsigned short int>::setData;
 
-%extend ISMRMRD::Image<float>
-{
-    PyObject *getData()
+    void set_err(const char *msg)
     {
-        npy_intp dims[] = { $self->getData().size() };
-        PyObject *array = PyArray_SimpleNew(1, dims, NPY_FLOAT);
-
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        npy_intp raw_size = PyArray_NBYTES(array);
-
-        int i;
-        for (i = 0; i < $self->getNumberOfElements(); i++) {
-            npy_float *addr = (npy_float*)(raw + (i * data_size));
-            *addr = (*self)[i];
-        }
-
-        return array;
+        swig_c_err_num = 1;
+        strncpy(swig_c_err_msg, msg, 256);
     }
 
-    void setData(PyObject *array)
-    {
-        if (!PyArray_Check(array) || !PyArray_ISFLOAT(array)) {
-            set_err("Argument to setData is not a numpy float array\n");
-            return;
-        } 
-
-        int ndim = PyArray_NDIM(array);
-        npy_intp *dims = PyArray_DIMS(array);
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        if (ndim != 1) {
-            set_err("Argument to setData must be a 1-D array\n");
-            return;
-        }
+    // typedef for complex numbers
+    typedef std::complex<float>  cxfloat;
+    typedef std::complex<double> cxdouble;
 
-        int i;
-        for (i = 0; i < dims[0]; i++) {
-            npy_float *addr = (npy_float*)(raw + i * data_size);
-            (*$self)[i] = (float)*addr;
-        }
-    }
-}
-%ignore ISMRMRD::Image<float>::getData;
-%ignore ISMRMRD::Image<float>::setData;
 
-%extend ISMRMRD::Image<double>
-{
-    PyObject *getData()
+    template <typename T> PyObject *make_image_array(boost::shared_ptr< ISMRMRD::NDArrayContainer<T> > cont, unsigned int numpy_type)
     {
-        npy_intp dims[] = { $self->getData().size() };
-        PyObject *array = PyArray_SimpleNew(1, dims, NPY_DOUBLE);
+        size_t all_dims = cont->dimensions_.size();
+        size_t ndim = cont->ndims();
 
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        npy_intp raw_size = PyArray_NBYTES(array);
-
-        int i;
-        for (i = 0; i < $self->getNumberOfElements(); i++) {
-            npy_double *addr = (npy_double*)(raw + (i * data_size));
-            *addr = (*self)[i];
+        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;
     }
 
-    void setData(PyObject *array)
-    {
-        if (!PyArray_Check(array) || !PyArray_ISFLOAT(array)) {
-            set_err("Argument to setData is not a numpy double array\n");
-            return;
-        } 
-
-        int ndim = PyArray_NDIM(array);
-        npy_intp *dims = PyArray_DIMS(array);
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        if (ndim != 1) {
-            set_err("Argument to setData must be a 1-D array\n");
-            return;
-        }
-
-        int i;
-        for (i = 0; i < dims[0]; i++) {
-            npy_double *addr = (npy_double*)(raw + i * data_size);
-            (*$self)[i] = (double)*addr;
-        }
-    }
-}
-%ignore ISMRMRD::Image<double>::getData;
-%ignore ISMRMRD::Image<double>::setData;
-
-%extend ISMRMRD::Image<cxfloat>
-{
-    PyObject *getData()
+    template <typename T> PyObject* readTArray(ISMRMRD::IsmrmrdDataset *dset, const char* varname, unsigned long index, unsigned int numpy_type)
     {
-        npy_intp dims[] = { $self->getData().size() };
-        PyObject *array = PyArray_SimpleNew(1, dims, NPY_CFLOAT);
+        boost::shared_ptr< ISMRMRD::NDArrayContainer<T> > container = dset->readArray<T>(varname,index);
+        PyObject *array = make_image_array<T>(container, numpy_type);
 
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
+        T *raw = (T*)PyArray_DATA(array);
         npy_intp raw_size = PyArray_NBYTES(array);
 
-        int i;
-        for (i = 0; i < $self->getNumberOfElements(); i++) {
-            npy_cfloat *addr = (npy_cfloat*)(raw + (i * data_size));
-            addr->real = (*self)[i].real();
-            addr->imag = (*self)[i].imag();
-        }
+        memcpy(raw, &container->data_[0], raw_size);
 
         return array;
     }
 
-    void setData(PyObject *array)
-    {
-        if (!PyArray_Check(array) || !PyArray_ISCOMPLEX(array)) {
-            set_err("Argument to setData is not a numpy complex array\n");
-            return;
-        } 
-
-        int ndim = PyArray_NDIM(array);
-        npy_intp *dims = PyArray_DIMS(array);
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        if (ndim != 1) {
-            set_err("Argument to setData must be a 1-D array\n");
-            return;
-        }
-
-        int i;
-        for (i = 0; i < dims[0]; i++) {
-            npy_cfloat *addr = (npy_cfloat*)(raw + i * data_size);
-            (*$self)[i] = cxfloat(addr->real, addr->imag);
-        }
-    }
-}
-%ignore ISMRMRD::Image<cxfloat>::getData;
-%ignore ISMRMRD::Image<cxfloat>::setData;
-
-%extend ISMRMRD::Image<cxdouble>
-{
-    PyObject *getData()
-    {
-        npy_intp dims[] = { $self->getData().size() };
-        PyObject *array = PyArray_SimpleNew(1, dims, NPY_CDOUBLE);
-
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        npy_intp raw_size = PyArray_NBYTES(array);
+%}
 
-        int i;
-        for (i = 0; i < $self->getNumberOfElements(); i++) {
-            npy_cdouble *addr = (npy_cdouble*)(raw + (i * data_size));
-            addr->real = (*self)[i].real();
-            addr->imag = (*self)[i].imag();
-        }
+// Initialize NumPy
+%init %{
+    import_array();
+%}
 
-        return array;
-    }
+%include "stdint.i"
+%include "std_string.i"
+%include "std_vector.i"
+%include "carrays.i"
 
-    void setData(PyObject *array)
-    {
-        if (!PyArray_Check(array) || !PyArray_ISCOMPLEX(array)) {
-            set_err("Argument to setData is not a numpy complex array\n");
-            return;
-        } 
+%array_class(uint16_t, ushortArray);
+%array_class(int32_t, intArray);
+%array_class(uint32_t, uintArray);
+%array_class(uint64_t, ulongArray);
+%array_class(float, floatArray);
 
-        int ndim = PyArray_NDIM(array);
-        npy_intp *dims = PyArray_DIMS(array);
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        if (ndim != 1) {
-            set_err("Argument to setData must be a 1-D array\n");
-            return;
-        }
 
-        int i;
-        for (i = 0; i < dims[0]; i++) {
-            npy_cdouble *addr = (npy_cdouble*)(raw + i * data_size);
-            (*$self)[i] = cxdouble(addr->real, addr->imag);
-        }
+%exception {
+    const char *err;
+    $action
+    if ((err = err_occurred())) {
+        PyErr_SetString(PyExc_RuntimeError, err);
+        return NULL;
     }
 }
-%ignore ISMRMRD::Image<cxdouble>::getData;
-%ignore ISMRMRD::Image<cxdouble>::setData;
-
-
-//
-// The NDContainerArray class is overloaded so rename each template
-//
-%rename(Array_ushort_getData)   NDArrayContainer<unsigned short int>::getData;
-%rename(Array_ushort_setData)   NDArrayContainer<unsigned short int>::setData;
-%rename(Array_float_getData)    NDArrayContainer<float>::getData;
-%rename(Array_float_setData)    NDArrayContainer<float>::setData;
-%rename(Array_double_getData)   NDArrayContainer<double>::getData;
-%rename(Array_double_setData)   NDArrayContainer<double>::setData;
-%rename(Array_cxfloat_getData)  NDArrayContainer<cxfloat>::getData;
-%rename(Array_cxfloat_setData)  NDArrayContainer<cxfloat>::setData;
-%rename(Array_cxdouble_getData) NDArrayContainer<cxdouble>::getData;
-%rename(Array_cxdouble_setData) NDArrayContainer<cxdouble>::setData;
-
-%extend ISMRMRD::NDArrayContainer<unsigned short int>
-{
-    PyObject* getData()
-    {
-        int ndim = $self->dimensions_.size();
-	npy_intp* dims = new npy_intp[ndim];
-	for (int d=0; d<ndim; d++){
-            dims[d] = $self->dimensions_[d];
-        }
-	PyObject *array = PyArray_New(&PyArray_Type, ndim, dims, NPY_USHORT, NULL, NULL, 0, NPY_ARRAY_FARRAY, NULL);
-	delete[] dims;
-
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        npy_intp raw_size = PyArray_NBYTES(array);
 
-        int i;
-        for (i = 0; i < $self->elements(); i++) {
-            npy_ushort *addr = (npy_ushort*)(raw + (i * data_size));
-            (*addr) = (*self)[i];
-        }
+%ignore *::operator=;
+%ignore *::operator[];
+%ignore ISMRMRD::AcquisitionHeader_with_data;
+%ignore ISMRMRD::ImageHeader_with_data;
+%ignore ISMRMRD::Image;
+%ignore ISMRMRD::NDArrayContainer;
 
-        return array;
-    }
-
-    void setData(PyObject *array)
-    {
-        if (!PyArray_Check(array) || !PyArray_ISINTEGER(array)) {
-            set_err("Argument to setData is not a numpy integer array\n");
-            return;
-        } 
-
-        int ndim = PyArray_NDIM(array);
-        npy_intp *dims = PyArray_DIMS(array);
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        if (ndim != 1) {
-            set_err("Argument to setData must be a 1-D array\n");
-            return;
-        }
-
-        int i;
-        for (i = 0; i < dims[0]; i++) {
-            npy_ushort *addr = (npy_ushort*)(raw + i * data_size);
-            (*$self)[i] = (unsigned short)*addr;
-        }
-    }
-}
-%ignore ISMRMRD::NDArrayContainer<unsigned short int>::getData;
-%ignore ISMRMRD::NDArrayContainer<unsigned short int>::setData;
 
-%extend ISMRMRD::NDArrayContainer<float>
-{
+%extend ISMRMRD::Acquisition {
+    /* Returns 1-D Numpy Array */
     PyObject* getData()
     {
-        int ndim = $self->dimensions_.size();
-	npy_intp* dims = new npy_intp[ndim];
-	for (int d=0; d<ndim; d++){
-            dims[d] = $self->dimensions_[d];
-        }
-	PyObject *array = PyArray_New(&PyArray_Type, ndim, dims, NPY_FLOAT, NULL, NULL, 0, NPY_ARRAY_FARRAY, NULL);
-	delete[] dims;
+        npy_intp dims[] = { $self->getData().size() };
+        PyObject *array = PyArray_SimpleNew(1, dims, NPY_FLOAT);
 
         char *raw = PyArray_BYTES(array);
         int data_size = PyArray_ITEMSIZE(array);
         npy_intp raw_size = PyArray_NBYTES(array);
 
-        int i;
-        for (i = 0; i < $self->elements(); i++) {
-            npy_float *addr = (npy_float*)(raw + (i * data_size));
-            (*addr) = (*self)[i];
-        }
+        std::valarray<float> data = $self->getData();
+        memcpy(raw, &data[0], dims[0] * data_size);
 
         return array;
     }
@@ -454,324 +119,158 @@ import_array();
         if (!PyArray_Check(array) || !PyArray_ISFLOAT(array)) {
             set_err("Argument to setData is not a numpy float array\n");
             return;
-        } 
-
-        int ndim = PyArray_NDIM(array);
-        npy_intp *dims = PyArray_DIMS(array);
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        if (ndim != 1) {
-            set_err("Argument to setData must be a 1-D array\n");
-            return;
-        }
-
-        int i;
-        for (i = 0; i < dims[0]; i++) {
-            npy_float *addr = (npy_float*)(raw + i * data_size);
-            (*$self)[i] = (float)*addr;
-        }
-    }
-}
-%ignore ISMRMRD::NDArrayContainer<float>::getData;
-%ignore ISMRMRD::NDArrayContainer<float>::setData;
-
-%extend ISMRMRD::NDArrayContainer<double>
-{
-    PyObject* getData()
-    {
-        int ndim = $self->dimensions_.size();
-	npy_intp* dims = new npy_intp[ndim];
-	for (int d=0; d<ndim; d++){
-            dims[d] = $self->dimensions_[d];
-        }
-	PyObject *array = PyArray_New(&PyArray_Type, ndim, dims, NPY_DOUBLE, NULL, NULL, 0, NPY_ARRAY_FARRAY, NULL);
-	delete[] dims;
-
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        npy_intp raw_size = PyArray_NBYTES(array);
-
-        int i;
-        for (i = 0; i < $self->elements(); i++) {
-            npy_double *addr = (npy_double*)(raw + (i * data_size));
-            (*addr) = (*self)[i];
-        }
-
-        return array;
-    }
-
-    void setData(PyObject *array)
-    {
-        if (!PyArray_Check(array) || !PyArray_ISFLOAT(array)) {
-            set_err("Argument to setData is not a numpy double array\n");
+        } else if (!PyArray_ISBEHAVED_RO(array)) {
+            set_err("Argument to setData must be aligned\n");
             return;
-        } 
-
-        int ndim = PyArray_NDIM(array);
-        npy_intp *dims = PyArray_DIMS(array);
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        if (ndim != 1) {
-            set_err("Argument to setData must be a 1-D array\n");
+        } else if (!PyArray_ISONESEGMENT(array)) {
+            set_err("Data is not one segment\n");
             return;
         }
 
-        int i;
-        for (i = 0; i < dims[0]; i++) {
-            npy_double *addr = (npy_double*)(raw + i * data_size);
-            (*$self)[i] = (double)*addr;
-        }
-    }
-}
-%ignore ISMRMRD::NDArrayContainer<double>::getData;
-%ignore ISMRMRD::NDArrayContainer<double>::setData;
-
-%extend ISMRMRD::NDArrayContainer<cxfloat>
-{
-    PyObject* getData()
-    {
-        int ndim = $self->dimensions_.size();
-        npy_intp* dims = new npy_intp[ndim];
-        for (int d=0; d<ndim; d++){
-            dims[d] = $self->dimensions_[d];
-        }
-	PyObject *array = PyArray_New(&PyArray_Type, ndim, dims, NPY_CFLOAT, NULL, NULL, 0, NPY_ARRAY_FARRAY, NULL);
-        delete[] dims;
-
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        npy_intp raw_size = PyArray_NBYTES(array);
-
-        int i;
-        for (i = 0; i < $self->elements(); i++) {
-            npy_cfloat *addr = (npy_cfloat*)(raw + (i * data_size));
-            addr->real = (*self)[i].real();
-            addr->imag = (*self)[i].imag();
-        }
-
-        return array;
-    }
-
-    void setData(PyObject *array)
-    {
-        if (!PyArray_Check(array) || !PyArray_ISCOMPLEX(array)) {
-            set_err("Argument to setData is not a numpy complex array\n");
-            return;
-        } 
-
-        //if (PyArray_ISFORTRAN((PyArrayObject*)array)) {
-        //    std::cout << "Fortran" << std::endl;
-        //}
-        //else {
-        //    std::cout << "C" << std::endl;
-        //}
-	
         int ndim = PyArray_NDIM(array);
-        npy_intp *dims = PyArray_DIMS(array);
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        if (ndim != 1) {
-            set_err("Argument to setData must be a 1-D array\n");
-            return;
-        }
+        int itemsize = PyArray_ITEMSIZE(array);
+        npy_intp nbytes = PyArray_NBYTES(array);
+        npy_intp nelements = PyArray_SIZE(array);
+        npy_intp* dims = PyArray_DIMS(array);
+        npy_intp* strides = PyArray_STRIDES(array);
+        void *raw = PyArray_DATA(array);
 
-        int i;
-        for (i = 0; i < dims[0]; i++) {
-            npy_cfloat *addr = (npy_cfloat*)(raw + i * data_size);
-            (*$self)[i] = cxfloat(addr->real, addr->imag);
-        }
+        std::valarray<float> data(0.0, nelements);
+        memcpy(&(data[0]), raw, nbytes);
+        $self->setData(data);
     }
 }
-%ignore ISMRMRD::NDArrayContainer<cxfloat>::getData;
-%ignore ISMRMRD::NDArrayContainer<cxfloat>::setData;
-
-%extend ISMRMRD::NDArrayContainer<cxdouble>
-{
-    PyObject* getData()
-    {
-        int ndim = $self->dimensions_.size();
-	npy_intp* dims = new npy_intp[ndim];
-	for (int d=0; d<ndim; d++){
-            dims[d] = $self->dimensions_[d];
-        }
-	PyObject *array = PyArray_New(&PyArray_Type, ndim, dims, NPY_CDOUBLE, NULL, NULL, 0, NPY_ARRAY_FARRAY, NULL);
-	delete[] dims;
-
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        npy_intp raw_size = PyArray_NBYTES(array);
-
-        int i;
-        for (i = 0; i < $self->elements(); i++) {
-            npy_cdouble *addr = (npy_cdouble*)(raw + (i * data_size));
-            addr->real = (*self)[i].real();
-            addr->imag = (*self)[i].imag();
-        }
-
-        return array;
-    }
-
-    void setData(PyObject *array)
-    {
-        if (!PyArray_Check(array) || !PyArray_ISCOMPLEX(array)) {
-            set_err("Argument to setData is not a numpy complex array\n");
-            return;
-        } 
 
-        int ndim = PyArray_NDIM(array);
-        npy_intp *dims = PyArray_DIMS(array);
-        char *raw = PyArray_BYTES(array);
-        int data_size = PyArray_ITEMSIZE(array);
-        if (ndim != 1) {
-            set_err("Argument to setData must be a 1-D array\n");
-            return;
-        }
+%ignore ISMRMRD::Acquisition::getData;
+%ignore ISMRMRD::Acquisition::setData;
 
-        int i;
-        for (i = 0; i < dims[0]; i++) {
-            npy_cdouble *addr = (npy_cdouble*)(raw + i * data_size);
-            (*$self)[i] = cxdouble(addr->real, addr->imag);
-        }
-    }
-}
-%ignore ISMRMRD::NDArrayContainer<cxdouble>::getData;
-%ignore ISMRMRD::NDArrayContainer<cxdouble>::setData;
 
-//
 // IsmrmrdDataset
-//
-%rename(readImage_ushort)   readImage<unsigned short int>;
-%rename(readImage_float)    readImage<float>;
-%rename(readImage_double)   readImage<double>;
-%rename(readImage_cxfloat)  readImage<cxfloat>;
-%rename(readImage_cxdouble) readImage<cxdouble>;
-
-%rename(readArray_ushort)   readArray<unsigned short int>;
-%rename(readArray_float)    readArray<float>;
-%rename(readArray_double)   readArray<double>;
-%rename(readArray_cxfloat)  readArray<cxfloat>;
-%rename(readArray_cxdouble) readArray<cxdouble>;
 
 %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
-    ISMRMRD::Image<float>* readImage<float>(const char* varname, unsigned long index = 0) {
-        ISMRMRD::Image<float>* img = new ISMRMRD::Image<float>(*$self->readImage<float>(varname,index).get());
-        return img;
-    }
-
-    ISMRMRD::Image<double>* readImage<double>(const char* varname, unsigned long index = 0) {
-        ISMRMRD::Image<double>* img = new ISMRMRD::Image<double>(*$self->readImage<double>(varname,index).get());
-        return img;
-    }
-
-    ISMRMRD::Image<unsigned short int>* readImage<unsigned short>(const char* varname, unsigned long index = 0) {
-        ISMRMRD::Image<unsigned short>* img = new ISMRMRD::Image<unsigned short>(*$self->readImage<unsigned short>(varname,index).get());
-        return img;
-    }
-
-    ISMRMRD::Image<cxfloat>* readImage<cxfloat>(const char* varname, unsigned long index = 0) {
-        ISMRMRD::Image< cxfloat >* img = new ISMRMRD::Image< cxfloat >(*$self->readImage< cxfloat >(varname,index).get());
-        return img;
-    }
-
-    ISMRMRD::Image<cxdouble>* readImage<cxdouble>(const char* varname, unsigned long index = 0) {
-        ISMRMRD::Image<cxdouble>* img = new ISMRMRD::Image<cxdouble>(*$self->readImage<cxdouble>(varname,index).get());
-        return img;
-    }
-
-    // NDArray
-    ISMRMRD::NDArrayContainer<float>* readArray<float>(const char* varname, unsigned long index = 0) {
-        boost::shared_ptr< ISMRMRD::NDArrayContainer<float> > tmp = $self->readArray<float>(varname,index);
-        ISMRMRD::NDArrayContainer<float>* img = new ISMRMRD::NDArrayContainer<float>(tmp->dimensions_, tmp->data_);
-        return img;
-    }
-
-    ISMRMRD::NDArrayContainer<double>* readArray<double>(const char* varname, unsigned long index = 0) {
-        boost::shared_ptr< ISMRMRD::NDArrayContainer<double> > tmp = $self->readArray<double>(varname,index);
-        ISMRMRD::NDArrayContainer<double>* img = new ISMRMRD::NDArrayContainer<double>(tmp->dimensions_, tmp->data_);
-        return img;
-    }
+    // Image Data
+    PyObject* readArray(ISMRMRD::ImageHeader *hdr, const char* varname, unsigned long index = 0)
+    {
+        PyObject *array = NULL;
+        if (!hdr) {
+            return NULL;
+        }
 
-    ISMRMRD::NDArrayContainer<unsigned short>* readArray<unsigned short>(const char* varname, unsigned long index = 0) {
-        boost::shared_ptr< ISMRMRD::NDArrayContainer<unsigned short> > tmp = $self->readArray<unsigned short>(varname,index);
-        ISMRMRD::NDArrayContainer<unsigned short>* img = new ISMRMRD::NDArrayContainer<unsigned short>(tmp->dimensions_, tmp->data_);
-        return img;
+        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;
     }
 
-    ISMRMRD::NDArrayContainer< cxfloat >* readArray< cxfloat >(const char* varname, unsigned long index = 0) {
-        boost::shared_ptr< ISMRMRD::NDArrayContainer<cxfloat> >  tmp = $self->readArray< cxfloat >(varname,index);
-        ISMRMRD::NDArrayContainer<cxfloat>* img = new ISMRMRD::NDArrayContainer< cxfloat >(tmp->dimensions_, tmp->data_);
-        return img;
-    }
+    int appendArray(PyObject *array, const char* varname)
+    {
+        if (!PyArray_Check(array)) {
+            set_err("Array arg to appendArray is not a numpy array\n");
+            return -1;
+        } else if (!PyArray_ISBEHAVED_RO(array)) {
+            set_err("Array arg to appendArray must be aligned and in machine byte-order\n");
+            return -1;
+        }
 
-    ISMRMRD::NDArrayContainer<cxdouble>* readArray<cxdouble>(const char* varname, unsigned long index = 0) {
-        boost::shared_ptr< ISMRMRD::NDArrayContainer<cxdouble> > tmp = $self->readArray<cxdouble>(varname,index);
-        ISMRMRD::NDArrayContainer<cxdouble>* img = new ISMRMRD::NDArrayContainer<cxdouble>(tmp->dimensions_, tmp->data_);
-        return img;
+        int ndim = PyArray_NDIM(array);
+        npy_intp* dims = PyArray_DIMS(array);
+
+        std::vector<unsigned int> dimensions;
+        for (int d = 0; d < ndim; d++) {
+            dimensions.push_back(dims[d]);
+        }
+
+        int ret = 0;
+        switch (PyArray_TYPE(array)) {
+            case NPY_USHORT: {
+                npy_ushort *raw = (npy_ushort*)PyArray_DATA(array);
+                ret = $self->appendArray(dimensions, raw, varname);
+                break;
+            }
+            case NPY_FLOAT: {
+                npy_float *raw = (npy_float*)PyArray_DATA(array);
+                ret = $self->appendArray(dimensions, raw, varname);
+                break;
+            }
+            case NPY_DOUBLE: {
+                npy_double *raw = (npy_double*)PyArray_DATA(array);
+                ret = $self->appendArray(dimensions, raw, varname);
+                break;
+            }
+            case NPY_CFLOAT: {
+                npy_cfloat *raw = (npy_cfloat*)PyArray_DATA(array);
+                ret = $self->appendArray(dimensions, (std::complex<float>*)raw, varname);
+                break;
+            }
+            case NPY_CDOUBLE: {
+                npy_cdouble *raw = (npy_cdouble*)PyArray_DATA(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;
 
-//
-// The header files to process
-//
+// Process the main ISMRMRD header
 %include "ismrmrd.h"
 
-// These defines are needed for the HDF5 stuff to work
+// These definitions are needed for the HDF5 stuff to work
 %define EXPORTISMRMRD %enddef
-namespace H5 {
-   
-}
+namespace H5 { }
 
+// Process the HDF5 ISMRMD headers
 %include "ismrmrd_hdf5.h"
 %include "ismrmrd_hdf5_datatypes.h"
-
-// Instantiate some of the overloaded objects and methods
-namespace ISMRMRD {
-    // The Image and ArrayContainer types
-    %template(Image_ushort)   Image<unsigned short int>;
-    %template(Image_float)    Image<float>;
-    %template(Image_double)   Image<double>;
-    %template(Image_cxfloat)  Image<cxfloat>;
-    %template(Image_cxdouble) Image<cxdouble>;
-
-    %template(Array_ushort)   NDArrayContainer<unsigned short int>;
-    %template(Array_float)    NDArrayContainer<float>;
-    %template(Array_double)   NDArrayContainer<double>;
-    %template(Array_cxfloat)  NDArrayContainer<cxfloat>;
-    %template(Array_cxdouble) NDArrayContainer<cxdouble>;
-
-    // The Image and ArrayContainer Append methods
-    %template(appendImage_ushort)   IsmrmrdDataset::appendImage<unsigned short int>;
-    %template(appendImage_float)    IsmrmrdDataset::appendImage<float>;
-    %template(appendImage_double)   IsmrmrdDataset::appendImage<double>;
-    %template(appendImage_cxfloat)  IsmrmrdDataset::appendImage<cxfloat>;
-    %template(appendImage_cxdouble) IsmrmrdDataset::appendImage<cxdouble>;
-
-    %template(appendArray_ushort)   IsmrmrdDataset::appendArray<unsigned short int>;
-    %template(appendArray_float)    IsmrmrdDataset::appendArray<float>;
-    %template(appendArray_double)   IsmrmrdDataset::appendArray<double>;
-    %template(appendArray_cxfloat)  IsmrmrdDataset::appendArray<cxfloat>;
-    %template(appendArray_cxdouble) IsmrmrdDataset::appendArray<cxdouble>;
-
-}

-- 
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