Newer
Older

jacques.grelet_ird.fr
committed
% tsgqc_GUI
% TSG (Thermosalinograph) Quality Control software
%
% $Id$
%
%% COPYRIGHT & LICENSE
% Copyright 2007 - IRD US191, all rights reserved.
%
% This file is part of tsgqc_GUI.
%
% Datagui is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2 of the License, or
% (at your option) any later version.
%
% tsgqc_GUI 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
%% Initialization tasks
% ********************

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

jacques.grelet_ird.fr
committed
% Define global variable VERSION number
% -------------------------------------
global VERSION

jacques.grelet_ird.fr
committed
VERSION = '0.2b';
% reset userdata property of root Matlab object if it is not empty
% ----------------------------------------------------------------
if ~isempty(get(0,'Userdata'))
set(0, 'userdata', []);
end

jacques.grelet_ird.fr
committed
% 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');
DEFAULT_PATH_FILE = strrep(fulltsgqcname, tsgqcname, '') ;
p = [pathsep,...
DEFAULT_PATH_FILE,[filesep 'tsg_util' pathsep],...
DEFAULT_PATH_FILE,[filesep 'tsg_data' pathsep],...
DEFAULT_PATH_FILE,[filesep 'tsg_io' pathsep]
];
addpath( p, '-END' );
rehash;

jacques.grelet_ird.fr
committed
% get screen dimensions (pixels)
% ------------------------------
set(0,'Units','pixels');
screenSize = get(0,'ScreenSize');
% define default font size based on screen resolution
% ---------------------------------------------------
if screenSize(3) <= 1024

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
% Screen limits for the GUI
% -------------------------
set(0,'Units','normalized');
guiLimits = get(0,'ScreenSize');
guiLimits(1) = guiLimits(1) + 0.01;
guiLimits(2) = guiLimits(2) + 0.05;
guiLimits(3) = guiLimits(3) - 0.02;
guiLimits(4) = guiLimits(4) - 0.15;

jacques.grelet_ird.fr
committed
%% Main GUI
% Create and then hide the GUI as it is being constructed.

jacques.grelet_ird.fr
committed
% --------------------------------------------------------
hMainFig = figure(...
'Name', 'TSG Validation', ...
'NumberTitle', 'off', ...
'Resize', 'on', ...
'Menubar','none', ...
'Toolbar', 'none', ...
'UserData', 'ButtonMotionOff', ...
'WindowButtonMotionFcn', @MouseMotion, ...
'CloseRequestFcn', @QuitMenuCallback,...

jacques.grelet_ird.fr
committed
'HandleVisibility','callback',...
'Visible','on',...

jacques.grelet_ird.fr
committed
'Tag','TAG_TSG-QC_GUI',...

jacques.grelet_ird.fr
committed
'Units', 'normalized',...
'Position',guiLimits, ...
'Color', get( 0, 'DefaultUIControlBackgroundColor' ));

jacques.grelet_ird.fr
committed
% Initialize tsg structure
% ------------------------
%% Initialize tsg structure with tsg_preference function
% -----------------------------------------------------

jacques.grelet_ird.fr
committed
tsg_preferences(hMainFig, tsgqcname, DEFAULT_PATH_FILE);
% get root struct from root object
% --------------------------------
root = get(0,'Userdata');

jacques.grelet_ird.fr
committed
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
%% Menu File
% -----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
hFileMenu = uimenu(...
'Parent', hMainFig,...
'HandleVisibility','callback',...
'Label', 'File');
hOpenMenu = uimenu(...
'Parent', hFileMenu,...
'Label','Open',...
'Accelerator','O',...
'HandleVisibility','callback',...
'UserData', 'off',...

jacques.grelet_ird.fr
committed
'Callback', @OpenMenuCallback);
hSaveMenu = uimenu(...
'Parent', hFileMenu,...
'Label','Save',...
'Accelerator','S',...
'Enable', 'off',...
'UserData', 'off',...

jacques.grelet_ird.fr
committed
'HandleVisibility','callback',...
'Callback',@SaveMenuCallback);
hExportMenu = uimenu(...
'Parent', hFileMenu,...
'Label','Export',...
'Accelerator','E',...
'Enable', 'off',...
'UserData', 'off',...
'HandleVisibility','callback',...
'Callback',@ExportMenuCallback);

jacques.grelet_ird.fr
committed
hQuitMenu = uimenu(...
'Parent',hFileMenu,...
'Label','Quit',...
'Separator','on',...
'Accelerator','Q',...
'HandleVisibility','callback',...
'Callback',@QuitMenuCallback);

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

jacques.grelet_ird.fr
committed
%% 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);

jacques.grelet_ird.fr
committed
% by defautl at startup, select climatology to annual
% ---------------------------------------------------
uimenu(hClimatoMenu,'Label','Annual',...

jacques.grelet_ird.fr
committed
'Checked','on',...

jacques.grelet_ird.fr
committed
'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
% --------------------------
for i=1:4

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',...
'september','october','november','december'};
% loop over the four submenu
% --------------------------
for i=1:12
uimenu(hClimatoMonthlyMenu,'Label',label{i},...
'Checked','off',...
'Tag',['TAG_UIMENU_CLIMATO_MONTHLY_' i],...
'Enable', 'on',...

jacques.grelet_ird.fr
committed
'Callback',{@ClimatoSelectMenuCallback, 'monthly', i});
end
%% Menu Option with Preferences submenu
% --------------------------------------------------------
hOptionMenu = uimenu(hMainFig,'Label','Option');
uimenu(hOptionMenu,'Label','Preferences',...
'Checked', root.preference.autoload,...

jacques.grelet_ird.fr
committed
'Tag','TAG_UIMENU_OPTION_PREFERENCES',...

jacques.grelet_ird.fr
committed
'Callback', {@PreferencesMenuCallback});
%% Toolbar pushbuttons
% -----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
hToolbar = uitoolbar(... % Toolbar for Open and Print buttons
'Parent',hMainFig, ...

jacques.grelet_ird.fr
committed
'HandleVisibility','on');

jacques.grelet_ird.fr
committed
hOpenPushtool = uipushtool(... % Opendoc toolbar button
'Parent',hToolbar,...
'TooltipString','Open file',...
'CData', iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/opendoc.mat')),...
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'Tag','PUSHTOOL_OPEN',...
'UserData', 'off',...
'Enable', 'on',...
'ClickedCallback', @OpenMenuCallback);
hSavePushtool = uipushtool(... % Open Save toolbar button
'Parent',hToolbar,...
'TooltipString','Save NetCDF file',...
'CData',iconRead( ...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'savedoc.mat']),...
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'Tag','PUSHTOOL_SAVE',...
'Enable', 'off',...
'ClickedCallback', @SaveMenuCallback);

jacques.grelet_ird.fr
committed
hZoomToggletool = uitoggletool(... % Open Zoom toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'Separator', 'on', ...
'TooltipString','Zoom',...
'CData', iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/zoom.mat')),...
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'Tag','PUSHTOOL_ZOOM',...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @Zoom_OffMenuCallback,...
'ONCallback', @Zoom_OnMenuCallback);
hPanToggletool = uitoggletool(... % Open Pan toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'TooltipString','Pan',...
'CData',iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/pan.mat')),...

jacques.grelet_ird.fr
committed
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'Tag','PUSHTOOL_PAN',...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @Pan_OffMenuCallback,...
'OnCallback', @Pan_OnMenuCallback);
hQCToggletool = uitoggletool(... % Open QC toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'TooltipString','Validation codes',...

jacques.grelet_ird.fr
committed
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'qcicon.mat']),...

