Skip to content
Snippets Groups Projects
tsgqc.m 156 KiB
Newer Older
function tsgqc( varargin )
% TSGQC: Thermosalinograph (TSG) Quality Control software
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed


%% COPYRIGHT & LICENSE
%  Copyright 2007 - IRD US191, all rights reserved.
%
%  This file is part of tsgqc.
%    TSG-QC is free software; you can redistribute it and/or modify
%    it under the terms of the GNU General Public License as publDisplayished by
%    the Free Software Foundation; either version 2 of the License, or
%    (at your option) any later version.
%
%    tsgqc is distributed in the hope that it will be useful,
%    but WITHOUT ANY WARRANTY; without even the implied warranty of
%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%    GNU General Public License for more details.
%
%    You should have received a copy of the GNU General Public License
%    along with Datagui; if not, write to the Free Software
%    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%
%% DOCUMENTATION
% see: http://www.ird.fr/us191/spip.php?article63
% svn: https://svn.mpl.ird.fr/us191/tsg-qc/trunk/
%
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%% TIPS
%  To get tsg anywhere during debug:
%  tsg = getappdata( findobj('Tag', 'TAG_TSG-QC_GUI'), 'tsg_data')
%% Define global variables for VERSIONING
% ---------------------------------------
global DATE_VERSION
global DEBUGGING

% version number, may be used to initialize some files when it change
% 0.90x -> 1.0RCx
% -------------------------------------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
VERSION      = 1.485;  % -> 1.44
CHAR_VERSION = '1.48.5RC3';
DATE_VERSION = '10/09/2018';

% netcdf file version, see DATA FORMAT TSG document:
% CORTSG_format_gosud.doc
% --------------------------------------------------
%%  Initialization tasks
%   ********************

% Clear Command Window display, giving up a "clean screen."
% ---------------------------------------------------------
clc;

% Find program directory.
% functions (icons) should be store at a lower level
% add directories to Matlab search path, works on UNIX
% and Windows host
% ---------------------------------------------------
tsgqcname = mfilename;
fulltsgqcname = mfilename('fullpath');

% regular expression expr if it occurs at the end of the input string
% -------------------------------------------------------------------

% get pathname
% ------------
DEFAULT_PATH_FILE =  regexprep(fulltsgqcname, expr, '');

% update Matlab pathdef only for session
% addpath isn't mandatory and failed with compiled applications
% -------------------------------------------------------------
if (~isdeployed)
  p = [pathsep,...
    DEFAULT_PATH_FILE,[ 'tsg_util' pathsep],...
    DEFAULT_PATH_FILE,[ 'tsg_data' pathsep],...
    DEFAULT_PATH_FILE,[ 'tsg_icon' pathsep],...
    DEFAULT_PATH_FILE,[ 'tsg_map' pathsep]
    ];
  addpath( p, '-end' );
  rehash;

% define 'HandleVisibility' property for all objects
% --------------------------------------------------
handleVisibility = 'on';

% % get screen dimensions (pixels)
% % ------------------------------
% set(0,'Units','pixels');
% screenSize = get(0,'ScreenSize');
% % set default font size
% % ---------------------
% if screenSize(3) <= 1024
%   tsg.fontSize = 9;
% else
%   tsg.fontSize = 11;
% end

% Screen limits for the GUI
% -------------------------
if verLessThan('matlab','8.4')
  set(0,'Units','normalized');
  guiLimits = get(0,'ScreenSize');
else
  r = groot;
  r.Units = 'normalized';
  guiLimits = r.ScreenSize;
end

guiLimits(1) = guiLimits(1) + 0.01;
guiLimits(2) = guiLimits(2) + 0.05;
guiLimits(3) = guiLimits(3) - 0.02;
guiLimits(4) = guiLimits(4) - 0.15;

%% Optional arguments
% --------------------
inputFile  = '';
outputFile = '';
display    = false;
DEBUGGING  = false;
help       = false;

% parse and set optional arguments with couple 'property', 'value'
% -----------------------------------------------------------------
if length(varargin) == 1
  inputFile = varargin{1};
end
property_argin = varargin(1:end);
  property = property_argin{1};
  value    = property_argin{2};
  property_argin = property_argin(3:end);
  switch lower(property)
    case {'inputfile', 'input'}
      inputFile = value;
    case {'outputfile', 'output'}
      outputFile = value;
    case 'display'
      display = value;
    case 'debug'
      DEBUGGING = value;
    otherwise
      error('Unknow property: "%s"', property);
  end
end

% if property display is set to display, display them and quit
% -----------------------------------------------------------
if display
  fprintf('inputFile: %s\noutpuFile: %s\n', inputFile, outputFile);
  return;
end
% if property help is set to on, display help and quit
% -----------------------------------------------------------
if strcmp(help, 'on')
  fprintf('tsgqc\n');
  fprintf('tsgqc(''<file>'')\n');
  fprintf('tsgqc(''inputfile'', <file>, ''outputfile'', <file>)\n');
  fprintf('tsgqc(''inputfile'', <file>, ''outputfile'', <file>),''display'',''true''\n');
  fprintf('tsgqc(''help'',''true'')\n');
  fprintf('tsgqc(''<file>'', ''debug'', 1)\n');

%% Main TSGQC GUI
% ---------------

% Check if main TSGQC figure exist
% --------------------------------
hMainFig = findobj('Tag', 'TAG_TSG-QC_GUI');

% if TSGQC figure exist and still running, don't create a new instance
% --------------------------------------------------------------------
if ~isempty(hMainFig)
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  % display error dialog box and quit
  % ---------------------------------
  errordlg({'An instance of TSGQC is still running !!!', ...
    'Open it from you task bar'}, 'Warning TSGQC');
  return;
% Create and then hide the GUI as it is being constructed.
% --------------------------------------------------------
hMainFig = figure(...
  'Name', strcat('TSG Validation - v', CHAR_VERSION), ...
  'NumberTitle', 'off', ...
  'Resize', 'on', ...
  'Menubar', 'none', ...
  'Toolbar', 'none', ...
  'UserData', 'ButtonMotionOff', ...
  'WindowButtonMotionFcn', @MouseMotion, ...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  'HandleVisibility', handleVisibility,...
  'Visible','on',...
  'Tag','TAG_TSG-QC_GUI',...
  'Units', 'normalized',...
  'Position',guiLimits, ...
  'Color', get( 0, 'DefaultUIControlBackgroundColor' ));
%% Check Matlab version for use of KeyPressFcn and KeyReleaseFcn properties
% -------------------------------------------------------------------------
switch ( version('-release') )
  case { '11', '12', '13', '14', '2006a', '2006b' }
    % dont process KeyPressFcn and KeyReleaseFcn events
  otherwise
    
    % show crossline when shitf key is pressed, vertical bar when ctrl key
    % --------------------------------------------------------------------
    set( hMainFig, 'KeyPressFcn',   @keyPressFcnCallback,...
      'KeyReleaseFcn', @keyReleaseFcnCallback);
end

%% Initialize tsg structure with tsg_preference function
% -----------------------------------------------------
if ~tsg_preferences(hMainFig, tsgqcname, DEFAULT_PATH_FILE)
  quitProgram(DEFAULT_PATH_FILE, hMainFig, hMapFig);
end

% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');

%%  Menu File
%   -----------------------------------------------------------------------
hFileMenu = uimenu(...
  'Parent', hMainFig,...
  'HandleVisibility', handleVisibility,...
  'Label', 'File');
hOpenMenu = uimenu(...
  'Parent', hFileMenu,...
  'Label','Open',...
  'Accelerator','O',...
  'HandleVisibility', handleVisibility,...
  'UserData', 'off',...
  'Callback', @OpenMenuCallback);
hSaveMenu = uimenu(...
  'Parent', hFileMenu,...
  'Label','Save',...
  'Accelerator','S',...
  'Enable', 'off',...
  'UserData', 'off',...
  'HandleVisibility', handleVisibility,...
  'Callback',@SaveMenuCallback);
hExportMenu = uimenu(...
  'Parent', hFileMenu,...
  'Label','Export',...
  'Accelerator','E',...
  'Enable', 'off',...
  'UserData', 'off',...
  'HandleVisibility', handleVisibility);
hExportTSG = uimenu(...
  'Parent', hExportMenu,...
  'Label','Tsg ascii file',...
  'Enable', 'on',...
  'HandleVisibility', handleVisibility,...
  'Callback',@ExportTsgCallback);
hExportSAMPLE = uimenu(...
  'Parent', hExportMenu,...
  'Label','Sample ascii file',...
  'Enable', 'on',...
  'HandleVisibility', handleVisibility,...
  'Callback',@ExportSampleCallback);

hQuitMenu = uimenu(...
  'Parent',hFileMenu,...
  'Label','Quit',...
  'Separator','on',...
  'Accelerator','Q',...
  'HandleVisibility', handleVisibility,...
  'Callback',@QuitMenuCallback);

jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%%  Menu Edit with Undo/Redo submenu
% ---------------------------------
hEditMenu = uimenu(hMainFig,'Label','Edit');
uimenu(hEditMenu,'Label','Undo',...
  'Tag','UIMENU_UNDO',...
  'Enable', 'off',...
  'Callback',@UndoMenuCallback);
uimenu(hEditMenu,'Label','Redo',...
  'Tag','UIMENU_REDO',...
  'Enable', 'off',...
  'Callback',@RedoMenuCallback);

%%  Menu Climatology with Annual/Seasonal/Monthly submenu
% --------------------------------------------------------

% define structure s stored in userdata
% -------------------------------------
s = struct('type', 'annual', 'time', 1);

hClimatoMenu = uimenu(hMainFig,'Label','Climatology', ...
  'Tag', 'TAG_UIMENU_CLIMATO_MAIN', ...
  'UserData', s);

% by defautl at startup, select climatology to annual
% ---------------------------------------------------
uimenu(hClimatoMenu,'Label','Annual',...
  'Checked','on',...
  'Tag','TAG_UIMENU_CLIMATO_ANNUAL',...
  'Enable', 'on',...
  'Callback', {@ClimatoSelectMenuCallback, 'annual', 1});

% declare top-level seasonal menu
% -------------------------------
hClimatoSeasonalMenu = uimenu(hClimatoMenu,'Label','Seasonal');

% declare label for seasonal submenu
% ----------------------------------
label = {'jan-feb-mar','apr-may-jun','jul-aug-sept','oct-nov-dec'};

% loop over the four submenu
% --------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
for i = 1:4
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  uimenu(hClimatoSeasonalMenu,'Label',label{i},...
    'Checked','off',...
    'Tag',['TAG_UIMENU_CLIMATO_SEASONAL_' i],...
    'Enable', 'on',...
    'Callback',{@ClimatoSelectMenuCallback, 'seasonal', i});
end

% declare top-level monthly menu
% -------------------------------
hClimatoMonthlyMenu = uimenu(hClimatoMenu,'Label','Monthly');

% declare label for monthly submenu
% ----------------------------------
label = {'january','february','march','april','may','june','july','august',...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  'september','october','november','december'};

% loop over the four submenu
% --------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
for i = 1:12
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  uimenu(hClimatoMonthlyMenu,'Label',label{i},...
    'Checked','off',...
    'Tag',['TAG_UIMENU_CLIMATO_MONTHLY_' i],...
    'Enable', 'on',...
    'Callback',{@ClimatoSelectMenuCallback, 'monthly', i});
end

%%  Menu Option with Preferences submenu
% --------------------------------------------------------
hOptionMenu = uimenu(hMainFig,'Label','Option');
uimenu(hOptionMenu,'Label','Preferences',...
  'Tag','TAG_UIMENU_OPTION_PREFERENCES',...
  'Enable', 'on',...
  'Callback', {@PreferencesMenuCallback});

%%  Menu QC automatic
%   Dependent functions : preferenceForm.m; tsg_preference.m,
%   @QCMenuCallback
%   ----------------------------------------------------------
hQCMenu = uimenu(...
  'Parent', hMainFig, 'Enable', 'off', 'HandleVisibility', handleVisibility,...
  'Label', 'QCauto');
