function artefact = spm_cfg_eeg_artefact % Configuration file for M/EEG artefact detection %__________________________________________________________________________ % Copyright (C) 2008-2016 Wellcome Trust Centre for Neuroimaging % Vladimir Litvak % $Id: spm_cfg_eeg_artefact.m 7085 2017-06-01 10:42:01Z vladimir $ %-------------------------------------------------------------------------- % D %-------------------------------------------------------------------------- D = cfg_files; D.tag = 'D'; D.name = 'File Name'; D.filter = 'mat'; D.num = [1 1]; D.help = {'Select the M/EEG mat file.'}; %-------------------------------------------------------------------------- % mode %-------------------------------------------------------------------------- mode = cfg_menu; mode.tag = 'mode'; mode.name = 'Mode'; mode.labels = {'Reject', 'Mark'}; mode.val = {'reject'}; mode.values = {'reject', 'mark'}; mode.help = {'Action mode reject - to set trials and channels as bad',... 'mark - just create artefact events, set channels as bad if mostly artefactual.'}; %-------------------------------------------------------------------------- % badchanthresh %-------------------------------------------------------------------------- badchanthresh = cfg_entry; badchanthresh.tag = 'badchanthresh'; badchanthresh.name = 'Bad channel threshold'; badchanthresh.strtype = 'r'; badchanthresh.num = [1 1]; badchanthresh.val = {0.2}; badchanthresh.help = {'Fraction of trials with artefacts ', ... 'above which an M/EEG channel is declared as bad.'}; %-------------------------------------------------------------------------- % methods %-------------------------------------------------------------------------- artefact_funs = spm_select('List',spm('dir'),'^spm_eeg_artefact_.*\.m$'); artefact_funs = cellstr(artefact_funs); fun = cfg_choice; fun.tag = 'fun'; fun.name = 'Detection algorithm'; fun.values = cell(1,numel(artefact_funs)); for i = 1:numel(artefact_funs) fun.values{i} = feval(spm_file(artefact_funs{i},'basename')); end fun.help = {''}; methods = cfg_branch; methods.tag = 'methods'; methods.name = 'Method'; methods.val = {spm_cfg_eeg_channel_selector, fun}; methods.help = {''}; %-------------------------------------------------------------------------- % methodsrep %-------------------------------------------------------------------------- methodsrep = cfg_repeat; methodsrep.tag = 'methodsrep'; methodsrep.name = 'How to look for artefacts'; methodsrep.help = {'Choose channels and methods for artefact detection.'}; methodsrep.values = {methods}; methodsrep.num = [1 Inf]; %-------------------------------------------------------------------------- % prefix %-------------------------------------------------------------------------- prefix = cfg_entry; prefix.tag = 'prefix'; prefix.name = 'Filename Prefix'; prefix.help = {'Specify the string to be prepended to the filenames of the output dataset. Default prefix is ''a''.'}; prefix.strtype = 's'; prefix.num = [1 Inf]; prefix.val = {'a'}; %-------------------------------------------------------------------------- % append %-------------------------------------------------------------------------- append = cfg_menu; append.tag = 'append'; append.name = 'Append'; append.labels = {'yes', 'no'}; append.val = {true}; append.values = {true, false}; append.help = {'Append new artefacts to already marked or overwrite.'}; %-------------------------------------------------------------------------- % M/EEG Artefact detection %-------------------------------------------------------------------------- artefact = cfg_exbranch; artefact.tag = 'artefact'; artefact.name = 'Artefact detection'; artefact.val = {D, mode, badchanthresh, append, methodsrep, prefix}; artefact.help = {'Detect artefacts in epoched M/EEG data.'}; artefact.prog = @eeg_artefact; artefact.vout = @vout_eeg_artefact; artefact.modality = {'EEG'}; %========================================================================== % function out = eeg_artefact(job) %========================================================================== function out = eeg_artefact(job) % construct the S struct S.D = job.D{1}; S.mode = job.mode; S.badchanthresh = job.badchanthresh; S.prefix = job.prefix; S.append = job.append; for i = 1:numel(job.methods) S.methods(i).channels = spm_cfg_eeg_channel_selector(job.methods(i).channels); fun = fieldnames(job.methods(i).fun); fun = fun{1}; S.methods(i).fun = fun; S.methods(i).settings = job.methods(i).fun.(fun); end out.D = spm_eeg_artefact(S); out.Dfname = {fullfile(out.D.path, out.D.fname)}; %========================================================================== % function dep = vout_eeg_artefact(job) %========================================================================== function dep = vout_eeg_artefact(job) % Output is always in field "D", no matter how job is structured dep = cfg_dep; dep.sname = 'Artefact detection'; % reference field "D" from output dep.src_output = substruct('.','D'); % this can be entered into any evaluated input dep.tgt_spec = cfg_findspec({{'strtype','e'}}); dep(2) = cfg_dep; dep(2).sname = 'Artefact-detected Datafile'; % reference field "Dfname" from output dep(2).src_output = substruct('.','Dfname'); % this can be entered into any file selector dep(2).tgt_spec = cfg_findspec({{'filter','mat'}});