[Master Index] [Index for Toolbox]

bst_wavedata_display

(Toolbox/bst_wavedata_display.m in BrainStorm 2.0 (Alpha))


Function Synopsis

varargout = bst_wavedata_display(D,OPTIONS);

Help Text

BST_WAVEDATA_DISPLAY - Various ways of loooking at time series
 function varargout = bst_wavedata_display(D,OPTIONS);
 Inputs:

 Outputs:

Cross-Reference Information

This function calls
This function is called by

Listing of function C:\BrainStorm_2001\Toolbox\bst_wavedata_display.m

function varargout = bst_wavedata_display(D,OPTIONS);
%BST_WAVEDATA_DISPLAY - Various ways of loooking at time series
% function varargout = bst_wavedata_display(D,OPTIONS);
% Inputs:
%
% Outputs:

%<autobegin> ---------------------- 09-Jul-2004 22:16:52 -----------------------
% --------- Automatically Generated Comments Block Using AUTO_COMMENTS ---------
%
% CATEGORY: Visualization
%
% Alphabetical list of external functions (non-Matlab):
%   toolbox\bestfitsph.m
%   toolbox\bst_message_window.m
%   toolbox\bst_static_taskbar.m
%   toolbox\carto_sph.m
%   toolbox\findclosest.m
%   toolbox\get_user_directory.m
%   toolbox\interp_mail.m
%   toolbox\makeuswait.m
%   toolbox\norlig.m
%
% At Check-in: $Author: Mosher $  $Revision: 51 $  $Date: 7/09/04 8:42p $
%
% This software is part of BrainStorm Toolbox Version 2.0 (Alpha) 09-Jul-2004
% 
% Principal Investigators and Developers:
% ** Richard M. Leahy, PhD, Signal & Image Processing Institute,
%    University of Southern California, Los Angeles, CA
% ** John C. Mosher, PhD, Biophysics Group,
%    Los Alamos National Laboratory, Los Alamos, NM
% ** Sylvain Baillet, PhD, Cognitive Neuroscience & Brain Imaging Laboratory,
%    CNRS, Hopital de la Salpetriere, Paris, France
% 
% See BrainStorm website at http://neuroimage.usc.edu for further information.
% 
% Copyright (c) 2004 BrainStorm by the University of Southern California
% This software distributed  under the terms of the GNU General Public License
% as published by the Free Software Foundation. Further details on the GPL
% license can be found at http://www.gnu.org/copyleft/gpl.html .
% 
% FOR RESEARCH PURPOSES ONLY. THE SOFTWARE IS PROVIDED "AS IS," AND THE
% UNIVERSITY OF SOUTHERN CALIFORNIA AND ITS COLLABORATORS DO NOT MAKE ANY
% WARRANTY, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
% MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, NOR DO THEY ASSUME ANY
% LIABILITY OR RESPONSIBILITY FOR THE USE OF THIS SOFTWARE.
%<autoend> ------------------------ 09-Jul-2004 22:16:52 -----------------------



% /---Script Author--------------------------------------\
% |                                                      |
% | *** Sylvain Baillet, Ph.D.                           |
% | Cognitive Neuroscience & Brain Imaging Laboratory    |
% | CNRS UPR640 - LENA                                   | 
% | Hopital de la Salpetriere, Paris, France             |
% | sylvain.baillet@chups.jussieu.fr                     |
% |                                                      |
% | John C. Mosher, Ph.D.                                |
% \------------------------------------------------------/


% Date of creation: July 2003
%
% Script History----------------------------------------------------
% SB     Jul-2003  Creation
% JCM 08-Sep-2003  Debugging, commenting
% JCM 11-Dec-2003  change "prod" to "all" for "ishandle" compatability in
%                  Matlab 6.5
% SB  15-Dec-2003  Fixed issues when plotting EEG only
% ------------------------------------------------------------------

% Default display options
Def_OPTIONS = struct(...
    'AbsoluteColormap', 0,...
    'Axes',[],...
    'Channel', [],...
    'Colorbar', 1,...
    'Colormap', [],...
    'DisplayTypes', [1 0 0], ...
    'DataType','surface',...
    'Fmax',[],...
    'hSurface', NaN*ones(1,length(D)), ...
    'hSensors', NaN, ...
    'WaveLabel',' ',...
    'IndepTopo',[],...
    'LineColor',[],...    
    'ModalityLabel',' ',...
    'Modality', 1,...
    'MoveCursor','on',...
    'nColumnLayout',1,...
    'SelectedChannels', {[]},...
    'SensorMarkers', 1,...
    'SensorLabels', 0,...
    'ShowContours', 1, ...
    'CurrentTime',[],...
    'Time', []...
    );

fontcolor = [1 1 1]; % Default font color for axes ticks and labels.

if nargin == 0 % Return default disply options
    if nargout > 1
        PlotHandles = Def_OPTIONS;
    else
        PlotHandles = [];
    end
    return
elseif nargin < 1 | nargin > 2
    errordlg(sprintf('Wrong number of arguments when calling %s', mfilename))
    return
elseif nargin == 1 % Use default option values
    
    OPTIONS = Def_OPTIONS;
    
elseif nargin == 2
    
    % Check field names of passed OPTIONS and fill missing ones with default values
    DefFieldNames = fieldnames(Def_OPTIONS);
    for k = 1:length(DefFieldNames)
        if ~isfield(OPTIONS,DefFieldNames{k}) | strcmp(DefFieldNames{k},'BEM')
            if ~isfield(OPTIONS,DefFieldNames{k})
                
                OPTIONS = setfield(OPTIONS,DefFieldNames{k},getfield(Def_OPTIONS,DefFieldNames{k}));
                
            end
        end
    end
end

switch(OPTIONS.DataType)
case 'surface'
    OPTIONS.DataType = 1;
case 'source'
    OPTIONS.DataType = 2;
end

if isempty(OPTIONS.Time)
    OPTIONS.Time = 1:size(D{1},2);
end

if isempty(OPTIONS.CurrentTime)
    OPTIONS.CurrentTime = mean(OPTIONS.Time);
end


nSets = length(D); % Number of data sets
nDispTypes = length(find(OPTIONS.DisplayTypes~=0)); % Number of display types

OverlayAllChannels = 0;
ColumnLayout = 0;

PlotHandles.TimeCursor = [];
PlotHandles.TimeZeroLine = [];

