[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