Skip to content
Snippets Groups Projects
tsgqc.m 114 KiB
Newer Older
   'Units', 'normalized', 'Position',[.1 .275 .85 .05]);

 hrbCal = uicontrol( ...
  'Style','pushbutton', 'Parent',hpCalCoef, ...
  'String','Calibrate',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_CAL_PUSH', ...
  'Units', 'normalized','pos',[.05 .15 .9 .075], ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @CalibrateCallback);
 hrbCancelCal = uicontrol( ...
  'Style','pushbutton', 'Parent',hpCalCoef, ...
  'String','Cancel calibration',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_CAL_PUSH', ...
  'Units', 'normalized','pos',[.05 .05 .9 .075], ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @CancelCalibrationCallback);


%% uiPanel for Interpolation of position

% Create the uipanel
hpInterpPos = uipanel( ...
  'Parent', hMainFig, ...
  'Title', 'Lat-Lon interpolation', ...
  'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
  'Visible', 'off', ...
  'Units', 'normalized','Position', [.0, .75, .15, .21]);
hrbInterpLinear = uicontrol( ...
  'Style','pushbutton', 'Parent',hpInterpPos, ...
  'String','Linear interpolation',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'TAG_PUSH_INTERP_LINEAR', ...
  'Units', 'normalized','pos',[.05 .65 .9 .25], ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @InterpPosLinearCallback);
hrbInterpOther = uicontrol( ...
  'Style','pushbutton', 'Parent',hpInterpPos, ...
  'String','Other method',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'TAG_PUSH_INTERP_OTHER', ...
  'Units', 'normalized','pos',[.05 .35 .9 .25], ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @InterpPosOtherCallback);
hrbInterpCancel = uicontrol( ...
  'Style','pushbutton', 'Parent',hpInterpPos, ...
  'String','Cancel interpolation',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'TAG_PUSH_INTERP_CANCEL', ...
  'Units', 'normalized','pos',[.05 .05 .9 .25], ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @InterpPosCancelCallback);


%% test if user preference autoload field is checked (on)
% -------------------------------------------------------
if strcmp(tsg.preference.autoload, 'on')
  
  % A TSG file has been open and read
  % ---------------------------------
  set( hOpenMenu, 'UserData', 'on' );

  % Show handles marked as hidden with HandleVisibility property set to
  % callback or off
  % -------------------------------------------------------------------
  set(0, 'ShowHiddenHandles', 'on');
  
  % enable toolbar menu pushtool
  % ----------------------------
  hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
  set(hdl_pushtool, 'Enable', 'on');

  % enable Save menu
  % ----------------
  set(hSaveMenu, 'Enable', 'on');

  % update the filename display
  % ---------------------------
  set( hInfoFileText, 'String', strcat(tsg.file.name, tsg.file.ext));

  % update some fields in tsg structure
  % -----------------------------------
  updateTsgStruct( hMainFig );

  % Get application data for the test
  % ---------------------------------
  tsg = getappdata( hMainFig, 'tsg_data');
      
  % Keep the pathname of the tsgqc m_file
  % -------------------------------------
  tsgqcname = mfilename;
  fulltsgqcname = mfilename('fullpath');
  tsg.DEFAULT_PATH_FILE = strrep(fulltsgqcname, tsgqcname, '') ;
  setappdata( hMainFig, 'tsg_data', tsg);
  
  % Draw the 3 plots of the validation figure
  % The plots need to be re-initialize because of a bug with
  % the zoom function. When you open a new TSG file and you
  % have used the zoom funtion with the preceding file.
  % The zoom function keep the X and Y limits of the preceding file
  % ---------------------------------------------------------------
  delete( hPlotAxes(1) );
  delete( hPlotAxes(2) );
  delete( hPlotAxes(3) );

  hPlotAxes(1) = axes( 'Parent', hPlotsPanel, 'Visible', 'off', ...
    'box', 'on', 'Units', 'normalized','Tag', 'TAG_AXES_1', ...
    'HandleVisibility','on', 'Position',[.05, .64, .93, .35]);
  hPlotAxes(2) = axes( 'Parent', hPlotsPanel, 'Visible', 'off',...
    'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_2', ...
    'HandleVisibility','on', 'Position',[.05, .33, .93, .27]);
  hPlotAxes(3) = axes('Parent', hPlotsPanel, 'Visible', 'off',...
    'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_3', ...
    'HandleVisibility','on', 'Position',[.05, .02, .93, .27]);
  
  % Initialise the popupmenu displaying the parameters that can be
  % plot
  % --------------------------------------------------------------
  initParameterChoice( hMainFig, pmhPara );
 
  resetAxes( hMainFig, hPlotAxes );
  
  plot_Validation( hMainFig, hPlotAxes, 1, tsg.preference.parameter{1} );
  plot_Validation( hMainFig, hPlotAxes, 2, tsg.preference.parameter{2} );
  plot_Validation( hMainFig, hPlotAxes, 3, tsg.preference.parameter{3} );
 
  % Draw the map with the ship track
  % --------------------------------
  plot_map( hMainFig, hPlotAxes);

  % The callback to detect the mouse motion can be set to on
  % --------------------------------------------------------
  set( hMainFig, 'UserData', 'ButtonMotionOn');

  % Hide handles marked as hidden with HandleVisibility property set to
  % callback or off
  % -------------------------------------------------------------------
  set(0, 'ShowHiddenHandles', 'off');
  