hFlowMenu = uimenu(...
  'Parent', hQCMenu, 'Label','Flow', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'Flow'});
hPressMenu = uimenu(...
  'Parent', hQCMenu, 'Label','Press', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'Press'});
hSpeedMenu = uimenu(...
  'Parent', hQCMenu, 'Label','Ship Speed', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'Speed'});
hSSPSminMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSPS min', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSPSmin'});
hSSPSmaxMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSPS max', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSPSmax'});
hSSJTminMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSJT min', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSJTmin'});
hSSJTmaxMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSJT max', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSJTmax'});
hSSTPminMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSTP min', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSTPmin'});
hSSTPmaxMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSTP max', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSTPmax'});

jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%%  Menu Help with F1 Help and About submenu
% --------------------------------------------------------
hOptionMenu = uimenu(hMainFig,'Label','Help');
uimenu(hOptionMenu,'Label','Help',...
  'Tag','TAG_UIMENU_HELP_HELP',...
  'Enable', 'on',...
  'Callback', {@HelpMenuCallback});
uimenu(hOptionMenu,'Label','About TSGQC',...
  'Tag','TAG_UIMENU_HELP_ABOUT',...
  'Enable', 'on',...
  'Callback', {@AboutMenuCallback});

%%  Toolbar pushbuttons
%   -----------------------------------------------------------------------
hToolbar       =   uitoolbar(...   % Toolbar for Open and Print buttons
  'Parent',hMainFig, ...
  'HandleVisibility','on');
hOpenPushtool  =   uipushtool(...   % Opendoc toolbar button
  'Parent',hToolbar,...
  'TooltipString','Open file',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_OPEN',...
  'UserData', 'off',...
  'Enable', 'on',...
  'ClickedCallback', @OpenMenuCallback);
hSavePushtool  =   uipushtool(...   % Open Save toolbar button
  'Parent',hToolbar,...
  'TooltipString','Save NetCDF file',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_SAVE',...
  'Enable', 'off',...
  'ClickedCallback', @SaveMenuCallback);
hPrintFigPushtool  =   uipushtool(...   % Open Save toolbar button
  'Parent',hToolbar,...
  'TooltipString','Print figures',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_PRINTFIG',...
  'visible', 'on', 'Enable', 'on',...
  'ClickedCallback', @PrintFigMenuCallback);
hZoomInToggletool = uitoggletool(...   % Open Zoom In (increase) toolbar button
  'Parent',hToolbar,...
  'Separator', 'on', ...
  'TooltipString','Zoom In (increase)',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_ZOOM_IN',...
  'OnCallback',  @ZoomIn_OnMenuCallback,...
  'OffCallback',  @ZoomIn_OffMenuCallback);
hZoomOutToggletool = uitoggletool(...   % Open Zoom Out (decrease) toolbar button
  'Parent',hToolbar,...
  'Separator', 'on', ...
  'TooltipString','Zoom Out (decrease)',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_ZOOM_OUT',...
  'OnCallback',  @ZoomOut_OnMenuCallback,...
  'OffCallback',  @ZoomOut_OffMenuCallback);
hPanToggletool  =   uitoggletool(...   % Open Pan toolbar button
  'Parent',hToolbar,...
  'TooltipString','Pan',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_PAN',...
  'Enable', 'off',...
  'OffCallback', @Pan_OffMenuCallback,...
  'OnCallback',  @Pan_OnMenuCallback);
hQCToggletool  =   uitoggletool(...   % Open QC toolbar button
  'Parent',hToolbar,...
  'TooltipString','Validation codes',...
  'Separator', 'on', ...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_QC',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @QC_OffMenuCallback,...
  'OnCallback',  @QC_OnMenuCallback);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
hTimelimitToggletool  = uitoggletool(...
  'Parent',hToolbar,...
  'TooltipString','Select time limit',...
  'HandleVisibility','on', ...
  'Tag', 'CORRECT_STARTTIME', ...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @SelectTime_OffMenuCallback,...
  'OnCallback',  @SelectTime_OnMenuCallback);
hMapToggletool  =   uitoggletool(...   % Open Map toolbar button
  'Parent',hToolbar,...
  'TooltipString','Display ship track with m_map',...
  'Separator', 'on', ...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_MAP',...
  'UserData', 'off', ...
  'Enable', 'off',...
  'OffCallback', @Map_OffMenuCallback,...
  'OnCallback',  @Map_OnMenuCallback);
hGoogleEarthPushtool  = uipushtool(...   % Open Google Earth and plot track
  'Parent',hToolbar,...
  'TooltipString','Display ship track with Google Earth',...
  'CData', iconReadMat('google_earth.mat'),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_GOOGLEARTH',...
  'Enable', 'off',...
  'ClickedCallback', @GoogleEarthMenuCallback);
hClimToggletool  =   uitoggletool(...   % Open Climatology toolbar button
  'Parent',hToolbar,...
  'TooltipString','Climatology',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_CLIM',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @Clim_OffMenuCallback,...
  'OnCallback',  @Clim_OnMenuCallback);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
hCalToggletool  =   uitoggletool(...   %
  'Parent',hToolbar,...
  'TooltipString','Calibration sensors',...
  'Separator', 'on', ...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_CAL',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @Cal_OffMenuCallback,...
  'OnCallback',  @Cal_OnMenuCallback);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
hInterpToggletool  =   uitoggletool(...   %
  'Parent',hToolbar,...
  'TooltipString','Interpolate missing position',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_INTERP',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @Inter_OffMenuCallback,...
  'OnCallback',  @Inter_OnMenuCallback);
hBottleToggletool  = uitoggletool(...   % Correction module toolbar button
  'Parent',hToolbar,...
  'TooltipString','Correct the SSS TSG data',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_BOTTLE',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @Bottle_OffMenuCallback,...
  'OnCallback',  @Bottle_OnMenuCallback);

hHeaderPushtool  = uipushtool(...   % Open headerForm button
  'Parent',hToolbar,...
  'TooltipString','Fill the header form',...
  'Separator', 'on', ...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_HEADER',...
  'Enable', 'off',...
  'ClickedCallback', @HeaderMenuCallback);

hReportPushtool  = uipushtool(...   % Open Report saving button
  'Parent',hToolbar,...
  'TooltipString','Save a report',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_REPORT',...
  'Enable', 'off',...
  'ClickedCallback', @ReportMenuCallback);

%% Dynamic text area
%   -----------------------------------------------------------------------
%  Dynamic text area that displays the loaded filename, date, position and
%  salinity, temperature
%  ------------------------------------------------------------------------

% Create an uipanel
% -----------------
hInfoPanel = uipanel( ...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'BorderType', 'none',...
  'Visible', 'on', ...
  'Position',[.01, .96, .98, .04]);

% Dynamic text area that displays the date
% ----------------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.01, .25, .04, .6], ...
  'String', 'File:');
hInfoFileText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'No file loaded', ...
  'Position', [.05, .25, .1, .6]);

% Text area that displays the date
% --------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.15, .25, .04, .6], ...
  'String', 'Date:');
hInfoDateText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.20, .25, .13, .6]);

% Text area that displays the latitude
% ------------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.33, .25, .06, .6], ...
  'String', 'Latitude:');
hInfoLatText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.4, .25, .9, .6]);

% Text area that displays the longitude
% -------------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.495, .25, .08, .6], ...
  'String', 'Longitude:');
hInfoLongText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.585, .25, .09, .6]);

% Text area that display salinity and temperature
% -----------------------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position', [.68, .25, .05, .6], ...
  'String', 'SSPS:');
hInfoSSPSText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.73, .25, .05, .6]);
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.785, .25, .05, .6], ...
  'String', 'SSJT:');
hInfoSSJTText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.835, .25, .05, .6]);
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.89, .25, .05, .6], ...
  'String', 'SSTP:');
hInfoSSTPText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.94, .25, .05, .6]);

%% Plot axes
%   -----------------------------------------------------------------------
% The axes 1,2 and 3 will be plot in a uipanel
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
% axe 1 as propertie 'HandleVisibility' set to 'on' to prevent hidden
% visibility when first plot is empty
%--------------------------------------------------------------------
hPlotsPanel = uipanel( ...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'BorderType', 'etchedin',...
  'Visible', 'on',...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  'Position',[0.15, 0.0, .85, .95]);
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]);

% ---------------------------------
hMapFig = figure(...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  'BackingStore','off',...
  'NumberTitle', 'off', ...
  'Resize', 'on', ...
  'Toolbar', 'none', ...
  'Tag', 'MAP_FIGURE', ...
  'Visible','off',...
  'WindowStyle', 'normal', ...
  'CloseRequestFcn', @QuitMapCallback,...
  'Units', 'normalized',...
  'Position',[0.17, 0.05, .8, .44],...
  'Color', get(0, 'DefaultUIControlBackgroundColor'));

% display map menus
% -----------------
hMapResolutionMenu = uimenu(...
  'Parent', hMapFig,...
  'HandleVisibility', handleVisibility,...
  'Label', 'Map');

uimenu(hMapResolutionMenu,'Label','Low',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_RESOLUTION_1',...
  'Enable', 'on',...
  'Callback', {@mapResolutionCallback, 1});

uimenu(hMapResolutionMenu,'Label','Medium',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_RESOLUTION_2',...
  'Enable', 'on',...
  'Callback', {@mapResolutionCallback, 2});

uimenu(hMapResolutionMenu,'Label','Intermediate',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_RESOLUTION_3',...
  'Enable', 'on',...
  'Callback', {@mapResolutionCallback, 3});

uimenu(hMapResolutionMenu,'Label','High',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_RESOLUTION_4',...
  'Enable', 'on',...
  'Callback', {@mapResolutionCallback, 4});

% set 'checked' property to 'on' for current map resolution
% ------------------------------------------------------------
hdl = flipud(findobj( '-regexp', 'tag', 'TAG_UIMENU_MAP_RESOLUTION_'));
set(hdl(tsg.preference.map_resolution), 'checked', 'on');

% display map Border menu
% ------------------------
hMapBorderMenu = uimenu(...
  'Parent', hMapFig,...
  'HandleVisibility', handleVisibility,...
  'Label', 'Border');

uimenu(hMapBorderMenu,'Label','0',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_BORDER_1',...
  'Enable', 'on',...
  'Callback', {@mapDynaBorderCallback, 0});

uimenu(hMapBorderMenu,'Label','1',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_BORDER_2',...
  'Enable', 'on',...
  'Callback', {@mapDynaBorderCallback, 1});

uimenu(hMapBorderMenu,'Label','2',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_BORDER_3',...
  'Enable', 'on',...
  'Callback', {@mapDynaBorderCallback, 2});

uimenu(hMapBorderMenu,'Label','5',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_BORDER_4',...
  'Enable', 'on',...
  'Callback', {@mapDynaBorderCallback, 5});

uimenu(hMapBorderMenu,'Label','10',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_BORDER_5',...
  'Enable', 'on',...
  'Callback', {@mapDynaBorderCallback, 10});

uimenu(hMapBorderMenu,'Label','15',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_BORDER_6',...
  'Enable', 'on',...
  'Callback', {@mapDynaBorderCallback, 15});

% set 'checked' property to 'on' for current map border menu
% ----------------------------------------------------------
hdl = flipud(findobj( '-regexp', 'tag', 'TAG_UIMENU_MAP_BORDER_'));
set(hdl(tsg.preference.map_border_value), 'checked', 'on');

% map Type menu
% --------------
hMapPatchMenu = uimenu(hMapFig,'Label','Type', ...
  'Tag', 'TAG_UIMENU_MAP_PATCH');

% preset map patch menu from preference
if tsg.preference.map_patch_value == 2
  chk_with_patch = 'on';
  chk_without_patch = 'off';
else
  chk_with_patch = 'off';
  chk_without_patch = 'on';
end

