0001 function varargout = subsref(opt,subs)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 varargout = rec(opt,subs);
0046 return;
0047
0048 function c = rec(opt,subs)
0049 switch subs(1).type,
0050 case {'.'},
0051 c = {};
0052 opts = struct(opt);
0053 for ii=1:numel(opts)
0054 opt = class(opts(ii),'read_nifti');
0055
0056
0057
0058
0059 h = opt.hdr;
0060 if isempty(h),
0061
0062 h = empty_hdr;
0063 end;
0064
0065
0066 switch(subs(1).subs)
0067 case 'extras',
0068 t = opt.extras;
0069
0070 case 'raw',
0071 if isa(opt.dat,'create_file_array'),
0072 tmp = struct(opt.dat);
0073 tmp.scl_slope = [];
0074 tmp.scl_inter = [];
0075 t = create_file_array(tmp);
0076 else
0077 t = opt.dat;
0078 end;
0079
0080 case 'dat',
0081 t = opt.dat;
0082
0083 case 'mat0',
0084 t = decode_qform0(h);
0085 s = double(bitand(h.xyzt_units,7));
0086 if s
0087 d = findindict(s,'units');
0088 if ~isempty(d)
0089 t = diag([d.rescale*[1 1 1] 1])*t;
0090 end;
0091 end;
0092
0093 case 'mat0_intent',
0094 d = findindict(h.qform_code,'xform');
0095 if isempty(d) || d.code==0,
0096 t = '';
0097 else
0098 t = d.label;
0099 end;
0100
0101 case 'mat',
0102 if h.sform_code > 0
0103 t = double([h.srow_x ; h.srow_y ; h.srow_z ; 0 0 0 1]);
0104 t = t * [eye(4,3) [-1 -1 -1 1]'];
0105 else
0106 t = decode_qform0(h);
0107 end
0108 s = double(bitand(h.xyzt_units,7));
0109 if s
0110 d = findindict(s,'units');
0111 t = diag([d.rescale*[1 1 1] 1])*t;
0112 end;
0113
0114 case 'mat_intent',
0115 if h.sform_code>0,
0116 t = h.sform_code;
0117 else
0118 t = h.qform_code;
0119 end;
0120 d = findindict(t,'xform');
0121 if isempty(d) || d.code==0,
0122 t = '';
0123 else
0124 t = d.label;
0125 end;
0126
0127 case 'intent',
0128 d = findindict(h.intent_code,'intent');
0129 if isempty(d) || d.code == 0,
0130
0131 t = [];
0132 else
0133 t = struct('code',d.label,'param',...
0134 double([h.intent_p1 h.intent_p2 h.intent_p3]), 'name',deblank(h.intent_name));
0135 t.param = t.param(1:length(d.param));
0136 end
0137
0138 case 'diminfo',
0139 t = [];
0140 tmp = bitand( h.dim_info ,3); if tmp, t.frequency = double(tmp); end;
0141 tmp = bitand(bitshift(h.dim_info,-2),3); if tmp, t.phase = double(tmp); end;
0142 tmp = bitand(bitshift(h.dim_info,-4),3); if tmp, t.slice = double(tmp); end;
0143
0144
0145
0146 if isfield(t,'slice')
0147 sc = double(h.slice_code);
0148 ss = double(h.slice_start)+1;
0149 se = double(h.slice_end)+1;
0150 ss = max(ss,1);
0151 se = min(se,double(h.dim(t.slice+1)));
0152
0153 sd = double(h.slice_duration);
0154 s = double(bitand(h.xyzt_units,24));
0155 d = findindict(s,'units');
0156 if d.rescale, sd = sd*d.rescale; end;
0157
0158 ns = (se-ss+1);
0159 d = findindict(sc,'sliceorder');
0160 if isempty(d)
0161 label = 'UNKNOWN';
0162 else
0163 label = d.label;
0164 end;
0165 t.slice_time = struct('code',label,'start',ss,'end',se,'duration',sd);
0166 if 0,
0167 t.times = zeros(1,double(h.dim(t.slice+1)))+NaN;
0168 switch sc,
0169 case 0,
0170 t.times(ss:se) = zeros(1,ns);
0171 case 1,
0172 t.times(ss:se) = (0:(ns-1))*sd;
0173 case 2,
0174 t.times(ss:se) = ((ns-1):-1:0)*sd;
0175 case 3,
0176 t.times(ss:2:se) = (0:floor((ns+1)/2-1))*sd;
0177 t.times((ss+1):2:se) = (floor((ns+1)/2):(ns-1))*sd;
0178 case 4,
0179 t.times(se:-2:ss) = (0:floor((ns+1)/2-1))*sd;
0180 t.times(se:-2:(ss+1)) = (floor((ns+1)/2):(ns-1))*sd;
0181 end;
0182 end;
0183 end;
0184
0185 case 'timing',
0186 to = double(h.toffset);
0187 dt = double(h.pixdim(5));
0188 if to==0 && dt==0,
0189 t = [];
0190 else
0191 s = double(bitand(h.xyzt_units,24));
0192 d = findindict(s,'units');
0193 if d.rescale,
0194 to = to*d.rescale;
0195 dt = dt*d.rescale;
0196 end;
0197 t = struct('toffset',to,'tspace',dt);
0198 end;
0199
0200 case 'descrip',
0201 t = deblank(h.descrip);
0202 msk = find(t==0);
0203 if any(msk), t=t(1:(msk(1)-1)); end;
0204
0205 case 'cal',
0206 t = [double(h.cal_min) double(h.cal_max)];
0207 if all(t==0), t = []; end;
0208
0209 case 'aux_file',
0210 t = deblank(h.aux_file);
0211
0212 case 'hdr',
0213 t = h;
0214
0215 otherwise
0216 error(['Reference to non-existent field ''' subs(1).subs '''.']);
0217 end;
0218 if numel(subs)>1,
0219 t = subsref(t,subs(2:end));
0220 end;
0221 c{ii} = t;
0222 end;
0223 case {'{}'},
0224 error('Cell contents reference from a non-cell array object.');
0225 case {'()'},
0226 opt = struct(opt);
0227 t = subsref(opt,subs(1));
0228 if length(subs)>1
0229 c = {};
0230 for i=1:numel(t),
0231 ti = class(t(i),'read_nifti');
0232 ti = rec(ti,subs(2:end));
0233 c = {c{:}, ti{:}};
0234 end;
0235 else
0236 c = {class(t,'read_nifti')};
0237 end;
0238
0239 otherwise
0240 error('This should not happen.');
0241 end;