ISMRMRD
ISMRM Raw Data Format
|
Typedefs | |
typedef struct ISMRMRD::ISMRMRD_Dataset | ISMRMRD_Dataset |
typedef struct ISMRMRD::ISMRMRD_EncodingCounters | ISMRMRD_EncodingCounters |
typedef struct ISMRMRD::ISMRMRD_AcquisitionHeader | ISMRMRD_AcquisitionHeader |
typedef struct ISMRMRD::ISMRMRD_Acquisition | ISMRMRD_Acquisition |
typedef struct ISMRMRD::ISMRMRD_ImageHeader | ISMRMRD_ImageHeader |
typedef struct ISMRMRD::ISMRMRD_Image | ISMRMRD_Image |
typedef struct ISMRMRD::ISMRMRD_NDArray | ISMRMRD_NDArray |
typedef void(* | ismrmrd_error_handler_t) (const char *file, int line, const char *function, int code, const char *msg) |
typedef ISMRMRD_EncodingCounters | EncodingCounters |
Some typedefs to beautify the namespace. | |
typedef struct ISMRMRD::ISMRMRD_WaveformHeader | ISMRMRD_WaveformHeader |
typedef struct ISMRMRD::ISMRMRD_Waveform | ISMRMRD_Waveform |
typedef struct ISMRMRD::HDF5_Acquisiton | HDF5_Acquisition |
typedef struct ISMRMRD::HDF5_Waveform | HDF5_Waveform |
typedef struct ISMRMRD::ISMRMRD_error_node | ISMRMRD_error_node_t |
Enumerations | |
enum | ISMRMRD_Constants { ISMRMRD_USER_INTS = 8, ISMRMRD_USER_FLOATS = 8, ISMRMRD_PHYS_STAMPS = 3, ISMRMRD_CHANNEL_MASKS = 16, ISMRMRD_NDARRAY_MAXDIM = 7, ISMRMRD_POSITION_LENGTH = 3, ISMRMRD_DIRECTION_LENGTH = 3 } |
enum | ISMRMRD_ErrorCodes { ISMRMRD_BEGINERROR =-1, ISMRMRD_NOERROR, ISMRMRD_MEMORYERROR, ISMRMRD_FILEERROR, ISMRMRD_TYPEERROR, ISMRMRD_RUNTIMEERROR, ISMRMRD_HDF5ERROR, ISMRMRD_ENDERROR } |
enum | ISMRMRD_DataTypes { ISMRMRD_USHORT = 1, ISMRMRD_SHORT = 2, ISMRMRD_UINT = 3, ISMRMRD_INT = 4, ISMRMRD_FLOAT = 5, ISMRMRD_DOUBLE = 6, ISMRMRD_CXFLOAT = 7, ISMRMRD_CXDOUBLE = 8 } |
enum | ISMRMRD_AcquisitionFlags { 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 } |
enum | ISMRMRD_ImageTypes { ISMRMRD_IMTYPE_MAGNITUDE = 1, ISMRMRD_IMTYPE_PHASE = 2, ISMRMRD_IMTYPE_REAL = 3, ISMRMRD_IMTYPE_IMAG = 4, ISMRMRD_IMTYPE_COMPLEX = 5 } |
enum | ISMRMRD_ImageFlags { ISMRMRD_IMAGE_IS_NAVIGATION_DATA = 1, ISMRMRD_IMAGE_USER1 = 57, ISMRMRD_IMAGE_USER2 = 58, ISMRMRD_IMAGE_USER3 = 59, ISMRMRD_IMAGE_USER4 = 60, ISMRMRD_IMAGE_USER5 = 61, ISMRMRD_IMAGE_USER6 = 62, ISMRMRD_IMAGE_USER7 = 63, ISMRMRD_IMAGE_USER8 = 64 } |
enum | TrajectoryType { CARTESIAN, EPI, RADIAL, GOLDENANGLE, SPIRAL, OTHER } |
enum | WaveformType { ECG, PULSE, RESPIRATORY, TRIGGER, GRADIENTWAVEFORM, OTHER } |
Functions | |
EXPORTISMRMRD int | ismrmrd_init_dataset (ISMRMRD_Dataset *dset, const char *filename, const char *groupname) |
EXPORTISMRMRD int | ismrmrd_open_dataset (ISMRMRD_Dataset *dset, const bool create_if_neded) |
EXPORTISMRMRD int | ismrmrd_close_dataset (ISMRMRD_Dataset *dset) |
EXPORTISMRMRD int | ismrmrd_write_header (const ISMRMRD_Dataset *dset, const char *xmlstring) |
EXPORTISMRMRD char * | ismrmrd_read_header (const ISMRMRD_Dataset *dset) |
EXPORTISMRMRD int | ismrmrd_append_acquisition (const ISMRMRD_Dataset *dset, const ISMRMRD_Acquisition *acq) |
EXPORTISMRMRD int | ismrmrd_read_acquisition (const ISMRMRD_Dataset *dset, uint32_t index, ISMRMRD_Acquisition *acq) |
EXPORTISMRMRD uint32_t | ismrmrd_get_number_of_acquisitions (const ISMRMRD_Dataset *dset) |
EXPORTISMRMRD int | ismrmrd_append_waveform (const ISMRMRD_Dataset *dset, const ISMRMRD_Waveform *wav) |
EXPORTISMRMRD int | ismrmrd_read_waveform (const ISMRMRD_Dataset *dset, uint32_t index, ISMRMRD_Waveform *wav) |
EXPORTISMRMRD uint32_t | ismrmrd_get_number_of_waveforms (const ISMRMRD_Dataset *dset) |
EXPORTISMRMRD int | ismrmrd_append_image (const ISMRMRD_Dataset *dset, const char *varname, const ISMRMRD_Image *im) |
EXPORTISMRMRD int | ismrmrd_read_image (const ISMRMRD_Dataset *dset, const char *varname, const uint32_t index, ISMRMRD_Image *im) |
EXPORTISMRMRD uint32_t | ismrmrd_get_number_of_images (const ISMRMRD_Dataset *dset, const char *varname) |
EXPORTISMRMRD int | ismrmrd_append_array (const ISMRMRD_Dataset *dset, const char *varname, const ISMRMRD_NDArray *arr) |
EXPORTISMRMRD int | ismrmrd_read_array (const ISMRMRD_Dataset *dataset, const char *varname, const uint32_t index, ISMRMRD_NDArray *arr) |
EXPORTISMRMRD uint32_t | ismrmrd_get_number_of_arrays (const ISMRMRD_Dataset *dset, const char *varname) |
EXPORTISMRMRD size_t | ismrmrd_sizeof_data_type (int data_type) |
EXPORTISMRMRD int | ismrmrd_init_acquisition_header (ISMRMRD_AcquisitionHeader *hdr) |
EXPORTISMRMRD ISMRMRD_Acquisition * | ismrmrd_create_acquisition () |
EXPORTISMRMRD int | ismrmrd_free_acquisition (ISMRMRD_Acquisition *acq) |
EXPORTISMRMRD int | ismrmrd_init_acquisition (ISMRMRD_Acquisition *acq) |
EXPORTISMRMRD int | ismrmrd_cleanup_acquisition (ISMRMRD_Acquisition *acq) |
EXPORTISMRMRD int | ismrmrd_copy_acquisition (ISMRMRD_Acquisition *acqdest, const ISMRMRD_Acquisition *acqsource) |
EXPORTISMRMRD int | ismrmrd_make_consistent_acquisition (ISMRMRD_Acquisition *acq) |
EXPORTISMRMRD size_t | ismrmrd_size_of_acquisition_traj (const ISMRMRD_Acquisition *acq) |
EXPORTISMRMRD size_t | ismrmrd_size_of_acquisition_data (const ISMRMRD_Acquisition *acq) |
EXPORTISMRMRD int | ismrmrd_init_image_header (ISMRMRD_ImageHeader *hdr) |
EXPORTISMRMRD ISMRMRD_Image * | ismrmrd_create_image () |
EXPORTISMRMRD int | ismrmrd_free_image (ISMRMRD_Image *im) |
EXPORTISMRMRD int | ismrmrd_init_image (ISMRMRD_Image *im) |
EXPORTISMRMRD int | ismrmrd_cleanup_image (ISMRMRD_Image *im) |
EXPORTISMRMRD int | ismrmrd_copy_image (ISMRMRD_Image *imdest, const ISMRMRD_Image *imsource) |
EXPORTISMRMRD int | ismrmrd_make_consistent_image (ISMRMRD_Image *im) |
EXPORTISMRMRD size_t | ismrmrd_size_of_image_attribute_string (const ISMRMRD_Image *im) |
EXPORTISMRMRD size_t | ismrmrd_size_of_image_data (const ISMRMRD_Image *im) |
EXPORTISMRMRD ISMRMRD_NDArray * | ismrmrd_create_ndarray () |
EXPORTISMRMRD int | ismrmrd_free_ndarray (ISMRMRD_NDArray *arr) |
EXPORTISMRMRD int | ismrmrd_init_ndarray (ISMRMRD_NDArray *arr) |
EXPORTISMRMRD int | ismrmrd_cleanup_ndarray (ISMRMRD_NDArray *arr) |
EXPORTISMRMRD int | ismrmrd_copy_ndarray (ISMRMRD_NDArray *arrdest, const ISMRMRD_NDArray *arrsource) |
EXPORTISMRMRD int | ismrmrd_make_consistent_ndarray (ISMRMRD_NDArray *arr) |
EXPORTISMRMRD size_t | ismrmrd_size_of_ndarray_data (const ISMRMRD_NDArray *arr) |
EXPORTISMRMRD bool | ismrmrd_is_flag_set (const uint64_t flags, const uint64_t val) |
EXPORTISMRMRD int | ismrmrd_set_flag (uint64_t *flags, const uint64_t val) |
EXPORTISMRMRD int | ismrmrd_set_flags (uint64_t *flags, const uint64_t val) |
EXPORTISMRMRD int | ismrmrd_clear_flag (uint64_t *flags, const uint64_t val) |
EXPORTISMRMRD int | ismrmrd_clear_all_flags (uint64_t *flags) |
EXPORTISMRMRD bool | ismrmrd_is_channel_on (const uint64_t channel_mask[ISMRMRD_CHANNEL_MASKS], const uint16_t chan) |
EXPORTISMRMRD int | ismrmrd_set_channel_on (uint64_t channel_mask[ISMRMRD_CHANNEL_MASKS], const uint16_t chan) |
EXPORTISMRMRD int | ismrmrd_set_channel_off (uint64_t channel_mask[ISMRMRD_CHANNEL_MASKS], const uint16_t chan) |
EXPORTISMRMRD int | ismrmrd_set_all_channels_off (uint64_t channel_mask[ISMRMRD_CHANNEL_MASKS]) |
int | ismrmrd_push_error (const char *file, const int line, const char *func, const int code, const char *msg) |
EXPORTISMRMRD void | ismrmrd_set_error_handler (ismrmrd_error_handler_t) |
EXPORTISMRMRD char * | ismrmrd_strerror (int code) |
bool | ismrmrd_pop_error (char **file, int *line, char **func, int *code, char **msg) |
EXPORTISMRMRD int | ismrmrd_sign_of_directions (float const read_dir[3], float const phase_dir[3], float const slice_dir[3]) |
EXPORTISMRMRD void | ismrmrd_directions_to_quaternion (float const read_dir[3], float const phase_dir[3], float const slice_dir[3], float quat[4]) |
EXPORTISMRMRD void | ismrmrd_quaternion_to_directions (float const quat[4], float read_dir[3], float phase_dir[3], float slice_dir[3]) |
std::string | build_exception_string (void) |
ISMRMRD C++ Interface. More... | |
bool | operator== (const EncodingCounters &ec1, const EncodingCounters &ec2) |
template<typename T > | |
EXPORTISMRMRD ISMRMRD_DataTypes | get_data_type () |
Allowed data types for Images and NDArrays. | |
EXPORTISMRMRD void | deserialize (const char *xml, MetaContainer &h) |
EXPORTISMRMRD void | serialize (const MetaContainer &h, std::ostream &o) |
EXPORTISMRMRD int | ismrmrd_make_consistent_waveform (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) |
EXPORTISMRMRD void | deserialize (const char *xml, IsmrmrdHeader &h) |
EXPORTISMRMRD void | serialize (const IsmrmrdHeader &h, std::ostream &o) |
int | read_element (const ISMRMRD_Dataset *dset, const char *path, void *elem, const hid_t datatype, const uint32_t index) |
template<typename T > | |
const size_t(& | NDArray ())[ISMRMRD_NDARRAY_MAXDIM] |
template<> | |
EXPORTISMRMRD ISMRMRD_DataTypes | get_data_type< uint16_t > () |
template<> | |
EXPORTISMRMRD ISMRMRD_DataTypes | get_data_type< int16_t > () |
template<> | |
EXPORTISMRMRD ISMRMRD_DataTypes | get_data_type< uint32_t > () |
template<> | |
EXPORTISMRMRD ISMRMRD_DataTypes | get_data_type< int32_t > () |
template<> | |
EXPORTISMRMRD ISMRMRD_DataTypes | get_data_type< float > () |
template<> | |
EXPORTISMRMRD ISMRMRD_DataTypes | get_data_type< double > () |
template<> | |
EXPORTISMRMRD ISMRMRD_DataTypes | get_data_type< complex_float_t > () |
template<> | |
EXPORTISMRMRD ISMRMRD_DataTypes | get_data_type< complex_double_t > () |
EncodingSpace | parse_encoding_space (pugi::xml_node &n, const char *child) |
Optional< Limit > | parse_encoding_limit (pugi::xml_node &n, const char *child) |
std::string | parse_string (pugi::xml_node &n, const char *child) |
Optional< std::string > | parse_optional_string (pugi::xml_node &n, const char *child) |
Optional< float > | parse_optional_float (pugi::xml_node &n, const char *child) |
Optional< long > | parse_optional_long (pugi::xml_node &n, const char *child) |
Optional< unsigned short > | parse_optional_ushort (pugi::xml_node &n, const char *child) |
std::vector< float > | parse_vector_float (pugi::xml_node &n, const char *child) |
std::vector< std::string > | parse_vector_string (pugi::xml_node &n, const char *child) |
std::vector< UserParameterLong > | parse_user_parameter_long (pugi::xml_node &n, const char *child) |
std::vector< UserParameterDouble > | parse_user_parameter_double (pugi::xml_node &n, const char *child) |
std::vector< UserParameterString > | parse_user_parameter_string (pugi::xml_node &n, const char *child) |
TrajectoryType | parse_trajectory_type (const std::string trajectoryString) |
WaveformType | parse_waveform_type (const std::string waveformString) |
void | to_string_val (const std::string &v, std::string &o) |
void | to_string_val (const float &v, std::string &o) |
void | to_string_val (const double &v, std::string &o) |
void | to_string_val (const unsigned short &v, std::string &o) |
void | to_string_val (const long &v, std::string &o) |
void | to_string_val (const TrajectoryType &v, std::string &o) |
void | to_string_val (const WaveformType &v, std::string &o) |
template<class T > | |
void | append_optional_node (pugi::xml_node &n, const char *child, const Optional< T > &v) |
template<class T > | |
void | append_node (pugi::xml_node &n, const char *child, const T &v) |
void | append_encoding_space (pugi::xml_node &n, const char *child, const EncodingSpace &s) |
void | append_encoding_limit (pugi::xml_node &n, const char *child, const Optional< Limit > &l) |
template<class T > | |
void | append_user_parameter (pugi::xml_node &n, const char *child, const std::vector< T > &v) |
void | append_waveform_information (pugi::xml_node &n, const char *child, const WaveformInformation &w) |
TODO LIST
typedef struct ISMRMRD::ISMRMRD_Acquisition ISMRMRD::ISMRMRD_Acquisition |
Individual MR acquisition.
Header for each MR acquisition.
typedef struct ISMRMRD::ISMRMRD_Dataset ISMRMRD::ISMRMRD_Dataset |
Interface for accessing an ISMRMRD Data Set stored on disk in HDF5 format.
A given ISMRMRD dataset if assumed to be stored under one group name in the HDF5 file. To make the datasets consistent, this library enforces that the XML configuration is stored in the variable groupname/xml and the Acquisitions are stored in the variable groupname/data.
Struct used for keeping track of typical loop counters in MR experiment.
typedef struct ISMRMRD::ISMRMRD_ImageHeader ISMRMRD::ISMRMRD_ImageHeader |
Header for each Image
typedef struct ISMRMRD::ISMRMRD_NDArray ISMRMRD::ISMRMRD_NDArray |
A simple N dimensional array
Acquisition Flags
Constants
Data Types
Constants
Image Flags
Image Types
std::string ISMRMRD::build_exception_string | ( | void | ) |
int ISMRMRD::ismrmrd_append_acquisition | ( | const ISMRMRD_Dataset * | dset, |
const ISMRMRD_Acquisition * | acq | ||
) |
Appends and NMR/MRI acquisition to the dataset.
Please consult ISMRMRD_Acquisition struct for details.
int ISMRMRD::ismrmrd_append_array | ( | const ISMRMRD_Dataset * | dset, |
const char * | varname, | ||
const ISMRMRD_NDArray * | arr | ||
) |
Appends an NDArray to the variable named varname in the dataset.
Please consult NDArray struct for details.
Arrays contain simple data elements such as float, double, etc.
Arrays of the same size can be appended to "grow" an array, e.g. 3D arrays of size (K,L,M) can be appended to grow a 4D array of size (K,L,M,N).
int ISMRMRD::ismrmrd_append_image | ( | const ISMRMRD_Dataset * | dset, |
const char * | varname, | ||
const ISMRMRD_Image * | im | ||
) |
Appends an Image to the variable named varname in the dataset.
Please consult ISMRMRD_Image struct for details.
Headers and attribute strings are stored separately from the data. This allows for easy viewing and reading in other applications.
Images of the same size can be appended to "grow" an array. e.g. 20 images of size (256, 256, 4, 16), i.e. 4 slice and 16 channels, can be appended one at a time to make a (256, 256, 4, 16, 20) array in the file.
int ISMRMRD::ismrmrd_append_waveform | ( | const ISMRMRD_Dataset * | dset, |
const ISMRMRD_Waveform * | wav | ||
) |
Appends and waveform data to the dataset.
Please consult ISMRMRD_Waveform struct for details.
int ISMRMRD::ismrmrd_close_dataset | ( | ISMRMRD_Dataset * | dset | ) |
Closes all references to the underlying HDF5 file.
uint32_t ISMRMRD::ismrmrd_get_number_of_acquisitions | ( | const ISMRMRD_Dataset * | dset | ) |
Return the number of acquisitions in the dataset.
uint32_t ISMRMRD::ismrmrd_get_number_of_arrays | ( | const ISMRMRD_Dataset * | dset, |
const char * | varname | ||
) |
Return the number of arrays in the variable varname in the dataset.
uint32_t ISMRMRD::ismrmrd_get_number_of_images | ( | const ISMRMRD_Dataset * | dset, |
const char * | varname | ||
) |
Return the number of images in the variable varname in the dataset.
uint32_t ISMRMRD::ismrmrd_get_number_of_waveforms | ( | const ISMRMRD_Dataset * | dset | ) |
Return the number of waveforms in the dataset.
int ISMRMRD::ismrmrd_init_dataset | ( | ISMRMRD_Dataset * | dset, |
const char * | filename, | ||
const char * | groupname | ||
) |
Initializes an ISMRMRD dataset structure
int ISMRMRD::ismrmrd_open_dataset | ( | ISMRMRD_Dataset * | dset, |
const bool | create_if_neded | ||
) |
Opens an ISMRMRD dataset.
bool ISMRMRD::ismrmrd_pop_error | ( | char ** | file, |
int * | line, | ||
char ** | func, | ||
int * | code, | ||
char ** | msg | ||
) |
Populates parameters (if non-NULL) with error information
int ISMRMRD::ismrmrd_read_acquisition | ( | const ISMRMRD_Dataset * | dset, |
uint32_t | index, | ||
ISMRMRD_Acquisition * | acq | ||
) |
Reads the acquisition with the specified index from the dataset.
int ISMRMRD::ismrmrd_read_array | ( | const ISMRMRD_Dataset * | dataset, |
const char * | varname, | ||
const uint32_t | index, | ||
ISMRMRD_NDArray * | arr | ||
) |
Reads an array from the data file.
char * ISMRMRD::ismrmrd_read_header | ( | const ISMRMRD_Dataset * | dset | ) |
Reads the XML configuration header from the dataset.
int ISMRMRD::ismrmrd_read_image | ( | const ISMRMRD_Dataset * | dset, |
const char * | varname, | ||
const uint32_t | index, | ||
ISMRMRD_Image * | im | ||
) |
Reads an image stored with appendImage. The index indicates which image to read from the variable named varname.
int ISMRMRD::ismrmrd_read_waveform | ( | const ISMRMRD_Dataset * | dset, |
uint32_t | index, | ||
ISMRMRD_Waveform * | wav | ||
) |
Reads the wveformith the specified index from the dataset.
size_t ISMRMRD::ismrmrd_sizeof_data_type | ( | int | data_type | ) |
Returns the size in bytes of an ISMRMRD_DataType
int ISMRMRD::ismrmrd_write_header | ( | const ISMRMRD_Dataset * | dset, |
const char * | xmlstring | ||
) |
Writes the XML header string to the dataset.