[ismrmrd] 01/05: Imported Upstream version 0.5.2+git20140609
Ghislain Vaillant
ghisvail-guest at moszumanska.debian.org
Wed Jun 11 15:15:25 UTC 2014
This is an automated email from the git hooks/post-receive script.
ghisvail-guest pushed a commit to branch master
in repository ismrmrd.
commit 1eb8851132cea6328c1ea83f9b95086c2ab9b62f
Author: Ghislain Antony Vaillant <ghisvail at gmail.com>
Date: Wed Jun 11 12:42:30 2014 +0100
Imported Upstream version 0.5.2+git20140609
---
CMakeLists.txt | 138 ++++++++++++++++------
bindings/java/CMakeLists.txt | 9 +-
bindings/java/make_jar.sh.in | 0
bindings/python/CMakeLists.txt | 25 ++--
bindings/python/ismrmrd_python.i | 53 ++++++++-
cmake/FindIsmrmrd.cmake | 11 +-
examples/c++/CMakeLists.txt | 58 ++++++----
examples/python/ismrmrd_create_dataset.py | 165 +++++++++++++++++++++++++++
examples/python/ismrmrd_recon_dataset.py | 125 ++++++++++++++++++++
examples/python/ismrmrd_test.py | 22 ----
ismrmrd.h | 33 +++---
ismrmrd_hdf5.cpp | 120 ++++++++++++++++++-
ismrmrd_hdf5.h | 13 +++
ismrmrd_hdf5_datatypes.h | 7 ++
matlab/CMakeLists.txt | 8 +-
schema/ismrmrd.xsd | 45 +++++---
tests/c++/CMakeLists.txt | 28 +++--
tests/c++/t_ndarraycontainer.cpp | 35 +++---
tests/c/CMakeLists.txt | 5 +-
tests/c/t_cstructs.cpp | 14 +--
utilities/CMakeLists.txt | 44 ++++---
utilities/generate_cartesian_shepp_logan.cpp | 2 +-
22 files changed, 768 insertions(+), 192 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 49d1ba1..cd406f1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,54 +3,120 @@ project(ISMRMRD)
enable_testing()
+#Set the build type to Release if not specified
+IF(NOT CMAKE_BUILD_TYPE)
+ SET(CMAKE_BUILD_TYPE Release CACHE STRING
+ "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
+ FORCE)
+ENDIF(NOT CMAKE_BUILD_TYPE)
+
+# define install paths globally
+set(ISMRMRD_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/ismrmrd)
+set(ISMRMRD_INSTALL_LIB_DIR ${ISMRMRD_INSTALL_PREFIX}/lib)
+set(ISMRMRD_INSTALL_INCLUDE_DIR ${ISMRMRD_INSTALL_PREFIX}/include)
+set(ISMRMRD_INSTALL_BIN_DIR ${ISMRMRD_INSTALL_PREFIX}/bin)
+set(ISMRMRD_INSTALL_MODULE_DIR ${ISMRMRD_INSTALL_PREFIX}/cmake)
+set(ISMRMRD_INSTALL_SCHEMA_DIR ${ISMRMRD_INSTALL_PREFIX}/schema)
+set(ISMRMRD_INSTALL_MATLAB_DIR ${ISMRMRD_INSTALL_PREFIX}/matlab)
+set(ISMRMRD_INSTALL_JAVA_DIR ${ISMRMRD_INSTALL_PREFIX}/java)
+set(ISMRMRD_INSTALL_PYTHON_DIR ${ISMRMRD_INSTALL_PREFIX}/python)
+set(ISMRMRD_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+set(ISMRMRD_MODULE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+set(ISMRMRD_SCHEMA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/schema)
+set(ISMRMRD_SCHEMA_SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/xsd)
+
+# add project specific cmake find modules
+list(APPEND CMAKE_MODULE_PATH ${ISMRMRD_MODULE_DIR})
+
if (WIN32)
-ADD_DEFINITIONS(-DWIN32 -D_WIN32 -D_WINDOWS)
-ADD_DEFINITIONS(-DUNICODE -D_UNICODE)
-ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
-SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
-SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
+ add_definitions(-DWIN32 -D_WIN32 -D_WINDOWS)
+ add_definitions(-DUNICODE -D_UNICODE)
+ add_definitions(-D_CRT_SECURE_NO_WARNINGS)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
+ set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO")
+ set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO")
+ set(CMAKE_STATIC_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO")
+ set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO")
endif (WIN32)
-set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/ismrmrd)
-list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
+# required packages for main library
+find_package(Boost COMPONENTS thread system REQUIRED)
+find_package(HDF5 1.8 COMPONENTS C CXX HL REQUIRED)
+
+if(WIN32)
+ set(Boost_NO_BOOST_CMAKE ON)
+endif(WIN32)
+if(WIN32)
+ add_definitions( -DBOOST_ALL_NO_LIB )
+ add_definitions( -DBOOST_ALL_DYN_LINK )
+endif(WIN32)
+
+add_library(ismrmrd SHARED ismrmrd_hdf5.cpp)
+include_directories(${HDF5_C_INCLUDE_DIR} ${HDF5_CXX_INCLUDE_DIR}
+ ${Boost_INCLUDE_DIR})
+
+#The findHDF5.cmake does not work very well on Windows, let's help it out
+if(WIN32)
+ target_link_libraries(ismrmrd optimized ${HDF5_hdf5_LIBRARY_RELEASE}
+ optimized ${HDF5_hdf5_cpp_LIBRARY_RELEASE})
+ target_link_libraries(ismrmrd debug ${HDF5_hdf5_LIBRARY_DEBUG}
+ debug ${HDF5_hdf5_cpp_LIBRARY_DEBUG})
+ target_link_libraries(ismrmrd ${Boost_LIBRARIES})
+else(WIN32)
+ target_link_libraries(ismrmrd ${HDF5_LIBRARIES} ${Boost_THREAD_LIBRARY}
+ ${Boost_SYSTEM_LIBRARY})
+endif(WIN32)
+
+install(TARGETS ismrmrd
+ DESTINATION ${ISMRMRD_INSTALL_LIB_DIR})
+
+install(FILES ${ISMRMRD_SOURCE_DIR}/ismrmrd.h
+ ${ISMRMRD_SOURCE_DIR}/ismrmrd_hdf5.h
+ ${ISMRMRD_SOURCE_DIR}/ismrmrd_hdf5_datatypes.h
+ ${ISMRMRD_SOURCE_DIR}/ismrmrd_export.h
+ DESTINATION ${ISMRMRD_INSTALL_INCLUDE_DIR})
+
+# required packages for support xsd library
find_package(XSD REQUIRED)
find_package(XercesC REQUIRED)
-set(Boost_NO_BOOST_CMAKE ON)
-find_package(Boost COMPONENTS thread system REQUIRED)
-find_package(HDF5 1.8 COMPONENTS C CXX REQUIRED)
+# process the XSD files
+set(XSDS ${ISMRMRD_SCHEMA_DIR}/ismrmrd.xsd)
+set(XSD_ARGS cxx-tree --generate-serialization)
+if ( WIN32 )
+ SET(XSD_ARGS cxx-tree --generate-serialization --export-symbol EXPORTISMRMRDXSD --hxx-prologue-file ${CMAKE_SOURCE_DIR}/ismrmrd_xsd_export.h)
+endif (WIN32)
-#Process the XSD files
-SET(XSDS schema/ismrmrd.xsd)
-SET(XSD_ARGS cxx-tree --generate-serialization)
-#SET(XSD_ARGS cxx-tree --generate-serialization --export-symbol EXPORTISMRMRDXSD --hxx-prologue-file ${CMAKE_SOURCE_DIR}/ismrmrd_xsd_export.h)
-WRAP_XSD(XSDS_SOURCES XSD_INCLUDES ${CMAKE_CURRENT_BINARY_DIR}/schema ${XSDS} OPTIONS ${XSD_ARGS})
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/src/xsd ${XSD_INCLUDE_DIR} ${XERCESC_INCLUDE_DIR} ${Boost_INCLUDE_DIR} ${HDF5_CXX_INCLUDE_DIR} ${HDF5_C_INCLUDE_DIR})
-LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
+wrap_xsd(XSDS_SOURCES XSD_INCLUDES ${CMAKE_CURRENT_BINARY_DIR}/schema ${XSDS} OPTIONS ${XSD_ARGS})
-# This dummy is required to trigger autogeneration of ${XSDS_SOURCES}
-add_library(dummy SHARED ${XSDS_SOURCES})
-target_link_libraries(dummy ${XERCESC_LIBRARIES})
+if ( WIN32 )
+ include_directories(${ISMRMRD_SCHEMA_SOURCE_DIR} ${XSD_INCLUDE_DIR}
+ ${XERCESC_INCLUDE_DIR} ${Boost_INCLUDE_DIR} ${HDF5_CXX_INCLUDE_DIR}
+ ${HDF5_C_INCLUDE_DIR})
+ link_directories(${Boost_LIBRARY_DIRS})
+endif ( WIN32 )
-# Add library ismrmrd
-add_library(ismrmrd SHARED ismrmrd_hdf5.cpp)
+if ( NOT WIN32 )
+ add_library(ismrmrd_xsd SHARED ${XSDS_SOURCES})
+ include_directories(${XERCESC_INCLUDE_DIR})
+ target_link_libraries(ismrmrd_xsd ${XERCESC_LIBRARIES})
+endif ( NOT WIN32 )
-#The findHDF5.cmake does not work very well on Windows, let's help it out
-IF(WIN32)
- target_link_libraries(ismrmrd optimized ${HDF5_hdf5_LIBRARY_RELEASE} ${HDF5_hdf5_cpp_LIBRARY_RELEASE})
- target_link_libraries(ismrmrd debug ${HDF5_hdf5_LIBRARY_DEBUG} ${HDF5_hdf5_cpp_LIBRARY_DEBUG})
+install(FILES ${XSDS} ${XSDS_SOURCES}
+ DESTINATION ${ISMRMRD_INSTALL_SCHEMA_DIR})
- target_link_libraries(ismrmrd ${Boost_LIBRARIES})
-ELSE (WIN32)
- target_link_libraries(ismrmrd ${HDF5_LIBRARIES} ${Boost_LIBRARIES})
-ENDIF(WIN32)
-
-INSTALL(FILES ismrmrd.h ismrmrd_hdf5.h ismrmrd_hdf5_datatypes.h ismrmrd_export.h DESTINATION include)
-INSTALL(FILES schema/ismrmrd.xsd ${XSDS_SOURCES} DESTINATION schema)
-INSTALL(FILES cmake/FindIsmrmrd.cmake cmake/FindFFTW3.cmake cmake/FindXSD.cmake
- cmake/FindXercesC.cmake cmake/FindNumPy.cmake DESTINATION cmake)
-INSTALL(TARGETS ismrmrd DESTINATION lib)
+if ( NOT WIN32 )
+ install(TARGETS ismrmrd_xsd DESTINATION ${ISMRMRD_INSTALL_LIB_DIR})
+endif ( NOT WIN32 )
+
+install(FILES ${ISMRMRD_MODULE_DIR}/FindIsmrmrd.cmake
+ ${ISMRMRD_MODULE_DIR}/FindFFTW3.cmake
+ ${ISMRMRD_MODULE_DIR}/FindXSD.cmake
+ ${ISMRMRD_MODULE_DIR}/FindXercesC.cmake
+ ${ISMRMRD_MODULE_DIR}/FindNumPy.cmake
+ DESTINATION ${ISMRMRD_INSTALL_MODULE_DIR})
add_subdirectory(examples/c++)
add_subdirectory(utilities)
diff --git a/bindings/java/CMakeLists.txt b/bindings/java/CMakeLists.txt
index 1355612..503c7f9 100644
--- a/bindings/java/CMakeLists.txt
+++ b/bindings/java/CMakeLists.txt
@@ -33,9 +33,12 @@ add_custom_command(
)
add_custom_target(ismrmrdjar ALL DEPENDS ${JAVA_OUTPUTS})
-install(TARGETS jismrmrd DESTINATION java)
-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ismrmrd.jar DESTINATION java)
+install(TARGETS jismrmrd
+ DESTINATION ${ISMRMRD_INSTALL_JAVA_DIR})
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ismrmrd.jar
+ DESTINATION ${ISMRMRD_INSTALL_JAVA_DIR})
# Note: the API documentation is only for the XML header, and is installed
# in ${INSTALL_PREFIX}/matlab/doc
-install(DIRECTORY ${JAVADOC_OUTPUT} DESTINATION matlab)
+install(DIRECTORY ${JAVADOC_OUTPUT}
+ DESTINATION ${ISMRMRD_INSTALL_MATLAB_DIR})
diff --git a/bindings/java/make_jar.sh.in b/bindings/java/make_jar.sh.in
old mode 100644
new mode 100755
diff --git a/bindings/python/CMakeLists.txt b/bindings/python/CMakeLists.txt
index 8a86456..29bc524 100644
--- a/bindings/python/CMakeLists.txt
+++ b/bindings/python/CMakeLists.txt
@@ -9,17 +9,27 @@ endif ( WIN32 )
set_source_files_properties(ismrmrd_python.i PROPERTIES CPLUSPLUS ON)
swig_add_module(ismrmrd python ismrmrd_python.i ${CMAKE_SOURCE_DIR}/ismrmrd_hdf5.cpp)
-swig_link_libraries(ismrmrd ${HDF5_LIBRARIES} ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
-install(TARGETS ${SWIG_MODULE_ismrmrd_REAL_NAME} DESTINATION python)
-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ismrmrd.py DESTINATION python)
+IF(WIN32)
+ swig_link_libraries(ismrmrd optimized ${HDF5_hdf5_LIBRARY_RELEASE} optimized ${HDF5_hdf5_cpp_LIBRARY_RELEASE})
+ swig_link_libraries(ismrmrd debug ${HDF5_hdf5_LIBRARY_DEBUG} debug ${HDF5_hdf5_cpp_LIBRARY_DEBUG})
+ swig_link_libraries(ismrmrd ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
+ELSE (WIN32)
+ swig_link_libraries(ismrmrd ${HDF5_LIBRARIES} ${Boost_THREAD_LIBRARY}
+ ${Boost_SYSTEM_LIBRARY} ${PYTHON_LIBRARIES})
+ENDIF(WIN32)
+
+install(TARGETS ${SWIG_MODULE_ismrmrd_REAL_NAME}
+ DESTINATION ${ISMRMRD_INSTALL_PYTHON_DIR})
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ismrmrd.py
+ DESTINATION ${ISMRMRD_INSTALL_PYTHON_DIR})
find_program(PYXBGEN pyxbgen
HINTS ${PYTHON_HOME} ${PYTHON_LIBRARY}/..
PATH_SUFFIXES bin)
if(PYXBGEN)
- set(SCHEMA "${CMAKE_SOURCE_DIR}/schema/ismrmrd.xsd")
+ set(SCHEMA "${ISMRMRD_SCHEMA_DIR}/ismrmrd.xsd")
set(XSD_PY_FILE "${CMAKE_CURRENT_BINARY_DIR}/ismrmrd_xsd.py")
set(XSD_PY_DIR "${CMAKE_CURRENT_BINARY_DIR}/raw")
@@ -32,9 +42,10 @@ if(PYXBGEN)
add_custom_target(pyismrmrd_xsd ALL DEPENDS ${XSD_PY_FILE})
- install(FILES ${XSD_PY_FILE} DESTINATION python)
- install(DIRECTORY ${XSD_PY_DIR} DESTINATION python)
-
+ install(FILES ${XSD_PY_FILE}
+ DESTINATION ${ISMRMRD_INSTALL_PYTHON_DIR})
+ install(DIRECTORY ${XSD_PY_DIR}
+ DESTINATION ${ISMRMRD_INSTALL_PYTHON_DIR})
else(PYXBGEN)
message("Can't find pyxbgen executable. Not building ismrmrd_xsd.py")
endif(PYXBGEN)
diff --git a/bindings/python/ismrmrd_python.i b/bindings/python/ismrmrd_python.i
index c564a1f..8753046 100644
--- a/bindings/python/ismrmrd_python.i
+++ b/bindings/python/ismrmrd_python.i
@@ -157,11 +157,62 @@
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
diff --git a/cmake/FindIsmrmrd.cmake b/cmake/FindIsmrmrd.cmake
index 07a3d3a..bfece66 100644
--- a/cmake/FindIsmrmrd.cmake
+++ b/cmake/FindIsmrmrd.cmake
@@ -3,6 +3,7 @@
# ISMRMRD_INCLUDE_DIR - where to find ismrmrd.h, etc.
# ISMRMRD_LIBRARIES - libismrmrd.so.
# ISMRMRD_XSD_INCLUDE_DIR - folder containing ismrmrd.hxx (autogenerated from xsd schema)
+# ISMRMRD_XSD_LIBRARIES - libismrmrd_xsd.so
# ISMRMRD_XSD_SOURCE - full path to ismrmrd.cxx (autogenerated from xsd schema)
# ISMRMRD_SCHEMA_DIR - where to find ismrmrd.xsd
@@ -10,18 +11,22 @@ FIND_PATH( ISMRMRD_INCLUDE_DIR ismrmrd.h
HINTS $ENV{ISMRMRD_HOME} PATHS /usr/local /usr PATH_SUFFIXES include ismrmrd ismrmrd/include)
FIND_PATH( ISMRMRD_XSD_INCLUDE_DIR ismrmrd.hxx
-HINTS $ENV{ISMRMRD_HOME} PATHS /usr/local /usr PATH_SUFFIXES schema ismrmrd ismrmrd/schema)
+HINTS $ENV{ISMRMRD_HOME} PATHS /usr/local /usr /usr/lib PATH_SUFFIXES schema ismrmrd ismrmrd/schema)
FIND_PATH( ISMRMRD_SCHEMA_DIR ismrmrd.xsd
-HINTS $ENV{ISMRMRD_HOME} PATHS /usr/local /usr PATH_SUFFIXES schema ismrmrd ismrmrd/schema)
+HINTS $ENV{ISMRMRD_HOME} PATHS /usr/local /usr /usr/lib PATH_SUFFIXES schema ismrmrd ismrmrd/schema)
FIND_LIBRARY( ISMRMRD_LIBRARIES
NAMES "ismrmrd"
PATHS /usr/local/lib ${ISMRMRD_INCLUDE_DIR}/../lib /usr/lib )
+FIND_LIBRARY( ISMRMRD_XSD_LIBRARIES
+ NAMES "ismrmrd_xsd"
+ PATHS /usr/local/lib ${ISMRMRD_INCLUDE_DIR}/../lib /usr/lib )
+
FIND_FILE( ISMRMRD_XSD_SOURCE
NAMES "ismrmrd.cxx"
- HINTS $ENV{ISMRMRD_HOME} PATHS /usr/local /usr PATH_SUFFIXES schema ismrmrd ismrmrd/schema)
+ HINTS $ENV{ISMRMRD_HOME} PATHS /usr/local /usr /usr/lib PATH_SUFFIXES schema ismrmrd ismrmrd/schema)
INCLUDE( "FindPackageHandleStandardArgs" )
FIND_PACKAGE_HANDLE_STANDARD_ARGS( "Ismrmrd" DEFAULT_MSG ISMRMRD_INCLUDE_DIR ISMRMRD_LIBRARIES ISMRMRD_SCHEMA_DIR)
diff --git a/examples/c++/CMakeLists.txt b/examples/c++/CMakeLists.txt
index 7eee4c4..93b268c 100644
--- a/examples/c++/CMakeLists.txt
+++ b/examples/c++/CMakeLists.txt
@@ -1,28 +1,36 @@
find_package(FFTW3 COMPONENTS single)
-SET_SOURCE_FILES_PROPERTIES(${XSDS_SOURCES} PROPERTIES GENERATED TRUE )
-
-IF(FFTW3_FOUND)
- MESSAGE("FFTW3 Found, building test applications")
- INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../.. ${FFTW3_INCLUDE_DIR})
-
- add_executable(ismrmrd_create_dataset test_create_dataset.cpp ${XSDS_SOURCES})
- target_link_libraries(ismrmrd_create_dataset ${XERCESC_LIBRARIES} ismrmrd ${FFTW3_LIBRARIES})
- INSTALL(TARGETS ismrmrd_create_dataset DESTINATION bin)
-
- add_executable(ismrmrd_recon_dataset test_recon_dataset.cpp ${XSDS_SOURCES})
- target_link_libraries(ismrmrd_recon_dataset ${XERCESC_LIBRARIES} ismrmrd ${FFTW3_LIBRARIES})
- INSTALL(TARGETS ismrmrd_recon_dataset DESTINATION bin)
-
- add_executable(ismrmrd_publication_recon publication_recon_dataset.cpp ${XSDS_SOURCES})
- target_link_libraries(ismrmrd_publication_recon ${XERCESC_LIBRARIES} ismrmrd ${FFTW3_LIBRARIES})
- INSTALL(TARGETS ismrmrd_publication_recon DESTINATION bin)
-
- add_executable(read_timing_test read_timing_test.cpp ${XSDS_SOURCES})
- target_link_libraries(read_timing_test ${XERCESC_LIBRARIES} ismrmrd ${FFTW3_LIBRARIES})
- INSTALL(TARGETS read_timing_test DESTINATION bin)
-
-ELSE(FFTW3_FOUND)
- MESSAGE("FFTW3 NOT Found....cannot build test applications")
-ENDIF(FFTW3_FOUND)
+if(FFTW3_FOUND)
+ message("FFTW3 Found, building examples")
+ include_directories(${ISMRMRD_SOURCE_DIR} ${ISMRMRD_SCHEMA_SOURCE_DIR}
+ ${FFTW3_INCLUDE_DIR})
+ if(WIN32)
+ # building with xsd sources on Windows
+ set_source_files_properties(${XSDS_SOURCES} PROPERTIES GENERATED TRUE)
+ add_executable(ismrmrd_create_dataset test_create_dataset.cpp ${XSDS_SOURCES})
+ target_link_libraries(ismrmrd_create_dataset ${XERCESC_LIBRARIES} ismrmrd ${FFTW3_LIBRARIES})
+ add_executable(ismrmrd_recon_dataset test_recon_dataset.cpp ${XSDS_SOURCES})
+ target_link_libraries(ismrmrd_recon_dataset ${XERCESC_LIBRARIES} ismrmrd ${FFTW3_LIBRARIES})
+ add_executable(ismrmrd_publication_recon publication_recon_dataset.cpp ${XSDS_SOURCES})
+ target_link_libraries(ismrmrd_publication_recon ${XERCESC_LIBRARIES} ismrmrd ${FFTW3_LIBRARIES})
+ add_executable(read_timing_test read_timing_test.cpp ${XSDS_SOURCES})
+ target_link_libraries(read_timing_test ${XERCESC_LIBRARIES} ismrmrd ${FFTW3_LIBRARIES})
+ else(WIN32)
+ # linking with ismrmrd_xsd on Linux / OSX
+ add_executable(ismrmrd_create_dataset test_create_dataset.cpp)
+ target_link_libraries(ismrmrd_create_dataset ismrmrd ismrmrd_xsd ${FFTW3_LIBRARIES})
+ add_executable(ismrmrd_recon_dataset test_recon_dataset.cpp)
+ target_link_libraries(ismrmrd_recon_dataset ismrmrd ismrmrd_xsd ${FFTW3_LIBRARIES})
+ add_executable(ismrmrd_publication_recon publication_recon_dataset.cpp)
+ target_link_libraries(ismrmrd_publication_recon ismrmrd ismrmrd_xsd ${FFTW3_LIBRARIES})
+ add_executable(read_timing_test read_timing_test.cpp)
+ target_link_libraries(read_timing_test ismrmrd ismrmrd_xsd ${FFTW3_LIBRARIES})
+ endif(WIN32)
+ install(TARGETS ismrmrd_create_dataset DESTINATION ${ISMRMRD_INSTALL_BIN_DIR})
+ install(TARGETS ismrmrd_recon_dataset DESTINATION ${ISMRMRD_INSTALL_BIN_DIR})
+ install(TARGETS ismrmrd_publication_recon DESTINATION ${ISMRMRD_INSTALL_BIN_DIR})
+ install(TARGETS read_timing_test DESTINATION ${ISMRMRD_INSTALL_BIN_DIR})
+else(FFTW3_FOUND)
+ message("FFTW3 NOT Found, cannot build examples")
+endif(FFTW3_FOUND)
diff --git a/examples/python/ismrmrd_create_dataset.py b/examples/python/ismrmrd_create_dataset.py
new file mode 100644
index 0000000..1a14ce2
--- /dev/null
+++ b/examples/python/ismrmrd_create_dataset.py
@@ -0,0 +1,165 @@
+# coding: utf-8
+import os
+import ismrmrd
+import ismrmrd_xsd
+import numpy as np
+import matplotlib.pyplot as plt
+
+
+filename = 'testdata.h5'
+if os.path.isfile(filename):
+ os.remove(filename)
+# Create an empty ISMRMRD dataset
+dset = ismrmrd.IsmrmrdDataset(filename, 'dataset')
+
+# Synthesize the object
+nX, nY = 256, 256
+rho = np.zeros((nX, nY))
+x0, x1 = nX / 4, 3 * nX / 4
+y0, y1 = nY / 4, 3 * nY / 4
+rho[x0:x1, y0:y1] = 1
+
+plt.imshow(rho)
+
+# Synthesize some coil sensitivities
+X, Y = np.meshgrid(np.arange(nX) / nX / 2.0, np.arange(nY) / nY / 2.0)
+C = np.zeros((nX, nY, 4), dtype=np.complex64)
+C[:,:,0] = np.exp(-((X - 0.5) ** 2 + Y ** 2) + 1j * (X - 0.5))
+C[:,:,1] = np.exp(-((X + 0.5) ** 2 + Y ** 2) - 1j * (X + 0.5))
+C[:,:,2] = np.exp(-(X ** 2 + (Y - 0.5) ** 2) + 1j * (Y - 0.5))
+C[:,:,3] = np.exp(-(X ** 2 + (Y + 0.5) ** 2) - 1j * (Y + 0.5))
+ncoils = np.size(C, 2)
+
+# Synthesize the k-space data
+nreps = 5
+noiselevel = 0.05
+K = np.zeros((nX, nY, ncoils, nreps), dtype=np.complex64)
+for rep in range(nreps):
+ for coil in range(ncoils):
+ noise = noiselevel * (np.random.randn(nX, nY) + 1j * np.random.randn(nX, nY))
+ K[:,:,coil,rep] = np.fft.fftshift(np.fft.fft2(np.fft.fftshift(C[:,:,coil] * rho + noise)))
+
+rep0 = np.sqrt(np.sum(np.abs(K) ** 2, 2))
+plt.imshow(rep0[:,:,0])
+
+# Append a block of acquisitions, one repetition at a time (faster than one acquisition at a time)
+# Re-use the same Acquisition object because why not?
+acq = ismrmrd.Acquisition()
+for rep in range(nreps):
+ for line in range(nY):
+ head = ismrmrd.AcquisitionHeader()
+ head.version = 1
+ head.number_of_samples = nX
+ head.center_sample = nX / 2
+ head.active_channels = ncoils
+ rd, pd, sd = ismrmrd.floatArray(3), ismrmrd.floatArray(3), ismrmrd.floatArray(3)
+ rd[0] = 1; pd[1] = 1; sd[2] = 1
+ head.read_dir = rd
+ head.phase_dir = pd
+ head.slice_dir = sd
+ head.scan_counter = rep * nY + line
+ head.idx.kspace_encode_step_1 = line
+ head.idx.repetition = rep
+
+ # Note: the correct API for setting Acquisition flags looks like this:
+ # acq.setFlag(ismrmrd.FlagBit(ismrmrd.ACQ_FIRST_IN_ENCODE_STEP1))
+ # but using this API would require using only ugly "acq.setXXX" methods
+ # since the call to "acq.setHead()" below overwrites the Acquisition's header
+ head.flags = 0
+ if line == 0:
+ head.flags |= 1 << ismrmrd.ACQ_LAST_IN_ENCODE_STEP1
+ head.flags |= 1 << ismrmrd.ACQ_FIRST_IN_SLICE
+ head.flags |= 1 << ismrmrd.ACQ_FIRST_IN_REPETITION
+ elif line == nY - 1:
+ head.flags |= 1 << ismrmrd.ACQ_LAST_IN_ENCODE_STEP1
+ head.flags |= 1 << ismrmrd.ACQ_LAST_IN_SLICE
+ head.flags |= 1 << ismrmrd.ACQ_LAST_IN_REPETITION
+
+ acq.setHead(head)
+ # copy the array to ensure it's a continuous block of memory
+ data = np.zeros((2 * nX, ncoils), dtype=np.float32)
+ data[::2] = np.array([c.real for c in np.array(K[:,line,:,rep])])
+ data[1::2] = np.array([c.imag for c in np.array(K[:,line,:,rep])])
+ acq.setData(data.flatten())
+ dset.appendAcquisition(acq)
+
+
+# Fill the XML header
+header = ismrmrd_xsd.ismrmrdHeader()
+
+# Experimental Conditions
+exp = ismrmrd_xsd.experimentalConditionsType()
+exp.H1resonanceFrequency_Hz = 128000000
+header.experimentalConditions = exp
+
+# Acquisition System Information
+sys = ismrmrd_xsd.acquisitionSystemInformationType()
+sys.receiverChannels = ncoils
+header.acquisitionSystemInformation = sys
+
+# Encoding
+encoding = ismrmrd_xsd.encoding()
+encoding.trajectory = ismrmrd_xsd.trajectoryType.cartesian
+
+# Encoded Space
+fov = ismrmrd_xsd.fieldOfView_mm()
+fov.x = 256
+fov.y = 256
+fov.z = 5
+
+matrix = ismrmrd_xsd.matrixSize()
+matrix.x = np.size(K, 0)
+matrix.y = np.size(K, 1)
+matrix.z = 1
+
+space = ismrmrd_xsd.encodingSpaceType()
+space.matrixSize = matrix
+space.fieldOfView_mm = fov
+
+# Set encoded and recon space (same)
+encoding.encodedSpace = space
+encoding.reconSpace = space
+
+# Encoding limits
+limits = ismrmrd_xsd.encodingLimitsType()
+
+limits0 = ismrmrd_xsd.limitType()
+limits0.minimum = 0
+limits0.center = np.size(K, 0) / 2
+limits0.maximum = np.size(K, 0) - 1
+limits.kspaceEncodingStep0 = limits0
+
+limits1 = ismrmrd_xsd.limitType()
+limits1.minimum = 0
+limits1.center = np.size(K, 1) / 2
+limits1.maximum = np.size(K, 1) - 1
+limits.kspaceEncodingStep1 = limits1
+
+limits_rep = ismrmrd_xsd.limitType()
+limits_rep.minimum = 0
+limits_rep.center = nreps / 2
+limits_rep.maximum = nreps - 1
+limits.repetition = limits_rep
+
+limits_slice = ismrmrd_xsd.limitType()
+limits_slice.minimum = 0
+limits_slice.center = 0
+limits_slice.maximum = 0
+limits.slice = limits_slice
+
+limits_rest = ismrmrd_xsd.limitType()
+limits_rest.minimum = 0
+limits_rest.center = 0
+limits_rest.maximum = 0
+limits.average = limits_rest
+limits.contrast = limits_rest
+limits.kspaceEncodingStep2 = limits_rest
+limits.phase = limits_rest
+limits.segment = limits_rest
+limits.set = limits_rest
+
+encoding.encodingLimits = limits
+header.encoding.append(encoding)
+
+dset.writeHeader(header.toxml('utf-8'))
+dset.close()
diff --git a/examples/python/ismrmrd_recon_dataset.py b/examples/python/ismrmrd_recon_dataset.py
new file mode 100644
index 0000000..a7f6803
--- /dev/null
+++ b/examples/python/ismrmrd_recon_dataset.py
@@ -0,0 +1,125 @@
+# coding: utf-8
+
+import os
+import ismrmrd
+import ismrmrd_xsd
+import numpy as np
+from numpy.fft import ifft, fftshift
+import matplotlib.pyplot as plt
+
+# Load file
+filename = 'testdata.h5'
+if not os.path.isfile(filename):
+ print("%s is not a valid file" % filename)
+ raise SystemExit
+dset = ismrmrd.IsmrmrdDataset(filename, 'dataset')
+
+header = ismrmrd_xsd.CreateFromDocument(dset.readHeader())
+enc = header.encoding[0]
+
+# Matrix size
+eNx = enc.encodedSpace.matrixSize.x
+eNy = enc.encodedSpace.matrixSize.y
+eNz = enc.encodedSpace.matrixSize.z
+rNx = enc.reconSpace.matrixSize.x
+rNy = enc.reconSpace.matrixSize.y
+rNz = enc.reconSpace.matrixSize.z
+
+# Field of View
+eFOVx = enc.encodedSpace.fieldOfView_mm.x
+eFOVy = enc.encodedSpace.fieldOfView_mm.y
+eFOVz = enc.encodedSpace.fieldOfView_mm.z
+rFOVx = enc.reconSpace.fieldOfView_mm.x
+rFOVy = enc.reconSpace.fieldOfView_mm.y
+rFOVz = enc.reconSpace.fieldOfView_mm.z
+
+# Number of Slices, Reps, Contrasts, etc.
+nslices = enc.encodingLimits.slice.maximum + 1
+ncoils = header.acquisitionSystemInformation.receiverChannels
+nreps = enc.encodingLimits.repetition.maximum + 1
+ncontrasts = enc.encodingLimits.contrast.maximum + 1
+
+# TODO: Ignore noise scans
+for acqnum in range(dset.getNumberOfAcquisitions()):
+ acq = dset.readAcquisition(acqnum)
+ if acq.getHead().flags & ismrmrd.ACQ_IS_NOISE_MEASUREMENT:
+ print("Found noise measurement @ %d" % acqnum)
+
+all_data = np.zeros((eNx, eNy, eNz, ncoils, nslices, ncontrasts, nreps), dtype=np.complex64)
+for acqnum in range(dset.getNumberOfAcquisitions()):
+ acq = dset.readAcquisition(acqnum)
+ head = acq.getHead()
+ rep = head.idx.repetition
+ contrast = head.idx.contrast
+ slice = head.idx.slice
+ y = head.idx.kspace_encode_step_1
+ z = head.idx.kspace_encode_step_2
+ floatdata = acq.getData()
+ data = np.array([complex(elem[0], elem[1]) for elem in zip(floatdata[::2], floatdata[1::2])])
+ data = data.reshape((eNx, ncoils))
+ all_data[:, y, z, :, slice, contrast, rep] = data
+
+fig = plt.figure()
+h, w = nreps * ncontrasts, eNz * nslices
+i = 0
+for rep in range(nreps):
+ for contrast in range(ncontrasts):
+ for slice in range(nslices):
+ for z in range(eNz):
+ K = all_data[:,:,z,:,slice, contrast, rep]
+ comb = np.sqrt(np.sum(np.abs(K) ** 2, 2))
+ a = fig.add_subplot(h, w, i)
+ plt.imshow(comb)
+ i += 1
+fig.set_size_inches(16, 16)
+
+images = []
+for rep in range(nreps):
+ for contrast in range(ncontrasts):
+ for slice in range(nslices):
+ K = all_data[:,:,:,:,slice, contrast, rep]
+ K = fftshift(ifft(fftshift(K, axes=0), axis=0), axes=0)
+
+ # chop if needed
+ if eNx != rNx:
+ i0 = (eNx - rNx) / 2
+ i1 = (eNx - rNx) / 2 + rNx
+ im = K[i0:i1,:,:,:]
+ else:
+ im = K
+
+ im = fftshift(ifft(fftshift(im, axes=1), axis=1), axes=1)
+ if np.size(im, 2) > 1:
+ im = fftshift(ifft(fftshift(im, axes=2), axis=2), axes=2)
+
+ im = np.squeeze(np.sqrt(np.sum(np.abs(im) ** 2, 3)))
+ images.append(im)
+
+l = len(images)
+fig = plt.figure()
+for n, im in enumerate(images):
+ a = fig.add_subplot(1, 5, n)
+ plt.imshow(im)
+fig.set_size_inches(16, 4)
+
+# grab the first acquisition for extra info
+acqh = dset.readAcquisition(0).getHead()
+
+for n, img in enumerate(images):
+ hdr = ismrmrd.ImageHeader()
+ hdr.acquisition_time_stamp = acqh.acquisition_time_stamp
+ hdr.flags = 0
+ hdr.measurement_uid = acqh.measurement_uid
+ hdr.phase_dir = acqh.phase_dir
+ hdr.physiology_time_stamp = acqh.physiology_time_stamp
+ hdr.position = acqh.position
+ hdr.read_dir = acqh.read_dir
+ hdr.slice_dir = acqh.slice_dir
+ hdr.channels = 1
+ hdr.image_data_type = ismrmrd.DATA_FLOAT
+ hdr.image_type = ismrmrd.TYPE_MAGNITUDE
+ hdr.image_index = n
+ hdr.slice = n
+
+ dset.appendImageHeader(hdr, "image_%d.hdr" % n)
+ dset.appendArray(img, "image_%d.img" % n)
diff --git a/examples/python/ismrmrd_test.py b/examples/python/ismrmrd_test.py
deleted file mode 100644
index ede39ab..0000000
--- a/examples/python/ismrmrd_test.py
+++ /dev/null
@@ -1,22 +0,0 @@
-import ismrmrd
-import ismrmrd_xsd
-import numpy as np
-
-f = ismrmrd.IsmrmrdDataset('./testdata.h5', '/dataset')
-
-a = f.readAcquisition(10)
-#print a.getData()
-#print(a.getPosition(0), a.getPosition(1), a.getPosition(2))
-#print(a.getReadDirection(0), a.getReadDirection(1), a.getReadDirection(2))
-
-d = a.getData()
-d2 = np.zeros(d.shape)
-a.setData(d2)
-
-i = f.readImage_ushort('the_square')
-print(i.getReadDirection(0), i.getReadDirection(1), i.getReadDirection(2))
-
-xml = f.readHeader()
-hdr = ismrmrd_xsd.CreateFromDocument(xml)
-
-print hdr.experimentalConditions.H1resonanceFrequency_Hz
diff --git a/ismrmrd.h b/ismrmrd.h
index 9b3d031..33defe4 100644
--- a/ismrmrd.h
+++ b/ismrmrd.h
@@ -95,18 +95,17 @@ enum AcquisitionFlags {
ACQ_LAST_IN_SET = 16,
ACQ_FIRST_IN_SEGMENT = 17,
ACQ_LAST_IN_SEGMENT = 18,
-
- ACQ_LAST_IN_MEASUREMENT = 25,
-
ACQ_IS_NOISE_MEASUREMENT = 19,
ACQ_IS_PARALLEL_CALIBRATION = 20,
ACQ_IS_PARALLEL_CALIBRATION_AND_IMAGING = 21,
ACQ_IS_REVERSE = 22,
ACQ_IS_NAVIGATION_DATA = 23,
ACQ_IS_PHASECORR_DATA = 24,
- ACQ_IS_RTFEEDBACK_DATA = 25,
+ ACQ_LAST_IN_MEASUREMENT = 25,
ACQ_IS_HPFEEDBACK_DATA = 26,
ACQ_IS_DUMMYSCAN_DATA = 27,
+ ACQ_IS_RTFEEDBACK_DATA = 28,
+ ACQ_IS_SURFACECOILCORRECTIONSCAN_DATA = 29,
ACQ_USER1 = 57,
ACQ_USER2 = 58,
@@ -1110,9 +1109,9 @@ static void directions_to_quaternion(float read_dir[3], float phase_dir[3],
float r21 = read_dir[1], r22 = phase_dir[1], r23 = slice_dir[1];
float r31 = read_dir[2], r32 = phase_dir[2], r33 = slice_dir[2];
- float a = 1, b = 0, c = 0, d = 0, s = 0;
- float trace = 0;
- float xd, yd, zd;
+ double a = 1, b = 0, c = 0, d = 0, s = 0;
+ double trace = 0;
+ double xd, yd, zd;
/* verify the sign of the rotation*/
if (sign_of_directions(read_dir, phase_dir, slice_dir) < 0) {
@@ -1171,7 +1170,7 @@ static void directions_to_quaternion(float read_dir[3], float phase_dir[3],
}
}
- quat[0] = a; quat[1] = b; quat[2] = c; quat[3] = d;
+ quat[0] = (float)a; quat[1] = (float)b; quat[2] = (float)c; quat[3] = (float)d;
}
/**
@@ -1185,17 +1184,17 @@ static void quaternion_to_directions(float quat[4], float read_dir[3],
{
float a = quat[0], b = quat[1], c = quat[2], d = quat[3];
- read_dir[0] = 1.0 - 2.0 * ( b*b + c*c );
- phase_dir[0] = 2.0 * ( a*b - c*d );
- slice_dir[0] = 2.0 * ( a*c + b*d );
+ read_dir[0] = 1.0f - 2.0f * ( b*b + c*c );
+ phase_dir[0] = 2.0f * ( a*b - c*d );
+ slice_dir[0] = 2.0f * ( a*c + b*d );
- read_dir[1] = 2.0 * ( a*b + c*d );
- phase_dir[1] = 1.0 - 2.0 * ( a*a + c*c );
- slice_dir[1] = 2.0 * ( b*c - a*d );
+ read_dir[1] = 2.0f * ( a*b + c*d );
+ phase_dir[1] = 1.0f - 2.0f * ( a*a + c*c );
+ slice_dir[1] = 2.0f * ( b*c - a*d );
- read_dir[2] = 2.0 * ( a*c - b*d );
- phase_dir[2] = 2.0 * ( b*c + a*d );
- slice_dir[2] = 1.0 - 2.0 * ( a*a + b*b );
+ read_dir[2] = 2.0f * ( a*c - b*d );
+ phase_dir[2] = 2.0f * ( b*c + a*d );
+ slice_dir[2] = 1.0f - 2.0f * ( a*a + b*b );
}
#ifdef __cplusplus
diff --git a/ismrmrd_hdf5.cpp b/ismrmrd_hdf5.cpp
index 4786218..80a819f 100644
--- a/ismrmrd_hdf5.cpp
+++ b/ismrmrd_hdf5.cpp
@@ -18,11 +18,14 @@ int IsmrmrdDataset::openHDF5File()
std::cerr << "File \"" << filename_ << "\" is not an HDF file file" << std::endl;
return -1;
}
- file_ = boost::shared_ptr<H5File>(new H5File(filename_, H5F_ACC_RDWR));
-
+ file_ = boost::shared_ptr<H5File>(new H5File(filename_.c_str(), H5F_ACC_RDWR));
} catch (...) {
- std::cerr << "Failed to open HDF5 file." << std::endl;
- return -1;
+ try {
+ file_ = boost::shared_ptr<H5File>(new H5File(filename_.c_str(), H5F_ACC_RDONLY));
+ } catch (...) {
+ std::cerr << "Failed to open HDF5 file." << std::endl;
+ return -1;
+ }
}
file_open_ = true;
} else if (create_file_if_needed_){
@@ -50,6 +53,20 @@ int IsmrmrdDataset::openHDF5File()
return 0;
}
+void IsmrmrdDataset::close(void)
+{
+ if (file_open_) {
+ dataset_->flush(H5F_SCOPE_LOCAL);
+ dataset_->close();
+ dataset_.reset();
+ file_->flush(H5F_SCOPE_LOCAL);
+ file_->close();
+ file_.reset();
+ file_open_ = false;
+ }
+}
+
+
bool IsmrmrdDataset::linkExists(const char* name)
{
@@ -578,6 +595,101 @@ template EXPORTISMRMRD boost::shared_ptr< Image<unsigned short> > IsmrmrdDataset
template EXPORTISMRMRD boost::shared_ptr< Image< std::complex<float> > > IsmrmrdDataset::readImage(const char* varname, unsigned long index);
template EXPORTISMRMRD boost::shared_ptr< Image< std::complex<double> > > IsmrmrdDataset::readImage(const char* varname, unsigned long index);
+int IsmrmrdDataset::appendImageAttrib(std::string& a, const char* varname)
+{
+ std::string data_path = groupname_ + std::string("/") + std::string(varname);
+
+ boost::shared_ptr<DataSet> dataset;
+ boost::shared_ptr<DataType> datatype = getIsmrmrdHDF5Type<std::string>();
+
+ std::vector<hsize_t> dims;
+ std::vector<hsize_t> max_dims;
+ if (!linkExists(data_path.c_str()))
+ {
+ std::vector<hsize_t> dims(1,1);
+ std::vector<hsize_t> max_dims(1,1);
+
+ try
+ {
+ if (createGroupForDataset(groupname_.c_str()) < 0)
+ {
+ std::cout << "Failed to create group in HDF 5 file." << std::endl;
+ return -1;
+ }
+
+ DataSpace mspace1( dims.size(), &dims[0], &max_dims[0]);
+
+ DSetCreatPropList cparms;
+ cparms.setChunk( dims.size(), &dims[0] );
+
+ dataset = boost::shared_ptr<DataSet>(new DataSet(file_->createDataSet( data_path.c_str(), *datatype, mspace1, cparms)));
+ mspace1 = dataset->getSpace();
+
+ DataSpace mspace2( dims.size(), &dims[0] );
+
+ std::vector<hsize_t> offset(dims.size());
+ mspace1.selectHyperslab(H5S_SELECT_SET, &dims[0], &offset[0]);
+ dataset->write( a, *datatype, mspace2, mspace1 );
+
+ } catch( Exception& e ) {
+ std::cerr << "Exception caught while creating HDF5 dataset" << std::endl;
+ std::cerr << e.getDetailMsg() << std::endl;
+ return -1;
+ }
+ }
+ else
+ {
+ try
+ { // to determine if the dataset exists in the group
+ dataset = boost::shared_ptr<DataSet>(new DataSet(file_->openDataSet(data_path.c_str())));
+
+ DataType mtype = dataset->getDataType();
+ if (!(mtype == (*datatype))) {
+ std::cout << "Attempting to append data to HDF5 dataset with the wrong type" << std::endl;
+ return -1;
+ }
+
+ std::vector<hsize_t> dims(1,1);
+ std::vector<hsize_t> max_dims(1,1);
+ DataSpace mspace2( dims.size(), &dims[0] );
+
+ DataSpace mspace1( dims.size(), &dims[0], &max_dims[0]);
+ mspace1 = dataset->getSpace();
+
+ std::vector<hsize_t> offset(dims.size());
+ mspace1.selectHyperslab(H5S_SELECT_SET, &dims[0], &offset[0]);
+ dataset->write( a, *datatype, mspace2, mspace1 );
+
+ /*DataSpace mspace1 = dataset->getSpace();
+ int rank = mspace1.getSimpleExtentNdims();
+ std::vector<hsize_t> ddims(rank,0);
+ mspace1.getSimpleExtentDims(&ddims[0], NULL);
+
+ dims.push_back(1);
+ for (unsigned int i = 1; i < ddims.size(); i++)
+ {
+ dims.push_back(ddims[i]);
+ }
+
+ std::vector<hsize_t> offset(rank, 0);
+ offset[0] = ddims[0];
+
+ DataSpace fspace2 = dataset->getSpace();
+ fspace2.selectHyperslab( H5S_SELECT_SET, &dims[0], &offset[0] );
+
+ DataSpace mspace2( rank, &dims[0] );
+
+ dataset->write( a, *datatype, mspace2, fspace2 );*/
+
+ }
+ catch( FileIException& not_found_error)
+ {
+ std::cout << "Dataset is not found. At this point, it should have been created!" << std::endl;
+ return -1;
+ }
+ }
+ return 0;
+}
HDF5Lock* HDF5Lock::instance()
{
diff --git a/ismrmrd_hdf5.h b/ismrmrd_hdf5.h
index 538eaba..bb976db 100644
--- a/ismrmrd_hdf5.h
+++ b/ismrmrd_hdf5.h
@@ -87,6 +87,15 @@ public:
data_path_ = groupname_ + std::string("/data");
}
+ /**
+ * Closes all references to the underlying HDF5 file.
+ *
+ * This method does not NEED to be called. It is most useful in
+ * a Python interpreter when a dataset instance has not been
+ * garbage collected but another process needs to read the HDF5 file.
+ */
+ void close(void);
+
/**
* Appends and NMR/MRI acquisition to the data set.
*
@@ -175,6 +184,10 @@ public:
template <typename T> boost::shared_ptr< NDArrayContainer<T> > readArray(const char* varname, unsigned long index = 0);
+ /**
+ * This function appends the meta attribute information to the data set. The meta attributes are stored as an xml file.
+ */
+ int appendImageAttrib(std::string& a, const char* varname);
protected:
int openHDF5File();
diff --git a/ismrmrd_hdf5_datatypes.h b/ismrmrd_hdf5_datatypes.h
index ea6e75f..27e4528 100644
--- a/ismrmrd_hdf5_datatypes.h
+++ b/ismrmrd_hdf5_datatypes.h
@@ -10,6 +10,7 @@
#include <vector>
#include <complex>
+#include <string>
#ifndef H5_NO_NAMESPACE
using namespace H5;
@@ -334,6 +335,12 @@ template <> inline boost::shared_ptr<DataType> getIsmrmrdHDF5Type<ImageHeader_wi
return getIsmrmrdHDF5Type<ImageHeader_with_data<double_complex_t> >();
}
+template <> inline boost::shared_ptr<DataType> getIsmrmrdHDF5Type<std::string>()
+{
+ boost::shared_ptr<DataType> ret(new StrType(0, H5T_VARIABLE));
+ return ret;
+}
+
}
#endif /* ISMRMRD_HDF5_DATATYPES_H_ */
diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt
index 2b92ab0..9af92d6 100644
--- a/matlab/CMakeLists.txt
+++ b/matlab/CMakeLists.txt
@@ -4,7 +4,7 @@ if (NOT JAVA_FOUND)
message(STATUS "Java (xjc) Not Found - Not generating XML bindings")
else (NOT JAVA_FOUND)
- set(ISMRMRD_SCHEMA ${CMAKE_SOURCE_DIR}/schema/ismrmrd.xsd)
+ set(ISMRMRD_SCHEMA "${ISMRMRD_SCHEMA_DIR}/ismrmrd.xsd")
set(ISMRMRD_JAR "${CMAKE_CURRENT_BINARY_DIR}/ismrmrd-matlab.jar")
set(ISMRMRD_PACKAGE "org/ismrm/ismrmrd")
set(ISMRMRD_PACKAGE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${ISMRMRD_PACKAGE}")
@@ -68,5 +68,7 @@ else (NOT JAVA_FOUND)
add_custom_target(ismrmrd-matlab-jar ALL DEPENDS ${ISMRMRD_JAR})
endif(NOT JAVA_FOUND)
-INSTALL(DIRECTORY +ismrmrd DESTINATION matlab)
-INSTALL(FILES ${ISMRMRD_JAR} DESTINATION matlab/+ismrmrd/+util)
+install(DIRECTORY +ismrmrd
+ DESTINATION ${ISMRMRD_INSTALL_MATLAB_DIR})
+install(FILES ${ISMRMRD_JAR}
+ DESTINATION ${ISMRMRD_INSTALL_MATLAB_DIR}/+ismrmrd/+util)
diff --git a/schema/ismrmrd.xsd b/schema/ismrmrd.xsd
index 4be1512..835c28e 100644
--- a/schema/ismrmrd.xsd
+++ b/schema/ismrmrd.xsd
@@ -5,14 +5,14 @@
<xs:complexType name="ismrmrdHeader">
<xs:sequence>
- <xs:element maxOccurs="1" minOccurs="0" name="subjectInformation" type="subjectInformationType"/>
- <xs:element maxOccurs="1" minOccurs="0" name="studyInformation" type="studyInformationType"/>
- <xs:element maxOccurs="1" minOccurs="0" name="measurementInformation" type="measurementInformationType"/>
- <xs:element maxOccurs="1" minOccurs="0" name="acquisitionSystemInformation" type="acquisitionSystemInformationType"/>
- <xs:element maxOccurs="1" minOccurs="1" name="experimentalConditions" type="experimentalConditionsType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="subjectInformation" type="subjectInformationType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="studyInformation" type="studyInformationType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="measurementInformation" type="measurementInformationType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="acquisitionSystemInformation" type="acquisitionSystemInformationType"/>
+ <xs:element maxOccurs="1" minOccurs="1" name="experimentalConditions" type="experimentalConditionsType"/>
<xs:element maxOccurs="unbounded" minOccurs="1" name="encoding" type="encoding"/>
- <xs:element maxOccurs="1" minOccurs="0" name="parallelImaging" type="parallelImagingType"/>
- <xs:element maxOccurs="1" minOccurs="0" name="sequenceParameters" type="sequenceParametersType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="parallelImaging" type="parallelImagingType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="sequenceParameters" type="sequenceParametersType"/>
<xs:element maxOccurs="1" minOccurs="0" name="dicomParameters" type="dicomParametersType"/>
<xs:element maxOccurs="1" minOccurs="0" name="userParameters" type="userParameters"/>
</xs:sequence>
@@ -36,8 +36,8 @@
<xs:complexType name="studyInformationType">
<xs:all>
- <xs:element minOccurs="1" name="studyDate" type="xs:date"/>
- <xs:element minOccurs="1" name="studyTime" type="xs:time"/>
+ <xs:element minOccurs="0" name="studyDate" type="xs:date"/>
+ <xs:element minOccurs="0" name="studyTime" type="xs:time"/>
<xs:element minOccurs="0" name="studyID" type="xs:string"/>
<xs:element minOccurs="0" name="accessionNumber" type="xs:long"/>
<xs:element minOccurs="0" name="referringPhysicianName" type="xs:string"/>
@@ -46,9 +46,10 @@
</xs:complexType>
<xs:complexType name="measurementInformationType">
- <xs:all>
- <xs:element minOccurs="1" name="seriesDate" type="xs:date"/>
- <xs:element minOccurs="1" name="seriesTime" type="xs:time"/>
+ <xs:sequence>
+ <xs:element minOccurs="0" name="measurementID" type="xs:string"/>
+ <xs:element minOccurs="0" name="seriesDate" type="xs:date"/>
+ <xs:element minOccurs="0" name="seriesTime" type="xs:time"/>
<xs:element minOccurs="1" name="patientPosition">
<xs:simpleType>
<xs:restriction base="xs:string">
@@ -66,7 +67,15 @@
<xs:element minOccurs="0" name="initialSeriesNumber" type="xs:long"/>
<xs:element minOccurs="0" name="protocolName" type="xs:string"/>
<xs:element minOccurs="0" name="seriesDescription" type="xs:string"/>
- </xs:all>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="measurementDependency" type="measurementDependencyType"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="measurementDependencyType">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="1" name="dependencyType" type="xs:string"/>
+ <xs:element maxOccurs="1" minOccurs="1" name="measurementID" type="xs:string"/>
+ </xs:sequence>
</xs:complexType>
<xs:complexType name="acquisitionSystemInformationType">
@@ -185,6 +194,13 @@
</xs:all>
</xs:complexType>
+ <xs:complexType name="userParameterStringType">
+ <xs:all>
+ <xs:element name="name" type="xs:string"/>
+ <xs:element name="value" type="xs:string"/>
+ </xs:all>
+ </xs:complexType>
+
<xs:complexType name="userParameterBase64Type">
<xs:all>
<xs:element name="name" type="xs:string"/>
@@ -217,7 +233,7 @@
<xs:element minOccurs="0" name="mrAcquisitionType" type="xs:string"/>
<xs:element minOccurs="0" name="echoTrainLength" type="xs:long"/>
<xs:element minOccurs="0" name="triggerTime" type="xs:float"/>
- <xs:element minOccurs="0" name="flipAngle_deg" type="xs:long"/>
+ <xs:element minOccurs="0" name="flipAngle_deg" type="xs:float"/>
<xs:element minOccurs="0" name="freqEncodingDirection">
<xs:simpleType>
<xs:restriction base="xs:string">
@@ -233,6 +249,7 @@
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="userParameterLong" type="userParameterLongType"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="userParameterDouble" type="userParameterDoubleType"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="userParameterString" type="userParameterStringType"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="userParameterBase64" type="userParameterBase64Type"/>
</xs:sequence>
</xs:complexType>
diff --git a/tests/c++/CMakeLists.txt b/tests/c++/CMakeLists.txt
index 548ec50..d20b9be 100644
--- a/tests/c++/CMakeLists.txt
+++ b/tests/c++/CMakeLists.txt
@@ -1,12 +1,22 @@
enable_testing()
-SET_SOURCE_FILES_PROPERTIES(${XSDS_SOURCES} PROPERTIES GENERATED TRUE)
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../.. ${CMAKE_CURRENT_BINARY_DIR}/schema)
+include_directories(${ISMRMRD_SOURCE_DIR} ${ISMRMRD_SCHEMA_SOURCE_DIR})
-add_executable(t_ndarraycontainer t_ndarraycontainer.cpp )
-target_link_libraries(t_ndarraycontainer ${XERCESC_LIBRARIES} ismrmrd)
-add_test(t_ndarraycontainer ${CMAKE_CURRENT_BINARY_DIR}/t_ndarraycontainer)
-
-add_executable(t_image t_image.cpp ${XSDS_SOURCES})
-target_link_libraries(t_image ${XERCESC_LIBRARIES} ismrmrd)
-add_test(t_image ${CMAKE_CURRENT_BINARY_DIR}/t_image)
+if(WIN32)
+ # building with xsd sources on Windows
+ set_source_files_properties(${XSDS_SOURCES} PROPERTIES GENERATED TRUE)
+ add_executable(t_ndarraycontainer t_ndarraycontainer.cpp ${XSDS_SOURCES})
+ target_link_libraries(t_ndarraycontainer ${XERCESC_LIBRARIES} ismrmrd)
+ add_test(t_ndarraycontainer ${CMAKE_CURRENT_BINARY_DIR}/t_ndarraycontainer)
+ add_executable(t_image t_image.cpp ${XSDS_SOURCES})
+ target_link_libraries(t_image ${XERCESC_LIBRARIES} ismrmrd)
+ add_test(t_image ${CMAKE_CURRENT_BINARY_DIR}/t_image)
+else(WIN32)
+ # linking with ismrmrd_xsd on Linux / OSX
+ add_executable(t_ndarraycontainer t_ndarraycontainer.cpp)
+ target_link_libraries(t_ndarraycontainer ismrmrd ismrmrd_xsd)
+ add_test(t_ndarraycontainer ${CMAKE_CURRENT_BINARY_DIR}/t_ndarraycontainer)
+ add_executable(t_image t_image.cpp)
+ target_link_libraries(t_image ismrmrd ismrmrd_xsd)
+ add_test(t_image ${CMAKE_CURRENT_BINARY_DIR}/t_image)
+endif(WIN32)
diff --git a/tests/c++/t_ndarraycontainer.cpp b/tests/c++/t_ndarraycontainer.cpp
index 0b30314..5feed2b 100644
--- a/tests/c++/t_ndarraycontainer.cpp
+++ b/tests/c++/t_ndarraycontainer.cpp
@@ -17,9 +17,8 @@ template<> struct populate <float> {
static void random (NDArrayContainer<type>& ndac) {
type mi = (type) std::numeric_limits<int>::max();
assert (ndac.is_consistent());
- size_t i = ndac.elements();
- size_t j = ndac.data_.size();
- for (; i>=1; i--)
+ size_t j = ndac.elements();
+ for (size_t i=0; i<j; i++)
ndac[i] = 1.0 - 2.0 * (type)rand() / mi;
}
@@ -32,9 +31,8 @@ template<> struct populate <double> {
static void random (NDArrayContainer<type>& ndac) {
type mi = (type) std::numeric_limits<int>::max();
assert (ndac.is_consistent());
- size_t i = ndac.elements();
- size_t j = ndac.data_.size();
- for (; i>=1; i--)
+ size_t j = ndac.elements();
+ for (size_t i=0; i<j; i++)
ndac[i] = 1.0 - 2.0 * (type)rand() / mi;
}
@@ -48,9 +46,8 @@ template<> struct populate <std::complex<float> > {
static void random (NDArrayContainer<type>& ndac) {
rtype mi = std::numeric_limits<int>::max();
assert (ndac.is_consistent());
- size_t i = ndac.elements();
- size_t j = ndac.data_.size();
- for (; i>=1; i--)
+ size_t j = ndac.elements();
+ for (size_t i=0; i<j; i++)
ndac[i] = type(1.0, 1.0) - type(2.0 * (rtype)rand() / mi, 2.0 * (rtype)rand() / mi);
}
@@ -64,9 +61,8 @@ template<> struct populate <std::complex<double> > {
static void random (NDArrayContainer<type>& ndac) {
rtype mi = std::numeric_limits<int>::max();
assert (ndac.is_consistent());
- size_t i = ndac.elements();
- size_t j = ndac.data_.size();
- for (; i>=1; i--)
+ size_t j = ndac.elements();
+ for (size_t i=0; i<j; i++)
ndac[i] = type(1.0, 1.0) - type(2.0 * (rtype)rand() / mi, 2.0 * (rtype)rand() / mi);
}
@@ -79,9 +75,8 @@ template<> struct populate <int> {
static void random (NDArrayContainer<type>& ndac) {
type mi = (type) std::numeric_limits<type>::max();
assert (ndac.is_consistent());
- size_t i = ndac.elements();
- size_t j = ndac.data_.size();
- for (; i>=1; i--)
+ size_t j = ndac.elements();
+ for (size_t i=0; i<j; i++)
ndac[i] = rand();
}
@@ -94,9 +89,8 @@ template<> struct populate <short> {
static void random (NDArrayContainer<type>& ndac) {
type mi = (type) std::numeric_limits<type>::max();
assert (ndac.is_consistent());
- size_t i = ndac.elements();
- size_t j = ndac.data_.size();
- for (; i>=1; i--)
+ size_t j = ndac.elements();
+ for (size_t i=0; i<j; i++)
ndac[i] = rand();
}
@@ -109,9 +103,8 @@ template<> struct populate <long> {
static void random (NDArrayContainer<type>& ndac) {
type mi = (type) std::numeric_limits<type>::max();
assert (ndac.is_consistent());
- size_t i = ndac.elements();
- size_t j = ndac.data_.size();
- for (; i>=1; i--)
+ size_t j = ndac.elements();
+ for (size_t i=0; i<j; i++)
ndac[i] = rand();
}
diff --git a/tests/c/CMakeLists.txt b/tests/c/CMakeLists.txt
index fdd26f8..8fdcc1b 100644
--- a/tests/c/CMakeLists.txt
+++ b/tests/c/CMakeLists.txt
@@ -1,10 +1,11 @@
enable_testing()
-include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../..)
+include_directories(${ISMRMRD_SOURCE_DIR})
add_executable(t_cstructs t_cstructs.cpp)
add_test(t_cstructs ${CMAKE_CURRENT_BINARY_DIR}/t_cstructs)
-add_executable(t_cquaternions ../../ismrmrd.h t_cquaternions.cpp)
+#add_executable(t_cquaternions ../../ismrmrd.h t_cquaternions.cpp)
+add_executable(t_cquaternions t_cquaternions.cpp)
add_test(t_cquaternions ${CMAKE_CURRENT_BINARY_DIR}/t_cquaternions)
if (NOT WIN32)
diff --git a/tests/c/t_cstructs.cpp b/tests/c/t_cstructs.cpp
index 848b078..6f53a39 100644
--- a/tests/c/t_cstructs.cpp
+++ b/tests/c/t_cstructs.cpp
@@ -44,9 +44,9 @@ int main(void)
acq_head.trajectory_dimensions = 2;
acq_head.sample_time_us = 123.321;
- acq_head.position[0] = -12.80;
- acq_head.position[1] = 0.23;
- acq_head.position[2] = 12.45;
+ acq_head.position[0] = -12.80f;
+ acq_head.position[1] = 0.23f;
+ acq_head.position[2] = 12.45f;
acq_head.read_dir[0] = 1;
acq_head.read_dir[1] = 0;
@@ -88,9 +88,9 @@ int main(void)
img_head.channels = 32;
- img_head.position[0] = -12.80;
- img_head.position[1] = 0.23;
- img_head.position[2] = 12.45;
+ img_head.position[0] = -12.80f;
+ img_head.position[1] = 0.23f;
+ img_head.position[2] = 12.45f;
img_head.read_dir[0] = 1;
img_head.read_dir[1] = 0;
@@ -106,7 +106,7 @@ int main(void)
img_head.patient_table_position[0] = 0.0;
img_head.patient_table_position[1] = 0.0;
- img_head.patient_table_position[2] = 2.13;
+ img_head.patient_table_position[2] = 2.13f;
img_head.average = 50;
img_head.slice = 14;
diff --git a/utilities/CMakeLists.txt b/utilities/CMakeLists.txt
index 3d5668b..003adbd 100644
--- a/utilities/CMakeLists.txt
+++ b/utilities/CMakeLists.txt
@@ -1,19 +1,29 @@
-find_package(Boost COMPONENTS program_options REQUIRED)
+find_package(Boost COMPONENTS program_options)
find_package(FFTW3 COMPONENTS single)
-SET_SOURCE_FILES_PROPERTIES(${XSDS_SOURCES} PROPERTIES GENERATED TRUE)
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/.. ${Boost_INCLUDE_DIR})
-
-ADD_LIBRARY(ismrmrd_utilities SHARED ismrmrd_phantom.cpp)
-INSTALL(TARGETS ismrmrd_utilities DESTINATION lib)
-
-IF(FFTW3_FOUND)
- INCLUDE_DIRECTORIES(${FFTW3_INCLUDE_DIR})
- ADD_EXECUTABLE(ismrmrd_generate_cartesian_shepp_logan generate_cartesian_shepp_logan.cpp ${XSDS_SOURCES})
-if(WIN32)
- TARGET_LINK_LIBRARIES(ismrmrd_generate_cartesian_shepp_logan ismrmrd_utilities ismrmrd ${FFTW3_LIBRARIES} ${XERCESC_LIBRARIES})
-else(WIN32)
- TARGET_LINK_LIBRARIES(ismrmrd_generate_cartesian_shepp_logan ismrmrd_utilities ismrmrd ${FFTW3_LIBRARIES} ${Boost_LIBRARIES} ${XERCESC_LIBRARIES})
-endif(WIN32)
- INSTALL(TARGETS ismrmrd_generate_cartesian_shepp_logan DESTINATION bin)
-ENDIF(FFTW3_FOUND)
\ No newline at end of file
+if(FFTW3_FOUND)
+ message("FFTW3 Found, building utilities")
+ include_directories(${ISMRMRD_SOURCE_DIR} ${ISMRMRD_SCHEMA_SOURCE_DIR}
+ ${Boost_INCLUDE_DIR} ${FFTW3_INCLUDE_DIR})
+ add_library(ismrmrd_utilities SHARED ismrmrd_phantom.cpp)
+ install(TARGETS ismrmrd_utilities DESTINATION ${ISMRMRD_INSTALL_LIB_DIR})
+
+ if(WIN32)
+ set_source_files_properties(${XSDS_SOURCES} PROPERTIES GENERATED TRUE)
+ add_executable(ismrmrd_generate_cartesian_shepp_logan
+ generate_cartesian_shepp_logan.cpp ${XSDS_SOURCES})
+ target_link_libraries(ismrmrd_generate_cartesian_shepp_logan
+ ismrmrd ismrmrd_utilities ${Boost_LIBRARIES} ${FFTW3_LIBRARIES}
+ ${XERCESC_LIBRARIES})
+ else(WIN32)
+ add_executable(ismrmrd_generate_cartesian_shepp_logan
+ generate_cartesian_shepp_logan.cpp)
+ target_link_libraries(ismrmrd_generate_cartesian_shepp_logan
+ ismrmrd ismrmrd_utilities ismrmrd_xsd
+ ${Boost_PROGRAM_OPTIONS_LIBRARY} ${FFTW3_LIBRARIES})
+ endif(WIN32)
+ install(TARGETS ismrmrd_generate_cartesian_shepp_logan
+ DESTINATION ${ISMRMRD_INSTALL_BIN_DIR})
+else(FFTW3_FOUND)
+ message("FFTW3 NOT Found, cannot build utilities")
+endif(FFTW3_FOUND)
diff --git a/utilities/generate_cartesian_shepp_logan.cpp b/utilities/generate_cartesian_shepp_logan.cpp
index f875330..93988cc 100644
--- a/utilities/generate_cartesian_shepp_logan.cpp
+++ b/utilities/generate_cartesian_shepp_logan.cpp
@@ -63,7 +63,7 @@ int main(int argc, char** argv)
}
std::cout << "Generating Cartesian Shepp Logan Phantom" << std::endl;
- std::cout << "Accelleration: " << acc_factor << std::endl;
+ std::cout << "Acceleration: " << acc_factor << std::endl;
boost::shared_ptr<NDArrayContainer<std::complex<float> > > phantom = shepp_logan_phantom(matrix_size);
boost::shared_ptr<NDArrayContainer<std::complex<float> > > coils = generate_birdcage_sensititivies(matrix_size, ncoils, 1.5);
--
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