uimenu(hMapPatchMenu,'Label','Map without patch (faster)',...
  'Checked',chk_without_patch,...
  'Tag','TAG_UIMENU_MAP_WITHOUT_PATCH',...
  'Enable', 'on',...
  'Callback', {@mapPatchMenuCallback, 0});

uimenu(hMapPatchMenu,'Label','Map with patch (slower)',...
  'Checked',chk_with_patch,...
  'Tag','TAG_UIMENU_MAP_WITH_PATCH',...
  'Enable', 'on',...
  'Callback', {@mapPatchMenuCallback, 1});

% map Climatology menu
% --------------------
hMapClimatologyMenu = uimenu(hMapFig,'Label','Climatology', ...
  'Tag', 'TAG_UIMENU_MAP_CLIMATOLOGY');

% preset map climatology menu from preference
if tsg.preference.map_climatology == 1
  chk_with_climatology = 'on';
  chk_without_climatology = 'off';
else
  chk_with_climatology = 'off';
  chk_without_climatology = 'on';
end

uimenu(hMapClimatologyMenu,'Label','Map with surface climatology',...
  'Checked', chk_with_climatology,...
  'Tag','TAG_UIMENU_MAP_CLIMATOLOGY_WITH',...
  'Enable', 'on',...
  'Callback', {@mapClimatologyCallback, 1});

uimenu(hMapClimatologyMenu,'Label','Map without surface climatology',...
  'Checked', chk_without_climatology,...
  'Tag','TAG_UIMENU_MAP_CLIMATOLOGY_WITHOUT',...
  'Enable', 'on',...
  'Callback', {@mapClimatologyCallback, 0});

% set map axes
% ------------
hPlotAxes(4) = axes(...     % the axes for plotting ship track map
  'Parent', hMapFig, ...
  'Units', 'normalized', ...
  'Visible', 'off', ...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  'Tag', 'TAG_AXES_MAP', ...
  'Color', 'none', ...
  'UserData', 'off', ...
  'HandleVisibility','on', ...
  'Position',[.05, .05, .9, .9]);

jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%% uipanel for Quality Control Buttons - uibutton group
%   -----------------------------------------------------------------------
hbgQc = uibuttongroup(...
  'Parent', hMainFig, ...
  'Title', 'Validation Codes', ...
  'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
  'tag', 'TAG_QC_DISPLAY_PANEL',...
  'HandleVisibility','on',...
  'Visible', 'off',...
  'BorderType', 'etchedin',...
  'Units', 'normalized', 'Position', [.0, .71, .15, .25]);

% Initialize CallBack for button group properties
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
% -----------------------------------------------
set(hbgQc,'SelectionChangeFcn',@radioButtonQc);
%% Context Menus

% RadioButtons for Quality control
% -----------------------------------------------------------------------
hQcCmenu = uicontextmenu(...
  'Parent', hMainFig, ...
  'HandleVisibility','on' );

% get list of keys from hashtable tsg.qc.hash, defined inside
% tsg_initialisation.m
% -----------------------------------------------------------

% internal loop count with state to on
% ------------------------------------
count = 0;

% iterate (loop) on each key store inside hastable
% ------------------------------------------------
  % get key and some values in hashtable tsg.qc.hash
  % ------------------------------------------------
  label = tsg.qc.hash.(key).label;
  color = tsg.qc.hash.(key).color;
  state = tsg.qc.hash.(key).state;
  % construct context menu with only code set to 'on' (valid)
  % ---------------------------------------------------------
  if strcmp( state, 'on')
    % add menu to hQcCmenu uicontextmenu
    % ----------------------------------
    uimenu(...
      'Parent', hQcCmenu,...
      'HandleVisibility','on', ...
      'Label', label,...
      'ForegroundColor', color,...
      'Callback', {@QC_ContextMenuCallback, key});
    % add button QC to hbgQc uibuttongroup
    % ------------------------------------
    uicontrol(...
      'Parent', hbgQc,...
      'Style', 'radiobutton',...
      'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...
      'HorizontalAlignment', 'left', ...
      'HandleVisibility','on', ...
      'String', label,...
      'Units', 'normalized', 'Position', [.01, .85-count*.12, .6, 0.09]);
    % add text QC display statistic on hQcPanel
    % -----------------------------------------
    uicontrol(...
      'Parent', hbgQc,...
      'Style', 'text',...
      'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...
      'HorizontalAlignment', 'right', ...
      'HandleVisibility','on', ...
      'String', 'N/A ',...
      'Units', 'normalized', 'Position', [.61, .85-count*.12, .37, 0.09]);
    % increment count
    % ---------------
    count = count + 1;
  end
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  
end % end of for loop
% zoom context menu
% -----------------
zoom_context_menu = uicontextmenu(...
  'Parent', hMainFig, 'HandleVisibility','on' );

uimenu('parent',zoom_context_menu, 'Label', 'Zoom Out (shift + click)', ...
  'Callback', @zoom_out_callback);
uimenu('parent',zoom_context_menu, 'Label', 'Reset to Original view', ...
  'Callback', @zoom_reset_callback);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%% uipanel for checkboxes
%   --------------------------------------
hCorPanel = uipanel(...
  'Parent', hMainFig, ...
  'Title', 'Correction applied to ...', ...
  'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
  'tag', 'TAG_CORRECTION_DISPLAY_PANEL',...
  'HandleVisibility','on',...
  'Visible', 'off',...
  'BorderType', 'etchedin',...
  'Units', 'normalized', 'Position', [.0, .001, .15, .24]);

% internal loop count with state to on
% ------------------------------------
count = 0;

% iterate (loop) on each key store inside hastable
% ------------------------------------------------
  % get key and some values in hashtable tsg.qc.hash
  % ------------------------------------------------
  label = tsg.qc.hash.(key).label;
  color = tsg.qc.hash.(key).color;
  state = tsg.qc.hash.(key).state;
  if strcmp(char(key), 'HARBOUR') || strcmp(char(key), 'GOOD') ||...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    value = 1;
  % construct context menu with only code set to 'on' (valid)
  % ---------------------------------------------------------
  if strcmp( state, 'on')
    % add button QC to hbgQc uibuttongroup
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % ------------------------------------
    cbCorr(i) = uicontrol(...
      'Parent', hCorPanel, ...
      'Style', 'checkbox', ...
      'String', label, ...
      'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...
      'Value', value, ...
      'Tag',  ['TAG_CHECK_CORRECTION_' char(key)], ...
      'HandleVisibility', 'on',...
      'Units', 'normalized', 'Position', [.01, .85-count*.12, .6, 0.09]);
    % increment count
    % ---------------
    count = count + 1;
  end
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  
end %end for loop
%% uibutton group panel - Choose the parameter (SSPS - SSTP - SSJT)
%   POP_UP filled in with the function "initParameterChoice"
%   -----------------------------------------------------------------------
hbgParameter = uibuttongroup(...
  'Parent', hMainFig, ...
  'Title', 'TSG Parameter', ...
  'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
  'tag', 'TAG_PARA_DISPLAY_PANEL',...
  'HandleVisibility','on',...
  'Visible', 'off',...
  'BorderType', 'etchedin',...
  'Units', 'normalized', 'Position', [.0, .78, .15, .18]);
text= {'Validation - Top'; 'Middle plot'; 'Bottom plot'};
ybottom = [.7 .38 .05];
for ipmh= 1 : 3
  pmhPara(ipmh) = uicontrol(...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    'Parent', hbgParameter, 'Style', 'popupmenu', ...
    'String', { 'NONE' }, 'Value', 1, ...
    'HandleVisibility', handleVisibility, ...
    'Tag', sprintf('SELECT_PARAMETER_%d', ipmh), ...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    'Callback', {@SelectParameter, ipmh}, ...
    'Units', 'normalized', 'Position', [.01, ybottom(ipmh), .3, 0.25]);
  htParameter(ipmh) = uicontrol( ...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    'Parent', hbgParameter, 'Style', 'Text', ...
    'String', text{ipmh}, ...
    'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
    'Units', 'normalized',  'Position',[.35, ybottom(ipmh), .6, 0.25]);
%% uipanel for QC duplication
%   --------------------------------------
hDuplicateQcPanel = uipanel(...
  'Parent', hMainFig, ...
  'Title', 'Duplicate QC', ...
  'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
  'tag', 'TAG_CORRECTION_DISPLAY_PANEL',...
  'HandleVisibility','on',...
  'Visible', 'off',...
  'BorderType', 'etchedin',...
  'Units', 'normalized', 'Position', [.0, .40, .15, .10]);
hButtonDuplicateQC = uicontrol( ...
  'Style','pushbutton', ...
  'Parent',hDuplicateQcPanel, ...
  'Units', 'normalized', ...
  'String','Duplicate QC',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'DUPLICATE_QC_PUSH', ...
  'pos',[.2 .3 .6 .4], ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @duplicateQc);

%% uiButtonGroup set to choose the Correction method
% -------------------------------------------------------------------------

% Create the button group
hbgCorMethod = uibuttongroup( ...
  'Parent',hMainFig, ...
  'Title','Correction Method', ...
  'Units', 'normalized', ...
  'FontSize',tsg.fontSize-1, 'Fontweight', 'bold',...
  'Visible', 'off', ...
hrbCorCancel = uicontrol( ...
  'Style','pushbutton', ...
  'Parent',hbgCorMethod, ...
  'Units', 'normalized', ...
  'String','Cancel all',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_CANCEL_PUSH', ...
  'HandleVisibility', handleVisibility, ...
  'Callback', {@cancelCorrectionCallback,'total'});
hrbPartCorCancel = uicontrol( ...
  'Style','pushbutton', ...
  'Parent',hbgCorMethod, ...
  'Units', 'normalized', ...
  'String',{'Cancel within Date Limits'},...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_PART_CANCEL_PUSH', ...
  'pos',[.05 .19 .9 .13],...
  'HandleVisibility', handleVisibility, ...
  'Callback', {@cancelCorrectionCallback,'part'});
hrbCorBiais = uicontrol( ...
  'Style','pushbutton', ...
  'Parent',hbgCorMethod, ...
  'Units', 'normalized', ...
  'String','Bias adjustment',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_BIAIS_PUSH', ...
  'pos',[.05 .41 .9 .13],...
  'HandleVisibility', handleVisibility, ...
  'Callback', @biasCorrectionCallback);
hrbCorGradient = uicontrol( ...
  'Style','pushbutton', ...
  'Parent',hbgCorMethod, ...
  'Units', 'normalized', ...
  'String','Gradient adjustment',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_GRADIENT_PUSH', ...
  'Callback', @gradientCorrectionCallback);
hrbCorLinear = uicontrol( ...
  'Style','pushbutton', ...
  'Parent',hbgCorMethod, ...
  'Units', 'normalized', ...
  'String','Linear adjustment',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_LINEAR_PUSH', ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @linearCorrectionCallback);
hrbCorMedian = uicontrol( ...
  'Style','pushbutton', ...
  'Parent',hbgCorMethod, ...
  'Units', 'normalized', ...
  'String','Median filter adjustment',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_MEDIAN_PUSH', ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @medianCorrectionCallback);

%% uiPanel for the Date limits used in the Correction module

% Choose the date limits for the correction
% --------------------------------------------------
% Create the uipanel
hpDateLimit = uipanel( ...
  'Parent', hMainFig, ...
  'Title', 'Date Limits', ...
  'Units', 'normalized', ...
  'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
  'Visible', 'off', ...

htDateMin = uicontrol( ...
  'Parent', hpDateLimit, ...
  'Style', 'Text', ...
  'String', 'Min : yyyy-mm-dd hh:mm:ss', ...
  'HorizontalAlignment', 'left', ...
  'Units', 'normalized', ...
  'FontSize', tsg.fontSize-1, ...
  'Position',[.01 .8 .95 .15]);
hetDateMin = uicontrol( ...
  'Parent', hpDateLimit, ...
  'Style', 'edit', ...
  'Units', 'normalized', ...
  'BackgroundColor', 'white',...
  'FontSize', tsg.fontSize, ...
  'Tag', 'CORRECT_DATEMIN_EDIT',...
  'Position',[.01 .6 .95 .17]);

htDateMax = uicontrol( ...
  'Parent', hpDateLimit, ...
  'Style', 'Text', ...
  'String', 'Max : yyyy-mm-dd hh:mm:ss', ...
  'HorizontalAlignment', 'left', ...
  'Units', 'normalized', ...
  'FontSize', tsg.fontSize-1, ...
  'Position',[.01 .35 .95 .15]);
hetDateMax = uicontrol( ...
  'Parent', hpDateLimit, ...
  'Style', 'edit', ...
  'Units', 'normalized', ...
  'BackgroundColor', 'white',...
  'FontSize', tsg.fontSize, ...
  'Tag', 'CORRECT_DATEMAX_EDIT',...
  'Position',[.01 .15 .95 .17]);

%% uiPanel for the Calibration coefficient used the Correction module

% Create the uipanel
hpCalCoef = uipanel( ...
  'Parent', hMainFig, ...
  'Title', 'Calibration', ...
  'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
  'Visible', 'off', ...
  'Units', 'normalized','Position', [.0, .46, .15, .50]);

jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
htCalCNDC1 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'Conductivity : C = A*C + B', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .925 .95 .05]);
htCalCNDC2 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'A', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .85 .08 .05]);
hetCalCNDCSlope = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'edit', ...
  'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
  'Tag', 'CORRECT_CAL_CNDC_A',...
  'HandleVisibility','on', ...
  'Units', 'normalized', 'Position',[.1 .85 .85 .05]);
