% POP_STATPARAMS - helper function for pop_erspparams, pop_erpparams, and
%                    pop_specparams.
%
% Usage:
%   >> struct = pop_statparams(struct, 'default');
%   >> struct = pop_statparams(struct, 'key', 'val', ...);
%
% Inputs:
%   struct        - parameter structure. When called with the 'default'
%                   option only, the function creates all the fields in
%                   the structure and populate these fields with default
%                   values.
%
% Statistics options:
%  'groupstats'   - ['on'|'off'] Compute statistics across subject
%                   groups {default: 'off'}
%  'condstats'    - ['on'|'off'] Compute statistics across data
%                   conditions {default: 'off'}
%  'statistics'   - ['param'|'perm'|'bootstrap'] Type of statistics to compute
%                   'param' for parametric (t-test/anova); 'perm' for
%                   permutation-based and 'bootstrap' for bootstrap
%                   {default: 'param'}
%  'singletrials' - ['on'|'off'] use single trials to compute statistics.
%                   This requires the measure to be computed with the
%                   'savetrials', 'on' option.
%  'mode'         - ['eeglab'|'fieldtrip'] use either EEGLAB or Fieldtrip
%                   statistics.
%  'effect'       - ['main'|'marginal'] compute main effect or marginal
%                   effects.
%
% EEGLAB statistics:
%  'method'      - ['param'|'perm'|'bootstrap'] statistical 
%                  method. See help statcond for more information.
%  'naccu'       - [integer] Number of surrogate data averages to use in
%                  surrogate statistics. For instance, if p<0.01,
%                  use naccu>200. For p<0.001, naccu>2000. If a 'threshold'
%                  (not NaN) is set below and 'naccu' is too low, it will
%                  be automatically increased. (This keyword is currently
%                  only modifiable from the command line, not from the gui).
%  'alpha'       - [NaN|alpha] Significance threshold (0<alpha<<1). Value
%                  NaN will plot p-values for each time and/or frequency
%                  on a different axis. If alpha is used, significant time
%                  and/or frequency regions will be indicated either on
%                  a separate axis or (whenever possible) along with the
%                  data {default: NaN}
%  'mcorrect'    - ['fdr'|'holms'|'bonferoni'|'none'] correction for multiple
%                  comparisons. 'fdr' uses false discovery rate. See the fdr 
%                  function for more information. Default is
%                  none'.
%
% Fieldtrip statistics:
%  'fieldtripmethod' - ['analytic'|'montecarlo'] statistical 
%                  method. See help statcond for more information.
%  'fieldtripnaccu' - [integer] Number of surrogate data averages to use in
%                  surrogate statistics.
%  'fieldtripalpha' - [alpha] Significance threshold (0<alpha<<1). This
%                  parameter is mandatory. Default is 0.05.
%  'fieldtripmcorrect' - ['cluster'|'max'|'fdr'|'holms'|'bonferoni'|'none'] 
%                  correction for multiple comparisons. See help 
%                  ft_statistics_montecarlo for more information.
%  'fieldtripclusterparam - [string] parameters for clustering. See help 
%                  ft_statistics_montecarlo for more information. 
%  'fieldtripchannelneighbor - [struct] channel neighbor structure.
%  'fieldtripchannelneighborparam' - [string] parameters for channel 
%                  neighbor. See help ft_statistics_montecarlo for more 
%                  information.
%
% Legacy parameters:
%  'threshold'   - now 'alpha'
%  'statistics'  - now 'method'
%
% Authors: Arnaud Delorme, CERCO, CNRS, 2010-

% Copyright (C) Arnaud Delorme, 2010
%
% This file is part of EEGLAB, see http://www.eeglab.org
% for the documentation and details.
%
% Redistribution and use in source and binary forms, with or without
% modification, are permitted provided that the following conditions are met:
%
% 1. Redistributions of source code must retain the above copyright notice,
% this list of conditions and the following disclaimer.
%
% 2. Redistributions in binary form must reproduce the above copyright notice,
% this list of conditions and the following disclaimer in the documentation
% and/or other materials provided with the distribution.
%
% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
% THE POSSIBILITY OF SUCH DAMAGE.

function [STUDY, com] = pop_statparams(STUDY, varargin);