end


%% *************************** CALLBACKS **********************************

%% OpenMenuCallback
  %----------------------------------------------------------------------
  % Callback function run when the Open menu item is selected
  %----------------------------------------------------------------------
  function OpenMenuCallback(hObject, eventdata)
      
    % Activate or desactivate uipanels
    % --------------------------------
    set( hpCalCoef,            'Visible', 'off' );
    set( hpDateLimit,          'Visible', 'off' );
    set( hpInterpPos,          'Visible', 'off' );
    set( hMapPanel,            'Visible', 'off' );
%    set( hbgParameter,         'Visible', 'off');
    
    % Toggle button
    % -------------
    set( hBottleToggletool,    'state', 'off' );
    set( hCalToggletool,       'state', 'off' );
    set( hClimToggletool,      'state', 'off' );
    set( hInterpToggletool,    'state', 'off' );
    set( hPanToggletool,       'state', 'off' );
    set( hQCToggletool,        'state', 'off' );
    set( hMapToggletool,       'state', 'off' );
    set( hTimelimitToggletool, 'state', 'off' );
%    set( hZoomToggletool,      'state', 'off' );
    
    % Open standard dialog box for retrieving files
    % ---------------------------------------------
    [fileName, pathname, filterIndex] = uigetfile( ...
      {'*.nc';'*.lbv';'*.tsgqc';'*.btl';'*.ext';'*.arg';'*.xml'}, 'Pick a file');

    % flushes the event queue and updates the closed uigetfile window
    % ---------------------------------------------------------------
     drawnow;
    
    % if the user clicks the Cancel button or closes the dialog window, 
    % FileName and PathName are set to 0.
    % -----------------------------------------------------------------
    if ~isequal(fileName, 0)
      
      % Pointer set to watch during reading and plotting
      % ------------------------------------------------
      set( hMainFig, 'Pointer', 'watch' );

      % construct valid and full file path
      % -----------------------------------
      fullFileName = strcat(pathname, fileName);

      % Read the data
      % -------------
      errTsg = -2;
      errSpl = -2;
      switch filterIndex

        case 1                      % read TSG netcdf file *.nc
          tsg_initialisation(hMainFig);
          errTsg = readTsgDataNetCDF(  hMainFig, fullFileName );
        case 2                      % read TSG labview file *.lbv          
          tsg_initialisation(hMainFig);
          errTsg = readTsgDataLabview( hMainFig, fullFileName );
        
        case 3                      % read  TSG text file *.tsg
          tsg_initialisation(hMainFig);
          errTsg = readAsciiTsg( hMainFig, fullFileName);
        case 4                      % Read bucket file *.btl
          if ~isempty( tsg.SSPS )
            errSpl = readAsciiSample( hMainFig, fullFileName, 'WS');
            msgbox('Load a TSG file before a Water sample file', 'Read Bucket');
          end

        case 5                      % Read External file *.ext
          if ~isempty( tsg.SSPS )
            errSpl = readAsciiSample( hMainFig, fullFileName, 'EXT');
          else
            msgbox('Load a TSG file before a Water sample file', 'Read Bucket');
          end

        case 6                       % Read Argo file *.arg (G. Reverdin format)
          if ~isempty( tsg.SSPS )
            errSpl = readArgoLocean(   hMainFig, fullFileName );
            msgbox('Load a TSG file before a Water sample file', 'Read Bucket');
        case 7                      % read TSG XML file *.xml
          tsg_initialisation(hMainFig);
          errTsg = readTsgDataXML(     hMainFig, fullFileName );

        otherwise

          % Reset pointer to arrow
          % ----------------------
          set( hMainFig, 'Pointer', 'arrow' );
          
          % diplay warning msgbox
          % ---------------------
          msgbox( {['Invalid TSG file: ' fileName],...
            'Please select another file'},...
            'Warning open file', 'warn', 'modal' );
          
          return;
          
      end    % switch filterIndex
      
      % Get the tsg structure
      % ---------------------
      tsg = getappdata( hMainFig, 'tsg_data');
      
      % Keep the pathname of the tsgqc m_file
      % -------------------------------------
      tsgqcname = mfilename;
      fulltsgqcname = mfilename('fullpath');
      tsg.DEFAULT_PATH_FILE = strrep(fulltsgqcname, tsgqcname, '') ;
      setappdata( hMainFig, 'tsg_data', tsg);

      % A TSG file has been read
      % ------------------------
      if errTsg > 0
        
        % set WindowButtonMotionFcn on
        % ----------------------------
        set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);

        % A TSG file has been open and read
        % ---------------------------------
        set( hOpenMenu, 'UserData', 'on' );
        
        % enable toolbar menu pushtool
        % ----------------------------
        hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
        set(hdl_pushtool, 'Enable', 'on');
        
        set( hbgParameter, 'Visible', 'on');
        
        % Enable Save and Export menu
        % ---------------------------
        set(hSaveMenu,   'Enable', 'on');
        set(hExportMenu, 'Enable', 'on');
        
        % update some fields in tsg structure and restore tsg
        % ---------------------------------------------------
        updateTsgStruct(hMainFig );
        tsg = getappdata( hMainFig, 'tsg_data');

        % update the filename display
        % ---------------------------
        set( hInfoFileText, 'String', strcat(tsg.file.name, tsg.file.ext));
        
        % The callback to detect the mouse motion can be set to on
        % --------------------------------------------------------
        set( hMainFig, 'UserData', 'ButtonMotionOn');
        
        % Update QC statistics
        % --------------------
        display_QC( hMainFig, hPlotAxes);
        
        % Initialise the popupmenu displaying the parameters that can be
        % plot
        % --------------------------------------------------------------
        initParameterChoice( hMainFig, pmhPara );
        tsg = getappdata( hMainFig, 'tsg_data');

      elseif errTsg > -2
        
        % Problem to read the file or
        % Choice of parameters for Labview file canceled by the user
        % TSG structure has been reinitialize       
        % Disable toolbar menu pushtool except the open file button
        % ----------------------------------------------------------
        hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
        set(hdl_pushtool, 'Enable', 'off');
        
        set( hOpenPushtool, 'Enable', 'on' );

      end    %if errTsg > 0

      if errTsg == 1 || errSpl == 1

        % Draw the 3 plots of the validation figure
        % The plots need to be re-initialize because of a bug with
        % the zoom function. When you open a new TSG file and you
        % have used the zoom funtion with the preceding file.
        % The zoom function keep the X and Y limits of the preceding file
        % ---------------------------------------------------------------
        delete( hPlotAxes(1) );
        delete( hPlotAxes(2) );
        delete( hPlotAxes(3) );

        hPlotAxes(1) = axes( 'Parent', hPlotsPanel, 'Visible', 'off', ...
          'box', 'on', 'Units', 'normalized','Tag', 'TAG_AXES_1', ...
          'HandleVisibility','on', 'Position',[.05, .64, .93, .35]);
        hPlotAxes(2) = axes( 'Parent', hPlotsPanel, 'Visible', 'off',...
          'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_2', ...
          'HandleVisibility','on', 'Position',[.05, .33, .93, .27]);
        hPlotAxes(3) = axes('Parent', hPlotsPanel, 'Visible', 'off',...
          'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_3', ...
          'HandleVisibility','on', 'Position',[.05, .02, .93, .27]);

        resetAxes( hMainFig, hPlotAxes )

        plot_Validation( hMainFig, hPlotAxes, 1, tsg.preference.parameter{1} );
        plot_Validation( hMainFig, hPlotAxes, 2, tsg.preference.parameter{2} );
        plot_Validation( hMainFig, hPlotAxes, 3, tsg.preference.parameter{3} );
      end

    end    % if ~isequal(fileName, 0)
    
    % Pointer reset to arrow
    % ----------------------
    set( hMainFig, 'Pointer', 'arrow' );

  end