jacques.grelet_ird.fr
committed
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'UserData', 'off',...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @QC_OffMenuCallback,...
'OnCallback', @QC_OnMenuCallback);
hTimelimitToggletool = uitoggletool(...
'Parent',hToolbar,...
'TooltipString','Select time limit',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'selecttime.mat']),...
'HandleVisibility','on', ...
'Tag', 'CORRECT_STARTTIME', ...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @SelectTime_OffMenuCallback,...
'OnCallback', @SelectTime_OnMenuCallback);
hMapToggletool = uitoggletool(... % Open Map toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'TooltipString','Map and ship track',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'mapicon.mat']),...
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'Tag','PUSHTOOL_MAP',...
'UserData', 'off', ...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @Map_OffMenuCallback,...
'OnCallback', @Map_OnMenuCallback);
hClimToggletool = uitoggletool(... % Open Climatology toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'TooltipString','Climatology',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'climicon.mat']),...
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'Tag','PUSHTOOL_CLIM',...
'UserData', 'off',...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @Clim_OffMenuCallback,...
'OnCallback', @Clim_OnMenuCallback);

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...

jacques.grelet_ird.fr
committed
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'outils.mat']),...
'HandleVisibility','on', ...
'UserData', 'off',...

jacques.grelet_ird.fr
committed
'Enable', 'off',...
'OffCallback', @Cal_OffMenuCallback,...
'OnCallback', @Cal_OnMenuCallback);
hInterpToggletool = uitoggletool(... %
'TooltipString','Interpolate missing position',...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'interp.mat']),...
'HandleVisibility','on', ...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @Inter_OffMenuCallback,...
'OnCallback', @Inter_OnMenuCallback);
hBottleToggletool = uitoggletool(... % Correction module toolbar button
'Parent',hToolbar,...
'TooltipString','Correct the SSS TSG data',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'bottleicon.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_BOTTLE',...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @Bottle_OffMenuCallback,...
'OnCallback', @Bottle_OnMenuCallback);

jacques.grelet_ird.fr
committed
hHeaderPushtool = uipushtool(... % Open headerForm button
'Parent',hToolbar,...
'TooltipString','Fill the header form',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'hdricon.mat']),...
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'Tag','PUSHTOOL_HEADER',...
'Enable', 'off',...
'ClickedCallback', @HeaderMenuCallback);
%% Dynamic text area
% -----------------------------------------------------------------------
% Dynamic text area that displays the loaded filename, date, position and

jacques.grelet_ird.fr
committed
% salinity, temperature
% ------------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Create an uipanel

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

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Dynamic text area that displays the date
% ----------------------------------------
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.01, .25, .04, .6], ...

jacques.grelet_ird.fr
committed
'String', 'File:');
hInfoFileText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'No file loaded', ...
'Position', [.05, .25, .1, .6]);

jacques.grelet_ird.fr
committed
% Text area that displays the date
% --------------------------------
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.15, .25, .04, .6], ...

jacques.grelet_ird.fr
committed
'String', 'Date:');
hInfoDateText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.20, .25, .13, .6]);

jacques.grelet_ird.fr
committed
% Text area that displays the latitude
% ------------------------------------
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.33, .25, .06, .6], ...

jacques.grelet_ird.fr
committed
'String', 'Latitude:');
hInfoLatText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.4, .25, .9, .6]);

jacques.grelet_ird.fr
committed
% Text area that displays the longitude
% -------------------------------------
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.495, .25, .08, .6], ...

jacques.grelet_ird.fr
committed
'String', 'Longitude:');
hInfoLongText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.585, .25, .09, .6]);

jacques.grelet_ird.fr
committed
% Text area that display salinity and temperature
% -----------------------------------------------
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position', [.68, .25, .05, .6], ...

jacques.grelet_ird.fr
committed
'String', 'SSPS:');
hInfoSSPSText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.73, .25, .05, .6]);

jacques.grelet_ird.fr
committed
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.785, .25, .05, .6], ...

jacques.grelet_ird.fr
committed
'String', 'SSJT:');
hInfoSSJTText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.835, .25, .05, .6]);

jacques.grelet_ird.fr
committed
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.89, .25, .05, .6], ...

jacques.grelet_ird.fr
committed
'String', 'SSTP:');
hInfoSSTPText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.94, .25, .05, .6]);

jacques.grelet_ird.fr
committed
%% Plot axes
% -----------------------------------------------------------------------
% The axes 1,2 and 3 will be plot in a uipanel
% axe 1 as propertie 'HandleVisibility' set to 'on' to prevent hidden
% visibility when first plot is empty
%--------------------------------------------------------------------

jacques.grelet_ird.fr
committed
hPlotsPanel = uipanel( ...

jacques.grelet_ird.fr
committed
'Parent', hMainFig, ...
'Units', 'normalized', ...
'BorderType', 'etchedin',...

jacques.grelet_ird.fr
committed
'Visible', 'on', ...
'Position',[0.15, 0.0, .85, .95]);

jacques.grelet_ird.fr
committed
hPlotAxes(1) = axes(... % the axes for plotting Salinity
'Parent', hPlotsPanel, ...
'Units', 'normalized', ...
'Visible', 'off', ...

jacques.grelet_ird.fr
committed
'HandleVisibility','on', ... % set to callback after first plot
'Position',[.05, .64, .93, .35]);

jacques.grelet_ird.fr
committed
hPlotAxes(2) = axes(... % the axes for plotting temperature
'Parent', hPlotsPanel, ...
'Units', 'normalized', ...

jacques.grelet_ird.fr
committed
'Visible', 'off', ...
'Tag', 'TAG_AXES_2', ...
'HandleVisibility','on', ...
'Position',[.05, .33, .93, .27]);

jacques.grelet_ird.fr
committed
hPlotAxes(3) = axes(... % the axes for plotting ship velocity

jacques.grelet_ird.fr
committed
'Parent', hPlotsPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Visible', 'off', ...
'Tag', 'TAG_AXES_3', ...
'HandleVisibility','on', ...
'Position',[.05, .02, .93, .27]);

jacques.grelet_ird.fr
committed
% The map will be plot in a uipanel
hMapPanel = uipanel( ...
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Visible', 'off', ...
'Position',[0.15, 0, .85, .58]);

jacques.grelet_ird.fr
committed
hPlotAxes(4) = axes(... % the axes for plotting ship track map
'Parent', hMapPanel, ...
'Units', 'normalized', ...
'Visible', 'off', ...

jacques.grelet_ird.fr
committed
'Color', 'none', ...
'UserData', 'off', ...

jacques.grelet_ird.fr
committed
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'Position',[.05, .05, .9, .9]);
%% Quality Control Button Group panel
% -----------------------------------------------------------------------
hbgQc = uibuttongroup(...
'Parent', hMainFig, ...
'Title', 'Validation Codes', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'tag', 'TAG_QC_DISPLAY_PANEL',...
Yves Gouriou
committed
'HandleVisibility','on',...
'BorderType', 'etchedin',...
'Position', [.0, .71, .15, .25]);
% Initialize CallBack for button group properties
% -----------------------------------------------
set(hbgQc,'SelectionChangeFcn',@RadiobuttonQc);
%% Context Menu and RadioButtons for Quality control
% -----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
hQcCmenu = uicontextmenu(...
'Parent', hMainFig, ...

jacques.grelet_ird.fr
committed
'HandleVisibility','on' );
% get list of keys from hashtable tsg.qc.hash, defined inside
% tsg_initialisation.m
% -----------------------------------------------------------
qc_list = get(tsg.qc.hash);
% internal loop count with state to on
% ------------------------------------
count = 0;

