123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- function a3_ica(id, rootpath)
- if ismac % run if function is not pre-compiled
- id = '5'; % test for example 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 M2 (collinear with M1 due to avg. mastoid REF: mean(M1,M2)=0)
- cfg_preproc = [];
- cfg_preproc.channel = {'all', '-M2'};
- 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
|