% STD_FIGTITLE - Generate plotting figure titles in a cell array
%
% Usage:    
%   >> celltxt = std_figtitle(key1, val1, key2, val2);  
%
% Inputs:
%  'subject'     - [string] Subject name
%  'datatype'    - [string] data type (For example 'erp')
%  'chanlabels'  - [cell array or string] channel names
%  'compnames'   - [cell array or string] component names
%  'factor1'     - [cell array] name of factor1
%  'factor2'     - [cell array] name of factor2
%  'factor1vals' - [cell array] values of factor1
%  'factor2vals' - [cell array] values of factor1
%  'vals'        - [cell array or real array] value for plot panel (for 
%                  example, 0 ms)
%  'valsunit'    - [cell array or string] unit value (i.e. ms)
%
% Optional statistical titles:
%  'effect'        - ['main'|'marginal'] use main or marginal (default) effect.
%  'factor1stat'   - ['on'|'off'] stat enabled for factor 1. default is 'off'
%  'factor2stat'   - ['on'|'off'] default is 'off'
%  'mcorrect'      - [string] correction for multiple comparisons. Default is
%                  empty.
%  'statistics'  - [string] type of statistics
%  'threshold'   - [real] threshold value
% 
% Optional grouping:
%  'factor1grouped'  - ['on'|'off'] group factor 1 together default is 'off'
%  'factor2grouped'  - ['on'|'off'] default is 'off'
% 
% Outputs:
%   celltxt      - cell array of text string, one for each set of condition
%
% Example:
%  std_figtitle('subject', 'toto', 'condnames', { 'test1' 'test2' }, ...
%               'vals' , { [100] [4] }, 'valsunit', { 'ms' 'Hz' })
%
% Authors: Arnaud Delorme, SCCN/UCSD, Feb 2010

% Copyright (C) Arnaud Delorme, arno@salk.edu
%
% 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 [all_titles, alllegends ] = std_figtitle(varargin)

if nargin < 1
    help std_figtitle;
    return;
end

alllegends = {};
opt = finputcheck( varargin, { 'chanlabels'  {'cell','string'}   []     {};
                               'factor1'     'string'            []     '';
                               'factor2'     'string'            []     '';
                               'factor1vals' {'cell','string'}   []     '';
                               'factor2vals' {'cell','string'}   []     '';
                               'factor1stat' 'string'            {'on','off'}     'off';
                               'factor2stat' 'string'            {'on','off'}     'off';
                               'factor1grouped' 'string'            {'on','off','together','apart'}     'off';
                               'factor2grouped' 'string'            {'on','off','together','apart'}     'off';
                               'condnames'   {'cell','string'}   []     '';
                               'cond2names'  {'cell','string'}   []     '';
                               'condstat'    'string'            {'on','off'}     'off';
                               'cond2stat'   'string'            {'on','off'}     'off';
                               'condgroup'   'string'            {'on','off','together','apart'}     'off';
                               'cond2group'  'string'            {'on','off','together','apart'}     'off';
                               'plotmode'    'string'            {'normal','condensed'}              'normal';
                               'plotsubjects' 'string'           {'on','off'}                        'off';
                               'threshold'   'real'              []     NaN;
                               'statistics'  'string'            []     '';
                               'mcorrect'    'string'            []     '';
                               'effect'      'string'            {'main','marginal'}     'marginal';
                               'datatype'    'string'            []     '';
                               'clustname'   'string'            []     '';
                               'compnames'   {'cell','string'}   []     {};
                               'vals'      {'cell','real'}     []     {};
                               'valsunit'  {'cell','string'}   []     {};
                               'subject'     'string'            []              '' }, 'std_figtitle'); 
if ischar(opt), error(opt); end

% convert
if ~isempty(opt.condnames),  opt.factor1vals = opt.condnames; end
if ~isempty(opt.cond2names), opt.factor2vals = opt.cond2names; end
if ~isempty(opt.condstat),   opt.factor1stat = opt.condstat; end
if ~isempty(opt.cond2stat),  opt.factor2stat = opt.cond2stat; end
if ~isempty(opt.condgroup),  opt.factor1grouped = opt.condgroup; end
if ~isempty(opt.cond2group), opt.factor2grouped = opt.cond2group; end

if ~iscell(opt.vals),       opt.vals       = { opt.vals }; end
ncori  = length(opt.factor1vals);
nc2ori = length(opt.factor2vals);
if ~isempty(opt.vals) && ~isempty(opt.vals{1}) && ~isnan(opt.vals{1}(1)), opt.factor1grouped = 'off'; opt.factor2grouped = 'off'; end
if strcmpi(opt.plotmode, 'condensed'), opt.factor1grouped = 'on';  opt.factor2grouped = 'on';  end
if strcmpi(opt.plotsubjects, 'on'),    opt.factor1grouped = 'off'; opt.factor2grouped = 'off'; end
if strcmpi(opt.plotsubjects, 'on')
    opt.factor1grouped  = 'apart';
    opt.factor2grouped = 'apart';