jacques.grelet_ird.fr
committed
% iterate (loop) on each key store inside hastable
% ------------------------------------------------
for i=1:numel(qc_list)
% get key and some values in hashtable
% ------------------------------------
key = qc_list{i};
label = get(tsg.qc.hash, key, 'label');
color = get(tsg.qc.hash, key, 'color');
state = get(tsg.qc.hash, key, 'state');
% construct context menu with only code set to 'on' (valid)
% ---------------------------------------------------------
if strcmp( state, 'on')
% add menu to hQcCmenu uicontextmenu
% ----------------------------------

jacques.grelet_ird.fr
committed
uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','on', ...
'Label', label,...
'ForegroundColor', color,...
'Callback', {@Qc, key});

jacques.grelet_ird.fr
committed
% add button QC to hbgQc uibuttongroup
% ------------------------------------

jacques.grelet_ird.fr
committed
uicontrol(...
'Parent', hbgQc,...
'Style', 'radiobutton',...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Fontsize', tsg.fontSize-1, ...

jacques.grelet_ird.fr
committed
'HorizontalAlignment', 'left', ...
'HandleVisibility','on', ...
'String', label,...
'Tag', ['TAG_QC_RADIO_' key], ...

jacques.grelet_ird.fr
committed
'ForegroundColor', color,...
'Position', [.01, .85-count*.12, .6, 0.09]);

jacques.grelet_ird.fr
committed
% add text QC display statistic on hQcPanel
% -----------------------------------------

jacques.grelet_ird.fr
committed
uicontrol(...
'Parent', hbgQc,...

jacques.grelet_ird.fr
committed
'Style', 'text',...
'Units', 'normalized', ...
'Fontsize', tsg.fontSize-1, ...

jacques.grelet_ird.fr
committed
'HorizontalAlignment', 'right', ...
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'ForegroundColor', color,...
'Tag', ['TAG_QC_TEXT_' key],...
'Position', [.61, .85-count*.12, .37, 0.09]);
% increment count
% ---------------
count = count + 1;

jacques.grelet_ird.fr
committed
end
end
%% 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', ...
'Position',[.0, .25, .15, .18]);
% Create 2 radio buttons in the button group
hrbCorCancel = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'String','Cancel the adjustment',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_CANCEL_PUSH', ...
'HandleVisibility','callback', ...
'Callback', @CorCancelCallback);
hrbCorLinear = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'String','Linear adjustment',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_LINEAR_PUSH', ...
'pos',[.05 .38 .9 .25], ...
'HandleVisibility','callback', ...
'Callback', @CorLinearCallback);
hrbCorMedian = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'String','Running median filter',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_MEDIAN_PUSH', ...
'HandleVisibility','callback', ...
'Callback', @CorMedianCallback);
%% 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', ...
'Position', [.0, .46, .15, .18]);
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]);
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',...
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
'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','callback', ...
'Callback', @CalibrateCallback);
hrbCancelCal = uicontrol( ...
'Style','pushbutton', 'Parent',hpCalCoef, ...
'String','Cancel calibration',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_CAL_PUSH', ...
'Units', 'normalized','pos',[.05 .05 .9 .075], ...
'HandleVisibility','callback', ...
'Callback', @CancelCalibrationCallback);
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
%% 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, .85, .15, .11]);
hrbInterpLinear = uicontrol( ...
'Style','pushbutton', 'Parent',hpInterpPos, ...
'String','Linear interpolation',...
'FontSize',tsg.fontSize-1,...
'Tag', 'TAG_PUSH_INTERP_LINEAR', ...
'Units', 'normalized','pos',[.05 .6 .9 .3], ...
'HandleVisibility','callback', ...
'Callback', @InterpPosLinearCallback);
hrbInterpOther = uicontrol( ...
'Style','pushbutton', 'Parent',hpInterpPos, ...
'String','Other method',...
'FontSize',tsg.fontSize-1,...
'Tag', 'TAG_PUSH_INTERP_OTHER', ...
'Units', 'normalized','pos',[.05 .1 .9 .3], ...
'HandleVisibility','callback', ...
'Callback', @InterpPosOtherCallback);
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
%% test if user preference autoload field is checked (on)
% -------------------------------------------------------
if strcmp(root.preference.autoload, 'on')
% this code need to be fatorized file/open menu
% ---------------------------------------------
% A TSG file has been open and read
% ---------------------------------
set( hOpenMenu, 'UserData', 'on' );
% Show handles marked as hidden with HandleVisibility property set to
% callback or off
% -------------------------------------------------------------------
set(0, 'ShowHiddenHandles', 'on');
% enable toolbar menu pushtool
% ----------------------------
hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
set(hdl_pushtool, 'Enable', 'on');
% enable Save menu
% ----------------
set(hSaveMenu, 'Enable', 'on');
% update the filename display
% ---------------------------
set( hInfoFileText, 'String', strcat(tsg.file.name, tsg.file.ext));
% update some fields in tsg structure
% -----------------------------------
updateTsgStruct(hMainFig);
% Running average of TSG time series
% ----------------------------------
tsg_moveaverage(hMainFig);
% Get application data for the test
% ---------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
if ~isempty( tsg.SSPS_WS ) || ~isempty( tsg.SSPS_EXT )
tsg_mergesample( hMainFig );
end
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1 );
plot_Validation( hMainFig, hPlotAxes, 2 );
plot_Validation( hMainFig, hPlotAxes, 3 );
% Draw the map with the ship track
% --------------------------------
% The callback to detect the mouse motion can be set to on
% --------------------------------------------------------
set( hMainFig, 'UserData', 'ButtonMotionOn');
% Hide handles marked as hidden with HandleVisibility property set to
% callback or off
% -------------------------------------------------------------------
set(0, 'ShowHiddenHandles', 'off');
end
%% *************************** CALLBACKS **********************************
%% OpenMenuCallback

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
% Callback function run when the Open menu item is selected
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
function OpenMenuCallback(hObject, eventdata)
Yves Gouriou
committed
% Desactivate some toggle buttons
% -------------------------------
set( hQCToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
Yves Gouriou
committed

jacques.grelet_ird.fr
committed
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
Yves Gouriou
committed

jacques.grelet_ird.fr
committed
% Open standard dialog box for retrieving files
% ---------------------------------------------

jacques.grelet_ird.fr
committed
[fileName, pathname, filterIndex] = uigetfile( ...
Yves Gouriou
committed
{'*.txt';'*.xml';'*.nc';'*.lbv';'*.btl'; '*.arg'}, 'Pick a file');

jacques.grelet_ird.fr
committed
error1 = -1;
error2 = -1;

jacques.grelet_ird.fr
committed
% flushes the event queue and updates the closed uigetfile window
% ---------------------------------------------------------------
drawnow;
% if the user clicks the Cancel button or closes the dialog window,
% FileName and PathName are set to 0.
% -----------------------------------------------------------------

jacques.grelet_ird.fr
committed
if ~isequal(fileName, 0)
% construct valid and full file path
% -----------------------------------
fullFileName = [pathname filesep fileName];

jacques.grelet_ird.fr
committed
% Read the data
% -------------
switch filterIndex
case 1
error1 = readTsgDataTxt( hMainFig, fullFileName );

jacques.grelet_ird.fr
committed
case 2
error1 = readTsgDataXML( hMainFig, fullFileName );

jacques.grelet_ird.fr
committed
case 3
error1 = readTsgDataNetCDF( hMainFig, fullFileName );

jacques.grelet_ird.fr
committed
%# a modifier
if error1 == 1
error2 = error1;
end

jacques.grelet_ird.fr
committed
case 4
error1 = readTsgDataLabview( hMainFig, fullFileName );
if error1 ~= -1
automaticQC( hMainFig );
end
if ~isempty( tsg.SSPS )
error2 = readBucketData( hMainFig, fullFileName );
else
msgbox( 'Load a TSG file before a Water sample file', 'Read Bucket');
end
Yves Gouriou
committed
case 6
if ~isempty( tsg.SSPS )
error2 = readCoriolisData( hMainFig, fullFileName );
else
msgbox( 'Load a TSG file before a Water sample file', 'Read Bucket');
end

jacques.grelet_ird.fr
committed
otherwise
return;

jacques.grelet_ird.fr
committed
end
% A TSG file has been read. Plot the data.
% ----------------------------------------
if error1 ~= -1
% A TSG file has been open and read
% ---------------------------------
set( hOpenMenu, 'UserData', 'on' );

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% enable toolbar menu pushtool
% ----------------------------

jacques.grelet_ird.fr
committed
hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
set(hdl_pushtool, 'Enable', 'on');
% enable Save menu
% ----------------
set(hSaveMenu, 'Enable', 'on');

jacques.grelet_ird.fr
committed

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

jacques.grelet_ird.fr
committed
% update some fields in tsg structure
% -----------------------------------
updateTsgStruct(hMainFig);
Yves Gouriou
committed
% Running average of TSG time series
% ----------------------------------
tsg_moveaverage(hMainFig);

jacques.grelet_ird.fr
committed
% The callback to detect the mouse motion can be set to on
% --------------------------------------------------------
set( hMainFig, 'UserData', 'ButtonMotionOn');
% Update QC statistics
% --------------------
display_QC( hMainFig, hPlotAxes)

jacques.grelet_ird.fr
committed
end
% Get application data
% --------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Merge bucket and external samples
% ---------------------------------
if ~isempty( tsg.SSPS_WS ) || ~isempty( tsg.SSPS_EXT )
tsg_mergesample( hMainFig );
tsg = getappdata( hMainFig, 'tsg_data');
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1 );
plot_Validation( hMainFig, hPlotAxes, 2 );
plot_Validation( hMainFig, hPlotAxes, 3 );

