123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- % Return time frame of a NIFTI dataset. Support both *.nii and
- % *.hdr/*.img file extension. If file extension is not provided,
- % *.hdr/*.img will be used as default.
- %
- % It is a lightweighted "load_nii_hdr", and is equivalent to
- % hdr.dime.dim(5)
- %
- % Usage: [ total_scan ] = get_nii_frame(filename)
- %
- % filename - NIFTI file name.
- %
- % Returned values:
- %
- % total_scan - total number of image scans for the time frame
- %
- % NIFTI data format can be found on: http://nifti.nimh.nih.gov
- %
- % - Jimmy Shen (jimmy@rotman-baycrest.on.ca)
- %
- function [ total_scan ] = get_nii_frame(filename)
- if ~exist('filename','var'),
- error('Usage: [ total_scan ] = get_nii_frame(filename)');
- end
- v = version;
- % Check file extension. If .gz, unpack it into temp folder
- %
- if length(filename) > 2 & strcmp(filename(end-2:end), '.gz')
- if ~strcmp(filename(end-6:end), '.img.gz') & ...
- ~strcmp(filename(end-6:end), '.hdr.gz') & ...
- ~strcmp(filename(end-6:end), '.nii.gz')
- error('Please check filename.');
- end
- if str2num(v(1:3)) < 7.1 | ~usejava('jvm')
- error('Please use MATLAB 7.1 (with java) and above, or run gunzip outside MATLAB.');
- elseif strcmp(filename(end-6:end), '.img.gz')
- filename1 = filename;
- filename2 = filename;
- filename2(end-6:end) = '';
- filename2 = [filename2, '.hdr.gz'];
- tmpDir = tempname;
- mkdir(tmpDir);
- gzFileName = filename;
- filename1 = gunzip(filename1, tmpDir);
- filename2 = gunzip(filename2, tmpDir);
- filename = char(filename1); % convert from cell to string
- elseif strcmp(filename(end-6:end), '.hdr.gz')
- filename1 = filename;
- filename2 = filename;
- filename2(end-6:end) = '';
- filename2 = [filename2, '.img.gz'];
- tmpDir = tempname;
- mkdir(tmpDir);
- gzFileName = filename;
- filename1 = gunzip(filename1, tmpDir);
- filename2 = gunzip(filename2, tmpDir);
- filename = char(filename1); % convert from cell to string
- elseif strcmp(filename(end-6:end), '.nii.gz')
- tmpDir = tempname;
- mkdir(tmpDir);
- gzFileName = filename;
- filename = gunzip(filename, tmpDir);
- filename = char(filename); % convert from cell to string
- end
- end
- fileprefix = filename;
- machine = 'ieee-le';
- new_ext = 0;
- if findstr('.nii',fileprefix) & strcmp(fileprefix(end-3:end), '.nii')
- new_ext = 1;
- fileprefix(end-3:end)='';
- end
- if findstr('.hdr',fileprefix) & strcmp(fileprefix(end-3:end), '.hdr')
- fileprefix(end-3:end)='';
- end
- if findstr('.img',fileprefix) & strcmp(fileprefix(end-3:end), '.img')
- fileprefix(end-3:end)='';
- end
- if new_ext
- fn = sprintf('%s.nii',fileprefix);
- if ~exist(fn)
- msg = sprintf('Cannot find file "%s.nii".', fileprefix);
- error(msg);
- end
- else
- fn = sprintf('%s.hdr',fileprefix);
- if ~exist(fn)
- msg = sprintf('Cannot find file "%s.hdr".', fileprefix);
- error(msg);
- end
- end
- fid = fopen(fn,'r',machine);
-
- if fid < 0,
- msg = sprintf('Cannot open file %s.',fn);
- error(msg);
- else
- hdr = read_header(fid);
- fclose(fid);
- end
-
- if hdr.sizeof_hdr ~= 348
- % first try reading the opposite endian to 'machine'
- switch machine,
- case 'ieee-le', machine = 'ieee-be';
- case 'ieee-be', machine = 'ieee-le';
- end
-
- fid = fopen(fn,'r',machine);
-
- if fid < 0,
- msg = sprintf('Cannot open file %s.',fn);
- error(msg);
- else
- hdr = read_header(fid);
- fclose(fid);
- end
- end
- if hdr.sizeof_hdr ~= 348
- % Now throw an error
- msg = sprintf('File "%s" is corrupted.',fn);
- error(msg);
- end
- total_scan = hdr.dim(5);
- % Clean up after gunzip
- %
- if exist('gzFileName', 'var')
- rmdir(tmpDir,'s');
- end
- return; % get_nii_frame
- %---------------------------------------------------------------------
- function [ dsr ] = read_header(fid)
- fseek(fid,0,'bof');
- dsr.sizeof_hdr = fread(fid,1,'int32')'; % should be 348!
- fseek(fid,40,'bof');
- dsr.dim = fread(fid,8,'int16')';
- return; % read_header
|