|
@@ -1,306 +0,0 @@
|
|
|
-%% I_SS_prep_data_for_analysis_20170922
|
|
|
-
|
|
|
-% 180124 | now also exclude ART and EMG artifacts
|
|
|
-% 180327 | include OAs, deal wih dropped trials of subjects with missing onsets
|
|
|
-% | interpolate data to requested times vs. choosing shortest
|
|
|
-% duration (zero interpolation)
|
|
|
-
|
|
|
-% This script fixes issues with missing onsets in the following way:
|
|
|
-
|
|
|
-% IMPORTANT: For 2160, the first two trials were not available,
|
|
|
-% hence we have to add +2 to the index to identify the correct
|
|
|
-% behavioral trials that belong to the EEG data. For 2203 the
|
|
|
-% first trial is missing. The third and second trial should
|
|
|
-% also be removed, regardless of whether they are indicated to
|
|
|
-% be dropped due to automatic correction.
|
|
|
-
|
|
|
-%% initialize
|
|
|
-
|
|
|
-restoredefaultpath;
|
|
|
-clear all; close all; pack; clc;
|
|
|
-
|
|
|
-%% pathdef
|
|
|
-
|
|
|
-if ismac
|
|
|
- pn.study = '/Volumes/LNDG/Projects/StateSwitch/';
|
|
|
- pn.eeg_root = [pn.study, 'dynamic/data/eeg/task/A_preproc/SA_preproc_study/'];
|
|
|
- pn.EEG = [pn.eeg_root, 'B_data/C_EEG_FT/']; %mkdir(pn.EEG);
|
|
|
- pn.History = [pn.eeg_root, 'B_data/D_History/']; %mkdir(pn.History);
|
|
|
- % add ConMemEEG tools
|
|
|
- pn.MWBtools = [pn.eeg_root, 'T_tools/fnct_MWB/']; addpath(genpath(pn.MWBtools));
|
|
|
- pn.THGtools = [pn.eeg_root, 'T_tools/fnct_THG/']; addpath(genpath(pn.THGtools));
|
|
|
- pn.commontools = [pn.eeg_root, 'T_tools/fnct_common/']; addpath(genpath(pn.commontools));
|
|
|
- pn.fnct_JQK = [pn.eeg_root, 'T_tools/fnct_JQK/']; addpath(genpath(pn.fnct_JQK));
|
|
|
- pn.FT = [pn.eeg_root, 'T_tools/fieldtrip-20170904/']; addpath(pn.FT); ft_defaults;
|
|
|
- pn.helper = [pn.eeg_root, 'A_scripts/helper/']; addpath(pn.helper);
|
|
|
-else
|
|
|
- pn.root = '/home/mpib/LNDG/StateSwitch/WIP_eeg/SA_preproc_study/';
|
|
|
- pn.EEG = [pn.root, 'B_data/C_EEG_FT/'];
|
|
|
- pn.History = [pn.root, 'B_data/D_History/'];
|
|
|
-end
|
|
|
-
|
|
|
-%% define Condition & IDs for preprocessing
|
|
|
-
|
|
|
-condEEG = 'dynamic';
|
|
|
-
|
|
|
-%% define IDs for segmentation
|
|
|
-
|
|
|
-% N = 47 YAs + 53 OAs;
|
|
|
-IDs = {'1117';'1118';'1120';'1124';'1126';'1131';'1132';'1135';'1136';'1138';...
|
|
|
- '1144';'1151';'1158';'1160';'1163';'1164';'1167';'1169';'1172';'1173';...
|
|
|
- '1178';'1182';'1215';'1216';'1219';'1221';'1223';'1227';'1228';'1233';...
|
|
|
- '1234';'1237';'1239';'1240';'1243';'1245';'1247';'1250';'1252';'1257';...
|
|
|
- '1261';'1265';'1266';'1268';'1270';'1276';'1281';...
|
|
|
- '2104';'2107';'2108';'2112';'2118';'2120';'2121';'2123';'2125';'2129';...
|
|
|
- '2130';'2131';'2132';'2133';'2134';'2135';'2139';'2140';'2145';'2147';...
|
|
|
- '2149';'2157';'2160';'2201';'2202';'2203';'2205';'2206';'2209';'2210';...
|
|
|
- '2211';'2213';'2214';'2215';'2216';'2217';'2219';'2222';'2224';'2226';...
|
|
|
- '2227';'2236';'2237';'2238';'2241';'2244';'2246';'2248';'2250';'2251';...
|
|
|
- '2252';'2258';'2261'};
|
|
|
-
|
|
|
-%% loop IDs
|
|
|
-
|
|
|
-setting.plot = 0; % plot imagesc of resulting timeseries
|
|
|
-
|
|
|
-% prior to loop create matrixes for overviews over artifact-free trials and total trial numbers
|
|
|
-overview_nartfree_trials = {};
|
|
|
-overview_trial_numbers = {};
|
|
|
-ID_unavailable = cell(length(IDs),4);
|
|
|
-for id = 1:length(IDs)
|
|
|
- for iRun = 1:4
|
|
|
-
|
|
|
-% if ~exist([pn.EEG, IDs{id}, '_r',num2str(iRun), '_', condEEG, '_EEG_Rlm_Fhl_rdSeg_Art.mat'])
|
|
|
-% display(['processing ID ' IDs{id}, ' Run: ', num2str(iRun)]);
|
|
|
-% else
|
|
|
-% display(['ID ' IDs{id}, ' Run: ', num2str(iRun), ' has already been processed.']);
|
|
|
-% continue;
|
|
|
-% end
|
|
|
-
|
|
|
- try
|
|
|
- %% load files
|
|
|
-
|
|
|
- % load data
|
|
|
- load([pn.EEG, IDs{id}, '_r',num2str(iRun), '_', condEEG, '_EEG_Rlm_Fhl_rdSeg'],'data_EEG');
|
|
|
- dataICA = load([pn.EEG, IDs{id}, '_', condEEG, '_EEG_Rlm_Fhl_Ica'],'data');
|
|
|
- data = data_EEG; clear data_EEG;
|
|
|
- data.elec = dataICA.data.elec;
|
|
|
- data.chanlocs = dataICA.data.chanlocs; clear dataICA;
|
|
|
- % load config
|
|
|
- load([pn.History, IDs{id}, '_r',num2str(iRun), '_', condEEG, '_config'],'config')
|
|
|
-
|
|
|
- %% cut data to requested time (necessary due to acquisition jitter)
|
|
|
- % Note that this does not affect the data, but we simply cut some
|
|
|
- % sample points from the ITI which is not of interest anyways.
|
|
|
-
|
|
|
- trig.eventDurInS = [1.5, 2, 1, 3, 2, 1.5]; % total time to extract is 11s
|
|
|
- trig.eventTriggers = {'S 17'; 'S 72'; 'S 20'; 'S 24'; 'S 64'};
|
|
|
-
|
|
|
- % 2160 has only 62 trials, i.e. the first two trials were
|
|
|
- % not recorded.
|
|
|
-
|
|
|
- cfg = [];
|
|
|
- cfg.toilim = [-1.5 9.5];
|
|
|
- data = ft_redefinetrial(cfg, data);
|
|
|
-
|
|
|
- %% define parameter
|
|
|
-
|
|
|
- % ICs to reject
|
|
|
- iclabels = config.ica1.iclabels.manual;
|
|
|
- %ics2reject = [iclabels.bli(:); iclabels.mov(:); iclabels.hrt(:); iclabels.ref(:)];
|
|
|
- ics2reject = [iclabels.bli(:); iclabels.mov(:); iclabels.hrt(:); iclabels.ref(:); iclabels.art(:); iclabels.emg(:)];
|
|
|
- clear iclabels
|
|
|
-
|
|
|
- % trials to remove
|
|
|
- trls2remove = config.ArtDect.trials;
|
|
|
-
|
|
|
- % channels to interpolate
|
|
|
- chns2interp = config.ArtDect.channels;
|
|
|
-
|
|
|
- %% for select IDs, interpolate channels prior to ICA
|
|
|
-
|
|
|
- if strcmp(IDs{id}, '2112')
|
|
|
- cfg = [];
|
|
|
- cfg.channel = {'all','-ECG','-A2'};
|
|
|
- dataSelect = ft_preprocessing(cfg,data);
|
|
|
- cfg = [];
|
|
|
- cfg.method = 'spline';
|
|
|
- if strcmp(IDs{id}, '2112')
|
|
|
- cfg.badchannel = {'Fz'; 'FCz'};
|
|
|
- end
|
|
|
- cfg.trials = 'all';
|
|
|
- cfg.lambda = 1e-5;
|
|
|
- cfg.order = 4;
|
|
|
- data = ft_channelrepair(cfg,data);
|
|
|
- clear cfg;
|
|
|
- end
|
|
|
-
|
|
|
- %% ICA (from weights)
|
|
|
-
|
|
|
- % ica config
|
|
|
- cfg.method = 'runica';
|
|
|
- cfg.channel = {'all','-ECG','-A2'};
|
|
|
- cfg.trials = 'all';
|
|
|
- cfg.numcomponent = 'all';
|
|
|
- cfg.demean = 'yes';
|
|
|
- cfg.runica.extended = 1;
|
|
|
-
|
|
|
- % ICA solution
|
|
|
- cfg.unmixing = config.ica1.unmixing;
|
|
|
- cfg.topolabel = config.ica1.topolabel;
|
|
|
-
|
|
|
- % components
|
|
|
- comp = ft_componentanalysis(cfg,data);
|
|
|
-
|
|
|
- % clear cfg
|
|
|
- clear cfg data
|
|
|
-
|
|
|
- %% remove components
|
|
|
-
|
|
|
- % cfg for rejecting components (reject: blinks, eye movements, ecg, ref)
|
|
|
- cfg.component = sortrows(ics2reject)';
|
|
|
- cfg.demean = 'yes';
|
|
|
-
|
|
|
- % reject components
|
|
|
- data = ft_rejectcomponent(cfg,comp);
|
|
|
-
|
|
|
- % clear cfg
|
|
|
- clear cfg comp ics2reject
|
|
|
-
|
|
|
- %% remove trials
|
|
|
-
|
|
|
- % IMPORTANT: For 2160, the first two trials were not available,
|
|
|
- % hence we have to add +2 to the index to identify the correct
|
|
|
- % behavioral trials that belong to the EEG data. For 2203 the
|
|
|
- % first trial is missing. The third and second trial should
|
|
|
- % also be removed, regardless of whether they are indicated to
|
|
|
- % be dropped due to automatic correction.
|
|
|
-
|
|
|
- if strcmp(IDs{id}, '2160') && iRun==1
|
|
|
- trls2remove=[trls2remove;1];
|
|
|
- elseif strcmp(IDs{id}, '2203') && iRun==1
|
|
|
- trls2remove=[trls2remove;1];
|
|
|
- end
|
|
|
-
|
|
|
- % define trials to keep
|
|
|
- trials = 1:length(data.trial);
|
|
|
- trials(trls2remove) = [];
|
|
|
-
|
|
|
- if strcmp(IDs{id}, '2160') && iRun==1
|
|
|
- trials=trials+2;
|
|
|
- data.time = cat(2,data.time{end},data.time{end},data.time);
|
|
|
- data.trial = cat(2,data.trial{end},data.trial{end},data.trial);
|
|
|
- elseif strcmp(IDs{id}, '2203') && iRun==1
|
|
|
- trials=trials+1;
|
|
|
- data.time = cat(2,data.time{end},data.time);
|
|
|
- data.trial = cat(2,data.trial{end},data.trial);
|
|
|
- end
|
|
|
-
|
|
|
- % config for deleting trials
|
|
|
- cfg.trials = trials;
|
|
|
-
|
|
|
- % remove trials
|
|
|
- data = ft_preprocessing(cfg,data);
|
|
|
- nartfree_trials = trials;
|
|
|
- overview_nartfree_trials{id,iRun} = nartfree_trials;
|
|
|
-
|
|
|
- config.nartfree_trials = nartfree_trials;
|
|
|
-
|
|
|
- % clear variables
|
|
|
- clear cfg trials trls2remove
|
|
|
-
|
|
|
- %% remove eye & reference channels (before interpolation)
|
|
|
-
|
|
|
- cfg.channel = {'all','-IOR','-LHEOG','-RHEOG','-A1'};
|
|
|
- cfg.demean = 'yes';
|
|
|
-
|
|
|
- % remove channels
|
|
|
- tmpdat = ft_preprocessing(cfg,data);
|
|
|
-
|
|
|
- % clear cfg
|
|
|
- clear cfg
|
|
|
-
|
|
|
- % interpolation cfg
|
|
|
- cfg.method = 'spline';
|
|
|
- cfg.badchannel = tmpdat.label(chns2interp);
|
|
|
- cfg.trials = 'all';
|
|
|
- cfg.lambda = 1e-5;
|
|
|
- cfg.order = 4;
|
|
|
- cfg.elec = config.elec;
|
|
|
-
|
|
|
- % interpolate
|
|
|
- tmpdat = ft_channelrepair(cfg,tmpdat);
|
|
|
-
|
|
|
- % clear cfg
|
|
|
- clear cfg chns2interp
|
|
|
-
|
|
|
- %% replace interpolated data
|
|
|
-
|
|
|
- for j = 1:length(data.trial)
|
|
|
-
|
|
|
- data.trial{j}(1:60,:) = tmpdat.trial{j};
|
|
|
-
|
|
|
- end; clear j
|
|
|
-
|
|
|
- % clear temporary data
|
|
|
- clear tmpdat
|
|
|
-
|
|
|
- %% keep channel x trial artifacts
|
|
|
-
|
|
|
- data.ArtDect.channels_x_trials = config.ArtDect.channels_x_trials;
|
|
|
-
|
|
|
- %% save data
|
|
|
- data_EEG = data; clear data;
|
|
|
- save([pn.EEG, IDs{id}, '_r',num2str(iRun), '_', condEEG, '_EEG_Rlm_Fhl_rdSeg_Art'],'data_EEG')
|
|
|
-
|
|
|
-% check data
|
|
|
-% data_EEG = THG_label_artefacts_20110916(data_EEG);
|
|
|
-% figure; imagesc(config.ArtDect.channels_x_trials)
|
|
|
-
|
|
|
- % plot resulting trials
|
|
|
-
|
|
|
- if setting.plot == 1
|
|
|
- h = figure;
|
|
|
- data = NaN(64,size(data_EEG.trial,1),5540);
|
|
|
- for indTrial = 1:size(data_EEG.trial,2)
|
|
|
- data(:,indTrial,1:size(data_EEG.trial{indTrial},2))= data_EEG.trial{indTrial};
|
|
|
- subplot(8,8,indTrial);
|
|
|
- imagesc(squeeze(data_EEG.trial{indTrial}));
|
|
|
- end; suptitle(['processing ID ' IDs{id}, ' Run: ', num2str(iRun)]);
|
|
|
- close(h);
|
|
|
- end
|
|
|
-
|
|
|
- %% create overview of percentage of excluded trials, update config.trl
|
|
|
-
|
|
|
- tmp_trialNumbers(1,1) = length(data_EEG.trial);
|
|
|
- tmp_trialNumbers(2,1) = 64; % maximum amount of trials
|
|
|
- tmp_trialNumbers(3,1) = (100-((tmp_trialNumbers(1,1)/tmp_trialNumbers(2,1))*100)); % percentage of excluded trials
|
|
|
- overview_trial_numbers{id, iRun} = tmp_trialNumbers;
|
|
|
- config.overview_trial_numbers = tmp_trialNumbers;
|
|
|
-
|
|
|
- %% update config.trl with trigger codes
|
|
|
-
|
|
|
- % add info whether trial is included in final set; 1 = trial containing no artifact
|
|
|
- config.trl(:,4) = 0;
|
|
|
- config.trl(nartfree_trials, 4) = 1;
|
|
|
- % add trial number
|
|
|
- config.trl(:,5) = 0;
|
|
|
- config.trl(nartfree_trials, 5) = nartfree_trials;
|
|
|
- % load marker file
|
|
|
- mrk = config.mrk;
|
|
|
- for i = 1:size(mrk,2)
|
|
|
- mrk_val{i,1} = mrk(1,i).value;
|
|
|
- end
|
|
|
- % add onset and offset triggers
|
|
|
- config.trl(:,6) = 17;
|
|
|
- config.trl(:,7) = 64;
|
|
|
- % save config
|
|
|
- save([pn.History, IDs{id}, '_r',num2str(iRun), '_', condEEG, '_config'],'config')
|
|
|
-
|
|
|
- catch ME
|
|
|
- warning('Error occured. Please check.');
|
|
|
- rethrow(ME)
|
|
|
- fprintf('\n ID not availble! Skip! \n')
|
|
|
- ID_unavailable{id,iRun} = (IDs{id});
|
|
|
- end % try...catch
|
|
|
- end % run
|
|
|
-end % id
|