Raw Acquisition Data
Raw k-space data is stored in MRD format as individual readout acquisitions. Each readout contains the complex raw data for all channels, a fixed AcquisitionHeader, and optionally corresponding k-space trajectory information. Most datasets will be comprised of many acquisitions, each stored indvidiually with its own AcquisitionHeader, optional trajectory, and raw data.
AcquisitionHeader
An MRD AcquisitionHeader accompanies each readout containing metadata common to most data. It is of a fixed size and thus fields cannot be added, removed, or otherwise repurposed. It contains the following information:
Field |
Description |
Type |
Offset |
---|---|---|---|
version |
Major version number (currently 1) |
uint16 |
0 bytes |
flags |
A bit mask of common attributes applicable to individual acquisition readouts |
uint64 |
2 bytes |
measurement_uid |
Unique ID corresponding to the readout |
uint32 |
10 bytes |
scan_counter |
Zero-indexed incrementing counter for readouts |
uint32 |
14 bytes |
acquisition_time_stamp |
Clock time stamp (e.g. milliseconds since midnight) |
uint32 |
18 bytes |
physiology_time_stamp |
Time stamps relative to physiological triggering, e.g. ECG, pulse oximetry, respiratory. Multiplicity defined by ISMRMRD_PHYS_STAMPS (currently 3) |
uint32 (x3) |
22 bytes |
number_of_samples |
Number of digitized readout samples |
uint16 |
34 bytes |
available_channels |
Number of possible receiver coils (channels) |
uint16 |
36 bytes |
active_channels |
Number of active receiver coils |
uint16 |
38 bytes |
channel_mask |
Bit mask indicating active coils (64*16 = 1024 bits) |
uint64 (x16) |
40 bytes |
discard_pre |
Number of readout samples to be discarded at the beginning (e.g. if the ADC is active during gradient events) |
uint16 |
168 bytes |
discard_post |
Number of readout samples to be discarded at the end (e.g. if the ADC is active during gradient events) |
uint16 |
170 bytes |
center_sample |
Index of the readout sample corresponing to k-space center (zero indexed) |
uint16 |
172 bytes |
encoding_space_ref |
Indexed reference to the encoding spaces enumerated in the MRD (xml) header |
uint16 |
174 bytes |
trajectory_dimensions |
Dimensionality of the k-space trajectory vector (e.g. 2 for 2D radial (kx, ky), 0 for no trajectory data) |
uint16 |
176 bytes |
sample_time_us |
Readout bandwidth, as time between samples in microseconds |
float (32 bit) |
178 bytes |
position |
Center of the excited volume, in (left, posterior, superior) (LPS) coordinates relative to isocenter in millimeters |
float (32 bit) (x3) |
182 bytes |
read_dir |
Directional cosine of readout/frequency encoding |
float (32 bit) (x3) |
194 bytes |
phase_dir |
Directional cosine of phase encoding (2D) |
float (32 bit) (x3) |
206 bytes |
slice_dir |
Directional cosine of slice normal, i.e. cross-product of read_dir and phase_dir |
float (32 bit) (x3) |
218 bytes |
patient_table_position |
Offset position of the patient table, in LPS coordinates |
float (32 bit) (x3) |
230 bytes |
idx |
Encoding loop counters, as defined below |
uint16 (x17) |
242 bytes |
user_int |
User-defined integer parameters, multiplicity defined by ISMRMRD_USER_INTS (currently 8) |
int32 (x8) |
276 bytes |
user_float |
User-defined float parameters, multiplicity defined by ISMRMRD_USER_FLOATS (currently 8) |
float (32 bit) (x8) |
308 bytes |
Total |
340 bytes |
A reference implementation for serialization/deserialization of the AcquisitionHeader can be found in serialization.cpp.
MRD EncodingCounters
MR acquisitions often loop through a set of counters (e.g. phase encodes) in a complete experiment. The following encoding counters are referred to by the idx
field in the AcquisitionHeader.
Field |
Format |
Description |
Type |
Offset |
---|---|---|---|---|
kspace_encode_step_1 |
uint16 |
Phase encoding line |
uint16 |
0 bytes |
kspace_encode_step_2 |
uint16 |
Partition encoding |
uint16 |
2 bytes |
average |
uint16 |
Signal average |
uint16 |
4 bytes |
slice |
uint16 |
Slice number (multi-slice 2D) |
uint16 |
6 bytes |
contrast |
uint16 |
Echo number in multi-echo |
uint16 |
8 bytes |
phase |
uint16 |
Cardiac phase |
uint16 |
10 bytes |
repetition |
uint16 |
Counter in repeated/dynamic acquisitions |
uint16 |
12 bytes |
set |
uint16 |
Sets of different preparation, e.g. flow encoding, diffusion weighting |
uint16 |
14 bytes |
segment |
uint16 |
Counter for segmented acquisitions |
uint16 |
16 bytes |
user |
uint16 (x8) |
User defined counters, multiplicity defined by ISMRMRD_USER_INTS (currently 8) |
uint16 (x8) |
18 bytes |
Total |
34 bytes |
A reference implementation for serialization/deserialization of the EncodingCounters can be found in serialization.cpp.
MRD AcquisitionFlags
The flags
field in the AcquisitionHeader is a 64 bit mask that can be used to indicate specific attributes of the corresponding readout. One usage of these flags is to trigger the processing of data when a condition is met, e.g. the last readout for the current slice. The following flags are defined in the ISMRMRD_AcquisitionFlags
enum of ismrmrd.h:
ISMRMRD_ACQ_FIRST_IN_ENCODE_STEP1 = 1,
ISMRMRD_ACQ_LAST_IN_ENCODE_STEP1 = 2,
ISMRMRD_ACQ_FIRST_IN_ENCODE_STEP2 = 3,
ISMRMRD_ACQ_LAST_IN_ENCODE_STEP2 = 4,
ISMRMRD_ACQ_FIRST_IN_AVERAGE = 5,
ISMRMRD_ACQ_LAST_IN_AVERAGE = 6,
ISMRMRD_ACQ_FIRST_IN_SLICE = 7,
ISMRMRD_ACQ_LAST_IN_SLICE = 8,
ISMRMRD_ACQ_FIRST_IN_CONTRAST = 9,
ISMRMRD_ACQ_LAST_IN_CONTRAST = 10,
ISMRMRD_ACQ_FIRST_IN_PHASE = 11,
ISMRMRD_ACQ_LAST_IN_PHASE = 12,
ISMRMRD_ACQ_FIRST_IN_REPETITION = 13,
ISMRMRD_ACQ_LAST_IN_REPETITION = 14,
ISMRMRD_ACQ_FIRST_IN_SET = 15,
ISMRMRD_ACQ_LAST_IN_SET = 16,
ISMRMRD_ACQ_FIRST_IN_SEGMENT = 17,
ISMRMRD_ACQ_LAST_IN_SEGMENT = 18,
ISMRMRD_ACQ_IS_NOISE_MEASUREMENT = 19,
ISMRMRD_ACQ_IS_PARALLEL_CALIBRATION = 20,
ISMRMRD_ACQ_IS_PARALLEL_CALIBRATION_AND_IMAGING = 21,
ISMRMRD_ACQ_IS_REVERSE = 22,
ISMRMRD_ACQ_IS_NAVIGATION_DATA = 23,
ISMRMRD_ACQ_IS_PHASECORR_DATA = 24,
ISMRMRD_ACQ_LAST_IN_MEASUREMENT = 25,
ISMRMRD_ACQ_IS_HPFEEDBACK_DATA = 26,
ISMRMRD_ACQ_IS_DUMMYSCAN_DATA = 27,
ISMRMRD_ACQ_IS_RTFEEDBACK_DATA = 28,
ISMRMRD_ACQ_IS_SURFACECOILCORRECTIONSCAN_DATA = 29,
ISMRMRD_ACQ_COMPRESSION1 = 53,
ISMRMRD_ACQ_COMPRESSION2 = 54,
ISMRMRD_ACQ_COMPRESSION3 = 55,
ISMRMRD_ACQ_COMPRESSION4 = 56,
ISMRMRD_ACQ_USER1 = 57,
ISMRMRD_ACQ_USER2 = 58,
ISMRMRD_ACQ_USER3 = 59,
ISMRMRD_ACQ_USER4 = 60,
ISMRMRD_ACQ_USER5 = 61,
ISMRMRD_ACQ_USER6 = 62,
ISMRMRD_ACQ_USER7 = 63,
ISMRMRD_ACQ_USER8 = 64
k-space Trajectory
k-space trajectory information is optionally included with each readout, with dimensionality specified by the trajectory_dimensions
field in the AcquisitionHeader. Common values are 2
for 2D radial (kx, ky), 3
for 3D radial (kx, ky, kz). Trajectory information is omitted if trajectory_dimensions
is set to 0
.
Trajectory data is organized by looping through the dimensions first then the samples:
For 2D trajectory data:
Sample 1 Sample 2 ... Sample n kx ky kx ky kx ky For 3D trajectory data:
Sample 1 Sample 2 ... Sample n kx ky kz kx ky kz kx ky kz
Raw Data
MR acquisition raw data are stored as complex valued floats. Data from all receiver channels are included in a single readout object. Data is organized by looping through real/imaginary data, samples, then channels:
Channel 1 | Channel 2 | ... | Channel n | |||||||||||||||
Sample 1 | ... | Sample n | Sample 1 | ... | Sample n | Sample 1 | ... | Sample n | ||||||||||
Re | Im | Re | Im | Re | Im | Re | Im | Re | Im | Re | Im | Re | Im | Re | Im | Re | Im |