%% Inter_OnMenuCallback ................................... Interpolation
  %----------------------------------------------------------------------
  % Callback function run when 
  %
  function Inter_OnMenuCallback( hObject, eventdata)

    % Activate or desactivate uipanels
    % --------------------------------
    set( hpDateLimit,          'Visible', 'on' );
    set( hpInterpPos,          'Visible', 'on' );
    set( hpCalCoef,            'Visible', 'off');
    set( hbgQc,                'Visible', 'off');
    set( hbgParameter,         'Visible', 'off');
    
    % Toggle button
    % -------------
    set( hBottleToggletool,    'state', 'off', 'enable', 'off');
    set( hCalToggletool,       'state', 'off', 'enable', 'off');
    set( hClimToggletool,      'state', 'off', 'enable', 'off');
    set( hPanToggletool,       'state', 'off', 'enable', 'on' );
    set( hQCToggletool,        'enable', 'off');
    set( hTimelimitToggletool, 'state', 'off', 'enable', 'on' );
    set( hZoomInToggletool,    'state', 'off', 'enable', 'on' );
    set( hZoomOutToggletool,   'state', 'off', 'enable', 'on' );
    
    set( hHeaderPushtool,      'enable', 'off' );
    
    % Get application data TSG
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data');
    
    % Get the information on time limits of the time series
    % Write them in the uipanel
    % -----------------------------------------------------
    noNaN = tsg.DAYD(~isnan( tsg.DAYD ));
    set( hetDateMin, 'String', datestr(noNaN(1), 31));
    set( hetDateMax, 'String', datestr(noNaN(end), 31));
   
    % Draw the 3 plots of the interpolation figure 
    % --------------------------------------------
     plot_Interpolation( hMainFig, hPlotAxes, 1 );
     plot_Interpolation( hMainFig, hPlotAxes, 2 );
     plot_Interpolation( hMainFig, hPlotAxes, 3 );
    
  end