if nargin < 2
    PlotHandles.LineColor = [];
    PlotHandles.Label = cellstr([1:length(OPTIONS.Modality)]'); 
else
    PlotHandles.LineColor = OPTIONS.LineColor;
    PlotHandles.Label = OPTIONS.ModalityLabel;
end


% Display preparation
if isempty(OPTIONS.Fmax)
    for iSet = 1:nSets
        for mod = OPTIONS.Modality %1:3
            if ~isempty(OPTIONS.SelectedChannels{mod})
                if OPTIONS.DataType == 1
                    OPTIONS.Fmax(iSet,mod) = max(max(abs(D{iSet}(OPTIONS.SelectedChannels{mod},:))));
                elseif OPTIONS.DataType == 2
                    OPTIONS.Fmax(iSet,mod) = max(max(abs(D{iSet}(:))));
                end            
            else
                OPTIONS.Fmax(iSet,mod) = 0;
            end
        end
    end
end

OPTIONS.FmaxOrig = OPTIONS.Fmax;
DOrig = D;

fontsize = 8;%min([28/(nColumnLayout*(log(power(length(OPTIONS.Modality),.1)+1))),7]);

% Creation of graphics when they do not exist yet
% time series OVERLAY %--------------------------------------------------------------

makeuswait('start')

if OPTIONS.DisplayTypes(1) == 1
    
    OverlayAllChannels = 1;
    
    for iSet = 1:nSets % For each dataset
        
        F = D{iSet};
        
        iplot = 0;
        imod = 0;
        
        for mod = OPTIONS.Modality % For every selected data type
            imod = imod+1;
            iplot= iplot+1;
            
            if isempty(OPTIONS.SelectedChannels)
                OPTIONS.SelectedChannels{mod} = [1:size(F,1)]; % Assume F contains waveforms of a single type
            end
            
            % Data normalization
            if iSet == 1
                %                 tmp = [OPTIONS.Fmax{:}];
                %                 tmp = reshape(tmp,3,nSets)';
                %                 maxData(mod) = max(tmp(:,mod));
                if OPTIONS.DataType == 1
                    maxData(mod) = max(OPTIONS.Fmax(:,mod));
                else
                    maxData(mod) = max(OPTIONS.Fmax(:));
                end
                
                % Sanity check
                if isnan(maxData(mod)) | maxData == 0
                    maxData(mod) = eps;
                    OPTIONS.Fmax(iSet,mod) = eps;
                    if OPTIONS.DisplayTypes == 1
                        DataToDisplay = zeros(size(F(OPTIONS.SelectedChannels{mod},:)));
                    elseif OPTIONS.DisplayTypes == 2
                        DataToDisplay = zeros(size(F(:)));
                    end
                end
            
                    
            end
            
            if OPTIONS.DataType == 1
                DataToDisplay = F(OPTIONS.SelectedChannels{mod},:);
            elseif OPTIONS.DataType == 2 
                DataToDisplay = F;
            end
            
            DataToDisplay = DataToDisplay/maxData(mod);
            
            % Display parameters
            N = length(OPTIONS.Modality); % Maximum number of channels to visualize per column
            delta = .95/(N+1); % Space between plots (in normalized units)  
            
            if iplot == 1 & iSet == 1
                M = 1;%max(max(F(channels,:))); % Useful as a scaling factor for display purposes
                PlotHandles.PlotOverlay(mod).axes = subplot(1,nDispTypes,1);
                hold on
            else
                PlotHandles.PlotOverlay(mod).axes = PlotHandles.PlotOverlay(OPTIONS.Modality(1)).axes;%subplot(1,ncol,col+PlotHandles.OverlayAllChannels);
            end
            
            PlotHandles.PlotOverlay(mod).lines{iSet} = plot(OPTIONS.Time,DataToDisplay'+(2*M*iplot));
                          
            
            if length(OPTIONS.Modality) > 1
                Line(mod) = PlotHandles.PlotOverlay(mod).lines{iSet}(1); % Keep track of line handle for each modality
            else
                Line(iSet) = PlotHandles.PlotOverlay(mod).lines{iSet}(1); % Keep track of line handle for each set for proper legend (see below)    
            end
            
            if nSets > 1 | length(OPTIONS.Modality) > 1 % Assign a single color to all waveforms of each data set / modality
                
                if iSet == 1 & isempty(OPTIONS.LineColor)
                    % Generate a set of colors for time series
                    PlotHandles.LineColor = get(0,'DefaultAxesColorOrder'); % Get default line colors
               % JCM: Gotta fix this cheat
               if 0
                  PlotHandles.LineColor = PlotHandles.LineColor(1:nSets,:); % CHEAT , nSets need to be smaller than size(get(0,'DefaultAxesColorOrder'),1)
               else
                  % JCM fix 16-June-2004
                  temp_nSets = rem(0:(nSets-1),size(PlotHandles.LineColor,1))+1; % modulo scheme for line colors
                  PlotHandles.LineColor = PlotHandles.LineColor(temp_nSets,:); 
               end
               %PlotHandles.LineColor(PlotHandles.LineColor>.8) = .8; % Avoid too bright colors
               PlotHandles.LineColor = num2cell(PlotHandles.LineColor,2);
            elseif length(OPTIONS.LineColor)~= nSets
               PlotHandles.LineColor = get(0,'DefaultAxesColorOrder');
               % JCM: Gotta fix this cheat
               if 0
                  PlotHandles.LineColor = PlotHandles.LineColor(1:nSets,:);
               else
                  % JCM fix 16-June-2004
                  temp_nSets = rem(0:(nSets-1),size(PlotHandles.LineColor,1))+1; % modulo scheme for line colors
                  PlotHandles.LineColor = PlotHandles.LineColor(temp_nSets,:); 
               end
               
               %PlotHandles.LineColor = rand(nSets,3); 
               %PlotHandles.LineColor(PlotHandles.LineColor>.8) = .8; % Avoid too bright colors
               PlotHandles.LineColor = num2cell(PlotHandles.LineColor,2);
                end
                
            else
                
                PlotHandles.LineColor{1} = .2*ones(1,3); % Default time series color
                
            end
                        
            set(PlotHandles.PlotOverlay(mod).lines{iSet},'Color',PlotHandles.LineColor{iSet},'ButtonDownFcn','dataplot_cb NameSelectedChannel',...
                'Visible','on','Userdata',iSet)
            
            if iSet == 1 % Display data scale for each modality
                ratio = .2;
                % Take ratio X maxData amplitude as a marker of data amplitude
                itime = OPTIONS.Time(ceil(length(OPTIONS.Time)*ratio));
                if OPTIONS.DataType == 1
                    PlotHandles.PlotOverlay(mod).YScale.Line = errorbar(itime,2.5*M*iplot+ratio,ratio/2,'k');
                    if mod == 1 % MEG
                        sstring = 'fT'; factor = 1e-15;
                    elseif mod == 2 % EEG
                        sstring  = 'mV'; factor = 1;%1e-3;
                    else 
                        sstring = 'a.u.'; factor = 1;
                    end
                    
                    PlotHandles.PlotOverlay(mod).YScale.Label = text(itime,2.5*M*iplot+1.5*ratio,sprintf('%4.1f %s',(ratio*maxData(mod)/factor),sstring));
                    set(PlotHandles.PlotOverlay(mod).YScale.Label,'HorizontalAlignment','left','fontsize', fontsize,'VerticalAlignment','bottom')
                    
                elseif OPTIONS.DataType == 2 & mod == OPTIONS.Modality(1)
                    
                    PlotHandles.PlotOverlay(mod).YScale.Line = errorbar(itime,2.5*M*iplot+ratio,ratio/2,'k');
                    sstring = 'A.m'; factor = 1; % CBB | manage ZScores
                    
                    %                     elseif mod == 2 % Source time series - ZScored
                    %                         sstring = texlabel('sigma'); factor = 1;
                    %end
                    
                    PlotHandles.PlotOverlay(mod).YScale.Label = text(itime,2.5*M*iplot+1.5*ratio,sprintf('%4.1e %s',(ratio*maxData(mod)/factor),sstring));    
                    
                    set(PlotHandles.PlotOverlay(mod).YScale.Label,'HorizontalAlignment','left','fontsize', fontsize,'VerticalAlignment','bottom')
                    
                end
                
                
                YZeroLine = line(get(PlotHandles.PlotOverlay(mod).axes,'Xlim'),2*M*iplot*[1 1],'color',.8*[1 1 1]);
                
            end
        end 
        
    end % For each selected dataset
    
    
    set(PlotHandles.PlotOverlay(mod).axes,'units','normalized','ygrid','on','xgrid','on','Box','on',...
        'Yticklabel',PlotHandles.Label,'Ytick',2*M*[1:iplot],...
        'FontName','default','FontSize',fontsize,'FontUnits','Normal','Fontweight','light',...
        'xColor',fontcolor, 'ycolor', fontcolor,'XMinorGrid','on',...
        'Xlim',[OPTIONS.Time(1),OPTIONS.Time(end)],'Ylim',[0 2*M*(N+1)],...
        'Visible','on')
    
    a =  xlabel('Time (s)');
    set(a,'Visible','on','fontsize',fontsize,'Fontunits','normal') % Apparently has no effect in Matlab 6.3 
    
    axes(PlotHandles.PlotOverlay(mod).axes)
    [LEGH,OBJH,OUTH,OUTM] = legend(Line,OPTIONS.WaveLabel);
    legend boxoff
    
    LegendMenu = uicontextmenu;
    uimenu(LegendMenu,'Label','Hide/Show Legend','Callback','dataplot_cb HideShowMouseSelectedDisplayLegend')
    uimenu(LegendMenu,'checked','off','Label','Zoom ON','Callback','dataplot_cb ToggleWindowFromZoom')
    uimenu(LegendMenu,'checked','off','Label','Rotate','Callback','dataplot_cb ToggleRotate3D')
    uimenu(LegendMenu,'Separator','on','Label','Copy Current Plot','Callback','dataplot_cb CopyCurrentPlot')
    set([gcf;LEGH;OBJH],'UIcontextMenu',LegendMenu)
    set(findobj(OBJH,'type','text'),'Fontsize',7,'fontunits','points')       
    
    PlotHandles.TimeZeroLine(1) = line([0 0],get(gca,'Ylim'));
    set(PlotHandles.TimeZeroLine(1),'Visible','on')
    PlotHandles.TimeCursor(1) = line([OPTIONS.CurrentTime OPTIONS.CurrentTime],get(gca,'Ylim'),'linewidth',1);
    
end


% Column layout of time series % ---------------------------------------------------------------------------
if OPTIONS.DisplayTypes(2) > 0
    
    ColumnLayout = 1; % Flag
    OPTIONS.nColumnLayout = OPTIONS.DisplayTypes(2); % Number of columns
    
    % Initialize column plot structure
    tmp = deal(struct('lines',{cell(1,nSets)},'axes',zeros(OPTIONS.nColumnLayout,1),'ytick',[]));
    for mod = OPTIONS.Modality % For every selected data type
        PlotHandles.PlotColumn(mod) = tmp;
     end
    clear tmp
    
    
    if OPTIONS.DataType == 2 % Source column-display 

        nSets = length(D);
                
        % Display preparation
        OPTIONS.Fmax = [];
        for iSet = 1:nSets
            imod = 0;
            for mod = OPTIONS.Modality
                imod = imod + 1;
        
                if isempty(OPTIONS.SelectedChannels)
                    OPTIONS.SelectedChannels{mod} = [1:size(D{iSet},1)]; % Assume F contains waveforms of a single type
                end

                if ~isempty(OPTIONS.SelectedChannels{mod})
                    OPTIONS.Fmax(iSet,imod) = max(max(abs(D{iSet}(:))));
                else
                    OPTIONS.Fmax(iSet,imod) = 0;
                end
            end
        end
        
        D = {cat(1,D{:})};
        nSets = length(D);
           
    end
    
    for iSet = 1:nSets % For each data set (MEG/EEG or Original/Modeled/Residuals) or each source
        
        F = D{iSet};
        
        % Data normalization
        channels = [];
        imod = 0;
        for mod = OPTIONS.Modality % For every selected data type
            imod = imod+1;
            if iSet == 1
                %                 tmp = [OPTIONS.Fmax{:}];
                %                 tmp = reshape(tmp,3,nSets)';
                %                 maxData(mod) = max(tmp(:,mod));
                maxData(mod) = max(OPTIONS.Fmax(:,mod));
                
                % Sanity check
                if isnan(maxData(mod))
                    maxData(mod) = eps;
                    OPTIONS.Fmax(iSet,mod) = eps;
                    if OPTIONS.DisplayTypes == 1
                        DataToDisplay = zeros(size(F(OPTIONS.SelectedChannels{mod},:)));
                    elseif OPTIONS.DisplayTypes == 2
                        DataToDisplay = zeros(size(F(:)));
                    end
                end
            end
            
            if OPTIONS.DataType == 1
                F(OPTIONS.SelectedChannels{mod},:) = D{iSet}(OPTIONS.SelectedChannels{mod},:)/maxData(mod);
                channels = [channels,OPTIONS.SelectedChannels{mod}];  
            elseif OPTIONS.DataType == 2 
                DataToDisplay = D{iSet}/maxData(mod);
                channels = [1:size(F,1)];
            end
        end
        
        
        if iSet == 1
            M = 1;%max(max(abs(F(channels,:)))); % Useful as a scaling factor for display purposes
            N = ceil(length(channels)/OPTIONS.nColumnLayout); % Maximum number of channels to visualize per column
            fontsize = min([28/(OPTIONS.nColumnLayout*(log(power(N,.1)+1))),7]);
            delta = .95/(N+1); % Space between plots (in normalized units)  
        end
        
        for col = 1:OPTIONS.nColumnLayout % For each column of the layout
            
            if col < OPTIONS.nColumnLayout
                try
                    IDscol = channels((col-1)*N+1 : N*col); % Labels of channels to plot in each column 
                catch
                    errordlg('Please decrease the number of columns.')
                    return
                end
                
            else
                IDscol = channels((col-1)*N+1 : end); % Labels of channels to plot in each column 
            end
            
            i = 0;
            
            for k = IDscol % For each channel in current column
                
                if OPTIONS.DataType == 1 % For sensor data - check modality type for each waveform
                  
                    if ~isempty(find(OPTIONS.SelectedChannels{1}==k))
                        mod = 1;
                    elseif ~isempty(find(OPTIONS.SelectedChannels{2}==k)) 
                        mod = 2;
                    elseif ~isempty(find(OPTIONS.SelectedChannels{3}==k)) 
                        mod = 3;
                    end
                    
                else % For source time series - force modality
                
                    mod = OPTIONS.Modality;
                    
                end
                    
                
                if k == IDscol(1) & iSet == 1; % First channel of current subset : create new axes
                    PlotHandles.PlotColumn(mod).axes(col) = subplot(1,nDispTypes*OPTIONS.nColumnLayout,OPTIONS.nColumnLayout*OverlayAllChannels + col);%axes;
                    hold on
                elseif iSet == 1
                    PlotHandles.PlotColumn(mod).axes(col) = gca;
                elseif iSet >1
                    axes(PlotHandles.PlotColumn(mod).axes(col));% = gca;
                end
                
                i = i+1; % Index of channel plot in current axes
                
                if iSet > 1
                    axes( PlotHandles.PlotColumn(mod).axes(col))
                end
                
                if OPTIONS.DataType == 1
                    tmp = plot(OPTIONS.Time,F(k,:)+(2*M*i));
                elseif OPTIONS.DataType == 2
                    tmp = plot(OPTIONS.Time,DataToDisplay(k,:)+(2*M*i));
                    
                    YZeroLine = line(get(PlotHandles.PlotColumn(mod).axes(col),'Xlim'),...
                        2*M*i * [1,1],'color',[.8 .8 .8]);
          
                end
        
                
                
                Line(iSet) = tmp(1); % Keep track of a sample line handle from each set (see legend display below)                    
                if nSets > 1
                    if col == 1 & k == IDscol(1)
                        if isempty(PlotHandles.LineColor) % Line color for current data set not defined 
                            PlotHandles.LineColor = rand(nSets,3); 
                            PlotHandles.LineColor(PlotHandles.LineColor>.8) = .8; % Avoid too bright colors
                            PlotHandles.LineColor = num2cell(PlotHandles.LineColor,2);
                        end
                    end
                else
                    if isempty(PlotHandles.LineColor) % Line color for current data set not defined 
                        PlotHandles.LineColor{iSet} = .2*ones(1,3); % Default color
                    end
                end
                
                set(tmp,'color',PlotHandles.LineColor{iSet},'ButtonDownFcn','dataplot_cb NameSelectedChannel') % Display channel Name when time series is selectedend
                
                PlotHandles.PlotColumn(mod).lines{iSet} = [PlotHandles.PlotColumn(mod).lines{iSet}; tmp];
                
                PlotHandles.PlotColumn(mod).ytick = [PlotHandles.PlotColumn(mod).ytick,2*M*i];
                
                hold on
                
            end % for each channel
            
            if iSet == 1
                if OPTIONS.DataType == 1
                    YTickLabel = {OPTIONS.Channel(IDscol).Name};
                elseif OPTIONS.DataType == 2
                    YTickLabel = OPTIONS.WaveLabel(IDscol);
                end
                
                set(gca,'Visible','on',...
                    'Yticklabel',YTickLabel,'Ytick',2*M*[1:length(IDscol)],...
                    'units','normalized','ygrid','on','xgrid','on','Box','on',...
                    'FontName','default','FontSize',fontsize,'FontUnits','Normal','Fontweight','normal',...
                    'xColor',fontcolor, 'ycolor', fontcolor,'XMinorGrid','on',...
                    'Xlim',[OPTIONS.Time(1),OPTIONS.Time(end)],'Ylim',[0 2*M*(N+1)])
                
                %set(gca,'fontunits','points') % Move back to normal because channel names are not readable enough when window size is increased
                
                PlotHandles.TimeCursor(end+1) = line([OPTIONS.CurrentTime OPTIONS.CurrentTime],get(gca,'Ylim'),'linewidth',1);
                set(PlotHandles.TimeCursor(end),'EraseMode','normal','Visible','on')
                PlotHandles.TimeZeroLine(end+1) = line([0 0],get(gca,'Ylim'),'linewidth',1);
                
            
                
                if OPTIONS.DataType == 2
                    if mod == 1 % Source time series - A.m.
                        sstring = 'A.m'; factor = 1;
                    elseif mod == 2 % Source time series - ZScored
                        sstring = texlabel('sigma'); factor = 1;
                    end

                    ratio = .2;
                    % Take ratio X maxData amplitude as a marker of data amplitude
                    iplot = 1;
                    itime = OPTIONS.Time(ceil(length(OPTIONS.Time)*ratio));
                    PlotHandles.PlotColumn(mod).YScale.Line = errorbar(itime,2.5*M*iplot+ratio,ratio/2,'k');

                    PlotHandles.PlotColumn(mod).YScale.Label = text(itime,2.5*M*iplot+1.5*ratio,sprintf('%4.1e %s',(ratio*maxData(mod)/factor),sstring));
                    set(PlotHandles.PlotColumn(mod).YScale.Label,'HorizontalAlignment','left','fontsize', fontsize,'VerticalAlignment','bottom')
                end
                
                
            end
            
            xlabel('Time (s)')
            
        end % for each column
        
        
        set(PlotHandles.PlotColumn(mod).lines{iSet},'UserData',iSet)
        
        
    end % for each data set
    

    % Display Legend
    axes(PlotHandles.PlotColumn(mod).axes(col))
    if OPTIONS.DataType == 1

        [LEGH,OBJH,OUTH,OUTM] = legend(Line,OPTIONS.WaveLabel);
        
    elseif OPTIONS.DataType == 2

        [LEGH,OBJH,OUTH,OUTM] = legend(PlotHandles.PlotColumn(mod).lines{1},OPTIONS.WaveLabel);
          
    end
    
    
    try 
        legend boxoff
    end
    LegendMenu = uicontextmenu;
    uimenu(LegendMenu,'Label','Hide/Show Legend','Callback','dataplot_cb HideShowMouseSelectedDisplayLegend')
    uimenu(LegendMenu,'checked','off','Label','Zoom ON','Callback','dataplot_cb ToggleWindowFromZoom')
    uimenu(LegendMenu,'Separator','on','Label','Copy Current Plot','Callback','dataplot_cb CopyCurrentPlot')
    set([gcf;LEGH;OBJH],'UIcontextMenu',LegendMenu)
    
    set(findobj(OBJH,'type','text'),'Fontsize',7,'fontunits','points')       

    
end


% Surface Topography 
if OPTIONS.DisplayTypes(3) > 1 % Spatial data display requested
    
    if OPTIONS.DataType == 2 % Results
        D = DOrig;
        nSets = length(D);
        OPTIONS.Fmax =  OPTIONS.FmaxOrig;
    end
    
    for iSet = 1:nSets % For each dataset /source
        
        if OPTIONS.DataType == 1
            F = D{iSet};
        elseif OPTIONS.DataType == 2;
            F = zeros(length(OPTIONS.Channel),size(D{iSet},2));
            F(OPTIONS.SelectedChannels{mod},:) = OPTIONS.IndepTopo(:,iSet)*D{iSet};
            if iSet == 1 &~OPTIONS.AbsoluteColormap 
                % Compute absolute maximum of surface topography for all sources 
                tmp = [D{:}]'; tmp = reshape(tmp,length(D{1}),length(D));
                Topo_maxx = max(max(abs(OPTIONS.IndepTopo*tmp'))); clear tmp
            end
        end
        
        % Surface data mapping (topography)
        iplot = 0;
        imod = 0;
        for mod = OPTIONS.Modality % For every selected data type
            imod = imod+1;
            iplot= iplot+1;
            % Data normalization
            
            if OPTIONS.DataType == 1
                chanlocs = [OPTIONS.Channel(OPTIONS.SelectedChannels{mod}).Loc]';
            elseif OPTIONS.DataType == 2
                chanlocs = [OPTIONS.Channel.Loc]';
            end
            
            if isempty(chanlocs)
                return
            end
            
            
            if OPTIONS.DataType == 1
                if size([OPTIONS.Channel(OPTIONS.SelectedChannels{mod}(1)).Loc],2) == 2 % Gradiometers
                    chanlocs = chanlocs(1:2:end,:);
                end
            elseif OPTIONS.DataType == 2
                if size(OPTIONS.Channel(1).Loc,2) == 2 % Gradiometers
                    chanlocs = chanlocs(1:2:end,:);
                end
            end
            
            if size(chanlocs,1) ~= length(OPTIONS.SelectedChannels{mod})
                errordlg('Channel locations do not match the number of channels in Channel structure.','Perverted Channel structure.')
                return
            end
            
          
            
            maxData(mod) = max(max(abs(chanlocs(:,2))));
            chanlocs_orig = chanlocs;
            chanlocs = chanlocs/maxData(mod);
            
            % Display parameters
            N = length(OPTIONS.Modality); % Maximum number of channels to visualize per column
            delta = .95/(N+1); % Space between plots (in normalized units)  
            
            if iplot == 1
                M = (max(abs([chanlocs]))); % Useful as a scaling factor for display purposes
                M = M(2);
                if isempty(OPTIONS.Axes)
                    PlotHandles.TopoPlot(mod).axes{iSet} = ...
                        subplot(length(OPTIONS.Modality),nDispTypes*nSets,nSets*(ColumnLayout+ OverlayAllChannels) + iSet);
                else
                    PlotHandles.TopoPlot(mod).axes{iSet} = OPTIONS.Axes;
                end
                hold on
            else
                if isempty(OPTIONS.Axes)
                    PlotHandles.TopoPlot(mod).axes{iSet} = ...
                    subplot(length(OPTIONS.Modality),nDispTypes*nSets,nDispTypes*nSets + nSets*(ColumnLayout + OverlayAllChannels) + iSet);
                else
                    PlotHandles.TopoPlot(mod).axes{iSet} = OPTIONS.Axes;
                end
                
                hold on
                pos1 = get(PlotHandles.TopoPlot(mod-1).axes{iSet},'Position');
                pos2 = get(PlotHandles.TopoPlot(mod).axes{iSet},'Position');
            end
            PlotHandles.TopoPlot(mod).Colorbar{iSet} = [];
            set(PlotHandles.TopoPlot(mod).axes{iSet},'Visible','off')
            
            tindx = findclosest(OPTIONS.CurrentTime,OPTIONS.Time');
            
            switch(OPTIONS.DisplayTypes(3)) 
            case 1 % Do nothing
            case 2 % Spherical approximation of the scalp
                if ~ishandle(OPTIONS.hSurface(iSet))
                    if iSet == 1
                        [PlotHandles.PChanLocs{mod},hsens,hsph,CData,Wmat] = carto_sph(chanlocs,F(OPTIONS.SelectedChannels{mod},tindx));
                        PlotHandles.TopoPlot(mod).surf{iSet} = hsph;
                        PlotHandles.TopoPlot(mod).Wmat{iSet} = Wmat;
                        %PlotHandles.TopoPlot(mod).hsens{iSet} = hsens;
                        clear hpsh Wmat hsens;
                    else % Just copy previous surface object (much faster display !)
                        PlotHandles.TopoPlot(mod).surf{iSet} = copyobj(PlotHandles.TopoPlot(mod).surf{1},PlotHandles.TopoPlot(mod).axes{iSet});
                        PlotHandles.TopoPlot(mod).Wmat{iSet} = PlotHandles.TopoPlot(mod).Wmat{1};
                        %PlotHandles.TopoPlot(mod).hsens{iSet} = PlotHandles.TopoPlot(mod).hsens{1};
                        CData = PlotHandles.TopoPlot(mod).Wmat{iSet}*F(OPTIONS.SelectedChannels{mod},tindx);
                        CData = reshape(CData,sqrt(length(CData)),sqrt(length(CData)));
                        CData = CData * max(abs(F(OPTIONS.SelectedChannels{mod},tindx)))/max(abs(CData(:))); % pr
                        set( PlotHandles.TopoPlot(mod).surf{iSet} ,'CData',CData); clear CData
                    end
                else
                    CData = OPTIONS.TopoPlot(mod).Wmat{iSet}*F(OPTIONS.SelectedChannels{mod},tindx);
                    set(OPTIONS.hSurface(iSet),'CData',CData); clear CData
                end
                
                if OPTIONS.SensorMarkers & ~ishandle(OPTIONS.hSensors)
                    if iSet == 1
                        for kk = 1:size(PlotHandles.PChanLocs{mod}(:,1),1) % SB: I don't use scatter here because ButtonDownFcn is not effective as for Matlab 6.1
                            PlotHandles.TopoPlot(mod).hsens{iSet}(kk) = plot3(1.05*PlotHandles.PChanLocs{mod}(kk,1),1.05*PlotHandles.PChanLocs{mod}(kk,2),1.05*PlotHandles.PChanLocs{mod}(kk,3),...
                                '.','Markersize',2);
                        end
                    else % Just copy previous sensor markers (faster display)
                        PlotHandles.TopoPlot(mod).hsens{iSet} = copyobj(PlotHandles.TopoPlot(mod).hsens{1},PlotHandles.TopoPlot(mod).axes{iSet});
                    end
                    
                end
                if OPTIONS.SensorLabels
                    if iSet == 1
                        for  kk = 1:size(PlotHandles.PChanLocs{mod}(:,1),1) % SB: I don't use scatter here because ButtonDownFcn is not effective as for Matlab 6.1
                            PlotHandles.TopoPlot(mod).SensorLabels{iSet}(kk) = text(1.05*PlotHandles.PChanLocs{mod}(kk,1),1.05*PlotHandles.PChanLocs{mod}(kk,2),1.05*PlotHandles.PChanLocs{mod}(kk,3),...
                                OPTIONS.Channel(OPTIONS.SelectedChannels{mod}(kk)).Name);
                        end
                    else
                        PlotHandles.TopoPlot(mod).SensorLabels{iSet} = copyobj(PlotHandles.TopoPlot(mod).SensorLabels{1},PlotHandles.TopoPlot(mod).axes{iSet});
                    end
                    
                end
                
            case 3 % Sensor Cap
                
                if iSet == 1
                    chanlocs(:,3)=chanlocs(:,3)-max(chanlocs(:,3));
                    [TH,PHI,R]=cart2sph(chanlocs(:,1),chanlocs(:,2),chanlocs(:,3));
                    %PHI2=zeros(size(PHI));
                    R2=R./cos(PHI).^.2;
                    [Y,X]=pol2cart(TH,R2);
                    %Y et X sont les coordonnées projetees dans le plan 'tangent superieur' pour chaque capteur
                    bord = convhull(Y,X);
                    ncapt = size(chanlocs,1);
                    [center,R] = bestfitsph(chanlocs);
                    coordC = chanlocs-(ones(ncapt,1)*center');
                    tri = convhulln(coordC./(norlig(coordC)'*ones(1,3)));
                    keep = find(~(ismember(tri(:,1),bord) & ismember(tri(:,2),bord)& ismember(tri(:,3),bord)));
                    tri = tri(keep,:);
                    
                    PlotHandles.TopoPlot(mod).surf{iSet} = trisurf(tri,chanlocs(:,1),chanlocs(:,2),chanlocs(:,3),...
                        F(OPTIONS.SelectedChannels{mod},tindx));
                    
                    hold on
                    set(PlotHandles.TopoPlot(mod).surf{iSet},'edgecolor','none','facecolor','interp')
                else
                    PlotHandles.TopoPlot(mod).surf{iSet} = copyobj(PlotHandles.TopoPlot(mod).surf{1},PlotHandles.TopoPlot(mod).axes{iSet});
                    set( PlotHandles.TopoPlot(mod).surf{iSet} ,'FaceVertexCData',F(OPTIONS.SelectedChannels{mod},tindx)); 
                end
                
                
                if OPTIONS.SensorMarkers
                    if iSet == 1
                        for kk = 1:size(chanlocs,1) % SB: I don't use scatter here because ButtonDownFcn is not effective as for Matlab 6.1
                            PlotHandles.TopoPlot(mod).hsens{iSet}(kk) = plot3(chanlocs(kk,1),chanlocs(kk,2),chanlocs(kk,3),'.');
                        end
                    else
                        PlotHandles.TopoPlot(mod).hsens{iSet} = copyobj(PlotHandles.TopoPlot(mod).hsens{1},PlotHandles.TopoPlot(mod).axes{iSet});
                    end
                    
                end
                if OPTIONS.SensorLabels
                    if iSet == 1
                        for  kk = 1:size(PlotHandles.PChanLocs{imod}(:,1),1) % SB: I don't use scatter here because ButtonDownFcn is not effective as for Matlab 6.1
                            PlotHandles.TopoPlot(mod).SensorLabels{iSet}(kk) = text(chanlocs(kk,1),chanlocs(kk,2),chanlocs(kk,3),...
                                OPTIONS.Channel(OPTIONS.SelectedChannels{mod}(kk)).Name);
                        end
                    else
                        PlotHandles.TopoPlot(mod).SensorLabels{iSet} = copyobj(PlotHandles.TopoPlot(mod).SensorLabels{1},PlotHandles.TopoPlot(mod).axes{iSet});    
                    end
                    
                end
                
            case 4 % Scalp Surface
                
                % Load scalp envelope information
                [TessFile,h] = bst_static_taskbar('GET','TESS'); clear h
                if isempty(TessFile)
                    errordlg('No tessellated envelope is available for this subject. Please edit this subject''s entry in database')
                    return
                end
                
                bst_message_window('wrap',{...
                        ' ',...
                        sprintf('Loading %s tessellation file',TessFile)});
                Users = get_user_directory;
                load(fullfile(Users.SUBJECTS,TessFile),'Comment')
                
                PlotHandles.TopoPlot(mod).iGrid = 1;
                
                if length(Comment)>1 % Several surfaces in this tessellation file
                    [PlotHandles.TopoPlot(mod).iGrid,OK] = listdlg('PromptString','Select an envelope from list:',...
                        'SelectionMode','single',...
                        'ListString',Comment);
                    if OK == 0
                        return
                    end
                end
                  
                PlotHandles.TopoPlot(mod).SurfaceName{iSet} = Comment{PlotHandles.TopoPlot(mod).iGrid};
                clear Comment
              
                load(fullfile(Users.SUBJECTS,TessFile),'Faces','Vertices')
                Faces = Faces{PlotHandles.TopoPlot(mod).iGrid};
                Vertices = Vertices{PlotHandles.TopoPlot(mod).iGrid}';
                % Warn user if tessellation is huge
                if size(Vertices,1) > 20000
                    ButtonName = questdlg({sprintf('Tessellation has %d vertices; computation time for rendering might be excessive.',size(Vertices,1)),'Do you still want to proceed ?'},'Long computation expected','Yes','No','No');
                    switch(ButtonName)
                    case 'No'
                        return
                    end
                end
                
                % Load scalp envelope information <- DONE
                
                PlotHandles.PChanLocs{mod} = chanlocs_orig;
                %                 % Project sensor locations on scalp envelope
                %                 j = 0; minn = []; imin = [];
                %                 for chan = 1:size(chanlocs_orig,1) 
                %                     celec = ones(size(Vertices,1),1)*chanlocs_orig(chan,:);
                %                     dist = norlig(Vertices-celec);
                %                     [minn(chan) imin(chan)] = min(dist);
                %                 end
                %                 PlotHandles.PChanLocs{mod} = [Vertices(imin,1),Vertices(imin,2),Vertices(imin,3)];
                
                
                axes(PlotHandles.TopoPlot(mod).axes{iSet})
                PlotHandles.TopoPlot(mod).surf{iSet} = patch('faces',Faces,'vertices',Vertices);  clear Faces              
                set(PlotHandles.TopoPlot(mod).surf{iSet},'visible','off')
                
                %vertxcolor = interp_mail(Vertices,PlotHandles.PChanLocs{mod},F(OPTIONS.SelectedChannels{mod},tindx));
                bst_message_window('wrap',{...
                        '-',...
                        'Interpolating data on scalp surface. . .',...
                        '-'})

                allfigs = findobj(0,'type','figure'); % Find all figures in workspace...
                     
                [vertxcolor,PlotHandles.TopoPlot(mod).Wmat{iSet}] = interp_mail(Vertices,PlotHandles.PChanLocs{mod},F(OPTIONS.SelectedChannels{mod},tindx));
                bst_message_window('wrap',...
                        '-> Done')

                
                set(PlotHandles.TopoPlot(mod).surf{iSet},'FaceVertexCData',vertxcolor,'facecolor','interp','edgecolor','none','backfacelighting','unlit','visible','on');
                material dull, lighting none
                %camlight 
                            
                if OPTIONS.SensorMarkers
                    if iSet == 1
                        for kk = 1:size(chanlocs,1) % SB: I don't use scatter here because ButtonDownFcn is not effective as for Matlab 6.1
                            PlotHandles.TopoPlot(mod).hsens{iSet}(kk) = plot3(chanlocs_orig(kk,1),chanlocs_orig(kk,2),chanlocs_orig(kk,3),'.');
                        end
                    else
                        PlotHandles.TopoPlot(mod).hsens{iSet} = copyobj(PlotHandles.TopoPlot(mod).hsens{1},PlotHandles.TopoPlot(mod).axes{iSet});
                    end
                    
                end
                
                if OPTIONS.SensorLabels
                    if iSet == 1
                        for  kk = 1:size(PlotHandles.PChanLocs{imod}(:,1),1) % SB: I don't use scatter here because ButtonDownFcn is not effective as for Matlab 6.1
                            PlotHandles.TopoPlot(mod).SensorLabels{iSet}(kk) = text(chanlocs_orig(kk,1),chanlocs_orig(kk,2),chanlocs_orig(kk,3),...
                                OPTIONS.Channel(OPTIONS.SelectedChannels{mod}(kk)).Name);
                        end
                    else
                        PlotHandles.TopoPlot(mod).SensorLabels{iSet} = copyobj(PlotHandles.TopoPlot(mod).SensorLabels{1},PlotHandles.TopoPlot(mod).axes{iSet});    
                    end
                end
                
                camlight 
                lighting gouraud
                
            case 5 % Disc
                
                if iSet == 1
                    [PlotHandles.PChanLocs{mod},hsens,c,CData,e] = carto_sph(chanlocs,F(OPTIONS.SelectedChannels{mod},tindx));
                    PlotHandles.TopoPlot(mod).surf{iSet} = c;
                    PlotHandles.TopoPlot(mod).Wmat{iSet} = e; clear c e
                    
                    xs = get(PlotHandles.TopoPlot(mod).surf{iSet},'XData');
                    ys = get(PlotHandles.TopoPlot(mod).surf{iSet},'YData');
                    zs = get(PlotHandles.TopoPlot(mod).surf{iSet},'ZData');
                    
                    chanlocs = [xs(:),ys(:),zs(:)];
                    chanlocs(:,3) =  chanlocs(:,3) - max(chanlocs(:,3));
                    
                    [TH,PHI,R] = cart2sph(chanlocs(:,1),chanlocs(:,2),chanlocs(:,3));
                    R2 = R./cos(PHI).^.2;
                    [Y,X] = pol2cart(TH,R2);
                    
                    tri = delaunay(Y,X);
                    PlotHandles.TopoPlot(mod).surf{iSet} = patch('faces',tri,'vertices',[Y,X,0*X],'CData',get(PlotHandles.TopoPlot(mod).surf{iSet},'CData'),'edgecolor','none',...
                        'FaceColor','interp');
                    PlotHandles.TopoPlot(mod).Yo{iSet} = Y; 
                    PlotHandles.TopoPlot(mod).Xo{iSet} = X;
                    
                else
                    
                    PlotHandles.TopoPlot(mod).surf{iSet} = copyobj(PlotHandles.TopoPlot(mod).surf{1},PlotHandles.TopoPlot(mod).axes{iSet});
                    PlotHandles.TopoPlot(mod).Wmat{iSet} = PlotHandles.TopoPlot(mod).Wmat{1};
                    PlotHandles.TopoPlot(mod).Yo{iSet} = PlotHandles.TopoPlot(mod).Yo{1}(:); 
                    PlotHandles.TopoPlot(mod).Xo{iSet} = PlotHandles.TopoPlot(mod).Xo{1}(:);
                    
                    CData = PlotHandles.TopoPlot(mod).Wmat{iSet}*F(OPTIONS.SelectedChannels{mod},tindx);
                    CData = reshape(CData,sqrt(length(CData)),sqrt(length(CData)));
                    CData = CData * max(abs(F(OPTIONS.SelectedChannels{mod},tindx)))/max(abs(CData(:))); 
                    set( PlotHandles.TopoPlot(mod).surf{iSet},'CData',CData); 
                    
                end
                
                
                PlotHandles.PChanLocs{mod}(:,3) =  PlotHandles.PChanLocs{mod}(:,3) - max(PlotHandles.PChanLocs{mod}(:,3));
                [TH,PHI,R] = cart2sph(PlotHandles.PChanLocs{mod}(:,1),PlotHandles.PChanLocs{mod}(:,2),PlotHandles.PChanLocs{mod}(:,3));
                R2 = R./cos(PHI).^.2;
                [Y,X] = pol2cart(TH,R2);
                
                if OPTIONS.SensorMarkers
                    if iSet == 1
                        for kk = 1:length(Y) % SB: I don't use scatter here because ButtonDownFcn is not effective as for Matlab 6.1
                            PlotHandles.TopoPlot(mod).hsens{iSet}(kk) = plot3(Y(kk),X(kk),0.05,'.');
                        end
                    else
                        PlotHandles.TopoPlot(mod).hsens{iSet} = copyobj(PlotHandles.TopoPlot(mod).hsens{1},PlotHandles.TopoPlot(mod).axes{iSet});                        
                    end
                end
                if OPTIONS.SensorLabels
                    if iSet == 1
                        for  kk = 1:length(Y) % SB: I don't use scatter here because ButtonDownFcn is not effective as for Matlab 6.1
                            PlotHandles.TopoPlot(mod).SensorLabels{iSet}(kk) = text(Y(kk),X(kk),0.05,...
                                OPTIONS.Channel(OPTIONS.SelectedChannels{mod}(kk)).Name);
                        end
                    else
                        PlotHandles.TopoPlot(mod).SensorLabels{iSet} = copyobj(PlotHandles.TopoPlot(mod).SensorLabels{1},PlotHandles.TopoPlot(mod).axes{iSet});    
                    end
                end
                
                if OPTIONS.ShowContours % Add contour plot
                    n = sqrt(size(PlotHandles.TopoPlot(mod).Yo{iSet},1));
                    PlotHandles.TopoPlot(mod).Yo{iSet} = reshape(PlotHandles.TopoPlot(mod).Yo{iSet},n,n);
                    PlotHandles.TopoPlot(mod).Xo{iSet} = reshape(PlotHandles.TopoPlot(mod).Xo{iSet},n,n);
                    [PlotHandles.TopoPlot(mod).Contour{iSet}.C,PlotHandles.TopoPlot(mod).Contour{iSet}.H] = contour(PlotHandles.TopoPlot(mod).Yo{iSet},...
                        PlotHandles.TopoPlot(mod).Xo{iSet},...
                        CData,'w-');
                end 
                
                
            case 6 % 2D Sensor Cap
                
                if iSet == 1
                    chanlocs(:,3)=chanlocs(:,3)-max(chanlocs(:,3));
                    [TH,PHI,R]=cart2sph(chanlocs(:,1),chanlocs(:,2),chanlocs(:,3));
                    R2=R./cos(PHI).^.2;
                    [Y,X]=pol2cart(TH,R2);
                    %Y et X sont les coordonnées projetees dans le plan
                    %'tangent superieur' pour chaque capteur
                    tri = delaunay(Y,X);
                    PlotHandles.TopoPlot(mod).surf{iSet} = patch('faces',tri,'vertices',[Y,X,0.0*ones(size(Y))],'FaceVertexCData',F(OPTIONS.SelectedChannels{mod},tindx),...
                        'edgecolor','none',...
                        'FaceColor','interp');
                    
                    set(PlotHandles.TopoPlot(mod).surf{iSet},'edgecolor','none','facecolor','interp')
                else
                    PlotHandles.TopoPlot(mod).surf{iSet} = copyobj(PlotHandles.TopoPlot(mod).surf{1},PlotHandles.TopoPlot(mod).axes{iSet});
                    set( PlotHandles.TopoPlot(mod).surf{iSet} ,'FaceVertexCData',F(OPTIONS.SelectedChannels{mod},tindx)); 
                end
                
                % Use plot3 here as a trick to let the sensor markers be visible
                if OPTIONS.SensorMarkers
                    if iSet == 1
                        for kk = 1:length(Y) % SB: I don't use scatter here because ButtonDownFcn is not effective as for Matlab 6.1
                            PlotHandles.TopoPlot(mod).hsens{iSet}(kk) = plot3(Y(kk),X(kk),0.05,'.');
                        end
                    else
                        PlotHandles.TopoPlot(mod).hsens{iSet} = copyobj(PlotHandles.TopoPlot(mod).hsens{1},PlotHandles.TopoPlot(mod).axes{iSet});                        
                    end
                end
                if OPTIONS.SensorLabels
                    if iSet == 1
                        for  kk = 1:length(Y) % SB: I don't use scatter here because ButtonDownFcn is not effective as for Matlab 6.1
                            PlotHandles.TopoPlot(mod).SensorLabels{iSet}(kk) = text(Y(kk),X(kk),0.05,...
                                OPTIONS.Channel(OPTIONS.SelectedChannels{mod}(kk)).Name);
                        end
                    else
                        PlotHandles.TopoPlot(mod).SensorLabels{iSet} = copyobj(PlotHandles.TopoPlot(mod).SensorLabels{1},PlotHandles.TopoPlot(mod).axes{iSet});    
                    end
                end
                
                
            case 7 % 2D layout of time series
                
                timescale = 10;
                
                chanlocs = chanlocs'; % Pasted here some older code with different array arrangement for channel locations (CBB) 
                
                minn = min(chanlocs')';
                maxx = max(chanlocs')';
                chanlocs(3,:) =  chanlocs(3,:) - maxx(3);
                
                [TH,PHI,R] = cart2sph(chanlocs(1,:),chanlocs(2,:),chanlocs(3,:));
                PHI2 = zeros(size(PHI));
                R2 = R./cos(PHI).^.2;
                
                [Y,X] = pol2cart(TH,R2);
                dat = F(OPTIONS.SelectedChannels{mod},:);
                M = max(abs(dat(:)));
                
                My = max(abs(Y));
                Mx = max(abs(X));
                Mt = OPTIONS.Time(end)-OPTIONS.Time(1);                
                
                
                for i = 1:length(OPTIONS.SelectedChannels{mod})
                    dat = F(OPTIONS.SelectedChannels{mod}(i),:);
                    PlotHandles.TopoPlot(mod).Lines{iSet}(i) = plot(Mx*[OPTIONS.Time]/(timescale*Mt)-X(i),(My*dat/(10*M)+Y(i)),'color','w');
                    %set(h,'ButtondownFcn','dataplot_cb line_select')
                    hold on
                    ttl = text(Mx*OPTIONS.Time(1)/(timescale*Mt)-X(i),.5*My*M/(10*M)+Y(i),OPTIONS.Channel(OPTIONS.SelectedChannels{mod}(i)).Name);
                    set(ttl,'fontsize',8,'color',.8*[1 1 1])
                end
                axis equal
                axis off
                
                OPTIONS.SensorMarkers = 0;   % Unrelevant for 2D layout
                OPTIONS.SensorLabels = 0;   % Unrelevant for 2D layout
                OPTIONS.Colorbar = 0;    
            end
            
            
            switch(OPTIONS.DisplayTypes(3)) 
            case{2}
                CData = get(PlotHandles.TopoPlot(mod).surf{iSet},'CData');
                CData = CData * max(abs(F(OPTIONS.SelectedChannels{mod},tindx)))/max(abs(CData(:))); % properly rescale to data amplitude
                set(PlotHandles.TopoPlot(mod).surf{iSet},'CData',CData);
            end
            
            if OPTIONS.AbsoluteColormap 
                tmp = max(abs(F(OPTIONS.SelectedChannels{mod},tindx)));
                caxis([-tmp tmp]), clear tmp
            else
                if OPTIONS.DataType == 1
                    %                     tmp = [OPTIONS.Fmax{:}]; % Regular surface data topography
                    %                     tmp = reshape(tmp,3,nSets)';
                    %                     maxData(mod) = max(tmp(:,mod));
                    maxData(mod) = max(OPTIONS.Fmax(:,mod));
                    
                else OPTIONS.DataType = 2; % Source independent topography
                    maxData(mod) = Topo_maxx;
                end
                %caxis([-OPTIONS.Fmax(mod) OPTIONS.Fmax(mod)]),
                caxis([-maxData(mod) maxData(mod)]);
            end
            
            axis equal, axis tight, axis vis3d
            
            xx = get(gca,'Xlim'); 
            yy = get(gca,'Ylim'); 
            if nSets == 1
                sstring = OPTIONS.ModalityLabel{imod};
            elseif nSets > 1
                sstring = {OPTIONS.ModalityLabel{imod},OPTIONS.WaveLabel{iSet}};
            end
            
            text(1.1*yy(2),xx(2),sstring,'FontUnits','Points','Fontsize',fontsize,'HorizontalAlignment','left','Color','w','VerticalAlignment','bottom')
            
            if OPTIONS.SensorMarkers
                if all(ishandle(PlotHandles.TopoPlot(mod).hsens{iSet})) % Sanity check | valid handles
                    set(PlotHandles.TopoPlot(mod).hsens{iSet},'Marker','o','markeredgecolor','w','markerfacecolor','none','markersize',3,...
                        'ButtonDownFcn','dataplot_cb NameSelectedChannel','selected','off','Tag','Sensor') % Display channel Name when time series is selected
                end
            end
            
            if OPTIONS.SensorLabels
                if all(ishandle(PlotHandles.TopoPlot(mod).SensorLabels{iSet})) % Sanity check | valid handles
                    set(PlotHandles.TopoPlot(mod).SensorLabels{iSet},'HorizontalAlignment','center','Fontsize',fontsize,'fontunits','normal')
                end
            end
            
            if OPTIONS.Colorbar % Display Colorbar
                PlotHandles.TopoPlot(mod).Colorbar{iSet} = colorbar('horiz');
                set(PlotHandles.TopoPlot(mod).Colorbar{iSet},'fontsize',fontsize,'fontunits','normal')
                
                tmp = get(PlotHandles.TopoPlot(mod).axes{iSet},'CLim');
                
                if 1%OPTIONS.DataType == 1
                    if mod == 1
                        tmp = tmp/1e-15; % fT
                    else
                        tmp = tmp/1e-6; % microV
                    end
                    %                 elseif OPTIONS.DataType == 2
                    %                     tmp = tmp/1e-9; % nAm
                end
                
                
                m = num2str(tmp(2),2);
                [m,e] = strtok(m,'e');
                e = str2num(['1',e]);
                m = str2num(m);
                
                tmp2 = linspace(-m*e,m*e,3)';
                tmp2(abs(tmp2)<0.001) = 0;
                YtickLabel = num2str(tmp2,'%3.0f');
                
                Ytick = linspace(-tmp(2),tmp(2),3)';
                a = get(PlotHandles.TopoPlot(mod).Colorbar{iSet},'Children');
                set(a,'Xdata',tmp)
                
                posSurfAxes = get( PlotHandles.TopoPlot(mod).axes{iSet},'Position');
                posColBarAxes = get( PlotHandles.TopoPlot(mod).Colorbar{iSet},'Position');
                
                set(PlotHandles.TopoPlot(mod).Colorbar{iSet},...
                    'Position',[posColBarAxes(1),posColBarAxes(2),posSurfAxes(3),posColBarAxes(4)],...
                    'Xaxislocation','bottom','Ticklength', [0 0],'Xlim',tmp,'Xtick',Ytick,'XTickLabel',YtickLabel,...
                    'Yaxislocation','right','Ytick',2,'fontunits','points') 
                
                if 1%OPTIONS.DataType == 1
                    if mod == 1
                        YTickLabel = 'fT';
                    else
                        YTickLabel = 'mV';
                    end
                    
                elseif OPTIONS.DataType == 2
                    YTickLabel = 'nAm';
                end
                
                set(PlotHandles.TopoPlot(mod).Colorbar{iSet},'YtickLabel',YTickLabel)
                
            end
            
            
            if isfield(PlotHandles.TopoPlot(mod),'surf')
                if ishandle(PlotHandles.TopoPlot(mod).surf{iSet})
                    set(PlotHandles.TopoPlot(mod).surf{iSet},'Visible','on')
                    view(-90,90) % depends on data type and coordinate system
                end
            end
            
            
            PlotHandles.TopoPlot(mod).timeText{iSet} = text(0.05,0.05,0,sprintf('%3.1f ms',1000*OPTIONS.Time(tindx)),'units','normalized');
            set(PlotHandles.TopoPlot(mod).timeText{iSet},'fontweight','normal','color','w','Fontname','helvetica','Fontsize',8,'FontUnits','Point');
            
        end
        
        
    end
    
    if isempty(OPTIONS.Colormap)
    
        % Create Default BrainStorm Colormap 
        Wwidth = 0;  % Width of the white zero level
        Length = 64; % Number of color levels
        Cmin = .2;
        Cmax = .8;
        
        Half = floor(Length/2);    HLength = Half * 2;
        
        R1  = linspace(Cmin,Cmax,Half-Wwidth);
        R2  = ones(1,Wwidth*2);
        R3  = ones(1,Half-Wwidth)*Cmax;
        R   = [R1 R2 R3];
        B   = fliplr(R);
        G3  = fliplr(R1);
        G   = [R1 R2 G3];
        RBWmap = [R' G' B'];
        PlotHandles.Colormap = RBWmap;
        colormap(PlotHandles.Colormap)
        
        OPTIONS.Colormap = PlotHandles.Colormap;
        
    else % User has specified a colormap

        colormap(OPTIONS.Colormap)
        
    end
    
end


switch OPTIONS.MoveCursor
case 'on'
    set(PlotHandles.TimeCursor,'color','r','Tag','TimeCursor','Visible','on','ButtonDownFcn','dataplot_cb MoveTimeCursor start')
    set(PlotHandles.TimeZeroLine,'color',.8*[1 1 1],'Tag','TimeZeroLine','linewidth',1,...
        'linestyle','--','Visible','on')
    set([PlotHandles.TimeCursor],'EraseMode','xor')
end


if nargout == 1
    varargout{1} = PlotHandles;
elseif nargout == 2
    varargout{1} = PlotHandles;
    varargout{2} = OPTIONS;
end

makeuswait('stop')

Produced by color_mat2html, a customized BrainStorm 2.0 (Alpha) version of mat2html on Tue Oct 12 12:05:14 2004
Cross-Directory links are: ON