Closed seky739 closed 9 years ago
Takže je potřeba bohužel zkusit přečíst matlabovský skript který provádí merge datového souboru. Jelikož help (L.Vařeka) moc nepomohl ohledně struktur EEG file a jeho pomoc zněla tak si přečtěte ten skript není tak dlouhý a funguje, mě docela konsternovala. Takže ohledně mergingu datového souboru fakt netuším krom toho skriptu .
Tady je celý výpis :
% pop_mergeset() - Merge two or more datasets. If only one argument is given, % a window pops up to ask for more arguments. % Usage: % >> OUTEEG = pop_mergeset( ALLEEG ); % use a pop-up window % >> OUTEEG = pop_mergeset( ALLEEG, indices, keepall); % >> OUTEEG = pop_mergeset( INEEG1, INEEG2, keepall); % % Inputs: % INEEG1 - first input dataset % INEEG2 - second input dataset % % else % ALLEEG - array of EEG dataset structures % indices - indices of EEG datasets to merge % % keepall - [0|1] 0 -> remove, or 1 -> preserve, ICA activations % of the first dataset and recompute the activations % of the merged data {default: 0} % % Outputs: % OUTEEG - merged dataset % % Author: Arnaud Delorme, CNL / Salk Institute, 2001 % % See also: eeglab()
% Copyright (C) 2001 Arnaud Delorme, Salk Institute, arno@salk.edu % % This program is free software; you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 2 of the License, or % (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program; if not, write to the Free Software % Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
% 01-25-02 reformated help & license -ad % 01-26-02 change format for events and trial conditions -ad
function [INEEG1, com] = pop_mergeset( INEEG1, INEEG2, keepall);
com = ''; if nargin < 1 help pop_mergeset; return; end; if isempty(INEEG1) error('needs at least two datasets'); end; if nargin < 2 & length(INEEG1) == 1 error('needs at least two datasets'); end;
if nargin == 1 uilist = { { 'style' 'text' 'string' 'Dataset indices to merge' } ... { 'style' 'edit' 'string' '1' } ... { 'style' 'text' 'string' 'Preserve ICA weights of the first dataset ?' } ... { 'style' 'checkbox' 'string' '' } }; res = inputgui( 'uilist', uilist, 'geometry', { [3 1] [3 1] }, 'helpcom', 'pophelp(''pop_mergeset'')');
if isempty(res) return; end;
INEEG2 = eval( [ '[' res{1} ']' ] );
keepall = res{2};
else if nargin < 3 keepall = 0; % default end; end;
fprintf('Merging datasets...\n');
if ~isstruct(INEEG2) % if INEEG2 is a vector of ALLEEG indices indices = INEEG2; if length(indices) < 2 error('needs at least two datasets'); end;
NEWEEG = eeg_retrieve(INEEG1, indices(1)); % why abandoned?
for index = 2:length(indices)
INEEG2 = eeg_retrieve(INEEG1, indices(index));
NEWEEG = pop_mergeset(NEWEEG, INEEG2, keepall); % recursive call
end;
INEEG1 = NEWEEG;
else % INEEG is an EEG struct % check consistency % ----------------- if INEEG1.nbchan ~= INEEG2.nbchan error('The two datasets must have the same number of channels'); end; if INEEG1.srate ~= INEEG2.srate error('The two datasets must have the same sampling rate'); end; if INEEG1.trials > 1 | INEEG2.trials > 1 if INEEG1.pnts ~= INEEG2.pnts error('The two epoched datasets must have the same number of points'); end; if INEEG1.xmin ~= INEEG2.xmin INEEG2.xmin = INEEG1.xmin; fprintf('Warning: the two epoched datasets do not have the same time onset, adjusted'); end; if INEEG1.xmax ~= INEEG2.xmax INEEG2.xmax = INEEG1.xmax; fprintf('Warning: the two epoched datasets do not have the same time offset, adjusted'); end; end;
% Merge the epoch field
% ---------------------
if INEEG1.trials > 1 | INEEG2.trials > 1
INEEGX = {INEEG1,INEEG2};
for n = 1:2
% make sure that both have an (appropriately-sized) epoch field
% -------------------------------------------------------------
if ~isfield(INEEGX{n},'epoch')
INEEGX{n}.epoch = repmat(struct(),[1,INEEGX{n}.trials]);
end
% make sure that the epoch number is correct in each dataset
% ----------------------------------------------------------
if ~isempty(INEEGX{n}.epoch) && length(INEEGX{n}.epoch) ~= INEEGX{n}.trials
disp('Warning: The number of trials does not match the length of the EEG.epoch field in one of');
disp(' the datasets. Its epoch info will be reset and derived from the respective events.');
INEEGX{n}.epoch = repmat(struct(),[1,INEEGX{n}.trials]);
end
end
for n=1:2
% purge all event-related epoch fields from each dataset (EEG.epoch.event* fields)
% --------------------------------------------------------------------------------
if isstruct(INEEGX{n}.epoch)
fn = fieldnames(INEEGX{n}.epoch);
INEEGX{n}.epoch = rmfield(INEEGX{n}.epoch,{fn{strmatch('event',fn)}});
% copy remaining field names to the other dataset
% -----------------------------------------------
for f = fieldnames(INEEGX{n}.epoch)'
if ~isfield(INEEGX{3-n}.epoch,f{1})
INEEGX{3-n}.epoch(1).(f{1}) = [];
end
end
% after this, both sets have an epoch field with the appropriate number of items
% and possibly some user-defined fields, but no event* fields.
end
end
% concatenate epochs
% ------------------
if isstruct(INEEGX{1}.epoch) && isstruct(INEEGX{2}.epoch)
if length(fieldnames(INEEGX{2}.epoch)) > 0
INEEGX{1}.epoch(end+1:end+INEEGX{2}.trials) = orderfields(INEEGX{2}.epoch,INEEGX{1}.epoch);
else
INEEGX{1}.epoch(end+1:end+INEEGX{2}.trials) = INEEGX{2}.epoch;
end;
end
% and write back
INEEG1 = INEEGX{1};
INEEG2 = INEEGX{2};
INEEGX = {};
end
% Concatenate data
% ----------------
if INEEG1.trials > 1 | INEEG2.trials > 1
INEEG1.data(:,:,end+1:end+size(INEEG2.data,3)) = INEEG2.data(:,:,:);
else
INEEG1.data(:,end+1:end+size(INEEG2.data,2)) = INEEG2.data(:,:);
end;
INEEG1.setname = 'Merged datasets';
INEEG1trials = INEEG1.trials;
INEEG2trials = INEEG2.trials;
INEEG1pnts = INEEG1.pnts;
INEEG2pnts = INEEG2.pnts;
if INEEG1.trials > 1 | INEEG2.trials > 1 % epoched data
INEEG1.trials = INEEG1.trials + INEEG2.trials;
else % continuous data
INEEG1.pnts = INEEG1.pnts + INEEG2.pnts;
end;
if isfield(INEEG1, 'reject')
INEEG1 = rmfield(INEEG1, 'reject' );
end;
INEEG1.specicaact = [];
INEEG1.specdata = [];
if keepall == 0
INEEG1.icaact = [];
INEEG1.icawinv = [];
INEEG1.icasphere = [];
INEEG1.icaweights = [];
if isfield(INEEG1, 'stats')
INEEG1 = rmfield(INEEG1, 'stats' );
end;
else
INEEG1.icaact = [];
end;
% concatenate events
% ------------------
if isempty(INEEG2.event) && INEEG2.trials == 1
% boundary event
% -------------
disp('Inserting boundary event...');
INEEG1.event(end+1).type = 'boundary'; % add boundary event between datasets
INEEG1.event(end ).latency = INEEG1pnts+0.5; % make boundary halfway between last,first pts
% check urevents
% --------------
if ~isfield(INEEG1, 'urevent'),
INEEG1.urevent = [];
fprintf('Warning: first dataset has no urevent structure.\n');
end;
% add boundary urevent
% --------------------
disp('Inserting boundary urevent...');
INEEG1.urevent(end+1).type = 'boundary';
if length(INEEG1.urevent) > 1 % if previous INEEG1 urevents
INEEG1.urevent(end ).latency = max(INEEG1pnts, INEEG1.urevent(end-1).latency)+0.5;
else
INEEG1.urevent(end ).latency = INEEG1pnts+0.5;
end;
else % is ~isempty(INEEG2.event)
% concatenate urevents
% --------------------
if isfield(INEEG2, 'urevent')
if ~isempty(INEEG2.urevent) && isfield(INEEG1.urevent, 'latency')
% insert boundary event
% ---------------------
disp('Inserting boundary event...');
INEEG1.urevent(end+1).type = 'boundary';
try
INEEG1.urevent(end ).latency = max(INEEG1pnts, INEEG1.urevent(end-1).latency)+0.5;
catch
% cko: sometimes INEEG1 has no events / urevents
INEEG1.urevent(end ).latency = INEEG1pnts+0.5;
end
% update urevent indices for second dataset
% -----------------------------------------
disp('Concatenating urevents...');
orilen = length(INEEG1.urevent);
newlen = length(INEEG2.urevent);
INEEG2event = INEEG2.event;
% update urevent index in INEEG2.event
tmpevents = INEEG2.event;
nonemptymask = ~cellfun('isempty',{tmpevents.urevent});
[tmpevents(nonemptymask).urevent] = celldeal(num2cell([INEEG2event.urevent]+orilen));
INEEG2.event = tmpevents;
% reserve space and append INEEG2.urevent
INEEG1.urevent(orilen+newlen).latency = [];
INEEG2urevent = INEEG2.urevent;
tmpevents = INEEG1.urevent;
for f = fieldnames(INEEG2urevent)'
[tmpevents((orilen+1):(orilen+newlen)).(f{1})] = INEEG2urevent.(f{1});
end
INEEG1.urevent = tmpevents;
else
INEEG1.urevent = [];
INEEG2.urevent = [];
fprintf('Warning: second dataset has empty urevent structure.\n');
end
end;
% concatenate events
% ------------------
disp('Concatenating events...');
orilen = length(INEEG1.event);
newlen = length(INEEG2.event);
%allfields = fieldnames(INEEG2.event);
% ensure similar event structures
% -------------------------------
if ~isempty(INEEG2.event)
if isstruct(INEEG1.event)
for f = fieldnames(INEEG1.event)'
if ~isfield(INEEG2.event,f{1})
INEEG2.event(1).(f{1}) = [];
end
end
end
if isstruct(INEEG2.event)
for f = fieldnames(INEEG2.event)'
if ~isfield(INEEG1.event,f{1})
INEEG1.event(1).(f{1}) = [];
end
end
end
INEEG2.event = orderfields(INEEG2.event, INEEG1.event);
end;
% append
INEEG1.event(orilen+(1:newlen)) = INEEG2.event;
INEEG2event = INEEG2.event;
if isfield(INEEG1.event,'latency') && isfield(INEEG2.event,'latency')
% update latency
tmpevents = INEEG1.event;
[tmpevents(orilen + (1:newlen)).latency] = celldeal(num2cell([INEEG2event.latency] + INEEG1pnts*INEEG1trials));
INEEG1.event = tmpevents;
end
if isfield(INEEG1.event,'epoch') && isfield(INEEG2.event,'epoch')
% update epoch index
tmpevents = INEEG1.event;
[tmpevents(orilen + (1:newlen)).epoch] = celldeal(num2cell([INEEG2event.epoch]+INEEG1trials));
INEEG1.event = tmpevents;
end
% add discontinuity event if continuous
% -------------------------------------
if INEEG1trials == 1 & INEEG2trials == 1
disp('Adding boundary event...');
INEEG1.event = eeg_insertbound(INEEG1.event, INEEG1.pnts, INEEG1pnts+1, 0); % +1 since 0.5 is subtracted
end;
end;
INEEG1.pnts = size(INEEG1.data,2);
if ~isfield(INEEG1.event,'epoch') && ~isempty(INEEG1.event) && (size(INEEG1.data,3)>1 || ~isempty(INEEG1.epoch))
INEEG1.event(1).epoch = [];
end
% rebuild event-related epoch fields
% ----------------------------------
disp('Reconstituting epoch information...');
INEEG1 = eeg_checkset(INEEG1, 'eventconsistency');
end
% build the command % ----------------- if exist('indices') == 1 com = sprintf('EEG = pop_mergeset( %s, [%s], %d);', inputname(1), int2str(indices), keepall); else com = sprintf('EEG = pop_mergeset( %s, %s, %d);', inputname(1), inputname(2), keepall); end
return
function varargout = celldeal(X) varargout = X;
Tady je odkaz na ten git kde je EEG loader https://github.com/stebjan/eegloader