[ismrmrd] 136/177: Fixed dataset methods to return void and only throw exceptions. Removed unused c++ examples. Added c example to the build.

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


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

ghisvail-guest pushed a commit to annotated tag v1.1.0.beta.1
in repository ismrmrd.

commit bcfc3cbb4bc080401a1516f66c3f546bf8be0351
Author: Souheil Inati <souheil.inati at nih.gov>
Date:   Tue Oct 14 14:06:55 2014 -0400

    Fixed dataset methods to return void and only throw exceptions.  Removed unused c++ examples.  Added c example to the build.
---
 CMakeLists.txt                                   |   3 +-
 examples/c++/CMakeLists.txt                      |  71 --------
 examples/c++/basic_test.cpp                      | 101 -----------
 examples/c++/publication_recon_dataset.cpp       | 206 -----------------------
 examples/c++/test_create_dataset.cpp             | 168 ------------------
 examples/c/CMakeLists.txt                        |  18 +-
 examples/c/main.c                                |   8 +-
 include/ismrmrd/dataset.h                        |  20 +--
 libsrc/dataset.cpp                               |  70 ++++----
 utilities/CMakeLists.txt                         |   9 +-
 {examples/c++ => utilities}/read_timing_test.cpp |  15 +-
 11 files changed, 66 insertions(+), 623 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 36ddac0..82860e4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -196,8 +196,7 @@ enable_testing()
 
 # process subdirectories
 add_subdirectory(doc)
-#add_subdirectory(examples/c++)
-#add_subdirectory(examples/c)
+add_subdirectory(examples/c)
 add_subdirectory(utilities)
 #add_subdirectory(tests)
 #add_subdirectory(matlab)
