Formats of NMRViewJ/NMRFx files

Spectrum file (.nv)

NMRViewJ/NMRFx files consist of a header at the beginning of the file followed by the actual data values in a sub-matrix format. The header describes the layout of the file and reference information. The file can be tested to see if is an NMRview/NMRFx file by reading the first 4 bytes.
This should represent an integer with value equal to 874032077.
Files are normally stored with integer and floating point values in big-endian, but can be in little-endian format. The endianness can be tested by checking which mode gives the magic value as 874032077.

The first section of the header (typically first 1024 bytes) stores information about the entire file.

Position Bytes Type Name Comment
0 4 int magic Should be equal to 874032077 if this is an NMRView file.
4 4 int version Currently set to 0
8 4 int unused Unused, but may be used in subsequent versions.
12 4 int fileHeaderSize The size of the header at beginning of file. Typically 2048 bytes for NMRViewJ
16 4 int blockHeaderSize The size of the header at the beginning of each data block (sub-matrix tile). Typically 0.
20 4 int blockElements The number of elements in each sub-matrix
24 4 int nDim The number of dimensions in the file
28 996 byte unused Unused, but may be used in subsequent versions.

The second section of the header (typically second 1024 bytes) stores information about each dimension. Each dimension uses 128 bytes, allowing for 8 dimensions in the current version.

The actual position of each dimension section is calculated by adding the Position value in the table below to 1024 + dim * 128 (where dim = 0,1,...)

Position Bytes Type Name Comment
0 4 int size The number of data points along this dimension
4 4 int blockSize The number of data points in a block, along this dimension
8 4 int nBlocks The total number of blocks in the file, the value is ignored on reading and calculated from the above sizes
12 4 int unused Unused, but reserved for future use.
16 4 int unused Unused, but reserved for future use.
20 4 int unused Unused, but reserved for future use.
24 4 float sf The spectrometer frequency for this dimension (Mhz)
28 4 float sw The sweep width for this dimension (Hz)
32 4 float refpt The data point at which the reference is specified. Typically the center of spectrum.
36 4 float refval The reference value at the above reference point.
40 4 int refunits The units the reference is specified in, typically the integer 3, indicating ppm.
44 4 float foldUp Unused at present
48 4 float foldDown Unused at present
52 16 char label The label for this dimension of the axis. If less than 16 characters it should be terminated with a null byte (0)
68 4 int complex 0 if the data along this dimension is real, 1 if it is complex
72 4 int freqdomain 0 if the data along this dimension is in the time domain, 1 if it is in the frequency domain
76 4 float ph0 The cumulateive zero-order phase correction applied along this dimension.
80 4 float ph1 The cumulateive first-order phase correction applied along this dimension.
84 4 int vsize The number of data points along this dimension that have valid data. Used during processing.
88 40 byte unused Unused, but reserved for future use.

The actual data values are stored in a sub-matrix (bricked or tiled) format. Using this format allows more rapid and efficient access to data as it minimizes the total amount of data that needs to be read when a subset of the data is read or when data is accessed along the second or higher dimension.

Values, in the current version, are stored as 4-byte floating point numbers.

An example of the data storage should be helpful in understanding the layout. A 2D file with sub-matrix block size of 4 on each dimension would be arranged so that reading the values sequentially from the file would give values corresponding to the positons listed below. The value 1,0 corresponds, for example, to a point at the second position of the first dimension and the first position of the second dimension (counting from 0). The first dimension corresponds to the data described by the first dimension section of the header.

0,0  block 0
1,0
2,0
3,0
0,1
1,1
2,1
3,1
...
0,3
1,3
2,3
3,3

4,0  block 1
5,0
6,0
7,0
4,1
5,1
6,1
7,1
...
4,3
5,3
6,3
7,3
...

The physical size of the dataset always corresponds to a multiple of the block sizes. When the number of valid data points (the dimension size) is not an integer multiple of the block size the last blocks in the dimension are padded with zeros.

Temporary (intermediate files used for external processing calls)

The NMRFx processor can export intermediate files during processing so that data can be analyzed by external programs. This might be used, for example, during processing of NUS datasets. In a 3D dataset, 2D planes containing the indirect dimensions could be exported at each data point in the direct dimension. This is done by the exportMatrix command which is a method of the matrix object available to the SCRIPT command.

matFile = matrix.exportMatrix(fileName)

The format of the file is binary file of eight-byte (double precision) floating point numbers in simple serial order. The values are output fastest along the lowest numbered dimension.

A parameter file is also exported. At present, this only contains information on the dimension sizes in the following format.

dim nDim dim1Size dim2Size ... block1Size block2Size ...

For example:

dim 2 1024 256 0 0