end
if strcmpi(opt.effect, 'main') && ncori > 1 && nc2ori > 1 && (strcmpi(opt.factor1stat, 'on') || strcmpi(opt.factor2stat, 'on'))
    opt.factor1grouped = 'apart';
    opt.factor2grouped = 'apart';
end

if strcmpi(opt.factor1grouped,  'on'), opt.factor1grouped =  'together'; end
if strcmpi(opt.factor2grouped, 'on'), opt.factor2grouped = 'together'; end

if strcmpi(opt.factor1grouped, 'together') &&  strcmpi(opt.factor2stat, 'on') && length(opt.factor2vals) > 1, opt.factor1grouped = 'apart'; end
if strcmpi(opt.factor2grouped, 'together') &&  strcmpi(opt.factor1stat, 'on') && length(opt.factor1vals) > 1, opt.factor2grouped = 'apart'; end
if ~( strcmpi(opt.factor1grouped,  'together') && strcmpi(opt.factor2grouped, 'together') )
    if strcmpi(opt.factor1grouped, 'together') && ~isempty(opt.factor1vals), alllegends = opt.factor1vals; opt.factor1vals = ''; end
    if strcmpi(opt.factor2grouped, 'together') && ~isempty(opt.factor2vals), alllegends = opt.factor2vals; opt.factor2vals = ''; end
end

if ~iscell(opt.valsunit),   opt.valsunit   = { opt.valsunit }; end
if ~iscell(opt.chanlabels), opt.chanlabels = { opt.chanlabels }; end
if ~iscell(opt.factor1vals), opt.factor1vals  = { opt.factor1vals }; end
if ~iscell(opt.factor2vals), opt.factor2vals = { opt.factor2vals }; end
if isempty(opt.factor1vals), opt.factor1vals{1}  = ''; end
if isempty(opt.factor2vals), opt.factor2vals{1} = ''; end

for c1 = 1:length(opt.factor1vals)
    for c2 = 1:length(opt.factor2vals)

        % value (ms or Hz)
        % ----------------
        fig_title1 = '';
        for i = 1:length(opt.vals)
            if ~isempty(opt.vals{i}) && ~isnan(opt.vals{i}(1)) 
                if opt.vals{i}(1) == opt.vals{i}(end), fig_title1 = [ num2str(opt.vals{i}(1)) '' opt.valsunit{i} fig_title1];
                else                                   fig_title1 = [ num2str(opt.vals{i}(1)) '-' num2str(opt.vals{i}(2)) '' opt.valsunit{i} fig_title1 ];
                end
                if length(opt.vals) > i, fig_title1 = [ ' & ' fig_title1 ]; end
            end
        end

        % conditions
        % ----------
        if ~isempty(opt.factor1vals{c1})
            fig_title1 = [ value2str(opt.factor1vals{c1}) ', ' fig_title1];
        end
        if ~isempty(opt.factor2vals{c2})
            fig_title1 = [ value2str(opt.factor2vals{c2}) ', ' fig_title1];
        end

        % channel labels, component name, subject name and datatype
        % ---------------------------------------------------------
        fig_title2 = '';
        if length( opt.chanlabels ) == 1 && ~isempty( opt.chanlabels{1} )
            fig_title2 = [ opt.chanlabels{1} ', ' fig_title2 ];
        end    
        
        % cluster and component name
        % --------------------------
        if ~isempty( opt.clustname )
            if ~isempty( opt.compnames )
                if iscell( opt.compnames )
                     compstr = [ 'C' num2str(opt.compnames{min(c1,size(opt.compnames,1)),min(c2,size(opt.compnames,2))}) ];
                else compstr = [ opt.compnames ];
                end
            else compstr = '';
            end
            if ~isempty( opt.subject )
                if ~isempty( compstr )
                     fig_title2 = [ opt.subject '/' compstr ', ' fig_title2 ];
                else fig_title2 = [ opt.subject ', ' fig_title2 ];
                end
            elseif ~isempty( compstr )
                fig_title2 = [ compstr ', ' fig_title2 ];
            end
            
            if ~isempty( opt.datatype )
                 fig_title2 = [ opt.clustname ' ' opt.datatype ', ' fig_title2 ];
            else fig_title2 = [ opt.clustname ', ' fig_title2 ];
            end
            
        else
            if ~isempty( opt.compnames )
                if iscell( opt.compnames )
                else fig_title2 = [ 'C' num2str(opt.compnames{c1,c2}) ', ' fig_title2 ];
                     fig_title2 = [ opt.compnames        ', ' fig_title2 ];
                end
            end
            
            % subject and data type
            % ---------------------
            if ~isempty( opt.subject )
                if ~isempty( opt.datatype )
                     fig_title2 = [ opt.subject ' ' opt.datatype ', ' fig_title2 ];
                else fig_title2 = [ opt.subject ', ' fig_title2 ];
                end
            elseif ~isempty( opt.datatype )
                fig_title2 = [ opt.datatype ' - ' fig_title2 ];
            end
        end    
        
        if strcmpi(opt.factor2grouped, 'together') && strcmpi(opt.factor1grouped, 'together')
            fig_title = fig_title2;
            if ~isempty(fig_title1) && length(fig_title1) > 1 && strcmpi(fig_title1(end-1:end), ', '), fig_title1(end-1:end) = []; end
            if ~isempty(fig_title1) && length(fig_title1) > 1 && strcmpi(fig_title1(end-1:end), '- '), fig_title1(end-1:end) = []; end
            alllegends{c1, c2} = fig_title1;
        else
            fig_title = [ fig_title2 fig_title1 ];
        end
        if ~isempty(fig_title) && length(fig_title) > 1 && strcmpi(fig_title(end-1:end), ', '), fig_title(end-1:end) = []; end
        if ~isempty(fig_title) && length(fig_title) > 1 && strcmpi(fig_title(end-1:end), '- '), fig_title(end-1:end) = []; end
        all_titles{c1,c2}  = fig_title;
        
    end
