function a3_ica(id, rootpath) if ismac % run if function is not pre-compiled id = '1'; % test for first subject currentFile = mfilename('fullpath'); [pathstr,~,~] = fileparts(currentFile); cd(fullfile(pathstr,'..', '..')) rootpath = pwd; end % inputs pn.eeg_BIDS = fullfile(rootpath, 'data', 'inputs', 'rawdata', 'eeg_BIDS'); pn.channel_locations = fullfile(rootpath, 'data', 'inputs', 'rawdata', 'channel_locations'); pn.events = fullfile(rootpath, 'data', 'inputs', 'rawdata', 'events'); pn.tools = fullfile(rootpath, 'tools'); % outputs pn.eeg_ft = fullfile(rootpath, 'data', 'outputs', 'eeg'); pn.history = fullfile(rootpath, 'data', 'outputs', 'history'); if ismac % run if function is not pre-compiled addpath(fullfile(pn.tools, 'fieldtrip')); ft_defaults; addpath(fullfile(pn.tools, 'helpers')); end %% define IDs for visual screening % N = 33 IDs = tdfread(fullfile(pn.eeg_BIDS, 'participants.tsv')); IDs = cellstr(IDs.participant_id); id = str2num(id); display(['processing ' num2str(IDs{id})]); if ~exist(fullfile(pn.eeg_ft, [IDs{id}, '_task-xxxx_eeg_ica.mat']),'file') %% load raw data & exclude parts containing artifacts % load config config = []; load(fullfile(pn.history, [IDs{id}, '_task-xxxx_config.mat']),'config'); config_tmp.(['trl']) = config.trl_ica1; config_tmp.(['visual_inspection']) = config.visual_inspection; % define segment(s) to be read by fieldtrip cfg.trl = config.trl_ica1; % load data load(fullfile(pn.eeg_ft, [IDs{id}, '_task-xxxx_eeg_raw.mat']),'data_eeg'); % remove implicit reference channels cfg_preproc = []; cfg_preproc.channel = {'all', '-REF', '-A2'}; data_eeg = ft_preprocessing(cfg_preproc, data_eeg); % adjust final length cfg.trl(end,2) = size(data_eeg.trial{1},2); % "segment" data data = cm_segmentation_of_continuous_data_fieldtrip_20150825(data_eeg,cfg); % clear cfg structure clear cfg %% segmentation for ICA % define settings cfg.length = 2; cfg.n = 5000; % keep all possible trials cfg.type = 'rnd'; % select trials randomly if > 1500 trials available cfg.seed = 20170915 + str2num(IDs{id}); % arbitrary segmentation - segments a 2 sec % NOTE original segments will be overwritten data = cm_arbitrary_segmentation_fieldtrip_20151002(data,cfg); %% ICA % date dt = date; % ica config cfg.method = 'runica'; cfg.channel = {'all'}; % additional channels should be excluded already... cfg.trials = 'all'; cfg.numcomponent = 'all'; cfg.demean = 'no'; cfg.runica.extended = 1; cfg.runica.logfile = fullfile(pn.history, ['log_' IDs{id} '_ica1_' dt '.txt']); % run ICA icadat = ft_componentanalysis(cfg,data); %% automatic ICA labeling [iclabels] = cm_automatic_IC_detection_20170919(data,icadat); %% save data for ICA labeling config.trl = config_tmp.trl; config.visual_inspection = config_tmp.visual_inspection; % - include ICA solution in data data.topo = icadat.topo; data.unmixing = icadat.unmixing; data.topolabel = icadat.topolabel; data.cfg = icadat.cfg; % - include ICA solution in config config.ica1.date = dt; config.ica1.topo = icadat.topo; config.ica1.unmixing = icadat.unmixing; config.ica1.topolabel = icadat.topolabel; config.ica1.cfg = icadat.cfg; config.ica1.iclabels.auto = iclabels; % fieldtrip format electrode information chanlocs_besa = readtable(fullfile(pn.channel_locations, 'chanlocs_besa.txt')); elec.pnt = [chanlocs_besa.Var2, chanlocs_besa.Var3, chanlocs_besa.Var4]; elec.label = chanlocs_besa.Var1; data.elec = elec; % EEGLAB format electrode information chanlocs_ced = readtable(fullfile(pn.channel_locations, 'chanlocs_ced.txt')); chanlocs_ced = table2struct(chanlocs_ced); chanlocs_ced = rmfield(chanlocs_ced, {'Number', 'type', 'Var12'}); [~, loc] = ismember(data.label, {chanlocs_ced.labels}); data.chanlocs(1,loc) = chanlocs_ced(loc,1); % - include channel information in config config.elec = data.elec; config.chanlocs = data.chanlocs; % keep ICA labels data.iclabels = iclabels; % save data save(fullfile(pn.eeg_ft, [IDs{id}, '_task-xxxx_eeg_ica.mat']),'data'); % save config config.preproc_version = '20170915'; save(fullfile(pn.history, [IDs{id}, '_task-xxxx_config.mat']),'config'); end % file available