[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