htCalCNDC3 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'B', ...
  'HorizontalAlignment', 'left',  'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .775 .08 .05]);
hetCalCNDCOffset = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'edit', ...
  'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
  'HandleVisibility','on', ...
  'Tag', 'CORRECT_CAL_CNDC_B',...
  'Units', 'normalized', 'Position',[.1 .775 .85 .05]);

htCalSSJT1 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'SSJT : T = A*T + B', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .675 .95 .05]);
htCalSSJT2 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'A', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .6 .08 .05]);
hetCalSSJTSlope = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'edit', ...
  'BackgroundColor', 'white',...
  'FontSize', tsg.fontSize, ...
  'HandleVisibility','on', ...
  'Tag', 'CORRECT_CAL_SSJT_A',...
  'Units', 'normalized', 'Position',[.1 .6 .85 .05]);
htCalSSJT3 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'B', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .525 .08 .05]);
hetCalSSJTOffset = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'edit', ...
  'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
  'HandleVisibility','on', ...
  'Tag', 'CORRECT_CAL_SSJT_B',...
  'Units', 'normalized', 'Position',[.1 .525 .85 .05]);

htCalSSTP1 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'SSPT : T = A*T + B', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .425 .95 .05]);
htCalSSTP2 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'A', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .35 .08 .05]);
hetCalSSTPSlope = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'edit', ...
  'BackgroundColor', 'white',...
  'FontSize', tsg.fontSize, ...
  'HandleVisibility','on', ...
  'Tag', 'CORRECT_CAL_SSJT_A',...
  'Units', 'normalized', 'Position',[.1 .35 .85 .05]);
htCalSSTP3 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'B', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .275 .08 .05]);
hetCalSSTPOffset = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'edit', ...
  'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
  'HandleVisibility','on', ...
  'Tag', 'CORRECT_CAL_SSJT_B',...
  '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);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
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);

jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%
% end of main function (GUI definition)

%% *************************** CALLBACKS **********************************
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%  All following callback are in nested functions
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%% OpenMenuCallback function run when the Open menu item is selected
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
  function OpenMenuCallback(src, evnt)
    % Activate or desactivate uipanels
    % --------------------------------
    set( hpCalCoef,            'Visible', 'off' );
    set( hpDateLimit,          'Visible', 'off' );
    set( hpInterpPos,          'Visible', 'off' );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    %     set( hMapFig,            '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' );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    %     set( hMapToggletool,       'state', 'off' );
    set( hTimelimitToggletool, 'state', 'off' );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    %    set( hZoomToggletool,      'state', 'off' );
    % Get the tsg structure
    % ---------------------
    tsg = getappdata( hMainFig, 'tsg_data');
    
    % Open standard dialog box for retrieving files
    % ---------------------------------------------
    if isempty(inputFile)
      [fileName, pathname, filterIndex] = uigetfile( tsg.preference.fileExtension, 'Pick a file');
    else
      % batch mode
      [pathname,fileName,ext] = fileparts(inputFile);
      fileName = strcat(fileName, ext);
      inputFile = [];
      filterIndex = 1;
    end
    % flushes the evnt queue and updates the closed uigetfile window
    % ---------------------------------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    drawnow;
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % if the user clicks the Cancel button or closes the dialog window,
    % FileName and PathName are set to 0.
    % -----------------------------------------------------------------
    if ~isequal(fileName, 0)
      % uigetfile add an extra index (*.*) and a bug if user select file from
      % *.* and fileExtension(filterIndex) create an Index exceeds matrix
      % now, we use strcat('*',ext) instead
      [~,~,ext] = fileparts(fileName);
      
      % Pointer set to watch during reading and plotting
      % ------------------------------------------------
      set( hMainFig, 'Pointer', 'watch' );
      % construct valid and full file path
      % -----------------------------------
      fullFileName = fullfile(pathname, fileName);
      
      % the last extension selected move on top in cell array preference.fileExtensions
      % ----------------------------------------------------------------------
      tsg.preference.fileExtension = ...
        circshift(tsg.preference.fileExtension, 1 - filterIndex);
      setappdata( hMainFig, 'tsg_data', tsg);
      % Read the data
      % -------------
      [errTsg, errSpl] = read_data( hMainFig, strcat('*',ext), fullFileName);
      % 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');
        set(hQCMenu, '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', fileName);
        % The callback to detect the mouse motion can be set to on
        % --------------------------------------------------------
        set( hMainFig, 'UserData', 'ButtonMotionOn');
        % Update QC statistics
        % --------------------
        display_QC( hMainFig );
        % Initialise the popupmenu displaying the parameters that can be
        % plot
        % --------------------------------------------------------------
        initParameterChoice( hMainFig, pmhPara );
        tsg = getappdata( hMainFig, 'tsg_data');
        % Test if there is records with the same date and time.
        % very simple test made because of a bug in the acquisition
        % software used on IRD VOS
        % ---------------------------------------------------------
        testDoubleDate(hMainFig);
        
        % Test if there are fillable missing positions
        % ---------------------------------------------------------
        testMissPos(hMainFig);
        
      elseif errTsg > -2
        % Problem to read the file or
        % Choice of parameters for Labview file canceled by the user
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
        % 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 )
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
        plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
        plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
        plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );
        set( hMapFig, 'Name', tsg.file.name);
        % Update the map if already displayed
        % -----------------------------------
        if strcmp( get(hMapFig,'visible'), 'on') == 1
          erase_Line( hPlotAxes, 4 );
          plot_map( hMainFig, hPlotAxes);
    end    % if ~isequal(fileName, 0)
    % Pointer reset to arrow
    % ----------------------
    set( hMainFig, 'Pointer', 'arrow' );
  end

%% Inter_OnMenuCallback ................................... Interpolation
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
% Callback function run when
%
  function Inter_OnMenuCallback( src, evnt)
    % 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));
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % Draw the 3 plots of the interpolation figure
    % --------------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    plot_Interpolation( hMainFig, hPlotAxes, 1 );
    plot_Interpolation( hMainFig, hPlotAxes, 2 );
    plot_Interpolation( hMainFig, hPlotAxes, 3 );
  end

%% Inter_OffMenuCallback .................................. Interpolation
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
% Callback function run when
%
  function Inter_OffMenuCallback( src, evnt)
    % 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' );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % Draw the 3 plots of the validation figure
    % -----------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
    plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
    plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );
    % Set the pointer
    % ---------------
    set( hMainFig, 'Pointer', 'arrow');
  end

%% InterpLinearCallback ...............................Interpolation Linear
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%------------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
  function InterpPosLinearCallback( src, evnt)
    % 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
        % 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
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
  function InterpPosOtherCallback( src, evnt)
    msgbox( 'Method not yet implemented', ...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
      'Function InterpOtherCallback', ...
      'warn',...
      'modal' );
  end

%% InterpPosCancelCallback ..........................Cancel Interpolation
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
  function InterpPosCancelCallback(src, evnt)
    % Callback function run when
    % Get tsg application data
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data' );
    % Get NO_CONTROL and INTERPOLATED_VALUE codes
    % -------------------------------------------
    NO_CONTROL         = tsg.qc.hash.NO_CONTROL.code;
    INTERPOLATED_VALUE = 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
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
  function Cal_OnMenuCallback( src, evnt)
    % 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' );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % 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' );
    % find SLOPE (A) and OFFSET (B) indices in _LINCOEF_CONV array
    % ------------------------------------------------------------
    A_CNDC = strmatch('SLOPE', tsg.CNDC_LINCOEF_CONV);
    B_CNDC = strmatch('OFFSET',tsg.CNDC_LINCOEF_CONV);
    A_SSJT = strmatch('SLOPE', tsg.SSJT_LINCOEF_CONV);
    B_SSJT = strmatch('OFFSET',tsg.SSJT_LINCOEF_CONV);
    A_SSTP = strmatch('SLOPE', tsg.SSTP_LINCOEF_CONV);
    B_SSTP = strmatch('OFFSET',tsg.SSTP_LINCOEF_CONV);
    % Write the Cal Coef in the Editable uicontrol
    % --------------------------------------------
    set( hetCalCNDCSlope,  'String', num2str(tsg.CNDC_LINCOEF(A_CNDC)));
    set( hetCalCNDCOffset, 'String', num2str(tsg.CNDC_LINCOEF(B_CNDC)));
    set( hetCalSSJTSlope,  'String', num2str(tsg.SSJT_LINCOEF(A_SSJT)));
    set( hetCalSSJTOffset, 'String', num2str(tsg.SSJT_LINCOEF(B_SSJT)));
    set( hetCalSSTPSlope,  'String', num2str(tsg.SSTP_LINCOEF(A_SSTP)));
    set( hetCalSSTPOffset, 'String', num2str(tsg.SSTP_LINCOEF(B_SSTP)));
    % Intermediate variables
    % ----------------------
    tsg.CNDC_LINCOEF_NEW(A_CNDC) = str2num(get( hetCalCNDCSlope,  'String'));
    tsg.CNDC_LINCOEF_NEW(B_CNDC) = str2num(get( hetCalCNDCOffset, 'String'));
    tsg.SSJT_LINCOEF_NEW(A_SSJT) = str2num(get( hetCalSSJTSlope,  'String'));
    tsg.SSJT_LINCOEF_NEW(B_SSJT) = str2num(get( hetCalSSJTOffset, 'String'));
    tsg.SSTP_LINCOEF_NEW(A_SSTP) = str2num(get( hetCalSSTPSlope,  'String'));
    tsg.SSTP_LINCOEF_NEW(B_SSTP) = str2num(get( hetCalSSTPOffset, 'String'));
    % Save tsg application data
    % --------------------------
    setappdata( hMainFig, 'tsg_data', tsg );
  end


