1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
|
#include "ismrmrd/dataset.h"
// for memcpy and free in older compilers
#include <string.h>
#include <stdlib.h>
#include <stdexcept>
namespace ISMRMRD {
//
// Dataset class implementation
//
// Constructor
Dataset::Dataset(const char* filename, const char* groupname, bool create_file_if_needed)
{
// TODO error checking and exception throwing
// Initialize the dataset
int status;
status = ismrmrd_init_dataset(&dset_, filename, groupname);
if (status != ISMRMRD_NOERROR) {
throw std::runtime_error(build_exception_string());
}
// Open the file
status = ismrmrd_open_dataset(&dset_, create_file_if_needed);
if (status != ISMRMRD_NOERROR) {
throw std::runtime_error(build_exception_string());
}
}
// Destructor
Dataset::~Dataset()
{
ismrmrd_close_dataset(&dset_);
}
// XML Header
void Dataset::writeHeader(const std::string &xmlstring)
{
int status = ismrmrd_write_header(&dset_, xmlstring.c_str());
if (status != ISMRMRD_NOERROR) {
throw std::runtime_error(build_exception_string());
}
}
void Dataset::readHeader(std::string& xmlstring){
char * temp = ismrmrd_read_header(&dset_);
if (NULL == temp) {
throw std::runtime_error(build_exception_string());
} else {
xmlstring = std::string(temp);
free(temp);
}
}
// Acquisitions
void Dataset::appendAcquisition(const Acquisition &acq)
{
int status = ismrmrd_append_acquisition(&dset_, &acq.acq);
if (status != ISMRMRD_NOERROR) {
throw std::runtime_error(build_exception_string());
}
}
void Dataset::readAcquisition(uint32_t index, Acquisition & acq) {
int status = ismrmrd_read_acquisition(&dset_, index, &acq.acq);
if (status != ISMRMRD_NOERROR) {
throw std::runtime_error(build_exception_string());
}
}
uint32_t Dataset::getNumberOfAcquisitions()
{
uint32_t num = ismrmrd_get_number_of_acquisitions(&dset_);
return num;
}
// Images
template <typename T>void Dataset::appendImage(const std::string &var, const Image<T> &im)
{
int status = ismrmrd_append_image(&dset_, var.c_str(), &im.im);
if (status != ISMRMRD_NOERROR) {
throw std::runtime_error(build_exception_string());
}
}
void Dataset::appendImage(const std::string &var, const ISMRMRD_Image *im)
{
int status = ismrmrd_append_image(&dset_, var.c_str(), im);
if (status != ISMRMRD_NOERROR) {
throw std::runtime_error(build_exception_string());
}
}
void Dataset::appendWaveform(const Waveform &wav) {
int status = ismrmrd_append_waveform(&dset_,&wav);
if (status != ISMRMRD_NOERROR){
throw std::runtime_error(build_exception_string());
}
}
void Dataset::readWaveform(uint32_t index, Waveform &wav) {
int status = ismrmrd_read_waveform(&dset_,index,&wav);
if (status != ISMRMRD_NOERROR){
throw std::runtime_error(build_exception_string());
}
}
uint32_t Dataset::getNumberOfWaveforms() {
return ismrmrd_get_number_of_waveforms(&dset_);
}
// Specific instantiations
template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const Image<uint16_t> &im);
template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const Image<int16_t> &im);
template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const Image<uint32_t> &im);
template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const Image<int32_t> &im);
template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const Image<float> &im);
template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const Image<double> &im);
template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const Image<complex_float_t> &im);
template EXPORTISMRMRD void Dataset::appendImage(const std::string &var, const Image<complex_double_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, &im.im);
if (status != ISMRMRD_NOERROR) {
throw std::runtime_error(build_exception_string());
}
}
// Specific instantiations
template EXPORTISMRMRD void Dataset::readImage(const std::string &var, uint32_t index, Image<uint16_t> &im);
template EXPORTISMRMRD void Dataset::readImage(const std::string &var, uint32_t index, Image<int16_t> &im);
template EXPORTISMRMRD void Dataset::readImage(const std::string &var, uint32_t index, Image<uint32_t> &im);
template EXPORTISMRMRD void Dataset::readImage(const std::string &var, uint32_t index, Image<int32_t> &im);
template EXPORTISMRMRD void Dataset::readImage(const std::string &var, uint32_t index, Image<float> &im);
template EXPORTISMRMRD void Dataset::readImage(const std::string &var, uint32_t index, Image<double> &im);
template EXPORTISMRMRD void Dataset::readImage(const std::string &var, uint32_t index, Image<complex_float_t> &im);
template EXPORTISMRMRD void Dataset::readImage(const std::string &var, uint32_t index, Image<complex_double_t> &im);
uint32_t Dataset::getNumberOfImages(const std::string &var)
{
uint32_t num = ismrmrd_get_number_of_images(&dset_, var.c_str());
return num;
}
// NDArrays
template <typename T> void Dataset::appendNDArray(const std::string &var, const NDArray<T> &arr)
{
int status = ismrmrd_append_array(&dset_, var.c_str(), &arr.arr);
if (status != ISMRMRD_NOERROR) {
throw std::runtime_error(build_exception_string());
}
}
// Specific instantiations
template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const NDArray<uint16_t> &arr);
template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const NDArray<int16_t> &arr);
template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const NDArray<uint32_t> &arr);
template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const NDArray<int32_t> &arr);
template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const NDArray<float> &arr);
template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const NDArray<double> &arr);
template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const NDArray<complex_float_t> &arr);
template EXPORTISMRMRD void Dataset::appendNDArray(const std::string &var, const NDArray<complex_double_t> &arr);
void Dataset::appendNDArray(const std::string &var, const ISMRMRD_NDArray *arr)
{
int status = ismrmrd_append_array(&dset_, var.c_str(), arr);
if (status != ISMRMRD_NOERROR) {
throw std::runtime_error(build_exception_string());
}
}
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, &arr.arr);
if (status != ISMRMRD_NOERROR) {
throw std::runtime_error(build_exception_string());
}
}
// Specific instantiations
template EXPORTISMRMRD void Dataset::readNDArray(const std::string &var, uint32_t index, NDArray<uint16_t> &arr);
template EXPORTISMRMRD void Dataset::readNDArray(const std::string &var, uint32_t index, NDArray<int16_t> &arr);
template EXPORTISMRMRD void Dataset::readNDArray(const std::string &var, uint32_t index, NDArray<uint32_t> &arr);
template EXPORTISMRMRD void Dataset::readNDArray(const std::string &var, uint32_t index, NDArray<int32_t> &arr);
template EXPORTISMRMRD void Dataset::readNDArray(const std::string &var, uint32_t index, NDArray<float> &arr);
template EXPORTISMRMRD void Dataset::readNDArray(const std::string &var, uint32_t index, NDArray<double> &arr);
template EXPORTISMRMRD void Dataset::readNDArray(const std::string &var, uint32_t index, NDArray<complex_float_t> &arr);
template EXPORTISMRMRD void Dataset::readNDArray(const std::string &var, uint32_t index, NDArray<complex_double_t> &arr);
uint32_t Dataset::getNumberOfNDArrays(const std::string &var)
{
uint32_t num = ismrmrd_get_number_of_arrays(&dset_, var.c_str());
return num;
}
} // namespace ISMRMRD
|