forked from NeuroJSON/jsonlab
-
Notifications
You must be signed in to change notification settings - Fork 0
/
niiformat.m
128 lines (123 loc) · 10.1 KB
/
niiformat.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
function niiheader = niiformat(format)
%
% niiheader=niiformat(format)
%
% Return a NIfTI header format descriptor as an Nx3 cell array
%
% author: Qianqian Fang (q.fang <at> neu.edu)
%
% input:
% format:'nifti1' - return the header descriptor for NIfTI-1 format
% 'nifti2' - return the header descriptor for NIfTI-2 format
%
% output:
% niiheader: an Nx3 cell array in the format similar to the 'Format'
% specifier of the memmapfile.m function in MATLAB
% It has the following structure:
%
% column 1: data type string, it can be one of the following
% 'int8','int16','int32','int64',
% 'uint8','uint16','uint32','uint64',
% 'single','double'
% column 2: an integer vector denoting the size of the data
% column 3: a string denoting the fieldname in the output struct
%
% this file is part of JNIfTI specification: https://github.com/NeuroJSON/jnifti
%
% License: Apache 2.0, see https://github.com/NeuroJSON/jnifti for details
%
header.nifti1 = { ...
'int32' [1 1] 'sizeof_hdr' % !< MUST be 348 % % int sizeof_hdr; % ...
'int8' [1 10] 'data_type' % !< ++UNUSED++ % % char data_type[10]; % ...
'int8' [1 18] 'db_name' % !< ++UNUSED++ % % char db_name[18]; % ...
'int32' [1 1] 'extents' % !< ++UNUSED++ % % int extents; % ...
'int16' [1 1] 'session_error' % !< ++UNUSED++ % % short session_error; % ...
'int8' [1 1] 'regular' % !< ++UNUSED++ % % char regular; % ...
'int8' [1 1] 'dim_info' % !< MRI slice ordering. % % char hkey_un0; % ...
'uint16' [1 8] 'dim' % !< Data array dimensions.% % short dim[8]; % ...
'single' [1 1] 'intent_p1' % !< 1st intent parameter. % % short unused8/9; % ...
'single' [1 1] 'intent_p2' % !< 2nd intent parameter. % % short unused10/11; % ...
'single' [1 1] 'intent_p3' % !< 3rd intent parameter. % % short unused12/13; % ...
'int16' [1 1] 'intent_code' % !< NIFTI_INTENT_* code. % % short unused14; % ...
'int16' [1 1] 'datatype' % !< Defines data type! % % short datatype; % ...
'int16' [1 1] 'bitpix' % !< Number bits/voxel. % % short bitpix; % ...
'int16' [1 1] 'slice_start' % !< First slice index. % % short dim_un0; % ...
'single' [1 8] 'pixdim' % !< Grid spacings. % % float pixdim[8]; % ...
'single' [1 1] 'vox_offset' % !< Offset into .nii file % % float vox_offset; % ...
'single' [1 1] 'scl_slope' % !< Data scaling: slope. % % float funused1; % ...
'single' [1 1] 'scl_inter' % !< Data scaling: offset. % % float funused2; % ...
'int16' [1 1] 'slice_end' % !< Last slice index. % % float funused3; % ...
'int8' [1 1] 'slice_code' % !< Slice timing order. % ...
'int8' [1 1] 'xyzt_units' % !< Units of pixdim[1..4] % ...
'single' [1 1] 'cal_max' % !< Max display intensity % % float cal_max; % ...
'single' [1 1] 'cal_min' % !< Min display intensity % % float cal_min; % ...
'single' [1 1] 'slice_duration' % !< Time for 1 slice. % % float compressed; % ...
'single' [1 1] 'toffset' % !< Time axis shift. % % float verified; % ...
'int32' [1 1] 'glmax' % !< ++UNUSED++ % % int glmax; % ...
'int32' [1 1] 'glmin' % !< ++UNUSED++ % % int glmin; % ...
'int8' [1 80] 'descrip' % !< any text you like. % % char descrip[80]; % ...
'int8' [1 24] 'aux_file' % !< auxiliary filename. % % char aux_file[24]; % ...
'int16' [1 1] 'qform_code' % !< NIFTI_XFORM_* code. % %-- all ANALYZE 7.5 --- % ...
'int16' [1 1] 'sform_code' % !< NIFTI_XFORM_* code. % %below here are replaced% ...
'single' [1 1] 'quatern_b' % !< Quaternion b param. % ...
'single' [1 1] 'quatern_c' % !< Quaternion c param. % ...
'single' [1 1] 'quatern_d' % !< Quaternion d param. % ...
'single' [1 1] 'qoffset_x' % !< Quaternion x shift. % ...
'single' [1 1] 'qoffset_y' % !< Quaternion y shift. % ...
'single' [1 1] 'qoffset_z' % !< Quaternion z shift. % ...
'single' [1 4] 'srow_x' % !< 1st row affine transform. % ...
'single' [1 4] 'srow_y' % !< 2nd row affine transform. % ...
'single' [1 4] 'srow_z' % !< 3rd row affine transform. % ...
'int8' [1 16] 'intent_name' % !< 'name' or meaning of data. % ...
'int8' [1 4] 'magic' % !< MUST be "ni1\0" or "n+1\0". % ...
'int8' [1 4] 'extension' % !< header extension % ...
};
header.nifti2 = { ...
'int32' [1 1] 'sizeof_hdr' % !< MUST be 540 % % int sizeof_hdr; % ...
'int8' [1 8] 'magic' % !< MUST be "ni2\0" or "n+2\0". % ...
'int16' [1 1] 'datatype' % !< Defines data type! % % short datatype; % ...
'int16' [1 1] 'bitpix' % !< Number bits/voxel. % % short bitpix; % ...
'int64' [1 8] 'dim' % !< Data array dimensions.% % short dim[8]; % ...
'double' [1 1] 'intent_p1' % !< 1st intent parameter. % % short unused8/9; % ...
'double' [1 1] 'intent_p2' % !< 2nd intent parameter. % % short unused10/11; % ...
'double' [1 1] 'intent_p3' % !< 3rd intent parameter. % % short unused12/13; % ...
'double' [1 8] 'pixdim' % !< Grid spacings. % % float pixdim[8]; % ...
'int64' [1 1] 'vox_offset' % !< Offset into .nii file % % float vox_offset; % ...
'double' [1 1] 'scl_slope' % !< Data scaling: slope. % % float funused1; % ...
'double' [1 1] 'scl_inter' % !< Data scaling: offset. % % float funused2; % ...
'double' [1 1] 'cal_max' % !< Max display intensity % % float cal_max; % ...
'double' [1 1] 'cal_min' % !< Min display intensity % % float cal_min; % ...
'double' [1 1] 'slice_duration' % !< Time for 1 slice. % % float compressed; % ...
'double' [1 1] 'toffset' % !< Time axis shift. % % float verified; % ...
'int64' [1 1] 'slice_start' % !< First slice index. % % short dim_un0; % ...
'int64' [1 1] 'slice_end' % !< Last slice index. % % float funused3; % ...
'int8' [1 80] 'descrip' % !< any text you like. % % char descrip[80]; % ...
'int8' [1 24] 'aux_file' % !< auxiliary filename. % % char aux_file[24]; % ...
'int32' [1 1] 'qform_code' % !< NIFTI_XFORM_* code. % %-- all ANALYZE 7.5 --- % ...
'int32' [1 1] 'sform_code' % !< NIFTI_XFORM_* code. % %below here are replaced% ...
'double' [1 1] 'quatern_b' % !< Quaternion b param. % ...
'double' [1 1] 'quatern_c' % !< Quaternion c param. % ...
'double' [1 1] 'quatern_d' % !< Quaternion d param. % ...
'double' [1 1] 'qoffset_x' % !< Quaternion x shift. % ...
'double' [1 1] 'qoffset_y' % !< Quaternion y shift. % ...
'double' [1 1] 'qoffset_z' % !< Quaternion z shift. % ...
'double' [1 4] 'srow_x' % !< 1st row affine transform. % ...
'double' [1 4] 'srow_y' % !< 2nd row affine transform. % ...
'double' [1 4] 'srow_z' % !< 3rd row affine transform. % ...
'int32' [1 1] 'slice_code' % !< Slice timing order. % ...
'int32' [1 1] 'xyzt_units' % !< Units of pixdim[1..4] % ...
'int32' [1 1] 'intent_code' % !< NIFTI_INTENT_* code. % % short unused14; % ...
'int8' [1 16] 'intent_name' % !< 'name' or meaning of data. % ...
'int8' [1 1] 'dim_info' % !< MRI slice ordering. % % char hkey_un0; % ...
'int8' [1 15] 'reserved' % !< unused buffer % ...
'int8' [1 4] 'extension' % !< header extension % ...
};
if (nargin < 1)
format = 'nifti1';
end
format = lower(format);
if (isfield(header, format))
niiheader = header.(format);
else
error('format must be either nifti1 or nifti2');
end