jacques.grelet_ird.fr
committed
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
end
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
%% Inter_OnMenuCallback ................................... Interpolation
%----------------------------------------------------------------------
% Callback function run when
%
function Inter_OnMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'off' );
set( hbgQc, 'Visible', 'off' );
set( hpDateLimit, 'Visible', 'on' );
set( hpInterpPos, 'Visible', 'on' );
% Pushbutton
% ----------
set( hTimelimitToggletool, 'enable', 'on' );
set( hQCToggletool, 'enable', 'off' );
set( hClimToggletool, 'enable', 'off' );
set( hBottleToggletool, 'enable', 'off' );
set( hCalToggletool, 'enable', 'off' );
set( hHeaderPushtool, 'enable', 'off' );
% Draw the 3 plots of the interpolation figure
% --------------------------------------------
plot_Interpolation( hMainFig, hPlotAxes, 1 );
plot_Interpolation( hMainFig, hPlotAxes, 2 );
plot_Interpolation( hMainFig, hPlotAxes, 3 );
end
%% Inter_OffMenuCallback .................................. Interpolation
%----------------------------------------------------------------------
% Callback function run when
%
function Inter_OffMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'off' );
set( hbgQc, 'Visible', 'on');
set( hpDateLimit, 'Visible', 'off' );
set( hpInterpPos, 'Visible', 'off' );
% Enable Pushbuttons
% ------------------
set( hQCToggletool, 'enable', 'on' );
set( hTimelimitToggletool, 'enable', 'off' );
set( hClimToggletool, 'enable', 'on' );
set( hBottleToggletool, 'enable', 'on' );
set( hCalToggletool, 'enable', 'on' );
set( hHeaderPushtool, 'enable', 'on' );
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1 );
plot_Validation( hMainFig, hPlotAxes, 2 );
plot_Validation( hMainFig, hPlotAxes, 3 );
end
%% InterpLinearCallback ...............................Interpolation Linear
%------------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function InterpPosLinearCallback( hObject, eventdata)
% Get the time limits for the correction A TESTER
% --------------------------------------
dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
error = interpPosLinear( hMainFig, dateMin, dateMax );
switch error
case 1
% Plot in the 3 axes
% ------------------
plot_Interpolation( hMainFig, hPlotAxes, 2 );
plot_Interpolation( hMainFig, hPlotAxes, 3 );
case -1
msgbox( 'Date limits are not correct',...
'Correction module', 'warn', 'modal');
end
end
%% InterpOtherCallback ...............................Interpolation OTher
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function InterpPosOtherCallback( hObject, eventdata)
msgbox( 'Method not yet implemented', ...
'Function InterpOtherCallback', ...
'warn',...
'modal' );
end
%% Cal_OnMenuCallback ..................................... Calibration
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function Cal_OnMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'on' );
set( hbgQc, 'Visible', 'off');
% Pushbutton
set( hQCToggletool, 'enable', 'off' );
set( hClimToggletool, 'enable', 'off' );
set( hBottleToggletool, 'enable', 'off' );
set( hHeaderPushtool, 'enable', 'off' );
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% pour test
tsg.SSTP = [];
setappdata( hMainFig, 'tsg_data', tsg );
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );
% Write the Cal Coef in the Editable uicontrol
% --------------------------------------------
if isempty( tsg.CNDC_LINCOEF )
set( hetCalCNDCSlope, 'String', '1');
set( hetCalCNDCOffset, 'String', '0');
else
set( hetCalCNDCSlope, 'String', num2str(tsg.CNDC_LINCOEF(1)));
set( hetCalCNDCOffset, 'String', num2str(tsg.CNDC_LINCOEF(2)));
end
if isempty( tsg.SSJT_LINCOEF )
set( hetCalSSJTSlope, 'String', '1');
set( hetCalSSJTOffset, 'String', '0');
else
set( hetCalSSJTSlope, 'String', num2str(tsg.SSJT_LINCOEF(1)));
set( hetCalSSJTOffset, 'String', num2str(tsg.SSJT_LINCOEF(2)));
end
if isempty( tsg.SSTP_LINCOEF )
set( hetCalSSTPSlope, 'String', '1');
set( hetCalSSTPOffset, 'String', '0');
else
set( hetCalSSTPSlope, 'String', num2str(tsg.SSTP_LINCOEF(1)));
set( hetCalSSTPOffset, 'String', num2str(tsg.SSTP_LINCOEF(2)));
end
end
%% Cal_OffMenuCallback ..................................... Calibration
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function Cal_OffMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'off' );
set( hbgQc, 'Visible', 'on');
% Enable Pushbuttons
% ------------------
set( hQCToggletool, 'enable', 'on' );
set( hClimToggletool, 'enable', 'on' );
set( hBottleToggletool, 'enable', 'on' );
set( hHeaderPushtool, 'enable', 'on' );
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Save the calibration coefficient
% --------------------------------
tsg.CNDC_LINCOEF(1) = str2num(get( hetCalCNDCSlope, 'String'));
tsg.CNDC_LINCOEF(2) = str2num(get( hetCalCNDCOffset, 'String'));
tsg.SSJT_LINCOEF(1) = str2num(get( hetCalSSJTSlope, 'String'));
tsg.SSJT_LINCOEF(2) = str2num(get( hetCalSSJTOffset, 'String'));
tsg.SSTP_LINCOEF(1) = str2num(get( hetCalSSTPSlope, 'String'));
tsg.SSTP_LINCOEF(2) = str2num(get( hetCalSSTPOffset, 'String'));
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1 );
plot_Validation( hMainFig, hPlotAxes, 2 );
plot_Validation( hMainFig, hPlotAxes, 3 );
end
%% CalibrateCallback .......................................... Calibration
function CalibrateCallback(hObject, eventdata)
% Callback function run when
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Get the calibration coefficients.
% They will be used in the function calibration
% ---------------------------------------------
tsg.CNDC_LINCOEF(1) = str2num(get( hetCalCNDCSlope, 'String'));
tsg.CNDC_LINCOEF(2) = str2num(get( hetCalCNDCOffset, 'String'));
tsg.SSJT_LINCOEF(1) = str2num(get( hetCalSSJTSlope, 'String'));
tsg.SSJT_LINCOEF(2) = str2num(get( hetCalSSJTOffset, 'String'));
tsg.SSTP_LINCOEF(1) = str2num(get( hetCalSSTPSlope, 'String'));
tsg.SSTP_LINCOEF(2) = str2num(get( hetCalSSTPOffset, 'String'));
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Calibrate the sensors
% ---------------------
calibration( hMainFig );
% Update the Adjusted variables (SSPS - SSJT) with calibrated records
% -------------------------------------------------------------------
updateAdjustedVariable( hMainFig );
% Refresh plot #1
% ---------------
plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );
% As soon as a modification took place the data should be saved
% -------------------------------------------------------------
set( hSaveMenu, 'UserData', 'on' );
end
%% CancelCalibrationCallback .................................. Calibration
function CancelCalibrationCallback(hObject, eventdata)
% Callback function run when
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
tsg.SSPS_CAL = [];
tsg.SSJT_CAL = [];
% Update the Adjusted variables (SSPS - SSJT) with calibrated records
% -------------------------------------------------------------------
updateAdjustedVariable( hMainFig );
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% 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
%% Zoom_OffMenuCallback
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Callback function run when the zoom toggle toolbar is released

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
function Zoom_OffMenuCallback(hObject, eventdata)
% turns interactive zooming off
% -----------------------------
zoom off;
% 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
committed