diff --git a/examples/c++/CMakeLists.txt b/examples/c++/CMakeLists.txt
deleted file mode 100644
index ee1f6a6..0000000
--- a/examples/c++/CMakeLists.txt
+++ /dev/null
@@ -1,71 +0,0 @@
-cmake_minimum_required(VERSION 2.8)
-project(ISMRMRD_C++_EXAMPLES)
-
-if (NOT DEFINED ENV{ISMRMRD_HOME})
-    message(FATAL_ERROR "Environment variable $ISMRMRD_HOME not set")
-endif()
-# for finding Ismrmrd
-list (APPEND CMAKE_MODULE_PATH "$ENV{ISMRMRD_HOME}/cmake")
-
-find_package(Ismrmrd REQUIRED)
-
-include_directories (
-    ${ISMRMRD_INCLUDE_DIR}
-)
-
-add_executable(ismrmrd_basic_test basic_test.cpp)
-target_link_libraries(ismrmrd_basic_test ${ISMRMRD_LIBRARIES})
-
-#find_package(FFTW3 COMPONENTS single)
-#if(FFTW3_FOUND)
-#    message("FFTW3 Found, building examples")
-#    add_executable(ismrmrd_create_dataset test_create_dataset.cpp)
-#    target_link_libraries(ismrmrd_create_dataset ismrmrd ${FFTW3_LIBRARIES})
-#    add_executable(ismrmrd_recon_dataset test_recon_dataset.cpp)
-#    target_link_libraries(ismrmrd_recon_dataset ismrmrd ${FFTW3_LIBRARIES})
-#    install(TARGETS ismrmrd_create_dataset
-#                              ismrmrd_recon_dataset
-#              DESTINATION bin)
-#else(FFTW3_FOUND)
-#       message("FFTW3 NOT Found, cannot build examples")
-#endif(FFTW3_FOUND)
-
-if(0)
-
-find_package(FFTW3 COMPONENTS single)
-
-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)
-
-endif(0)
diff --git a/examples/c++/basic_test.cpp b/examples/c++/basic_test.cpp
deleted file mode 100644
index 2027f66..0000000
--- a/examples/c++/basic_test.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-#include <iostream>
-#include "ismrmrd.h"
-#include "ismrmrd_xml.h"
-#include "ismrmrd_dataset.h"
-
-int main (int args, char** argv) {
-
-  using namespace ISMRMRD;
-  
-  AcquisitionHeader acqhdr;
-  std::cout << "Version: " << acqhdr.version << std::endl;
-  std::cout << "Flags 0: " << acqhdr.flags << std::endl;
-  std::cout << "ACQ_FIRST_IN_SLICE: " << acqhdr.isFlagSet(ISMRMRD_ACQ_FIRST_IN_SLICE) << std::endl;
-  acqhdr.setFlag(ISMRMRD_ACQ_FIRST_IN_SLICE);
-  std::cout << "Flags 1: " << acqhdr.flags << std::endl;
-  std::cout << "ACQ_FIRST_IN_SLICE: " << acqhdr.isFlagSet(ISMRMRD_ACQ_FIRST_IN_SLICE) << std::endl;
-  acqhdr.clearFlag(ISMRMRD_ACQ_FIRST_IN_SLICE);
-  std::cout << "Flags 2: " << acqhdr.flags << std::endl;
-  std::cout << "ACQ_FIRST_IN_SLICE: " << acqhdr.isFlagSet(ISMRMRD_ACQ_FIRST_IN_SLICE) << std::endl;
-
-  // The C++ AcquisitionHeader can be mem copied from the C struct ISMRMRD_AcquisitionHeader
-  ISMRMRD_AcquisitionHeader c_acqhdr;
-  ismrmrd_init_acquisition_header(&c_acqhdr);
-  c_acqhdr.flags = 64;
-
-  AcquisitionHeader acqhdr2;
-  memcpy(&acqhdr2, &c_acqhdr, sizeof(AcquisitionHeader));
-  std::cout << "AcquisitionHeader copy: flags: " << acqhdr2.flags << std::endl;
-  
-  Acquisition acq;
-  std::cout << "Version: " << acq.version() << std::endl;
-  std::cout << "Flags 0: " << acq.flags() << std::endl;
-  std::cout << "ACQ_FIRST_IN_SLICE: " << acq.isFlagSet(ISMRMRD_ACQ_FIRST_IN_SLICE) << std::endl;
-  acq.setFlag(ISMRMRD_ACQ_FIRST_IN_SLICE);
-  std::cout << "Flags 1: " << acq.flags() << std::endl;
-  std::cout << "ACQ_FIRST_IN_SLICE: " << acq.isFlagSet(ISMRMRD_ACQ_FIRST_IN_SLICE) << std::endl;
-  acq.clearFlag(ISMRMRD_ACQ_FIRST_IN_SLICE);
-  std::cout << "Flags 2: " << acq.flags() << std::endl;
-  std::cout << "ACQ_FIRST_IN_SLICE: " << acq.isFlagSet(ISMRMRD_ACQ_FIRST_IN_SLICE) << std::endl;
-  std::cout << "Number of samples: " << acq.number_of_samples() << std::endl;
-  acq.number_of_samples(64);
-  std::cout << "Number of samples: " << acq.number_of_samples() << std::endl;
-  
-  Acquisition acq2(acq);
-  std::cout << "Acquisition flags: " << acq.flags() << "    Acquisition copy flags: " << acq2.flags() << std::endl;
-  std::cout << "Acquisition ACQ_FIRST_IN_SLICE: " << acq.isFlagSet(ISMRMRD_ACQ_FIRST_IN_SLICE) << std::endl;
-  std::cout << "Acquisition copy ACQ_FIRST_IN_SLICE: " << acq2.isFlagSet(ISMRMRD_ACQ_FIRST_IN_SLICE) << std::endl;
-  std::cout << "Acquisition nsamp: " << acq.number_of_samples() << "    Acquisition copy nsamp: " << acq2.number_of_samples() << std::endl;
- 
-  // How to use the C++ Acquisition as a wrapper to the C struct ISMRMRD_Acquistion
-  ISMRMRD_Acquisition c_acq;
-  ismrmrd_init_acquisition(&c_acq);
-  c_acq.head.number_of_samples = 128;
-  c_acq.head.active_channels = 4;
-  ismrmrd_make_consistent_acquisition(&c_acq);
-  for (int k=0; k<c_acq.head.number_of_samples; k++) {
-      for (int c=0; c<c_acq.head.active_channels; c++) {
-          c_acq.data[k*c_acq.head.active_channels + c] = std::complex<float>(1.0, 1.0);
-      }
-  }
-  ismrmrd_set_flag(&(c_acq.head.flags), ISMRMRD_ACQ_FIRST_IN_SLICE);
-  Acquisition *acq3 = reinterpret_cast<Acquisition *>(&c_acq);
-  std::cout << "C Acquisition nsamp: " << c_acq.head.number_of_samples << "    C++ Acquisition wrapper nsamp: " << acq3->number_of_samples() << std::endl;
-  std::cout << "C Acquisition data[4]: " << c_acq.data[4].real() << "      C++ Acquisition wrapper data[4]: " << acq3->getData()[4].real() << std::endl;
-
-  // Open an existing file
-  Dataset dataset1 = Dataset("myfile.h5", "/dataset", false);
-
-  // Open a second dataset
-  Dataset dataset2 = Dataset("myfile2.h5", "/dataset", true);
-  
-  // Read the header from file 1
-  std::string xmlstring;
-  dataset1.readHeader(xmlstring);
-  std::cout << "XML Header: " << xmlstring << std::endl;
-
-  // Write the header to file 2
-  dataset2.writeHeader(xmlstring);
-  
-  // Read the number of acquisitions
-  unsigned long numacq = dataset1.getNumberOfAcquisitions();
-  std::cout << "Number of acquisitions: " << numacq << std::endl;
-  
-  // Read the first few acquisitions
-  if (numacq > 3) { numacq=3; }
-
-  for (unsigned long n = 0; n<numacq; n++) {
-      Acquisition * acqref = dataset1.readAcquisition(n);
-      std::cout << "Acquisition " << n << " nsamp: " << acqref->number_of_samples() << std::endl;
-      std::cout << "Acquisition " << n << " flags: " << acqref->flags() << std::endl;
-      std::cout << "Acquisition " << n << " data[4]: " << acqref->getData()[4].real() << std::endl;
-      dataset2.appendAcquisition(* acqref);
-      delete acqref;
-  }
-  std::cout << "Dataset2: number of acquisitions: " << dataset2.getNumberOfAcquisitions() << std::endl;
-  
-  //ISMRMRD::IsmrmrdHeader h;
-  //serialize(h,std::cout);
-
-  return 0;
-}
diff --git a/examples/c++/publication_recon_dataset.cpp b/examples/c++/publication_recon_dataset.cpp
deleted file mode 100644
index bd77ad4..0000000
--- a/examples/c++/publication_recon_dataset.cpp
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * test_recon_dataset.cpp
- *
- *  Created on: Sep 6, 2012
- *      Author: Michael S. Hansen (michael.hansen at nih.gov)
- *
- */
-
-#include <iostream>
-#include "ismrmrd.h"
-#include "ismrmrd.hxx"
-#include "ismrmrd_hdf5.h"
-#include "fftw3.h"
-
-//Helper function for the FFTW library
-template<typename TI, typename TO> void circshift(TO *out, const TI *in, int xdim, int ydim, int xshift, int yshift)
-{
-  for (int i =0; i < ydim; i++) {
-    int ii = (i + yshift) % ydim;
-    for (int j = 0; j < xdim; j++) {
-      int jj = (j + xshift) % xdim;
-      out[ii * xdim + jj] = in[i * xdim + j];
-    }
-  }
-}
-
-#define fftshift(out, in, x, y) circshift(out, in, x, y, (x/2), (y/2))
-
-void print_usage(const char* application)
-{
-	std::cout << "Usage:" << std::endl;
-	std::cout << "  - " << application << " <HDF5_FILENAME> " << "<SCHEMA_FILENAME>" << std::endl;
-}
-
-/* MAIN APPLICATION */
-int main(int argc, char** argv)
-{
-	if (argc < 3) {
-		print_usage(argv[0]);
-		return -1;
-	}
-
-	std::string datafile(argv[1]);
-	std::string schemafile(argv[2]);
-
-	std::cout << "Simple ISMRMRD Reconstruction program" << std::endl;
-	std::cout << "   - filename: " << datafile << std::endl;
-	std::cout << "   - schema  : " << schemafile << std::endl;
-
-	//Let's open the dataset
-	ISMRMRD::IsmrmrdDataset d(datafile.c_str(),"dataset");
-
-	//We will start by getting the header and turning it into a C++ class
-	//In order to do true validation of the XML, we will use the XML schema
-	xml_schema::properties props;
-	props.schema_location ("http://www.ismrm.org/ISMRMRD", schemafile);
-
-	boost::shared_ptr<std::string> xml = d.readHeader();
-	std::istringstream str_stream(*xml, std::stringstream::in);
-
-	boost::shared_ptr<ISMRMRD::ismrmrdHeader> cfg;
-
-	try {
-		cfg = boost::shared_ptr<ISMRMRD::ismrmrdHeader>(ISMRMRD::ismrmrdHeader_ (str_stream,0,props));
-	}  catch (const xml_schema::exception& e) {
-		std::cout << "Failed to parse XML Parameters: " << e.what() << std::endl;
-	}
-
-	//Let's print some information from the header
-	ISMRMRD::ismrmrdHeader::encoding_sequence e_seq = cfg->encoding();
-	if (e_seq.size() != 1) {
-		std::cout << "Number of encoding spaces: " << e_seq.size() << std::endl;
-		std::cout << "This simple reconstruction application only supports one encoding space" << std::endl;
-		return -1;
-	}
-
-	ISMRMRD::encodingSpaceType e_space = (*e_seq.begin()).encodedSpace();
-	ISMRMRD::encodingSpaceType r_space = (*e_seq.begin()).reconSpace();
-	ISMRMRD::encodingLimitsType e_limits = (*e_seq.begin()).encodingLimits();
-
-	unsigned int slices = e_limits.slice().present() ? e_limits.slice().get().maximum() + 1 : 1;
-
-	boost::shared_ptr<ISMRMRD::Acquisition> acq = d.readAcquisition(0);
-	unsigned int channels = acq->getActiveChannels();
-
-	std::cout << "Encoding Matrix Size        : [" << e_space.matrixSize().x() << ", " << e_space.matrixSize().y() << ", " << e_space.matrixSize().z() << "]" << std::endl;
-	std::cout << "Reconstruction Matrix Size  : [" << r_space.matrixSize().x() << ", " << r_space.matrixSize().y() << ", " << r_space.matrixSize().z() << "]" << std::endl;
-	std::cout << "Number of channels          : " << channels << std::endl;
-	std::cout << "Number of slices            : " << slices << std::endl;
-	std::cout << "Number of acquisitions      : " << d.getNumberOfAcquisitions() << std::endl;
-
-	if (e_space.matrixSize().z() != 1) {
-		std::cout << "This simple reconstruction application only supports 2D encoding spaces" << std::endl;
-		return -1;
-	}
-
-    
-	//Allocate a buffer for the data
-	std::vector<unsigned int> buffer_dimensions;
-
-	buffer_dimensions.push_back(e_space.matrixSize().x());
-	buffer_dimensions.push_back(e_space.matrixSize().y());
-	buffer_dimensions.push_back(channels);
-	buffer_dimensions.push_back(slices);
-
-	ISMRMRD::NDArrayContainer< std::complex<float> > buffer(buffer_dimensions);
-
-    
-	//Now loop through and copy data
-	unsigned int number_of_acquisitions = d.getNumberOfAcquisitions();
-	std::map<unsigned, ISMRMRD::AcquisitionHeader> slice_heads;
-
-	for (unsigned int i = 0; i < number_of_acquisitions; i++) {
-
-		//Read one acquisition at a time
-		boost::shared_ptr<ISMRMRD::Acquisition> acq = d.readAcquisition(i);
-
-		if (acq->isFlagSet(ISMRMRD::FlagBit(ISMRMRD::ACQ_FIRST_IN_SLICE))) {
-			slice_heads[acq->getIdx().slice] = acq->getHead();
-		}
-
-
-		for (unsigned int c = 0; c < channels; c++) {
-			unsigned int offset = acq->getIdx().slice*buffer.dimensions_[0]*buffer.dimensions_[1]*buffer.dimensions_[2] +
-					c * buffer.dimensions_[0]*buffer.dimensions_[1] +
-					acq->getIdx().kspace_encode_step_1*buffer.dimensions_[0];
-
-			memcpy(&buffer[offset],&acq->getData()[0]+c*buffer.dimensions_[0]*2,sizeof(float)*2*buffer.dimensions_[0]);
-		}
-	}
-
-	//Let's FFT the k-space to image
-	for (unsigned int s = 0; s < slices; s++) {
-		for (unsigned int c = 0; c < channels; c++) {
-			fftwf_complex* tmp = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex)*buffer.dimensions_[0]*buffer.dimensions_[1]);
-
-			if (!tmp) {
-				std::cout << "Error allocating temporary storage for FFTW" << std::endl;
-				return -1;
-			}
-
-			unsigned int offset = s*buffer.dimensions_[0]*buffer.dimensions_[1]*buffer.dimensions_[2] +
-								  c * buffer.dimensions_[0]*buffer.dimensions_[1];
-
-
-			fftshift(reinterpret_cast<std::complex<float>*>(tmp),&buffer.data_[0]+offset,buffer.dimensions_[0],buffer.dimensions_[1]);
-
-			//Create the FFTW plan
-			fftwf_plan p = fftwf_plan_dft_2d(buffer.dimensions_[1], buffer.dimensions_[0], tmp,tmp, FFTW_BACKWARD, FFTW_ESTIMATE);
-
-			fftwf_execute(p);
-
-			fftshift(&buffer.data_[0]+offset,reinterpret_cast<std::complex<float>*>(tmp),buffer.dimensions_[0],buffer.dimensions_[1]);
-
-			//Clean up.
-			fftwf_destroy_plan(p);
-			fftwf_free(tmp);
-		}
-	}
-
-
-	//Now, let's remove the oversampling in the readout and take the magnitude
-	//Allocate a buffer for the data
-	for (unsigned int s = 0; s < slices; s++) {
-		ISMRMRD::NDArrayContainer< float > img;
-		img.dimensions_.push_back(r_space.matrixSize().x());
-		img.dimensions_.push_back(r_space.matrixSize().y());
-
-		img.data_.resize(r_space.matrixSize().x()*r_space.matrixSize().y(), 0.0);
-
-		for (unsigned int y = 0; y < img.dimensions_[1]; y++) {
-			for (unsigned int x = 0; x < img.dimensions_[0]; x++) {
-				for (unsigned int c = 0; c < channels; c++) {
-					float m = std::abs(buffer.data_[s*buffer.dimensions_[0]*buffer.dimensions_[1]*buffer.dimensions_[2] +
-													c*buffer.dimensions_[0]*buffer.dimensions_[1] +
-													y*buffer.dimensions_[0] + x + ((e_space.matrixSize().x()-r_space.matrixSize().x())>>1)]);
-
-					img.data_[y*img.dimensions_[0]+x] += m*m;
-				}
-			}
-		}
-
-		for (unsigned int i = 0; i < img.elements(); i++) img[i] = std::sqrt(img[i]);
-
-		//Let's write the reconstructed image straight in the same data file
-		ISMRMRD::ImageHeader img_h;
-		img_h.channels = 1;
-		img_h.image_data_type = ISMRMRD::DATA_FLOAT; //This is actually just guidance
-		img_h.image_type      = ISMRMRD::TYPE_REAL;       //This is actually just guidance
-		img_h.slice = s;
-		memcpy(img_h.position, slice_heads[s].position, sizeof(float)*3);
-		memcpy(img_h.read_dir, slice_heads[s].read_dir, sizeof(float)*3);
-		memcpy(img_h.phase_dir, slice_heads[s].phase_dir, sizeof(float)*3);
-		memcpy(img_h.slice_dir, slice_heads[s].slice_dir, sizeof(float)*3);
-		memcpy(img_h.patient_table_position, slice_heads[s].patient_table_position, sizeof(float)*3);
-
-		//And so on
-
-		//Now append, we will append image and header separately (in two different datasets)
-		d.appendImageHeader(img_h,"myimage.head");
-		d.appendArray(img,"myimage.img");
-	}
-
-
-	return 0;
-}
diff --git a/examples/c++/test_create_dataset.cpp b/examples/c++/test_create_dataset.cpp
deleted file mode 100644
index 7d39ca2..0000000
--- a/examples/c++/test_create_dataset.cpp
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * test_create_dataset.cpp
- *
- *  Created on: Sep 4, 2012
- *      Authors: Michael S. Hansen (michael.hansen at nih.gov)
- *               Souheil J. Inati  (souheil.inati at nih.gov)
- */
-
-#include <iostream>
-#include "ismrmrd.h"
-#include "ismrmrd_dataset.h"
-#include "fftw3.h"
-
-//Utility function for appending different sizes of arrays, used for testing here
-template <typename T, int size_x, int size_y> int appendImageArray(ISMRMRD::IsmrmrdDataset& d, const char* varname)
-{
-	T a[size_x*size_y];
-	std::vector<unsigned int> dims(2,0);
-	dims[0] = size_x;
-	dims[1] = size_y;
-
-	//Let's make a simple square (rectangle depending on dimensions)
-	for (int y = 0; y < size_y; y++) {
-		for (int x = 0; x < size_x; x++) {
-			if ( (x > (size_x>>2)) && (x < (size_x-(size_x>>2))) &&
-				 (y > (size_y>>3)) && (y < (size_y-(size_y>>3)))) {
-				a[y*size_x + x] = 1.0;
-			} else {
-				a[y*size_x + x] = 0.0;
-			}
-		}
-	}
-
-	ISMRMRD::NDArrayContainer<T> tmp(dims,a);
-
-	return d.appendArray(tmp, varname);
-}
-
-//Helper function for the FFTW library
-template<typename TI, typename TO> void circshift(TO *out, const TI *in, int xdim, int ydim, int xshift, int yshift)
-{
-  for (int i =0; i < ydim; i++) {
-    int ii = (i + yshift) % ydim;
-    for (int j = 0; j < xdim; j++) {
-      int jj = (j + xshift) % xdim;
-      out[ii * xdim + jj] = in[i * xdim + j];
-    }
-  }
-}
-
-#define fftshift(out, in, x, y) circshift(out, in, x, y, (x/2), (y/2))
-
-/* MAIN APPLICATION */
-int main(int argc, char** argv)
-{
-	std::cout << "ISMRMRD Test Dataset Creation App" << std::endl;
-
-	const unsigned int readout = 256;
-	const unsigned int phase_encoding_lines = 128;
-
-	ISMRMRD::IsmrmrdDataset d("testdata.h5","dataset");
-
-	//Let's create the "original" image in the file for reference
-	if (appendImageArray< std::complex<float>, readout, phase_encoding_lines >(d, "the_square") < 0) {
-		std::cout << "Error adding image to dataset" << std::endl;
-		return -1;
-	}
-
-	//Read it back from the file
-	boost::shared_ptr< ISMRMRD::NDArrayContainer<std::complex<float> > > img_test =
-			d.readArray< std::complex<float> >("the_square", 0);
-
-	if (img_test.get() == 0) {
-		std::cout << "Error reading image array from file" << std::endl;
-		return -1;
-	}
-
-	std::cout << "Image Array dimensions: ";
-	for (int di = 0; di < img_test->dimensions_.size(); di++) {
-		std::cout << img_test->dimensions_[di] << " ";
-	}
-	std::cout << std::endl;
-
-	//Let's FFT this image to k-space
-	fftwf_complex* tmp = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex)*img_test->data_.size());
-
-	if (!tmp) {
-		std::cout << "Error allocating temporary storage for FFTW" << std::endl;
-		return -1;
-	}
-
-	fftshift(reinterpret_cast<std::complex<float>*>(tmp),&img_test->data_[0],img_test->dimensions_[0],img_test->dimensions_[1]);
-
-	//Create the FFTW plan
-	fftwf_plan p = fftwf_plan_dft_2d(img_test->dimensions_[1], img_test->dimensions_[0], tmp,tmp, FFTW_FORWARD, FFTW_ESTIMATE);
-
-	fftwf_execute(p);
-
-	fftshift(&img_test->data_[0],reinterpret_cast<std::complex<float>*>(tmp),img_test->dimensions_[0],img_test->dimensions_[1]);
-
-	//Clean up.
-	fftwf_destroy_plan(p);
-	fftwf_free(tmp);
-
-	//Let keep the "original" k-space in the file for reference
-	if (d.appendArray(*img_test,"the_square_k") < 0) {
-		std::cout << "Error adding kspace to dataset" << std::endl;
-		return -1;
-	}
-
-	//Let's append the data to the file
-	ISMRMRD::Acquisition acq;
-
-	for (unsigned int i = 0; i < phase_encoding_lines; i++) {
-		acq.setFlags(0);
-		//acq.head_.flags = 0;
-
-		//Set some flags
-		if (i == 0) {
-			acq.setFlag(ISMRMRD::FlagBit(ISMRMRD::ACQ_FIRST_IN_SLICE));
-		}
-		if (i == (phase_encoding_lines-1)) {
-			acq.setFlag(ISMRMRD::FlagBit(ISMRMRD::ACQ_LAST_IN_SLICE));
-		}
-		acq.getIdx().kspace_encode_step_1 = i;
-		acq.setActiveChannels(1);
-		acq.setAvailableChannels(1);
-		acq.setNumberOfSamples(readout);
-		acq.setCenterSample(readout>>1);
-		acq.setSampleTimeUs(5.0);
-		memcpy(&acq[0],&img_test->data_[i*readout],sizeof(float)*readout*2);
-		d.appendAcquisition(&acq);
-	}
-
-	//Let's create a header, we will use the C++ class generated by XSD
-	ISMRMRD::experimentalConditionsType exp(63500000); //~1.5T
-	ISMRMRD::ismrmrdHeader h(exp);
-
-	//Create an encoding section
-	ISMRMRD::encodingSpaceType es(ISMRMRD::matrixSize(readout,phase_encoding_lines,1),ISMRMRD::fieldOfView_mm(600,300,6));
-	ISMRMRD::encodingSpaceType rs(ISMRMRD::matrixSize((readout>>1),phase_encoding_lines,1),ISMRMRD::fieldOfView_mm(300,300,6));
-	ISMRMRD::encodingLimitsType el;
-	el.kspace_encoding_step_1(ISMRMRD::limitType(0,phase_encoding_lines-1,(phase_encoding_lines>>1)));
-	ISMRMRD::encoding e(es,rs,el,ISMRMRD::trajectoryType::cartesian);
-
-	//Add the encoding section to the header
-	h.encoding().push_back(e);
-
-	//Add any additional fields that you may want would go here....
-
-	//e.g. parallel imaging
-	//ISMRMRD::parallelImagingType parallel(ISMRMRD::accelerationFactorType(2,1));
-	//parallel.calibrationMode(ISMRMRD::calibrationModeType::embedded);
-    //h.parallelImaging(parallel);
-
-	//Serialize the header
-	xml_schema::namespace_infomap map;
-	map[""].name = "http://www.ismrm.org/ISMRMRD";
-	map[""].schema = "ismrmrd.xsd";
-	std::stringstream str;
-	ISMRMRD::ismrmrdHeader_(str, h, map);
-	std::string xml_header = str.str();
-
-	//Write the header to the data file.
-	d.writeHeader(xml_header);
-
-	return 0;
-}
diff --git a/examples/c/CMakeLists.txt b/examples/c/CMakeLists.txt
index 2325fbf..3ab0884 100644
--- a/examples/c/CMakeLists.txt
+++ b/examples/c/CMakeLists.txt
@@ -1,17 +1,5 @@
-cmake_minimum_required(VERSION 2.8)
-project(ISMRMRD_C_EXAMPLE)
-
-if (NOT DEFINED ENV{ISMRMRD_HOME})
-    message(FATAL_ERROR "Environment variable $ISMRMRD_HOME not set")
-endif()
-# for finding Ismrmrd
-list (APPEND CMAKE_MODULE_PATH "$ENV{ISMRMRD_HOME}/cmake")
-
-find_package(Ismrmrd REQUIRED)
-
-include_directories (
-    ${ISMRMRD_INCLUDE_DIR}
-)
+include_directories(${CMAKE_SOURCE_DIR}/include)
 
 add_executable(ismrmrd_c_demo main.c)
