| | function dimord = getdimord(data, field, varargin) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | if ~isfield(data, field) && isfield(data, 'avg') && isfield(data.avg, field) |
| | field = ['avg.' field]; |
| | elseif ~isfield(data, field) && isfield(data, 'trial') && isfield(data.trial, field) |
| | field = ['trial.' field]; |
| | elseif ~isfield(data, field) |
| | error('field "%s" not present in data', field); |
| | end |
| |
|
| | if strncmp(field, 'avg.', 4) |
| | prefix = ''; |
| | field = field(5:end); |
| | data.(field) = data.avg.(field); |
| | data = rmfield(data, 'avg'); |
| | elseif strncmp(field, 'trial.', 6) |
| | prefix = '(rpt)_'; |
| | field = field(7:end); |
| | data.(field) = data.trial(1).(field); |
| | data = rmfield(data, 'trial'); |
| | else |
| | prefix = ''; |
| | end |
| |
|
| |
|
| | |
| | |
| | |
| |
|
| | if isfield(data, [field 'dimord']) |
| | dimord = data.([field 'dimord']); |
| | return |
| | end |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | |
| | ntime = inf; |
| | nfreq = inf; |
| | nchan = inf; |
| | nchancmb = inf; |
| | nsubj = nan; |
| | nrpt = nan; |
| | nrpttap = nan; |
| | npos = inf; |
| | nori = nan; |
| | ntopochan = inf; |
| | nspike = inf; |
| | nlag = nan; |
| | ndim1 = nan; |
| | ndim2 = nan; |
| | ndim3 = nan; |
| |
|
| | |
| | assign = @(var, val) assignin('caller', var, val); |
| | |
| | for i=1:2:length(varargin) |
| | assign(varargin{i}, varargin{i+1}); |
| | end |
| |
|
| | |
| | if isfield(data, 'label') |
| | nchan = length(data.label); |
| | end |
| |
|
| | if isfield(data, 'labelcmb') |
| | nchancmb = size(data.labelcmb, 1); |
| | end |
| |
|
| | if isfield(data, 'time') |
| | if iscell(data.time) && ~isempty(data.time) |
| | tmp = getdimsiz(data, 'time'); |
| | ntime = tmp(3); |
| | else |
| | ntime = length(data.time); |
| | end |
| | end |
| |
|
| | if isfield(data, 'freq') |
| | nfreq = length(data.freq); |
| | end |
| |
|
| | if isfield(data, 'trial') && ft_datatype(data, 'raw') |
| | nrpt = length(data.trial); |
| | end |
| |
|
| | if isfield(data, 'trialtime') && ft_datatype(data, 'spike') |
| | nrpt = size(data.trialtime,1); |
| | end |
| |
|
| | if isfield(data, 'cumtapcnt') |
| | nrpt = size(data.cumtapcnt,1); |
| | if numel(data.cumtapcnt)==length(data.cumtapcnt) |
| | |
| | nrpttap = sum(data.cumtapcnt); |
| | else |
| | |
| | |
| | nrpttap = sum(data.cumtapcnt,2); |
| | if any(nrpttap~=nrpttap(1)) |
| | warning('unexpected variation of the number of tapers over trials') |
| | nrpttap = nan; |
| | else |
| | nrpttap = nrpttap(1); |
| | end |
| | end |
| | end |
| |
|
| | if isfield(data, 'pos') |
| | npos = size(data.pos,1); |
| | elseif isfield(data, 'dim') |
| | npos = prod(data.dim); |
| | end |
| |
|
| | if isfield(data, 'dim') |
| | ndim1 = data.dim(1); |
| | ndim2 = data.dim(2); |
| | ndim3 = data.dim(3); |
| | end |
| |
|
| | if isfield(data, 'csdlabel') |
| | |
| | if length(data.csdlabel)==npos |
| | |
| | len = cellfun(@numel, data.csdlabel); |
| | len = len(len~=0); |
| | if all(len==len(1)) |
| | |
| | nori = len(1); |
| | end |
| | else |
| | |
| | nori = length(data.csdlabel); |
| | end |
| | elseif isfinite(npos) |
| | |
| | nori = 3; |
| | end |
| |
|
| | if isfield(data, 'topolabel') |
| | |
| | ntopochan = length(data.topolabel); |
| | end |
| |
|
| | if isfield(data, 'timestamp') && iscell(data.timestamp) |
| | nspike = length(data.timestamp{1}); |
| | end |
| |
|
| | if ft_datatype(data, 'mvar') && isfield(data, 'coeffs') |
| | nlag = size(data.coeffs,3); |
| | end |
| |
|
| | |
| | datsiz = getdimsiz(data, field); |
| |
|
| | tok = {'subj' 'rpt' 'rpttap' 'chan' 'chancmb' 'freq' 'time' 'pos' 'ori' 'topochan' 'lag' 'dim1' 'dim2' 'dim3'}; |
| | siz = [nsubj nrpt nrpttap nchan nchancmb nfreq ntime npos nori ntopochan nlag ndim1 ndim2 ndim3]; |
| |
|
| | |
| | |
| | |
| |
|
| | if isfield(data, 'dimord') |
| | dimtok = tokenize(data.dimord, '_'); |
| | if length(dimtok)>length(datsiz) && check_trailingdimsunitlength(data, dimtok((length(datsiz)+1):end)) |
| | |
| | datsiz = [datsiz ones(1,max(0,length(dimtok)-length(datsiz)))]; |
| | end |
| | if length(dimtok)==length(datsiz) || (length(dimtok)==(length(datsiz)-1) && datsiz(end)==1) |
| | success = false(size(dimtok)); |
| | for i=1:length(dimtok) |
| | sel = strcmp(tok, dimtok{i}); |
| | if any(sel) && datsiz(i)==siz(sel) |
| | success(i) = true; |
| | elseif strcmp(dimtok{i}, 'subj') |
| | |
| | success(i) = true; |
| | elseif strcmp(dimtok{i}, 'rpt') |
| | |
| | success(i) = true; |
| | end |
| | end |
| | if all(success) |
| | dimord = data.dimord; |
| | return |
| | end |
| | end |
| | end |
| |
|
| | |
| | |
| | |
| |
|
| | switch field |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | case {'pos'} |
| | if isequalwithoutnans(datsiz, [npos 3]) |
| | dimord = 'pos_unknown'; |
| | end |
| | |
| | case {'individual'} |
| | if isequalwithoutnans(datsiz, [nsubj nchan ntime]) |
| | dimord = 'subj_chan_time'; |
| | end |
| | |
| | case {'avg' 'var' 'dof'} |
| | if isequal(datsiz, [nrpt nchan ntime]) |
| | dimord = 'rpt_chan_time'; |
| | elseif isequal(datsiz, [nchan ntime]) |
| | dimord = 'chan_time'; |
| | elseif isequalwithoutnans(datsiz, [nrpt nchan ntime]) |
| | dimord = 'rpt_chan_time'; |
| | elseif isequalwithoutnans(datsiz, [nchan ntime]) |
| | dimord = 'chan_time'; |
| | end |
| | |
| | case {'powspctrm' 'fourierspctrm'} |
| | if isequal(datsiz, [nrpt nchan nfreq ntime]) |
| | dimord = 'rpt_chan_freq_time'; |
| | elseif isequal(datsiz, [nrpt nchan nfreq]) |
| | dimord = 'rpt_chan_freq'; |
| | elseif isequal(datsiz, [nchan nfreq ntime]) |
| | dimord = 'chan_freq_time'; |
| | elseif isequal(datsiz, [nchan nfreq]) |
| | dimord = 'chan_freq'; |
| | elseif isequalwithoutnans(datsiz, [nrpt nchan nfreq ntime]) |
| | dimord = 'rpt_chan_freq_time'; |
| | elseif isequalwithoutnans(datsiz, [nrpt nchan nfreq]) |
| | dimord = 'rpt_chan_freq'; |
| | elseif isequalwithoutnans(datsiz, [nchan nfreq ntime]) |
| | dimord = 'chan_freq_time'; |
| | elseif isequalwithoutnans(datsiz, [nchan nfreq]) |
| | dimord = 'chan_freq'; |
| | end |
| | |
| | case {'crsspctrm' 'cohspctrm'} |
| | if isequal(datsiz, [nrpt nchancmb nfreq ntime]) |
| | dimord = 'rpt_chancmb_freq_time'; |
| | elseif isequal(datsiz, [nrpt nchancmb nfreq]) |
| | dimord = 'rpt_chancmb_freq'; |
| | elseif isequal(datsiz, [nchancmb nfreq ntime]) |
| | dimord = 'chancmb_freq_time'; |
| | elseif isequal(datsiz, [nchancmb nfreq]) |
| | dimord = 'chancmb_freq'; |
| | elseif isequal(datsiz, [nrpt nchan nchan nfreq ntime]) |
| | dimord = 'rpt_chan_chan_freq_time'; |
| | elseif isequal(datsiz, [nrpt nchan nchan nfreq]) |
| | dimord = 'rpt_chan_chan_freq'; |
| | elseif isequal(datsiz, [nchan nchan nfreq ntime]) |
| | dimord = 'chan_chan_freq_time'; |
| | elseif isequal(datsiz, [nchan nchan nfreq]) |
| | dimord = 'chan_chan_freq'; |
| | elseif isequal(datsiz, [npos nori]) |
| | dimord = 'pos_ori'; |
| | elseif isequal(datsiz, [npos 1]) |
| | dimord = 'pos'; |
| | elseif isequalwithoutnans(datsiz, [nrpt nchancmb nfreq ntime]) |
| | dimord = 'rpt_chancmb_freq_time'; |
| | elseif isequalwithoutnans(datsiz, [nrpt nchancmb nfreq]) |
| | dimord = 'rpt_chancmb_freq'; |
| | elseif isequalwithoutnans(datsiz, [nchancmb nfreq ntime]) |
| | dimord = 'chancmb_freq_time'; |
| | elseif isequalwithoutnans(datsiz, [nchancmb nfreq]) |
| | dimord = 'chancmb_freq'; |
| | elseif isequalwithoutnans(datsiz, [nrpt nchan nchan nfreq ntime]) |
| | dimord = 'rpt_chan_chan_freq_time'; |
| | elseif isequalwithoutnans(datsiz, [nrpt nchan nchan nfreq]) |
| | dimord = 'rpt_chan_chan_freq'; |
| | elseif isequalwithoutnans(datsiz, [nchan nchan nfreq ntime]) |
| | dimord = 'chan_chan_freq_time'; |
| | elseif isequalwithoutnans(datsiz, [nchan nchan nfreq]) |
| | dimord = 'chan_chan_freq'; |
| | elseif isequalwithoutnans(datsiz, [npos nori]) |
| | dimord = 'pos_ori'; |
| | elseif isequalwithoutnans(datsiz, [npos 1]) |
| | dimord = 'pos'; |
| | end |
| | |
| | case {'cov' 'coh' 'csd' 'noisecov' 'noisecsd'} |
| | |
| | if isequal(datsiz, [nrpt nchan nchan]) |
| | dimord = 'rpt_chan_chan'; |
| | elseif isequal(datsiz, [nchan nchan]) |
| | dimord = 'chan_chan'; |
| | elseif isequal(datsiz, [npos nori nori]) |
| | dimord = 'pos_ori_ori'; |
| | elseif isequal(datsiz, [npos nrpt nori nori]) |
| | dimord = 'pos_rpt_ori_ori'; |
| | elseif isequalwithoutnans(datsiz, [nrpt nchan nchan]) |
| | dimord = 'rpt_chan_chan'; |
| | elseif isequalwithoutnans(datsiz, [nchan nchan]) |
| | dimord = 'chan_chan'; |
| | elseif isequalwithoutnans(datsiz, [npos nori nori]) |
| | dimord = 'pos_ori_ori'; |
| | elseif isequalwithoutnans(datsiz, [npos nrpt nori nori]) |
| | dimord = 'pos_rpt_ori_ori'; |
| | end |
| | |
| | case {'tf'} |
| | if isequal(datsiz, [npos nfreq ntime]) |
| | dimord = 'pos_freq_time'; |
| | end |
| | case {'pow'} |
| | if isequal(datsiz, [npos ntime]) |
| | dimord = 'pos_time'; |
| | elseif isequal(datsiz, [npos nfreq]) |
| | dimord = 'pos_freq'; |
| | elseif isequal(datsiz, [npos nrpt]) |
| | dimord = 'pos_rpt'; |
| | elseif isequal(datsiz, [nrpt npos ntime]) |
| | dimord = 'rpt_pos_time'; |
| | elseif isequal(datsiz, [nrpt npos nfreq]) |
| | dimord = 'rpt_pos_freq'; |
| | elseif isequal(datsiz, [npos 1]) |
| | dimord = 'pos'; |
| | elseif isequalwithoutnans(datsiz, [npos ntime]) |
| | dimord = 'pos_time'; |
| | elseif isequalwithoutnans(datsiz, [npos nfreq]) |
| | dimord = 'pos_freq'; |
| | elseif isequalwithoutnans(datsiz, [npos nrpt]) |
| | dimord = 'pos_rpt'; |
| | elseif isequalwithoutnans(datsiz, [nrpt npos ntime]) |
| | dimord = 'rpt_pos_time'; |
| | elseif isequalwithoutnans(datsiz, [nrpt npos nfreq]) |
| | dimord = 'rpt_pos_freq'; |
| | end |
| | |
| | case {'mom'} |
| | if isequal(datsiz, [npos nori nrpt]) |
| | dimord = 'pos_ori_rpt'; |
| | elseif isequal(datsiz, [npos nori ntime]) |
| | dimord = 'pos_ori_time'; |
| | elseif isequal(datsiz, [npos nori nfreq]) |
| | dimord = 'pos_ori_nfreq'; |
| | elseif isequal(datsiz, [npos ntime]) |
| | dimord = 'pos_time'; |
| | elseif isequal(datsiz, [npos nfreq]) |
| | dimord = 'pos_freq'; |
| | elseif isequal(datsiz, [npos 3]) |
| | dimord = 'pos_ori'; |
| | elseif isequal(datsiz, [npos 1]) |
| | dimord = 'pos'; |
| | elseif isequal(datsiz, [npos nrpt]) |
| | dimord = 'pos_rpt'; |
| | elseif isequalwithoutnans(datsiz, [npos nori nrpt]) |
| | dimord = 'pos_ori_rpt'; |
| | elseif isequalwithoutnans(datsiz, [npos nori ntime]) |
| | dimord = 'pos_ori_time'; |
| | elseif isequalwithoutnans(datsiz, [npos nori nfreq]) |
| | dimord = 'pos_ori_nfreq'; |
| | elseif isequalwithoutnans(datsiz, [npos ntime]) |
| | dimord = 'pos_time'; |
| | elseif isequalwithoutnans(datsiz, [npos nfreq]) |
| | dimord = 'pos_freq'; |
| | elseif isequalwithoutnans(datsiz, [npos 3]) |
| | dimord = 'pos_ori'; |
| | elseif isequalwithoutnans(datsiz, [npos 1]) |
| | dimord = 'pos'; |
| | elseif isequalwithoutnans(datsiz, [npos nrpt]) |
| | dimord = 'pos_rpt'; |
| | elseif isequalwithoutnans(datsiz, [npos nrpt nori ntime]) |
| | dimord = 'pos_rpt_ori_time'; |
| | elseif isequalwithoutnans(datsiz, [npos nrpt 1 ntime]) |
| | dimord = 'pos_rpt_ori_time'; |
| | end |
| | |
| | case {'filter'} |
| | if isequalwithoutnans(datsiz, [npos nori nchan]) || (isequal(datsiz([1 2]), [npos nori]) && isinf(nchan)) |
| | dimord = 'pos_ori_chan'; |
| | end |
| | |
| | case {'leadfield'} |
| | if isequalwithoutnans(datsiz, [npos nchan nori]) || (isequal(datsiz([1 3]), [npos nori]) && isinf(nchan)) |
| | dimord = 'pos_chan_ori'; |
| | end |
| | |
| | case {'ori' 'eta'} |
| | if isequal(datsiz, [npos nori]) || isequal(datsiz, [npos 3]) |
| | dimord = 'pos_ori'; |
| | end |
| | |
| | case {'csdlabel'} |
| | if isequal(datsiz, [npos nori]) || isequal(datsiz, [npos 3]) |
| | dimord = 'pos_ori'; |
| | end |
| | |
| | case {'trial'} |
| | if ~iscell(data.(field)) && isequalwithoutnans(datsiz, [nrpt nchan ntime]) |
| | dimord = 'rpt_chan_time'; |
| | elseif isequalwithoutnans(datsiz, [nrpt nchan ntime]) |
| | dimord = '{rpt}_chan_time'; |
| | elseif isequalwithoutnans(datsiz, [nchan nspike]) || isequalwithoutnans(datsiz, [nchan 1 nspike]) |
| | dimord = '{chan}_spike'; |
| | end |
| | |
| | case {'sampleinfo' 'trialinfo' 'trialtime'} |
| | if isequalwithoutnans(datsiz, [nrpt nan]) |
| | dimord = 'rpt_other'; |
| | end |
| | |
| | case {'cumtapcnt' 'cumsumcnt'} |
| | if isequalwithoutnans(datsiz, [nrpt nan]) |
| | dimord = 'rpt_other'; |
| | end |
| | |
| | case {'topo'} |
| | if isequalwithoutnans(datsiz, [ntopochan nchan]) |
| | dimord = 'topochan_chan'; |
| | end |
| | |
| | case {'unmixing'} |
| | if isequalwithoutnans(datsiz, [nchan ntopochan]) |
| | dimord = 'chan_topochan'; |
| | end |
| | |
| | case {'inside'} |
| | if isequalwithoutnans(datsiz, [npos]) |
| | dimord = 'pos'; |
| | end |
| | |
| | case {'timestamp' 'time'} |
| | if ft_datatype(data, 'spike') && iscell(data.(field)) && datsiz(1)==nchan |
| | dimord = '{chan}_spike'; |
| | elseif ft_datatype(data, 'raw') && iscell(data.(field)) && datsiz(1)==nrpt |
| | dimord = '{rpt}_time'; |
| | elseif isvector(data.(field)) && isequal(datsiz, [1 ntime ones(1,numel(datsiz)-2)]) |
| | dimord = 'time'; |
| | end |
| | |
| | case {'freq'} |
| | if isvector(data.(field)) && isequal(datsiz, [1 nfreq]) |
| | dimord = 'freq'; |
| | end |
| | |
| | otherwise |
| | if isfield(data, 'dim') && isequal(datsiz, data.dim) |
| | dimord = 'dim1_dim2_dim3'; |
| | end |
| | |
| | end |
| |
|
| | |
| | if exist('dimord', 'var') && strcmp(dimord(1:3), 'pos') && iscell(data.(field)) |
| | dimord = ['{pos}' dimord(4:end)]; |
| | end |
| |
|
| | if ~exist('dimord', 'var') |
| | |
| | |
| | |
| | dimtok = cell(size(datsiz)); |
| | |
| | for i=1:length(datsiz) |
| | sel = find(siz==datsiz(i)); |
| | if length(sel)==1 |
| | |
| | dimtok{i} = tok{sel}; |
| | else |
| | |
| | dimtok{i} = []; |
| | end |
| | end |
| | |
| | if all(~cellfun(@isempty, dimtok)) |
| | if iscell(data.(field)) |
| | dimtok{1} = ['{' dimtok{1} '}']; |
| | end |
| | dimord = sprintf('%s_', dimtok{:}); |
| | dimord = dimord(1:end-1); |
| | return |
| | end |
| | end |
| |
|
| | if ~exist('dimord', 'var') |
| | |
| | |
| | |
| | sel = ~isnan(siz) & ~isinf(siz); |
| | |
| | |
| | if length(unique(siz(sel)))==length(siz(sel)) |
| | |
| | dimtok = cell(size(datsiz)); |
| | dimtok(datsiz==npos) = {'pos'}; |
| | dimtok(datsiz==nori) = {'ori'}; |
| | dimtok(datsiz==nrpttap) = {'rpttap'}; |
| | dimtok(datsiz==nrpt) = {'rpt'}; |
| | dimtok(datsiz==nsubj) = {'subj'}; |
| | dimtok(datsiz==nchancmb) = {'chancmb'}; |
| | dimtok(datsiz==nchan) = {'chan'}; |
| | dimtok(datsiz==nfreq) = {'freq'}; |
| | dimtok(datsiz==ntime) = {'time'}; |
| | dimtok(datsiz==ndim1) = {'dim1'}; |
| | dimtok(datsiz==ndim2) = {'dim2'}; |
| | dimtok(datsiz==ndim3) = {'dim3'}; |
| | |
| | if isempty(dimtok{end}) && datsiz(end)==1 |
| | |
| | dimtok = dimtok(1:end-1); |
| | elseif isequal(dimtok{1}, 'pos') && isempty(dimtok{2}) && datsiz(2)==1 |
| | |
| | dimtok(2) = []; |
| | end |
| | |
| | if all(~cellfun(@isempty, dimtok)) |
| | if iscell(data.(field)) |
| | dimtok{1} = ['{' dimtok{1} '}']; |
| | end |
| | dimord = sprintf('%s_', dimtok{:}); |
| | dimord = dimord(1:end-1); |
| | return |
| | end |
| | end |
| | end |
| |
|
| | if ~exist('dimord', 'var') |
| | |
| | |
| | |
| | if isequal(datsiz, [ndim1 ndim2 ndim3]) |
| | dimord = 'dim1_dim2_dim3'; |
| | end |
| | end |
| |
|
| | |
| | |
| | |
| | if ~exist('dimord', 'var') |
| | |
| | |
| | |
| | |
| | warning('could not determine dimord of "%s" in the following data', field) |
| | disp(data); |
| | |
| | dimtok(cellfun(@isempty, dimtok)) = {'unknown'}; |
| | if all(~cellfun(@isempty, dimtok)) |
| | if iscell(data.(field)) |
| | dimtok{1} = ['{' dimtok{1} '}']; |
| | end |
| | dimord = sprintf('%s_', dimtok{:}); |
| | dimord = dimord(1:end-1); |
| | end |
| | end |
| |
|
| | |
| | dimord = [prefix dimord]; |
| |
|
| |
|
| | end |
| |
|
| | |
| | |
| | |
| | function ok = isequalwithoutnans(a, b) |
| |
|
| | |
| | numdiff = numel(b)-numel(a); |
| |
|
| | if numdiff > 0 |
| | |
| | a = [a(:); ones(numdiff, 1)]; |
| | b = b(:); |
| | elseif numdiff < 0 |
| | |
| | b = [b(:); ones(abs(numdiff), 1)]; |
| | a = a(:); |
| | end |
| |
|
| | c = ~isnan(a(:)) & ~isnan(b(:)); |
| | ok = isequal(a(c), b(c)); |
| |
|
| | end |
| |
|
| | |
| | |
| | |
| | function ok = check_trailingdimsunitlength(data, dimtok) |
| |
|
| | ok = false; |
| | for k = 1:numel(dimtok) |
| | switch dimtok{k} |
| | case 'chan' |
| | ok = numel(data.label)==1; |
| | otherwise |
| | if isfield(data, dimtok{k}); |
| | ok = numel(data.(dimtok{k}))==1; |
| | end; |
| | end |
| | if ok, |
| | break; |
| | end |
| | end |
| |
|
| | end |
| |
|