jacques.grelet_ird.fr
committed
% Turns off the automatic adaptation of date ticks
% ------------------------------------------------
zoomAdaptiveDateTicks('off');

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
%% Zoom_OnMenuCallback

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
% Callback function run when the zoom toggle toolbar is released
%----------------------------------------------------------------------
function Zoom_OnMenuCallback(hObject, eventdata)
% cursor back to normal
% ---------------------
set(hMainFig,'Pointer','arrow');

jacques.grelet_ird.fr
committed
% returns a zoom mode object for the figure hMainFig handle
% --------------------------------------------------------

jacques.grelet_ird.fr
committed
hZoom = zoom(hMainFig);

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

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

jacques.grelet_ird.fr
committed
%zoom on;

jacques.grelet_ird.fr
committed
% Turns on the automatic adaptation of date ticks
% -----------------------------------------------
zoomAdaptiveDateTicks('on');
% Desactivate some toggle buttons
% -------------------------------
set( hQCToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );

jacques.grelet_ird.fr
committed
end
%% Pan_OffMenuCallback

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Callback function run when the pan toggle toolbar is released

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
function Pan_OffMenuCallback(hObject, eventdata)
% turns interactive pan off
% -------------------------
pan off;
% 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
committed
% Turns off the automatic adaptation of date ticks
% ------------------------------------------------
panAdaptiveDateTicks('off');

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
%% Pan_OnMenuCallback

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
% Callback function run when the pan toggle toolbar is selected
%----------------------------------------------------------------------
function Pan_OnMenuCallback(hObject, eventdata)
% cursor back to normal
% ---------------------
set(hMainFig,'Pointer','arrow');

jacques.grelet_ird.fr
committed
% Returns a pan mode object for the figure handle

jacques.grelet_ird.fr
committed
% -----------------------------------------------

jacques.grelet_ird.fr
committed
hPan = pan(hMainFig);

jacques.grelet_ird.fr
committed
% Disallows a pan operation on the MAP axes objects
% --------------------------------------------------
setAllowAxesPan(hPan, hPlotAxes(4), false);

jacques.grelet_ird.fr
committed
% turns on interactive pan (same effect than pan on) but prevent
% side effect on another figure
% --------------------------------------------------------------

jacques.grelet_ird.fr
committed
set(hPan,'enable', 'on');
% Turns on the automatic adaptation of date ticks
% -----------------------------------------------
panAdaptiveDateTicks('on');
% Desactivate some toggle buttons
% -------------------------------
set( hQCToggletool, 'state', 'off' );
set( hZoomToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
%% QC_OnMenuCallback ............................... Quality Control Module

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Callback function run when the QC toggle tool is pressed

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
function QC_OnMenuCallback(gcbo, eventdata)
% Desactivate toggletools.
% ------------------------
set( hZoomToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
set( hCalToggletool, 'state', 'off' );

jacques.grelet_ird.fr
committed
% Activate right clic context menu on first axes (salinity)
% ---------------------------------------------------------

jacques.grelet_ird.fr
committed
% Activate clic mouse menu on first axes (salinity) for next rbbox
% ----------------------------------------------------------------
set(hPlotAxes(1),'ButtonDownFcn', @QC_SelectCallback);

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% change cursor to crosshair aspect
% ---------------------------------

jacques.grelet_ird.fr
committed
set( hMainFig, 'Pointer', 'crosshair');

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% -------------------------------------------------------------

jacques.grelet_ird.fr
committed
% nested function on mouse clic when QC toggle tool is selected

jacques.grelet_ird.fr
committed
% -------------------------------------------------------------
function QC_SelectCallback(gcbo, eventdata)
% disable ButtonMotion on main fig during select

jacques.grelet_ird.fr
committed
% prevent drawing to map
% ----------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', []);

jacques.grelet_ird.fr
committed
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');

jacques.grelet_ird.fr
committed
% Selection of the data within the figure
% ---------------------------------------
point1 = get(gca,'CurrentPoint'); % button down detected
Yves Gouriou
committed
finalRect = rbbox; % return figure units
point2 = get(gca,'CurrentPoint'); % button up detected

jacques.grelet_ird.fr
committed
Yves Gouriou
committed
point1 = point1(1,1:2); % extract x and y

jacques.grelet_ird.fr
committed
point2 = point2(1,1:2);

jacques.grelet_ird.fr
committed
p1 = min(point1,point2);
Yves Gouriou
committed
p2 = max(point1,point2); % calculate locations
% The following code is only executed if the left mouse button is clicked.
% If the right mouse button is clicked, this code must not be
% executed as the variable 'ind' will be emptied. And this variable
% is used when the context menu (callback 'Qc') is called
% -----------------------------------------------------------------
if ~strcmp( get(gcf, 'SelectionType'), 'alt')
% The QC is applied either on TSG data either on Sample data.
% it depends if the Botte Toggle button has been cliked on
% -----------------------------------------------------------
if strcmp( get(hBottleToggletool, 'state'), 'on')
% get index on selected zone
% --------------------------
ind = find(tsg.DAYD_SPL > p1(1,1) & tsg.DAYD_SPL < p2(1,1) & ...
tsg.SSPS_SPL_DIF > p1(1,2) & tsg.SSPS_SPL_DIF < p2(1,2));
Yves Gouriou
committed
% Keep the information on the indices of the selected zone
% --------------------------------------------------------
tsg.rbboxind = ind .* ones(size(ind));
% Modifiy the QC
% --------------
tsg.SSPS_SPL_QC(ind) = tsg.qc.active.Code;
Yves Gouriou
committed
% Save the modifications
% ----------------------
setappdata( hMainFig, 'tsg_data', tsg);
Yves Gouriou
committed
% Update sample QC in the _WS and _EXT records
% --------------------------------------------
updateSampleQC( hMainFig );
Yves Gouriou
committed
% plot selected data with selected code
% --------------------------------------
plot_Correction( hMainFig, hPlotAxes);
Yves Gouriou
committed
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
else
% get index on selected zone
% ---------------------------
ind = find(tsg.DAYD > p1(1,1) & tsg.DAYD < p2(1,1) & ...
tsg.SSPS > p1(1,2) & tsg.SSPS < p2(1,2));
% Keep the information on the indices of the selected zone
% --------------------------------------------------------
tsg.rbboxind = ind .* ones(size(ind));
% Modifiy the QC
% --------------
tsg.SSPS_QC(ind) = tsg.qc.active.Code;
% put last SSPS_QC in queue (Undo/Redo)
% -------------------------------------
tsg.queue = push( tsg.queue, tsg.SSPS_QC);
% store QC in queue object, for undo
% ----------------------------------
tsg.queue = push(tsg.queue, tsg.SSPS_QC);
% Save the modifications
% ----------------------
setappdata( hMainFig, 'tsg_data', tsg);
% Draw plot 1 of the validation figure
% ------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1 );
Yves Gouriou
committed
% refresh QC statistic panel
% --------------------------
display_QC( hMainFig, hPlotAxes );
% enable undo menu
% ----------------
set(findobj('tag','UIMENU_UNDO'),'enable','on');
end
% As soon as a modification took place the data should be saved
% -------------------------------------------------------------
set( hSaveMenu, 'UserData', 'on' );

jacques.grelet_ird.fr
committed
Yves Gouriou
committed
end

jacques.grelet_ird.fr
committed
Yves Gouriou
committed
% enable ButtonMotion on main fig after select QC area
% ----------------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);

