[ismrmrd] 46/177: Can now append images and ndarrays in array mode.
Ghislain Vaillant
ghisvail-guest at moszumanska.debian.org
Wed Jan 14 20:02:01 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 8044d237d0d71c1275e6929e1f44ec2d2d01f3e7
Author: Souheil Inati <souheil.inati at nih.gov>
Date: Mon Sep 8 10:43:24 2014 -0400
Can now append images and ndarrays in array mode.
---
examples/c++/basic_test.cpp | 6 +-
examples/c/main.c | 11 +-
ismrmrd_dataset.c | 281 +++++++++++++++++++++++++++++++-------------
ismrmrd_dataset.cpp | 80 ++++++++++++-
ismrmrd_dataset.h | 30 +++--
5 files changed, 307 insertions(+), 101 deletions(-)
diff --git a/examples/c++/basic_test.cpp b/examples/c++/basic_test.cpp
index 7e92440..2027f66 100644
--- a/examples/c++/basic_test.cpp
+++ b/examples/c++/basic_test.cpp
@@ -59,9 +59,9 @@ int main (int args, char** argv) {
}
}
ismrmrd_set_flag(&(c_acq.head.flags), ISMRMRD_ACQ_FIRST_IN_SLICE);
- Acquisition acq3(&c_acq);
- std::cout << "Acquisition nsamp: " << c_acq.head.number_of_samples << " Acquisition wrapper nsamp: " << acq3.number_of_samples() << std::endl;
- std::cout << "Acquisition data[4]: " << c_acq.data[4].real() << " Acquisition wrapper data[4]: " << acq3.getData()[4].real() << std::endl;
+ 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);
diff --git a/examples/c/main.c b/examples/c/main.c
index 068af67..bb75315 100644
--- a/examples/c/main.c
+++ b/examples/c/main.c
@@ -80,16 +80,16 @@ int main(void)
/* read the next to last one */
ISMRMRD_Acquisition acq2;
ismrmrd_init_acquisition(&acq2);
- unsigned long index = 0;
+ uint32_t index = 0;
if (nacq_read>1) {
index = nacq_read - 1;
}
else {
index = 0;
}
- printf("Acquisition index: %lu\n", index);
+ printf("Acquisition index: %u\n", index);
ismrmrd_read_acquisition(&dataset2, index, &acq2);
- printf("Number of samples: %hu\n", acq2.head.number_of_samples);
+ printf("Number of samples: %u\n", acq2.head.number_of_samples);
printf("Flags: %llu\n", acq2.head.flags);
printf("Data[4]: %f, %f\n", creal(acq2.data[4]), cimag(acq2.data[4]));
@@ -113,10 +113,15 @@ int main(void)
im.head.attribute_string_len = strlen(attr_string);
ismrmrd_make_consistent_image(&im);
memcpy(im.attribute_string, attr_string, im.head.attribute_string_len);
+ memset(im.data, 0, 256*256*4*8*sizeof(float));
printf("Image Version: %d\n", im.head.version);
printf("Image String: %s\n", im.attribute_string);
ismrmrd_append_image(&dataset2, "testimages", 1, &im);
+ for (uint32_t loc=0; loc < 256*256*4*8; loc++) {
+ ((float*)im.data)[loc] = 2.0;
+ }
+ ismrmrd_append_image(&dataset2, "testimages", 1, &im);
/* Clean up */
/* This frees the internal memory of the acquisitions */
diff --git a/ismrmrd_dataset.c b/ismrmrd_dataset.c
index 689e2e5..6ba1411 100644
--- a/ismrmrd_dataset.c
+++ b/ismrmrd_dataset.c
@@ -105,14 +105,14 @@ typedef struct HDF5_Acquisition
hvl_t data;
} HDF5_Acquisition;
-typedef struct HDF5_NDArray
+typedef struct HDF5_NDArrayBlob
{
uint16_t version;
uint16_t data_type;
uint16_t ndim;
uint16_t dims[ISMRMRD_NDARRAY_MAXDIM];
hvl_t data;
-} HDF5_NDArray;
+} HDF5_NDArrayBlob;
static hid_t get_hdf5type_char(void) {
hid_t datatype = H5Tcopy(H5T_NATIVE_CHAR);
@@ -353,41 +353,97 @@ static hid_t get_hdf5type_image_attribute_string(void) {
return datatype;
}
-static hid_t get_hdf5type_ndarray(void) {
+static hid_t get_hdf5type_ndarrayblob(void) {
hid_t datatype, vartype, vlvartype;
herr_t h5status;
hsize_t arraydims[1];
- datatype = H5Tcreate(H5T_COMPOUND, sizeof(HDF5_NDArray));
- h5status = H5Tinsert(datatype, "version", HOFFSET(ISMRMRD_NDArray, version), H5T_NATIVE_UINT16);
- h5status = H5Tinsert(datatype, "data_type", HOFFSET(ISMRMRD_NDArray, data_type), H5T_NATIVE_UINT16);
+ datatype = H5Tcreate(H5T_COMPOUND, sizeof(HDF5_NDArrayBlob));
+ h5status = H5Tinsert(datatype, "version", HOFFSET(HDF5_NDArrayBlob, version), H5T_NATIVE_UINT16);
+ h5status = H5Tinsert(datatype, "data_type", HOFFSET(HDF5_NDArrayBlob, data_type), H5T_NATIVE_UINT16);
arraydims[0] = ISMRMRD_NDARRAY_MAXDIM;
vartype = H5Tarray_create2(H5T_NATIVE_UINT16, 1, arraydims);
- h5status = H5Tinsert(datatype, "dims", HOFFSET(ISMRMRD_NDArray, dims), vartype);
+ h5status = H5Tinsert(datatype, "dims", HOFFSET(HDF5_NDArrayBlob, dims), vartype);
vartype = get_hdf5type_char();
vlvartype = H5Tvlen_create(vartype);
- h5status = H5Tinsert(datatype, "data", HOFFSET(HDF5_NDArray, data), vlvartype);
+ h5status = H5Tinsert(datatype, "data", HOFFSET(HDF5_NDArrayBlob, data), vlvartype);
H5Tclose(vartype);
H5Tclose(vlvartype);
if (h5status < 0) {
- ISMRMRD_THROW(ISMRMRD_FILEERROR, "Failed get acquisition data type");
+ ISMRMRD_THROW(ISMRMRD_FILEERROR, "Failed get NDArrayBlob data type");
}
return datatype;
}
-int append_to_vector(const ISMRMRD_Dataset * dset, const char * path, const hid_t datatype, void * elem)
+static hid_t get_hdf5type_ndarray(uint16_t data_type) {
+
+ hid_t hdfdatatype = -1;
+ switch (data_type) {
+ case ISMRMRD_USHORT:
+ hdfdatatype = get_hdf5type_uint16();
+ break;
+ case ISMRMRD_SHORT:
+ hdfdatatype = get_hdf5type_int16();
+ break;
+ case ISMRMRD_UINT:
+ hdfdatatype = get_hdf5type_uint32();
+ break;
+ case ISMRMRD_INT:
+ hdfdatatype = get_hdf5type_int32();
+ break;
+ case ISMRMRD_FLOAT:
+ hdfdatatype = get_hdf5type_float();
+ break;
+ case ISMRMRD_DOUBLE:
+ hdfdatatype = get_hdf5type_double();
+ break;
+ case ISMRMRD_CXFLOAT:
+ hdfdatatype = get_hdf5type_complexfloat();
+ break;
+ case ISMRMRD_CXDOUBLE:
+ hdfdatatype = get_hdf5type_complexdouble();
+ break;
+ default :
+ ISMRMRD_THROW(ISMRMRD_TYPEERROR, "Failed to get HDF5 data type.");
+ }
+ return hdfdatatype;
+}
+
+uint32_t get_number_of_elements(const ISMRMRD_Dataset *dset, const char * path)
+{
+
+ herr_t h5status;
+ uint32_t num;
+
+ if (link_exists(dset, path)) {
+ hid_t dataset = H5Dopen2(dset->fileid, path, H5P_DEFAULT);
+ hid_t dataspace = H5Dget_space(dataset);
+ hsize_t rank = H5Sget_simple_extent_ndims(dataspace);
+ hsize_t dims[rank];
+ hsize_t maxdims[rank];
+ h5status = H5Sget_simple_extent_dims(dataspace, dims, maxdims);
+ num = dims[0];
+ h5status = H5Sclose(dataspace);
+ h5status= H5Dclose(dataset);
+ if (h5status < 0) {
+ ISMRMRD_THROW(ISMRMRD_FILEERROR, "Failed to get number of elements in vector.");
+ }
+ }
+ else {
+ /* none */
+ num = 0;
+ }
+
+ return num;
+}
+
+int append_element(const ISMRMRD_Dataset * dset, const char * path, void * elem, const hid_t datatype, const uint16_t ndim, const uint16_t *dims)
{
hid_t dataset, dataspace, props, filespace, memspace;
herr_t h5status;
- hsize_t ext_dims[1] = {1};
- hsize_t chunk_dims[1] = {1};
- hsize_t offset[1] = {0};
- hsize_t dims[1] = {1};
- hsize_t maxdims[1] = {H5S_UNLIMITED};
- int ndims;
/* Check the path, extend or create if needed, and select the last block */
if (link_exists(dset, path)) {
@@ -395,31 +451,69 @@ int append_to_vector(const ISMRMRD_Dataset * dset, const char * path, const hid_
dataset = H5Dopen2(dset->fileid, path, H5P_DEFAULT);
/* TODO check that the header dataset's datatype is correct */
dataspace = H5Dget_space(dataset);
- ndims = H5Sget_simple_extent_ndims(dataspace);
- if (ndims != 1) {
+ hsize_t rank = H5Sget_simple_extent_ndims(dataspace);
+ if (rank != (ndim+1)) {
ISMRMRD_THROW(ISMRMRD_FILEERROR, "Dimensions are incorrect.");
return ISMRMRD_FILEERROR;
}
- h5status = H5Sget_simple_extent_dims(dataspace, dims, maxdims);
+ hsize_t hdfdims[rank];
+ hsize_t maxdims[rank];
+ h5status = H5Sget_simple_extent_dims(dataspace, hdfdims, maxdims);
+ for (int n = 0; n<ndim; n++) {
+ if (dims[n] != hdfdims[n+1]) {
+ ISMRMRD_THROW(ISMRMRD_FILEERROR, "Dimensions are incorrect.");
+ return ISMRMRD_FILEERROR;
+ }
+ }
/* extend it by one */
- dims[0] += 1;
- h5status = H5Dset_extent(dataset, dims);
+ hdfdims[0] += 1;
+ h5status = H5Dset_extent(dataset, hdfdims);
+ /* Select the last block */
+ hsize_t offset[rank];
+ hsize_t ext_dims[rank];
+ offset[0] = hdfdims[0]-1;
+ ext_dims[0] = 1;
+ for (int n = 0; n<ndim; n++) {
+ offset[n+1] = 0;
+ ext_dims[n+1] = dims[n];
+ }
+ filespace = H5Dget_space(dataset);
+ h5status = H5Sselect_hyperslab (filespace, H5S_SELECT_SET, offset, NULL, ext_dims, NULL);
+ memspace = H5Screate_simple(rank, ext_dims, NULL);
}
else {
/* create a new dataset */
- dataspace = H5Screate_simple(1, dims, maxdims);
+ int rank = ndim+1;
+ hsize_t hdfdims[rank];
+ hsize_t maxdims[rank];
+ hsize_t offset[rank];
+ hsize_t ext_dims[rank];
+ hsize_t chunk_dims[rank];
+ hdfdims[0] = 1;
+ maxdims[0] = H5S_UNLIMITED;
+ offset[0] = 1;
+ ext_dims[0] = 1;
+ chunk_dims[0] = 1;
+ for (int n = 0; n<ndim; n++) {
+ hdfdims[n+1] = dims[n];
+ maxdims[n+1] = dims[n];
+ offset[n+1] = 0;
+ ext_dims[n+1] = dims[n];
+ chunk_dims[n+1] = dims[n];
+ }
+ dataspace = H5Screate_simple(rank, hdfdims, maxdims);
props = H5Pcreate(H5P_DATASET_CREATE);
/* enable chunking so that the dataset is extensible */
- h5status = H5Pset_chunk (props, 1, chunk_dims);
+ h5status = H5Pset_chunk (props, rank, chunk_dims);
/* create */
dataset = H5Dcreate2(dset->fileid, path, datatype, dataspace, H5P_DEFAULT, props, H5P_DEFAULT);
h5status = H5Pclose(props);
+ /* Select the last block */
+ offset[0] = hdfdims[0]-1;
+ filespace = H5Dget_space(dataset);
+ h5status = H5Sselect_hyperslab (filespace, H5S_SELECT_SET, offset, NULL, ext_dims, NULL);
+ memspace = H5Screate_simple(rank, ext_dims, NULL);
}
- /* Select the last block */
- offset[0] = dims[0]-1;
- filespace = H5Dget_space(dataset);
- h5status = H5Sselect_hyperslab (filespace, H5S_SELECT_SET, offset, NULL, ext_dims, NULL);
- memspace = H5Screate_simple(1, ext_dims, NULL);
/* Write it */
/* since this is a 1 element array we can just pass the pointer to the header */
@@ -523,7 +617,7 @@ int ismrmrd_open_dataset(ISMRMRD_Dataset *dset, const bool create_if_needed) {
int val = create_link(dset, dset->groupname);
return val;
-};
+}
int ismrmrd_close_dataset(ISMRMRD_Dataset *dset) {
@@ -540,8 +634,7 @@ int ismrmrd_close_dataset(ISMRMRD_Dataset *dset) {
}
return ISMRMRD_NOERROR;
-};
-
+}
int ismrmrd_write_header(const ISMRMRD_Dataset *dset, const char *xmlstring) {
@@ -580,7 +673,7 @@ int ismrmrd_write_header(const ISMRMRD_Dataset *dset, const char *xmlstring) {
}
return ISMRMRD_NOERROR;
-};
+}
char * ismrmrd_read_header(const ISMRMRD_Dataset *dset) {
@@ -625,39 +718,15 @@ char * ismrmrd_read_header(const ISMRMRD_Dataset *dset) {
return NULL;
}
-};
-
-unsigned long ismrmrd_get_number_of_acquisitions(const ISMRMRD_Dataset *dset) {
+}
- hid_t dataset, dataspace;
- hsize_t dims[1], maxdims[1];
- herr_t h5status;
- unsigned long numacq;
-
+uint32_t ismrmrd_get_number_of_acquisitions(const ISMRMRD_Dataset *dset) {
/* The path to the acqusition data */
char *path = make_path(dset, "data");
-
- if (link_exists(dset, path)) {
- dataset = H5Dopen2(dset->fileid, path, H5P_DEFAULT);
- dataspace = H5Dget_space(dataset);
- h5status = H5Sget_simple_extent_dims(dataspace, dims, maxdims);
- numacq = dims[0];
- h5status = H5Sclose(dataspace);
- h5status= H5Dclose(dataset);
- if (h5status < 0) {
- ISMRMRD_THROW(ISMRMRD_FILEERROR, "Failed to get number of acquisitions.");
- }
- }
- else {
- /* none */
- numacq = 0;
- }
-
+ uint32_t numacq = get_number_of_elements(dset, path);
free(path);
-
return numacq;
-};
-
+}
int ismrmrd_append_acquisition(const ISMRMRD_Dataset *dset, const ISMRMRD_Acquisition *acq) {
@@ -676,7 +745,7 @@ int ismrmrd_append_acquisition(const ISMRMRD_Dataset *dset, const ISMRMRD_Acquis
hdf5acq[0].data.p = acq->data;
/* Write it */
- int status = append_to_vector(dset, path, datatype, hdf5acq);
+ int status = append_element(dset, path, hdf5acq, datatype, 0, NULL);
if (status != ISMRMRD_NOERROR) {
ISMRMRD_THROW(ISMRMRD_FILEERROR, "Failed to append acquisition.");
return status;
@@ -687,9 +756,10 @@ int ismrmrd_append_acquisition(const ISMRMRD_Dataset *dset, const ISMRMRD_Acquis
free(path);
return ISMRMRD_NOERROR;
-};
+}
-int ismrmrd_read_acquisition(const ISMRMRD_Dataset *dset, unsigned long index, ISMRMRD_Acquisition *acq) {
+int ismrmrd_read_acquisition(const ISMRMRD_Dataset *dset, uint32_t index, ISMRMRD_Acquisition *acq)
+{
hid_t dataset, datatype, filespace, memspace;
hsize_t dims[1];
hsize_t offset[1];
@@ -747,7 +817,7 @@ int ismrmrd_read_acquisition(const ISMRMRD_Dataset *dset, unsigned long index, I
}
return ISMRMRD_NOERROR;
-};
+}
int ismrmrd_append_image(const ISMRMRD_Dataset *dset, const char *varname,
const int block_mode, const ISMRMRD_Image *im) {
@@ -764,7 +834,7 @@ int ismrmrd_append_image(const ISMRMRD_Dataset *dset, const char *varname,
/* Handle the header */
char *headerpath = append_to_path(dset, path, "header");
datatype = get_hdf5type_imageheader();
- status = append_to_vector(dset, headerpath, datatype, (void *) &im->head);
+ status = append_element(dset, headerpath, (void *) &im->head, datatype, 0, NULL);
if (status != ISMRMRD_NOERROR) {
ISMRMRD_THROW(ISMRMRD_FILEERROR, "Failed to append image header.");
return ISMRMRD_FILEERROR;
@@ -774,7 +844,7 @@ int ismrmrd_append_image(const ISMRMRD_Dataset *dset, const char *varname,
/* Handle the attribute string */
char *attrpath = append_to_path(dset, path, "attributes");
datatype = get_hdf5type_image_attribute_string();
- status = append_to_vector(dset, attrpath, datatype, (void *) &im->attribute_string);
+ status = append_element(dset, attrpath, (void *) &im->attribute_string, datatype, 0, NULL);
if (status != ISMRMRD_NOERROR) {
ISMRMRD_THROW(ISMRMRD_FILEERROR, "Failed to append image attribute string.");
return ISMRMRD_FILEERROR;
@@ -783,6 +853,17 @@ int ismrmrd_append_image(const ISMRMRD_Dataset *dset, const char *varname,
/* Handle the data */
char *datapath = append_to_path(dset, path, "data");
+ datatype = get_hdf5type_ndarray(im->head.data_type);
+ uint16_t dims[4];
+ dims[0] = im->head.matrix_size[0];
+ dims[1] = im->head.matrix_size[1];
+ dims[2] = im->head.matrix_size[2];
+ dims[3] = im->head.channels;
+ status = append_element(dset, datapath, im->data, datatype, 4, dims);
+ if (status != ISMRMRD_NOERROR) {
+ ISMRMRD_THROW(ISMRMRD_FILEERROR, "Failed to append image data.");
+ return ISMRMRD_FILEERROR;
+ }
free(datapath);
/* Final cleanup */
@@ -792,33 +873,71 @@ int ismrmrd_append_image(const ISMRMRD_Dataset *dset, const char *varname,
return ISMRMRD_NOERROR;
};
-/*****************************/
-/* TODO Implement these ones */
-/*****************************/
-int ismrmrd_read_image(const ISMRMRD_Dataset *dset, const char *varname,
- const unsigned long index, ISMRMRD_Image *im) {
- return ISMRMRD_NOERROR;
-};
-
-int ismrmrd_get_number_of_images(const ISMRMRD_Dataset *dset, const char *varname) {
- return ISMRMRD_NOERROR;
-};
+uint32_t ismrmrd_get_number_of_images(const ISMRMRD_Dataset *dset, const char *varname)
+{
+ /* The group for this set of images */
+ /* /groupname/varname */
+ char *path = make_path(dset, varname);
+ /* The path to the acqusition image headers */
+ char *headerpath = append_to_path(dset, path, "header");
+ uint32_t numimages = get_number_of_elements(dset, headerpath);
+ free(headerpath);
+ free(path);
+ return numimages;
+}
int ismrmrd_append_array(const ISMRMRD_Dataset *dset, const char *varname,
const int block_mode, const ISMRMRD_NDArray *arr) {
+ int status;
+ hid_t datatype;
+
+ /* The group for this set */
+ /* /groupname/varname */
+ char *path = make_path(dset, varname);
+
+ /* Handle the data */
+ datatype = get_hdf5type_ndarray(arr->data_type);
+ uint16_t ndim = arr->ndim;
+ uint16_t dims[ndim];
+ for (int n=0; n<ndim; n++) {
+ dims[n] = arr->dims[n];
+ }
+ status = append_element(dset, path, arr->data, datatype, ndim, dims);
+ if (status != ISMRMRD_NOERROR) {
+ ISMRMRD_THROW(ISMRMRD_FILEERROR, "Failed to append array.");
+ return ISMRMRD_FILEERROR;
+ }
+
+ /* Final cleanup */
+ H5Tclose(datatype);
+ free(path);
+
return ISMRMRD_NOERROR;
};
-int ismrmrd_read_array(const ISMRMRD_Dataset *dataset, const char *varname,
- const unsigned long index, ISMRMRD_NDArray *arr) {
+uint32_t ismrmrd_get_number_of_arrays(const ISMRMRD_Dataset *dset, const char *varname) {
+ /* The group for this set */
+ /* /groupname/varname */
+ char *path = make_path(dset, varname);
+ uint32_t numarrays = get_number_of_elements(dset, path);
+ free(path);
+ return numarrays;
+}
+
+/*****************************/
+/* TODO Implement these ones */
+/*****************************/
+int ismrmrd_read_image(const ISMRMRD_Dataset *dset, const char *varname,
+ const uint32_t index, ISMRMRD_Image *im) {
return ISMRMRD_NOERROR;
};
-int ismrmrd_get_number_of_arrays(const ISMRMRD_Dataset *dset, const char *varname) {
+int ismrmrd_read_array(const ISMRMRD_Dataset *dataset, const char *varname,
+ const uint32_t index, ISMRMRD_NDArray *arr) {
return ISMRMRD_NOERROR;
};
-
+
#ifdef __cplusplus
} /* extern "C" */
} /* ISMRMRD namespace */
diff --git a/ismrmrd_dataset.cpp b/ismrmrd_dataset.cpp
index c33d935..dce1cc9 100644
--- a/ismrmrd_dataset.cpp
+++ b/ismrmrd_dataset.cpp
@@ -70,7 +70,7 @@ int Dataset::appendAcquisition(const Acquisition acq)
return status;
}
-Acquisition * Dataset::readAcquisition(unsigned long index)
+Acquisition * Dataset::readAcquisition(uint32_t index)
{
Acquisition * acq = new Acquisition();
int status = ismrmrd_read_acquisition(&dset_, index, reinterpret_cast<ISMRMRD_Acquisition*>(acq));
@@ -80,15 +80,87 @@ Acquisition * Dataset::readAcquisition(unsigned long index)
return acq;
}
-int Dataset::readAcquisition(unsigned long index, Acquisition * acqptr) {
+int Dataset::readAcquisition(uint32_t index, Acquisition * acqptr) {
int status = ismrmrd_read_acquisition(&dset_, index, reinterpret_cast<ISMRMRD_Acquisition*>(acqptr));
+ if (status != ISMRMRD_NOERROR) {
+ //TODO throw an exception
+ }
+ return status;
+}
+
+
+uint32_t Dataset::getNumberOfAcquisitions()
+{
+ uint32_t num = ismrmrd_get_number_of_acquisitions(&dset_);
+ return num;
+}
+
+// Images
+int Dataset::appendImage(const std::string var, const ISMRMRD_BlockModes blockmode, const Image im)
+{
+ int status = ismrmrd_append_image(&dset_, var.c_str(), blockmode, reinterpret_cast<const ISMRMRD_Image*>(&im));
+ if (status != ISMRMRD_NOERROR) {
+ //TODO throw an exception
+ }
+ return status;
+}
+
+Image * Dataset::readImage(const std::string var, uint32_t index)
+{
+ Image * im = new Image();
+ int status = ismrmrd_read_image(&dset_, var.c_str(), index, reinterpret_cast<ISMRMRD_Image*>(im));
+ if (status != ISMRMRD_NOERROR) {
+ //TODO throw an exception
+ }
+ return im;
+}
+
+int Dataset::readImage(const std::string var, uint32_t index, Image * imptr) {
+ int status = ismrmrd_read_image(&dset_, var.c_str(), index, reinterpret_cast<ISMRMRD_Image*>(imptr));
+ if (status != ISMRMRD_NOERROR) {
+ //TODO throw an exception
+ }
return status;
}
+uint32_t Dataset::getNumberOfImages(const std::string var)
+{
+ uint32_t num = ismrmrd_get_number_of_images(&dset_, var.c_str());
+ return num;
+}
+
+
+// NDArrays
+int Dataset::appendNDArray(const std::string var, const ISMRMRD_BlockModes blockmode, const NDArray arr)
+{
+ int status = ismrmrd_append_array(&dset_, var.c_str(), blockmode, reinterpret_cast<const ISMRMRD_NDArray*>(&arr));
+ if (status != ISMRMRD_NOERROR) {
+ //TODO throw an exception
+ }
+ return status;
+}
+
+NDArray * Dataset::readNDArray(const std::string var, uint32_t index)
+{
+ NDArray * arr = new NDArray();
+ int status = ismrmrd_read_array(&dset_, var.c_str(), index, reinterpret_cast<ISMRMRD_NDArray*>(arr));
+ if (status != ISMRMRD_NOERROR) {
+ //TODO throw an exception
+ }
+ return arr;
+}
+
+int Dataset::readNDArray(const std::string var, uint32_t index, NDArray *arrptr) {
+ int status = ismrmrd_read_array(&dset_, var.c_str(), index, reinterpret_cast<ISMRMRD_NDArray*>(arrptr));
+ if (status != ISMRMRD_NOERROR) {
+ //TODO throw an exception
+ }
+ return status;
+}
-unsigned long Dataset::getNumberOfAcquisitions()
+uint32_t Dataset::getNumberOfNDArrays(const std::string var)
{
- unsigned long num = ismrmrd_get_number_of_acquisitions(&dset_);
+ uint32_t num = ismrmrd_get_number_of_arrays(&dset_, var.c_str());
return num;
}
diff --git a/ismrmrd_dataset.h b/ismrmrd_dataset.h
index 2d8d6d5..5da520d 100644
--- a/ismrmrd_dataset.h
+++ b/ismrmrd_dataset.h
@@ -17,7 +17,7 @@ extern "C" {
*/
enum ISMRMRD_BlockModes {
ISMRMRD_BLOCKMODE_ARRAY,
- ISMRMRD_BLOCKMODE_BLOBS
+ ISMRMRD_BLOCKMODE_BLOB
};
/**
@@ -79,12 +79,12 @@ int ismrmrd_append_acquisition(const ISMRMRD_Dataset *dset, const ISMRMRD_Acquis
/**
* Reads the acquisition with the specified index from the dataset.
*/
-int ismrmrd_read_acquisition(const ISMRMRD_Dataset *dset, unsigned long index, ISMRMRD_Acquisition *acq);
+int ismrmrd_read_acquisition(const ISMRMRD_Dataset *dset, uint32_t index, ISMRMRD_Acquisition *acq);
/**
* Return the number of acquisitions in the dataset.
*/
-unsigned long ismrmrd_get_number_of_acquisitions(const ISMRMRD_Dataset *dset);
+uint32_t ismrmrd_get_number_of_acquisitions(const ISMRMRD_Dataset *dset);
/**
* Appends an Image to the variable named varname in the dataset.
@@ -109,12 +109,12 @@ int ismrmrd_append_image(const ISMRMRD_Dataset *dset, const char *varname,
* The index indicates which image to read from the variable named varname.
*/
int ismrmrd_read_image(const ISMRMRD_Dataset *dset, const char *varname,
- const unsigned long index, ISMRMRD_Image *im);
+ const uint32_t index, ISMRMRD_Image *im);
/**
* Return the number of images in the variable varname in the dataset.
*/
-int ismrmrd_get_number_of_images(const ISMRMRD_Dataset *dset, const char *varname);
+uint32_t ismrmrd_get_number_of_images(const ISMRMRD_Dataset *dset, const char *varname);
/**
* Appends an NDArray to the variable named varname in the dataset.
@@ -137,12 +137,12 @@ int ismrmrd_append_array(const ISMRMRD_Dataset *dset, const char *varname,
* Reads an array from the data file.
*/
int ismrmrd_read_array(const ISMRMRD_Dataset *dataset, const char *varname,
- const unsigned long index, ISMRMRD_NDArray *arr);
+ const uint32_t index, ISMRMRD_NDArray *arr);
/**
* Return the number of arrays in the variable varname in the dataset.
*/
-int ismrmrd_get_number_of_arrays(const ISMRMRD_Dataset *dset, const char *varname);
+uint32_t ismrmrd_get_number_of_arrays(const ISMRMRD_Dataset *dset, const char *varname);
#ifdef __cplusplus
@@ -168,9 +168,19 @@ public:
char * readHeader();
// Acquisitions
int appendAcquisition(const Acquisition acq);
- Acquisition * readAcquisition(unsigned long index);
- int readAcquisition(unsigned long index, Acquisition *acq);
- unsigned long getNumberOfAcquisitions();
+ Acquisition * readAcquisition(uint32_t index);
+ int readAcquisition(uint32_t index, Acquisition *acq);
+ uint32_t getNumberOfAcquisitions();
+ // Images
+ int appendImage(const std::string var, const ISMRMRD_BlockModes blockmode, const Image im);
+ Image * readImage(const std::string var, uint32_t index);
+ int readImage(const std::string var, uint32_t index, Image *imptr);
+ uint32_t getNumberOfImages(const std::string var);
+ // NDArrays
+ int appendNDArray(const std::string var, const ISMRMRD_BlockModes blockmode, const NDArray arr);
+ NDArray * readNDArray(const std::string var, uint32_t index);
+ int readNDArray(const std::string var, uint32_t index, NDArray *arrptr);
+ uint32_t getNumberOfNDArrays(const std::string var);
protected:
ISMRMRD_Dataset dset_;
--
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