-target_link_libraries(ismrmrd_c_demo ${ISMRMRD_LIBRARIES})
+target_link_libraries(ismrmrd_c_demo ismrmrd)
+install(TARGETS ismrmrd_c_demo DESTINATION bin)
diff --git a/examples/c/main.c b/examples/c/main.c
index bb75315..005f847 100644
--- a/examples/c/main.c
+++ b/examples/c/main.c
@@ -2,11 +2,11 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "ismrmrd.h"
-#include "ismrmrd_dataset.h"
+#include "ismrmrd/ismrmrd.h"
+#include "ismrmrd/dataset.h"
 
-void myerror(const char *file, int line, const char *func, int err, char *msg) {
-    char *msgtype = ismrmrd_strerror(err);
+void myerror(const char *file, int line, const char *func, int code, const char *msg) {
+    char *msgtype = ismrmrd_strerror(code);
     fprintf(stderr, "Whoa! ERROR: %s in %s, line %d: %s\n", msgtype, file, line, msg);
     exit(-1);
 }
diff --git a/include/ismrmrd/dataset.h b/include/ismrmrd/dataset.h
index 174abd1..fd33a79 100644
--- a/include/ismrmrd/dataset.h
+++ b/include/ismrmrd/dataset.h
@@ -164,21 +164,21 @@ public:
     
     // Methods
     // XML Header
-    int writeHeader(const std::string &xmlstring);
-    int readHeader(std::string& xmlstring);
+    void writeHeader(const std::string &xmlstring);
+    void readHeader(std::string& xmlstring);
     // Acquisitions
-    int appendAcquisition(const Acquisition &acq);
-    int readAcquisition(uint32_t index, Acquisition &acq);
+    void appendAcquisition(const Acquisition &acq);
+    void readAcquisition(uint32_t index, Acquisition &acq);
     uint32_t getNumberOfAcquisitions();
     // Images
-    template <typename T> int appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<T> &im);
-    int appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const ISMRMRD_Image *im);
-    template <typename T> int readImage(const std::string &var, uint32_t index, Image<T> &im);
+    template <typename T> void appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<T> &im);
+    void appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const ISMRMRD_Image *im);
+    template <typename T> void readImage(const std::string &var, uint32_t index, Image<T> &im);
     uint32_t getNumberOfImages(const std::string &var);
     // NDArrays
