www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/wmultisig1d/wmuldentool.m

    function varargout = wmuldentool(varargin)
%WMULDENTOOL Wavelet Multivariate Denoising GUI.
%   VARARGOUT = WMULDENTOOL(VARARGIN)

% Last Modified by GUIDE v2.5 04-Sep-2006 13:21:29
%
%   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 29-Mar-2005.
%   Last Revision: 21-Jul-2013.
%   Copyright 1995-2013 The MathWorks, Inc.
%   $Revision: 1.1.6.14 $ $Date: 2013/08/23 23:46:08 $  

%*************************************************************************%
%                BEGIN initialization code - DO NOT EDIT                  %
%                ----------------------------------------                 %
%*************************************************************************%
gui_Singleton = 0;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @wmuldentool_OpeningFcn, ...
                   'gui_OutputFcn',  @wmuldentool_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
%*************************************************************************%
%                END initialization code - DO NOT EDIT                    %
%*************************************************************************%


%*************************************************************************%
%                BEGIN Opening Function                                   %
%                ----------------------                                   %
% --- Executes just before wmuldentool is made visible.                   %
%*************************************************************************%
function wmuldentool_OpeningFcn(hObject,eventdata,handles)
% This function has no output args, see OutputFcn.

% Choose default command line output for wmuldentool
handles.output = hObject;

% Update handles structure
guidata(hObject,handles);

%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%
% TOOL INITIALISATION Introduced manually in the automatic generated code  %
%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%
Init_Tool(hObject,eventdata,handles);
%*************************************************************************%
%                END Opening Function                                     %
%*************************************************************************%

%*************************************************************************%
%                BEGIN Output Function                                    %
%                ---------------------                                    %
% --- Outputs from this function are returned to the command line.        %
%*************************************************************************%
function varargout = wmuldentool_OutputFcn(hObject,eventdata,handles) %#ok<INUSL>
% varargout  cell array for returning output args (see VARARGOUT);

% Get default command line output from handles structure
varargout{1} = handles.output;
%*************************************************************************%
%                END Output Function                                      %
%*************************************************************************%


%=========================================================================%
%                BEGIN Callback Functions                                 %
%                ------------------------                                 %
%=========================================================================%
function Pus_CloseWin_Callback(hObject,eventdata,handles) %#ok<DEFNU,INUSL>

hFig = handles.output;
hdl_Menus = wtbxappdata('get',hFig,'hdl_Menus');
m_save = hdl_Menus.m_save;
ena_Save = get(m_save,'Enable');
if isequal(lower(ena_Save),'on')
    status = wwaitans({hFig,getWavMSG('Wavelet:divGUIRF:WM_Pus_MUL_DEN')},...
        getWavMSG('Wavelet:mdw1dRF:Save_Den_Sigs_QUEST'),2,'Cancel');
    switch status
        case -1 , return;
        case  1
            wwaiting('msg',hFig,getWavMSG('Wavelet:commongui:WaitCompute'));
            save_FUN(m_save,eventdata,handles)
            wwaiting('off',hFig);
        otherwise
    end
end
close(gcbf)
%--------------------------------------------------------------------------
function Load_Sig_Callback(hObject,eventdata,handles,varargin) %#ok<INUSL>

% Get figure handle.
%-------------------
hFig = handles.output;

% Testing and loading file.
%--------------------------
if nargin<4     % DIRECT LOAD
    [filename,pathname] = uigetfile( ...
       {'*.mat',getWavMSG('Wavelet:moreMSGRF:LoadSave_MultiSig')'; ...
       '*.*', getWavMSG('Wavelet:moreMSGRF:Save_DLG_ALL')}, ...
       getWavMSG('Wavelet:mdw1dRF:LoadSigs'));
    if ~isequal(filename,0) && ~isequal(pathname,0)
        fullName = fullfile(pathname,filename);
    else
        return
    end
    okFile = true;
    
elseif isequal(varargin{1},'wrks') % LOAD from WORKSPACE
    [sig_ORI,sig_Name,ok] = wtbximport('wmul');
    if ~ok ,  return; end
    filename = sig_Name;
    fullName = '';
    varSize = size(sig_ORI);
    okFile = false;
    
else            % DEMO LOAD
    filename = [varargin{1},'.mat'];
    fullName = filename;
    okFile = true;    
end

try
    err = 0;
    if okFile
        dataInfo = whos('-file',fullName);
        dataInfoCell = struct2cell(dataInfo);
        idx = find(strcmp(dataInfoCell(1,:),'x'));
        if isempty(idx)
            idx = find(strcmp(dataInfoCell(1,:),'X'));
            if isempty(idx) , idx = 1; end
        end
        varNam  = dataInfoCell{1,idx};
        varSize = dataInfoCell{2,idx};
        data    = load(fullName,'-mat');
        sig_ORI = data.(varNam);
    end
    [nbSIG,direct] = min(varSize);
    if direct==1 , sig_ORI = sig_ORI'; end
    lenSIG = size(sig_ORI,1);
catch %#ok<*CTCH>
    err = 1;
end
if err, return; end

data_INFO = struct(...
    'sig_ORI',sig_ORI,'dec_ORI',[],     ...
    'sig_DEN',[],'dec_DEN',[],          ...
    'sig_ORI_ADAP',[],'dec_ORI_ADAP',[],...
    'sig_DEN_ADAP',[],'dec_DEN_ADAP',[] ...
    );
wtbxappdata('set',hFig,'data_INFO',data_INFO);

% Cleaning.
%----------
wwaiting('msg',hFig,getWavMSG('Wavelet:commongui:WaitClean'));
clean_TOOL(handles,'load',nbSIG)

% Set Axes.
%----------
Initialize_Axes(handles,nbSIG);
axe_SIG   = handles.Axe_SIG;
axe_CFS   = handles.Axe_CFS;
axe_DEN   = handles.Axe_DEN;
lin_SIG   = NaN(1,nbSIG);
lin_DEN   = NaN(1,nbSIG);
lin_SIG_A = NaN(1,nbSIG);
lin_DEN_A = NaN(1,nbSIG);

% Plots Signals.
%---------------
maxSIG = max(sig_ORI,[],1);
minSIG = min(sig_ORI,[],1);
maxSIG = maxSIG + 0.01*abs(maxSIG);
minSIG = minSIG - 0.01*abs(minSIG);
Ylim   = [minSIG;maxSIG]';
[sigColor,denColor] = wtbutils('colors','wmden');
for k = 1:nbSIG
    axeCur = axe_SIG(k);
    set(axeCur,'NextPlot','add');
    lin_SIG(k) = plot(sig_ORI(:,k),'Color',sigColor,'Parent',axeCur);
    txtinaxe('create',int2str(k),axeCur,'l','on','bold',12,30); 
    lin_DEN(k) = plot(sig_ORI(:,k),...
        'Color',denColor,'Visible','Off','LineWidth',2,'Parent',axeCur);
    set(axe_SIG(k),'YLim',Ylim(k,:));    
end
set([axe_SIG,axe_CFS,axe_DEN],'XLim',[1,lenSIG]);
set(axe_SIG,'XtickMode','auto','YtickMode','auto');
title(getWavMSG('Wavelet:mdw1dRF:Str_Signals'),...
    'Visible','On','Parent',axe_SIG(1))
