Skip to content

Commit

Permalink
More updates to the waveform format
Browse files Browse the repository at this point in the history
  • Loading branch information
dchansen committed Mar 5, 2018
1 parent 78892e0 commit 45168d8
Show file tree
Hide file tree
Showing 13 changed files with 273 additions and 74 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Expand Up @@ -68,7 +68,7 @@ set(ISMRMRD_VERSION_PATCH 0)
set(ISMRMRD_VERSION_STRING ${ISMRMRD_VERSION_MAJOR}.${ISMRMRD_VERSION_MINOR}.${ISMRMRD_VERSION_PATCH})
set(ISMRMRD_SOVERSION ${ISMRMRD_VERSION_MAJOR}.${ISMRMRD_VERSION_MINOR})

set(ISMRMRD_XML_SCHEMA_SHA1 "a18ff3aeaa35aab79e405329d45a99229a996287")
set(ISMRMRD_XML_SCHEMA_SHA1 "f9e6c0f867bd6395642d56cdf0a51b08ee6a636f")

#Remove line breaks and white space that does not change the meaning of the schema
file(STRINGS ${CMAKE_SOURCE_DIR}/schema/ismrmrd.xsd SCHEMA_STRINGS) #Read all strings from file
Expand Down
4 changes: 4 additions & 0 deletions include/ismrmrd/dataset.h
Expand Up @@ -183,6 +183,10 @@ class EXPORTISMRMRD Dataset {
template <typename T> void readNDArray(const std::string &var, uint32_t index, NDArray<T> &arr);
uint32_t getNumberOfNDArrays(const std::string &var);

//Waveforms
void appendWaveform(const Waveform &wav);
void readWaveform(uint32_t index, Waveform & wav);
uint32_t getNumberOfWaveforms();
protected:
ISMRMRD_Dataset dset_;
};
Expand Down
15 changes: 11 additions & 4 deletions include/ismrmrd/waveform.h
Expand Up @@ -42,19 +42,26 @@ typedef struct ISMRMRD_Waveform


EXPORTISMRMRD int ismrmrd_make_consistent_waveform(ISMRMRD_Waveform* wav);
EXPORTISMRMRD int ismrmrd_size_of_waveform_data(ISMRMRD_Waveform* wav);
EXPORTISMRMRD int ismrmrd_size_of_waveform_data(const ISMRMRD_Waveform* wav);
EXPORTISMRMRD ISMRMRD_Waveform* ismrmrd_create_waveform();
EXPORTISMRMRD int ismrmrd_free_waveform(ISMRMRD_Waveform*);
EXPORTISMRMRD int ismrmrd_init_waveform(ISMRMRD_Waveform*);
EXPORTISMRMRD int ismrmrd_init_waveformheader(ISMRMRD_WaveformHeader* header);
EXPORTISMRMRD int ismrmrd_copy_waveform(ISMRMRD_Waveform* dest, const ISMRMRD_Waveform* src);

#ifdef __cplusplus
}
struct Waveform : public ISMRMRD_Waveform {
struct EXPORTISMRMRD Waveform : public ISMRMRD_Waveform {
Waveform();
Waveform(const Waveform &other);
Waveform(Waveform&& other);
Waveform(uint16_t number_of_samples, uint16_t available_channels);
~Waveform();
Waveform & operator=(const Waveform &other);
Waveform & operator=(Waveform &&other);

};
};
};
}

#endif
#endif //ISMRMRD_WAVEFORM_H_H
30 changes: 0 additions & 30 deletions include/ismrmrd/waveformdata.h

This file was deleted.

27 changes: 25 additions & 2 deletions include/ismrmrd/xml.h
Expand Up @@ -289,12 +289,21 @@ namespace ISMRMRD
Optional<std::string> interleavingDimension;
};

enum class TrajectoryType {
CARTESIAN,
EPI,
RADIAL,
GOLDENANGLE,
SPIRAL,
OTHER
};