%% Inter_OffMenuCallback .................................. Interpolation
  %----------------------------------------------------------------------
  % Callback function run when 
  %
  function Inter_OffMenuCallback( hObject, eventdata)
    
    % Activate or desactivate uipanels
    % --------------------------------
    set( hpCalCoef,            'Visible', 'off' );
    set( hpDateLimit,          'Visible', 'off' );
    set( hpInterpPos,          'Visible', 'off' );
    set( hbgParameter,         'Visible', 'on'  );
    
    % Enable Pushbuttons
    % ------------------
    set( hBottleToggletool,    'state', 'off', 'enable', 'on' );
    set( hCalToggletool,       'state', 'off', 'enable', 'on'  );
    set( hClimToggletool,      'state', 'off', 'enable', 'on'  );
    set( hPanToggletool,       'state', 'off', 'enable', 'on'  );
    set( hQCToggletool,        'state', 'off', 'enable', 'on'  );
    set( hTimelimitToggletool, 'state', 'off', 'enable', 'off' );
    set( hZoomInToggletool,    'state', 'off', 'enable', 'on' );
    set( hZoomOutToggletool,   'state', 'off', 'enable', 'on' );

    set( hHeaderPushtool,      'enable', 'on' );

    % Get tsg structure
    % -----------------
    tsg = getappdata( hMainFig, 'tsg_data' );
    
    % Draw the 3 plots of the validation figure 
    % -----------------------------------------
  plot_Validation( hMainFig, hPlotAxes, 1, tsg.preference.parameter{1} );
  plot_Validation( hMainFig, hPlotAxes, 2, tsg.preference.parameter{2} );
  plot_Validation( hMainFig, hPlotAxes, 3, tsg.preference.parameter{3} );
    
    % Set the pointer
    % ---------------
    set( hMainFig, 'Pointer', 'arrow');

  end

%% InterpLinearCallback ...............................Interpolation Linear
  %------------------------------------------------------------------------
  % Callback function run when 
  %----------------------------------------------------------------------
  function InterpPosLinearCallback( hObject, eventdata)

    % Get the time limits for the correction A TESTER
    % --------------------------------------
    dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
    dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
    
    error = interpPosLinear( hMainFig, dateMin, dateMax );
    
    switch error

      case 1

        % Plot in the 3 axes
        % ------------------
        plot_Interpolation( hMainFig, hPlotAxes, 2 );
        plot_Interpolation( hMainFig, hPlotAxes, 3 );

      case -1
        msgbox( 'Date limits are not correct',...
          'Correction module', 'warn', 'modal');
    end


  end

%% InterpOtherCallback ...............................Interpolation OTher
  %----------------------------------------------------------------------
  % Callback function run when 
  %----------------------------------------------------------------------
  function InterpPosOtherCallback( hObject, eventdata)

    msgbox( 'Method not yet implemented', ...
            'Function InterpOtherCallback', ...
            'warn',...
            'modal' );
  end

