123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- function [featuresmat, feature_label] = ICL_feature_extration_full(EEG, study_ID, dataset_ID)
- if ~exist('study_ID', 'var') || isempty(study_ID)
- study_ID = nan;
- end
- if ~exist('dataset_ID', 'var') || isempty(dataset_ID)
- dataset_ID = nan;
- end
- % =========================================================================
- % EEG stuff
- % =========================================================================
- % % for testing only
- % lower2 = 2;
- % EEG = pop_subcomp(EEG, setdiff(1:size(EEG.icaweights,1), ...
- % randperm(size(EEG.icaweights,1), min(lower2,size(EEG.icaweights,1)))),0);
- assert(~isempty(EEG.icawinv), ...
- 'No ica weights in the current EEG dataset! Compute ICA on your data first.')
- n_ic= size(EEG.icawinv,2); % ncps is number of components
- % =========================================================================
- % Convert to average reference
- % =========================================================================
- pop_reref(EEG,[],'exclude',setdiff(1:EEG.nbchan,EEG.icachansind));
- % calculate ica activations if missing
- if isempty(EEG.icaact)
- EEG.icaact = eeg_getdatact(EEG,'component',1:n_ic);
- end
- % =========================================================================
- % Computing dipole
- % =========================================================================
- % 1 dipole
- if isfield(EEG, 'dipfit') && ~isempty(EEG.dipfit) ...
- && isfield(EEG.dipfit, 'model') && ~isempty(EEG.dipfit.model) ...
- && length(EEG.dipfit.model) == n_ic
- % reuse existing dipoles
- ind2dp = cellfun(@(c) size(c, 1), {EEG.dipfit.model.posxyz}) == 2;
-
- % 2 dipole
- EEG.dipfit2 = getfield(pop_multifit( ...
- EEG, find(~ind2dp), 'threshold', 100, 'dipoles', 2), 'dipfit');
-
- % 1 dipole
- for it = find(ind2dp)
- EEG.dipfit.model(it).posxyz(2, :) = [];
- EEG.dipfit.model(it).momxyz(2, :) = [];
- end
- EEG = pop_multifit(EEG, find(ind2dp), 'threshold', 100, 'dipoles', 1);
-
- else
- % recompute all
- try
- EEG = pop_multifit(EEG,[],'threshold',100);
- catch
- EEG = pop_dipfit_settings(EEG);
- EEG = pop_multifit(EEG,[],'threshold',100);
- end
-
- % 2 dipole
- EEG.dipfit2 = getfield(pop_multifit( ...
- EEG,[],'threshold',100,'dipoles',2),'dipfit');
- end
- % =========================================================================
- % Creating structure for sasica
- % =========================================================================
- optvals = struct('FASTER_blinkchans', '',...
- 'chancorr_channames', '',...
- 'chancorr_corthresh', 0.6,...
- 'EOGcorr_Heogchannames', [] ,...
- 'EOGcorr_corthreshH', 'auto', ...
- 'EOGcorr_Veogchannames', '',...
- 'EOGcorr_corthreshV', 'auto',...
- 'resvar_thresh', 15,...
- 'SNR_snrcut', 1,...
- 'SNR_snrBL', [-Inf,0],...
- 'SNR_snrPOI', [0 Inf],...
- 'trialfoc_focaltrialout', 'auto',...
- 'focalcomp_focalICAout', 'auto',...
- 'autocorr_autocorrint', 20,...
- 'autocorr_dropautocorr', 'auto');
-
- % Enable/disable fields
- fenable = struct('MARA_enable', 0,...
- 'FASTER_enable', 1,...
- 'ADJUST_enable', 1,...
- 'chancorr_enable', 1,...
- 'EOGcorr_enable', 0,...
- 'resvar_enable', 0,... % !!! changed!
- 'SNR_enable', 1,...
- 'trialfoc_enable', 0,...
- 'focalcomp_enable', 1,...
- 'autocorr_enable', 1);
-
- fields = regexp(fieldnames(fenable),'[^_]*','match')';
- for i_f = 1:length(fields)
- instr.(fields{i_f}{1}).(fields{i_f}{2}) = ...
- fenable.([fields{i_f}{1} '_' fields{i_f}{2}]);
- end
- fields2 = regexp(fieldnames(optvals),'[^_]*','match')';
- for i_f = 1:numel(fields2)
- if ~isempty(strfind(fields2{i_f}{2},'channame'))
- if ischar(optvals.([fields2{i_f}{1} '_' fields2{i_f}{2}]))
- instr.(fields2{i_f}{1}).(fields2{i_f}{2}) = ...
- eval(['[chnb(''' optvals.([fields2{i_f}{1} '_' fields2{i_f}{2}]) ''')]']);
- else
- instr.(fields2{i_f}{1}).(fields2{i_f}{2}) = ...
- eval(['[chnb([' optvals.([fields2{i_f}{1} '_' fields2{i_f}{2}]) '])]']);
- end
- else
- try
- instr.(fields2{i_f}{1}).(fields2{i_f}{2}) = ...
- eval(['[' optvals.([fields2{i_f}{1} '_' fields2{i_f}{2}]) ']']);
- catch
- instr.(fields2{i_f}{1}).(fields2{i_f}{2}) = ...
- optvals.([fields2{i_f}{1} '_' fields2{i_f}{2}]) ;
- end
- end
- end
- instr.opts.noplot = 1;
- % =========================================================================
- % Running sasica
- % =========================================================================
- [EEG] = myeeg_SASICA(EEG,instr);
- disp 'leaving sasica'
- % =========================================================================
- % Generating topos
- % =========================================================================
- topo = zeros(n_ic,740);
- plotrad = zeros(n_ic,1);
- disp 'saving topomap'
- for i = 1:n_ic
- scalpmap_norm = EEG.icawinv(:,i)/sqrt(sum(EEG.icawinv(:,i).^2));
- [~,Zi,plotrad(i)] = topoplotFast( scalpmap_norm, EEG.chanlocs, 'chaninfo', EEG.chaninfo, ...
- 'shading', 'interp', 'numcontour', 3,'electrodes','on','noplot','on');
- topo(i,:) = Zi(~isnan(Zi));
- end
- disp 'finished saving topomap'
- EEG.reject.SASICA.topo = topo;
- EEG.reject.SASICA.plotrad = plotrad;
- % =========================================================================
- % Generating psds
- % =========================================================================
- [EEG.reject.SASICA.spec, EEG.reject.SASICA.specvar, ...
- EEG.reject.SASICA.speckrt] = eeg_rpsd(EEG, 100);
- % =========================================================================
- % Generating autocorrs
- % =========================================================================
- if EEG.trials == 1
- if EEG.pnts / EEG.srate > 5
- EEG.reject.SASICA.autocorr = eeg_autocorr_welch(EEG);
- else
- EEG.reject.SASICA.autocorr = eeg_autocorr(EEG);
- end
- else
- EEG.reject.SASICA.autocorr = eeg_autocorr_fftw(EEG);
- end
- % =========================================================================
- % Generate and save feature vectors
- % =========================================================================
- [~, feature_labels] = genfvect;
- featuresmat = nan(n_ic,length(feature_labels));
- disp 'saving features'
- for i = 1:n_ic
- [featuresmat(i,:), feature_label] = genfvect(EEG,study_ID,dataset_ID,i);
- end
-
- % =========================================================================
- % =========================================================================
- % =========================================================================
- function [nb,channame,strnames] = chnb(channame, varargin)
- % chnb() - return channel number corresponding to channel names in an EEG
- % structure
- %
- % Usage:
- % >> [nb] = chnb(channameornb);
- % >> [nb,names] = chnb(channameornb,...);
- % >> [nb,names,strnames] = chnb(channameornb,...);
- % >> [nb] = chnb(channameornb, labels);
- %
- % Input:
- % channameornb - If a string or cell array of strings, it is assumed to
- % be (part of) the name of channels to search. Either a
- % string with space separated channel names, or a cell
- % array of strings.
- % Note that regular expressions can be used to match
- % several channels. See regexp.
- % If only one channame pattern is given and the string
- % 'inv' is attached to it, the channels NOT matching the
- % pattern are returned.
- % labels - Channel names as found in {EEG.chanlocs.labels}.
- %
- % Output:
- % nb - Channel numbers in labels, or in the EEG structure
- % found in the caller workspace (i.e. where the function
- % is called from) or in the base workspace, if no EEG
- % structure exists in the caller workspace.
- % names - Channel names, cell array of strings.
- % strnames - Channel names, one line character array.
- narginchk(1, 2);
- if nargin == 2
- labels = varargin{1};
- else
- try
- EEG = evalin('caller','EEG');
- catch
- try
- EEG = evalin('base','EEG');
- catch
- error('Could not find EEG structure');
- end
- end
- if not(isfield(EEG,'chanlocs'))
- error('No channel list found');
- end
- EEG = EEG(1);
- labels = {EEG.chanlocs.labels};
- end
- if iscell(channame) || ischar(channame)
- if ischar(channame) || iscellstr(channame)
- if iscellstr(channame) && numel(channame) == 1 && isempty(channame{1})
- channame = '';
- end
- tmp = regexp(channame,'(\S*) ?','tokens');
- channame = {};
- for i = 1:numel(tmp)
- if iscellstr(tmp{i}{1})
- channame{i} = tmp{i}{1}{1};
- else
- channame{i} = tmp{i}{1};
- end
- end
- if isempty(channame)
- nb = [];
- return
- end
- end
- if numel(channame) == 1 && not(isempty(strmatch('inv',channame{1})))
- cmd = 'exactinv';
- channame{1} = strrep(channame{1},'inv','');
- else
- channame{1} = channame{1};
- cmd = 'exact';
- end
- nb = regexpcell(labels,channame,[cmd 'ignorecase']);
- elseif isnumeric(channame)
- nb = channame;
- if nb > numel(labels)
- nb = [];
- end
- end
- channame = labels(nb);
- strnames = sprintf('%s ',channame{:});
- if not(isempty(strnames))
- strnames(end) = [];
- end
|