# 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](AcquisitionHeader), optional [trajectory](Trajectory), and [raw data](RawData).
(AcquisitionHeader)=
## 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](EncodingCounters) | 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](../libsrc/serialization.cpp).
(EncodingCounters)=
### 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](../libsrc/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](../include/ismrmrd/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
```
(Trajectory)=
## 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 |
(RawData)=
## 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 |