%% Cal_OffMenuCallback ..................................... Calibration
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
  function Cal_OffMenuCallback( src, evnt)
    % 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' );
    % find SLOPE (A) and OFFSET (B) indices in _LINCOEF_CONV array
    % ------------------------------------------------------------
    A_CNDC = strmatch('SLOPE', tsg.CNDC_LINCOEF_CONV);
    B_CNDC = strmatch('OFFSET',tsg.CNDC_LINCOEF_CONV);
    A_SSJT = strmatch('SLOPE', tsg.SSJT_LINCOEF_CONV);
    B_SSJT = strmatch('OFFSET',tsg.SSJT_LINCOEF_CONV);
    A_SSTP = strmatch('SLOPE', tsg.SSTP_LINCOEF_CONV);
    B_SSTP = strmatch('OFFSET',tsg.SSTP_LINCOEF_CONV);
    % Save the calibration coefficient
    % --------------------------------
    tsg.CNDC_LINCOEF(A_CNDC) = tsg.CNDC_LINCOEF_NEW(A_CNDC);
    tsg.CNDC_LINCOEF(B_CNDC) = tsg.CNDC_LINCOEF_NEW(B_CNDC);
    tsg.SSJT_LINCOEF(A_SSJT) = tsg.SSJT_LINCOEF_NEW(A_SSJT);
    tsg.SSJT_LINCOEF(B_SSJT) = tsg.SSJT_LINCOEF_NEW(B_SSJT);
    tsg.SSTP_LINCOEF(A_SSTP) = tsg.SSTP_LINCOEF_NEW(A_SSTP);
    tsg.SSTP_LINCOEF(B_SSTP) = tsg.SSTP_LINCOEF_NEW(B_SSTP);
    tsg.CNDC_LINCOEF_NEW = [];
    tsg.SSJT_LINCOEF_NEW = [];
    tsg.SSTP_LINCOEF_NEW = [];
    % Save tsg application data
    % --------------------------
    setappdata( hMainFig, 'tsg_data', tsg );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % Draw the 3 plots of the validation figure
    % -----------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
    plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
    plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );
  end

%% CalibrateCallback .......................................... Calibration
  function CalibrateCallback(src, evnt)
    % Callback function run when
    % Get tsg application data
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data' );
    % find SLOPE (A) and OFFSET (B) indices in _LINCOEF_CONV array
    % ------------------------------------------------------------
    A_CNDC = strmatch('SLOPE', tsg.CNDC_LINCOEF_CONV);
    B_CNDC = strmatch('OFFSET',tsg.CNDC_LINCOEF_CONV);
    A_SSJT = strmatch('SLOPE', tsg.SSJT_LINCOEF_CONV);
    B_SSJT = strmatch('OFFSET',tsg.SSJT_LINCOEF_CONV);
    A_SSTP = strmatch('SLOPE', tsg.SSTP_LINCOEF_CONV);
    B_SSTP = strmatch('OFFSET',tsg.SSTP_LINCOEF_CONV);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % Get the calibration coefficients.
    % They will be used in the function calibration
    % ---------------------------------------------
    tsg.CNDC_LINCOEF_NEW(A_CNDC) = str2num(get( hetCalCNDCSlope,  'String'));
    tsg.CNDC_LINCOEF_NEW(B_CNDC) = str2num(get( hetCalCNDCOffset, 'String'));
    tsg.SSJT_LINCOEF_NEW(A_SSJT) = str2num(get( hetCalSSJTSlope,  'String'));
    tsg.SSJT_LINCOEF_NEW(B_SSJT) = str2num(get( hetCalSSJTOffset, 'String'));
    tsg.SSTP_LINCOEF_NEW(A_SSTP) = str2num(get( hetCalSSTPSlope,  'String'));
    tsg.SSTP_LINCOEF_NEW(B_SSTP) = 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
    % -------------------------------------------------------------------
Yves Gouriou's avatar
Yves Gouriou committed
    % 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(src, evnt)
    % 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 );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % Update the Adjusted variables
    % -----------------------------
Yves Gouriou's avatar
Yves Gouriou committed
    % updateAdjustedVariable( hMainFig );
    % find SLOPE (A) and OFFSET (B) indices in _LINCOEF_CONV array
    % ------------------------------------------------------------
    A_CNDC = strmatch('SLOPE', tsg.CNDC_LINCOEF_CONV);
    B_CNDC = strmatch('OFFSET',tsg.CNDC_LINCOEF_CONV);
    A_SSJT = strmatch('SLOPE', tsg.SSJT_LINCOEF_CONV);
    B_SSJT = strmatch('OFFSET',tsg.SSJT_LINCOEF_CONV);
    A_SSTP = strmatch('SLOPE', tsg.SSTP_LINCOEF_CONV);
    B_SSTP = strmatch('OFFSET',tsg.SSTP_LINCOEF_CONV);
    % Write the Cal Coef in the Editable uicontrol
    % --------------------------------------------
    set( hetCalCNDCSlope,  'String', num2str(tsg.CNDC_LINCOEF(A_CNDC)));
    set( hetCalCNDCOffset, 'String', num2str(tsg.CNDC_LINCOEF(B_CNDC)));
    set( hetCalSSJTSlope,  'String', num2str(tsg.SSJT_LINCOEF(A_SSJT)));
    set( hetCalSSJTOffset, 'String', num2str(tsg.SSJT_LINCOEF(B_SSJT)));
    set( hetCalSSTPSlope,  'String', num2str(tsg.SSTP_LINCOEF(A_SSTP)));
    set( hetCalSSTPOffset, 'String', num2str(tsg.SSTP_LINCOEF(B_SSTP)));
    % 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' );
%% ZoomIn_OnMenuCallback
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
% Callback function run when the toolbar zoom in (increase) push button
% is pressed
%----------------------------------------------------------------------
  function ZoomIn_OnMenuCallback(src, evnt)
    % 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' );
    % returns a zoom mode object for the figure hMainFig handle
    % ---------------------------------------------------------
    hZoom = zoom(hMainFig);
    % Set the UI Context Menu to the custom menu
    % -----------------------------------------
    set(hZoom, 'UIContextMenu', zoom_context_menu)
    
    % Turns off the automatic adaptation of date ticks
    % ------------------------------------------------
    zoomAdaptiveDateTicks('off');
    % turns interactive zooming to in (increase)
    % ------------------------------------------
    set(hZoom, 'direction', 'in');
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % test zoom operation on the MAP axes objects
    % --------------------------------------------------
    %     hMapZoom = zoom(hMapFig);
    %     setAllowAxesZoom(hMapZoom, hPlotAxes(4), true);
    %      set(hMapZoom, 'enable', 'on');
    % 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);
    
    % Set map with border and save tsg
    % --------------------------------
    setappdata( hMainFig, 'tsg_data', tsg );
    
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
% Callback function run when the toolbar zoom in (increase) push button
% is pressed
%----------------------------------------------------------------------
  function ZoomIn_OffMenuCallback(src, evnt)
    % disable zoom mode
    % -----------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%------------------------------------------------------------------------
% Callback function run when the toolbar zoom out (descrease) push button
% is pressed
%------------------------------------------------------------------------
  function ZoomOut_OnMenuCallback(src, evnt)
    % Desactivate Zoom In Toggle toggle button
    % -----------------------------------------
    set( hZoomInToggletool,    'state', 'off' );
    set( hQCToggletool,        'state', 'off' );
    set( hPanToggletool,       'state', 'off' );
    set( hTimelimitToggletool, 'state', 'off' );
    % returns a zoom mode object for the figure hMainFig handle
    % ---------------------------------------------------------
    hZoom = zoom(hMainFig);
    % Set the UI Context Menu to the custom menu
    % -----------------------------------------
    set(hZoom, 'UIContextMenu', zoom_context_menu)
    
    % turns interactive zooming out (decrease)
    % ----------------------------------------
    set(hZoom, 'direction', 'out');
    % Disallows a zoom operation on the MAP axes objects
    % --------------------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    %     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);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%------------------------------------------------------------------------
% Callback function run when the toolbar zoom out (descrease) push button
% is pressed
%------------------------------------------------------------------------
  function ZoomOut_OffMenuCallback(src, evnt)
    % turns interactive zooming off
    % -----------------------------
    zoom off;
    % cursor back to normal, test if it's really necessery
    % -----------------------------------------------------
    % set(hMainFig, 'Pointer', 'arrow');
    
    % Desactivate Zoom Out Toggle toggle button
    % -----------------------------------------
    set( hZoomOutToggletool,    'state', 'off' );
% callback function run from context menu from right clic in zoom mode
% --------------------------------------------------------------------
  function zoom_reset_callback(src, evnt)
    % restore map border to its preference setting for next map plotting
    % call by ZoomPan_PostCallback
    % ------------------------------------------------------------------
    tsg.preference.map_border = ...
      str2double(tsg.preference.map_border_string(tsg.preference.map_border_value));
    setappdata( hMainFig, 'tsg_data', tsg );
    
    % returns the plot to its initial zoom setting and desactivate zoom
    % -----------------------------------------------------------------
    hZoom = zoom(hMainFig);
    % zoom off doesn't work
    set(hZoom, 'enable', 'off');
    
    % Desactivate Zoom In/Out Toggle toggle button
    % -----------------------------------------
    set( hZoomInToggletool,    'state', 'off' );
    set( hZoomOutToggletool,    'state', 'off' );
    
% callback function run from context menu from right clic in zoom mode
% --------------------------------------------------------------------
  function zoom_out_callback(src, evnt)
    
    % zoom out by the specified zoom factor 0.5
    % ------------------------------------------
    zoom(0.5);
%% Pan_OnMenuCallback
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
% Callback function run when the pan toggle toolbar is selected
%----------------------------------------------------------------------
  function Pan_OnMenuCallback(src, evnt)
    % 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
    % -------------------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    %     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
    % --------------------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    %     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
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
% Callback function run when the pan toggle toolbar is released
%----------------------------------------------------------------------
  function Pan_OffMenuCallback(src, evnt)
    % turns interactive pan off
    % -------------------------
    pan off;
    % cursor back to normal, test if it's really necessery
    % -----------------------------------------------------
    %set(hMainFig, 'Pointer', 'arrow');
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%------------------------------------------------------------------------
% Callback function run when zoom or pan action finishes: redraw axes
%------------------------------------------------------------------------
  function ZoomPan_PostCallback(src, evnt)
    % 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
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % Re-draw the map once the zoom/pan is off
    % ----------------------------------------
    if strcmp( get(hMapFig,'visible'), 'on') == 1
      erase_Line( hPlotAxes, 4 );
      plot_map( hMainFig, hPlotAxes);
    end
%% QCMenuCallback
%----------------------------------------------------------------------
% Callback function run when the Automatic QC menu item is selected
%
% Si vous modiifer ce CallBack verifier les modifications a apporter a
% 1 - preferenceForm.m
% 2 - tsg_preference.m
%----------------------------------------------------------------------
  function QCMenuCallback(src, evnt, test)
    
    switch test
      case 'Speed'
        minSpeedQC(hMainFig)
      case 'Flow'
        minFlowQC(hMainFig)
      case 'Press'
        minPressQC(hMainFig)
      case 'SSPSmin'
        minSSPSQC(hMainFig)
      case 'SSPSmax'
        maxSSPSQC(hMainFig)
      case 'SSJTmin'
        minSSJTQC(hMainFig)
      case 'SSJTmax'
        maxSSJTQC(hMainFig)
      case 'SSTPmin'
        minSSTPQC(hMainFig)
      case 'SSTPmax'
        maxSSTPQC(hMainFig)
      otherwise
        msgbox('QCMenuCallback : erreur', 'QCMenuCallback','error', 'modal');
    end
    % --------------------------
    % refresh QC statistic panel
    % --------------------------
    display_QC( hMainFig );
    % ------------------
    % Refresh the plots
    %-------------------
    
    % Get the parameter displayed on plot number 1 : figure at the top
    % -----------------------------------------------------------------
    PARA = getParaCorModule( hMainFig );
    % Draw plot 1
    % -----------
    plot_Validation( hMainFig, hPlotAxes, 1, PARA{1} );
    % Update the map if already displayed
    % -----------------------------------
    if strcmp( get(hMapFig,'visible'), 'on') == 1
      erase_Line( hPlotAxes, 4 );
      plot_map( hMainFig, hPlotAxes);
    end