-    template <typename T> int appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<T> &arr);
-    int appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const ISMRMRD_NDArray *arr);
-    template <typename T> int readNDArray(const std::string &var, uint32_t index, NDArray<T> &arr);
+    template <typename T> void appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<T> &arr);
+    void appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const ISMRMRD_NDArray *arr);
+    template <typename T> void readNDArray(const std::string &var, uint32_t index, NDArray<T> &arr);
     uint32_t getNumberOfNDArrays(const std::string &var);
 
 protected:
diff --git a/libsrc/dataset.cpp b/libsrc/dataset.cpp
index 45b6e9b..135c63a 100644
--- a/libsrc/dataset.cpp
+++ b/libsrc/dataset.cpp
@@ -36,13 +36,15 @@ Dataset::~Dataset()
 }
 
 // XML Header
-int Dataset::writeHeader(const std::string &xmlstring)
+void Dataset::writeHeader(const std::string &xmlstring)
 {
     int status = ismrmrd_write_header(&dset_, xmlstring.c_str());
-    return status;
+    if (status != ISMRMRD_NOERROR) {
+        throw std::runtime_error(build_exception_string());
+    }
 }
 
-int Dataset::readHeader(std::string& xmlstring){
+void Dataset::readHeader(std::string& xmlstring){
     char * temp = ismrmrd_read_header(&dset_);
     if (NULL == temp) {
         throw std::runtime_error(build_exception_string());
@@ -50,22 +52,22 @@ int Dataset::readHeader(std::string& xmlstring){
         xmlstring = std::string(temp);
         free(temp);
     }
-    return ISMRMRD_NOERROR;
 }
 
 // Acquisitions
-int Dataset::appendAcquisition(const Acquisition &acq)
+void Dataset::appendAcquisition(const Acquisition &acq)
 {
     int status = ismrmrd_append_acquisition(&dset_, reinterpret_cast<const ISMRMRD_Acquisition*>(&acq));
-    return status;
+    if (status != ISMRMRD_NOERROR) {
+        throw std::runtime_error(build_exception_string());
+    }
 }
 
-int Dataset::readAcquisition(uint32_t index, Acquisition & acq) {
+void Dataset::readAcquisition(uint32_t index, Acquisition & acq) {
     int status = ismrmrd_read_acquisition(&dset_, index, reinterpret_cast<ISMRMRD_Acquisition*>(&acq));
     if (status != ISMRMRD_NOERROR) {
         throw std::runtime_error(build_exception_string());
     }
-    return status;
 }
 
 
@@ -76,40 +78,37 @@ uint32_t Dataset::getNumberOfAcquisitions()
 }
 
 // Images
-template <typename T>int Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<T> &im)
+template <typename T>void Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<T> &im)
 {
     int status = ismrmrd_append_image(&dset_, var.c_str(), blockmode, reinterpret_cast<const ISMRMRD_Image*>(&im));
     if (status != ISMRMRD_NOERROR) {
         throw std::runtime_error(build_exception_string());
     }
-    return status;
 }
 
