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

    function varargout = wdretool(option,varargin)
%WDRETOOL Wavelet Density and Regression tool.
%   VARARGOUT = WDRETOOL(OPTION,VARARGIN)

%   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 05-Dec-96.
%   Last Revision: 10-Jun-2013.
%   Copyright 1995-2013 The MathWorks, Inc.
%   $Revision: 1.12.4.16 $  $Date: 2013/07/05 04:30:37 $


% Test inputs.
%-------------
if nargin==0 , option = 'createREG'; end
[option,winAttrb] = utguidiv('ini',option,varargin{:});

% Memory Blocks of stored values.
%================================
% MB1.
%-----
n_membloc1   = 'MB_1';
ind_xdata    = 1;
ind_ydata    = 2;
ind_xbounds  = 3;
ind_filename = 4;
ind_pathname = 5;
ind_sig_name = 6;
nb2_stored   = 6;

% MB2.
%-----
n_membloc2   = 'MB_2';
ind_status   = 1;
ind_lin_den  = 2;
ind_gra_area = 3;
nb1_stored   = 3;

% MB3.
%-----
n_membloc3 = 'MB_3';
ind_coefs  = 1;
ind_longs  = 2;
ind_sig    = 3;
nb4_stored = 3;

% Default values.
%----------------
def_MinBIN = 64;
def_DefBIN = 256;
default_wave = 'sym4';
NB_max_lev = 8;
NB_def_lev = 5;
yLevelDir  = -1;

% Tag property.
%--------------
tag_ori = 'Sig';
tag_dat = 'Proc_Data';
tag_app = 'App';
tag_est = 'Est';

switch option
  case {'createDEN','createREG'}
  case 'close' ,
  otherwise
    win_tool = varargin{1};
    handles  = wfigmngr('getValue',win_tool,'WDRE_handles');
    hdl_UIC  = handles.hdl_UIC;
    hdl_AXE  = handles.hdl_AXE;
    txt_hdl  = handles.hdl_TXT;
    hdl_MEN  = handles.hdl_MEN;
    men_sav  = hdl_MEN(end);
    m_exp_sig = wtbxappdata('get',win_tool,'m_exp_sig');    
    dummy    = struct2cell(hdl_UIC);
    [txt_bin,sli_bin,edi_bin,pus_dec,chk_den] = deal(dummy{:}); %#ok<ASGLU>
    axe_hdl  = struct2cell(hdl_AXE);
    [axe_L_1,axe_R_1,axe_L_2,axe_R_2,axe_cfs,axe_det,axe_app] =  ...
           deal(axe_hdl{:});
    axe_hdl  = cat(2,axe_hdl{:});
    colors   = wfigmngr('getValue',win_tool,'WDRE_colors');
    toolATTR = wfigmngr('getValue',win_tool,'WDRE_toolATTR');
    switch option
      case {'load','demo'}
      otherwise , toolMode = toolATTR.toolMode;
    end
end