com = '';
if isfield(STUDY, 'etc')
    if ~isfield(STUDY.etc, 'statistics') 
        STUDY.etc.statistics = default_stats([]);
    else                                 
        STUDY.etc.statistics = default_stats(STUDY.etc.statistics);
    end
    if length(varargin) == 1 && strcmpi(varargin{1}, 'default')
        return;
    end
end

if isempty(varargin) && ~isempty(STUDY)
    if ~exist('ft_freqstatistics'), fieldtripInstalled = false; else fieldtripInstalled = true; end
    opt.enablesingletrials = 'on';
    
    % encode parameters
    % -----------------
    paramstruct         = STUDY.etc.statistics;
    eeglabStatvalues    = { 'param' 'perm' 'bootstrap' };
    fieldtripStatvalues = { 'analytic' 'montecarlo' };
    mCorrectList        = { 'none' 'bonferoni' 'holms' 'fdr' 'max' 'cluster' };
    marginal   = fastif(strcmpi(paramstruct.effect, 'main'), 0, 1);
    condstats   = fastif(strcmpi(paramstruct.condstats, 'on'), 1, 0);
    groupstats  = fastif(strcmpi(paramstruct.groupstats,'on'), 1, 0);
    statmode    = fastif(strcmpi(paramstruct.singletrials,'on'), 1, 0);
    eeglabThresh    = fastif(isnan(paramstruct.eeglab.alpha),'exact', num2str(paramstruct.eeglab.alpha));
    fieldtripThresh = fastif(isnan(paramstruct.fieldtrip.alpha),'exact', num2str(paramstruct.fieldtrip.alpha));
    eeglabStat      = strmatch(paramstruct.eeglab.method, eeglabStatvalues);
    fieldtripStat   = strmatch(paramstruct.fieldtrip.method, fieldtripStatvalues);
    if isempty(eeglabStat)   , error('Unknown statistical method for EEGLAB'); end
    if isempty(fieldtripStat), error('Unknown statistical method for Fieldtrip'); end
    eeglabRand      = fastif(isempty(paramstruct.eeglab.naccu), 'auto', num2str(paramstruct.eeglab.naccu));
    fieldtripRand   = fastif(isempty(paramstruct.fieldtrip.naccu), 'auto', num2str(paramstruct.fieldtrip.naccu));
    eeglabMcorrect    = strmatch(paramstruct.eeglab.mcorrect, mCorrectList);
    fieldtripMcorrect = strmatch(paramstruct.fieldtrip.mcorrect, mCorrectList);
    fieldtripClust    = paramstruct.fieldtrip.clusterparam;
    fieldtripChan     = paramstruct.fieldtrip.channelneighborparam;
    combootstrap =  [ 'warndlg2( strvcat(''Bootstrap is selected. Bootstrap is provided for legacy reasons.'',' ...
        '''It overestimates significance by a factor of 2 for paired data '',' ...
        '''(unpaired data is working properly). It is advised to use'',' ...
        '''permutation instead of bootstrap if you have paired data.'') );' ];
    cb_bootstrap     = [ 'if get(gcbo, ''value'') == 3,' combootstrap ' end;' ];
    cb_help_neighbor = 'pophelp(''ft_prepare_neighbours'');';
    cb_help_cluster  = 'pophelp(''ft_statistics_montecarlo'');';
    cb_textSyntax    = 'try, eval( [ ''{'' get(gcbo, ''string'') ''};'' ]); catch, warndlg2(''Syntax error''); end;';
    
    % callback for randomization selection
    % ------------------------------------
    cbSelectRandEeglab   = [ 'set(findobj(gcbf, ''tag'', ''eeglabnaccu''),    ''enable'', ''on'');' ...
        'set(findobj(gcbf, ''tag'', ''eeglabnaccutext''),''enable'', ''on'');' ];
    cbUnselectRandEeglab = [ 'set(findobj(gcbf, ''tag'', ''eeglabnaccu''),    ''enable'', ''off'');' ...
        'set(findobj(gcbf, ''tag'', ''eeglabnaccutext''),''enable'', ''off'');' ];
    cbSelectRandFieldtrip  = [ 'set(findobj(gcbf, ''tag'', ''fieldtripnaccu''),    ''enable'', ''on'');' ...
        'set(findobj(gcbf, ''tag'', ''fieldtripnaccutext''),''enable'', ''on'');' ];
    cbUnselectRandFieldtrip = [ 'set(findobj(gcbf, ''tag'', ''fieldtripnaccu''),    ''enable'', ''off'');' ...
        'set(findobj(gcbf, ''tag'', ''fieldtripnaccutext''),''enable'', ''off'');' ];
    cbSetFullMcorrectFieldtrip = 'set(findobj(gcbf, ''tag'', ''fieldtripmcorrect''), ''string'', ''Do not correct for multiple comparisons|Use Bonferoni correction|Use Holms correction|Use FDR correction|Use max correction|Use cluster correction (CC)'');';
    cbUnsetFullMcorrectFieldtrip = 'set(findobj(gcbf, ''tag'', ''fieldtripmcorrect''), ''value'', min(4, get(findobj(gcbf, ''tag'', ''fieldtripmcorrect''), ''value'')), ''string'', ''Do not correct for multiple comparisons|Use Bonferoni correction|Use Holms correction|Use FDR correction'');';
    cb_eeglab_statlist    = [ 'if get(findobj(gcbf, ''tag'', ''stateeglab'' ),''value'') > 1,' cbSelectRandEeglab ',else,' cbUnselectRandEeglab ',end;' ];
    cb_fieldtrip_statlist = [ 'if get(findobj(gcbf, ''tag'', ''statfieldtrip'' ),''value'') > 1,' cbSelectRandFieldtrip cbSetFullMcorrectFieldtrip ',else,' cbUnselectRandFieldtrip cbUnsetFullMcorrectFieldtrip ',end;' ];
    
    % callback for activating clusters inputs
    % ---------------------------------------
    cb_select_cluster   = [ 'set(findobj(gcbf, ''tag'', ''clustertext1''),''enable'', ''on'');' ...
        'set(findobj(gcbf, ''tag'', ''clustertext2''),''enable'', ''on'');' ...
        'set(findobj(gcbf, ''tag'', ''clusterhelp1''),''enable'', ''on'');' ...
        'set(findobj(gcbf, ''tag'', ''clusterhelp2''),''enable'', ''on'');' ...
        'set(findobj(gcbf, ''tag'', ''clusterchan'' ),''enable'', ''on'');' ...
        'set(findobj(gcbf, ''tag'', ''clusterstat'' ),''enable'', ''on'');' ];
    cb_unselect_cluster = [ 'set(findobj(gcbf, ''tag'', ''clustertext1''),''enable'', ''off'');' ...
        'set(findobj(gcbf, ''tag'', ''clustertext2''),''enable'', ''off'');' ...
        'set(findobj(gcbf, ''tag'', ''clusterhelp1''),''enable'', ''off'');' ...
        'set(findobj(gcbf, ''tag'', ''clusterhelp2''),''enable'', ''off'');' ...
        'set(findobj(gcbf, ''tag'', ''clusterchan'' ),''enable'', ''off'');' ...
        'set(findobj(gcbf, ''tag'', ''clusterstat'' ),''enable'', ''off'');' ];
    cb_fieldtrip_mcorrect = [ cb_fieldtrip_statlist 'if get(findobj(gcbf, ''tag'', ''fieldtripmcorrect'' ),''value'') == 6,' cb_select_cluster ',else,' cb_unselect_cluster ',end;' cb_fieldtrip_statlist]; % cb_fieldtrip_statlist repeated on purpose
    
    % callback for activating eeglab/fieldtrip
    % ----------------------------------------
    enable_eeglab = [  'set(findobj(gcbf, ''userdata'', ''eeglab'')   ,''enable'', ''on'');' ...
                       'set(findobj(gcbf, ''userdata'', ''fieldtrip''),''enable'', ''off'');' ...
                       'set(findobj(gcbf, ''tag'', ''but_eeglab'')   ,''value'', 1);' ...
                       'set(findobj(gcbf, ''tag'', ''but_fieldtrip''),''value'', 0);' cb_eeglab_statlist ];
    
    enable_fieldtrip=[ 'if get(findobj(gcbf, ''tag'', ''condstats''), ''value'') && get(findobj(gcbf, ''tag'', ''groupstats''), ''value''),' ...
        enable_eeglab ...
        'warndlg2(strvcat(''Switching to EEGLAB statistics since'',''Fieldtrip cannot perform 2-way statistics''));' ...
        'else,' ...
        '  set(findobj(gcbf, ''userdata'', ''eeglab'')   ,''enable'', ''off'');' ...
        '  set(findobj(gcbf, ''userdata'', ''fieldtrip''),''enable'', ''on'');' ...
        '  set(findobj(gcbf, ''tag'', ''but_fieldtrip''),''value'', 1);' ...
        '  set(findobj(gcbf, ''tag'', ''but_eeglab'')   ,''value'', 0);' cb_fieldtrip_mcorrect ...
        'end;'];
    
    cb_select_fieldtrip = [ 'if get(findobj(gcbf, ''tag'', ''but_fieldtrip''),''value''),' enable_fieldtrip ',else,' enable_eeglab    ',end;' ];
    cb_select_eeglab    = [ 'if get(findobj(gcbf, ''tag'', ''but_eeglab''),''value''),,'   enable_eeglab    ',else,' enable_fieldtrip ',end;' ];
    
    if strcmpi(paramstruct.mode, 'eeglab'), evalstr = enable_eeglab;
    else                                    evalstr = enable_fieldtrip;
    end
    inds = findstr('gcbf', evalstr);
    evalstr(inds+2) = [];
    
    % special case if Fieldtrip is not installed
    if ~fieldtripInstalled
        strFieldtrip = 'Use Fieldtrip statistics (to use install "Fieldtrip-lite" using File > Manage EEGLAB extensions)';
        fieldtripEnable = 'off';
        cb_select_eeglab = 'set(findobj(gcbf, ''tag'', ''but_eeglab''),''value'', 1)';
    else
        strFieldtrip = 'Use Fieldtrip statistics';
        fieldtripEnable = 'on';
    end
    
    opt.uilist = { ...
        {'style' 'text'        'string' 'General statistical parameters' 'fontweight' 'bold' } ...
        {} {'style' 'checkbox' 'string' 'Compute 1st independent variable statistics if any' 'value' condstats  'callback' cb_select_fieldtrip 'tag' 'condstats' } ...
        {} {'style' 'checkbox' 'string' 'Compute 2nd independent variable statistics if any' 'value' groupstats 'callback' cb_select_fieldtrip 'tag' 'groupstats' } ...
        {} {'style' 'checkbox' 'string' 'Plot marginal statistics (unckeck to plot main effect)' 'value' marginal  'tag' 'marginal' } ...
        {} {'style' 'checkbox' 'string' 'Use single trials for statistics (not recommended if more than 1 subject in the study)' 'value' statmode 'tag' 'singletrials' 'enable' opt.enablesingletrials } ...
        {} ...
        {'style' 'checkbox'     'string' 'Use EEGLAB statistics' 'fontweight' 'bold' 'tag' 'but_eeglab' 'callback' cb_select_eeglab } ...
        {} {'style' 'popupmenu' 'string' { 'Use parametric statistics' 'Use permutation statistics' 'Use bootstrap statistics' } 'tag' 'stateeglab' 'value' eeglabStat 'listboxtop' eeglabStat 'callback' [ cb_eeglab_statlist cb_bootstrap ] 'userdata' 'eeglab' } ...
        {'style' 'text'         'string' 'Statistical threshold (p-value)' 'userdata' 'eeglab'} ...
        {'style' 'edit'         'string' eeglabThresh 'tag' 'eeglabalpha' 'userdata' 'eeglab' } ...
        {} {'style' 'popupmenu' 'string' { 'Do not correct for multiple comparisons' 'Use Bonferoni correction' 'Use Holms correction' 'Use FDR correction' } 'value' eeglabMcorrect 'listboxtop' eeglabMcorrect 'tag' 'eeglabmcorrect' 'userdata' 'eeglab'  } ...
        {'style' 'text' 'string' '   Randomization (n)' 'userdata' 'eeglab' 'tag' 'eeglabnaccutext' } ...
        {'style' 'edit' 'string' eeglabRand          'userdata' 'eeglab' 'tag' 'eeglabnaccu' } ...
        {} ...
        {'style' 'checkbox'     'string' strFieldtrip 'enable' fieldtripEnable 'fontweight' 'bold' 'tag' 'but_fieldtrip' 'callback' cb_select_fieldtrip } ...
        {} {'style' 'popupmenu' 'string' { 'Use analytic/parametric statistics' 'Use montecarlo/permutation statistics' } 'tag' 'statfieldtrip' 'value' fieldtripStat 'listboxtop' fieldtripStat 'callback' cb_fieldtrip_mcorrect 'userdata' 'fieldtrip' } ...
        {'style' 'text'        'string' 'Statistical threshold (p-value)' 'userdata' 'fieldtrip' } ...
        {'style' 'edit'        'string' fieldtripThresh 'tag' 'fieldtripalpha' 'userdata' 'fieldtrip' } ...
        {} {'style' 'popupmenu' 'string' { 'Do not correct for multiple comparisons' 'Use Bonferoni correction' 'Use Holms correction' 'Use FDR correction' 'Use max correction' 'Use cluster correction (CC)' } 'tag' 'fieldtripmcorrect' 'value' fieldtripMcorrect 'listboxtop' fieldtripMcorrect 'callback' cb_fieldtrip_mcorrect 'userdata' 'fieldtrip' } ...
        {'style' 'text' 'string' '   Randomization (n)' 'userdata' 'fieldtrip' 'tag' 'fieldtripnaccutext' } ...
        {'style' 'edit' 'string' fieldtripRand       'userdata' 'fieldtrip' 'tag' 'fieldtripnaccu' } ...
        {} {'style' 'text' 'string' 'CC channel neighbor parameters'       'userdata' 'fieldtrip' 'tag' 'clustertext1' } ...
        { 'style' 'edit' 'string' fieldtripChan           'userdata' 'fieldtrip' 'tag' 'clusterchan' 'callback' cb_textSyntax } ...
        { 'style' 'pushbutton' 'string' 'help' 'callback' cb_help_neighbor 'userdata' 'fieldtrip' 'tag' 'clusterhelp1' } ...
        {} {'style' 'text' 'string' 'CC clustering parameters'             'userdata' 'fieldtrip' 'tag' 'clustertext2' }  ...
        { 'style' 'edit' 'string' fieldtripClust        'userdata' 'fieldtrip' 'tag' 'clusterstat' 'callback' cb_textSyntax } ...
        { 'style' 'pushbutton' 'string' 'help' 'callback' cb_help_cluster  'userdata' 'fieldtrip' 'tag' 'clusterhelp2' } ...
        };
    
    if eeglabStat == 3,
        eval(combootstrap);
    end
    
    cbline = [0.07 1.1];
    otherline = [ 0.7 0.6 .5];
    eeglabline = [ 0.7 0.6 .5];
    opt.geometry = { [1] cbline cbline cbline cbline [1] [1] [0.07 0.51 0.34 0.13] [0.07 0.6 0.25 0.13] ...
        [1] [1] [0.07 0.51 0.34 0.13] [0.07 0.6 0.25 0.13] [0.13 0.4 0.4 0.1] [0.13 0.4 0.4 0.1]  };
    
    [out_param, userdat, tmp, res] = inputgui( 'geometry' , opt.geometry, 'uilist', opt.uilist, ...
                                            'title', 'Set statistical parameters -- pop_statparams()','eval', evalstr);
    if isempty(res), return; end
    
    % decode parameters
    % ----------------
    if res.marginal,    res.effect       = 'marginal'; else res.effect = 'main';  end
    if res.groupstats,   res.groupstats   = 'on';  else res.groupstats = 'off';  end
    if res.condstats ,   res.condstats    = 'on';  else res.condstats  = 'off';  end
    if res.singletrials, res.singletrials = 'on';  else res.singletrials = 'off';  end
    res.eeglabalpha    = str2num(res.eeglabalpha);
    res.fieldtripalpha = str2num(res.fieldtripalpha);
    if isempty(res.eeglabalpha)   ,res.eeglabalpha = NaN;    end
    if isempty(res.fieldtripalpha),res.fieldtripalpha = NaN; end
    res.stateeglab         = eeglabStatvalues{res.stateeglab};
    res.statfieldtrip      = fieldtripStatvalues{res.statfieldtrip};
    res.eeglabmcorrect     = mCorrectList{res.eeglabmcorrect};
    res.fieldtripmcorrect  = mCorrectList{res.fieldtripmcorrect};
    res.mode               = fastif(res.but_eeglab, 'eeglab', 'fieldtrip');
    res.eeglabnaccu        = str2num(res.eeglabnaccu);
    if ~ischar(res.fieldtripnaccu) || ~strcmpi(res.fieldtripnaccu, 'all')
        res.fieldtripnaccu     = str2num(res.fieldtripnaccu);
    end
    
    % build command call
    % ------------------
    options = {};
    if strcmp(res.stateeglab, 'param' ) && exist('fcdf') ~= 2
        fprintf(['statcond(): EEGLAB parametric testing requires fcdf() \n' ...
            '                 from the Matlab Statstical Toolbox. Running\n' ...
            '                 nonparametric permutation tests instead.\n']);
        res.stateeglab = 'perm';
    end
    if ~strcmpi( res.effect,       paramstruct.effect),        options = { options{:} 'effect' res.effect }; end
    if ~strcmpi( res.groupstats,   paramstruct.groupstats),    options = { options{:} 'groupstats' res.groupstats }; end
    if ~strcmpi( res.condstats ,   paramstruct.condstats ),    options = { options{:} 'condstats'  res.condstats  }; end
    if ~strcmpi( res.singletrials, paramstruct.singletrials ), options = { options{:} 'singletrials'  res.singletrials }; end
    if ~strcmpi( res.mode              , paramstruct.mode),                options = { options{:} 'mode' res.mode }; end % statistics
    if ~isequal( res.eeglabnaccu       , paramstruct.eeglab.naccu),        options = { options{:} 'naccu'    res.eeglabnaccu }; end
    if ~strcmpi( res.stateeglab        , paramstruct.eeglab.method),       options = { options{:} 'method' res.stateeglab }; end % statistics
    if ~strcmpi( res.eeglabmcorrect    , paramstruct.eeglab.mcorrect),     options = { options{:} 'mcorrect' res.eeglabmcorrect }; end
    if ~isequal( res.fieldtripnaccu    , paramstruct.fieldtrip.naccu),     options = { options{:} 'fieldtripnaccu' res.fieldtripnaccu }; end
    if ~strcmpi( res.statfieldtrip     , paramstruct.fieldtrip.method),    options = { options{:} 'fieldtripmethod' res.statfieldtrip }; end
    if ~strcmpi( res.fieldtripmcorrect , paramstruct.fieldtrip.mcorrect),  options = { options{:} 'fieldtripmcorrect' res.fieldtripmcorrect }; end
    if ~strcmpi( res.clusterstat       , paramstruct.fieldtrip.clusterparam),  options = { options{:} 'fieldtripclusterparam' res.clusterstat }; end
    if ~strcmpi( res.clusterchan       , paramstruct.fieldtrip.channelneighborparam),  options = { options{:} 'fieldtripchannelneighborparam' res.clusterchan }; end
    if ~(isnan(res.eeglabalpha(1)) && isnan(paramstruct.eeglab.alpha(1))) && ~isequal(res.eeglabalpha, paramstruct.eeglab.alpha) % threshold
        options = { options{:} 'alpha' res.eeglabalpha };
    end
    if ~(isnan(res.fieldtripalpha(1)) && isnan(paramstruct.fieldtrip.alpha(1))) && ~isequal(res.fieldtripalpha, paramstruct.fieldtrip.alpha) % threshold
        options = { options{:} 'fieldtripalpha' res.fieldtripalpha };
    end
    
    if ~isempty(options)
        STUDY = pop_statparams(STUDY, options{:});
        com = sprintf('STUDY = pop_statparams(STUDY, %s);', vararg2str( options ));
    end
else
    % interpret parameters
    % --------------------
    if isfield(STUDY, 'etc')
         paramstruct = STUDY.etc.statistics; isstudy = true;
    else paramstruct = STUDY;
         if isempty(paramstruct), paramstruct = default_stats([]); end
         isstudy = false;
    end
    
    if isempty(varargin) || strcmpi(varargin{1}, 'default')
        paramstruct = default_stats(paramstruct);
    else
        for index = 1:2:length(varargin)
            v = varargin{index};
            if strcmpi(v, 'statistics'), v = 'method'; end % backward compatibility
            if strcmpi(v, 'threshold' ), v = 'alpha';  end % backward compatibility
            
            if strcmpi(v, 'alpha') || strcmpi(v, 'method') || strcmpi(v, 'naccu') || strcmpi(v, 'mcorrect') 
                paramstruct = setfield(paramstruct, 'eeglab', v, varargin{index+1});
            elseif ~isempty(findstr('fieldtrip', v))
                v2 = v(10:end);
                paramstruct = setfield(paramstruct, 'fieldtrip', v2, varargin{index+1});
                if strcmpi(v2, 'channelneighborparam')
                    paramstruct.fieldtrip.channelneighbor = []; % reset neighbor matrix if parameter change
                end
            else
                if (~isempty(paramstruct) && ~isempty(strmatch(v, fieldnames(paramstruct), 'exact'))) || ~isstudy
                    paramstruct = setfield(paramstruct, v, varargin{index+1});
                end
            end
        end
    end
    
    if isfield(STUDY, 'etc')
        STUDY.etc.statistics = paramstruct; 
    else 
        STUDY = paramstruct;
    end
end

% default parameters
% ------------------
function paramstruct = default_stats(paramstruct)

if ~isfield(paramstruct, 'effect'),        paramstruct.effect     = 'main'; end
if ~isfield(paramstruct, 'groupstats'),    paramstruct.groupstats = 'off';  end
if ~isfield(paramstruct, 'condstats' ),    paramstruct.condstats  = 'off';  end
if ~isfield(paramstruct, 'singletrials' ), paramstruct.singletrials = 'off'; end
if ~isfield(paramstruct, 'mode' ),         paramstruct.mode         = 'eeglab'; end
if ~isfield(paramstruct, 'eeglab'),        paramstruct.eeglab       = []; end
if ~isfield(paramstruct, 'fieldtrip'),     paramstruct.fieldtrip    = []; end
if ~isfield(paramstruct.eeglab, 'naccu'),    paramstruct.eeglab.naccu = []; end
if ~isfield(paramstruct.eeglab, 'alpha' ),   paramstruct.eeglab.alpha = NaN; end
if ~isfield(paramstruct.eeglab, 'method'),   paramstruct.eeglab.method = 'param'; end
if ~isfield(paramstruct.eeglab, 'mcorrect'), paramstruct.eeglab.mcorrect = 'none'; end
if ~isfield(paramstruct.fieldtrip, 'naccu'),  paramstruct.fieldtrip.naccu = []; end
if ~isfield(paramstruct.fieldtrip, 'method'), paramstruct.fieldtrip.method = 'analytic'; end
if ~isfield(paramstruct.fieldtrip, 'alpha'),  paramstruct.fieldtrip.alpha  = NaN; end
if ~isfield(paramstruct.fieldtrip, 'mcorrect'),   paramstruct.fieldtrip.mcorrect = 'none'; end
if ~isfield(paramstruct.fieldtrip, 'clusterparam'),   paramstruct.fieldtrip.clusterparam = '''clusterstatistic'',''maxsum'''; end
if ~isfield(paramstruct.fieldtrip, 'channelneighbor'),   paramstruct.fieldtrip.channelneighbor = []; end
if ~isfield(paramstruct.fieldtrip, 'channelneighborparam'),   paramstruct.fieldtrip.channelneighborparam = '''method'',''triangulation'''; end
if strcmpi(paramstruct.eeglab.mcorrect, 'benferoni'), paramstruct.eeglab.mcorrect = 'bonferoni'; end
if strcmpi(paramstruct.eeglab.mcorrect,    'no'), paramstruct.eeglab.mcorrect = 'none'; end
if strcmpi(paramstruct.fieldtrip.mcorrect, 'no'), paramstruct.fieldtrip.mcorrect = 'none'; end