%% InterpPosCancelCallback ..........................Cancel Interpolation
  %----------------------------------------------------------------------
  function InterpPosCancelCallback(hObject, eventdata)
    % Callback function run when
    
    % Get tsg application data
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data' );
    
    % Get NO_CONTROL and INTERPOLATED_VALUE codes
    % -------------------------------------------
    NO_CONTROL         = get(tsg.qc.hash, 'NO_CONTROL', 'code');
    INTERPOLATED_VALUE = get(tsg.qc.hash, 'INTERPOLATED_VALUE', 'code');

    if ~isempty( tsg.POSITION_QC )
      iINTERP = find(  tsg.POSITION_QC == INTERPOLATED_VALUE);
      tsg.LATX( iINTERP ) = NaN * ones( size( iINTERP), 1 );
      tsg.LONX( iINTERP ) = NaN * ones( size( iINTERP), 1 );
      tsg.POSITION_QC = [];
    end
    
    % Save tsg application data
    % --------------------------
    setappdata( hMainFig, 'tsg_data', tsg );
    
    % Refresh plots
    % -------------
    plot_Interpolation( hMainFig, hPlotAxes, 1 );
    plot_Interpolation( hMainFig, hPlotAxes, 2 );
    plot_Interpolation( hMainFig, hPlotAxes, 3 );

  end


%% Cal_OnMenuCallback ..................................... Calibration
  %----------------------------------------------------------------------
  % Callback function run when 
  %----------------------------------------------------------------------
  function Cal_OnMenuCallback( hObject, eventdata)
   
    % Activate or desactivate uipanels
    % --------------------------------
    set( hpCalCoef,         'Visible', 'on' );
    set( hbgParameter,      'Visible', 'off');
    set( hbgQc,             'Visible', 'off');
    
    % Pushbutton
    % ----------
    set( hQCToggletool,     'enable', 'off' );
    set( hClimToggletool,   'enable', 'off', 'state', 'off' );
    set( hBottleToggletool, 'enable', 'off' );
    set( hInterpToggletool, 'enable', 'off' );
    set( hHeaderPushtool,   'enable', 'off' );

    set( hPanToggletool,       'state', 'off', 'enable', 'on' );
    set( hTimelimitToggletool, 'state', 'off', 'enable', 'off' );
    set( hZoomInToggletool,    'state', 'off', 'enable', 'on' );
    set( hZoomOutToggletool,   'state', 'off', 'enable', 'on' );

        
    % Get tsg application data
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data' );
   
    % Draw the 3 plots of the validation figure 
    % -----------------------------------------
    plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
    plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
    plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );
    
    % Write the Cal Coef in the Editable uicontrol
    % --------------------------------------------
    set( hetCalCNDCSlope,  'String', num2str(tsg.CNDC_LINCOEF(1)));
    set( hetCalCNDCOffset, 'String', num2str(tsg.CNDC_LINCOEF(2)));
    set( hetCalSSJTSlope,  'String', num2str(tsg.SSJT_LINCOEF(1)));
    set( hetCalSSJTOffset, 'String', num2str(tsg.SSJT_LINCOEF(2)));
    set( hetCalSSTPSlope,  'String', num2str(tsg.SSTP_LINCOEF(1)));
    set( hetCalSSTPOffset, 'String', num2str(tsg.SSTP_LINCOEF(2)));

  end


%% Cal_OffMenuCallback ..................................... Calibration
  %----------------------------------------------------------------------
  % Callback function run when 
  %----------------------------------------------------------------------
  function Cal_OffMenuCallback( hObject, eventdata)
  
    % Activate or desactivate uipanels
    % --------------------------------
    set( hpCalCoef,         'Visible', 'off' );
    set( hbgParameter,      'Visible', 'on');
    
    % Enable Pushbuttons
    % ------------------
    set( hClimToggletool,   'enable', 'on' );
    set( hBottleToggletool, 'enable', 'on' );
    set( hInterpToggletool, 'enable', 'on' );
    set( hHeaderPushtool,   'enable', 'on' );
    set( hQCToggletool,        'state', 'off', 'enable', 'on'  );
    set( hPanToggletool,       'state', 'off', 'enable', 'on' );
    set( hTimelimitToggletool, 'state', 'off', 'enable', 'on' );
    set( hZoomInToggletool,    'state', 'off', 'enable', 'on' );
    set( hZoomOutToggletool,   'state', 'off', 'enable', 'on' );
        
    % Get tsg application data
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data' );
    
    % Save the calibration coefficient
    % --------------------------------
    tsg.CNDC_LINCOEF(1) = str2num(get( hetCalCNDCSlope,  'String'));
    tsg.CNDC_LINCOEF(2) = str2num(get( hetCalCNDCOffset, 'String'));
    tsg.SSJT_LINCOEF(1) = str2num(get( hetCalSSJTSlope,  'String'));
    tsg.SSJT_LINCOEF(2) = str2num(get( hetCalSSJTOffset, 'String'));
    tsg.SSTP_LINCOEF(1) = str2num(get( hetCalSSTPSlope,  'String'));
    tsg.SSTP_LINCOEF(2) = str2num(get( hetCalSSTPOffset, 'String'));
        
    % Save tsg application data
    % --------------------------
    setappdata( hMainFig, 'tsg_data', tsg );
    
    % Draw the 3 plots of the validation figure 
    % -----------------------------------------
  plot_Validation( hMainFig, hPlotAxes, 1, tsg.preference.parameter{1} );
  plot_Validation( hMainFig, hPlotAxes, 2, tsg.preference.parameter{2} );
  plot_Validation( hMainFig, hPlotAxes, 3, tsg.preference.parameter{3} );
   
  end