switch option
    case {'createDEN','createREG'}

        % Parameters initialization.
        %---------------------------
        indic_vis_lev = getLevels(NB_max_lev,yLevelDir);

        % Get Globals.
        %-------------
        [Def_Txt_Height,Def_Btn_Height,Y_Spacing, ...
         sliYProp,Def_EdiBkColor, Def_FraBkColor] = ...
            mextglob('get',...
                'Def_Txt_Height','Def_Btn_Height','Y_Spacing', ...
                'Sli_YProp','Def_EdiBkColor','Def_FraBkColor' ...
                );

        % Window initialization.
        %-----------------------
        switch option
          case 'createREG'
            win_title = getWavMSG('Wavelet:divGUIRF:Reg1D_Name');
            estiNAME  = 'esti_REG';
			figExtMode = 'ExtFig_Tool_1';			

          case 'createDEN'
            win_title = getWavMSG('Wavelet:divGUIRF:Esti1D_Name');
            estiNAME  = 'esti_DEN';
			figExtMode = 'ExtFig_WTMOTION';
        end
        [win_tool,pos_win,win_units,str_numwin,...
            pos_frame0,Pos_Graphic_Area] = ...
               wfigmngr('create',win_title,winAttrb,figExtMode,mfilename,1,1,0);
        if nargout>0 , varargout{1} = win_tool; end

        % Menu construction for current figure.
        %--------------------------------------
        m_files = wfigmngr('getmenus',win_tool);
        switch option
          case 'createREG'

			% Add Help for Tool.
			%------------------
			wfighelp('addHelpTool',win_tool, ...
				getWavMSG('Wavelet:divGUIRF:Esti_RndDes'),'REGR_GUI');
			wfighelp('addHelpTool',win_tool, ...
				getWavMSG('Wavelet:divGUIRF:Esti_FixDes'),'REGF_GUI');

			% Add Help Item.
			%----------------
			wfighelp('addHelpItem',win_tool, ...
                getWavMSG('Wavelet:divGUIRF:HLP_Reg'),'REG_EST');			
			wfighelp('addHelpItem',win_tool, ...
                getWavMSG('Wavelet:commongui:HLP_AvailMeth'),'COMP_DENO_METHODS');
			wfighelp('addHelpItem',win_tool, ...
                getWavMSG('Wavelet:divGUIRF:VarAdapMeth'),'VARTHR');
			wfighelp('addHelpItem',win_tool, ...
                getWavMSG('Wavelet:commongui:HLP_LoadSave'),'REG_LOADSAVE');		

			m_load = wfigmngr('getmenus',win_tool,'load');  
            lab = getWavMSG('Wavelet:divGUIRF:Data_FixDes');
            men_fix = uimenu(m_load,...
                         'Label',lab,'Position',1, ...
                         'Callback',               ...
                         [mfilename '(''load'','   ...
                             str_numwin ',''fixreg'');'] ...
                         );
            lab = getWavMSG('Wavelet:divGUIRF:Data_StoDes');
            men_sto = uimenu(m_load,...
                        'Label',lab,'Position',2, ...
                        'Callback',               ...
                        [mfilename '(''load'','   ...
                            str_numwin ',''storeg'');'] ...
                        );
            men_den = [];
            men_sav = uimenu(m_files,...
                         'Label',getWavMSG('Wavelet:divGUIRF:Save_EstFun'),...
                         'Position',2,            ...
                         'Enable','Off',          ...
                         'Callback',              ...
                         [mfilename '(''save'','  ...
                             str_numwin ',''fun'');']...
                         );

            m_demo = uimenu(m_files,...
                        'Label',getWavMSG('Wavelet:commongui:Lab_Example'),...
                        'Tag','Examples','Position',3,'Separator','Off');
						 
            numDEM = 1;
            labDEM = getWavMSG('Wavelet:divGUIRF:FixDes');
            m_demo_1 = uimenu(m_demo, ...
                        'Label',labDEM,'Position',numDEM,'Separator','Off');

            demoSET = {...
              'fixreg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_Example_I') , ...
                    'ex1nfix'  , 'db2'  , 5 ; ...
              'fixreg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_Example_II'),  ...
                    'ex2nfix'  , 'sym4' , 5 ; ...
              'fixreg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_Example_III'), ...
                    'ex3nfix'  , 'db3'  , 5 ; ...
              'fixreg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NBlocks')  , ...
                    'noisbloc' , 'haar' , 5 ; ...
              'fixreg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NDoppler') , ...
                    'noisdopp' , 'db5'  , 5 ; ...
              'fixreg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NBumps')   , ...
                    'noisbump' , 'db5'  , 5   ...
              };
            setDEMOS(m_demo_1,mfilename,str_numwin,demoSET,0)

            numDEM = 2;
            labDEM = getWavMSG('Wavelet:divGUIRF:FixDes_IntDep');
            m_demo_2 = uimenu(m_demo, ...
                        'Label',labDEM,'Position',numDEM,'Separator','Off');
            demoSET = {...
              'fixreg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NBlocks_I') , ...
                    'nblocr1' , 'sym4', 5 , '{3}' ; ...
              'fixreg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NBlocks_II') , ...
                    'nblocr2' , 'sym4', 5 , '{3}' ; ...
              'fixreg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NDoppler_I') , ...
                    'ndoppr1' , 'sym4', 5 , '{3}' ; ...
              'fixreg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NBumps_I') , ...
                    'nbumpr1' , 'sym4', 5 , '{3}' ; ...
              'fixreg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NBumps_II') ,...
                    'nbumpr2' , 'sym4', 5 , '{2}' ; ...
              'fixreg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NBumps_III') ,...
                    'nbumpr3' , 'sym4', 5 , '{4}' ; ...
              'fixreg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NElec') , ...
                    'nelec'   , 'sym4', 5 , '{3}'   ...
              };
            setDEMOS(m_demo_2,mfilename,str_numwin,demoSET,0)

            numDEM = 3;
            labDEM = getWavMSG('Wavelet:divGUIRF:StoDes');
            m_demo_3 = uimenu(m_demo,...
                        'Label',labDEM,'Position',numDEM,'Separator','On');
            demoSET = {...
              'storeg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_Example_I')  , ...
                    'ex1nsto'  , 'sym4' ,5 ; ...
              'storeg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_Example_II') , ...
                    'ex2nsto'  , 'haar' ,5 ; ...
              'storeg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_Example_III'), ...
                    'ex3nsto'  , 'db6'  ,5 ; ...
              'storeg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NDoppler') , ...
                    'noisdopp' , 'db5'  ,5 ; ...
              'storeg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NBumps')   , ...
                    'noisbump' , 'db5'  ,5   ...
              };
            setDEMOS(m_demo_3,mfilename,str_numwin,demoSET,0)
 
            numDEM = 4;
            labDEM = getWavMSG('Wavelet:divGUIRF:StoDes_IntDep');
            m_demo_4 = uimenu(m_demo,'Label',labDEM,'Position',numDEM, ...
                        'Tag','StoDes_IntDep','Separator','Off');
                        
            demoSET = {...
              'storeg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NBlocks_I')  , ...
                    'snblocr1' , 'sym4', 5 , '{3}' ; ...
              'storeg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NBlocks_II') , ...
                    'snblocr2' , 'sym4', 5 , '{3}' ; ...
              'storeg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NDoppler_I') , ...
                    'sndoppr1' , 'sym4', 5 , '{3}' ; ...
              'storeg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NBumps_I') , ...
                    'snbumpr1' , 'sym4', 5 , '{3}' ; ...
              'storeg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NBumps_II') , ...
                    'snbumpr2' , 'sym4', 5 , '{2}' ; ...
              'storeg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NBumps_III') , ...
                    'snbumpr3' , 'sym4', 5 , '{4}' ; ...
              'storeg' , getWavMSG('Wavelet:moreMSGRF:EX1D_Name_NElec') , ...
                    'snelec'   , 'sym4', 5 , '{3}'   ...
              };
            setDEMOS(m_demo_4,mfilename,str_numwin,demoSET,0)
            uimenu(m_files,...
                'Label',getWavMSG('Wavelet:commongui:Lab_Import'), ...
                'Position',4,'Separator','On','Tag','Import', ...              ...
                'Callback',[mfilename '(''load'',' str_numwin ',''wrksreg'',1);'] ...
                );
            m_exp_sig = uimenu(m_files, ...
                'Label',getWavMSG('Wavelet:divGUIRF:Str_ExportEstFun'),   ...
                'Position',5,'Enable','Off','Separator','Off','Tag','Export',...
                'Callback',[mfilename '(''exp_wrks'',' str_numwin ',''REG'');']  ...
                );

          case 'createDEN'

			% Add Help for Tool.
			%------------------
			wfighelp('addHelpTool',win_tool, ...
				getWavMSG('Wavelet:divGUIRF:OneDim_Est'),'EDEN_GUI');

			% Add Help Item.
			%----------------
			wfighelp('addHelpItem',win_tool, ...
                getWavMSG('Wavelet:commongui:HLP_AvailMeth'),'COMP_DENO_METHODS');
			wfighelp('addHelpItem',win_tool, ...
                getWavMSG('Wavelet:divGUIRF:VarAdapMeth'),'VARTHR');
			wfighelp('addHelpItem',win_tool, ...
                getWavMSG('Wavelet:commongui:HLP_LoadSave'),'EDEN_LOADSAVE');		
			wfighelp('addHelpItem',win_tool, ...
                getWavMSG('Wavelet:divGUIRF:HLP_EstDens'),'DENS_EST');		
            men_fix = [];
            men_sto = [];
            men_den = uimenu(m_files,...
                'Label',getWavMSG('Wavelet:divGUIRF:Load_DataDens'),...
                'Position',1, ...
                'Callback', ...            ...                
                [mfilename '(''load'',' str_numwin ',''denest'');'] ...
                );
            men_sav = uimenu(m_files,...
                'Label',getWavMSG('Wavelet:divGUIRF:Save_Dens'), ...
                'Position',2,           ...
                'Enable','Off',         ...
                'Callback',             ...
                [mfilename '(''save'',' str_numwin ',''den'');'] ...
                );
            demoSET = {...
              'denest' , 'ex1cusp1' , 'ex1cusp1' , 'sym4'  , 5 ; ...
              'denest' , 'ex2cusp1' , 'ex2cusp1' , 'sym6'  , 5 ; ...
              'denest' , 'ex1cusp2' , 'ex1cusp2' , 'sym4'  , 5 ; ...
              'denest' , 'ex2cusp2' , 'ex2cusp2' , 'coif1' , 5 ; ...
              'denest' , 'ex1gauss' , 'ex1gauss' , 'sym3'  , 5 ; ...
              'denest' , 'ex2gauss' , 'ex2gauss' , 'sym4'  , 5   ...
              };
            m_demo = uimenu(m_files,'Label', ...
                getWavMSG('Wavelet:commongui:Lab_Example'),'Position',3);
            setDEMOS(m_demo,mfilename,str_numwin,demoSET,0);
            uimenu(m_files,...
                'Label',getWavMSG('Wavelet:commongui:Lab_Import'),...
                'Position',4,'Separator','On','Tag','Import', ...
                'Callback',               ...
                [mfilename '(''load'',' str_numwin ',''denest'',1);'] ...
                );
            m_exp_sig = uimenu(m_files, ...
                'Label',getWavMSG('Wavelet:divGUIRF:Str_ExpDens'),   ...
                'Position',5,'Enable','Off','Separator','Off','Tag','Export',...
                'Callback',[mfilename '(''exp_wrks'',' str_numwin ',''DEN'');']  ...
                );
        end

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

        % General parameters initialization.
        %-----------------------------------
        dy = Y_Spacing;
        d_txt  = (Def_Btn_Height-Def_Txt_Height);
        sli_hi = Def_Btn_Height*sliYProp;
        sli_dy = 0.5*Def_Btn_Height*(1-sliYProp);
        minimum_bin = 16;
        maximum_bin = 1024;
        default_bin = 256;

        % String property of objects.
        %----------------------------
        str_pus_dec = getWavMSG('Wavelet:commongui:Str_Decompose');
        str_chk_den = getWavMSG('Wavelet:divGUIRF:Ovr_EstFun');
        str_txt_bin = getWavMSG('Wavelet:commongui:Str_NbBinsAbr');
        str_edi_bin = sprintf('%.0f',default_bin);

        % Command part of the window.
        %============================
        comFigProp = {'Parent',win_tool,'Units',win_units};

        % Data, Wavelet and Level parameters.
        %------------------------------------
        xlocINI = pos_frame0([1 3]);
        ytopINI = pos_win(4)-dy;
        toolPos = utanapar('create',win_tool, ...
                    'xloc',xlocINI,'top',ytopINI,...
                    'Enable','off',      ...
                    'wtype','dwt',       ...
                    'deflev',NB_def_lev, ...
                    'maxlev',NB_max_lev  ...
                    );
        utanapar('handles',win_tool,'lev');

        % Callbacks.
        %-----------
        cba_sli_bin = [mfilename '(''upd_bin'',' str_numwin ',''sli'');'];
        cba_edi_bin = [mfilename '(''upd_bin'',' str_numwin ',''edi'');'];
        cba_pus_dec = [mfilename '(''decompose'',' str_numwin ');'];
        cba_chk_den = [mfilename '(''show_lin_den'',' str_numwin ');'];

        % Bins settings.
        %---------------
        w_bas = toolPos(3)/48;        
        h_uic = Def_Btn_Height;

        w_uic = 11*w_bas;
        x_uic = toolPos(1);
        y_uic = toolPos(2)-h_uic-2*dy;
        pos_txt_bin = [x_uic, y_uic+d_txt/2, w_uic, Def_Txt_Height];

        x_uic = x_uic+w_uic;
        w_uic = 27*w_bas;
        pos_sli_bin = [x_uic, y_uic+sli_dy, w_uic, sli_hi];

        x_uic = x_uic+w_uic+4;
        w_uic = 10*w_bas-4;
        pos_edi_bin = [x_uic, y_uic, w_uic, h_uic];
       
        txt_bin = uicontrol(comFigProp{:},...
            'Style','Text',...
            'Position',pos_txt_bin,...
            'HorizontalAlignment','left',...
            'BackgroundColor',Def_FraBkColor,...
            'String',str_txt_bin...
            );
 
        sli_bin = uicontrol(comFigProp{:},...
            'Style','Slider',...
            'Position',pos_sli_bin,...
            'Min',minimum_bin,...
            'Max',maximum_bin,...
            'Value',default_bin, ...
            'Enable','off', ...
            'Callback',cba_sli_bin ...
            );

        edi_bin = uicontrol(comFigProp{:},...
            'Style','Edit',...
            'BackgroundColor',Def_EdiBkColor,...
            'Position',pos_edi_bin,...
            'String',str_edi_bin,...
            'Enable','off',...
            'Callback',cba_edi_bin ...
            );

        % Decompose pushbutton.
        %----------------------
        h_uic = 3*Def_Btn_Height/2;
        y_uic = y_uic-h_uic-2*dy;
        w_uic = pos_frame0(3)/2;
        x_uic = pos_frame0(1)+(pos_frame0(3)-w_uic)/2;
        pos_pus_dec = [x_uic, y_uic, w_uic, h_uic];
        pus_dec = uicontrol(comFigProp{:},          ...
            'Style','pushbutton',   ...
            'Position',pos_pus_dec, ...
            'String',str_pus_dec,   ...
            'Enable','off',         ...
            'Interruptible','On',   ...
            'Tag','Pus_Dec',        ...
            'Callback',cba_pus_dec  ...
            );

        % Thresholding tool.
        %-------------------
        ytopTHR = pos_pus_dec(2)-2*dy;
        toolPos = utthrw1d('create',win_tool, ...
            'xloc',xlocINI,'top',ytopTHR,...
            'ydir',yLevelDir,       ...
            'levmax',NB_def_lev,    ...
            'levmaxMAX',NB_max_lev, ...
            'status','Off',         ...
            'toolOPT',estiNAME      ...
            );

        % Estimated Line(s) Check.
        %-------------------------
        w_uic = (3*pos_frame0(3))/4;
        x_uic = pos_frame0(1)+(pos_frame0(3)-w_uic)/2;
        h_uic = Def_Btn_Height;
        y_uic = toolPos(2)-Def_Btn_Height/2-h_uic;
        pos_chk_den = [x_uic, y_uic+8, w_uic, h_uic/1.5]; % /1.5 high DPI y_uic+8
        if isequal(option,'createDEN') , vis = 'Off'; else vis = 'On'; end  
        chk_den = uicontrol(comFigProp{:},          ...
            'Style','checkbox',     ...
            'Visible',vis,          ...
            'Position',pos_chk_den, ...
            'String',str_chk_den,   ...
            'Enable','off',         ...
            'Callback',cba_chk_den  ...
            );

        % Callbacks update.
        %------------------
        hdl_den = utthrw1d('handles',win_tool);
        utanapar('set_cba_num',win_tool,[m_files;hdl_den(:)]);
        pop_lev = utanapar('handles',win_tool,'lev');
        tmp     = num2mstr(pop_lev );
        cba_pop_lev = [mfilename '(''upd_lev'',' str_numwin ',' tmp ');'];
        set(pop_lev,'Callback',cba_pop_lev);

        % General graphical parameters initialization.
        %--------------------------------------------
        txtLRProp = {'off','bold',14};

        % Axes construction parameters.
        %------------------------------
        NB_lev    = NB_max_lev;    % dummy
        w_gra_rem = Pos_Graphic_Area(3);
        h_gra_rem = Pos_Graphic_Area(4);
        ecx_left  = 0.08*pos_win(3);
        ecx_med   = 0.07*pos_win(3);
        ecx_right = 0.06*pos_win(3);
        w_axe     = (w_gra_rem-ecx_left-ecx_med-ecx_right)/2;
        x_cfs     = ecx_left;
        x_det     = x_cfs+w_axe+ecx_med;
        ecy_up    = 0.06*pos_win(4);
        ecy_mid_1 = 0.07*pos_win(4);
        ecy_mid_2 = ecy_mid_1;
        ecy_mid_3 = ecy_mid_1;
        ecy_det   = (0.04*pos_win(4))/1.4;
        ecy_down  = ecy_up;
        h_min     = h_gra_rem/12;
        h_max     = h_gra_rem/5;
        h_axe_std = (h_min*NB_lev+h_max*(NB_max_lev-NB_lev))/NB_max_lev;
        h_space   = ecy_up+ecy_mid_1+ecy_mid_2+ecy_mid_3+...
                    (NB_lev-1)*ecy_det+ecy_down;
        h_detail  = (h_gra_rem-2*h_axe_std-h_space)/(NB_lev+1);
        y_low_ini = pos_win(4);

        % Building data axes.
        %--------------------
        comAxeProp = [comFigProp,'Visible','off','Box','On'];
        y_low_ini = y_low_ini-h_axe_std-ecy_up;
        pos_L_1   = [x_cfs y_low_ini w_axe h_axe_std];
        axe_L_1   = axes(comAxeProp{:},'Position',pos_L_1);
        pos_R_1   = [x_det y_low_ini w_axe h_axe_std];
        axe_R_1   = axes(comAxeProp{:},'Position',pos_R_1);
        y_low_ini = y_low_ini-h_axe_std-ecy_mid_1;
        pos_L_2   = [x_cfs y_low_ini w_axe h_axe_std];
        axe_L_2   = axes(comAxeProp{:},'Position',pos_L_2);
        pos_R_2   = [x_det y_low_ini w_axe h_axe_std];
        axe_R_2   = axes(comAxeProp{:},'Position',pos_R_2);
        y_low_ini = y_low_ini-h_axe_std-ecy_mid_2;

        % Building approximation axes on the right part.
        %-----------------------------------------------
        pos_app = [x_det y_low_ini w_axe h_detail];
        axe_app = axes(comAxeProp{:},'Position',pos_app);
        str_txt = ['a' wnsubstr(abs(NB_max_lev))];
        txt_app = txtinaxe('create',str_txt,axe_app,'r',txtLRProp{:});
        y_low_ini = y_low_ini-h_detail-ecy_mid_3+ecy_det;

        % Building details axes on the left part.
        %----------------------------------------
        comAxePropMore = [...
          comAxeProp,'XTickLabelMode','manual','XTickLabel',' '];
        axe_cfs = zeros(1,NB_max_lev);
        txt_cfs = zeros(1,NB_max_lev);
        y_cfs   = y_low_ini;
        pos_cfs = [x_cfs y_cfs w_axe h_detail];
        for j = 1:NB_max_lev
            k = indic_vis_lev(j);
            pos_cfs(2) = pos_cfs(2)-pos_cfs(4)-ecy_det;
            axe_cfs(k) = axes(comAxePropMore{:},'Position',pos_cfs); %#ok<*LAXES>
            str_txt    = ['d' wnsubstr(k)];
            txt_cfs(k) = txtinaxe('create',str_txt,axe_cfs(k),'l',txtLRProp{:});
            set(txt_cfs(k),'UserData',k,'Tag','');
        end
        utthrw1d('set',win_tool,'axes',axe_cfs);

        % Building details axes on the right part.
        %-----------------------------------------
        axe_det = zeros(1,NB_max_lev);
        txt_det = zeros(1,NB_max_lev);
        y_det   = y_low_ini;
        pos_det = [x_det y_det w_axe h_detail];
        for j = 1:NB_max_lev
            k = indic_vis_lev(j);
            pos_det(2) = pos_det(2)-pos_det(4)-ecy_det;
            axe_det(k) = axes(comAxePropMore{:},'Position',pos_det);
            str_txt    = ['d' wnsubstr(k)];
            txt_det(k) = txtinaxe('create',str_txt,axe_det(k),'r',txtLRProp{:});
        end

        %  Normalization.
        %----------------
        Pos_Graphic_Area = wfigmngr('normalize',win_tool, ...
            Pos_Graphic_Area,'On');
        drawnow

        % Set default wavelet.
        %---------------------
        cbanapar('set',win_tool,'wav',default_wave);

		% Add Context Sensitive Help (CSHelp).
		%-------------------------------------
		hdl_BINS  = [txt_bin,sli_bin,edi_bin];
		switch option
			case 'createDEN' , helpName = 'EDEN_BINS';
			case 'createREG' , helpName = 'REG_BINS';
		end
		wfighelp('add_ContextMenu',win_tool,hdl_BINS,helpName);		
		%-------------------------------------
		
        % Memory blocks update.
        %----------------------
        wmemtool('ini',win_tool,n_membloc2,nb1_stored);
        wmemtool('ini',win_tool,n_membloc1,nb2_stored);
        wmemtool('ini',win_tool,n_membloc3,nb4_stored);
        wmemtool('wmb',win_tool,n_membloc2,...
                                ind_status,0,        ...
                                ind_lin_den,[NaN,NaN], ...
                                ind_gra_area,Pos_Graphic_Area ...
                                );
        fields = {'txt_bin','sli_bin','edi_bin','pus_dec','chk_den'};
        values = {txt_bin,sli_bin,edi_bin,pus_dec,chk_den};
        hdl_UIC = cell2struct(values,fields,2);
        hdl_MEN = [men_fix ; men_sto ; men_den ; men_sav];
        wtbxappdata('set',win_tool,'m_exp_sig',m_exp_sig);
        fields = {...
          'axe_L_1' , 'axe_R_1' , 'axe_L_2' , 'axe_R_2' ,  ...
          'axe_cfs' , 'axe_det' , 'axe_app' ...
          };
        values = {...
          axe_L_1 , axe_R_1 , axe_L_2 , axe_R_2 ,  ...
          axe_cfs , axe_det , axe_app ...
           };
        hdl_AXE = cell2struct(values,fields,2);
        hdl_TXT = [NaN  NaN  NaN  NaN  txt_cfs txt_det double(txt_app)];
        handles = struct(...
            'hdl_MEN',hdl_MEN, ...
            'hdl_UIC',hdl_UIC, ...
            'hdl_AXE',hdl_AXE, ...
            'hdl_TXT',hdl_TXT  ...
            );
        wfigmngr('storeValue',win_tool,'WDRE_handles',handles);

        %-----------------------------------------------------------------
        % colors = struct( ...
        %   'sigColor',[1 0 0],'denColor',[1 0 0],'appColor',[0 1 1], ...
        %   'detColor',[0 1 0],'cfsColor',[0 1 0],'estColor',[1 1 0]  ...
        %   );
        %-----------------------------------------------------------------

        colors = wtbutils('colors','wdre');
        wfigmngr('storeValue',win_tool,'WDRE_colors',colors);

        toolATTR = struct('toolMode','','toolState','',...
            'level',[],'wname','','NBClasses',[]);
        wfigmngr('storeValue',win_tool,'WDRE_toolATTR',toolATTR);

        % End waiting.
        %---------------
        wwaiting('off',win_tool);

    case {'load','demo'}
        tool_OPT = varargin{2};
        loadFLAG = true;
        switch option
          case 'load'
            switch tool_OPT
              case 'denest'
                  dialName = getWavMSG('Wavelet:divGUIRF:Load_EstDen');
              case 'fixreg'
                  dialName = getWavMSG('Wavelet:divGUIRF:Load_FixDes');
              case 'storeg'
                  dialName = getWavMSG('Wavelet:divGUIRF:Load_StoDes');
            end
            if isequal(tool_OPT,'denest') && length(varargin)>2
                [sigInfos,xdata,ok] = wtbximport('1d');
                loadFLAG = false;
                
            elseif isequal(tool_OPT,'wrksreg')
                [ok,input_VAL,sig_Name] = wtbximport('reg');
                % [sigInfos,xdata,ok] = wtbximport('1d');
                loadFLAG = false;
                
            else
                [filename,pathname,ok] = ...
                    utguidiv('test_load',win_tool,'*.mat',dialName);
            end
            if ~ok, return; end

          case 'demo'
            sig_Name = deblank(varargin{3});
            wav_Name = deblank(varargin{4});
            lev_Anal = varargin{5};
            if length(varargin)>5  && ~isempty(varargin{6})
                parDemo = varargin{6};
            else
                parDemo = '';
            end
            filename = [sig_Name '.mat'];
            pathname = utguidiv('WTB_DemoPath',filename);
        end

        if loadFLAG
            % Loading file.
            %--------------
            wwaiting('msg',win_tool,getWavMSG('Wavelet:commongui:WaitLoad'));
            fullName = fullfile(pathname,filename);
            [fileStruct,err] = wfileinf(fullName);
            if ~err
                try
                    load_STRUCT = load(fullName,'-mat');
                catch 
                    err = 1;
                    msg = getWavMSG('Wavelet:commongui:ErrLoadFile_2',filename);
                end
            end
            if ~err
                % Keep only numeric values.
                %--------------------------
                dum = struct2cell(fileStruct);
                dumClass = dum(4,:);
                idxClass = ~strcmp(dumClass,'double') & ...
                    ~strcmp(dumClass,'uint8') & ...
                    ~strcmp(dumClass,'sparse');                
                fileStruct(idxClass) = [];
                err = isempty(fileStruct);
            end

            if ~err
                % Keep only one dim values.
                %--------------------------
                dum = struct2cell(fileStruct);
                dumSize = dum(2,:);
                dumSize = cat(1,dumSize{:});
                mini    = min(dumSize,[],2);
                maxi    = max(dumSize,[],2);
                fileStruct(mini~=1 | maxi<2) = [];
                err = isempty(fileStruct);
            end

            if ~err
                err = 1;
                switch tool_OPT
                    case 'denest'
                        xdata = load_STRUCT.(fileStruct(1).name);
                        ydata = ones(size(xdata));
                        err = 0;

                    case {'fixreg','storeg'}
                        % Seek X and Y values.
                        %---------------------
                        dum = struct2cell(fileStruct);
                        dum = lower(dum(1,:));
                        idxVarSET = 1:length(dum);
                        flagX = 0;
                        flagY = 0;
                        idx_Xdata = find(strcmp(dum,'xdata'),1,'first');
                        if ~isempty(idx_Xdata)
                            flagX = 1;
                            idxVarSET = setdiff(idxVarSET,idx_Xdata);
                        else
                            idxSET = find(strncmp('x',dum,1),1,'first');
                            if ~isempty(idxSET)
                                flagX = 1;
                                idx_Xdata = idxSET(1);
                                idxVarSET = setdiff(idxVarSET,idx_Xdata);
                            end
                        end
                        idx_Ydata = find(strcmp(dum,'ydata'),1,'first');
                        if ~isempty(idx_Ydata)
                            flagY = 1;
                            idxVarSET = setdiff(idxVarSET,idx_Ydata);
                        else
                            idxSET = find(strncmp('y',dum,1),1,'first');
                            if ~isempty(idxSET)
                                flagY = 1;
                                idx_Ydata = idxSET(1);
                                idxVarSET = setdiff(idxVarSET,idx_Ydata);
                            end
                        end
                        if ~flagX && ~isempty(idxVarSET)
                            flagX = 1;
                            idx_Xdata = idxVarSET(1);
                            idxVarSET(1) = [];
                        end
                        if ~flagY && ~isempty(idxVarSET)
                            flagY = 1;
                            idx_Ydata = idxVarSET(1);
                        end
                        if ~isempty(idx_Xdata)
                            xdata = load_STRUCT.(fileStruct(idx_Xdata).name);
                        end
                        if ~isempty(idx_Ydata)
                            ydata = load_STRUCT.(fileStruct(idx_Ydata).name);
                        end
                        if flagX && ~flagY
                            flagY = 1;
                            ydata = xdata;
                            xdata = 1:length(ydata);

                        elseif flagY && ~flagX
                            flagX = 1;
                            xdata = 1:length(ydata);
                        end
                        if flagX && flagY && (length(xdata)==length(ydata))
                            err = 0;
                        end
                end
            end
            if err
                msg = getWavMSG('Wavelet:commongui:ErrLoadFile_3');
            elseif ~isreal(xdata) || ~isreal(ydata)
                msg = { ...
                    getWavMSG('Wavelet:commongui:ErrLoadFile_4',filename),' '};
                err = 1;
            end
            if err
                wwaiting('off',win_tool);
                errordlg(msg, ...
                    getWavMSG('Wavelet:commongui:LoadERROR'),'modal');
                return
            end
            sig_Name = strtok(filename,'.');
            
        elseif isequal(tool_OPT,'denest')
            ydata = ones(size(xdata));
            filename = sigInfos.filename;
            pathname = sigInfos.pathname;
            sig_Name = sigInfos.name;
            
        elseif isequal(tool_OPT,'wrksreg')
           xdata = input_VAL.xdata; 
           ydata = input_VAL.ydata;
           filename = '';
           pathname = '';
           tool_OPT = 'storeg';
        end
        sig_Size = length(xdata);
        xbounds  = [min(xdata),max(xdata)];

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

        % Tool Settings.
        %---------------
        levm   = wmaxlev(sig_Size,'haar');
        levmax = min(levm,NB_max_lev);
        if isequal(option,'demo')
            anaPar = {'wav',wav_Name};
        else
            wav_Name = cbanapar('get',win_tool,'wav');
            lev_Anal = NB_def_lev;
            anaPar = {};
        end
        strlev = int2str((1:levmax)');
        anaPar = {anaPar{:},'n_s',{sig_Name,sig_Size}, ...
                  'lev',{'String',strlev,'Value',lev_Anal}}; %#ok<CCAT>
        defaultBIN = min([def_DefBIN,fix(sig_Size/4)]);
        minBIN     = min([def_MinBIN,defaultBIN]);            
        maxBIN     = sig_Size;     

        % Store tool settings & analysis parameters.
        %------------------------------------------- 
        toolATTR.toolMode  = tool_OPT;
        toolATTR.toolState = 'ini';
        toolATTR.level     = lev_Anal;
        toolATTR.wname     = wav_Name;
        toolATTR.NBClasses = defaultBIN;
        wfigmngr('storeValue',win_tool,'WDRE_toolATTR',toolATTR);

        % Store analysis parameters.
        %--------------------------- 
        wmemtool('wmb',win_tool,n_membloc2,ind_status,0);
 
        wmemtool('wmb',win_tool,n_membloc1,   ...
                       ind_filename,filename, ...
                       ind_pathname,pathname, ...
                       ind_sig_name,sig_Name, ...
                       ind_xdata,xdata, ...
                       ind_ydata,ydata, ...
                       ind_xbounds,xbounds ...
                       );

        % Clean , Set analysis & GUI values.
        %-----------------------------------
        dynvtool('stop',win_tool)
        utthrset('stop',win_tool);
        wdretool('clean',win_tool,option);
        cbanapar('set',win_tool,anaPar{:});

        % Set bins.
        %-----------
        set(sli_bin,'Min',minBIN,'Value',defaultBIN,'Max',maxBIN)
        set(edi_bin,'String',int2str(defaultBIN));

        % Setting axes and UIC. 
        %----------------------
        wdretool('position',win_tool,lev_Anal);
        wdretool('Enable',win_tool,'ini','on');
        wdretool('set_axes',win_tool);

        % Plot.
        %------
        color   = colors.sigColor;
        linProp = {...
            'Parent',axe_L_1, ...
            'Color',color,    ...
            'LineStyle','none',...
            'Marker','o',     ...
            'MarkerSize',2,   ...
            'MarkerEdgeColor',color, ...
            'MarkerFaceColor',color, ...
            'Tag',tag_ori     ...
            };
        
        switch tool_OPT
          case 'denest'
            xval = linspace(xbounds(1),xbounds(2),sig_Size);
            line(linProp{:},'XData',xval,'YData',xdata);
            ylim = getylim(xdata);
            set(axe_L_1,'XLim',xbounds,'YLim',ylim,'XTick',[],'XTickLabel',[])
            wtitle(getWavMSG('Wavelet:commongui:Str_Data'),'Parent',axe_L_1)
            color  = colors.denColor;
            his    = wgethist(xdata,minBIN);
            wplothis(axe_L_2,his,color);
            strTitle = getWavMSG('Wavelet:divGUIRF:X_NbBinHis',minBIN);
            wtitle(strTitle,'Parent',axe_L_2)
            wdretool('set_Bins',win_tool);
            
          case {'fixreg','storeg'}
            lin_ori = line(linProp{:},'XData',xdata,'YData',ydata);
            utthrw1d('set',win_tool,'handleORI',lin_ori);
            ylim = getylim(ydata);
            set(axe_L_1,'YLim',ylim)          
            wtitle(getWavMSG('Wavelet:divGUIRF:Data_XY'),'Parent',axe_L_1)
            if tool_OPT(1)=='s' , wdretool('set_Bins',win_tool); end
        end

        % Plotting Processed data.
        %------------------------
        wdretool('plot_Processed_Data',win_tool);

        % if DEMO, analyze and estimate.
        %-------------------------------
        if isequal(option,'demo')
            wdretool('decompose',win_tool);
            if ~isempty(parDemo)
                 utthrw1d('demo',win_tool,'wdre',parDemo);
            end
            wdretool('estimate',win_tool);
            wdretool('show_lin_den',win_tool,'On')
        end
        cbanapar('Enable',win_tool,'On');

        % End waiting.
        %-------------
        wwaiting('off',win_tool);

    case 'save'
        % Testing file.
        %--------------
        switch toolMode
          case {'fixreg','storeg'}
              dialName = getWavMSG('Wavelet:divGUIRF:Save_EstFun');
          case 'denest'
              dialName = getWavMSG('Wavelet:divGUIRF:Save_EstDen');
        end
        [filename,pathname,ok] = utguidiv('test_save',win_tool, ...
                                     '*.mat',dialName);
        if ~ok, return; end

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

        % Saving file.
        %--------------
        [name,ext] = strtok(filename,'.');
        if isempty(ext) || isequal(ext,'.')
            ext = '.mat'; filename = [name ext];
        end

        % Get de-noising parameters & de-noised signal.
        %-----------------------------------------------
        toolATTR = wfigmngr('getValue',win_tool,'WDRE_toolATTR');
        NB_lev = toolATTR.level;
        wname  = toolATTR.wname; %#ok<NASGU>
        [thrStruct,hdl_den] = utthrw1d('get',win_tool,...
                                 'thrstruct','handleTHR');
        thrParams = {thrStruct(1:NB_lev).thrParams}; %#ok<NASGU>
        xdata = get(hdl_den,'XData'); %#ok<NASGU>
        ydata = get(hdl_den,'YData'); %#ok<NASGU>
        try
          save([pathname filename],'xdata','ydata','thrParams','wname');
        catch %#ok<*CTCH>
          errargt(mfilename,getWavMSG('Wavelet:commongui:SaveFail'),'msg');
        end
   
        % End waiting.
        %-------------
        wwaiting('off',win_tool);

    case 'exp_wrks'
        type_EXP = varargin{2};
        wwaiting('msg',win_tool,getWavMSG('Wavelet:commongui:WaitExportDat'));
        switch type_EXP
            case 'DEN',
                varNAM = 'dens_EST';
            case 'REG'
                varNAM = 'est_FUN';
        end
        hdl_den = utthrw1d('get',win_tool,'handleTHR');
        xdata = get(hdl_den,'XData');
        ydata = get(hdl_den,'YData');
        S = struct('xdata',xdata,'ydata',ydata);
        wtbxexport(S,'name',varNAM,'title',type_EXP);
        wwaiting('off',win_tool);        
        
    case 'decompose'
    
        % Compute decomposition and plot.
        %--------------------------------
        wwaiting('msg',win_tool,getWavMSG('Wavelet:commongui:WaitCompute'));

        % Clean HDLG.
        %---------------
        utthrw1d('clean_thr',win_tool);
        wdretool('show_lin_den',win_tool,'off')

        % Get analyzis parameters.
        %-------------------------
        [wname,NB_lev] = cbanapar('get',win_tool,'wav','lev');
        NBClasses = round(get(sli_bin,'Value'));

        % Tool Settings.
        %---------------
        toolATTR.toolState = 'dec';
        toolATTR.level     = NB_lev;
        toolATTR.wname     = wname;
        toolATTR.NBClasses = NBClasses;
        wfigmngr('storeValue',win_tool,'WDRE_toolATTR',toolATTR);

        % Get Handles.
        %-------------
        indic_vis_lev = getLevels(NB_lev,yLevelDir);

        % Clean axes
        %------------
        axes2clean = [axe_R_2,axe_cfs,axe_det,axe_app];
        obj2del = findobj(axes2clean,'Type','line');
        delete(obj2del)

        % Get X bounds values.
        %---------------------
        xbounds = wmemtool('rmb',win_tool,n_membloc1,ind_xbounds);        
        xmin = xbounds(1);  xmax = xbounds(2);

        % Compute.
        %---------
        sig_pro = wmemtool('rmb',win_tool,n_membloc3,ind_sig);
        [coefs,longs] = wavedec(sig_pro,NB_lev,wname);
        % [det,app] = getFullDecTec(coefs,longs,wname,NB_lev);
        wmemtool('wmb',win_tool,n_membloc3, ...
                       ind_coefs,coefs, ...
                       ind_longs,longs ...
                       );

        % Initializing by level threshold.
        %---------------------------------
        maxTHR = zeros(1,NB_lev);
        for k = 1:NB_lev
            maxTHR(k) = max(abs(detcoef(coefs,longs,k)));
        end
        valTHR = wdretool('compute_LVL_THR',win_tool);
        valTHR = min(valTHR,maxTHR);

        % Plotting Coefficients.
        %-----------------------
        hdl_lines = NaN*ones(NB_max_lev,1);
        color = colors.cfsColor;
        len   = longs(end);
        viewSTEMS = 1;
        if viewSTEMS 
           dummy =  wfilters(wname);
           lf = length(dummy);
        end
        x_cfs = linspace(xbounds(1),xbounds(2),len);
        for j = 1:NB_lev
            k       = indic_vis_lev(j);
            axe_act = axe_cfs(k);
            cfs = detcoef(coefs,longs,k);
            tag = ['cfs_' int2str(k)];
            ybounds = [-valTHR(k) , valTHR(k) , -maxTHR(k) , maxTHR(k)];            
            if ~viewSTEMS
                cfs = cfs(ones(1,2^k),:);
                cfs = wkeep1(cfs(:)',len);                
                hdl_lines(k) = plotline(axe_act,x_cfs,cfs,color,tag,0.5,ybounds);
            else
                ld = length(cfs);
                xd = coefsLOC(1:ld,k,lf,len);                
                x_tmp = x_cfs(xd);               
                hh = plotstem(axe_act,x_tmp,cfs,color,1,tag,ybounds);
                hdl_lines(k) = hh(3);
            end
            utthrw1d('plot_dec',win_tool,k,{maxTHR(k),valTHR(k),xmin,xmax,k});
        end

        i_axe_cfs_max = indic_vis_lev(NB_lev);
        xt = get(axe_app,{'XTick','XTickLabel'});
        set([axe_det,axe_cfs],'XTick',[],'XTickLabel',[]);
        set([axe_cfs(i_axe_cfs_max),axe_det(i_axe_cfs_max)], ...
           'XTick',xt{1},'XTickLabel',xt{2}, ...
           'XtickMode','auto','XTickLabelMode','auto' ...
           );
        set(axe_hdl,'XLim',[xmin xmax])
        set(txt_hdl(end),'String',['a' wnsubstr(abs(NB_lev))]);
  
        % Dynvtool Attachment.
        %---------------------
        if ~isequal(toolMode,'denest')
           axe_IND = []; axe_CMD = axe_hdl;       
        else
           axe_IND = axe_hdl(1); axe_CMD = axe_hdl(2:end);
        end
        dynvtool('init',win_tool,axe_IND,axe_CMD,[],[1 0],'','','')

        % Initialization of Denoising structure.
        %---------------------------------------
        utthrw1d('set',win_tool,...
            'thrstruct',{xmin,xmax,valTHR,hdl_lines},'intdepthr',[]);

        % Enabling HDLG.
        %---------------
        wdretool('Enable',win_tool,'dec','on');

        % Setting prog status.
        %----------------------
        wmemtool('wmb',win_tool,n_membloc2,ind_status,1);

        % End waiting.
        %-------------
        wwaiting('off',win_tool);

    case 'estimate'
        % Compute decomposition and plot.
        %--------------------------------
        wwaiting('msg',win_tool,getWavMSG('Wavelet:commongui:WaitCompute'));

        % Disable De-noising Tool.
        %---------------------------
        utthrw1d('Enable',win_tool,'off');

        % Read Tool Memory Block.
        %-----------------------
        [coefs,longs] = wmemtool('rmb',win_tool,n_membloc3,ind_coefs,ind_longs);
        NB_lev    = toolATTR.level;
        wname     = toolATTR.wname;
        NBClasses = toolATTR.NBClasses;
        indic_vis_lev = getLevels(NB_lev,yLevelDir);

        % De-noising & Plot de-noised signal.
        %------------------------------------
        cden = utthrw1d('den_M2',win_tool,coefs,longs);
        xbounds = wmemtool('rmb',win_tool,n_membloc1,ind_xbounds);
        xmin = xbounds(1); xmax = xbounds(2);
        xval = linspace(xmin,xmax,NBClasses);
        [det,app,sig_est] = getFullDecTec(cden,longs,wname,NB_lev);

        % Reset dynvtool.
        %----------------
        dynvtool('get',win_tool,0,'force');

        % Plotting details.
        %------------------
        color = colors.detColor;
        for j = 1:NB_lev
            k   = indic_vis_lev(j);
            tag = ['det_' int2str(k)];
            plotline(axe_det(k),xval,det(k,:),color,tag);
        end

        % Plotting approximation.
        %------------------------
        color = colors.appColor;
        plotline(axe_app,xval,app,color,tag_app);
        set(txt_hdl(end),'String',['a' wnsubstr(abs(NB_lev))]);

        % Plotting Estimation.
        %---------------------
        color = colors.estColor;
        if ~isequal(toolMode,'denest')
            lin_den = wmemtool('rmb',win_tool,n_membloc2,ind_lin_den);
            set(lin_den,'YData',sig_est);
        end
        lin_den = plotline(axe_R_2,xval,sig_est,color,tag_est);
        i_axe_cfs_max = indic_vis_lev(NB_lev);
        xt = get(axe_app,{'XTick','XTickLabel'});
        set([axe_det,axe_cfs],'XTick',[],'XTickLabel',[]);
        set([axe_cfs(i_axe_cfs_max),axe_det(i_axe_cfs_max)], ...
           'XTick',xt{1},'XTickLabel',xt{2}, ...
           'XtickMode','auto','XTickLabelMode','auto' ...
           );

        % Dynvtool Attachment.
        %---------------------
        if ~isequal(toolMode,'denest')
           axe_IND = []; axe_CMD = axe_hdl;       
        else
           axe_IND = axe_hdl(1); axe_CMD = axe_hdl(2:end);
        end
        dynvtool('init',win_tool,axe_IND,axe_CMD,[],[1 0],'','','')

        % Enabling HDLG.
        %---------------
        utthrw1d('set',win_tool,'handleTHR',lin_den);
        utthrw1d('Enable',win_tool,'on');
        wdretool('Enable',win_tool,'den','on');

        % Storing tool State.
        %--------------------
        toolATTR.toolState = 'den';
        wfigmngr('storeValue',win_tool,'WDRE_toolATTR',toolATTR);
        
        % End waiting.
        %-------------
        wwaiting('off',win_tool);

    case 'show_lin_den'
        if isequal(toolMode,'denest') , return; end
        lin_den = wmemtool('rmb',win_tool,n_membloc2,ind_lin_den);
        ok = ishandle(lin_den(1));
        if length(varargin)>1
            vis = lower(varargin{2});
            if isequal(vis,'on') && ok , val = 1; else val = 0; end 
            set(chk_den,'Value',val);
        else
            vis = getonoff(get(chk_den,'Value'));
            if ~ok , set(chk_den,'Value',0); end
        end
        
        if ok , set(lin_den,'Visible',vis); end
        wtitle(getWavMSG('Wavelet:divGUIRF:Data_XY'),'Parent',axe_L_1)
        wtitle(getWavMSG('Wavelet:divGUIRF:ProcessData_XY'),'Parent',axe_R_1)

    case 'position'
        NB_lev  = varargin{2};
        set(chk_den,'Visible','off');
        pos_old = utthrw1d('get',win_tool,'position');
        utthrw1d('set',win_tool,'position',{1,NB_lev})
        pos_new = utthrw1d('get',win_tool,'position');
        ytrans  = pos_new(2)-pos_old(2);
        pos_chk = get(chk_den,'Position');
        pos_chk(2) = pos_chk(2)+ytrans;
        switch toolMode
          case 'denest' , vis_chk = 'off';
          otherwise ,     vis_chk = 'on';
        end
        set(chk_den,'Position',pos_chk,'Visible',vis_chk);

    case 'upd_lev'
        pop_lev = varargin{2};
        if ~ishandle(pop_lev)
            handles = guihandles(gcbf);
            pop_lev = handles.Pop_Lev;
        end
        lev_New = get(pop_lev,'Value');
        wdretool('position',win_tool,lev_New);
        wdretool('set_axes',win_tool);
        lev_Anal = toolATTR.level;
        flagView = 2;
        if isequal(lev_New,lev_Anal)
            state =  toolATTR.toolState;
            switch state
                case 'ini' ,
                    flagView = 1;
                    wdretool('Enable',win_tool,'ini');
                case 'dec' , 
                    wdretool('Enable',win_tool,'dec');
                case 'den' ,
                    val = get(chk_den,'Value');
                    wdretool('Enable',win_tool,'dec','on');
                    wdretool('Enable',win_tool,'den','on');
                    set(chk_den,'Value',val);
            end
        else
            flagView = 0;
            wdretool('Enable',win_tool,'ini');
        end
        if flagView<2
            wdretool('show_lin_den',win_tool,'off')
            axe_off = [axe_R_2,axe_app,axe_det];
            axe_off = axe_off(ishandle(axe_off));
            lin_Off = findobj(axe_off,'Type','line');
            set(lin_Off,'Visible','off');
        end

    case 'upd_bin'
        typ_upd = varargin{2};
        switch typ_upd
          case 'sli'
            nbOld = round(wstr2num(get(edi_bin,'String')));
            nbNew = round(get(sli_bin,'Value'));

          case 'edi'
            sliVal = get(sli_bin,{'Min','Value','Max'});
            minNb = sliVal{1};
            nbOld = sliVal{2};
            maxNb = sliVal{3};
            nbNew = round(wstr2num(get(edi_bin,'String')));
            if isempty(nbNew) || (nbNew<minNb) || (nbNew>maxNb)
               nbNew = nbOld;
            end
        end
        set(edi_bin,'String',int2str(nbNew));
        set(sli_bin,'Value',nbNew)
        if isequal(nbNew,nbOld) , return; end
        wdretool('clean',win_tool,'bin');

    case 'compute_LVL_THR'
        [numMeth,meth,alfa] = utthrw1d('get_LVL_par',win_tool); %#ok<ASGLU>
        [coefs,longs] = wmemtool('rmb',win_tool,n_membloc3,ind_coefs,ind_longs);
        switch toolMode
          case 'denest'
            varargout{1}  = wthrmngr('dw1ddenoDEN',meth,coefs,longs,alfa); 
          case {'fixreg','storeg'}
            varargout{1}  = wthrmngr('dw1ddenoLVL',meth,coefs,longs,alfa);
        end

    case 'update_LVL_meth'
        wdretool('clear_GRAPHICS',win_tool);
        valTHR = wdretool('compute_LVL_THR',win_tool);
        utthrw1d('update_LVL_meth',win_tool,valTHR);
 
    case 'clear_GRAPHICS'
        status = wmemtool('rmb',win_tool,n_membloc2,ind_status);
        if status<1 , return; end

        wdretool('Enable',win_tool,'den','off');
        wdretool('show_lin_den',win_tool,'off')
        axe_off = [axe_R_2,axe_app,axe_det];
        axe_off = axe_off(ishandle(axe_off));
        lin_Off = findobj(axe_off,'Type','line');
        set(lin_Off,'Visible','off');

    case {'enable','Enable'}
        type = varargin{2};
        if length(varargin)>2 , enaVal = varargin{3}; else enaVal = 'on'; end
        switch type
          case 'ini'
            set([men_sav;m_exp_sig;chk_den],'Enable','off');
            utthrw1d('status',win_tool,'off');
            set([pus_dec;sli_bin;edi_bin],'Enable','on');

          case 'dec'
            NB_lev = toolATTR.level;
            set(chk_den,'Value',0);
            set([men_sav;m_exp_sig;chk_den],'Enable','off');
            utthrw1d('status',win_tool,'on');
            utthrw1d('Enable',win_tool,'on');
            utthrw1d('Enable',win_tool,enaVal,1:NB_lev);

          case 'den'
            set([men_sav;m_exp_sig;chk_den],'Enable',enaVal);
            utthrw1d('enable_tog_res',win_tool,enaVal);
            if strncmpi(enaVal,'on',2) , status = 1; else status = 0; end
            wmemtool('wmb',win_tool,n_membloc2,ind_status,status);
        end

    case 'clean'
        calling_opt = varargin{2};        
        wdretool('show_lin_den',win_tool,'off')
        lin_den = wmemtool('rmb',win_tool,n_membloc2,ind_lin_den);
        lin_den = lin_den(ishandle(lin_den));
        delete(lin_den);
        wmemtool('wmb',win_tool,n_membloc2,ind_lin_den,[NaN,NaN]); 
        switch calling_opt
          case {'load','demo'}
            obj2del = [findobj(axe_hdl,'Type','line'); ...
                       findobj(axe_hdl,'Type','patch')];
            delete(obj2del)
            switch toolMode
              case 'fixreg'
                win_title = getWavMSG('Wavelet:divGUIRF:Reg1D_FixDes');
                set(win_tool,'Name',win_title);
              case 'storeg'
                win_title = getWavMSG('Wavelet:divGUIRF:Reg1D_StoDes');
                set(win_tool,'Name',win_title);
            end
            sig_name = wmemtool('rmb',win_tool,n_membloc1,ind_sig_name);
            cbanapar('set',win_tool,'nam',sig_name);
            utthrw1d('clean_thr',win_tool);

          case 'bin'
            switch toolMode
              case 'denest'  , axetoClean = axe_hdl([2,4:end]);
              case {'fixreg','storeg'} , axetoClean = axe_hdl(2:end);
            end
            obj2del = [findobj(axetoClean,'Type','line'); ...
                       findobj(axetoClean,'Type','patch')];
            delete(obj2del)
            wdretool('set_Bins',win_tool);
            wdretool('plot_Processed_Data',win_tool);
            wdretool('Enable',win_tool,'ini');
        end

    case 'set_Bins'
        xdata  = wmemtool('rmb',win_tool,n_membloc1,ind_xdata);
        nbBINS = get(sli_bin,'Value');
        toolATTR.NBClasses = nbBINS;
        wfigmngr('storeValue',win_tool,'WDRE_toolATTR',toolATTR);
        switch toolMode
          case 'denest'
            color  = colors.denColor;
            his    = wgethist(xdata,nbBINS);
            wplothis(axe_R_1,his,color);
            wtitle(getWavMSG('Wavelet:divGUIRF:Binned_Data'),'Parent',axe_R_1)

          case 'fixreg'

          case 'storeg'
            color  = colors.denColor;
            his    = wgethist(xdata,nbBINS);
            wplothis(axe_L_2,his,color);
            wtitle(getWavMSG('Wavelet:divGUIRF:Hist_of_X'),'Parent',axe_L_2)
        end

    case 'plot_Processed_Data'
        [xdata,ydata] = wmemtool('rmb',win_tool,n_membloc1, ...
                                       ind_xdata,ind_ydata);
        [sig_pro,xval] = wedenreg(toolATTR,xdata,ydata);
        wmemtool('wmb',win_tool,n_membloc3,ind_sig,sig_pro);
   
        % Plotting Processed data & initial Estimation(s).
        %-------------------------------------------------        
        switch toolMode
          case {'fixreg','storeg'}
            color = colors.sigColor;
            plotline(axe_R_1,xval,sig_pro,color,tag_dat);            
            color = colors.estColor;
            lin_den = wmemtool('rmb',win_tool,n_membloc2,ind_lin_den);
            lin_den(1) = plotline(axe_L_1,xval,sig_pro,color,'',2);
            lin_den(2) = plotline(axe_R_1,xval,sig_pro,color,'',2);
            set(lin_den(1:2),'Visible','Off');
            ylim = getylim(ydata);
            set(axe_L_1,'YLim',ylim);
            wmemtool('wmb',win_tool,n_membloc2,ind_lin_den,lin_den);
            hdl_est = plotline(axe_R_2,xval,sig_pro,color,tag_est,2);
            set(hdl_est,'Visible','Off');
            set(axe_hdl,'XLim',[xval(1) xval(end)]);

          case {'denest'}
 
        end

    case 'set_axes'
        %*************************************************************%
        %** OPTION = 'set_axes' - Set axes positions and visibility **%
        %*************************************************************%
        if strcmp(toolMode,'nul') , return; end
        Pos_Graphic_Area = wmemtool('rmb',win_tool,n_membloc2,ind_gra_area);
        
        % Hide axes
        %-----------
        if ~isequal(toolMode,'denest')
            lin_den = wmemtool('rmb',win_tool,n_membloc2,ind_lin_den);
            if ishandle(lin_den(1)) , vis_den = get(lin_den(1),'Visible'); end
        end
        obj_in_axes = findobj(axe_hdl);
        set(obj_in_axes,'Visible','off');

        % Parameters initialization.
        %---------------------------
        NB_lev = cbanapar('get',win_tool,'lev');
        indic_vis_lev = getLevels(NB_lev,yLevelDir);
 
        % General graphical parameters initialization.
        %---------------------------------------------
        pos_win   = get(win_tool,'Position');
        ecy_up    = 0.06*pos_win(4);
        ecy_mid_1 = 0.07*pos_win(4);
        ecy_mid_2 = ecy_mid_1;
        ecy_mid_3 = ecy_mid_1;
        ecy_det   = (0.04*pos_win(4))/1.4;
        ecy_down  = ecy_up;
        h_gra_rem = Pos_Graphic_Area(4);
        h_min     = h_gra_rem/12;
        h_max     = h_gra_rem/5;
        h_axe_std = (h_min*NB_lev+h_max*(NB_max_lev-NB_lev))/NB_max_lev;
        h_space   = ecy_up+ecy_mid_1+ecy_mid_2+ecy_mid_3+...
                    (NB_lev-1)*ecy_det+ecy_down;
        h_detail  = (h_gra_rem-2*h_axe_std-h_space)/(NB_lev+1);
        y_low_ini = 1;

        % Building data axes.
        %--------------------
        y_low_ini = y_low_ini-h_axe_std-ecy_up;
        pos_L_1 = get(axe_L_1,'Position');
        pos_L_1([2 4]) = [y_low_ini h_axe_std];
        set(axe_L_1,'Position',pos_L_1);
        pos_R_1 = get(axe_R_1,'Position');
        pos_R_1([2 4]) = [y_low_ini h_axe_std];
        set(axe_R_1,'Position',pos_R_1);
        axe_vis = [axe_L_1,axe_R_1];
        
        y_low_ini = y_low_ini-h_axe_std-ecy_mid_1;
        pos_L_2  = get(axe_L_2,'Position');
        pos_L_2([2 4]) = [y_low_ini h_axe_std];
        set(axe_L_2,'Position',pos_L_2)
        pos_R_2  = get(axe_R_2,'Position');
        pos_R_2([2 4]) = [y_low_ini h_axe_std];
        set(axe_R_2,'Position',pos_R_2)
        switch toolMode
          case 'denest' , axe_vis = [axe_vis,axe_L_2,axe_R_2];
          case 'fixreg' , axe_vis = [axe_vis,axe_R_2];
          case 'storeg' , axe_vis = [axe_vis,axe_L_2,axe_R_2];
        end

        % Position for approximation axes on the right part.
        %---------------------------------------------------
        y_low_ini = y_low_ini-h_detail-ecy_mid_2;
        pos_axes = pos_R_2;
        pos_y   = [y_low_ini , h_detail];
        pos_axes([2 4]) = pos_y;
        set(axe_app,'Position',pos_axes);
        axe_vis = [axe_vis,axe_app];
        y_low_ini = y_low_ini-ecy_mid_3+ecy_det;

        % Position for details axes on the left part.
        %--------------------------------------------          
        pos_y  = [y_low_ini , h_detail];
        for j = 1:NB_lev
            i_axe    = indic_vis_lev(j);
            axe_act  = axe_cfs(i_axe);
            pos_axes = get(axe_act,'Position');
            pos_y(1) = pos_y(1)-h_detail-ecy_det;
            pos_axes([2 4]) = pos_y;
            set(axe_act,'Position',pos_axes);
            axe_vis = [axe_vis axe_act]; %#ok<AGROW>
        end
        i_axe_cfs_min = indic_vis_lev(1);
        i_axe_cfs_max = indic_vis_lev(NB_lev);

        % Position for details axes on the right part.
        %---------------------------------------------
        pos_y   = [y_low_ini , h_detail];
        for j = 1:NB_lev
            i_axe    = indic_vis_lev(j);
            axe_act  = axe_det(i_axe);
            pos_axes = get(axe_act,'Position');
            pos_y(1) = pos_y(1)-h_detail-ecy_det;
            pos_axes([2 4]) = pos_y;
            set(axe_act,'Position',pos_axes);
            axe_vis  = [axe_vis axe_act]; %#ok<AGROW>
        end
        i_axe_det_min = indic_vis_lev(1);

        % Modification of app_text.
        %--------------------------
        status = wmemtool('rmb',win_tool,n_membloc2,ind_status);
        if status==0
            txt_app = txt_hdl(end);
            num_app = NB_lev;
            set(txt_app,'String',['a' wnsubstr(abs(num_app))]);
        end

        % Set axes.
        %-----------
        xt = get(axe_L_1,{'XTick','XTickLabel'});
        ind_axe_cfs = (i_axe_cfs_min:i_axe_cfs_max-1);
        set(axe_cfs(ind_axe_cfs),'XTick',[],'XTickLabel',[]);
        set([axe_cfs(i_axe_cfs_max),axe_det(i_axe_cfs_max)], ...
            'XTick',xt{1},'XTickLabel',xt{2} , ...
            'XtickMode','auto','XTickLabelMode','auto' ...
            )
        titles = get([axe_cfs;axe_det],'title');
        titles = cat(1,titles{:});
        set(titles,'String','');
        obj_in_axes_vis = findobj(axe_vis);
        set(obj_in_axes_vis,'Visible','on');
        if ~isequal(toolMode,'denest')
            if ishandle(lin_den(1)) , set(lin_den,'Visible',vis_den); end
        end
       %  hdl_den = utthrw1d('get',win_tool,'handleTHR')
       %  set(hdl_den,'Color','g')
        
        % Setting axes title
        %--------------------
        switch toolMode
          case 'fixreg'
            wtitle(getWavMSG('Wavelet:divGUIRF:Data_XY'),'Parent',axe_L_1);
            wtitle(getWavMSG('Wavelet:divGUIRF:RegEst_YfX'),'Parent',axe_R_2);

          case 'storeg'
            wtitle(getWavMSG('Wavelet:divGUIRF:Data_XY'),'Parent',axe_L_1)
            wtitle(getWavMSG('Wavelet:divGUIRF:Hist_of_X'),'Parent',axe_L_2);
            wtitle(getWavMSG('Wavelet:divGUIRF:RegEst_YfX'),'Parent',axe_R_2);
            wtitle(getWavMSG('Wavelet:divGUIRF:ProcessData_XY'),'Parent',axe_R_1);

          case 'denest'
            wtitle(getWavMSG('Wavelet:commongui:Str_Data'),'Parent',axe_L_1);
            wtitle(getWavMSG('Wavelet:divGUIRF:X_NbBinHis',def_MinBIN),'Parent',axe_L_2);
            wtitle(getWavMSG('Wavelet:divGUIRF:Binned_Data'),'Parent',axe_R_1);
            wtitle(getWavMSG('Wavelet:divGUIRF:DenEstimate'),'Parent',axe_R_2);
        end
        wtitle(getWavMSG('Wavelet:commongui:Str_Details_Cfs'),'Parent',axe_cfs(i_axe_cfs_min));
        wtitle(getWavMSG('Wavelet:commongui:Str_Details'),'Parent',axe_det(i_axe_det_min));
        wtitle(getWavMSG('Wavelet:commongui:Str_Approximation'),'Parent',axe_app);

    case 'close'

    otherwise
        errargt(mfilename,getWavMSG('Wavelet:moreMSGRF:Unknown_Opt'),'msg');
        error(message('Wavelet:FunctionArgVal:Unknown_Opt'));
end

%=============================================================================%
% INTERNAL FUNCTIONS
%=============================================================================%
function setDEMOS(m_demo,funcName,str_numwin,demoSET,sepFlag)

beg_call_str = [funcName '(''demo'',' str_numwin ','''];
[nbDEM,nbVAL] = size(demoSET);
for k=1:nbDEM
    typ = demoSET{k,1};
    nam = demoSET{k,2};
    fil = demoSET{k,3};
    wav = demoSET{k,4};
    len = length(wav);
    wavDum = [wav , blanks(4-len)];
    lev = int2str(demoSET{k,5});
    if nbVAL>5 , par = demoSET{k,6}; else par = '[]'; end
    libel = getWavMSG('Wavelet:divGUIRF:WT_Example',wavDum,lev,nam);
    action = [beg_call_str ...
              typ ''',''' fil ''',''' wav  ''',' lev ',' par ');'];
    if sepFlag && (k==1) , sep = 'on'; else sep = 'off'; end
    uimenu(m_demo,'Label',libel,'Separator',sep,'Callback',action);
end
%-----------------------------------------------------------------------------%
function indic_vis_lev = getLevels(level,yDir)

indic_vis_lev = (1:level)';
if yDir==-1 , indic_vis_lev = flipud(indic_vis_lev); end
%-----------------------------------------------------------------------------%
function [det,app,sig] = getFullDecTec(coefs,longs,wname,level)

det  = wrmcoef('d',coefs,longs,wname,1:level);
app  = wrcoef('a',coefs,longs,wname,level);
if nargout<3 , return; end
sig  = waverec(coefs,longs,wname);
%-----------------------------------------------------------------------------%
function ylim = getylim(sig)

mini = min(sig);
maxi = max(sig);
dy   = maxi-mini;
tol  = sqrt(eps);
if abs(dy)<tol
    maxi = maxi+tol;
    mini = mini-tol;
end;
ylim = [mini maxi]+0.05*dy*[-1 1];
%-----------------------------------------------------------------------------%
function ll = plotline(axe,x,y,color,tag,LW,ylimplus)

if nargin<6 , LW = 0.5; end
vis = get(axe,'Visible');
ll = findobj(axe,'Type','line','Tag',tag);
if isempty(ll)
     ll = line(...
            'Parent',axe,'XData',x,'YData',y, ...
            'Color',color,'Visible',vis,'LineWidth',LW,'Tag',tag);
else
     set(ll,'XData',x,'YData',y,'Color',color,'Visible',vis,'Tag',tag);
end
if nargin<7
    ylim = getylim(y);
else
    ylim = getylim([y(:) ; ylimplus(:)]);
end
set(axe,'YLim',ylim);
%-----------------------------------------------------------------------------%
function loc = coefsLOC(idx,lev,lf,lx)
%COEFSLOC coefficient location

up  = idx;
low = idx;
for j=1:lev
    low = 2*low+1-lf;
    up  = 2*up;
end
loc = max(1,min(lx,round((low+up)/2)));
%-----------------------------------------------------------------------------%
function h = plotstem(axe,x,y,color,flgzero,tag,ylimplus)
%PLOTSTEM Plot discrete sequence data.

vis = get(axe,'Visible');
xAxeColor = get(axe,'XColor');
q = [min(x) max(x)];
h = NaN*ones(1,4);
h(1) = line(...
    'XData',[q(1) q(2)],'YData',[0 0],...
    'Parent',axe,'Color',xAxeColor ...
    );

indZ = find(abs(y)<eps);
xZ   = x(indZ);
yZ   = y(indZ);
x(indZ) = [];
y(indZ) = [];

n = length(x);
if n>0
    MSize = 3; Mtype = 'o';
    MarkerEdgeColor = color;
    MarkerFaceColor = color;
    xx = [x;x;NaN*ones(size(x))];
    yy = [zeros(1,n);y;NaN*ones(size(y))];
    h(2) = line(...
        'XData',xx(:),'YData',yy(:),...
        'Parent',axe,'LineStyle',...
        '-','Color',color...
        );
    h(3) = line(...
        'XData',x,'YData',y,...
        'Parent',axe,...
        'Marker',Mtype, ...
        'MarkerEdgeColor',MarkerEdgeColor, ...
        'MarkerFaceColor',MarkerFaceColor, ...
        'MarkerSize',MSize, ...
        'LineStyle','none',...
        'Color',color ...
        );
end

nZ = length(xZ);
if flgzero && (nZ>0)
    MSize = 3; Mtype = 'o';
    h(4) = line(...
        'XData',xZ,'YData',yZ,...
        'Parent',axe,...
        'Marker',Mtype, ...
        'MarkerEdgeColor',xAxeColor, ...
        'MarkerFaceColor',xAxeColor, ...
        'MarkerSize',MSize, ...
        'LineStyle','none',...
        'Color',xAxeColor...
        );
end

set(h(ishandle(h)),'Visible',vis,'Tag',tag);
if nargin<7
    ylim = getylim(y);
else
    ylim = getylim([y(:) ; ylimplus(:)]);
end
set(axe,'YLim',ylim);
%-----------------------------------------------------------------------------%
%=============================================================================%


%=============================================================================%
function [ysig,xsig,coefs,longs] = wedenreg(toolATTR,x,y)
%WEDENREG Density and Regression Estimation.

%== Initialisation ==========================================================%
toolMode  = toolATTR.toolMode;
level     = toolATTR.level;
wname     = toolATTR.wname;
NBClasses = toolATTR.NBClasses;
if nargin<3 , y = ones(size(x)); end
%============================================================================%

%== Traitement sur les couples (Xm,Ym) ======================================%
interpol = 0; % pas d'interpolation.
[sx,sy] = prepxy(toolMode,x,y,NBClasses,interpol);
ind_sx  = find(sx>0);
%============================================================================%

%============================================================================%
% Calcul de la grille en x.
%-------------------------
xmin = min(x);
xmax = max(x);
xsig = (0:NBClasses-1)/(NBClasses-1);
xsig = (xmax-xmin)*xsig+xmin;
%============================================================================%

%============================================================================%
% Normalization & Processed Data.
%-------------------------------
switch toolMode
    case {'denest'}
        ysig = sy;
        delta = xsig(2)-xsig(1);
        integ = sum(ysig)*delta;
        ysig = ysig/integ;
        
    case {'fixreg','storeg'}
        ysig = zeros(size(sx));
        ysig(ind_sx) = sy(ind_sx)./sx(ind_sx);
end

% Decomposition of processed signal.
%-----------------------------------
if nargout>2
    [coefs,longs] = wavedec(ysig,level,wname);
end
%============================================================================%
% INTERNAL FUNCTIONS for WEDENREG
%============================================================================%
%----------------------------------------------------------------------------%
function [sx,sy] = prepxy(option,x,y,NBClasses,interpol)
%PREPXY Traitement des couples (X,Y)
%   
%   [sx,sy] = prepxy(option,x,y,NBClasses,interpol)
%
%   Entrees:
%       option    = 'denest','fixreg','storeg'
%       (x,y)     = couples des donnees (y==1 pour 'estidens') 
%       NBClasses = Nombre de classes de la grille sur [0,1].
%                   La grille sur l'intervalle [0,1] est:
%                   xgrid = [0.5:NBClasses-0.5]/NBClasses
%
%   Sorties:
%       sx = nombre d'element dans chaque classe.
%       sy = somme des elements de chaque classe.
%               (sy == sx pour 'denest' )

%----------------------------------------%
% On change l'intervalle.                %
% On travaille sur l'intervalle [0,1]    %
%----------------------------------------%
xmin  = min(x);
xmax  = max(x);
x     = (x-xmin)/(xmax-xmin);
I1    = find(x==1);
x(I1) = x(I1)-eps;

%----------------------------------------%
% La grille sur l'intervalle [0,1] est : %
% xf = [0.5:NBClasses-0.5]/NBClasses     %
%----------------------------------------%
ex = round(NBClasses*x+0.5); 

%----------------------------------------%
% Recherche des valeurs repetees et      %
% manquantes de ex.                      %
% Calcul des sommes des valeurs de y     %
% pour chaque ex distinct.               %
%----------------------------------------%
lx = length(ex);
sx = full(sum(sparse(1:lx,ex,1,lx,NBClasses)));

switch option
   case 'denest' , sy = sx;
   case 'fixreg' , sy = full(sum(sparse(1:lx,ex,y,lx,NBClasses)));
   case 'storeg'
     sy = full(sum(sparse(1:lx,ex,y,lx,NBClasses)));
     if nargin<5 , return; end

     % PROBLEME DES VALEURS MANQUANTES: interpol = 1;
     %----------------------------------------------
     if interpol
         % Interpolation lineaire pour les trous.
         Ind_0  = find(sx==0);
         Ind_sx = (find(sx>0))';
         for k=1:length(Ind_0)
             Ik = Ind_0(k);
             av = find(Ind_sx<Ik);
             ap = find(Ind_sx>Ik);
             Iav = Ind_sx(av(length(av)));
             Iap = Ind_sx(ap(1));
             sy(Ik) = ( (sy(Iap)*(Ik-Iav))/sx(Iap)+ ...
                        (sy(Iav)*(Iap-Ik))/sx(Iav) )/(Iap-Iav);
             sx(Ik) = 1;
         end
     end
end
%----------------------------------------------------------------------------%
%============================================================================%