%% QC_OnMenuCallback ............................... Quality Control Module
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
% Callback function run when the QC toggle tool is pressed
%----------------------------------------------------------------------
  function QC_OnMenuCallback(src, evnt)
    % Make the QC code uipanel visible
    % --------------------------------
    set( hbgQc,                'Visible' ,'on');
    set( hDuplicateQcPanel,  '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 = getParaCorModule( hMainFig );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    SAMPLE = tsg.plot.sample;
    % refresh QC statistic panel
    % --------------------------
    display_QC( hMainFig );
    % Activate right clic context menu on first axes
    % ---------------------------------------------------------
    set(hPlotAxes(1),'UIContextMenu', hQcCmenu);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % Activate clic mouse menu on first axes 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(src, evnt)
      % disable zoom by default in QC mode
      try
        zoom(hMainFig, 'off');
      catch
      end
      
      % disable ButtonMotion on main fig during select
      % prevent drawing to map
      % ----------------------------------------------
      set( hMainFig, 'WindowButtonMotionFcn', []);
      % Selection of the data within the figure
      % ---------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
      point1    = get(src,'CurrentPoint');    % button down detected
      rbbox;                      % Create rubberband box for area selection
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
      point2    = get(src,'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_ContextMenuCallback') is called
      % -----------------------------------------------------------------
      if ~strcmp( get(gcf, 'SelectionType'), 'alt')
        % if evnt.Button == 1 % this works only with Matlab version > R2014
        
        % 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) &  tsg.DAYD_EXT < p2(1) & ...
              tsg.EXT_DIF  > p1(2) &  tsg.EXT_DIF  < p2(2));
            
            % Keep the information on the indices of the selected zone
            % --------------------------------------------------------
            tsg.rbboxind = ind .* ones(size(ind));
            
            % Modifiy the QC
            % --------------
            [tsg.qc.active.Code, tsg.qc.active.Color] = get_active_QC(hMainFig);
            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
          
          % store last QC in history for undo
          % ---------------------------------
          
          if (tsg.qc_history_pointer == 0)
            tsg.qc_history_state = int8(zeros(size(tsg.([PARA{1} '_QC']),1),tsg.qc_history_size));
          end
          
          if (tsg.qc_history_pointer == tsg.qc_history_size)
            tsg.qc_history_state = circshift(tsg.qc_history_state,[0 -1]);
            tsg.qc_history_pointer = tsg.qc_history_pointer + 1;
          end
          
          tsg.qc_history_state(:,tsg.qc_history_pointer) = tsg.([PARA{1} '_QC']);
          tsg.qc_redo_possible = 0;
          
          
          % get index on selected zone
          % ---------------------------
          ind = find(tsg.DAYD   > p1(1,1) & tsg.DAYD   < p2(1,1) & ...
            tsg.(PARA{1}) > p1(1,2) & tsg.(PARA{1}) < p2(1,2));
          
          % Keep the information on the indices of the selected zone
          % --------------------------------------------------------
          tsg.rbboxind = ind .* ones(size(ind));
          
          % Modify the QC
          % --------------
          [tsg.qc.active.Code, tsg.qc.active.Color] = get_active_QC(hMainFig);
          tsg.([PARA{1} '_QC'])(ind) = tsg.qc.active.Code;
          
          % Save the modifications
          % ----------------------
          setappdata( hMainFig, 'tsg_data', tsg);
          
          % Draw plot 1 of the validation figure
          % ------------------------------------
          plot_Validation( hMainFig, hPlotAxes, 1, PARA{1} );
          % refresh QC statistic panel
          % --------------------------
          display_QC( hMainFig );
          % Update the map if already displayed
          % -----------------------------------
          if strcmp( get(hMapFig,'visible'), 'on') == 1
            erase_Line( hPlotAxes, 4 );
            plot_map( hMainFig, hPlotAxes);
          % enable Undo menu if QC flags applied
          % ------------------------------------
          if (tsg.qc_history_pointer > 0)
            set(findobj('tag','UIMENU_UNDO'),'enable','on');
          end
          
          % enable Redo menu if QC flags applied
          % ------------------------------------
          if (tsg.qc_history_pointer > 0)
            set(findobj('tag','UIMENU_REDO'),'enable','on');
          end
        end
        
        % As soon as a modification took place the data should be saved
        % -------------------------------------------------------------
        set( hSaveMenu, 'UserData', 'on' );
        
      % enable ButtonMotion on main fig after select QC area
      % ----------------------------------------------------
      set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
  end

%% QC_OffMenuCallback .............................. Quality Control Module
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%----------------------------------------------------------------------
% Callback function run when the QC toggle tool is released
%----------------------------------------------------------------------
  function QC_OffMenuCallback(src, evnt)
    % Desactive right clic menu on first axes (salinity)
    % ---------------------------------------------------
    set(hPlotAxes(1),'UIContextMenu', []);
    % Desactive clic mouse menu (zoom) on first axes (salinity)
    % ----------------------------------------------------------
    set(hPlotAxes(1),'ButtonDownFcn', []);
    % Uipanel visible or not
    % -----------------------
    set( hbgQc,        'Visible', 'off' );
    set( hDuplicateQcPanel,  'Visible', 'off');
    if strcmp( get(hBottleToggletool, 'state'), 'off' )
      set( hCalToggletool,        'state', 'off', 'enable', 'on' );
      set( hInterpToggletool,     'state', 'off', 'enable', 'on' );
    end
    % uibuttongroup uipanel used to choose a parameter is set to
    % on only if the Correction screen (bottle toggletool) is off
    % -----------------------------------------------------------
    if  strcmp( get( hBottleToggletool, 'state'), 'off')
      set( hbgParameter, 'Visible', 'on');
    end
    
    % set POSITION_QC from LATX_QC or LONX_QC after validation
    % give same value for  LATX_QC and LONX_QC
    % ---------------------------------------------------------
    tsg.POSITION_QC = max(tsg.LATX_QC,tsg.LONX_QC );
    tsg.LATX_QC = tsg.POSITION_QC;
    tsg.LONX_QC = tsg.POSITION_QC;
    % Save the modifications
    % ----------------------
    setappdata( hMainFig, 'tsg_data', tsg);
    
    % cursor back to normal
    % ---------------------
    set(hMainFig,'Pointer','arrow');
%% QC_ContextMenuCallback context menu selected ........................ Quality Control Module
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%-----------------------------------------------------------
% Context menu used to attribute a QC to a previously selected
% TSG time series
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%-----------------------------------------------------------
  function QC_ContextMenuCallback(src, evnt, key)
    % Retrieve Default Quality Code and Color
    % ---------------------------------------
    tsg = getappdata( hMainFig, 'tsg_data');
    % Get the parameter (SSPS, SSJT or SSTP)
    % --------------------------------------
    PARA = getParaCorModule( hMainFig );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    SAMPLE = tsg.plot.sample;
    % get key and some values in hashtable
    % ------------------------------------
    code  = tsg.qc.hash.(key).code;
    color = tsg.qc.hash.(key).color;
    % set active code and color from selected context menu
    % ----------------------------------------------------
    tsg.qc.active.Code  = code;
    tsg.qc.active.Color = color;
    % Modify and plot the last selected tsg data
    % ------------------------------------------
    if isfield(tsg, 'rbboxind') && ~isempty( tsg.rbboxind )
      if strcmp( get(hBottleToggletool, 'state'), 'on')
        tsg.([SAMPLE '_EXT_QC'])(tsg.rbboxind) = tsg.qc.active.Code;
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
        % Save tsg.SSPS_QC and tsg.qc.active.Code
        % in the application data
        % ----------------------------------------
        setappdata( hMainFig, 'tsg_data', tsg );
        % Draw the 3 plots of the Correction figure
        % -----------------------------------------
        plot_Correction( hMainFig, hPlotAxes, PARA );
      else
        
        % store last QC in history for undo
        % ---------------------------------
        
        if (tsg.qc_history_pointer == 0)
          tsg.qc_history_state = int8(zeros(size(tsg.([PARA{1} '_QC']),1),tsg.qc_history_size));
        end
        
        if (tsg.qc_history_pointer == tsg.qc_history_size)
          tsg.qc_history_state = circshift(tsg.qc_history_state,[0 -1]);
        else
          tsg.qc_history_pointer = tsg.qc_history_pointer + 1;
        end
        
        tsg.qc_history_state(:,tsg.qc_history_pointer) = tsg.([PARA{1} '_QC']);
        tsg.qc_redo_possible = 0;
        
        
        % Modify the QC
        % --------------
        tsg.([PARA{1} '_QC'])(tsg.rbboxind) = tsg.qc.active.Code;
        
        % Save tsg.SSPS_QC in the application data before use
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
        % inside plot_Validation
        % ---------------------------------------------------
        setappdata( hMainFig, 'tsg_data', tsg );
        % Draw plot 1 of the validation figure
        % ------------------------------------
        plot_Validation( hMainFig, hPlotAxes, 1, PARA{1} );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
      % -------------------------------------------------------------
      if strcmp( get(hMapFig, 'visible'), 'on') == 1
        erase_Line( hPlotAxes, 4 );
        plot_map( hMainFig, hPlotAxes);
      end
      
    % Update the radio button corresponding to the selected
    % QC context menu (rbg : RadioButtonGroup)
    % -----------------------------------------------------
    radioTag     = ['TAG_QC_RADIO_' char(key)];        % Build the TAG of the CODE
    hbgChildren  = get(hbgQc,'Children');        % Get the handles of the rbg
    hbgTagCell   = get(hbgChildren, 'tag');      % get the TAG of the rbg
    ind          = strcmp(radioTag, hbgTagCell); % Compare the TAG
    hRadioButton = hbgChildren( ind == 1 );      % Get the handle of the button
    set(hbgQc, 'SelectedObject', hRadioButton);  % Make this button active
    % refresh QC statistic panel
    % ---------------------------
    display_QC( hMainFig);
    %setappdata( hMainFig, 'tsg_data', tsg );
  end

%% Radiobutton Quality Control ..................... Quality Control Module
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
% ---------------------------------------------------------------
% Callback to select CODE and COLOR QC from the RadioButton Group
% ---------------------------------------------------------------
  function radioButtonQc(source, evnt)
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % Retrieve Default Quality Code and Color
    % ---------------------------------------
    tsg = getappdata( hMainFig, 'tsg_data');
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % Retrieve the key from the active RadioButton
    % --------------------------------------------
    rbTag = get(evnt.NewValue,'Tag');
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    key = strrep(rbTag, 'TAG_QC_RADIO_', '');
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % store his handle to uibuttongroup userdata
    % ------------------------------------------
    set(hbgQc,'Userdata', evnt.NewValue);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % set active code and color from selected context menu
    % ----------------------------------------------------
    tsg.qc.active.Code  = tsg.qc.hash.(key).code;
    tsg.qc.active.Color = tsg.qc.hash.(key).color;
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    setappdata( hMainFig, 'tsg_data', tsg );
  end

%% preQcPanCallback .................................Quality Control Module
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
% ---------------------------------------------------------------
% Callback function ... to be completed
% ---------------------------------------------------------------
  function preQcPanCallback(obj, evd)
    set(hQCToggletool, 'state', 'off' );
  end

%% postQcPanCallback ............................... Quality Control Module
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
% ---------------------------------------------------------------
% Callback function ... to be completed
% ---------------------------------------------------------------
  function postQcPanCallback(obj, evd)
    % 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
    % Re-draw the map once the pan is off -  only valide in QC mode
    % -------------------------------------------------------------
    if strcmp( get(hMapFig, 'visible'), 'on') == 1
      erase_Line( hPlotAxes, 4 );
      plot_map( hMainFig, hPlotAxes);
    end
    % restacks the figure to the top of the screen
    % --------------------------------------------
    figure( hMainFig);
    set(hQCToggletool, 'state', 'on' );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%---------------------------------------------------------------------
