Code covered by the BSD License  

Highlights from
Tools for NIfTI and ANALYZE image

image thumbnail

Tools for NIfTI and ANALYZE image

by

Jimmy Shen (view profile)

 

23 Oct 2005 (Updated )

Load, save, make, reslice, view (and edit) both NIfTI and ANALYZE data on any platform

extra_nii_hdr(hdr)
%  Decode extra NIFTI header information into hdr.extra
%
%  Usage: hdr = extra_nii_hdr(hdr)
%
%  hdr can be obtained from load_nii_hdr
%
%  NIFTI data format can be found on: http://nifti.nimh.nih.gov
%
%  - Jimmy Shen (jimmy@rotman-baycrest.on.ca)
%
function hdr = extra_nii_hdr(hdr)

   switch hdr.dime.datatype
   case 1
      extra.NIFTI_DATATYPES = 'DT_BINARY';
   case 2
      extra.NIFTI_DATATYPES = 'DT_UINT8';
   case 4
      extra.NIFTI_DATATYPES = 'DT_INT16';
   case 8
      extra.NIFTI_DATATYPES = 'DT_INT32';
   case 16
      extra.NIFTI_DATATYPES = 'DT_FLOAT32';
   case 32
      extra.NIFTI_DATATYPES = 'DT_COMPLEX64';
   case 64
      extra.NIFTI_DATATYPES = 'DT_FLOAT64';
   case 128
      extra.NIFTI_DATATYPES = 'DT_RGB24';
   case 256
      extra.NIFTI_DATATYPES = 'DT_INT8';
   case 512
      extra.NIFTI_DATATYPES = 'DT_UINT16';
   case 768
      extra.NIFTI_DATATYPES = 'DT_UINT32';
   case 1024
      extra.NIFTI_DATATYPES = 'DT_INT64';
   case 1280
      extra.NIFTI_DATATYPES = 'DT_UINT64';
   case 1536
      extra.NIFTI_DATATYPES = 'DT_FLOAT128';
   case 1792
      extra.NIFTI_DATATYPES = 'DT_COMPLEX128';
   case 2048
      extra.NIFTI_DATATYPES = 'DT_COMPLEX256';
   otherwise
      extra.NIFTI_DATATYPES = 'DT_UNKNOWN';
   end

   switch hdr.dime.intent_code
   case 2
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_CORREL';
   case 3
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_TTEST';
   case 4
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_FTEST';
   case 5
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_ZSCORE';
   case 6
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_CHISQ';
   case 7
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_BETA';
   case 8
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_BINOM';
   case 9
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_GAMMA';
   case 10
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_POISSON';
   case 11
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_NORMAL';
   case 12
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_FTEST_NONC';
   case 13
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_CHISQ_NONC';
   case 14
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_LOGISTIC';
   case 15
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_LAPLACE';
   case 16
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_UNIFORM';
   case 17
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_TTEST_NONC';
   case 18
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_WEIBULL';
   case 19
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_CHI';
   case 20
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_INVGAUSS';
   case 21
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_EXTVAL';
   case 22
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_PVAL';
   case 23
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_LOGPVAL';
   case 24
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_LOG10PVAL';
   case 1001
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_ESTIMATE';
   case 1002
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_LABEL';
   case 1003
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_NEURONAME';
   case 1004
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_GENMATRIX';
   case 1005
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_SYMMATRIX';
   case 1006
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_DISPVECT';
   case 1007
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_VECTOR';
   case 1008
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_POINTSET';
   case 1009
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_TRIANGLE';
   case 1010
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_QUATERNION';
   case 1011
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_DIMLESS';
   otherwise
      extra.NIFTI_INTENT_CODES = 'NIFTI_INTENT_NONE';
   end

   extra.NIFTI_INTENT_NAMES = hdr.hist.intent_name;

   if hdr.hist.sform_code > 0
      switch hdr.hist.sform_code
      case 1
         extra.NIFTI_SFORM_CODES = 'NIFTI_XFORM_SCANNER_ANAT';
      case 2
         extra.NIFTI_SFORM_CODES = 'NIFTI_XFORM_ALIGNED_ANAT';
      case 3
         extra.NIFTI_SFORM_CODES = 'NIFTI_XFORM_TALAIRACH';
      case 4
         extra.NIFTI_SFORM_CODES = 'NIFTI_XFORM_MNI_152';
      otherwise
         extra.NIFTI_SFORM_CODES = 'NIFTI_XFORM_UNKNOWN';
      end

      extra.NIFTI_QFORM_CODES = 'NIFTI_XFORM_UNKNOWN';
   elseif hdr.hist.qform_code > 0
      extra.NIFTI_SFORM_CODES = 'NIFTI_XFORM_UNKNOWN';

      switch hdr.hist.qform_code
      case 1
         extra.NIFTI_QFORM_CODES = 'NIFTI_XFORM_SCANNER_ANAT';
      case 2
         extra.NIFTI_QFORM_CODES = 'NIFTI_XFORM_ALIGNED_ANAT';
      case 3
         extra.NIFTI_QFORM_CODES = 'NIFTI_XFORM_TALAIRACH';
      case 4
         extra.NIFTI_QFORM_CODES = 'NIFTI_XFORM_MNI_152';
      otherwise
         extra.NIFTI_QFORM_CODES = 'NIFTI_XFORM_UNKNOWN';
      end
   else
      extra.NIFTI_SFORM_CODES = 'NIFTI_XFORM_UNKNOWN';
      extra.NIFTI_QFORM_CODES = 'NIFTI_XFORM_UNKNOWN';
   end

   switch bitand(hdr.dime.xyzt_units, 7)	% mask with 0x07
   case 1
      extra.NIFTI_SPACE_UNIT = 'NIFTI_UNITS_METER';
   case 2
      extra.NIFTI_SPACE_UNIT = 'NIFTI_UNITS_MM';	% millimeter
   case 3
      extra.NIFTI_SPACE_UNIT = 'NIFTI_UNITS_MICRO';
   otherwise
      extra.NIFTI_SPACE_UNIT = 'NIFTI_UNITS_UNKNOWN';
   end

   switch bitand(hdr.dime.xyzt_units, 56)	% mask with 0x38
   case 8
      extra.NIFTI_TIME_UNIT = 'NIFTI_UNITS_SEC';
   case 16
      extra.NIFTI_TIME_UNIT = 'NIFTI_UNITS_MSEC';
   case 24
      extra.NIFTI_TIME_UNIT = 'NIFTI_UNITS_USEC';	% microsecond
   otherwise
      extra.NIFTI_TIME_UNIT = 'NIFTI_UNITS_UNKNOWN';
   end

   switch hdr.dime.xyzt_units
   case 32
      extra.NIFTI_SPECTRAL_UNIT = 'NIFTI_UNITS_HZ';
   case 40
      extra.NIFTI_SPECTRAL_UNIT = 'NIFTI_UNITS_PPM';	% part per million
   case 48
      extra.NIFTI_SPECTRAL_UNIT = 'NIFTI_UNITS_RADS';	% radians per second
   otherwise
      extra.NIFTI_SPECTRAL_UNIT = 'NIFTI_UNITS_UNKNOWN';
   end

   %  MRI-specific spatial and temporal information
   %
   dim_info = hdr.hk.dim_info;
   extra.NIFTI_FREQ_DIM = bitand(dim_info, 3);
   extra.NIFTI_PHASE_DIM = bitand(bitshift(dim_info, -2), 3);
   extra.NIFTI_SLICE_DIM = bitand(bitshift(dim_info, -4), 3);

   %  Check slice code
   %
   switch hdr.dime.slice_code
   case 1
      extra.NIFTI_SLICE_ORDER = 'NIFTI_SLICE_SEQ_INC';	% sequential increasing
   case 2
      extra.NIFTI_SLICE_ORDER = 'NIFTI_SLICE_SEQ_DEC';	% sequential decreasing
   case 3
      extra.NIFTI_SLICE_ORDER = 'NIFTI_SLICE_ALT_INC';	% alternating increasing
   case 4
      extra.NIFTI_SLICE_ORDER = 'NIFTI_SLICE_ALT_DEC';	% alternating decreasing
   case 5
      extra.NIFTI_SLICE_ORDER = 'NIFTI_SLICE_ALT_INC2';	% ALT_INC # 2
   case 6
      extra.NIFTI_SLICE_ORDER = 'NIFTI_SLICE_ALT_DEC2';	% ALT_DEC # 2
   otherwise
      extra.NIFTI_SLICE_ORDER = 'NIFTI_SLICE_UNKNOWN';
   end

   %  Check NIFTI version
   %
   if     ~isempty(hdr.hist.magic) & strcmp(hdr.hist.magic(1),'n') & ...
	( strcmp(hdr.hist.magic(2),'i') | strcmp(hdr.hist.magic(2),'+') ) & ...
	  str2num(hdr.hist.magic(3)) >= 1 & str2num(hdr.hist.magic(3)) <= 9

      extra.NIFTI_VERSION = str2num(hdr.hist.magic(3));
   else
      extra.NIFTI_VERSION = 0;
   end

   %  Check if data stored in the same file (*.nii) or separate
   %  files (*.hdr/*.img)
   %
   if isempty(hdr.hist.magic)
      extra.NIFTI_ONEFILE = 0;
   else
      extra.NIFTI_ONEFILE = strcmp(hdr.hist.magic(2), '+');
   end

   %  Swap has been taken care of by checking whether sizeof_hdr is
   %  348 (machine is 'ieee-le' or 'ieee-be' etc)
   %
   % extra.NIFTI_NEEDS_SWAP = (hdr.dime.dim(1) < 0 | hdr.dime.dim(1) > 7);

   %  Check NIFTI header struct contains a 5th (vector) dimension
   %
   if hdr.dime.dim(1) > 4 & hdr.dime.dim(6) > 1
      extra.NIFTI_5TH_DIM = hdr.dime.dim(6);
   else
      extra.NIFTI_5TH_DIM = 0;
   end

   hdr.extra = extra;

   return;					% extra_nii_hdr

Contact us