jacques.grelet_ird.fr
committed
Yves Gouriou
committed
end
end
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
%% QC_OffMenuCallback .............................. Quality Control Module
%----------------------------------------------------------------------
% Callback function run when the QC toggle tool is released
%----------------------------------------------------------------------
function QC_OffMenuCallback(gcbo, eventdata)
% 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 no more visible
% -----------------------
%set( hbgQc, 'Visible', 'off' );
% cursor back to normal
% ---------------------
set(hMainFig,'Pointer','arrow');
end
Yves Gouriou
committed
%% Qc context menu selected ........................ Quality Control Module
%-----------------------------------------------------------
% Callback function run when the QC context menu is selected
%
% Context menu used to attribute a QC to the TSG time series
%
%-----------------------------------------------------------
function Qc(hObject, eventdata, key)
Yves Gouriou
committed
% Retrieve Default Quality Code and Color
% ---------------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
Yves Gouriou
committed
% get key and some values in hashtable
% ------------------------------------
code = get(tsg.qc.hash, key, 'code');
color = get(tsg.qc.hash, key, 'color');
Yves Gouriou
committed
% 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 ~isempty( tsg.rbboxind )
if strcmp( get(hBottleToggletool, 'state'), 'on')
tsg.SSPS_SPL_QC(tsg.rbboxind) = tsg.qc.active.Code;
% Save tsg.SSPS_QC and tsg.qc.active.Code
% in the application data
Yves Gouriou
committed
% ----------------------------------------
% Draw the 3 plots of the Correction figure
% -----------------------------------------
plot_Correction( hMainFig, hPlotAxes );
Yves Gouriou
committed
else
tsg.SSPS_QC(tsg.rbboxind) = tsg.qc.active.Code;
Yves Gouriou
committed
% Save tsg.SSPS_QC in the application data
% ----------------------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Draw plot 1 of the validation figure
% ------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1 );
Yves Gouriou
committed
end
Yves Gouriou
committed
% Update the radio button corresponding to the selected
% QC context menu (rbg : RadioButtonGroup)
% -----------------------------------------------------
radioTag = ['TAG_QC_RADIO_' 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
setappdata( hMainFig, 'tsg_data', tsg );

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
%% Radiobutton Quality Control ..................... Quality Control Module
% ---------------------------------------------------------------
% Callback to select CODE and COLOR QC from the RadioButton Group
% ---------------------------------------------------------------
function RadiobuttonQc(source, eventdata)
% Retrieve Default Quality Code and Color
% ---------------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
Yves Gouriou
committed
% Retrieve the key from the active RadioButton
% --------------------------------------------
rbTag = get(eventdata.NewValue,'Tag');
key = strrep(rbTag, 'TAG_QC_RADIO_', '');
Yves Gouriou
committed
% store his handle to uibuttongroup userdata
% ------------------------------------------
set(hbgQc,'Userdata', eventdata.NewValue);
% get key and some values in hashtable
% ------------------------------------
code = get(tsg.qc.hash, key, 'code');
color = get(tsg.qc.hash, key, 'color');
% set active code and color from selected context menu
% ----------------------------------------------------
tsg.qc.active.Code = code;
tsg.qc.active.Color = color;
setappdata( hMainFig, 'tsg_data', tsg );
end
%% preQcPanCallback .................................Quality Control Module
% ---------------------------------------------------------------
% Callback function ... to be completed
% ---------------------------------------------------------------
function preQcPanCallback(obj, evd)
set(hQCToggletool, 'state', 'off' );
end
%% postQcPanCallback ............................... Quality Control Module
% ---------------------------------------------------------------
% Callback function ... to be completed
% ---------------------------------------------------------------
function postQcPanCallback(obj, evd)
set(hQCToggletool, 'state', 'on' );
% Set the right limit and interval to the 3 axes
% ----------------------------------------------
for iaxe = 1:3
set(hPlotAxes(iaxe),'XTickMode','auto')
datetick(hPlotAxes(iaxe),'x','keeplimits')
end
end
%% MouseMotion

jacques.grelet_ird.fr
committed
%---------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Callback function run when mouse pointer is moving on temperature plot
% draw corresponding measurement position on map

jacques.grelet_ird.fr
committed
%---------------------------------------------------------------------

jacques.grelet_ird.fr
committed
function MouseMotion(hObject, eventdata)
% 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
% -----------------------------------------------------------
Yves Gouriou
committed
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');
Yves Gouriou
committed
% Code to Activate the PAN function when QC mode is active
% A PAN zone is defined in the bottom (10%) of PlotAxes(1)
% 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.
% ---------------------------------------------------------
qcState = get(hQCToggletool, 'state' );
if strcmp(qcState, '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)
Yves Gouriou
committed
set(hPan,'ActionPreCallback', @preQcPanCallback);
set(hPan,'ActionPostCallback', @postQcPanCallback);
set(hPan,'Enable','on');
else
pan off
end
end
% Dynamically display data in uicontrol
% -------------------------------------
if x > tsg.DAYD(1) && x < tsg.DAYD(end)
%if x > limx(1) && x < limx(2)
indCursor = find( tsg.DAYD > x);
set( hInfoDateText, 'String',...
datestr(tsg.DAYD(indCursor(1)),'dd/mm/yyyy HH:MM'));
set( hInfoLatText, 'String', dd2dm(tsg.LATX(indCursor(1)),0));
set( hInfoLongText, 'String', dd2dm(tsg.LONX(indCursor(1)),1));
set( hInfoSSPSText, 'String', tsg.SSPS(indCursor(1)));
set( hInfoSSJTText, 'String', tsg.SSJT(indCursor(1)));
if ~isempty(tsg.SSTP)
set( hInfoSSTPText, 'String', tsg.SSTP(indCursor(1)));
end
% Plot the position on the map if this one is active
% --------------------------------------------------
if strcmp( get(hMapPanel, 'Visible'), 'on')
% Select the map axes
% -------------------
axes( hPlotAxes(4));
if isempty( get(hMapPanel, 'UserData'))
hMarker = m_line( tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),...
'Marker','o','MarkerSize',5, ...
'Color','r', 'MarkerFaceColor','r');
set(hMapPanel, 'UserData', hMarker)
else
delete(get(hMapPanel, 'UserData'));
hMarker = m_line( ...
tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),...
'Marker','o','MarkerSize',5, ...
'Color','r', 'MarkerFaceColor','r');

