Skip to content
Snippets Groups Projects
tsgqc.m 164 KiB
Newer Older
function tsgqc( varargin )
%TSGQC Thermosalinograph (TSG) Quality Control software
% TSGQC is a software for interactive analysis and validation of
% underway SST / SSS (Sea Surface Temperature and Sea Surface Salinity)
% measurements from a SeaBird Thermosalinograph (TSG). 
% It has been developed under Matlab.
% Usage:
%   tsgqc help
%
% See:
%   Documentation: http://www.ird.fr/us191/spip.php?article63
%   Source code: https://git.outils-is.ird.fr/grelet/TSG-QC
%

% Tips:
%  To get and check tsg structure anywhere during debug:
%  tsg = getappdata( findobj('Tag', 'TAG_TSG-QC_GUI'), 'tsg_data')
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed


%% COPYRIGHT & LICENSE
%  Copyright 2007-2018 - 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
%% Define global variables for VERSIONING
% ---------------------------------------
global DATE_VERSION
global DEBUGGING
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
global DEFAULT_PATH_FILE

% version number, may be used to initialize some files when it change
% 0.90x -> 1.0RCx
% if you modify the tsgqc.preference structure, you need to increment 
% or modify the version number to load a new default structure
% -------------------------------------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
VERSION      = 1.50;  % -> 1.44
CHAR_VERSION = '1.50RC1';
DATE_VERSION = '12/05/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],...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    DEFAULT_PATH_FILE,[ 'tsg_climato' 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', 'file'}
      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') || ~isempty(strfind(inputFile,'help'))
  fprintf('tsgqc usage:\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 --help\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',...
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',...
  'Color', get(0, 'DefaultUIControlBackgroundColor'));
%  'Position',[0.17, 0.05, .8, .44],...
% 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
% ------------------------------------------------------------
hdls = flipud(findobj( '-regexp', 'tag', 'TAG_UIMENU_MAP_RESOLUTION_'));
set(hdls(tsg.preference.map.resolution), 'checked', 'on');
% display 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});

% 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
% ----------------------------------------------------------
hdls = flipud(findobj( '-regexp', 'tag', 'TAG_UIMENU_MAP_BORDER_'));
set(hdls(tsg.preference.map.border_value), 'checked', 'on');
% map Climatology menu
% --------------------
hMapClimatologyMenu = uimenu(hMapFig,'Label','Climatology', ...
  'Tag', 'TAG_UIMENU_MAP_CLIMATOLOGY');

uimenu(hMapClimatologyMenu,'Label','off',...
  'Checked', 'on',...
  'Tag','TAG_UIMENU_MAP_CLIMATOLOGY_WITH_NONE',...
  'Enable', 'on',...
  'Callback', {@mapClimatologyCallback, 'none'});