% Callback function run when mouse pointer is moving on temperature plot
% draw corresponding measurement position on map
%---------------------------------------------------------------------
  function MouseMotion(src, evnt)
    % Test if the callback can be activated
    % -------------------------------------
    if strcmp( get( hMainFig, 'UserData'), 'ButtonMotionOn')
      % Retrieve named application data
      % -------------------------------
      tsg = getappdata( hMainFig, 'tsg_data');
      % Get current position of cusor and return its coordinates in
      % axes with handle h_axes
      % -----------------------------------------------------------
      a = get(hPlotAxes(1), 'CurrentPoint');
      x = a(2,1);
      y = a(2,2);
      % Get the Limits of axes 1
      % ------------------------
      limx = get(hPlotAxes(1), 'XLim');
      limy = get(hPlotAxes(1), 'YLim');
      % Code to Activate the PAN function when QC mode is active
      % A PAN zone is defined in the bottom (10%) of PlotAxes(1)
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
      % 2 callback are needed :
      %    1 - one to desactivate QC when Pan is set to on.
      %    2 - one to reactivate QC once the pan has been used.
      % ---------------------------------------------------------
      
      % if we are in QC mode
      % ---------------------
      if strcmp( get(hQCToggletool, 'state' ), 'on' );
        % Suppose that Y axes is increasing from the bottom to the top
        % ------------------------------------------------------------
        limy2 = limy(1) + (limy(2)-limy(1)) * 0.10;
        if  x > limx(1) && x < limx(2) &&  y <= limy2 && y >= limy(1)
          hPan = pan(hMainFig);
          set(hPan,'ActionPreCallback',  @preQcPanCallback);
          set(hPan,'ActionPostCallback', @postQcPanCallback);
          set(hPan,'Enable','on');
        else
          
        end % end of cursor test location
        
      end % end of QC mode test
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
      % Dynamically display data in uicontrol for valid data
      % ----------------------------------------------------
      if x > tsg.DAYD(1) && x < tsg.DAYD(end)
        
        % get index of cursor location
        % ----------------------------
        indCursor = find( tsg.DAYD > x, 1, 'first');
        
        % display informations of cursor location in text uicontrol
        % ---------------------------------------------------------
        set( hInfoDateText, 'String',...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
          datestr(tsg.DAYD(indCursor),'dd/mm/yyyy   HH:MM'));
        if tsg.preference.positions_format_value == 1
          set( hInfoLatText,  'String', dd2dm(tsg.LATX(indCursor), 0) );
          set( hInfoLongText, 'String', ...
            dd2dm(mod(tsg.LONX(indCursor) + 180, 360) - 180, 1) );
          set( hInfoLatText,  'String', tsg.LATX(indCursor) );
          set( hInfoLongText, 'String', ...
            mod(tsg.LONX(indCursor) + 180, 360) - 180 );
        if ~isempty(tsg.SSPS)
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
          set( hInfoSSPSText, 'String', tsg.SSPS(indCursor) );
        end
        if ~isempty(tsg.SSJT)
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
          set( hInfoSSJTText, 'String', tsg.SSJT(indCursor) );
        if ~isempty(tsg.SSTP)
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
          set( hInfoSSTPText, 'String', tsg.SSTP(indCursor) );
        % Plot the position on the map if this one is active
        % --------------------------------------------------
        if strcmp( get(hMapFig, 'Visible'), 'on')
          % Select the map axes, we cannot use mline as line with an axes
          % in first parameter like:  m_line(hPlotAxes(4), ....)
          % ------------------------------------------------------------
          axes( hPlotAxes(4));
          % Look for a MARKER (Red point) on the ship track
          % -----------------------------------------------
          h = findobj( hPlotAxes(4), '-regexp','Tag', 'TAG_PLOT4_LINE_MARKER');
          if isempty( h )   % if no Marker
            if ~isnan( tsg.LONX(indCursor) )
              % Plot a Marker (Red point) on the ship track
              % -------------------------------------------
              hMarker = m_line(mod(tsg.LONX(indCursor(1)) + ...
                tsg.lonplus, tsg.lonmod) - tsg.lonplus,...
                tsg.LATX(indCursor(1)),...
                'Marker', 'o', 'MarkerSize', 5, ...
                'Color', 'r', 'MarkerFaceColor', 'r');
              % Put a tag on the Marker - This tag allows to get the handle
              % of the Marker
              % -----------------------------------------------------------
              set( hMarker, 'TAG', 'TAG_PLOT4_LINE_MARKER' );
          else         % a marker exists
            if ~isnan( tsg.LONX(indCursor) )
              % Delete the Marker and redraw it
              % -------------------------------
              delete( h);
              hMarker = m_line(...
                tsg.LONX(indCursor), tsg.LATX(indCursor),...
                'Marker', 'o', 'MarkerSize', 5, ...
                'Color', 'r', 'MarkerFaceColor', 'r');
              % Put a tag on the Marker - This tag allows to get the handle
              % of the Marker
              % -----------------------------------------------------------
              set( hMarker, 'TAG', 'TAG_PLOT4_LINE_MARKER' );
        
      else
        
        % if cursor is out of valid data, display blank
        % ---------------------------------------------
        set( hInfoDateText, 'String', '' );
        set( hInfoLatText,  'String', '' );
        set( hInfoLongText, 'String', '' );
        set( hInfoSSPSText, 'String', '' );
        set( hInfoSSTPText, 'String', '' );
        set( hInfoSSJTText, 'String', '' );
      
    end % end of BuntonMotionOn
    
  end % end of mouseMotion function

%% Map_OnMenuCallback
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%---------------------------------------------------------------------
% Callback function run when the Map tool bar item is selected
%---------------------------------------------------------------------
  function Map_OnMenuCallback(src, evnt)
    % Desactivate Zoom and Pan toggle buttons
    % ---------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    set(hZoomInToggletool,  'state', 'off' );
    set(hZoomOutToggletool,  'state', 'off' );
    set(hPanToggletool,   'state', 'off' );
    % Make the earth map visible
    % --------------------------
    set(hMapFig, 'Visible', 'on' );
    erase_Line( hPlotAxes, 4 );
    plot_map( hMainFig, hPlotAxes)
    
    % De-activate keyPressFcn callback on main fig
    % --------------------------------------------
%% Map_OffMenuCallback
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%---------------------------------------------------------------------
% Callback function run when the Map tool bar item is unselected
%---------------------------------------------------------------------
  function Map_OffMenuCallback(src, evnt)
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % Make the earth map invisible
    % ----------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    set(hMapFig, 'Visible', 'off' );
    % Re-activate keyPressFcn callback on main fig
    % see Enabling user callbacks during zoom/pan on Undocumented Matlab
    % https://undocumentedmatlab.com/blog/enabling-user-callbacks-during-zoom-pan
    % This should work in both HG1 and HG2:
    % ------------------------------------------------------------------------
    %     hManager = uigetmodemanager(hMainFig);
    %     try
    %       set(hManager.WindowListenerHandles, 'Enable', 'off'); % HG1 (prior R2014b)
    %     catch
    %       [hManager.WindowListenerHandles.Enabled] = deal(false);  % HG2 (R2014b)
    %     end
    %    set(hMainFig, 'WindowKeyPressFcn', []);
    
    % comment this line to prevent warning
    %    set(hMainFig, 'KeyPressFcn', @keyPressFcnCallback);
%% Bottle_OnMenuCallback ................................ Correction Module
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%---------------------------------------------------------------------
% Callback function run when the bootle push tool is selected
%---------------------------------------------------------------------
  function Bottle_OnMenuCallback(src, evnt)
    % Callback function run when the Bottle tool bar item is selected
    % Get the tsg structure
    % ---------------------
    tsg = getappdata(hMainFig, 'tsg_data');
    % Get the parameter we are working on (SSPS, SSJT, SSTP)
    % ------------------------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    SAMPLE = tsg.plot.sample;
    PARA = getParaCorModule( hMainFig );
    % Switch somme buttons
    % --------------------
    set( hQCToggletool,         'state',  'off' );
    set( hZoomInToggletool,     'state', 'off', 'enable', 'on' );
    set( hZoomOutToggletool,    'state', 'off', 'enable', 'on' );
    set( hPanToggletool,        'state',  'off' );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    %     set( hMapToggletool,        'state',  'off' );
    set( hClimToggletool,       'state',  'off', 'enable', 'off');
    set( hCalToggletool,        'enable', 'off' );
    set( hInterpToggletool,     'enable', 'off' );
    set( hTimelimitToggletool,  'enable', 'on' );
    % Activate or desactivate uipanels
    % ---------------------------------
    set( hpDateLimit,           'Visible', 'on' );
    set( hbgCorMethod,          'Visible', 'on' );
    set( hCorPanel,             'Visible', 'on' );
    set( hbgParameter,          'Visible', 'off');
    set( hbgQc,                 'Visible', 'off');
    if ~isempty( tsg.([SAMPLE '_EXT']) )
      % Compute the sample-TSG differences
      % ----------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
      diffTsgSample( hMainFig, PARA );
      tsg = getappdata( hMainFig, 'tsg_data');
      msgbox('No sample data file has been read', 'modal');
    % Plot in the 3 axes
    % ------------------
    plot_Correction( hMainFig, hPlotAxes, PARA );
    % Necessary to unzoom as the new plot keep in memory the preceding zoom
    % ---------------------------------------------------------------------
    zoom out;
    % reset map border
    % ----------------
    tsg.preference.map_border = ...
      str2double(tsg.preference.map_border_string(tsg.preference.map_border_value));
    setappdata( hMainFig, 'tsg_data', tsg );
    
    % 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));

%% Bottle_OffMenuCallback ............................... Correction module
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%---------------------------------------------------------------------
% Callback function run when the bootle push tool is selected
%---------------------------------------------------------------------
  function Bottle_OffMenuCallback(src, evnt)
    % If necessary toggle off some buttons
    % ------------------------------------
    set( hQCToggletool,        'state',  'off' );
    set( hZoomInToggletool,    'state',  'off' );
    set( hZoomOutToggletool,   'state',  'off' );
    set( hPanToggletool,       'state',  'off' );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    %     set( hMapToggletool,       'state',  'off' );
    set( hClimToggletool,      'enable', 'on');
    set( hCalToggletool,       'enable', 'on'  );
    set( hInterpToggletool,    'enable', 'on' );
    set( hTimelimitToggletool, 'enable', 'off' );
    % Activate or Desactivate uipanel
    % --------------------------------
    set( hpDateLimit,          'Visible', 'off' );
    set( hCorPanel,            'Visible', 'off' );
    set( hbgCorMethod,         'Visible', 'off' );
    set( hbgParameter,         'Visible', 'on');
    % Desactivate Click Mouse on figure
    % ---------------------------------
    set( hMainFig, 'WindowButtonDownFcn', []);
    % Get tsg structure
    % -----------------
    tsg  = getappdata( hMainFig, 'tsg_data' );
    % Draw the 3 plots of the validation figure and unzoom as the new
    % plot keep in memory the preceding zoom
    % -----------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );
    % reset map border
    % ----------------
    tsg.preference.map_border = ...
      str2double(tsg.preference.map_border_string(tsg.preference.map_border_value));
    setappdata( hMainFig, 'tsg_data', tsg );
    
    % Set the pointer
    % ---------------
    set( hMainFig, 'Pointer', 'arrow');