%% CalibrateCallback .......................................... Calibration
  function CalibrateCallback(hObject, eventdata)
    % Callback function run when
    
    % Get tsg application data
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data' );
    
    % Get the calibration coefficients. 
    % They will be used in the function calibration
    % ---------------------------------------------
    tsg.CNDC_LINCOEF(1) = str2num(get( hetCalCNDCSlope,  'String'));
    tsg.CNDC_LINCOEF(2) = str2num(get( hetCalCNDCOffset, 'String'));
    tsg.SSJT_LINCOEF(1) = str2num(get( hetCalSSJTSlope,  'String'));
    tsg.SSJT_LINCOEF(2) = str2num(get( hetCalSSJTOffset, 'String'));
    tsg.SSTP_LINCOEF(1) = str2num(get( hetCalSSTPSlope,  'String'));
    tsg.SSTP_LINCOEF(2) = str2num(get( hetCalSSTPOffset, 'String'));
        
    % Save tsg application data
    % --------------------------
    setappdata( hMainFig, 'tsg_data', tsg );

    % Calibrate the sensors
    % ---------------------
    calibration( hMainFig );
    
    % Update the Adjusted variables (SSPS - SSJT) with calibrated records
    % -------------------------------------------------------------------
    updateAdjustedVariable( hMainFig );
    
    % Refresh plot #1
    % ---------------
    plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
    plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
    plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );
    
    % As soon as a modification took place the data should be saved
    % -------------------------------------------------------------
    set( hSaveMenu, 'UserData', 'on' );

  end

%% CancelCalibrationCallback .................................. Calibration
  function CancelCalibrationCallback(hObject, eventdata)
    % Callback function run when
    
    % Get tsg application data
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data' );
        
    % Emptied the CAL variables
    % -------------------------
    tsg.CNDC_CAL = [];
    tsg.SSPS_CAL = [];
    tsg.SSJT_CAL = [];
    tsg.SSTP_CAL = [];
    
    % Save tsg application data
    % --------------------------
    setappdata( hMainFig, 'tsg_data', tsg );
    
    % Update the Adjusted variables 
    % -----------------------------
    updateAdjustedVariable( hMainFig );
    
    % Refresh plot #1
    % ---------------
    plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
    plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
    plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );
    
    % As soon as a modification took place the data should be saved
    % -------------------------------------------------------------
    set( hSaveMenu, 'UserData', 'on' );

  end

%% ZoomIn_OnMenuCallback
  %----------------------------------------------------------------------
  % Callback function run when the toolbar zoom in (increase) push button 
  % is pressed
  %----------------------------------------------------------------------
  function ZoomIn_OnMenuCallback(hObject, eventdata)
    % Desactivate some toggle buttons, hZoomOutToggletool changed state
    % must be call before zoom function because the callback set zoom to
    % off
    % -------------------------------------------------------------------
    set( hZoomOutToggletool,   'state', 'off' );
    set( hQCToggletool,        'state', 'off' );
    set( hPanToggletool,       'state', 'off' );
    set( hTimelimitToggletool, 'state', 'off' );

    % Hide the map. Otherwise it slows down the zooming
    % -------------------------------------------------
    set( hMapToggletool,       'state', 'off' );

    % returns a zoom mode object for the figure hMainFig handle
    % ---------------------------------------------------------
    hZoom = zoom(hMainFig);

    % Turns off the automatic adaptation of date ticks
    % ------------------------------------------------
    zoomAdaptiveDateTicks('off');

    % turns interactive zooming to in (increase)
    % ------------------------------------------
    set(hZoom, 'direction', 'in');

    % Disallows a zoom operation on the MAP axes objects
    % --------------------------------------------------
    setAllowAxesZoom(hZoom, hPlotAxes(4), false);

    % turns on interactive zooming (same effect than zoom on) but prevent
    % side effect on another figure
    % -------------------------------------------------------------------
    set(hZoom, 'enable', 'on');

    % Set this callback to listen to when a zoom operation finishes
    % must be call after enable zoom (bug ?)
    % -------------------------------------------------------------
    set(hZoom, 'ActionPostCallback', @ZoomPan_PostCallback);

  end