struct Encoding
{
EncodingSpace encodedSpace;
EncodingSpace reconSpace;
EncodingLimits encodingLimits;
std::string trajectory;
TrajectoryType trajectory;
Optional<TrajectoryDescription> trajectoryDescription;
Optional<ParallelImaging> parallelImaging;
Optional<long> echoTrainLength;
Expand All @@ -310,6 +319,19 @@ namespace ISMRMRD
Optional<std::vector<float> > echo_spacing;
};

enum class WaveformType {
ECG,
PULSE,
RESPIRATORY,
TRIGGER,
GRADIENTWAVEFORM,
OTHER
};
struct WaveformInformation{
std::string waveformName;
WaveformType waveformType;
};

struct IsmrmrdHeader
{
Optional<long> version;
Expand All @@ -320,7 +342,8 @@ namespace ISMRMRD
ExperimentalConditions experimentalConditions;
std::vector<Encoding> encoding;
Optional<SequenceParameters> sequenceParameters;
Optional<UserParameters> userParameters;
Optional<UserParameters> userParameters;
std::vector<WaveformInformation> waveformInformation;
};


Expand Down
6 changes: 6 additions & 0 deletions libsrc/dataset.c
Expand Up @@ -456,6 +456,12 @@ static hid_t get_hdf5type_waveformheader(void) {
vartype = H5Tarray_create2(H5T_NATIVE_CHAR, 1, arraydims);
h5status = H5Tinsert(datatype, "type", HOFFSET(ISMRMRD_AcquisitionHeader, position), vartype);
H5Tclose(vartype);

/* Clean up */
if (h5status < 0) {
ISMRMRD_PUSH_ERR(ISMRMRD_FILEERROR, "Failed get imageheader data type");
}

return datatype;

}
Expand Down
24 changes: 20 additions & 4 deletions libsrc/dataset.cpp
Expand Up @@ -29,10 +29,7 @@ Dataset::Dataset(const char* filename, const char* groupname, bool create_file_i
// Destructor
Dataset::~Dataset()
{
int status = ismrmrd_close_dataset(&dset_);
if (status != ISMRMRD_NOERROR) {
throw std::runtime_error(build_exception_string());
}
ismrmrd_close_dataset(&dset_);
}

// XML Header
Expand Down Expand Up @@ -93,6 +90,25 @@ void Dataset::appendImage(const std::string &var, const ISMRMRD_Image *im)
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);
Expand Down
84 changes: 65 additions & 19 deletions libsrc/waveform.c
Expand Up @@ -12,39 +12,85 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ismrmrd/version.h>