-int Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const ISMRMRD_Image *im)
+void Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const ISMRMRD_Image *im)
 {
     int status = ismrmrd_append_image(&dset_, var.c_str(), blockmode, im);
     if (status != ISMRMRD_NOERROR) {
         throw std::runtime_error(build_exception_string());
     }
-    return status;
 }
 // Specific instantiations
-template EXPORTISMRMRD int Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<uint16_t> &im);
-template EXPORTISMRMRD int Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<int16_t> &im);
-template EXPORTISMRMRD int Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<uint32_t> &im);
-template EXPORTISMRMRD int Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<int32_t> &im);
-template EXPORTISMRMRD int Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<float> &im);
-template EXPORTISMRMRD int Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<double> &im);
-template EXPORTISMRMRD int Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<complex_float_t> &im);
-template EXPORTISMRMRD int Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<complex_double_t> &im);
+template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<uint16_t> &im);
+template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<int16_t> &im);
+template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<uint32_t> &im);
+template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<int32_t> &im);
+template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<float> &im);
+template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<double> &im);
+template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<complex_float_t> &im);
+template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const ISMRMRD_BlockModes blockmode, const Image<complex_double_t> &im);
 
 
-template <typename T> int Dataset::readImage(const std::string &var, uint32_t index, Image<T> &im) {
+template <typename T> void Dataset::readImage(const std::string &var, uint32_t index, Image<T> &im) {
     int status = ismrmrd_read_image(&dset_, var.c_str(), index, reinterpret_cast<ISMRMRD_Image*>(&im));
     if (status != ISMRMRD_NOERROR) {
         throw std::runtime_error(build_exception_string());
     }
-    return status;
 }
 
 uint32_t Dataset::getNumberOfImages(const std::string &var)
@@ -120,40 +119,37 @@ uint32_t Dataset::getNumberOfImages(const std::string &var)
 
 
 // NDArrays
-template <typename T> int Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<T> &arr)
+template <typename T> void Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<T> &arr)
 {
     int status = ismrmrd_append_array(&dset_, var.c_str(), blockmode, static_cast<const ISMRMRD_NDArray*>(&arr));
     if (status != ISMRMRD_NOERROR) {
         throw std::runtime_error(build_exception_string());
     }
-    return status;
 }
 
 // Specific instantiations