uimenu(hMapClimatologyMenu,'Label','pcolor',...
  'Checked', 'off',...
  'Tag','TAG_UIMENU_MAP_CLIMATOLOGY_WITH_PCOLOR',...
uimenu(hMapClimatologyMenu,'Label','contour',...
  'Checked', 'off',...
  'Tag','TAG_UIMENU_MAP_CLIMATOLOGY_WITH_CONTOURF',...
  'Callback', {@mapClimatologyCallback, 'contourf'});
% map Print menu
% --------------------
hMapPrintMenu = uimenu(hMapFig,'Label','Print', ...
  'Tag', 'TAG_UIMENU_MAP_PRINT');

uimenu(hMapPrintMenu,'Label','Print Preview',...
  'Tag','TAG_UIMENU_MAP_PRINT_PREVIEW',...
  'Callback', {@mapPrintPreviewCallback});

uimenu(hMapPrintMenu,'Label','Print',...
  'Tag','TAG_UIMENU_MAP_PRINT_PREVIEW',...
  'Accelerator','P',...
  'Callback', {@mapPrintCallback});

uimenu(hMapPrintMenu,'Label','Save as',...
  'Tag','TAG_UIMENU_MAP_PRINT_SAVEAS',...
  'Callback', {@mapSaveAsCallback});

% set uipanel for map axes and climato
% ------------------------------------
hMapAxesPanel = uipanel( ...
  'Parent', hMapFig, ...
  'Units', 'normalized', ...
  'Visible', 'on',...
  'tag', 'TAG_MAP_CLIMATO_AXES',...
  'Position',[0, 0, 1, 1]);
%   'BorderType', 'etchedin',...

hMapClimatoPanel = uipanel( ...
  'Parent', hMapFig, ...
  'Units', 'normalized', ...
  'Visible', 'off',...
  'tag', 'TAG_MAP_CLIMATO_UIPANEL',...
  'Position',[.8, 0, .2, 1]);

% set map axes
% ------------
hPlotAxes(4) = axes(...     % the axes for plotting ship track map
  'Units', 'normalized', ...
  'Visible', 'off', ...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  'Tag', 'TAG_AXES_4', ...
  'Color', 'none', ...
  'UserData', 'off', ...
  'HandleVisibility','on');

% display climatology control title
% ---------------------------------
uicontrol(...
  'Parent', hMapClimatoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', 'Fontsize', tsg.fontSize, 'FontWeight', 'bold',...
  'HorizontalAlignment', 'Center', ...
  'Position',[.1, .9, .8, .05],'String', 'Range');

% display climatology min value text
% ----------------------------------
uicontrol(...
  'Parent', hMapClimatoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize-2, ...
  'HorizontalAlignment', 'center', ...
  'Position',[.2, .85, .6, .05], ...
  'String', 'Min value');

% display climatology min value uicontrol
% ---------------------------------------
uicontrol(...
  'Parent', hMapClimatoPanel, ...
  'Units', 'normalized',...
  'Style', 'Edit',...
  'BackgroundColor', 'w', ...
  'Fontsize', tsg.fontSize-2, 'HorizontalAlignment', 'right', ...
  'Position', [.2, .8, .6, .04], ...
  'String', '', ... 
  'TooltipString', 'climatology min value', ...
  'Tag', 'CLIMATO_MIN_VALUE',...
  'Callback', {@mapContourfCallback, 'min'});

% display climatology max value text
% ----------------------------------
uicontrol(...
  'Parent', hMapClimatoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize-2, ...
  'HorizontalAlignment', 'center', ...
  'Position',[.2, .75, .6, .05], ...
  'String', 'Max value');

% display climatology min value uicontrol
% ---------------------------------------
uicontrol(...
  'Parent', hMapClimatoPanel, ...
  'Units', 'normalized',...
  'Style', 'Edit',...
  'BackgroundColor', 'w', ...
  'Fontsize', tsg.fontSize-2, 'HorizontalAlignment', 'right', ...
  'Position', [.2, .70, .6, .04], ...
  'String', '', ... 
  'TooltipString', 'climatology max value', ...
  'Tag', 'CLIMATO_MAX_VALUE',...
  'Callback', {@mapContourfCallback, 'max'});


% display climatology contour step text
% ----------------------------------
uicontrol(...
  'Parent', hMapClimatoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize-2, ...
  'HorizontalAlignment', 'center', ...
  'Position',[.2, .65, .6, .05], ...
  'String', 'Contour step');

% display climatology contour step uicontrol
% ---------------------------------------
uicontrol(...
  'Parent', hMapClimatoPanel, ...
  'Units', 'normalized',...
  'Style', 'Edit',...
  'BackgroundColor', 'w', ...
  'Fontsize', tsg.fontSize-2, 'HorizontalAlignment', 'right', ...
  'Position', [.2, .60, .6, .04], ...
  'String', '', ... 
  'TooltipString', 'climatology contouring step', ...
  'Tag', 'CLIMATO_STEP_VALUE',...
  'Callback', {@mapContourfCallback, 'step'});


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-2, '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
        % ----------------------------
        hdls_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
        set(hdls_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
        % ----------------------------------------------------------
        hdls_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
        set(hdls_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
    % -----------------
Loading
Loading full blame...