jacques.grelet_ird.fr
committed
end
end
end
end

jacques.grelet_ird.fr
committed
end
%% Map_OffMenuCallback

jacques.grelet_ird.fr
committed
%---------------------------------------------------------------------
% Callback function run when the Map tool bar item is unselected
%---------------------------------------------------------------------
function Map_OffMenuCallback(hObject, eventdata)
Yves Gouriou
committed
%if ~isempty( get(hMapPanel, 'UserData'))
% delete(get(hMapPanel, 'UserData'));
%end
%hLines = findobj( hPlotAxes(4), 'Tag', 'TAG_AXES_MAP');
%hLines = get( hPlotAxes(4), 'Children' );
%if ~isempty( hLines )
% delete(hLines);
%end
Yves Gouriou
committed
% Make the earth map invisible
% ----------------------------
set(hMapPanel, 'Visible', 'off' );

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
%% Map_OnMenuCallback

jacques.grelet_ird.fr
committed
%---------------------------------------------------------------------
% Callback function run when the Map tool bar item is selected
%---------------------------------------------------------------------
function Map_OnMenuCallback(hObject, eventdata)

jacques.grelet_ird.fr
committed
% Desactivate Zoom and Pan toggle buttons
% may be change in the futur ...
% ---------------------------------------
set(hZoomToggletool, 'state', 'off' );
set(hPanToggletool, 'state', 'off' );

jacques.grelet_ird.fr
committed
% Make the earth map visible
% --------------------------

jacques.grelet_ird.fr
committed
set(hMapPanel, 'Visible', 'on' );
Yves Gouriou
committed
plot_map( hMainFig, hPlotAxes)

jacques.grelet_ird.fr
committed
end
%% Bottle_OnMenuCallback ................................ Correction Module

jacques.grelet_ird.fr
committed
%---------------------------------------------------------------------
% Callback function run when the bootle push tool is selected

jacques.grelet_ird.fr
committed
%---------------------------------------------------------------------
function Bottle_OnMenuCallback(hObject, eventdata)
% Callback function run when the Bottle tool bar item is selected
% Get the tsg structure
% ---------------------
tsg = getappdata(hMainFig, 'tsg_data');
% Switch somme buttons
% --------------------
set( hZoomToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hMapToggletool, 'state', 'off' );
set( hClimToggletool, 'Enable', 'off');
set( hCalToggletool, 'enable', 'off' );
set( hInterpToggletool, 'enable', 'off' );
set( hTimelimitToggletool, 'enable', 'on' );
% Activate uipanels
% -----------------
set( hpDateLimit, 'Visible', 'on' );
set( hbgCorMethod, 'Visible', 'on' );
% Test if tsg and sample data have been loaded
% --------------------------------------------
% Compute the sample-TSG differences
% ----------------------------------
diffTsgSample( hMainFig );
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes );
% 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));
% Desactivate the corretion module
% --------------------------------
set( hBottleToggletool, 'state', 'off' );
msgbox('Sample data not loaded in the program', 'modal');