-template EXPORTISMRMRD int Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<uint16_t> &arr);
-template EXPORTISMRMRD int Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<int16_t> &arr);
-template EXPORTISMRMRD int Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<uint32_t> &arr);
-template EXPORTISMRMRD int Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<int32_t> &arr);
-template EXPORTISMRMRD int Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<float> &arr);
-template EXPORTISMRMRD int Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<double> &arr);
-template EXPORTISMRMRD int Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<complex_float_t> &arr);
-template EXPORTISMRMRD int Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<complex_double_t> &arr);
-
-int Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const ISMRMRD_NDArray *arr)
+template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<uint16_t> &arr);
+template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<int16_t> &arr);
+template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<uint32_t> &arr);
+template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<int32_t> &arr);
+template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<float> &arr);
+template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<double> &arr);
+template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<complex_float_t> &arr);
+template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const NDArray<complex_double_t> &arr);
+
+void Dataset::appendNDArray(const std::string &var, const ISMRMRD_BlockModes blockmode, const ISMRMRD_NDArray *arr)
 {
     int status = ismrmrd_append_array(&dset_, var.c_str(), blockmode, arr);
     if (status != ISMRMRD_NOERROR) {
         throw std::runtime_error(build_exception_string());
     }
-    return status;
 }
 
-template <typename T> int Dataset::readNDArray(const std::string &var, uint32_t index, NDArray<T> &arr) {
+template <typename T> void Dataset::readNDArray(const std::string &var, uint32_t index, NDArray<T> &arr) {
     int status = ismrmrd_read_array(&dset_, var.c_str(), index, static_cast<ISMRMRD_NDArray*>(&arr));
     if (status != ISMRMRD_NOERROR) {
         throw std::runtime_error(build_exception_string());
     }
-    return status;
 }
 
 uint32_t Dataset::getNumberOfNDArrays(const std::string &var)
diff --git a/utilities/CMakeLists.txt b/utilities/CMakeLists.txt
index 5fcfff6..363c8c8 100644
--- a/utilities/CMakeLists.txt
+++ b/utilities/CMakeLists.txt
@@ -1,10 +1,15 @@
 # Build the info application
 message("Building info application")
 include_directories(${CMAKE_BINARY_DIR}/include
-                               ${CMAKE_SOURCE_DIR}/include)
+                    ${CMAKE_SOURCE_DIR}/include)
+
 add_executable(ismrmrd_info ismrmrd_info.cpp)
 target_link_libraries(ismrmrd_info ismrmrd)
