ISMRMRD
ISMRM Raw Data Format
ismrmrd.h
Go to the documentation of this file.
1 /* ISMRMRD MR Raw Data Strutures */
2 /* DRAFT */
3 /* Authors: */
4 /* Michael S. Hansen (michael.hansen@nih.gov) */
5 /* Brian Hargreaves (bah@stanford.edu) */
6 /* Sebastian Kozerke (kozerke@biomed.ee.ethz.ch) */
7 /* Kaveh Vahedipour (k.vahedipour@fz-juelich.de) */
8 /* Hui Xue (hui.xue@nih.gov) */
9 /* Souheil Inati (souheil.inati@nih.gov) */
10 /* Joseph Naegele (joseph.naegele@nih.gov) */
11 
18 #pragma once
19 #ifndef ISMRMRD_H
20 #define ISMRMRD_H
21 
22 /* Language and cross platform section for defining types */
23 /* integers */
24 #ifdef _MSC_VER /* MS compiler */
25 #ifndef HAS_INT_TYPE
26 typedef __int16 int16_t;
27 typedef unsigned __int16 uint16_t;
28 typedef __int32 int32_t;
29 typedef unsigned __int32 uint32_t;
30 typedef __int64 int64_t;
31 typedef unsigned __int64 uint64_t;
32 #endif
33 #else /* non MS C or C++ compiler */
34 #include <stdint.h>
35 #include <stddef.h> /* for size_t */
36 #endif /* _MSC_VER */
37 
38 /* Complex numbers */
39 #ifdef __cplusplus
40 #include <complex>
41 typedef std::complex<float> complex_float_t;
42 typedef std::complex<double> complex_double_t;
43 #else
44 #ifdef _MSC_VER /* MS C compiler */
45 typedef struct complex_float_t{
46  float real;
47  float imag;
48 }complex_float_t;
49 typedef struct complex_double_t{
50  double real;
51  double imag;
52 }complex_double_t;
53 #else /* C99 compiler */
54 #include <complex.h>
55 typedef float complex complex_float_t;
56 typedef double complex complex_double_t;
57 #endif /* _MSC_VER */
58 #endif /* __cplusplus */
59 
60 /* Booleans - part of C++ */
61 #ifndef __cplusplus
62 #if defined (_MSC_VER) && (_MSC_VER < 1800) /* old MS C compiler */
63 typedef int bool;
64 #define false 0
65 #define true 1
66 #else /* C99 compiler */
67 #include <stdbool.h>
68 #endif /* _MSC_VER */
69 #endif /* __cplusplus */
70 
71 /* Vectors */
72 #ifdef __cplusplus
73 #include <vector>
74 #endif /* __cplusplus */
75 
76 /* Exports needed for MS C++ */
77 #include "ismrmrd/export.h"
78 
79 #pragma pack(push, 2) /* Use 2 byte alignment */
80 
81 #ifdef __cplusplus
82 namespace ISMRMRD {
83 extern "C" {
84 #endif
85 
90  ISMRMRD_USER_INTS = 8,
91  ISMRMRD_USER_FLOATS = 8,
92  ISMRMRD_PHYS_STAMPS = 3,
93  ISMRMRD_CHANNEL_MASKS = 16,
94  ISMRMRD_NDARRAY_MAXDIM = 7,
95  ISMRMRD_POSITION_LENGTH = 3,
96  ISMRMRD_DIRECTION_LENGTH = 3
97 };
98 
99 
104  ISMRMRD_BEGINERROR=-1,
105  ISMRMRD_NOERROR,
106  ISMRMRD_MEMORYERROR,
107  ISMRMRD_FILEERROR,
108  ISMRMRD_TYPEERROR,
109  ISMRMRD_RUNTIMEERROR,
110  ISMRMRD_HDF5ERROR,
111  ISMRMRD_ENDERROR
112 };
113 
126 };
127 
129 EXPORTISMRMRD size_t ismrmrd_sizeof_data_type(int data_type);
130 
135  ISMRMRD_ACQ_FIRST_IN_ENCODE_STEP1 = 1,
136  ISMRMRD_ACQ_LAST_IN_ENCODE_STEP1 = 2,
137  ISMRMRD_ACQ_FIRST_IN_ENCODE_STEP2 = 3,
138  ISMRMRD_ACQ_LAST_IN_ENCODE_STEP2 = 4,
139  ISMRMRD_ACQ_FIRST_IN_AVERAGE = 5,
140  ISMRMRD_ACQ_LAST_IN_AVERAGE = 6,
141  ISMRMRD_ACQ_FIRST_IN_SLICE = 7,
142  ISMRMRD_ACQ_LAST_IN_SLICE = 8,
143  ISMRMRD_ACQ_FIRST_IN_CONTRAST = 9,
144  ISMRMRD_ACQ_LAST_IN_CONTRAST = 10,
145  ISMRMRD_ACQ_FIRST_IN_PHASE = 11,
146  ISMRMRD_ACQ_LAST_IN_PHASE = 12,
147  ISMRMRD_ACQ_FIRST_IN_REPETITION = 13,
148  ISMRMRD_ACQ_LAST_IN_REPETITION = 14,
149  ISMRMRD_ACQ_FIRST_IN_SET = 15,
150  ISMRMRD_ACQ_LAST_IN_SET = 16,
151  ISMRMRD_ACQ_FIRST_IN_SEGMENT = 17,
152  ISMRMRD_ACQ_LAST_IN_SEGMENT = 18,
153  ISMRMRD_ACQ_IS_NOISE_MEASUREMENT = 19,
154  ISMRMRD_ACQ_IS_PARALLEL_CALIBRATION = 20,
155  ISMRMRD_ACQ_IS_PARALLEL_CALIBRATION_AND_IMAGING = 21,
156  ISMRMRD_ACQ_IS_REVERSE = 22,
157  ISMRMRD_ACQ_IS_NAVIGATION_DATA = 23,
158  ISMRMRD_ACQ_IS_PHASECORR_DATA = 24,
159  ISMRMRD_ACQ_LAST_IN_MEASUREMENT = 25,
160  ISMRMRD_ACQ_IS_HPFEEDBACK_DATA = 26,
161  ISMRMRD_ACQ_IS_DUMMYSCAN_DATA = 27,
162  ISMRMRD_ACQ_IS_RTFEEDBACK_DATA = 28,
163  ISMRMRD_ACQ_IS_SURFACECOILCORRECTIONSCAN_DATA = 29,
164 
165 
166  ISMRMRD_ACQ_COMPRESSION1 = 53,
167  ISMRMRD_ACQ_COMPRESSION2 = 54,
168  ISMRMRD_ACQ_COMPRESSION3 = 55,
169  ISMRMRD_ACQ_COMPRESSION4 = 56,
170  ISMRMRD_ACQ_USER1 = 57,
171  ISMRMRD_ACQ_USER2 = 58,
172  ISMRMRD_ACQ_USER3 = 59,
173  ISMRMRD_ACQ_USER4 = 60,
174  ISMRMRD_ACQ_USER5 = 61,
175  ISMRMRD_ACQ_USER6 = 62,
176  ISMRMRD_ACQ_USER7 = 63,
177  ISMRMRD_ACQ_USER8 = 64
178 };
179 
184  ISMRMRD_IMTYPE_MAGNITUDE = 1,
185  ISMRMRD_IMTYPE_PHASE = 2,
186  ISMRMRD_IMTYPE_REAL = 3,
187  ISMRMRD_IMTYPE_IMAG = 4,
188  ISMRMRD_IMTYPE_COMPLEX = 5
189 };
190 
195  ISMRMRD_IMAGE_IS_NAVIGATION_DATA = 1,
196  ISMRMRD_IMAGE_USER1 = 57,
197  ISMRMRD_IMAGE_USER2 = 58,
198  ISMRMRD_IMAGE_USER3 = 59,
199  ISMRMRD_IMAGE_USER4 = 60,
200  ISMRMRD_IMAGE_USER5 = 61,
201  ISMRMRD_IMAGE_USER6 = 62,
202  ISMRMRD_IMAGE_USER7 = 63,
203  ISMRMRD_IMAGE_USER8 = 64
204 };
205 
209 typedef struct ISMRMRD_EncodingCounters {
212  uint16_t average;
213  uint16_t slice;
214  uint16_t contrast;
215  uint16_t phase;
216  uint16_t repetition;
217  uint16_t set;
218  uint16_t segment;
219  uint16_t user[ISMRMRD_USER_INTS];
221 
226  uint16_t version;
227  uint64_t flags;
228  uint32_t measurement_uid;
229  uint32_t scan_counter;
231  uint32_t physiology_time_stamp[ISMRMRD_PHYS_STAMPS];
232  uint16_t number_of_samples;
234  uint16_t active_channels;
235  uint64_t channel_mask[ISMRMRD_CHANNEL_MASKS];
236  uint16_t discard_pre;
237  uint16_t discard_post;
238  uint16_t center_sample;
242  float position[3];
243  float read_dir[3];
244  float phase_dir[3];
245  float slice_dir[3];
248  int32_t user_int[ISMRMRD_USER_INTS];
249  float user_float[ISMRMRD_USER_FLOATS];
251 
258 
260 typedef struct ISMRMRD_Acquisition {
262  float *traj;
263  complex_float_t *data;
265 
269 EXPORTISMRMRD ISMRMRD_Acquisition * ismrmrd_create_acquisition();
270 EXPORTISMRMRD int ismrmrd_free_acquisition(ISMRMRD_Acquisition *acq);
271 EXPORTISMRMRD int ismrmrd_init_acquisition(ISMRMRD_Acquisition *acq);
272 EXPORTISMRMRD int ismrmrd_cleanup_acquisition(ISMRMRD_Acquisition *acq);
273 EXPORTISMRMRD int ismrmrd_copy_acquisition(ISMRMRD_Acquisition *acqdest, const ISMRMRD_Acquisition *acqsource);
274 EXPORTISMRMRD int ismrmrd_make_consistent_acquisition(ISMRMRD_Acquisition *acq);
275 EXPORTISMRMRD size_t ismrmrd_size_of_acquisition_traj(const ISMRMRD_Acquisition *acq);
276 EXPORTISMRMRD size_t ismrmrd_size_of_acquisition_data(const ISMRMRD_Acquisition *acq);
279 /**********/
280 /* Images */
281 /**********/
282 
286 typedef struct ISMRMRD_ImageHeader {
287  uint16_t version;
288  uint16_t data_type;
289  uint64_t flags;
290  uint32_t measurement_uid;
291  uint16_t matrix_size[3];
292  float field_of_view[3];
293  uint16_t channels;
294  float position[3];
295  float read_dir[3];
296  float phase_dir[3];
297  float slice_dir[3];
299  uint16_t average;
300  uint16_t slice;
301  uint16_t contrast;
302  uint16_t phase;
303  uint16_t repetition;
304  uint16_t set;
306  uint32_t physiology_time_stamp[ISMRMRD_PHYS_STAMPS];
307  uint16_t image_type;
308  uint16_t image_index;
310  int32_t user_int[ISMRMRD_USER_INTS];
311  float user_float[ISMRMRD_USER_FLOATS];
314 
316 EXPORTISMRMRD int ismrmrd_init_image_header(ISMRMRD_ImageHeader *hdr);
317 
322 typedef struct ISMRMRD_Image {
323  ISMRMRD_ImageHeader head;
324  char *attribute_string;
325  void *data;
326 } ISMRMRD_Image;
327 
328 
332 EXPORTISMRMRD ISMRMRD_Image * ismrmrd_create_image();
333 EXPORTISMRMRD int ismrmrd_free_image(ISMRMRD_Image *im);
334 EXPORTISMRMRD int ismrmrd_init_image(ISMRMRD_Image *im);
335 EXPORTISMRMRD int ismrmrd_cleanup_image(ISMRMRD_Image *im);
336 EXPORTISMRMRD int ismrmrd_copy_image(ISMRMRD_Image *imdest, const ISMRMRD_Image *imsource);
337 EXPORTISMRMRD int ismrmrd_make_consistent_image(ISMRMRD_Image *im);
338 EXPORTISMRMRD size_t ismrmrd_size_of_image_attribute_string(const ISMRMRD_Image *im);
339 EXPORTISMRMRD size_t ismrmrd_size_of_image_data(const ISMRMRD_Image *im);
342 /************/
343 /* NDArrays */
344 /************/
345 
349 typedef struct ISMRMRD_NDArray {
350  uint16_t version;
351  uint16_t data_type;
352  uint16_t ndim;
353  size_t dims[ISMRMRD_NDARRAY_MAXDIM];
354  void *data;
356 
360 EXPORTISMRMRD ISMRMRD_NDArray * ismrmrd_create_ndarray();
361 EXPORTISMRMRD int ismrmrd_free_ndarray(ISMRMRD_NDArray *arr);
362 EXPORTISMRMRD int ismrmrd_init_ndarray(ISMRMRD_NDArray *arr);
363 EXPORTISMRMRD int ismrmrd_cleanup_ndarray(ISMRMRD_NDArray *arr);
364 EXPORTISMRMRD int ismrmrd_copy_ndarray(ISMRMRD_NDArray *arrdest, const ISMRMRD_NDArray *arrsource);
365 EXPORTISMRMRD int ismrmrd_make_consistent_ndarray(ISMRMRD_NDArray *arr);
366 EXPORTISMRMRD size_t ismrmrd_size_of_ndarray_data(const ISMRMRD_NDArray *arr);
369 /*********/
370 /* Flags */
371 /*********/
375 EXPORTISMRMRD bool ismrmrd_is_flag_set(const uint64_t flags, const uint64_t val);
376 EXPORTISMRMRD int ismrmrd_set_flag(uint64_t *flags, const uint64_t val);
377 EXPORTISMRMRD int ismrmrd_set_flags(uint64_t *flags, const uint64_t val);
378 EXPORTISMRMRD int ismrmrd_clear_flag(uint64_t *flags, const uint64_t val);
379 EXPORTISMRMRD int ismrmrd_clear_all_flags(uint64_t *flags);
382 /*****************/
383 /* Channel Masks */
384 /*****************/
388 EXPORTISMRMRD bool ismrmrd_is_channel_on(const uint64_t channel_mask[ISMRMRD_CHANNEL_MASKS], const uint16_t chan);
389 EXPORTISMRMRD int ismrmrd_set_channel_on(uint64_t channel_mask[ISMRMRD_CHANNEL_MASKS], const uint16_t chan);
390 EXPORTISMRMRD int ismrmrd_set_channel_off(uint64_t channel_mask[ISMRMRD_CHANNEL_MASKS], const uint16_t chan);
391 EXPORTISMRMRD int ismrmrd_set_all_channels_off(uint64_t channel_mask[ISMRMRD_CHANNEL_MASKS]);
394 /******************/
395 /* Error Handling */
396 /******************/
400 typedef void (*ismrmrd_error_handler_t)(const char *file, int line,
401  const char *function, int code, const char *msg);
402 #define ISMRMRD_PUSH_ERR(code, msg) ismrmrd_push_error(__FILE__, __LINE__, \
403  __func__, (code), (msg))
404 int ismrmrd_push_error(const char *file, const int line, const char *func,
405  const int code, const char *msg);
407 EXPORTISMRMRD void ismrmrd_set_error_handler(ismrmrd_error_handler_t);
409 EXPORTISMRMRD char *ismrmrd_strerror(int code);
414 bool ismrmrd_pop_error(char **file, int *line, char **func,
415  int *code, char **msg);
416 
417 /*****************************/
418 /* Rotations and Quaternions */
419 /*****************************/
424 EXPORTISMRMRD int ismrmrd_sign_of_directions(float const read_dir[3], float const phase_dir[3], float const slice_dir[3]);
425 
427 EXPORTISMRMRD void ismrmrd_directions_to_quaternion(float const read_dir[3], float const phase_dir[3], float const slice_dir[3], float quat[4]);
428 
430 EXPORTISMRMRD void ismrmrd_quaternion_to_directions(float const quat[4], float read_dir[3], float phase_dir[3], float slice_dir[3]);
433 #pragma pack(pop) /* Restore old alignment */
434 
435 #ifdef __cplusplus
436 } // extern "C"
437 
439 
441 std::string build_exception_string(void);
442 
445 
446 
452 bool operator==(const EncodingCounters& ec1, const EncodingCounters& ec2);
453 
455 template <typename T> EXPORTISMRMRD ISMRMRD_DataTypes get_data_type();
456 
458 class EXPORTISMRMRD FlagBit
459 {
460 public:
461  FlagBit(unsigned short b)
462  : bitmask_(0)
463  {
464  if (b > 0) {
465  bitmask_ = 1;
466  bitmask_ = (bitmask_ << (b-1));
467  }
468  }
469 
470  bool isSet(const uint64_t& m) const {
471  return ((m & bitmask_)>0);
472  }
473 
474  uint64_t bitmask_;
475 
476 };
477 
479 class EXPORTISMRMRD AcquisitionHeader: public ISMRMRD_AcquisitionHeader {
480 public:
481  // Constructors
483 
484 
485  bool operator==(const AcquisitionHeader& acq) const;
486 
487  // Flag methods
488  bool isFlagSet(const ISMRMRD_AcquisitionFlags val) const;
489  void setFlag(const ISMRMRD_AcquisitionFlags val);
490  void clearFlag(const ISMRMRD_AcquisitionFlags val);
491  void clearAllFlags();
492 
493  // Channel mask methods
494  bool isChannelActive(uint16_t channel_id) const;
495  void setChannelActive(uint16_t channel_id);
496  void setChannelNotActive(uint16_t channel_id);
497  void setAllChannelsNotActive();
498 
499 };
500 
502 class EXPORTISMRMRD Acquisition {
503  friend class Dataset;
504 public:
505  // Constructors, assignment, destructor
506  Acquisition();
507  Acquisition(uint16_t num_samples, uint16_t active_channels=1, uint16_t trajectory_dimensions=0);
508  Acquisition(const Acquisition &other);
509  Acquisition & operator= (const Acquisition &other);
510  ~Acquisition();
511 
512  // Accessors and mutators
513  const uint16_t &version();
514  const uint64_t &flags();
515  uint32_t &measurement_uid();
516  uint32_t &scan_counter();
517  uint32_t &acquisition_time_stamp();
518  uint32_t (&physiology_time_stamp())[ISMRMRD_PHYS_STAMPS];
519  const uint16_t &number_of_samples();
520  uint16_t &available_channels();
521  const uint16_t &active_channels();
522  const uint64_t (&channel_mask())[ISMRMRD_CHANNEL_MASKS];
523  uint16_t &discard_pre();
524  uint16_t &discard_post();
525  uint16_t &center_sample();
526  uint16_t &encoding_space_ref();
527  const uint16_t &trajectory_dimensions();
528  float &sample_time_us();
529  float (&position())[3];
530  float (&read_dir())[3];
531  float (&phase_dir())[3];
532  float (&slice_dir())[3];
533  float (&patient_table_position())[3];
535  int32_t (&user_int())[ISMRMRD_USER_INTS];
536  float (&user_float())[ISMRMRD_USER_FLOATS];
537 
538  // Sizes
539  void resize(uint16_t num_samples, uint16_t active_channels=1, uint16_t trajectory_dimensions=0);
540  size_t getNumberOfDataElements() const;
541  size_t getNumberOfTrajElements() const;
542  size_t getDataSize() const;
543  size_t getTrajSize() const;
544 
545  // Header, data and trajectory accessors
546  const AcquisitionHeader &getHead() const;
547  void setHead(const AcquisitionHeader &other);
548 
552  const complex_float_t * getDataPtr() const;
553  complex_float_t * getDataPtr();
554 
558  complex_float_t & data(uint16_t sample, uint16_t channel);
559 
563  void setData(complex_float_t * data);
564 
568  complex_float_t * data_begin() const;
569 
573  complex_float_t * data_end() const;
574 
578  const float * getTrajPtr() const;
579  float * getTrajPtr();
580 
584  float & traj(uint16_t dimension, uint16_t sample);
585 
589  void setTraj(float * traj);
590 
594  float * traj_begin() const;
595 
599  float * traj_end() const;
600 
601  // Flag methods
602  bool isFlagSet(const uint64_t val);
603  void setFlag(const uint64_t val);
604  void clearFlag(const uint64_t val);
605  void clearAllFlags();
606 
607  bool isFlagSet(const FlagBit &val) { return isFlagSet(val.bitmask_); }
608  void setFlag(const FlagBit &val) { setFlag(val.bitmask_); }
609  void clearFlag(const FlagBit &val) { clearFlag(val.bitmask_); }
610 
611  // Channel mask methods
612  bool isChannelActive(uint16_t channel_id);
613  void setChannelActive(uint16_t channel_id);
614  void setChannelNotActive(uint16_t channel_id);
615  void setAllChannelsNotActive();
616 
617 protected:
619 };
620 
622 class EXPORTISMRMRD ImageHeader: public ISMRMRD_ImageHeader {
623 public:
624  // Constructor
625  ImageHeader();
626 
627  // Flag methods
628  bool isFlagSet(const uint64_t val);
629  void setFlag(const uint64_t val);
630  void clearFlag(const uint64_t val);
631  void clearAllFlags();
632 
633 };
634 
636 template <typename T> class EXPORTISMRMRD Image {
637  friend class Dataset;
638 public:
639  // Constructors
640  Image(uint16_t matrix_size_x = 0, uint16_t matrix_size_y = 1,
641  uint16_t matrix_size_z = 1, uint16_t channels = 1);
642  Image(const Image &other);
643  Image & operator= (const Image &other);
644  ~Image();
645 
646  // Image dimensions
647  void resize(uint16_t matrix_size_x, uint16_t matrix_size_y, uint16_t matrix_size_z, uint16_t channels);
648  uint16_t getMatrixSizeX() const;
649  void setMatrixSizeX(uint16_t matrix_size_x);
650  uint16_t getMatrixSizeY() const;
651  void setMatrixSizeY(uint16_t matrix_size_y);
652  uint16_t getMatrixSizeZ() const;
653  void setMatrixSizeZ(uint16_t matrix_size_z);
654  uint16_t getNumberOfChannels() const;
655  void setNumberOfChannels(uint16_t channels);
656 
657  // Field of view
658  void setFieldOfView(float fov_x, float fov_y, float fov_z);
659  float getFieldOfViewX() const;
660  void setFieldOfViewX(float f);
661  float getFieldOfViewY() const;
662  void setFieldOfViewY(float f);
663  float getFieldOfViewZ() const;
664  void setFieldOfViewZ(float f);
665 
666  // Positions and orientations
667  void setPosition(float x, float y, float z);
668  float getPositionX() const;
669  void setPositionX(float x);
670  float getPositionY() const;
671  void setPositionY(float y);
672  float getPositionZ() const;
673  void setPositionZ(float z);
674 
675  void setReadDirection(float x, float y, float z);
676  float getReadDirectionX() const;
677  void setReadDirectionX(float x);
678  float getReadDirectionY() const;
679  void setReadDirectionY(float y);
680  float getReadDirectionZ() const;
681  void setReadDirectionZ(float z);
682 
683  void setPhaseDirection(float x, float y, float z);
684  float getPhaseDirectionX() const;
685  void setPhaseDirectionX(float x);
686  float getPhaseDirectionY() const;
687  void setPhaseDirectionY(float y);
688  float getPhaseDirectionZ() const;
689  void setPhaseDirectionZ(float z);
690 
691  void setSliceDirection(float x, float y, float z);
692  float getSliceDirectionX() const;
693  void setSliceDirectionX(float x);
694  float getSliceDirectionY() const;
695  void setSliceDirectionY(float y);
696  float getSliceDirectionZ() const;
697  void setSliceDirectionZ(float z);
698 
699  void setPatientTablePosition(float x, float y, float z);
700  float getPatientTablePositionX() const;
701  void setPatientTablePositionX(float x);
702  float getPatientTablePositionY() const;
703  void setPatientTablePositionY(float y);
704  float getPatientTablePositionZ() const;
705  void setPatientTablePositionZ(float z);
706 
707 
708  // Attributes
709  uint16_t getVersion() const;
710  ISMRMRD_DataTypes getDataType() const;
711 
712  // Counters and labels
713  uint32_t getMeasurementUid() const;
714  void setMeasurementUid(uint32_t measurement_uid);
715 
716  uint16_t getAverage() const;
717  void setAverage(uint16_t average);
718 
719  uint16_t getSlice() const;
720  void setSlice(uint16_t slice);
721 
722  uint16_t getContrast() const;
723  void setContrast(uint16_t contrast);
724 
725  uint16_t getPhase() const;
726  void setPhase(uint16_t phase);
727 
728  uint16_t getRepetition() const;
729  void setRepetition(uint16_t repetition);
730 
731  uint16_t getSet() const;
732  void setSet(uint16_t set);
733 
734  uint32_t getAcquisitionTimeStamp() const;
735  void setAcquisitionTimeStamp(uint32_t acquisition_time_stamp);
736 
737  uint32_t getPhysiologyTimeStamp(unsigned int stamp_id) const;
738  void setPhysiologyTimeStamp(unsigned int stamp_id, uint32_t value);
739 
740  uint16_t getImageType() const;
741  void setImageType(uint16_t image_type);
742 
743  uint16_t getImageIndex() const;
744  void setImageIndex(uint16_t image_index);
745 
746  uint16_t getImageSeriesIndex() const;
747  void setImageSeriesIndex(uint16_t image_series_index);
748 
749  // User parameters
750  float getUserFloat(unsigned int index) const;
751  void setUserFloat(unsigned int index, float value);
752 
753  int32_t getUserInt(unsigned int index) const;
754  void setUserInt(unsigned int index, int32_t value);
755 
756  // Flags
757  uint64_t getFlags() const;
758  void setFlags(const uint64_t flags);
759  bool isFlagSet(const uint64_t val) const;
760  void setFlag(const uint64_t val);
761  void clearFlag(const uint64_t val);
762  void clearAllFlags();
763 
764  // Header
765  ImageHeader & getHead();
766  const ImageHeader & getHead() const;
767  void setHead(const ImageHeader& head);
768 
769  // Attribute string
770  void getAttributeString(std::string &attr) const;
771  const char *getAttributeString() const;
772  void setAttributeString(const std::string &attr);
773  void setAttributeString(const char *attr);
774  size_t getAttributeStringLength() const;
775 
776  // Data
777  T * getDataPtr();
778  const T * getDataPtr() const;
780  size_t getNumberOfDataElements() const;
782  size_t getDataSize() const;
783 
785  T* begin();
786 
788  T* end();
789 
791  T & operator () (uint16_t x, uint16_t y=0, uint16_t z=0 , uint16_t channel =0);
792 
793 protected:
794  ISMRMRD_Image im;
795 };
796 
798 template <typename T> class EXPORTISMRMRD NDArray {
799  friend class Dataset;
800 public:
801  // Constructors, destructor and copy
802  NDArray();
803  NDArray(const std::vector<size_t> dimvec);
804  NDArray(const NDArray<T> &other);
805  ~NDArray();
806  NDArray<T> & operator= (const NDArray<T> &other);
807 
808  // Accessors and mutators
809  uint16_t getVersion() const;
810  ISMRMRD_DataTypes getDataType() const;
811  uint16_t getNDim() const;
812  const size_t (&getDims())[ISMRMRD_NDARRAY_MAXDIM];
813  size_t getDataSize() const;
814  void resize(const std::vector<size_t> dimvec);
815  size_t getNumberOfElements() const;
816  T * getDataPtr();
817  const T * getDataPtr() const;
818 
820  T * begin();
821 
823  T* end();
824 
826  T & operator () (uint16_t x, uint16_t y=0, uint16_t z=0, uint16_t w=0, uint16_t n=0, uint16_t m=0, uint16_t l=0);
827 
828 protected:
829  ISMRMRD_NDArray arr;
830 };
831 
832 
835 } // namespace ISMRMRD
836 
837 #endif
838 
839 #endif /* ISMRMRD_H */
ISMRMRD::ISMRMRD_ImageHeader::set
uint16_t set
Definition: ismrmrd.h:304
ISMRMRD::ISMRMRD_EncodingCounters::contrast
uint16_t contrast
Definition: ismrmrd.h:214
ISMRMRD::ISMRMRD_ImageHeader::image_series_index
uint16_t image_series_index
Definition: ismrmrd.h:309
ISMRMRD::ISMRMRD_EncodingCounters::average
uint16_t average
Definition: ismrmrd.h:212
ISMRMRD::ISMRMRD_AcquisitionHeader::user_int
int32_t user_int[ISMRMRD_USER_INTS]
Definition: ismrmrd.h:248
ISMRMRD::ISMRMRD_ImageHeader
Definition: ismrmrd.h:286
ISMRMRD::ismrmrd_sizeof_data_type
EXPORTISMRMRD size_t ismrmrd_sizeof_data_type(int data_type)
Definition: ismrmrd.c:450
ISMRMRD::ISMRMRD_EncodingCounters::kspace_encode_step_2
uint16_t kspace_encode_step_2
Definition: ismrmrd.h:211
ISMRMRD::ismrmrd_push_error
int ismrmrd_push_error(const char *file, const int line, const char *func, const int code, const char *msg)
Definition: ismrmrd.c:684
ISMRMRD::EncodingCounters
ISMRMRD_EncodingCounters EncodingCounters
Some typedefs to beautify the namespace.
Definition: ismrmrd.h:444
ISMRMRD::ISMRMRD_ImageHeader::measurement_uid
uint32_t measurement_uid
Definition: ismrmrd.h:290
ISMRMRD::ISMRMRD_ImageHeader::phase
uint16_t phase
Definition: ismrmrd.h:302
ISMRMRD::ISMRMRD_AcquisitionHeader::flags
uint64_t flags
Definition: ismrmrd.h:227
ISMRMRD::Dataset
Definition: dataset.h:161
ISMRMRD::ISMRMRD_ImageHeader::image_type
uint16_t image_type
Definition: ismrmrd.h:307
ISMRMRD::ISMRMRD_USHORT
@ ISMRMRD_USHORT
Definition: ismrmrd.h:118
ISMRMRD::ISMRMRD_UINT
@ ISMRMRD_UINT
Definition: ismrmrd.h:120
ISMRMRD::ISMRMRD_ImageHeader::image_index
uint16_t image_index
Definition: ismrmrd.h:308
ISMRMRD::ISMRMRD_AcquisitionHeader::position
float position[3]
Definition: ismrmrd.h:242
ISMRMRD::Image
MR Image type.
Definition: ismrmrd.h:636
ISMRMRD::ISMRMRD_AcquisitionHeader::phase_dir
float phase_dir[3]
Definition: ismrmrd.h:244
ISMRMRD::ISMRMRD_ImageHeader::user_float
float user_float[ISMRMRD_USER_FLOATS]
Definition: ismrmrd.h:311
ISMRMRD::ISMRMRD_EncodingCounters::segment
uint16_t segment
Definition: ismrmrd.h:218
ISMRMRD::ISMRMRD_EncodingCounters::slice
uint16_t slice
Definition: ismrmrd.h:213
ISMRMRD::ISMRMRD_AcquisitionHeader::measurement_uid
uint32_t measurement_uid
Definition: ismrmrd.h:228
ISMRMRD::ISMRMRD_EncodingCounters
struct ISMRMRD::ISMRMRD_EncodingCounters ISMRMRD_EncodingCounters
ISMRMRD::ISMRMRD_Constants
ISMRMRD_Constants
Definition: ismrmrd.h:89
ISMRMRD::ISMRMRD_NDArray::data_type
uint16_t data_type
Definition: ismrmrd.h:351
ISMRMRD::ISMRMRD_DOUBLE
@ ISMRMRD_DOUBLE
Definition: ismrmrd.h:123
ISMRMRD::ISMRMRD_ImageHeader::attribute_string_len
uint32_t attribute_string_len
Definition: ismrmrd.h:312
ISMRMRD::ISMRMRD_AcquisitionHeader
Definition: ismrmrd.h:225
ISMRMRD::ismrmrd_strerror
EXPORTISMRMRD char * ismrmrd_strerror(int code)
Definition: ismrmrd.c:749
ISMRMRD::ISMRMRD_EncodingCounters::kspace_encode_step_1
uint16_t kspace_encode_step_1
Definition: ismrmrd.h:210
ISMRMRD::ISMRMRD_AcquisitionHeader::available_channels
uint16_t available_channels
Definition: ismrmrd.h:233
ISMRMRD::ismrmrd_sign_of_directions
EXPORTISMRMRD int ismrmrd_sign_of_directions(float const read_dir[3], float const phase_dir[3], float const slice_dir[3])
Definition: ismrmrd.c:573
ISMRMRD::ISMRMRD_AcquisitionHeader::scan_counter
uint32_t scan_counter
Definition: ismrmrd.h:229
ISMRMRD::ISMRMRD_ImageHeader::contrast
uint16_t contrast
Definition: ismrmrd.h:301
ISMRMRD::ISMRMRD_NDArray
struct ISMRMRD::ISMRMRD_NDArray ISMRMRD_NDArray
ISMRMRD::ismrmrd_directions_to_quaternion
EXPORTISMRMRD void ismrmrd_directions_to_quaternion(float const read_dir[3], float const phase_dir[3], float const slice_dir[3], float quat[4])
Definition: ismrmrd.c:589
ISMRMRD::ImageHeader
Header for MR Image type.
Definition: ismrmrd.h:622
ISMRMRD::ISMRMRD_ImageTypes
ISMRMRD_ImageTypes
Definition: ismrmrd.h:183
ISMRMRD::ISMRMRD_Acquisition
struct ISMRMRD::ISMRMRD_Acquisition ISMRMRD_Acquisition
ISMRMRD::ISMRMRD_FLOAT
@ ISMRMRD_FLOAT
Definition: ismrmrd.h:122
ISMRMRD::ismrmrd_init_acquisition_header
EXPORTISMRMRD int ismrmrd_init_acquisition_header(ISMRMRD_AcquisitionHeader *hdr)
Definition: ismrmrd.c:42
ISMRMRD::ISMRMRD_CXDOUBLE
@ ISMRMRD_CXDOUBLE
Definition: ismrmrd.h:125
ISMRMRD::ISMRMRD_ImageHeader::version
uint16_t version
Definition: ismrmrd.h:287
ISMRMRD::build_exception_string
std::string build_exception_string(void)
ISMRMRD C++ Interface.
Definition: ismrmrd.cpp:1240
ISMRMRD::ISMRMRD_AcquisitionHeader::idx
ISMRMRD_EncodingCounters idx
Definition: ismrmrd.h:247
ISMRMRD::ISMRMRD_ImageHeader::average
uint16_t average
Definition: ismrmrd.h:299
ISMRMRD::AcquisitionHeader
Header for MR Acquisition type.
Definition: ismrmrd.h:479
ISMRMRD::ISMRMRD_ImageHeader::acquisition_time_stamp
uint32_t acquisition_time_stamp
Definition: ismrmrd.h:305
ISMRMRD::ISMRMRD_AcquisitionHeader::patient_table_position
float patient_table_position[3]
Definition: ismrmrd.h:246
ISMRMRD::ISMRMRD_ImageHeader::phase_dir
float phase_dir[3]
Definition: ismrmrd.h:296
ISMRMRD::ISMRMRD_ImageHeader::field_of_view
float field_of_view[3]
Definition: ismrmrd.h:292
ISMRMRD::ISMRMRD_AcquisitionHeader
struct ISMRMRD::ISMRMRD_AcquisitionHeader ISMRMRD_AcquisitionHeader
ISMRMRD::ISMRMRD_AcquisitionHeader::discard_pre
uint16_t discard_pre
Definition: ismrmrd.h:236
ISMRMRD::ISMRMRD_ImageHeader::data_type
uint16_t data_type
Definition: ismrmrd.h:288
ISMRMRD::ISMRMRD_ImageHeader::slice
uint16_t slice
Definition: ismrmrd.h:300
ISMRMRD::ISMRMRD_AcquisitionHeader::channel_mask
uint64_t channel_mask[ISMRMRD_CHANNEL_MASKS]
Definition: ismrmrd.h:235
ISMRMRD::ISMRMRD_Image
struct ISMRMRD::ISMRMRD_Image ISMRMRD_Image
ISMRMRD::ISMRMRD_AcquisitionHeader::active_channels
uint16_t active_channels
Definition: ismrmrd.h:234
ISMRMRD::ISMRMRD_INT
@ ISMRMRD_INT
Definition: ismrmrd.h:121
ISMRMRD::ISMRMRD_AcquisitionHeader::read_dir
float read_dir[3]
Definition: ismrmrd.h:243
ISMRMRD::ISMRMRD_AcquisitionHeader::version
uint16_t version
Definition: ismrmrd.h:226
ISMRMRD::ISMRMRD_Acquisition::head
ISMRMRD_AcquisitionHeader head
Definition: ismrmrd.h:261
ISMRMRD::ISMRMRD_SHORT
@ ISMRMRD_SHORT
Definition: ismrmrd.h:119
ISMRMRD::Acquisition
MR Acquisition type.
Definition: ismrmrd.h:502
ISMRMRD::ISMRMRD_EncodingCounters::user
uint16_t user[ISMRMRD_USER_INTS]
Definition: ismrmrd.h:219
ISMRMRD::ISMRMRD_EncodingCounters
Definition: ismrmrd.h:209
ISMRMRD::ISMRMRD_ImageHeader
struct ISMRMRD::ISMRMRD_ImageHeader ISMRMRD_ImageHeader
ISMRMRD::ISMRMRD_AcquisitionHeader::physiology_time_stamp
uint32_t physiology_time_stamp[ISMRMRD_PHYS_STAMPS]
Definition: ismrmrd.h:231
ISMRMRD::ISMRMRD_AcquisitionHeader::sample_time_us
float sample_time_us
Definition: ismrmrd.h:241
ISMRMRD::ISMRMRD_EncodingCounters::repetition
uint16_t repetition
Definition: ismrmrd.h:216
ISMRMRD::get_data_type
EXPORTISMRMRD ISMRMRD_DataTypes get_data_type()
Allowed data types for Images and NDArrays.
ISMRMRD::ISMRMRD_AcquisitionHeader::number_of_samples
uint16_t number_of_samples
Definition: ismrmrd.h:232
ISMRMRD::ISMRMRD_ImageHeader::repetition
uint16_t repetition
Definition: ismrmrd.h:303
ISMRMRD::ISMRMRD_NDArray::ndim
uint16_t ndim
Definition: ismrmrd.h:352
ISMRMRD::ISMRMRD_ImageHeader::physiology_time_stamp
uint32_t physiology_time_stamp[ISMRMRD_PHYS_STAMPS]
Definition: ismrmrd.h:306
ISMRMRD::ISMRMRD_AcquisitionHeader::trajectory_dimensions
uint16_t trajectory_dimensions
Definition: ismrmrd.h:240
ISMRMRD::ISMRMRD_AcquisitionHeader::encoding_space_ref
uint16_t encoding_space_ref
Definition: ismrmrd.h:239
ISMRMRD::ISMRMRD_AcquisitionHeader::discard_post
uint16_t discard_post
Definition: ismrmrd.h:237
ISMRMRD::ISMRMRD_AcquisitionHeader::slice_dir
float slice_dir[3]
Definition: ismrmrd.h:245
ISMRMRD::ISMRMRD_ImageHeader::user_int
int32_t user_int[ISMRMRD_USER_INTS]
Definition: ismrmrd.h:310
ISMRMRD::ISMRMRD_NDArray::dims
size_t dims[ISMRMRD_NDARRAY_MAXDIM]
Definition: ismrmrd.h:353
ISMRMRD::ISMRMRD_NDArray::data
void * data
Definition: ismrmrd.h:354
ISMRMRD::NDArray
N-Dimensional array type.
Definition: ismrmrd.h:798
ISMRMRD::ISMRMRD_ImageHeader::read_dir
float read_dir[3]
Definition: ismrmrd.h:295
ISMRMRD::ISMRMRD_AcquisitionHeader::user_float
float user_float[ISMRMRD_USER_FLOATS]
Definition: ismrmrd.h:249
ISMRMRD::ISMRMRD_DataTypes
ISMRMRD_DataTypes
Definition: ismrmrd.h:117
ISMRMRD::ISMRMRD_ImageFlags
ISMRMRD_ImageFlags
Definition: ismrmrd.h:194
ISMRMRD::FlagBit
Convenience class for flags.
Definition: ismrmrd.h:458
ISMRMRD::ISMRMRD_EncodingCounters::set
uint16_t set
Definition: ismrmrd.h:217
ISMRMRD::ISMRMRD_NDArray::version
uint16_t version
Definition: ismrmrd.h:350
ISMRMRD::ISMRMRD_ImageHeader::flags
uint64_t flags
Definition: ismrmrd.h:289
ISMRMRD::ISMRMRD_NDArray
Definition: ismrmrd.h:349
ISMRMRD::ismrmrd_pop_error
bool ismrmrd_pop_error(char **file, int *line, char **func, int *code, char **msg)
Definition: ismrmrd.c:713
ISMRMRD::ISMRMRD_ImageHeader::patient_table_position
float patient_table_position[3]
Definition: ismrmrd.h:298
ISMRMRD::ISMRMRD_AcquisitionHeader::acquisition_time_stamp
uint32_t acquisition_time_stamp
Definition: ismrmrd.h:230
ISMRMRD::ISMRMRD_ImageHeader::channels
uint16_t channels
Definition: ismrmrd.h:293
ISMRMRD::ISMRMRD_Image
Definition: ismrmrd.h:322
ISMRMRD::ISMRMRD_AcquisitionHeader::center_sample
uint16_t center_sample
Definition: ismrmrd.h:238
ISMRMRD::ismrmrd_quaternion_to_directions
EXPORTISMRMRD void ismrmrd_quaternion_to_directions(float const quat[4], float read_dir[3], float phase_dir[3], float slice_dir[3])
Definition: ismrmrd.c:663
ISMRMRD::ISMRMRD_ErrorCodes
ISMRMRD_ErrorCodes
Definition: ismrmrd.h:103
ISMRMRD::ISMRMRD_EncodingCounters::phase
uint16_t phase
Definition: ismrmrd.h:215
ISMRMRD::ISMRMRD_ImageHeader::slice_dir
float slice_dir[3]
Definition: ismrmrd.h:297
ISMRMRD::ISMRMRD_Acquisition
Definition: ismrmrd.h:260
ISMRMRD::ISMRMRD_ImageHeader::matrix_size
uint16_t matrix_size[3]
Definition: ismrmrd.h:291
ISMRMRD::ismrmrd_set_error_handler
EXPORTISMRMRD void ismrmrd_set_error_handler(ismrmrd_error_handler_t)
Definition: ismrmrd.c:745
ISMRMRD::ISMRMRD_ImageHeader::position
float position[3]
Definition: ismrmrd.h:294
ISMRMRD::ISMRMRD_AcquisitionFlags
ISMRMRD_AcquisitionFlags
Definition: ismrmrd.h:134
ISMRMRD::ISMRMRD_CXFLOAT
@ ISMRMRD_CXFLOAT
Definition: ismrmrd.h:124
ISMRMRD
Definition: dataset.h:17