%% ZoomIn_OffMenuCallback
  %----------------------------------------------------------------------
  % Callback function run when the toolbar zoom in (increase) push button 
  % is pressed
  %----------------------------------------------------------------------
  function ZoomIn_OffMenuCallback(hObject, eventdata)
    % disable zoom mode
    % -----------------
    zoom off;
    
  end

%% ZoomOut_OnMenuCallback
  %------------------------------------------------------------------------
  % Callback function run when the toolbar zoom out (descrease) push button 
  % is pressed
  %------------------------------------------------------------------------
  function ZoomOut_OnMenuCallback(hObject, eventdata)

    % Desactivate Zoom In Toggle toggle button
    % -----------------------------------------
    set( hZoomInToggletool,    'state', 'off' );
    set( hQCToggletool,        'state', 'off' );
    set( hPanToggletool,       'state', 'off' );
    set( hTimelimitToggletool, 'state', 'off' );
    % Hide the map. Otherwise it slows down the zooming
    % -------------------------------------------------
    set( hMapToggletool,       'state', 'off' );
    % returns a zoom mode object for the figure hMainFig handle
    % ---------------------------------------------------------
    hZoom = zoom(hMainFig);
    
    % turns interactive zooming out (decrease)
    % ----------------------------------------
    set(hZoom, 'direction', 'out');

    % Disallows a zoom operation on the MAP axes objects
    % --------------------------------------------------
    setAllowAxesZoom(hZoom, hPlotAxes(4), false);

    % turns on interactive zooming (same effect than zoom on) but prevent
    % side effect on another figure
    % -------------------------------------------------------------------
    set(hZoom, 'enable', 'on');
    % Set this callback to listen to when a zoom operation finishes
    % -------------------------------------------------------------
    set(hZoom, 'ActionPostCallback', @ZoomPan_PostCallback);
    
  end

%% ZoomOut_OffMenuCallback
  %------------------------------------------------------------------------
  % Callback function run when the toolbar zoom out (descrease) push button 
  % is pressed
  %------------------------------------------------------------------------
  function ZoomOut_OffMenuCallback(hObject, eventdata)

    % turns interactive zooming off
    % -----------------------------
    zoom off;
    % cursor back to normal, test if it's really necessery
    % -----------------------------------------------------
    %set(hMainFig, 'Pointer', 'arrow');
   
  end

%% Pan_OnMenuCallback
  %----------------------------------------------------------------------
  % Callback function run when the pan toggle toolbar is selected
  %----------------------------------------------------------------------
  function Pan_OnMenuCallback(hObject, eventdata)
    
    % Desactivate some toggle buttons
    % -------------------------------
    set( hQCToggletool,        'state', 'off' );
    set( hTimelimitToggletool, 'state', 'off' );
    set( hZoomInToggletool,    'state', 'off' );
    set( hZoomOutToggletool,   'state', 'off' );
    
    % Hide the map. Otherwise it slows down the panning
    % -------------------------------------------------
    set( hMapToggletool,       'state', 'off' ); 
    % Returns a pan mode object for the figure handle
    % -----------------------------------------------
    hPan = pan(hMainFig);
    
    % Disallows a pan operation on the MAP axes objects
    % --------------------------------------------------
    setAllowAxesPan(hPan, hPlotAxes(4), false);

    % turns on interactive pan (same effect than pan on) but prevent
    % side effect on another figure
    % --------------------------------------------------------------
    set(hPan, 'enable', 'on');
        
    % Set this callback to listen to when a zoom operation finishes
    % must be call after enable zoom (bug ?)
    % -------------------------------------------------------------
    set(hPan, 'ActionPostCallback', @ZoomPan_PostCallback);
%% Pan_OffMenuCallback
  %----------------------------------------------------------------------
  % Callback function run when the pan toggle toolbar is released
  %----------------------------------------------------------------------
  function Pan_OffMenuCallback(hObject, eventdata)
    
    % turns interactive pan off
    % -------------------------
    pan off;
       
    % cursor back to normal, test if it's really necessery
    % -----------------------------------------------------
    %set(hMainFig, 'Pointer', 'arrow');
  end

%% ZoomPan_PostCallback
  %------------------------------------------------------------------------
  % Callback function run when zoom or pan action finishes: redraw axes
  %------------------------------------------------------------------------
  function ZoomPan_PostCallback(hObject, eventdata)

    % Set the right limit and interval to the 3 axes
    % ----------------------------------------------
    for iaxe = 1:3
      set(hPlotAxes(iaxe), 'XTickMode', 'auto')
      datetick(hPlotAxes(iaxe), 'x', 'keeplimits')
    end
  end

