[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