hdl_INFO = struct(...
    'lin_SIG',lin_SIG,'lin_DEN',lin_DEN,...
    'lin_SIG_A',lin_SIG_A,'lin_DEN_A',lin_DEN_A);
wtbxappdata('set',hFig,'hdl_INFO',hdl_INFO);
axe_IND = [];
axe_CMD = [axe_SIG,axe_CFS,axe_DEN];
axe_ACT = [];
dynvtool('init',hFig,axe_IND,axe_CMD,axe_ACT,[1 0],'','','','real');

% Setting GUI values and Analysis parameters.
%--------------------------------------------
max_lev_anal = 8;
levm   = wmaxlev(lenSIG,'haar');
levmax = min(levm,max_lev_anal);
[curlev,curlevMAX] = cbanapar('get',hFig,'lev','levmax');
if levmax<curlevMAX
    cbanapar('set',hFig, ...
        'lev',{'String',int2str((1:levmax)'),'Value',min(levmax,curlev)} ...
        );
end
n_s = [filename '  (' , int2str(lenSIG) 'x' int2str(nbSIG) ')'];
set(handles.Edi_Data_NS,'String',n_s);                
set(handles.Pus_Decompose,'Enable','On')

% End waiting.
%-------------
wwaiting('off',hFig);
%--------------------------------------------------------------------------
function Pus_Decompose_Callback(hObject,eventdata,handles) %#ok<INUSL>

% Get figure handle.
%-------------------
hFig = handles.output;

% Wavelet decomposition Parameters.
%----------------------------------
[wname,level] = cbanapar('get',hFig,'wav','lev');
popMode  = handles.Pop_Ext_Mode;
lst = get(popMode,'String');
extMode = lst{get(popMode,'Value')};

% Cleaning.
%----------
wwaiting('msg',hFig,getWavMSG('Wavelet:commongui:WaitClean'));
clean_TOOL(handles,'beg_dec',level)

% Wavelet decomposition of columns of sig_ORI.
%--------------------------------------------
data_INFO = wtbxappdata('get',hFig,'data_INFO');
sig_ORI   = data_INFO.sig_ORI;
[data_INFO.dec_ORI,PCA_Params] = ...
    wmulden('estimate',sig_ORI,level,wname,'mode',extMode);
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
pc = PCA_Params.NEST{1};
sig_ORI_ADAP = sig_ORI*pc;
data_INFO.dec_ORI_ADAP = ...
    mdwtdec('col',sig_ORI_ADAP,level,wname,'mode',extMode);
data_INFO.sig_ORI_ADAP = sig_ORI_ADAP;
wtbxappdata('set',hFig,'data_INFO',data_INFO);
wtbxappdata('set',hFig,'PCA_Params',PCA_Params);
%.........................................................................

% Plots Signals in Adapted Basis.
%--------------------------------
[lenSIG,nbSIG] = size(sig_ORI);
axe_SIG = handles.Axe_SIG_ADAP;
axe_CFS = handles.Axe_CFS_ADAP;
axe_DEN = handles.Axe_DEN_ADAP;
hdl_INFO = wtbxappdata('get',hFig,'hdl_INFO');
lin_SIG = hdl_INFO.lin_SIG_A;
lin_DEN = hdl_INFO.lin_DEN_A;
[sigColor,denColor] = wtbutils('colors','wmden');
if ishandle(lin_SIG(1))
    for k = 1:nbSIG
        set([lin_SIG(k),lin_DEN(k)],'YData',sig_ORI_ADAP(:,k));
    end
else
    for k = 1:nbSIG
        axeCur = axe_SIG(k);
        set(axeCur,'NextPlot','add')
        lin_SIG(k) = ...
            plot(sig_ORI_ADAP(:,k),'Color',sigColor,'Parent',axeCur);
        lin_DEN(k) = plot(sig_ORI_ADAP(:,k),...
            'Color',denColor,'Visible','Off','LineWidth',2,'Parent',axeCur);
    end
end
set([axe_SIG,axe_CFS,axe_DEN],'XLim',[1,lenSIG]);
set(axe_SIG,'XtickMode','auto','YtickMode','auto');
title(getWavMSG('Wavelet:mdw1dRF:Str_Signals'),...
    'Visible','On','Parent',axe_SIG(1))
hdl_INFO.lin_SIG_A = lin_SIG;
hdl_INFO.lin_DEN_A = lin_DEN;
wtbxappdata('set',hFig,'hdl_INFO',hdl_INFO);
%.........................................................................
plot_Decomposition(handles,'ORI','ADAP');
plot_Decomposition(handles,'ORI','ORI');
%.........................................................................
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

% End waiting.
%-------------
clean_TOOL(handles,'end_dec')
wwaiting('off',hFig);
%--------------------------------------------------------------------------
function Rad_THR_Callback(hObject,eventdata,handles) %#ok<INUSL>

Rad_SOFT = handles.Rad_SOFT;
Rad_HARD = handles.Rad_HARD;
if isequal(hObject,Rad_SOFT)
    set(Rad_SOFT,'Value',1,'UserData',1);
    set(Rad_HARD,'Value',0,'UserData',0);
else
    set(Rad_SOFT,'Value',0,'UserData',0);
    set(Rad_HARD,'Value',1,'UserData',1);    
end
%--------------------------------------------------------------------------
function Chk_PCA_Callback(hObject,eventdata,handles,val) %#ok<INUSL>

if nargin<4
    val = get(handles.Chk_PCA,'Value');
else
    set(handles.Chk_PCA,'Value',val);
end
if val==1 , ena_VAL = 'On'; else ena_VAL = 'Off'; end
UIC_to_Ena = [...
    handles.Pus_More_PCA, ...
    handles.Txt_NPC_APP,handles.Pop_NPC_APP, ...
    handles.Txt_NPC_FIN,handles.Pop_NPC_FIN ...        
    ];
set(UIC_to_Ena,'Enable',ena_VAL)
%--------------------------------------------------------------------------
function Pus_Denoise_Callback(hObject,eventdata,handles)

% Get figure handle.
%-------------------
hFig = handles.output;

% Cleaning.
%----------
wwaiting('msg',hFig,getWavMSG('Wavelet:commongui:WaitClean'));

% Get Wavelet Decomposition.
%---------------------------
data_INFO = wtbxappdata('get',hFig,'data_INFO');
dec = data_INFO.dec_ORI;

% Get Denoising Parameters.
%--------------------------
val_typeTHR = get(handles.Pop_THR_Meth,'Value');
val_S_or_H  = get(handles.Rad_SOFT,'Value');
PCA_is_ON = logical(get(handles.Chk_PCA,'Value'));
switch val_typeTHR
    case 1 , typeTHR = 'sqtwolog';
    case 2 , typeTHR = 'minimaxi';
    case 3 , typeTHR = 'rigrsure';
    case 4 , typeTHR = 'heursure';
    %---------------------------------------------------        
    % sliBMVal = 1 ==> 5;
    % switch meth
    %   case 'penalhi' , alfa = 5*(3*sliBMVal+1)/8;
    %   case 'penalme' , alfa = (sliBMVal+5)/4;
    %   case 'penallo' , alfa = (sliBMVal+3)/4;
    % end
    % case 'penal' , alpha = scal;  typeNOI = 'sln';
    %---------------------------------------------------        
    case 5 , typeTHR = 'penalhi';
    case 6 , typeTHR = 'penalme';
    case 7 , typeTHR = 'penallo';
    otherwise
        error(getWavMSG('Wavelet:FunctionArgVal:Invalid_ArgVal'));
end
switch val_S_or_H
    case 0 , S_or_H = 'h';
    case 1 , S_or_H = 's';
end

% Denoising and Storing
%----------------------
PCA_Params = wtbxappdata('get',hObject,'PCA_Params');
if PCA_is_ON
    npc_app = get(handles.Pop_NPC_APP,'Value')-1;
    npc_fin = get(handles.Pop_NPC_FIN,'Value')-1;   
else
    npc_app = Inf; npc_fin = Inf;
end
[x_den,~,~,dec_DEN,PCA_Params,DEN_Params] = ...
    wmulden('exec',dec,npc_app,npc_fin,PCA_Params,typeTHR,S_or_H);
wtbxappdata('set',hFig,'PCA_Params',PCA_Params);
wtbxappdata('set',hFig,'DEN_Params',DEN_Params);
[lenSIG,nbSIG] = size(x_den);
data_INFO.sig_DEN = x_den;
data_INFO.dec_DEN = dec_DEN;
sig_DEN_ADAP = x_den*PCA_Params.NEST{1};
data_INFO.dec_DEN_ADAP = ...
    mdwtdec('col',sig_DEN_ADAP,dec.level,dec.wname,'mode',dec.dwtEXTM);
data_INFO.sig_DEN_ADAP = sig_DEN_ADAP;
wtbxappdata('set',hFig,'data_INFO',data_INFO);

% Plot Denoised Signals.
%-----------------------
hdl_INFO = wtbxappdata('get',hFig,'hdl_INFO');
lin_DEN = hdl_INFO.lin_DEN;
[~,denColor] = wtbutils('colors','wmden');
dynvtool('get',hFig,0);
axe_SIG = handles.Axe_SIG;
axe_CFS = handles.Axe_CFS;
axe_DEN = handles.Axe_DEN;
for k = 1:nbSIG
    axeCur = axe_DEN(k);
    plot(x_den(:,k),'Color',denColor,'Parent',axeCur);
    set(lin_DEN(k),'YData',x_den(:,k));
    set(axeCur,'XLim',[1,lenSIG],'XtickMode','auto','YtickMode','auto');
end
title(getWavMSG('Wavelet:mdw1dRF:DenoSig'),...
    'Visible','On','Parent',axe_DEN(1))

%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% Plot Adapted Basis Denoised Signals.
%--------------------------------------
lin_DEN = hdl_INFO.lin_DEN_A;
axe_DEN_A = handles.Axe_DEN_ADAP;
for k = 1:nbSIG
    axeCur = axe_DEN_A(k);
    plot(sig_DEN_ADAP(:,k),'Color',denColor,'Parent',axeCur);
    set(lin_DEN(k),'YData',sig_DEN_ADAP(:,k));
end
set(axe_DEN_A,'XLim',[1,lenSIG],'XtickMode','auto','YtickMode','auto');
title(getWavMSG('Wavelet:mdw1dRF:DenoSig'),...
    'Visible','On','Parent',axe_DEN_A(1))
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
axe_IND = [];
axe_CMD = [axe_SIG,axe_CFS,axe_DEN];
axe_ACT = [];
dynvtool('init',hFig,axe_IND,axe_CMD,axe_ACT,[1 0],'','','','real');
hdl_Menus = wtbxappdata('get',hObject,'hdl_Menus');
UIC_Ena_ON = [...
    hdl_Menus.m_save,hdl_Menus.m_exp_wrks, ...
    handles.Chk_Show_DEN,handles.Pus_Residuals, ...
    handles.Rad_CFS_ORI,handles.Rad_CFS_DEN ...
    ];
set(UIC_Ena_ON,'Enable','On');
Chk_Show_DEN_Callback(handles.Chk_Show_DEN,eventdata,handles)

% End waiting.
%-------------
wwaiting('off',hFig);
%--------------------------------------------------------------------------
function Pus_Residuals_Callback(hObject,eventdata,handles,state) %#ok<DEFNU,INUSL>

% Get figure handle.
%-------------------
hFig = handles.output;

% Get UIC and MEN to Enable or to Deseable.
%------------------------------------------
utanaparHDL = findobj(handles.Pan_DAT_WAV,'Type','uicontrol');
utanaparHDL = setdiff(utanaparHDL,handles.Edi_Data_NS);
Pan_RES = handles.Pan_RESIDUALS;
hdl_Menus = wtbxappdata('get',hFig,'hdl_Menus');
OBJ_Ena_CHANGE = [...    
    hdl_Menus.m_load,hdl_Menus.m_demo, ...
    handles.Pus_Decompose,handles.Pus_More_ADAP,...
    handles.Rad_CFS_ORI,handles.Rad_CFS_DEN, ...
    handles.Txt_CFS_LEV,handles.Pop_CFS_LEV, ...    
    handles.Pus_CloseWin ...
    ];

% Set Residuals on/off.
%----------------------
axe_SIG = handles.Axe_SIG;
axe_CFS = handles.Axe_CFS;
axe_DEN = handles.Axe_DEN;
switch state
    case 0
        obj_VIS = [handles.Pan_DEN_PARAM,...
            handles.Rad_BASE_ORI,handles.Rad_BASE_ADAP, ...
            handles.Pus_More_ADAP, ...           
            handles.Pus_Residuals,handles.Pus_Denoise,...
            handles.Chk_Show_DEN,...
            handles.Rad_CFS_ORI,handles.Rad_CFS_DEN, ...
            handles.Txt_CFS_LEV,handles.Pop_CFS_LEV];
        visBASE = get(handles.Pan_BASE_ORI,'Visible');
        if strcmpi(visBASE,'on')
            plusVIS = [handles.Pan_BASE_ORI,handles.Pan_BASE_ADAP];
        else
            plusVIS = [handles.Pan_BASE_ADAP,handles.Pan_BASE_ORI];
        end
        obj_VIS = [obj_VIS , plusVIS];
        vis_IN_AXES = findobj([axe_SIG,axe_CFS,axe_DEN],'Visible','On');
        obj_VIS = [vis_IN_AXES;obj_VIS(:)];
        
    case 1
        RES_Params = wtbxappdata('get',hFig,'RES_Params');
end

switch state
    case 0
        OBJ_ena_VAL = 'Off';
        data_INFO = wtbxappdata('get',hFig,'data_INFO');
        sig_ORI = data_INFO.sig_ORI;
        sig_DEN = data_INFO.sig_DEN;
        sig_RES = sig_ORI-sig_DEN;
        [lenSIG,nbSIG] = size(sig_ORI);
        
        set(obj_VIS,'Visible','Off');
        dynvtool('get',hFig,0);
        set([Pan_RES,handles.Pan_RES_STATS],'Visible','On');
        set(handles.Pus_Close_RES,'Visible','On');
        set(handles.Pop_SIG_NUM,'String',int2str((1:nbSIG)'),'Value',1);
        Pop_SIG_NUM_Callback(handles.Pop_SIG_NUM,eventdata,handles,'init');

        % Displaying Residuals, Histograms & Cumulated Histograms.
        %---------------------------------------------------------
        nb_bins = 50;
        resColor = wtbutils('colors','res');
        [pos_axe_RES,pos_axe_HIS,pos_axe_CUM] = getPosAxes('res',hFig,nbSIG);
        axe_RES = zeros(1,nbSIG);
        axe_HIS = zeros(1,nbSIG);
        axe_CUM = zeros(1,nbSIG);
        txtAxeNum = zeros(1,nbSIG);
        for k = 1:nbSIG
            axe_RES(k) = axes('Parent',Pan_RES,'Position',pos_axe_RES(k,:)); %#ok<*LAXES>
            maxi = max(abs(sig_RES(:,k)));
            plot(sig_RES(:,k),'Color',resColor,'Parent',axe_RES(k))
            yLIM = 1.05*[-maxi,maxi];
            set(axe_RES(k),'YLim',yLIM,'YtickMode','auto');
            txtAxeNum(k) = txtinaxe('create',int2str(k),axe_RES(k), ...
                'l','on','bold',12,30);
            his       = wgethist(sig_RES(:,k),nb_bins);
            his(2,:)  = his(2,:)/lenSIG;
            axe_HIS(k) = axes('Parent',Pan_RES,'Position',pos_axe_HIS(k,:));
            wplothis(axe_HIS(k),his,resColor);
            for i=6:4:length(his(2,:));
                his(2,i)   = his(2,i)+his(2,i-4);
                his(2,i+1) = his(2,i);
            end
            axe_CUM(k) = axes('Parent',Pan_RES,'Position',pos_axe_CUM(k,:));
            wplothis(axe_CUM(k),[his(1,:);his(2,:)],resColor);
        end
        set(txtAxeNum(1),'Color','r')        
        set(axe_RES,'XLim',[1,lenSIG],'XtickMode','auto','YtickMode','auto');
        title(getWavMSG('Wavelet:commongui:Str_Residuals'),...
            'Visible','on','Tag','Residuals','Parent',axe_RES(1));
        title(getWavMSG('Wavelet:commongui:Str_HIST'),...
            'Visible','on','Tag','Histograms','Parent',axe_HIS(1));
        title(getWavMSG('Wavelet:commongui:Str_CumHistS'),...
            'Visible','on','Tag','CumHistograms','Parent',axe_CUM(1));
        
        RES_Params = struct('obj_VIS',obj_VIS,'axe_RES',axe_RES,...
            'axe_HIS',axe_HIS,'axe_CUM',axe_CUM,'txtAxeNum',txtAxeNum);
        wtbxappdata('set',hFig,'RES_Params',RES_Params);
        dynvtool('init',hFig,[],axe_RES,[],[1 0],'','','','real');
        
    case 1
        OBJ_ena_VAL = 'On';
        set([handles.Pan_RES_STATS,handles.Pan_RESIDUALS],'Visible','Off');
        delete([RES_Params.axe_RES,RES_Params.axe_HIS,RES_Params.axe_CUM]);
        axe_CMD = [axe_SIG,axe_CFS,axe_DEN];
        dynvtool('init',hFig,[],axe_CMD,[],[1 0],'','','','real');
        pause(0.2)
        set(RES_Params.obj_VIS(1:end-1),'Visible','On');
end
set(OBJ_Ena_CHANGE,'Enable',OBJ_ena_VAL)
set(utanaparHDL,'Enable',OBJ_ena_VAL)
%--------------------------------------------------------------------------
function Chk_Show_DEN_Callback(hObject,eventdata,handles,val) %#ok<INUSL>

if nargin<4
    val = get(hObject,'Value');
else
    set(hObject,'Value',val);
end
hdl_INFO = wtbxappdata('get',hObject,'hdl_INFO');
lin_DEN = [hdl_INFO.lin_DEN,hdl_INFO.lin_DEN_A];
lin_DEN = lin_DEN(ishandle(lin_DEN));
if val==1 , vis_VAL = 'On'; else vis_VAL = 'Off'; end
set(lin_DEN,'Visible',vis_VAL)
%--------------------------------------------------------------------------
function Pop_SIG_NUM_Callback(hObject,eventdata,handles,flag) %#ok<INUSD,INUSL>

errtol    = 1.0E-10;
nb_bins   = 75;
numSIG    = get(hObject,'Value');
data_INFO = wtbxappdata('get',hObject,'data_INFO');
sig_ORI = data_INFO.sig_ORI;
sig_DEN = data_INFO.sig_DEN;
sig_RES = sig_ORI-sig_DEN;
resVal    = sig_RES(:,numSIG);
mean_val  = mean(resVal);
max_val   = max(resVal);
min_val   = min(resVal);
range_val = max_val-min_val;
std_val   = std(resVal);
med_val   = median(resVal);
medDev_val = median(abs(resVal(:)-med_val));
if abs(medDev_val)<errtol , medDev_val = 0; end
meanDev_val = mean(abs(resVal(:)-mean_val));
if abs(meanDev_val)<errtol , meanDev_val = 0; end
his       = wgethist(resVal,nb_bins);
[~,imod] = max(his(2,:));
mode_val  = (his(1,imod)+his(1,imod+1))/2;

formNUM = '%7.4f';
set(handles.Edi_MEAN_DEV,'String',num2str(meanDev_val,formNUM));
set(handles.Edi_MAX,'String',num2str(max_val,formNUM));
set(handles.Edi_MIN,'String',num2str(min_val,formNUM));
set(handles.Edi_MODE,'String',num2str(mode_val,formNUM));
set(handles.Edi_MED,'String',num2str(med_val,formNUM));
set(handles.Edi_RANGE,'String',num2str(range_val,formNUM));
set(handles.Edi_STD,'String',num2str(std_val,formNUM));
set(handles.Edi_MED_DEV,'String',num2str(medDev_val,formNUM));
set(handles.Edi_MEAN,'String',num2str(mean_val,formNUM))
if nargin<4
    RES_Params = wtbxappdata('get',hObject,'RES_Params');
    txtAxeNum = RES_Params.txtAxeNum;
    set(txtAxeNum,'Color','k');
    set(txtAxeNum(numSIG),'Color','r');
end
%--------------------------------------------------------------------------
function Rad_BASIS_Callback(hObject,eventdata,handles,idx) %#ok<INUSL>

rad = [handles.Rad_BASE_ORI , handles.Rad_BASE_ADAP];
val = zeros(1,2);
old_VAL = get(rad(1),'UserData');
if nargin<4 , idx = 1; old_VAL = NaN; end
val(idx) = 1;
for k = 1:2 , set(rad(k),'Value',val(k)); end
if isequal(old_VAL,val) , return; end

set(rad,'UserData',val);
switch idx
    case 1 , Pan_ON = handles.Pan_BASE_ORI; Pan_OF = handles.Pan_BASE_ADAP;
    case 2 , Pan_OF = handles.Pan_BASE_ORI; Pan_ON = handles.Pan_BASE_ADAP;
end
usr = get(handles.Pop_CFS_LEV,'UserData');
set(Pan_OF,'Visible','Off');
set(Pan_ON,'Visible','On')
if ~isempty(usr) , set(handles.Pop_CFS_LEV,'Value',usr(idx)); end
%--------------------------------------------------------------------------
function Rad_CFS_Callback(hObject,eventdata,handles,typeCALL) %#ok<INUSL>

rad = [handles.Rad_CFS_ORI , handles.Rad_CFS_DEN];
switch lower(typeCALL)
    case {'ori','ini'} , val = [1 0];
    case 'den' ,         val = [0 1];      
end
for k = 1:2 , set(rad(k),'Value',val(k)); end
old_VAL = get(rad(1),'UserData');
set(rad,'UserData',val);
if isequal(old_VAL,val) || isequal(typeCALL,'ini'), return; end

plot_Decomposition(handles,typeCALL)
%--------------------------------------------------------------------------
function Pus_More_PCA_Callback(hObject,eventdata,handles) %#ok<DEFNU,INUSL>

typeCALL = get(hObject,'Type');
switch typeCALL
    case 'figure'
        fig     = hObject;
        hObject = get(fig,'UserData');
    otherwise
        fig = get(hObject,'UserData');
end
closeWIN = ~isempty(fig);
if closeWIN
    if ishandle(fig) , delete(fig); end
    strPUS = getWavMSG('Wavelet:mdw1dRF:Pus_More_PCA');
    fig = [];
else
    strPUS = getWavMSG('Wavelet:mdw1dRF:Pus_More_PCA_Close');
    PCA_Params = wtbxappdata('get',hObject,'PCA_Params');
    fig = wmuldentoolmopc(hObject,PCA_Params);
end
if ishandle(hObject)
    set(hObject,'String',strPUS,'UserData',fig);
else
    WfigPROP = handles.WfigPROP;
    try delete(WfigPROP.FigChild); end %#ok<*TRYNC>
end
%--------------------------------------------------------------------------
function Pus_More_ADAP_Callback(hObject,eventdata,handles) %#ok<INUSL,DEFNU>

typeCALL = get(hObject,'Type');
switch typeCALL
    case 'figure'
        fig     = hObject;
        hObject = get(fig,'UserData');
    otherwise
        fig = get(hObject,'UserData');
end
closeWIN = ~isempty(fig);
if closeWIN
    if ishandle(fig) , delete(fig); end
    strPUS = getWavMSG('Wavelet:mdw1dRF:Pus_More_Nois_ADAP');
    fig = [];
else
    strPUS = getWavMSG('Wavelet:mdw1dRF:Pus_More_Nois_ADAP_Close');
    PCA_Params = wtbxappdata('get',hObject,'PCA_Params');
    fig = wmuldentoolmonab(hObject,PCA_Params.NEST);
end
if ishandle(hObject)
    set(hObject,'String',strPUS,'UserData',fig);
else
    WfigPROP = handles.WfigPROP;
    try delete(WfigPROP.FigChild); end
end
%=========================================================================%
%                END Callback Functions                                   %
%=========================================================================%


%=========================================================================%
%                BEGIN Callback Menus                                     %
%=========================================================================%
function demo_FUN(hObject,eventdata,handles,numDEM)

switch numDEM
    case {1,2}
        fname = 'ex1mwden'; 
        wname = 'sym4';
        if numDEM==1 ,level = 5; else level = 3; end
        npc_app = 4; npc_fin = 4;
        
    case {3,4}
        fname = 'ex2mwden'; 
        wname = 'sym4';
        if numDEM==3 ,level = 5; else level = 3; end
        npc_app = 4; npc_fin = 4;
        
    case {5,6,7,8}
        fname = 'ex3mwden'; 
        wname = 'sym4';
        if numDEM==8 ,level = 5; else level = 3; end
        switch numDEM
            case 5 , npc_app = 4; npc_fin = 4;
            case 6 , npc_app = 2; npc_fin = 4;
            case 7 , npc_app = 2; npc_fin = 2;
            case 8 , npc_app = 2; npc_fin = 2;
        end
        
    case {9,10,11}
        fname = 'ex4mwden'; 
        wname = 'sym4'; level = 3;
        switch numDEM
            case 9  , npc_app = 4; npc_fin = 4; 
            case 10 , npc_app = 2; npc_fin = 4; 
            case 11 , npc_app = 2; npc_fin = 2;
        end

    case {12,13,14,15}
        wname = 'sym4'; level = 5; npc_app = 1; npc_fin = 1;
        switch numDEM
            case 12 , fname = 'ex1mdr'; 
            case 13 , fname = 'ex2mdr'; 
            case 14 , fname = 'ex3mdr'; 
            case 15 , fname = 'ex4mdr'; 
        end

    case {16,17,18,19,20}
        fname = 'ex5mwden';         
        wname = 'sym4'; level = 5;
        switch numDEM
            case 16 , npc_app = 8; npc_fin = 8;
            case 17 , npc_app = 6; npc_fin = 6;
            case 18 , npc_app = 4; npc_fin = 4;
            case 19 , npc_app = 2; npc_fin = 2;
            case 20 , npc_app = 5; npc_fin = 5;
        end
end

% Get figure handle.
%-------------------
hFig = handles.output;

% Cleaning.
%----------
wwaiting('msg',hFig,getWavMSG('Wavelet:commongui:WaitClean'));

% Loading Signals and Setting GUI.
%--------------------------------
Load_Sig_Callback(hObject,eventdata,handles,fname);

% Setting Analysis and Denoising parameters, Decomposition and Denoising.
%-----------------------------------------------------------------------
cbanapar('set',hFig,'wav',wname,'lev',level);
set(handles.Pop_THR_Meth,'Value',1);
Rad_THR_Callback(handles.Rad_SOFT,eventdata,handles)
Pus_Decompose_Callback(handles.Pus_Decompose,eventdata,handles);
Chk_PCA_Callback(hFig,eventdata,handles,1)
set(handles.Pop_NPC_APP,'Value',npc_app+1);
set(handles.Pop_NPC_FIN,'Value',npc_fin+1);
set(handles.Chk_Show_DEN,'Value',1)
Pus_Denoise_Callback(handles.Pus_Denoise,eventdata,handles);
%-------------------------------------------------------------------------%
function save_FUN(hObject,eventdata,handles,typeSAV) %#ok<INUSL>

% Get figure handle.
%-------------------
hFig = handles.output;

% Testing file.
%--------------
if nargin<4
    Str_Yes = getWavMSG('Wavelet:commongui:Str_Yes');
    Str_No  = getWavMSG('Wavelet:commongui:Str_No');
    ButtonName = questdlg(getWavMSG('Wavelet:mdw1dRF:Save_Param_Sigs_QUEST'), ...
                       getWavMSG('Wavelet:mdw1dRF:Save_Signals'),...
                       Str_Yes,Str_No,Str_No);
     if isequal(ButtonName,Str_Yes) , typeSAV = 1; else typeSAV = 0; end
end
switch typeSAV
    case 0 , figNAME = getWavMSG('Wavelet:mdw1dRF:Save_Den_Sigs');
    case 1 , figNAME = getWavMSG('Wavelet:mdw1dRF:Save_Den_SigsParam');
end
[filename,pathname,ok] = utguidiv('test_save',hFig,'*.mat',figNAME);
if ~ok, return; end

% Begin waiting.
%--------------
wwaiting('msg',hFig,getWavMSG('Wavelet:commongui:WaitSave'));

% Getting Synthesized Signal.
%---------------------------
data_INFO = wtbxappdata('get',hObject,'data_INFO');
x = data_INFO.sig_DEN; %#ok<NASGU>

% Saving file.
%--------------
[name,ext] = strtok(filename,'.');
if isempty(ext) || isequal(ext,'.')
    ext = '.mat'; filename = [name ext];
end
wwaiting('off',hFig);
try
    switch typeSAV
        case 0
            save([pathname filename],'x');
        case 1
            DEN_Params = wtbxappdata('get',hFig,'DEN_Params'); %#ok<NASGU>
            PCA_Params = wtbxappdata('get',hFig,'PCA_Params'); %#ok<NASGU>
            save([pathname filename],'x','DEN_Params','PCA_Params');
    end
catch
    errargt(mfilename,getWavMSG('Wavelet:commongui:SaveFail'),'msg');
end
%-------------------------------------------------------------------------%
function Export_Callback(hObject,eventdata,handles) %#ok<INUSD,DEFNU>

data_INFO = wtbxappdata('get',hObject,'data_INFO');
x = data_INFO.sig_DEN;
wtbxexport(x,'name','msig_1D', ...
    'title',getWavMSG('Wavelet:mdw1dRF:SyntSig'));
%-------------------------------------------------------------------------%
function Pop_CFS_LEV_Callback(hObject,eventdata,handles) %#ok<INUSL,DEFNU>

plot_Decomposition(handles,'Pop')
%--------------------------------------------------------------------------
%=========================================================================%
%                END Callback Menus                                       %
%=========================================================================%


%=========================================================================%
%                BEGIN Tool Initialization                                %
%=========================================================================%
function Init_Tool(hObject,eventdata,handles) %#ok<INUSL>

% Begin initialization.
%----------------------
set(hObject,'Visible','off');

% WTBX -- Install DynVTool
%-------------------------
dynvtool('Install_V3',hObject,handles);

% WTBX -- Initialize GUIDE Figure.
%---------------------------------
wfigmngr('beg_GUIDE_FIG',hObject);

% WTBX -- Install ANAPAR FRAME
%-----------------------------
wnameDEF  = 'sym4';
maxlevDEF = 10;
levDEF    = 5;
utanapar('Install_V3_CB',hObject,'maxlev',maxlevDEF,'deflev',levDEF);
cbanapar('set',hObject,'wav',wnameDEF,'lev',levDEF);

% UIMENU INSTALLATION
%--------------------
hdl_Menus = Install_MENUS(hObject);
wtbxappdata('set',hObject,'hdl_Menus',hdl_Menus);

% Help and ContextMenus INSTALLATION
%------------------------------------
Install_HELP_and_CtxtMenu(hObject,handles);

% Axes Installation
%------------------
axe_SIG = handles.Axe_SIG;
axe_CFS = handles.Axe_CFS;
axe_DEN = handles.Axe_DEN;
axe_INI = [axe_SIG,axe_CFS,axe_DEN];
pos_axe_INI = get(axe_INI,'Position');
axe_SIG_A = handles.Axe_SIG_ADAP;
axe_CFS_A = handles.Axe_CFS_ADAP;
axe_DEN_A = handles.Axe_DEN_ADAP;
axe_INI_A = [axe_SIG_A,axe_CFS_A,axe_DEN_A];
pos_axe_INI_A = get(axe_INI_A,'Position');
tool_hdl_AXES.axe_INI = axe_INI;
tool_hdl_AXES.pos_axe_INI = pos_axe_INI;
tool_hdl_AXES.axe_INI_A = axe_INI_A;
tool_hdl_AXES.pos_axe_INI_A = pos_axe_INI_A;
wtbxappdata('set',hObject,'tool_hdl_AXES',tool_hdl_AXES);

% WTBX -- Terminate GUIDE Figure.
%--------------------------------
wfigmngr('end_GUIDE_FIG',hObject,mfilename);
%=========================================================================%
%                END Tool Initialization                                  %
%=========================================================================%


%=========================================================================%
%                BEGIN Internal Functions                                 %
%=========================================================================%
function hdl_Menus = Install_MENUS(hFig)

m_files = wfigmngr('getmenus',hFig,'file');
m_close = wfigmngr('getmenus',hFig,'close');
cb_close = [mfilename '(''Pus_CloseWin_Callback'',gcbo,[],guidata(gcbo));'];
set(m_close,'Callback',cb_close);

m_load  = uimenu(m_files, ...
    'Label',getWavMSG('Wavelet:mdw1dRF:LoadSigs'),   ...
    'Position',1,              ...
    'Enable','On',             ...
    'Callback',                ...
    [mfilename '(''Load_Sig_Callback'',gcbo,[],guidata(gcbo));']  ...
    );
m_save  = uimenu(m_files,...
    'Label',getWavMSG('Wavelet:mdw1dRF:Save_Den_Sigs'), ...
    'Position',2,'Enable','Off' ...
    );
m_demo  = uimenu(m_files, ...
    'Label',getWavMSG('Wavelet:commongui:Str_Example'), ...
    'Tag','Examples','Position',3,'Separator','Off');
uimenu(m_files, ...
    'Label',getWavMSG('Wavelet:mdw1dRF:Import_Sigs'),'Position',4, ...
    'Enable','On','Separator','On', ...
    'Callback',  ...    
    [mfilename '(''Load_Sig_Callback'',gcbo,[],guidata(gcbo),''wrks'');'] ...
    );
m_exp_wrks = uimenu(m_files, ...
    'Label',getWavMSG('Wavelet:mdw1dRF:Export_Sigs'),'Position',5, ...
    'Enable','Off','Separator','Off',...
    'Callback',[mfilename '(''Export_Callback'',gcbo,[],guidata(gcbo));'] ...
    );

uimenu(m_save,...
    'Label',getWavMSG('Wavelet:mdw1dRF:Save_Den_SigsOnly'), ...
    'Position',1,'Enable','On',       ...
    'Callback',[mfilename '(''save_FUN'',gcbo,[],guidata(gcbo),0);'] ...
    );
uimenu(m_save,...
    'Label',getWavMSG('Wavelet:mdw1dRF:Save_Den_SigsParam'), ...
    'Position',2,'Enable','On',       ...
    'Callback',[mfilename '(''save_FUN'',gcbo,[],guidata(gcbo),1);'] ...
    );
demoSET = {...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',1,1,5,'''(4,4)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',2,1,3,'''(4,4)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',3,2,5,'''(4,4)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',4,2,3,'''(4,4)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',5,3,3,'''(4,4)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',6,3,3,'''(2,4)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',7,3,3,'''(2,2)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',8,3,5,'''(2,2)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',9,4,5,'''(4,4)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',10,4,5,'''(2,4)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',11,4,3,'''(2,2)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',12,'R1',5,'''(1,1)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',13,'R2',5,'''(1,1)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',14,'R3',5,'''(1,1)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',15,'R4',5,'''(1,1)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',16,5,5,'''(8,8)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',17,5,5,'''(6,6)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',18,5,5,'''(4,4)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',19,5,5,'''(2,2)'''); ...
    getWavMSG('Wavelet:mdw1dRF:WMULDEN_Demo',20,5,5,'''(5,5)''')  ...
    };
nbDEM = size(demoSET,1);
sepSET = [3,5,9,12,16];
for k = 1:nbDEM
    strNUM = int2str(k);
    action = [mfilename '(''demo_FUN'',gcbo,[],guidata(gcbo),' strNUM ');'];
    if find(k==sepSET) , Sep = 'On'; else Sep = 'Off'; end
    uimenu(m_demo,'Label',[demoSET{k,1}],'Separator',Sep,'Callback',action);
end
hdl_Menus = struct('m_files',m_files,'m_close',m_close,...
    'm_load',m_load,'m_save',m_save,'m_demo',m_demo,'m_exp_wrks',m_exp_wrks);

%--------------------------------------------------------------------------
function Install_HELP_and_CtxtMenu(hFig,handles)

% Add Help for Tool.
%------------------
wfighelp('addHelpTool',hFig, ...
    getWavMSG('Wavelet:divGUIRF:WM_Pus_MUL_DEN'),'MULT_VAR_DEN');

% Add Help Item.
%----------------
wfighelp('addHelpItem',hFig, ...
    getWavMSG('Wavelet:commongui:HLP_DenoProc'),'DENO_PROCEDURE');
wfighelp('addHelpItem',hFig, ...
    getWavMSG('Wavelet:commongui:HLP_AvailMeth'),'COMP_DENO_METHODS');

% Add ContextMenus
%-----------------
hdl_WAV = [handles.Txt_Wav,handles.Pop_Wav_Fam,handles.Pop_Wav_Num];
wfighelp('add_ContextMenu',hFig,hdl_WAV,'UT_WAVELET');
hdl_EXT = [handles.Txt_Ext_Mode,handles.Pop_Ext_Mode];
wfighelp('add_ContextMenu',hFig,hdl_EXT,'EXT_MODE');
hdl_DEN = [handles.Pus_Decompose,handles.Rad_BASE_ORI, ...
    handles.Rad_BASE_ADAP,handles.Pus_More_ADAP];
wfighelp('add_ContextMenu',hFig,hdl_DEN,'DENO_BASIS');
hdl_TMP = [handles.Txt_THR_Meth,handles.Pop_THR_Meth];
wfighelp('add_ContextMenu',hFig,hdl_TMP,'COMP_DENO_STRA');
hdl_TMP = [handles.Rad_SOFT,handles.Rad_HARD];
wfighelp('add_ContextMenu',hFig,hdl_TMP,'DENO_SOFTHARD');
hdl_PCA = [...
    handles.Pan_PCA, ...
    handles.Chk_PCA,handles.Pus_More_PCA,...
    handles.Txt_NPC_APP,handles.Pop_NPC_APP, ...
    handles.Txt_NPC_FIN,handles.Pop_NPC_FIN  ...    
    ];
wfighelp('add_ContextMenu',hFig,hdl_PCA,'MUL_PCA');
%--------------------------------------------------------------------------
function Initialize_Axes(handles,nbAxes)

fig = handles.output;
[pos_axe_SIG,pos_axe_CFS,pos_axe_DEN] = getPosAxes('ini',fig,nbAxes);
tool_hdl_AXES = wtbxappdata('get',fig,'tool_hdl_AXES');

% For initial basis
axe_INI = tool_hdl_AXES.axe_INI;
set(axe_INI,'Visible','Off');
child = allchild(axe_INI);
child = cat(1,child{:});
delete(child)
axe_SIG = handles.Axe_SIG;
axe_CFS = handles.Axe_CFS;
axe_DEN = handles.Axe_DEN;
for k=1:nbAxes
    set(axe_SIG(k),'Position',pos_axe_SIG(k,:));
    set(axe_CFS(k),'Position',pos_axe_CFS(k,:));
    set(axe_DEN(k),'Position',pos_axe_DEN(k,:));
end
set([axe_SIG(1:nbAxes),axe_CFS(1:nbAxes),axe_DEN(1:nbAxes)],'Visible','On');

% For adapted basis
axe_INI = tool_hdl_AXES.axe_INI_A;
set(axe_INI,'Visible','Off');
child = allchild(axe_INI);
child = cat(1,child{:});
delete(child)
axe_SIG = handles.Axe_SIG_ADAP;
axe_CFS = handles.Axe_CFS_ADAP;
axe_DEN = handles.Axe_DEN_ADAP;
for k=1:nbAxes
    set(axe_SIG(k),'Position',pos_axe_SIG(k,:));
    set(axe_CFS(k),'Position',pos_axe_CFS(k,:));
    set(axe_DEN(k),'Position',pos_axe_DEN(k,:));
end
set([axe_SIG(1:nbAxes),axe_CFS(1:nbAxes),axe_DEN(1:nbAxes)],'Visible','On');
%--------------------------------------------------------------------------
function [p_axe_1,p_axe_2,p_axe_3] = getPosAxes(option,fig,nbAxes)

tool_hdl_AXES = wtbxappdata('get',fig,'tool_hdl_AXES');
axe_INI = tool_hdl_AXES.axe_INI;
pos_axe_INI = tool_hdl_AXES.pos_axe_INI;
pos_axes = cat(1,pos_axe_INI{:});
nbMAX = length(axe_INI)/3;
H = pos_axes(1,4);
yMIN  = min(pos_axes(1:nbMAX,2));
yMAX  = max(pos_axes(1:nbMAX,2)) + H;
dY = (yMAX-yMIN);
Ratio = (nbMAX/(nbMAX-1))*(dY/(nbMAX*H)-1);
hAXE = dY/(nbAxes+(nbAxes-1)*Ratio);
dAXE = hAXE*Ratio;
xSIG = pos_axes(1,1);
xCFS = pos_axes(1+nbMAX,1);
xDEN = pos_axes(1+2*nbMAX,1);
wAXE = pos_axes(1,3);
yAXE = yMAX;
p_axe_1 = zeros(nbAxes,4);
p_axe_2 = zeros(nbAxes,4);
p_axe_3 = zeros(nbAxes,4);
switch option  
    case 'ini'
        wA = wAXE*ones(1,3);

    case 'res'
        new_DX  = (xCFS -(xSIG+wAXE))/1.5;
        wA = [wAXE/0.65 , 0.55*wAXE/0.65 , 0.55*wAXE/0.65];
        xCFS = xSIG + wA(1) + new_DX;
        xDEN = xCFS + wA(2) + new_DX;         
end
for k=1:nbAxes
    yAXE = yAXE-hAXE;
    p_axe_1(k,:) = [xSIG,yAXE,wA(1),hAXE];
    p_axe_2(k,:) = [xCFS,yAXE,wA(2),hAXE];
    p_axe_3(k,:) = [xDEN,yAXE,wA(3),hAXE];
    yAXE = yAXE-dAXE;
end
%--------------------------------------------------------------------------
function plot_Decomposition(handles,typeCALL,varargin)

hFig = handles.output;
if nargin<3
    vis = lower(get(handles.Pan_BASE_ORI,'Visible'));
    if isequal(vis,'on')
        ori_OR_adap = 'ori';
    else
        ori_OR_adap = 'adap';
    end
else
    ori_OR_adap = lower(varargin{1});
end
adapFLAG = isequal(ori_OR_adap,'adap');
typeCALL = lower(typeCALL);
if isequal(typeCALL,'pop') , 
    typeCALL = get(handles.Rad_CFS_DEN,'Value');
end
data_INFO = wtbxappdata('get',hFig,'data_INFO');
[lenSIG,nbSIG] = size(data_INFO.sig_ORI);

switch typeCALL
    case {'ori',0}
        if ~adapFLAG
            dec = data_INFO.dec_ORI;
        else
            dec = data_INFO.dec_ORI_ADAP;
        end
    case {'den',1}
        if ~adapFLAG
            dec = data_INFO.dec_DEN;
        else
            dec = data_INFO.dec_DEN_ADAP;
        end
end

% Plot decomposition.
%--------------------
level_DEC = dec.level;
level = get(handles.Pop_CFS_LEV,'Value');
usr   = get(handles.Pop_CFS_LEV,'UserData');
switch ori_OR_adap
    case 'ori' 
        axe_CFS = handles.Axe_CFS;
        axe_CMD = [handles.Axe_SIG , axe_CFS , handles.Axe_DEN];
        idx = 1;

    case 'adap'
        axe_CFS = handles.Axe_CFS_ADAP;
        axe_CMD = [handles.Axe_SIG_ADAP , axe_CFS , handles.Axe_DEN_ADAP];
        idx = 2;
end
usr(idx) = level;
set(handles.Pop_CFS_LEV,'UserData',usr);
if level==level_DEC
    [coefs,longs] = wdec2cl(dec);    
else
    coefs = mdwtrec(dec,'ca',level);
    longs = size(coefs,1);
    for k = level:-1:1
        cfs_det = mdwtrec(dec,'cd',k);
        coefs = [coefs ; cfs_det];           %#ok<AGROW>
        longs = [longs ; size(cfs_det,1)];   %#ok<AGROW>
    end
    longs = [longs ; lenSIG];    
end
dynvtool('get',hFig,0);
mdw1dstem(axe_CFS(1:nbSIG),coefs,longs);
set(axe_CFS,'XLim',[1,lenSIG],'XtickMode','auto');
title(getWavMSG('Wavelet:commongui:Str_Coefficients'),...
    'Visible','on','Parent',axe_CFS(1));

dynvtool('init',hFig,[],axe_CMD,[],[1 0],'','','','real');
%--------------------------------------------------------------------------
function clean_TOOL(handles,typeCALL,varargin)

hFig = handles.output;
switch typeCALL
    case 'load'
        nbSIG = varargin{1};
        hdl_Menus = wtbxappdata('get',hFig,'hdl_Menus');
        m_save = hdl_Menus.m_save;
        m_exp_wrks = hdl_Menus.m_exp_wrks;        
        UIC_Ena_OFF = [...
            m_save, m_exp_wrks, handles.Pus_Decompose,...
            handles.Rad_BASE_ORI,handles.Rad_BASE_ADAP, ...
            handles.Pus_More_ADAP, ...            
            handles.Txt_THR_Meth,handles.Pop_THR_Meth, ...
            handles.Rad_SOFT,handles.Rad_HARD, ...
            handles.Pus_More_PCA,handles.Chk_PCA, ...
            handles.Txt_NPC_APP,handles.Pop_NPC_APP, ...
            handles.Txt_NPC_FIN,handles.Pop_NPC_FIN, ...
            handles.Pus_Denoise,handles.Pus_Residuals,...
            handles.Chk_Show_DEN, ...
            handles.Txt_CFS_LEV,handles.Pop_CFS_LEV,  ...
            handles.Rad_CFS_ORI,handles.Rad_CFS_DEN  ...
            ];
        Rad_BASIS_Callback(hFig,[],handles)
        Rad_CFS_Callback(hFig,[],handles,'ini')
        set(UIC_Ena_OFF,'Enable','Off')
        set(handles.Chk_Show_DEN,'Value',0);
        prop_POP = {'String',int2str((0:nbSIG)'),'Value',nbSIG+1};
        set([handles.Pop_NPC_APP,handles.Pop_NPC_FIN],prop_POP{:});
        axe_DEN = [handles.Axe_DEN,handles.Axe_DEN_ADAP];
        t = get(axe_DEN,'title');
        delete(cat(1,t{:}));
        title('','Parent',handles.Axe_SIG(1));
        title('','Parent',handles.Axe_CFS(1))        
        
    case 'beg_dec'
        level = varargin{1};
        axe_DEN = [handles.Axe_DEN,handles.Axe_DEN_ADAP];
        child = allchild(axe_DEN);
        child = cat(1,child{:});
        delete(child)
        title('','Parent',handles.Axe_DEN(1));
        title('','Parent',handles.Axe_DEN_ADAP(1));
        hdl_Menus = wtbxappdata('get',hFig,'hdl_Menus');
        UIC_Ena_OFF = [...
            hdl_Menus.m_save,hdl_Menus.m_exp_wrks ,handles.Pus_Residuals];
        set(UIC_Ena_OFF,'Enable','Off')
        set(handles.Pop_CFS_LEV,'String',int2str((1:level)'), ...
            'Value',level,'UserData',[level level]);
        Chk_Show_DEN_Callback(handles.Chk_Show_DEN,[],handles,0)
        Chk_PCA_Callback(hFig,[],handles,1)
                
    case 'end_dec'
        UIC_Ena_ON = [...
            handles.Pus_Decompose,...
            handles.Rad_BASE_ORI,handles.Rad_BASE_ADAP, ...
            handles.Pus_More_ADAP, ...
            handles.Txt_THR_Meth,handles.Pop_THR_Meth, ...
            handles.Rad_SOFT,handles.Rad_HARD, ...
            handles.Chk_PCA, ...
            handles.Pus_Denoise ...
            handles.Rad_CFS_ORI, ...
            handles.Txt_CFS_LEV,handles.Pop_CFS_LEV  ...
            ];        
        UIC_Ena_OF = handles.Rad_CFS_DEN;
        set(UIC_Ena_OF,'Enable','Off')
        set(UIC_Ena_ON,'Enable','On')
end
%--------------------------------------------------------------------------
%=========================================================================%
%                END Internal Functions                                   %
%=========================================================================%


%=========================================================================%
%                      BEGIN Demo Utilities                               %
%                      ---------------------                              %
%=========================================================================%
function closeDEMO(hFig,eventdata,handles,varargin)    %#ok<INUSD,DEFNU>

close(hFig);
%----------------------------------------------------------
function demoPROC(hFig,eventdata,handles,varargin)     %#ok<INUSL,DEFNU>

handles = guidata(hFig);
numDEM  = varargin{1};
demo_FUN(hFig,eventdata,handles,numDEM);
%=========================================================================%
%                   END Tool Demo Utilities                               %
%=========================================================================%