%% QC_OnMenuCallback ............................... Quality Control Module
  %----------------------------------------------------------------------
  % Callback function run when the QC toggle tool is pressed
  %----------------------------------------------------------------------
  function QC_OnMenuCallback(gcbo, eventdata)
 
    % Make the QC code uipanel visible
    % --------------------------------
    set( hbgQc,                'Visible' ,'on');
    set( hbgParameter,         'Visible', 'off');
    
    % Desactivate toggletools.
    % ------------------------
    set( hZoomInToggletool,    'state', 'off', 'enable', 'on' );
    set( hZoomOutToggletool,   'state', 'off', 'enable', 'on' );
    set( hPanToggletool,        'state', 'off' );
    set( hTimelimitToggletool,  'state', 'off' );
    set( hCalToggletool,        'state', 'off', 'enable', 'off'  );
    set( hInterpToggletool,     'state', 'off', 'enable', 'off' );
    
    % Retrieve named application data
    % -------------------------------
    tsg = getappdata( hMainFig, 'tsg_data');

    PARA   = tsg.preference.parameter{1};
    SAMPLE = tsg.preference.sample;
    % Activate right clic context menu on first axes (salinity)
    % ---------------------------------------------------------
    set(hPlotAxes(1),'UIContextMenu', hQcCmenu);

    % Activate clic mouse menu on first axes (salinity) for next rbbox
    % ----------------------------------------------------------------
    set(hPlotAxes(1),'ButtonDownFcn', @QC_SelectCallback);
   
    % change cursor to crosshair aspect
    % ---------------------------------
    set( hMainFig, 'Pointer', 'crosshair');
    
    % -------------------------------------------------------------
    % nested function on mouse clic when QC toggle tool is selected
    % -------------------------------------------------------------
    function QC_SelectCallback(gcbo, eventdata)
      
      % disable ButtonMotion on main fig during select
      % prevent drawing to map
      % ----------------------------------------------
      set( hMainFig, 'WindowButtonMotionFcn', []);

      % Selection of the data within the figure
      % ---------------------------------------
      point1    = get(gca,'CurrentPoint');    % button down detected
      finalRect = rbbox;                      % return figure units
      point2    = get(gca,'CurrentPoint');    % button up detected

      point1 = point1(1,1:2);                 % extract x and y
      point2 = point2(1,1:2);

      p1 = min(point1,point2);
      p2 = max(point1,point2);                % calculate locations

      % The following code is only executed if the left mouse button is clicked.
      % If the right mouse button is clicked, this code must not be
      % executed as the variable 'ind' will be emptied. And this variable
      % is used when the context menu (callback 'Qc') is called
      % -----------------------------------------------------------------
      if ~strcmp( get(gcf, 'SelectionType'), 'alt')

        % The QC is applied either on TSG data either on Sample data.
        % it depends if the Botte Toggle button has been cliked on
        % -----------------------------------------------------------
        if strcmp( get(hBottleToggletool, 'state'), 'on')

          % get index on selected zone
          % --------------------------
          if ~isempty(tsg.DAYD_EXT)
            ind = find(tsg.DAYD_EXT > p1(1,1) &  tsg.DAYD_EXT < p2(1,1) & ...
                       tsg.EXT_DIF  > p1(1,2) &  tsg.EXT_DIF  < p2(1,2));

            % Keep the information on the indices of the selected zone
            % --------------------------------------------------------
            tsg.rbboxind = ind .* ones(size(ind));

            % Modifiy the QC
            % --------------
            tsg.([SAMPLE '_EXT_QC'])(ind) = tsg.qc.active.Code;

            % Save the modifications
            % ----------------------
            setappdata( hMainFig, 'tsg_data', tsg);

            % plot selected data with selected code
            % --------------------------------------
            plot_Correction( hMainFig, hPlotAxes, PARA);
            
          end

        else

          % get index on selected zone
          % ---------------------------
          ind = find(tsg.DAYD   > p1(1,1) & tsg.DAYD   < p2(1,1) & ...
                     tsg.(PARA) > p1(1,2) & tsg.(PARA) < p2(1,2));

          % Keep the information on the indices of the selected zone
          % --------------------------------------------------------
          tsg.rbboxind = ind .* ones(size(ind));
          
          % Modifiy the QC
          % --------------
          tsg.([PARA '_QC'])(ind) = tsg.qc.active.Code;

          % put last SSPS_QC in queue (Undo/Redo)
          % -------------------------------------
          tsg.queue = push( tsg.queue, tsg.([PARA '_QC']));