[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