%% cancelCorrectionCallback .................................... Correction Module
  function cancelCorrectionCallback(src, evnt, Limits)
    % Callback function run when the user want to cancel the
    % corrections made from comparison with bottles or ARGO data.
    % The deletion can be made for th whole time series or
    % between 2 dates.
    % Desactivate somme Toggle button
    % -------------------------------
    set( hZoomInToggletool,       'state', 'off' );
    set( hZoomOutToggletool,       'state', 'off' );
    set( hPanToggletool,        'state', 'off' );
    set( hQCToggletool,         'state', 'off' );
    set( hTimelimitToggletool,  'state', 'off' );
    % Get tsg application data
    % ------------------------
    tsg = getappdata(hMainFig, 'tsg_data');
    % Get parameter we are working on (SSPS, SSJT, SSTP)
    % or SSPS_CAL, SSJT_CAL, SSTP_CAL
    % -------------------------------------------------
    PARA = getParaCorModule( hMainFig );
    
    % The correction will be cancelled either for the entire
    % time series or within date limits
    % ------------------------------------------------------
    ind = 0;
    switch Limits
      
      % Get the indices of the whole time series
      % ----------------------------------------
      case 'total'
        
        ind = find( tsg.DAYD >= tsg.DAYD(1) &  tsg.DAYD <= tsg.DAYD(end) );
        
        %         ind = size(tsg.([PARA{1} '_ADJUSTED']));
        
        % Get the indices between 2 dates
        % --------------------------------
      case 'part'
        % Get the date limits used for the correction
        % -------------------------------------------
        dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
        dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
        % Find indices within date limits
        % --------------------------------
        if dateMax > dateMin
          ind = find( tsg.DAYD >= dateMin &  tsg.DAYD <= dateMax );
        end
      otherwise
        msgbox( 'CorCancelCallback : error', 'CorCancelCallback', 'error', modal);
    end
    if ~isempty(ind) && ~isempty( tsg.([PARA{1} '_ADJUSTED']) )
      
      % Cancel the correction : set the ADJUSTED variable to NaN
      % and ADJUSTED_QC to 0 (Bytes)
      % --------------------------------------------------------
      tsg.([PARA{1} '_ADJUSTED'])(ind) = ...
        NaN*ones(size(tsg.([PARA{1} '_ADJUSTED'])(ind))) ;
      tsg.([PARA{1} '_ADJUSTED_QC'])(ind) = ...
        zeros*ones(size(tsg.([PARA{1} '_ADJUSTED_QC'])(ind))) ;
      tsg.([PARA{1} '_ADJUSTED_ERROR'])(ind) = ...
        NaN*ones(size(tsg.([PARA{1} '_ADJUSTED_ERROR'])(ind))) ;
      
    end
    % Save tsg data
    % -------------
    setappdata(hMainFig, 'tsg_data', tsg);
    % Plot in the 3 axes
    % ------------------
    plot_Correction( hMainFig, hPlotAxes, PARA );
%% gradientCorrectionCallback .................................... Correction Module
  function gradientCorrectionCallback(src, evnt)
    % Desactivate somme Toggle button
    % -------------------------------
    set( hZoomInToggletool,     'state', 'off' );
    set( hZoomOutToggletool,    'state', 'off' );
    set( hPanToggletool,        'state', 'off' );
    set( hQCToggletool,         'state', 'off' );
    set( hTimelimitToggletool,  'state', 'off' );
    % Get the time limits for the correction
    % --------------------------------------
    dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
    dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
    % Get tsg application data
    % ------------------------
    tsg    = getappdata(hMainFig, 'tsg_data');
    % Get parameter we are working on (SSPS, SSJT, SSTP)
    % or SSPS_CAL, SSJT_CAL, SSTP_CAL
    % -------------------------------------------------
    PARA = getParaCorModule( hMainFig );
    SAMPLE = tsg.plot.sample;
      % Compute the sample-TSG differences
      % ----------------------------------
      diffTsgSample( hMainFig, PARA );
      % Correction
      % ----------
      error = corTsgGradient(hMainFig, PARA, dateMin, dateMax);
          % Plot in the 3 axes
          % ------------------
          plot_Correction( hMainFig, hPlotAxes, PARA );
          if DateMax <= DateMin
            msgbox( 'Date limits are not correct',...
              'Correction module', 'warn', 'modal');
          end
%% biasCorrectionCallback .................................... Correction Module
  function biasCorrectionCallback(src, evnt)
    % Desactivate somme Toggle button
    % -------------------------------
    set( hZoomInToggletool,     'state', 'off' );
    set( hZoomOutToggletool,    'state', 'off' );
    set( hPanToggletool,        'state', 'off' );
    set( hQCToggletool,         'state', 'off' );
    set( hTimelimitToggletool,  'state', 'off' );
    % 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');
    % Get tsg application data
    % ------------------------
    tsg    = getappdata(hMainFig, 'tsg_data');
    % Get parameter we are working on (SSPS, SSJT, SSTP)
    % or SSPS_CAL, SSJT_CAL, SSTP_CAL
    % -------------------------------------------------
    PARA = getParaCorModule( hMainFig );
    SAMPLE = tsg.plot.sample;
      % Compute the sample-TSG differences
      % ----------------------------------
      diffTsgSample( hMainFig, PARA );
      
    end
    
    % Correction
    % ----------
    error = corTsgBias(hMainFig, PARA, dateMin, dateMax);
        % Plot in the 3 axes
        % ------------------
        plot_Correction( hMainFig, hPlotAxes, PARA );
        if DateMax <= DateMin
          msgbox( 'Date limits are not correct',...
            'Correction module', 'warn', 'modal');
        end
        
      otherwise
        msgbox( 'CorBiasCallback : Error different   or -1',' ', 'error');
%% linearCorrectionCallback .................................... Correction Module
  function linearCorrectionCallback(src, evnt)
    % Callback function run when
    % Desactivate somme Toggle button
    % -------------------------------
    set( hZoomInToggletool,     'state', 'off' );
    set( hZoomOutToggletool,    'state', 'off' );
    set( hPanToggletool,        'state', 'off' );
    set( hQCToggletool,         'state', 'off' );
    set( hTimelimitToggletool,  'state', 'off' );
    % 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');
    % Get tsg application data
    % ------------------------
    tsg    = getappdata(hMainFig, 'tsg_data');
    % Get parameter we are working on (SSPS, SSJT, SSTP)
    % or SSPS_CAL, SSJT_CAL, SSTP_CAL
    % -------------------------------------------------
    PARA = getParaCorModule( hMainFig );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    SAMPLE = tsg.plot.sample;
    if ~isempty( tsg.([SAMPLE '_EXT']) )
      % Compute the sample-TSG differences
      % ----------------------------------
      diffTsgSample( hMainFig, PARA );
      % Correction
      % ----------
      error = corTsgLinear(hMainFig, PARA, dateMin, dateMax);
          % Plot in the 3 axes
          % ------------------
          plot_Correction( hMainFig, hPlotAxes, PARA );
        case -1
          msgbox( 'Date limits are not correct',...
            'Correction module', 'warn', 'modal');
      end
%% medianCorrectionCallback .................................... Correction Module
  function medianCorrectionCallback(src, evnt)
    % Callback function run when
    % Desactivate somme Toggle button
    % -------------------------------
    set( hZoomInToggletool,       'state', 'off' );
    set( hZoomOutToggletool,       'state', 'off' );
    set( hPanToggletool,        'state', 'off' );
    set( hQCToggletool,         'state', 'off' );
    set( hTimelimitToggletool,  'state', 'off' );
    % 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');
    % Get tsg application data
    % ------------------------
    tsg = getappdata(hMainFig, 'tsg_data');
    % Get parameter we are working on (SSPS, SSJT, SSTP)
    % or SSPS_CAL, SSJT_CAL, SSTP_CAL
    % -------------------------------------------------
    PARA = getParaCorModule( hMainFig );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    SAMPLE = tsg.plot.sample;
    if ~isempty( tsg.([SAMPLE '_EXT']) )
      % Compute the sample-TSG differences
      % ----------------------------------
      diffTsgSample( hMainFig, PARA );
      % Correction
      % ----------
      error = corTsgMedian(hMainFig, PARA, dateMin, dateMax);
          % Plot in the 3 axes
          % ------------------
          plot_Correction( hMainFig, hPlotAxes, PARA );
          % Nothing is done - Error msg within the corTsgMedian function
%% PopupMenu Select Parameter
% POP_UP filled in with the function "initParameterChoice"
% ---------------------------
  function SelectParameter(src, evnt, nplot)
    % Callback function run when the ....
    % Get application data
    % --------------------
    tsg = getappdata( hMainFig, 'tsg_data');
    % Get the active string of the selected box
    % -----------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    val             = get( src, 'Value' );
    string_list     = get( src, 'String' );
    selected_string = string_list{val};
    % Get the default parameter
    % -------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    tsg.plot.parameter{nplot} =  selected_string;
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
      tsg.plot.sample = selected_string;
      if strcmp( tsg.plot.sample, 'SSJT' )
        tsg.plot.sample = 'SSTP';
    % Save application data
    % --------------------
    setappdata( hMainFig, 'tsg_data', tsg);
    % Disable the climatology
    % -----------------------
    plotClim = 0;
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    if strcmp( get(hClimToggletool, 'state'), 'on' )
      set( hClimToggletool, 'state', 'off' );
      plotClim = 1;
    end
    % Disable the climatology
    % -----------------------
    set( hClimToggletool, 'state', 'off' );
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
    plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
    plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );
    % Plot the climatology if it was already plotted
    % ----------------------------------------------
    if plotClim
      set( hClimToggletool, 'state', 'on' );
      plot_Climatology(hMainFig, hPlotAxes);
%% SelectTime_OnMenuCallback
%---------------------------
  function SelectTime_OnMenuCallback(src, evnt)
    % Callback function run when the ....
    % Desactivate Zoom and Pan functions.
    % ----------------------------------
    set( hZoomInToggletool, 'state', 'off' );
    set( hZoomOutToggletool, 'state', 'off' );
    set( hQCToggletool,   'state', 'off' );
    set( hPanToggletool,  'state', 'off' );
    % Create a pointer to select the time limits
    % ------------------------------------------
    selTimePointer = ones(16)+1;
    selTimePointer(1,:)       = 1; selTimePointer(16,:)      = 1;
    selTimePointer(:,1)       = 1; selTimePointer(:,16)      = 1;
    selTimePointer(1:4,8:9)   = 1; selTimePointer(13:16,8:9) = 1;
    selTimePointer(8:9,1:4)   = 1; selTimePointer(8:9,13:16) = 1;
    selTimePointer(5:12,5:12) = NaN; % Create a transparent region in the center
    % Activate clic mouse menu on second axes (salinity) for next rbbox
    % ----------------------------------------------------------------
    set(hMainFig,'WindowButtonDownFcn', @Time_SelectCallback);
    % change cursor
    % ---------------
    set( hMainFig, 'Pointer', 'custom',...
      'PointerShapeCData', selTimePointer, 'PointerShapeHotSpot',[9 9]);
    % ----------------------------------------------------------------------
    % nested function on mouse clic when Select Time toggle tool is selected
    % ----------------------------------------------------------------------
    function Time_SelectCallback(src, evnt)
      % disable ButtonMotion on main fig during select
      % prevent drawing to map
      % ----------------------------------------------
      set( hMainFig, 'WindowButtonMotionFcn', []);
      % Retrieve named application data
      % -------------------------------
      tsg = getappdata( hMainFig, 'tsg_data');
      % 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
      % get index on selected zone - Only on X axes (time)
      % --------------------------------------------------
      ind = find(tsg.DAYD >= p1(1,1) & tsg.DAYD <= p2(1,1));
      % Write the date in the Editable uicontrol
      % ----------------------------------------
      set( hetDateMin, 'String', datestr(tsg.DAYD(ind(1)),   31));
      set( hetDateMax, 'String', datestr(tsg.DAYD(ind(end)), 31));
      % enable ButtonMotion on main fig after select QC area
      % ----------------------------------------------------
      set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
    end
  end

%% SelectTime_OffMenuCallback
%----------------------------
  function SelectTime_OffMenuCallback(src, evnt)
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % Callback function run when the ....
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % Desactivate time limit buttons
    % ------------------------------
    set( hTimelimitToggletool, 'state', 'off');
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    set( hMainFig, 'WindowButtonDownFcn', []);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    set( hMainFig, 'Pointer', 'arrow');
  end

%% Clim_OffMenuCallback
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%------------------------------------------------------------------------
% Callback function run when the Levitus climatology toolbar is unselected
%------------------------------------------------------------------------
  function Clim_OffMenuCallback(src, evnt)
    % Get lines handles from tag
    % --------------------------
    hLines = findobj('-regexp', 'Tag', 'TAG_LINE_CLIMATO_');
    % Delete climatology lines on axes
    % ---------------------------------
    delete(hLines);
    % Update the map (if visible)
    % ----------------------------
    if strcmp( get(hMapFig,'visible'), 'on') == 1
        erase_Line( hPlotAxes, 4 );
      plot_map( hMainFig, hPlotAxes);
    end
    
  end

%% Clim_OnMenuCallback
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
Loading
Loading full blame...