#endif /* __cplusplus */
int ismrmrd_make_consistent_waveform(ISMRMRD_Waveform* wav){

#ifdef __cplusplus
namespace ISMRMRD {
extern "C" {
#endif

int ismrmrd_make_consistent_waveform(ISMRMRD_Waveform *wav) {
size_t data_size;

data_size = ismrmrd_size_of_waveform_data(wav);

if (data_size > 0){
uint32_t* newPtr = (uint32_t *)(realloc(wav->data,data_size));
if (data_size > 0) {
uint32_t *newPtr = (uint32_t *) (realloc(wav->data, data_size));
if (newPtr == NULL) {
return ISMRMRD_PUSH_ERR(ISMRMRD_MEMORYERROR,
"Failed to realloc acquisition data array");
"Failed to realloc acquisition data array");
}
wav->data = newPtr;
}

return ISMRMRD_NOERROR;
}

int ismrmrd_size_of_waveform_data(ISMRMRD_Waveform* wav){
return wav->head.available_channels*wav->head.number_of_samples*sizeof(uint32_t);
int ismrmrd_size_of_waveform_data(const ISMRMRD_Waveform *wav) {
return wav->head.available_channels * wav->head.number_of_samples * sizeof(uint32_t);
}


ISMRMRD_Waveform *ismrmrd_create_waveform() {
ISMRMRD_Waveform *wav = (ISMRMRD_Waveform *) malloc(sizeof(ISMRMRD_Waveform));
if (wav == NULL) {
ISMRMRD_PUSH_ERR(ISMRMRD_MEMORYERROR, "Failed to malloc new ISMRMRD_Waveform.");
return NULL;
}
if (ismrmrd_init_waveform(wav) != ISMRMRD_NOERROR) {
ISMRMRD_PUSH_ERR(ISMRMRD_RUNTIMEERROR, "Failed to initialize waveform.");
return NULL;
}
return wav;
}

int ismrmrd_init_waveformheader(ISMRMRD_WaveformHeader *hdr) {
memset(hdr, 0, sizeof(ISMRMRD_WaveformHeader));
hdr->available_channels = 1;
hdr->version = ISMRMRD_VERSION_MAJOR;
return ISMRMRD_NOERROR;

}

int ismrmrd_init_waveform(ISMRMRD_Waveform *wav) {

ismrmrd_init_waveformheader(&wav->head);
wav->data = NULL;
return ISMRMRD_NOERROR;

}

int ismrmrd_copy_waveform(ISMRMRD_Waveform *dest, const ISMRMRD_Waveform *src) {

if (src == NULL) {
return ISMRMRD_PUSH_ERR(ISMRMRD_RUNTIMEERROR, "Source pointer should not NULL.");
}
if (dest == NULL) {
return ISMRMRD_PUSH_ERR(ISMRMRD_RUNTIMEERROR, "Destination pointer should not NULL.");
}

memcpy(&dest->head, &src->head, sizeof(ISMRMRD_WaveformHeader));
ismrmrd_make_consistent_waveform(dest);

memcpy(dest->data, src->data, ismrmrd_size_of_waveform_data(src));

ISMRMRD_Waveform * ismrmrd_create_waveform() {
ISMRMRD_Waveform *wav = (ISMRMRD_Waveform *)malloc(sizeof(ISMRMRD_Waveform));
if (wav == NULL) {
ISMRMRD_PUSH_ERR(ISMRMRD_MEMORYERROR, "Failed to malloc new ISMRMRD_Waveform.");
return NULL;
}
if (ismrmrd_init_waveform(wav) != ISMRMRD_NOERROR)
{
ISMRMRD_PUSH_ERR(ISMRMRD_RUNTIMEERROR, "Failed to initialize waveform.");
return NULL;
}
return wav;
}
return ISMRMRD_NOERROR;

}

#ifdef __cplusplus
}
}
#endif
32 changes: 32 additions & 0 deletions libsrc/waveform.cpp
Expand Up @@ -2,12 +2,33 @@
// Created by dch on 27/02/18.
//

#include <cstring>
#include "ismrmrd/waveform.h"


ISMRMRD::Waveform::Waveform(uint16_t number_of_samples, uint16_t available_channels) {

ismrmrd_init_waveform(this);
this->data = new uint32_t[number_of_samples*available_channels];
this->head.available_channels = available_channels;
this->head.number_of_samples = number_of_samples;
this->head.waveform_id =0;


}

ISMRMRD::Waveform::Waveform() {
ismrmrd_init_waveform(this);
}

ISMRMRD::Waveform::Waveform(const Waveform &other) {
ismrmrd_copy_waveform(this,&other);
}

ISMRMRD::Waveform::Waveform(Waveform &&other) {
memcpy(&this->head,&other.head,sizeof(ISMRMRD_WaveformHeader));
this->data = other.data;
other.data = nullptr;


}
Expand All @@ -17,5 +38,16 @@ ISMRMRD::Waveform::~Waveform() {

}

ISMRMRD::Waveform & ISMRMRD::Waveform::operator=(Waveform &&other) {
memcpy(&this->head,&other.head,sizeof(ISMRMRD_WaveformHeader));
this->data = other.data;
other.data = nullptr;
return *this;
}

ISMRMRD::Waveform & ISMRMRD::Waveform::operator=(const Waveform &other) {
ismrmrd_copy_waveform(this,&other);
return *this;
}


11 changes: 0 additions & 11 deletions libsrc/waveformdata.cpp

This file was deleted.

0 comments on commit 45168d8

Please sign in to comment.