end
if ~isempty(alllegends)
    alllegends = alllegends';
    alllegends = alllegends(:)';

    % convert legends to string if necessary
    % --------------------------------------
    for ileg = 1:length(alllegends)
        alllegends{ileg} = value2str(alllegends{ileg}); 
    end
end

% statistic titles
% ----------------
if isnan(opt.threshold)
    basicstat = '(p-value)';
else
    if length(opt.threshold) >= 1
        basicstat = sprintf([ '(p<%.' thresh_pres(opt.threshold(1)) 'f)'], opt.threshold(1));
    end
    if length(opt.threshold) >= 2
        basicstat = [ basicstat(1:end-1) sprintf([' red;p<%.' thresh_pres(opt.threshold(2))  'f brown)'], opt.threshold(2)) ];
    end
    if length(opt.threshold) >= 3
        basicstat = [ basicstat(1:end-1) sprintf([';\np<%.' thresh_pres(opt.threshold(3)) 'f black)' ], opt.threshold(3)) ];  
    end
end    
if ~isempty(opt.statistics), basicstat = [ basicstat ' ' opt.statistics    ]; end
if ~isempty(opt.mcorrect) && ~strcmpi(opt.mcorrect, 'none'),   basicstat = [ basicstat ' with ' opt.mcorrect ]; end
rown = size(all_titles,1);
if strcmpi(opt.factor1stat, 'on')
    rown = rown+1;
    if strcmpi(opt.effect, 'marginal')
        for c2 = 1:length(opt.factor2vals)
            all_titles{rown, c2} = [ value2str(opt.factor2vals{c2}) ' ' basicstat ];
        end
    else
        all_titles{rown, 1} = [ opt.factor1 ' ' basicstat ]; 
    end
end
coln = size(all_titles,2);
if strcmpi(opt.factor2stat, 'on')
    coln = coln+1;
    if strcmpi(opt.effect, 'marginal')
        for c1 = 1:length(opt.factor1vals)
            all_titles{c1, coln} = [ value2str(opt.factor1vals{c1}) ' ' basicstat ];   
        end
    else
        all_titles{1, coln} = [ opt.factor2 ' ' basicstat ];   
    end
end
if ~strcmpi(opt.effect, 'marginal') && (strcmpi(opt.factor1stat, 'on') && strcmpi(opt.factor2stat, 'on') && rown > 1 && coln > 1)
   all_titles{rown, coln} = [ 'Interaction ' basicstat ];   
end

function pres = thresh_pres(thresh_pres)
    if (round(thresh_pres*100)-thresh_pres*100) == 0
        pres = 2;
    elseif (round(thresh_pres*1000)-thresh_pres*1000) == 0
        pres = 3;
    else
        pres = -round(log10(thresh_pres))+1;
    end
    pres = num2str(pres);

% convert 
% -------
function str = value2str(value)
    
    if ischar(value)
        str = value;
    elseif isnumeric(value)
        if length(value) == 1
            str = num2str(value);
        else
            str = num2str(value(1));
            if length(value) <= 5
                for ind = 2:length(value)
                    str = [ str ' & ' num2str(value(ind)) ];
                end
            else
                str = [ str ' & ' num2str(value(2)) ' & ...' ];
            end
        end
    else % cell array
        str = value{1};
        if length(value) <= 5
            for ind = 2:length(value)
                str = [ str ' & ' value{ind} ];
            end
        else
            str = [ str ' & ' num2str(value{2}) ' & ...' ];
        end
    end
    
            