jacques.grelet_ird.fr
committed
end
%% Bottle_OffMenuCallback ............................... Correction module
%---------------------------------------------------------------------
% Callback function run when the bootle push tool is selected
%---------------------------------------------------------------------
function Bottle_OffMenuCallback(hObject, eventdata)
% If necessary toggle off some buttons
% ------------------------------------
set( hZoomToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hMapToggletool, 'state', 'off' );
set( hClimToggletool, 'enable', 'on');
set( hCalToggletool, 'enable', 'on' );
set( hInterpToggletool, 'enable', 'on' );
set( hTimelimitToggletool, 'enable', 'off' );
% Desactivate some toolbar buttons
% --------------------------------
set( hpDateLimit, 'Visible', 'off' );
set( hbgCorMethod, 'Visible', 'off' );
Yves Gouriou
committed
% Desactivate Click Mouse on figure
% ---------------------------------
set( hMainFig, 'WindowButtonDownFcn', []);
% Drawing only necessary if the Correction moduel has been activated
% ------------------------------------------------------------------
if ~isempty( tsg.SSPS_SPL )
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1 );
plot_Validation( hMainFig, hPlotAxes, 2 );
plot_Validation( hMainFig, hPlotAxes, 3 );
end
Yves Gouriou
committed
Yves Gouriou
committed
%% CorCancelCallback .................................... Correction Module
function CorCancelCallback(hObject, eventdata)
% Desactivate somme Toggle button
% -------------------------------
set( hZoomToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
tsg = getappdata(hMainFig, 'tsg_data');
tsg.SSPS_ADJUSTED_ERROR = NaN*ones(size(tsg.SSPS));
setappdata(hMainFig, 'tsg_data', tsg);
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes );
%% CorLinearCallback .................................... Correction Module
function CorLinearCallback(hObject, eventdata)
% Callback function run when
% Desactivate somme Toggle button
% -------------------------------
set( hZoomToggletool, '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');
% Compute the sample-TSG differences
% ----------------------------------
diffTsgSample( hMainFig );
% Correction
% ----------
error = corTsgLinear(hMainFig, dateMin, dateMax);
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes );
case -1
msgbox( 'Date limits are not correct',...
'Correction module', 'warn', 'modal');
end
%% CorMedianCallback .................................... Correction Module
function CorMedianCallback(hObject, eventdata)
% Callback function run when
% Desactivate somme Toggle button
% -------------------------------
set( hZoomToggletool, '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');
% Compute the sample-TSG differences
% ----------------------------------
diffTsgSample( hMainFig );
% Correction
% ----------
error = corTsgMedian(hMainFig, dateMin, dateMax);
switch error
case 1
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes );
case -1
msgbox( 'Date limits are not correct',...
end
end
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
%% SelectTime_OnMenuCallback
%---------------------------
function SelectTime_OnMenuCallback(hObject, eventdata)
% Callback function run when the ....
% Desactivate Zoom and Pan functions.
% ----------------------------------
set( hZoomToggletool, '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(gcbo, eventdata)
% 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);
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
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(hObject, eventdata)
% Callback function run when the ....
% Desactivate time limit buttons
% ------------------------------
set( hTimelimitToggletool, 'state', 'off');
set( hMainFig, 'WindowButtonDownFcn', []);
set( hMainFig, 'Pointer', 'arrow');
end
%% Clim_OffMenuCallback
%------------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Callback function run when the Levitus climatology toolbar is unselected
%------------------------------------------------------------------------
function Clim_OffMenuCallback(hObject, eventdata)

jacques.grelet_ird.fr
committed
% Get lines handles from tag
% --------------------------
hLines = findobj('-regexp', 'Tag', 'TAG_LINE_CLIMATO_');

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Delete climatology lines on axes
% ---------------------------------
delete(hLines);

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
%% Clim_OnMenuCallback

jacques.grelet_ird.fr
committed
%------------------------------------------------------------------------
% Callback function run when the Levitus climatology toolbar is unselected
%------------------------------------------------------------------------
function Clim_OnMenuCallback(hObject, eventdata)

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Test if the TSG and bucket files have been read
% -----------------------------------------------
if strcmp( get(hOpenMenu, 'UserData'), 'on' )

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% plot climatology

jacques.grelet_ird.fr
committed
% ----------------

jacques.grelet_ird.fr
committed
plot_Climatology(hMainFig, hPlotAxes);

jacques.grelet_ird.fr
committed
end
end
%% ClimatoSelectMenuCallback
% -------------------------------------------------------------------
% Callback function run when climato submenu is selected
% -------------------------------------------------------------------
function ClimatoSelectMenuCallback(hObject, eventdata, climato, time)
% find all climato submenu and set 'checked' property to 'off'
% ------------------------------------------------------------
hdl = findobj( '-regexp', 'tag', 'TAG_UIMENU_CLIMATO');
set(hdl, 'checked', 'off');
% set current climato submenu checked
% -----------------------------------
set(hObject, 'checked', 'on');
% memorize action on climatology menu for next use
% ------------------------------------------------
s.type = climato;
s.time = time;
set(hClimatoMenu, 'userdata', s);
% check if climatology toggle button is set
% -----------------------------------------
if strcmp(get(hClimToggletool, 'state'), 'on')

jacques.grelet_ird.fr
committed
% clear last plotted climatology
% ------------------------------
Clim_OffMenuCallback;

jacques.grelet_ird.fr
committed
% plot and read (eventually) new climatology
% ------------------------------------------
plot_Climatology(hMainFig, hPlotAxes);

jacques.grelet_ird.fr
committed
end
end
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
%% PreferencesMenuCallback
% -------------------------------------------------------------------
% Callback function run when Option/Preference is selected
% -------------------------------------------------------------------
function PreferencesMenuCallback(hObject, eventdata)
% Test if the preference menu is allready checked
% -----------------------------------------------
if strcmp( get(hObject, 'checked'), 'on' )
% set preference autoload off (unchecked)
% ---------------------------------------
root.preference.autoload = 'off';
else
% set preference autoload on (checked)
% ------------------------------------
root.preference.autoload = 'on';
end
% set current option/preference submenu state
% -------------------------------------------
set(hObject, 'checked', root.preference.autoload);
% store root struct to root UserData
% ----------------------------------
set(0, 'userdata', root);
end

jacques.grelet_ird.fr
committed
%% HeaderMenuCallback

jacques.grelet_ird.fr
committed
% -------------------------------------------------------------------
% Callback function run when the headerForm tool bar item is selected
% -------------------------------------------------------------------

jacques.grelet_ird.fr
committed
function HeaderMenuCallback(hObject, eventdata)

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% call header form function
% -------------------------
headerForm(hMainFig);

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
end
%% SaveMenuCallback

jacques.grelet_ird.fr
committed
% -------------------------------------------------------------------
% Callback function run when the Save menu item is selected
% -------------------------------------------------------------------

jacques.grelet_ird.fr
committed
function SaveMenuCallback(hObject, eventdata)

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');

jacques.grelet_ird.fr
committed
% fill or append header form
% -------------------------
error = headerForm(hMainFig);
% if user press continue button, ask for netcdf file
% ------------------------------------------------
if error ~= -1
[fileName, pathName, filterindex] = uiputfile('*.nc', ...
'Save file name', strcat(tsg.file.name, '.nc'));

jacques.grelet_ird.fr
committed
% if user press cancel button, all var are set to zero
% ----------------------------------------------------
if filterindex == 0

jacques.grelet_ird.fr
committed
return;
end
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
% flushes the event queue and updates the closed uiputfile window
% ---------------------------------------------------------------
drawnow;
% write netcdf file
% -----------------
error = writeTSGDataNetCDF(hMainFig, strcat(pathName, fileName));

jacques.grelet_ird.fr
committed
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
% Check for NetCDF writing error

jacques.grelet_ird.fr
committed
% must to be rewriting
% ------------------------------

jacques.grelet_ird.fr
committed
if error == -1
warning('tsgqc_GUI:SaveMenuCallback', ...
'NetCDF writing error: %s %s', pathName, fileName);

jacques.grelet_ird.fr
committed
return;

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% update the display
% ------------------
set( hInfoFileText, 'String', fileName);

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% enable Quality Control mode
% ---------------------------
hdl_pushtool = findobj('Tag', 'QC');
set(hdl_pushtool, 'Enable', 'on');

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
end
%% ExportMenuCallback
% -------------------------------------------------------------------
% Callback function run when the Export menu item is selected
% -------------------------------------------------------------------
function ExportMenuCallback(hObject, eventdata)
% Export module not yet implemented
% -------------------------------
msgbox('Export module not yet implemented', 'modal');
end
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
%% UndoMenuCallback
% -----------------------------------------------------------------------
% Callback function run when the Edit/Undo menu item is selected (Ctrl+Z)
% -----------------------------------------------------------------------
function UndoMenuCallback(hObject, eventdata)
% Undo module not yet implemented
% -------------------------------
% msgbox('Undo module not yet implemented', 'modal');
tsg.queue = undo(tsg.queue);
tsg.SSPS_QC = get(tsg.queue);
% Make the Salinity, temperature and velocity plot
% ------------------------------------------------
plot_SalTempVel( hMainFig, hPlotAxes );
end
%% RedoMenuCallback
% -----------------------------------------------------------------------
% Callback function run when the Edit/Redo menu item is selected (Ctrl+R)
% -----------------------------------------------------------------------
function RedoMenuCallback(hObject, eventdata)
% Redo module not yet implemented
% -------------------------------
msgbox('Redo module not yet implemented', 'modal');
end
%% QuitMenuCallback

jacques.grelet_ird.fr
committed
% -----------------------------------------------------------------
% Callback function run when the Quit menu item is selected
% -----------------------------------------------------------------
function QuitMenuCallback(hObject, eventdata)
% get root struct from root object
% --------------------------------
root = get(0,'Userdata');
% save config mat file in prefdir
% -------------------------------
config_file = [prefdir, filesep, tsgqcname, '.mat'];
% set tsg.levitus empty before save preferences in mat file
% ---------------------------------------------------------
tsg.levitus = [];
% save preference mat file
% ------------------------
save( config_file, 'root', 'tsg');

jacques.grelet_ird.fr
committed
% If the data have been modified and not save, the program

jacques.grelet_ird.fr
committed
% ask to save the data

jacques.grelet_ird.fr
committed
% --------------------------------------------------------
if strcmp( get( hSaveMenu, 'UserData' ), 'on')
selection = ...
questdlg('The file has been modified. Do you want to save it ?',...
'Save before Quit?',...
'Yes', 'No', 'Yes');

jacques.grelet_ird.fr
committed
if strcmp(selection, 'Yes')
% call File/Save Menu Callback before before quit
% -----------------------------------------------
SaveMenuCallback;

jacques.grelet_ird.fr
committed
end
% quit program
% ------------

jacques.grelet_ird.fr
committed
quitProgram(hMainFig, DEFAULT_PATH_FILE);

jacques.grelet_ird.fr
committed
else
selection = ...
questdlg(['Quit ' get(hMainFig, 'Name') '?'],...
['Quit ' get(hMainFig, 'Name') '?'],...
'Yes', 'No', 'Yes');
if strcmp(selection, 'No')
return;
else

jacques.grelet_ird.fr
committed
quitProgram(hMainFig, DEFAULT_PATH_FILE);

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
end
% end of tsgqc_GUI
% ----------------
end