- install(TARGETS ismrmrd_info DESTINATION bin)
+install(TARGETS ismrmrd_info DESTINATION bin)
+
+add_executable(ismrmrd_read_timing_test read_timing_test.cpp)
+target_link_libraries(ismrmrd_read_timing_test ismrmrd)
+install(TARGETS ismrmrd_read_timing_test DESTINATION bin)
 
 find_package(Boost COMPONENTS program_options)
 find_package(FFTW3 COMPONENTS single)
diff --git a/examples/c++/read_timing_test.cpp b/utilities/read_timing_test.cpp
similarity index 80%
rename from examples/c++/read_timing_test.cpp
rename to utilities/read_timing_test.cpp
index cfa823f..8f387d4 100644
--- a/examples/c++/read_timing_test.cpp
+++ b/utilities/read_timing_test.cpp
@@ -7,7 +7,8 @@
 #include <iostream>
 #include <string>
 
-#include "ismrmrd_hdf5.h"
+#include "ismrmrd/ismrmrd.h"
+#include "ismrmrd/dataset.h"
 
 
 class Timer
@@ -71,12 +72,12 @@ int main(int argc, char** argv)
 
   {
     Timer t("READ TIMER");
-    ISMRMRD::IsmrmrdDataset d(argv[1],"dataset");
-    unsigned int number_of_acquisitions = d.getNumberOfAcquisitions();
-    boost::shared_ptr<ISMRMRD::Acquisition> acq;
-    for (unsigned int i = 0; i < number_of_acquisitions; i++) {
-        acq = d.readAcquisition(i);
-      //We'll just throw the data away here. 
+    ISMRMRD::Dataset d(argv[1],"dataset", false);
+    uint32_t number_of_acquisitions = d.getNumberOfAcquisitions();
+    ISMRMRD::Acquisition acq;
+    for (uint32_t i = 0; i < number_of_acquisitions; i++) {
+        d.readAcquisition(i, acq);
+        //We'll just throw the data away here. 
     }
   }
   

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