0001 function [data] = bml_hstack(cfg, varargin)
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
0046
0047
0048
0049
0050 cfg.appenddim = 'time';
0051 timetol = bml_getopt(cfg, 'timetol', 1e-5);
0052 timeref = bml_getopt(cfg, 'timeref', 'auto');
0053 match_labels = bml_getopt(cfg, 'match_labels', true);
0054
0055 isequaltime = true;
0056 isequallabel = true;
0057 issamelabel = true;
0058 issamenchan = true;
0059 isequaltrial = true;
0060 isequalfreq = true;
0061 for i=2:numel(varargin)
0062 isequaltime = isequaltime && isequal(varargin{i}.time , varargin{1}.time );
0063 isequallabel = isequallabel && isequal(varargin{i}.label, varargin{1}.label);
0064 issamelabel = issamelabel && isempty(setxor(varargin{i}.label, varargin{1}.label));
0065 issamenchan = issamenchan && (length(varargin{i}.label) == length(varargin{1}.label));
0066 isequaltrial = isequaltrial && isequal(numel(varargin{i}.trial),numel(varargin{1}.trial));
0067 isequalfreq = isequalfreq && length(uniquetol([varargin{i}.fsample,varargin{1}.fsample],timetol))==1;
0068 end
0069
0070
0071
0072
0073
0074
0075 dummy = cell(size(varargin));
0076 for i=1:numel(varargin)
0077 dummy{i} = removefields(varargin{i}, {'trial', 'time'});
0078 if strcmp(cfg.appenddim, 'chan')
0079 dummy{i} = removefields(dummy{i}, {'topo', 'unmixing', 'topolabel'});
0080 end
0081
0082 dummy{i}.dummy = ones(numel(dummy{i}.label),1);
0083 dummy{i}.dummydimord = 'chan';
0084 end
0085
0086 if ~isequallabel
0087 if issamelabel
0088 for i=2:length(varargin)
0089 cfg1=[];
0090 cfg1.label = varargin{1}.label;
0091 varargin{i} = bml_reorder_channels(cfg1,varargin{i});
0092 end
0093 elseif issamenchan && ~match_labels
0094 ft_warning('concatenating raws with different channel names. Keeping labels of first raw.')
0095 for i=2:length(varargin)
0096 varargin{i}.label = varargin{1}.label;
0097 dummy{i}.label = varargin{1}.label;
0098 end
0099 else
0100 ft_error('Same channels required to append data by time')
0101 end
0102 end
0103 if ~isequaltrial
0104 ft_error('Same number of trials required to append data by time')
0105 end
0106 if ~isequalfreq
0107 ft_error('Same Fs required to append data by time')
0108 end
0109
0110
0111 cfg.parameter = {};
0112
0113
0114 data = append_common(cfg, dummy{:});
0115
0116
0117 if ismember('fsample',fieldnames(varargin{1}))
0118 data.fsample=varargin{1}.fsample;
0119 end
0120 if ismember('hdr',fieldnames(varargin{1}))
0121 data.hdr=varargin{1}.hdr;
0122 end
0123
0124
0125 if strcmp(timeref,'auto')
0126 if bml_check_contiguity(cfg,varargin{:})
0127 timeref = 'common';
0128 else
0129 timeref = 'independent';
0130 end
0131 end
0132
0133 if strcmp(timeref,'independent')
0134 dat = cell(1,0);
0135 tim = cell(1,0);
0136 for t=1:numel(varargin{1}.trial)
0137 trial_dat=[];
0138 trial_tim=[];
0139 curtime=varargin{i}.time{t}(1);
0140 for i=1:numel(varargin)
0141 trial_dat = cat(2, trial_dat, varargin{i}.trial{t});
0142 time0=varargin{i}.time{t}(1);
0143 trial_tim = cat(2, trial_tim, curtime-time0+1/data.fsample+varargin{i}.time{t});
0144 curtime=trial_tim(end);
0145 end
0146 dat = cat(2, dat, trial_dat);
0147 tim = cat(2, tim, trial_tim);
0148 end
0149 data.trial = dat;
0150 data.time = tim;
0151 elseif strcmp(timeref,'common')
0152 dat = cell(1,0);
0153 tim = cell(1,0);
0154 for t=1:numel(varargin{1}.trial)
0155 trial_dat=[];
0156 trial_tim=[];
0157 for i=1:numel(varargin)
0158 trial_dat = cat(2, trial_dat, varargin{i}.trial{t});
0159 trial_tim = cat(2, trial_tim, varargin{i}.time{t});
0160 end
0161 dat = cat(2, dat, trial_dat);
0162 tim = cat(2, tim, trial_tim);
0163 end
0164 data.trial = dat;
0165 data.time = tim;
0166 else
0167 error('unknown cfg.timeref');
0168 end
0169