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.2f';

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;
% define 'HandleVisibility' property for all objects
% --------------------------------------------------
handleVisibility = 'on';

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 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)
% display error dialog box and quit
% ---------------------------------
errordlg({'An instance of TSGQC is still running !!!', ...
'Open it from you task bar'}, 'Warning TSGQC');
return;
end
% 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, ...

jacques.grelet_ird.fr
committed
%{
CloseRequestFcn is remove at this time
use use block comments, see:
http://blogs.mathworks.com/loren/2006/08/30/commenting-code/
--------------------------------------
'CloseRequestFcn', @QuitMenuCallback,...
%}
'HandleVisibility', handleVisibility,...

jacques.grelet_ird.fr
committed
'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

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

jacques.grelet_ird.fr
committed
tsg_preferences(hMainFig, tsgqcname, DEFAULT_PATH_FILE);

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', handleVisibility,...

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

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

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

jacques.grelet_ird.fr
committed
hQuitMenu = uimenu(...
'Parent',hFileMenu,...
'Label','Quit',...
'Separator','on',...
'Accelerator','Q',...
'HandleVisibility', handleVisibility,...

jacques.grelet_ird.fr
committed
'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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
'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
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',...

jacques.grelet_ird.fr
committed
'Checked', tsg.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);
hPrintFigPushtool = uipushtool(... % Open Save toolbar button
'Parent',hToolbar,...
'TooltipString','Print figures',...
'CData',iconRead( ...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'printdoc.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_PRINTFIG',...
'Enable', 'off',...
'ClickedCallback', @PrintFigMenuCallback);

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);
hReportPushtool = uipushtool(... % Open Report saving button
'Parent',hToolbar,...
'TooltipString','Save a report',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'reporticon.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_REPORT',...
'Enable', 'off',...
'ClickedCallback', @ReportMenuCallback);
%% 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',...
'Position',[0.15, 0.0, .85, .95]);
hPlotAxes(1) = axes( 'Parent', hPlotsPanel, 'Visible', 'off', ...
'box', 'on', 'Units', 'normalized','Tag', 'TAG_AXES_1', ...
'HandleVisibility','on', 'Position',[.05, .64, .93, .35]);
hPlotAxes(2) = axes( 'Parent', hPlotsPanel, 'Visible', 'off',...
'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_2', ...
'HandleVisibility','on', 'Position',[.05, .33, .93, .27]);
hPlotAxes(3) = axes('Parent', hPlotsPanel, 'Visible', 'off',...
'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_3', ...
'HandleVisibility','on', 'Position',[.05, .02, .93, .27]);

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]);
%% uipanel for Quality Control Buttons - uibutton group
% -----------------------------------------------------------------------
hbgQc = uibuttongroup(...
'Parent', hMainFig, ...
'Title', 'Validation Codes', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'tag', 'TAG_QC_DISPLAY_PANEL',...
Yves Gouriou
committed
'HandleVisibility','on',...
'BorderType', 'etchedin',...
'Units', 'normalized', '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',...
'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...

jacques.grelet_ird.fr
committed
'HorizontalAlignment', 'left', ...
'HandleVisibility','on', ...
'String', label,...
'Tag', ['TAG_QC_RADIO_' key], ...
'Units', 'normalized', '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',...
'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...

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

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

jacques.grelet_ird.fr
committed
end
end
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
%% uibutton group panel - Choose the parameter (SSPS - SSTP - SSJT)
% -----------------------------------------------------------------------
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, .81, .15, .15]);
para = [ 'SSPS'; 'SSJT'; 'SSTP' ];
strPara = [ ['Salinity ' para(1,:) ' ']; ...
['Temperature ' para(2,:)]; ...
['Temperature ' para(3,:)] ];
for i = 1:3
% add button QC to hbgParameter uibuttongroup
% -------------------------------------------
uicontrol(...
'Parent', hbgParameter,...
'Style', 'radiobutton',...
'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...
'HorizontalAlignment', 'left', ...
'HandleVisibility','on', ...
'String', strPara(i, :),...
'Tag', ['TAG_PARA_RADIO_' para(i,:)], ...
'Units', 'normalized', 'Position', [.05, .8-(i-1)*.30, .90, 0.12]);
end
% Initialize CallBack for button group properties
% -----------------------------------------------
set(hbgParameter,'SelectionChangeFcn',@RadiobuttonParameter);
%% 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', handleVisibility, ...
'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', handleVisibility, ...
'Callback', @CorLinearCallback);
hrbCorMedian = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'String','Running median filter',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_MEDIAN_PUSH', ...
'HandleVisibility', handleVisibility, ...
'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',...
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
'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);
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, ...
hrbInterpCancel = uicontrol( ...
'Style','pushbutton', 'Parent',hpInterpPos, ...
'String','Cancel interpolation',...
'FontSize',tsg.fontSize-1,...
'Tag', 'TAG_PUSH_INTERP_CANCEL', ...
'Units', 'normalized','pos',[.05 .05 .9 .25], ...
'HandleVisibility', handleVisibility, ...
'Callback', @InterpPosCancelCallback);
%% test if user preference autoload field is checked (on)
% -------------------------------------------------------

jacques.grelet_ird.fr
committed
if strcmp(tsg.preference.autoload, 'on')
% A TSG file has been open and read
% ---------------------------------
set( hOpenMenu, 'UserData', 'on' );
% Show handles marked as hidden with HandleVisibility property set to
% callback or off
% -------------------------------------------------------------------
set(0, 'ShowHiddenHandles', 'on');
% enable toolbar menu pushtool
% ----------------------------
hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
set(hdl_pushtool, 'Enable', 'on');
% enable Save menu
% ----------------
set(hSaveMenu, 'Enable', 'on');
% update the filename display
% ---------------------------
set( hInfoFileText, 'String', strcat(tsg.file.name, tsg.file.ext));
% update some fields in tsg structure
% -----------------------------------
% Get application data for the test
% ---------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Get the default parameter
% -------------------------
PARA = tsg.preference.parameter;
% The smooth TSG time series (tsg_moveaverage) is
% no more computed : too long
% We now computed a smooth value only at the position of the sample
% in diffTsgSample
% -----------------------------------------------------------------
%tsg_moveaverage( hMainFig, PARA );
% Merge sample from different origins : WS and EXT
% ------------------------------------------------
tsg_mergesample( hMainFig, PARA );
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
% 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]);
plot_Validation( hMainFig, hPlotAxes, 1, PARA );
plot_Validation( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Validation( hMainFig, hPlotAxes, 3, 'SPDC' );
% 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
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'off' );
set( hpDateLimit, 'Visible', 'off' );
set( hpInterpPos, 'Visible', 'off' );
% set( hbgParameter, 'Visible', 'off');
set( hBottleToggletool, 'state', 'off' );
set( hCalToggletool, 'state', 'off' );
set( hInterpToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
set( hZoomToggletool, 'state', 'off' );
set( hHeaderPushtool, 'enable', 'off' );
Yves Gouriou
committed

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

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

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% flushes the event queue and updates the closed uigetfile window
% ---------------------------------------------------------------
drawnow;

jacques.grelet_ird.fr
committed
% 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)
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
% construct valid and full file path
% -----------------------------------

jacques.grelet_ird.fr
committed
fullFileName = strcat(pathname, fileName);

jacques.grelet_ird.fr
committed
% Read the data
% -------------
errTsg = -2;
errSpl = -2;

jacques.grelet_ird.fr
committed
switch filterIndex
case 1 % read TSG text file *.txt
errTsg = readTsgDataTsg( hMainFig, fullFileName);
%errTsg = readTsgDataTxt( hMainFig, fullFileName );
case 2 % read TSG XML file *.xml
errTsg = readTsgDataXML( hMainFig, fullFileName );
case 3 % read TSG netcdf file *.nc
errTsg = readTsgDataNetCDF( hMainFig, fullFileName );
case 4 % read TSG labview file *.lbv
tsg_initialisation(hMainFig);
errTsg = readTsgDataLabview( hMainFig, fullFileName );
case 5 % Read bucket file *.btl
errSpl = readBucketData( hMainFig, fullFileName );
else
msgbox( 'Load a TSG file before a Water sample file', 'Read Bucket');
end
case 6 % Read Argo file *.arg (G. Reverdin format)
errSpl = readCoriolisData( hMainFig, fullFileName );
else
msgbox( 'Load a TSG file before a Water sample file', 'Read Bucket');
end

jacques.grelet_ird.fr
committed
otherwise
% Reset pointer to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
% diplay warning msgbox
% ---------------------
msgbox( {['Invalid TSG file: ' fileName],...
'Please select another file'},...
'Warning open file', 'warn', 'modal' );

jacques.grelet_ird.fr
committed
return;
end % switch filterIndex
% Get the tsg structure
% ---------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Default parameter
% -----------------
PARA = tsg.preference.parameter;

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

jacques.grelet_ird.fr
committed
% 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');
set( hbgParameter, 'Visible', 'on');
% Enable Save and Export menu
% ---------------------------
set(hSaveMenu, 'Enable', 'on');
set(hExportMenu, 'Enable', 'on');

jacques.grelet_ird.fr
committed
% update some fields in tsg structure and restore tsg
% ---------------------------------------------------
Yves Gouriou
committed
% update the filename display
% ---------------------------
set( hInfoFileText, 'String', strcat(tsg.file.name, tsg.file.ext));
Yves Gouriou
committed
% The smooth TSG time series (tsg_moveaverage) is
% no more computed : too long
% We now computed a smooth value only at the position of the sample
% in diffTsgSample
% -----------------------------------------------------------------
%tsg_moveaverage(hMainFig, PARA);

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

jacques.grelet_ird.fr
committed
display_QC( hMainFig, hPlotAxes);
elseif errTsg > -2
% Problem to read the file or
% Choice of parameters for Labview file canceled by the user
% TSG structure has been reinitialize
% Disable toolbar menu pushtool except the open file button
% ----------------------------------------------------------
hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
set(hdl_pushtool, 'Enable', 'off');
set( hOpenPushtool, 'Enable', 'on' );
end %if errTsg > 0
% Merge sample from different origins : WS and EXT
% ------------------------------------------------
tsg_mergesample( hMainFig, PARA );
% Draw the 3 plots of the validation figure
% The plots need to be re-initialize because of a bug with
% the zoom function. When you open a new TSG file and you
% have used the zoom funtion with the preceding file.
% The zoom function keep the X and Y limits of the preceding file
% ---------------------------------------------------------------
delete( hPlotAxes(1) );
delete( hPlotAxes(2) );
delete( hPlotAxes(3) );
hPlotAxes(1) = axes( 'Parent', hPlotsPanel, 'Visible', 'off', ...
'box', 'on', 'Units', 'normalized','Tag', 'TAG_AXES_1', ...
'HandleVisibility','on', 'Position',[.05, .64, .93, .35]);
hPlotAxes(2) = axes( 'Parent', hPlotsPanel, 'Visible', 'off',...
'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_2', ...
'HandleVisibility','on', 'Position',[.05, .33, .93, .27]);
hPlotAxes(3) = axes('Parent', hPlotsPanel, 'Visible', 'off',...
'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_3', ...
'HandleVisibility','on', 'Position',[.05, .02, .93, .27]);
resetAxes( hMainFig, hPlotAxes )
plot_Validation( hMainFig, hPlotAxes, 1, PARA );
plot_Validation( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Validation( hMainFig, hPlotAxes, 3, 'SPDC' );
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
end % if ~isequal(fileName, 0)

jacques.grelet_ird.fr
committed
end
%% Inter_OnMenuCallback ................................... Interpolation
%----------------------------------------------------------------------
% Callback function run when
%
function Inter_OnMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpDateLimit, 'Visible', 'on' );
set( hpInterpPos, 'Visible', 'on' );
set( hpCalCoef, 'Visible', 'off');
set( hbgQc, 'Visible', 'off');
set( hbgParameter, 'Visible', 'off');
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( hZoomToggletool, 'state', 'off', 'enable', 'on' );
% Get application data TSG
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Get the information on time limits of the time series
% Write them in the uipanel
% -----------------------------------------------------
noNaN = tsg.DAYD(~isnan( tsg.DAYD ));
set( hetDateMin, 'String', datestr(noNaN(1), 31));
set( hetDateMax, 'String', datestr(noNaN(end), 31));
% Draw the 3 plots of the interpolation figure
% --------------------------------------------
plot_Interpolation( hMainFig, hPlotAxes, 1 );
plot_Interpolation( hMainFig, hPlotAxes, 2 );
plot_Interpolation( hMainFig, hPlotAxes, 3 );
end
%% Inter_OffMenuCallback .................................. Interpolation
%----------------------------------------------------------------------
% Callback function run when
%
function Inter_OffMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'off' );
set( hpDateLimit, 'Visible', 'off' );
set( 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( hZoomToggletool, 'state', 'off', 'enable', 'on' );
% Get tsg structure
% -----------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1, tsg.preference.parameter );
plot_Validation( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Validation( hMainFig, hPlotAxes, 3, 'SPDC' );
% Set the pointer
% ---------------
set( hMainFig, 'Pointer', 'arrow');
end
%% InterpLinearCallback ...............................Interpolation Linear
%------------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function InterpPosLinearCallback( hObject, eventdata)
% Get the time limits for the correction A TESTER
% --------------------------------------
dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
error = interpPosLinear( hMainFig, dateMin, dateMax );
switch error
case 1
% Plot in the 3 axes
% ------------------
plot_Interpolation( hMainFig, hPlotAxes, 2 );
plot_Interpolation( hMainFig, hPlotAxes, 3 );
case -1
msgbox( 'Date limits are not correct',...
'Correction module', 'warn', 'modal');
end
end
%% InterpOtherCallback ...............................Interpolation OTher
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function InterpPosOtherCallback( hObject, eventdata)
msgbox( 'Method not yet implemented', ...
'Function InterpOtherCallback', ...
'warn',...
'modal' );
end
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
%% InterpPosCancelCallback ..........................Cancel Interpolation
%----------------------------------------------------------------------
function InterpPosCancelCallback(hObject, eventdata)
% Callback function run when
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Get NO_CONTROL and INTERPOLATED_VALUE codes
% -------------------------------------------
NO_CONTROL = get(tsg.qc.hash, 'NO_CONTROL', 'code');
INTERPOLATED_VALUE = get(tsg.qc.hash, 'INTERPOLATED_VALUE', 'code');
if ~isempty( tsg.POSITION_QC )
iINTERP = find( tsg.POSITION_QC == INTERPOLATED_VALUE);
tsg.LATX( iINTERP ) = NaN * ones( size( iINTERP), 1 );
tsg.LONX( iINTERP ) = NaN * ones( size( iINTERP), 1 );
tsg.POSITION_QC = [];
end
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Refresh plots
% -------------
plot_Interpolation( hMainFig, hPlotAxes, 1 );
plot_Interpolation( hMainFig, hPlotAxes, 2 );
plot_Interpolation( hMainFig, hPlotAxes, 3 );
end
%% Cal_OnMenuCallback ..................................... Calibration
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function Cal_OnMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'on' );
set( hbgParameter, 'Visible', 'off');
set( hbgQc, 'Visible', 'off');
set( hQCToggletool, 'enable', 'off' );
set( hClimToggletool, 'enable', 'off', 'state', 'off' );
set( hBottleToggletool, 'enable', 'off' );
set( hHeaderPushtool, 'enable', 'off' );
set( hPanToggletool, 'state', 'off', 'enable', 'on' );
set( hTimelimitToggletool, 'state', 'off', 'enable', 'off' );
set( hZoomToggletool, 'state', 'off', 'enable', 'on' );
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );
% Write the Cal Coef in the Editable uicontrol
% --------------------------------------------
set( hetCalCNDCSlope, 'String', num2str(tsg.CNDC_LINCOEF(1)));
set( hetCalCNDCOffset, 'String', num2str(tsg.CNDC_LINCOEF(2)));
set( hetCalSSJTSlope, 'String', num2str(tsg.SSJT_LINCOEF(1)));
set( hetCalSSJTOffset, 'String', num2str(tsg.SSJT_LINCOEF(2)));
set( hetCalSSTPSlope, 'String', num2str(tsg.SSTP_LINCOEF(1)));
set( hetCalSSTPOffset, 'String', num2str(tsg.SSTP_LINCOEF(2)));
end
%% Cal_OffMenuCallback ..................................... Calibration
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function Cal_OffMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'off' );
set( hbgParameter, 'Visible', 'on');
% Enable Pushbuttons
% ------------------
set( hClimToggletool, 'enable', 'on' );
set( hBottleToggletool, 'enable', 'on' );
set( hHeaderPushtool, 'enable', 'on' );
set( hQCToggletool, 'state', 'off', 'enable', 'on' );
set( hPanToggletool, 'state', 'off', 'enable', 'on' );
set( hTimelimitToggletool, 'state', 'off', 'enable', 'on' );
set( hZoomToggletool, 'state', 'off', 'enable', 'on' );
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Save the calibration coefficient
% --------------------------------
tsg.CNDC_LINCOEF(1) = str2num(get( hetCalCNDCSlope, 'String'));
tsg.CNDC_LINCOEF(2) = str2num(get( hetCalCNDCOffset, 'String'));
tsg.SSJT_LINCOEF(1) = str2num(get( hetCalSSJTSlope, 'String'));
tsg.SSJT_LINCOEF(2) = str2num(get( hetCalSSJTOffset, 'String'));
tsg.SSTP_LINCOEF(1) = str2num(get( hetCalSSTPSlope, 'String'));
tsg.SSTP_LINCOEF(2) = str2num(get( hetCalSSTPOffset, 'String'));
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1, tsg.preference.parameter );
plot_Validation( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Validation( hMainFig, hPlotAxes, 3, 'SPDC' );
%% CalibrateCallback .......................................... Calibration
function CalibrateCallback(hObject, eventdata)
% Callback function run when
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Get the calibration coefficients.
% They will be used in the function calibration
% ---------------------------------------------
tsg.CNDC_LINCOEF(1) = str2num(get( hetCalCNDCSlope, 'String'));
tsg.CNDC_LINCOEF(2) = str2num(get( hetCalCNDCOffset, 'String'));
tsg.SSJT_LINCOEF(1) = str2num(get( hetCalSSJTSlope, 'String'));
tsg.SSJT_LINCOEF(2) = str2num(get( hetCalSSJTOffset, 'String'));
tsg.SSTP_LINCOEF(1) = str2num(get( hetCalSSTPSlope, 'String'));
tsg.SSTP_LINCOEF(2) = str2num(get( hetCalSSTPOffset, 'String'));
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Calibrate the sensors
% ---------------------
calibration( hMainFig );
% Update the Adjusted variables (SSPS - SSJT) with calibrated records
% -------------------------------------------------------------------
updateAdjustedVariable( hMainFig );
% Refresh plot #1
% ---------------
plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );
% As soon as a modification took place the data should be saved
% -------------------------------------------------------------
set( hSaveMenu, 'UserData', 'on' );
end
%% CancelCalibrationCallback .................................. Calibration
function CancelCalibrationCallback(hObject, eventdata)
% Callback function run when
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Emptied the CAL variables
% -------------------------
tsg.CNDC_CAL = [];
tsg.SSPS_CAL = [];
tsg.SSJT_CAL = [];
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Update the Adjusted variables
% -----------------------------
updateAdjustedVariable( hMainFig );
% Refresh plot #1
% ---------------
plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );
% As soon as a modification took place the data should be saved
% -------------------------------------------------------------
set( hSaveMenu, 'UserData', 'on' );
end
%% 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')

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
% --------------------------------------------------------------
set(hPan, 'enable', 'on');

jacques.grelet_ird.fr
committed
% 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)
PARA = tsg.preference.parameter;
% Make the QC code uipanel visible
% --------------------------------
set( hbgQc, 'Visible' ,'on');
set( hbgParameter, 'Visible', 'off');
% Desactivate toggletools.
% ------------------------
set( hZoomToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
set( hCalToggletool, 'state', 'off', 'enable', 'off' );
set( hInterpToggletool, 'state', 'off', 'enable', '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
% 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.([PARA '_SPL_DIF']) > p1(1,2) &...
tsg.([PARA '_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.([PARA '_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, PARA );
Yves Gouriou
committed
% plot selected data with selected code
% --------------------------------------
plot_Correction( hMainFig, hPlotAxes, PARA);
Yves Gouriou
committed
else
% get index on selected zone
% ---------------------------
ind = find(tsg.DAYD > p1(1,1) & tsg.DAYD < p2(1,1) & ...
tsg.(PARA) > p1(1,2) & tsg.(PARA) < p2(1,2));
Yves Gouriou
committed
% Keep the information on the indices of the selected zone
% --------------------------------------------------------
tsg.rbboxind = ind .* ones(size(ind));
% Modifiy the QC
% --------------
tsg.([PARA '_QC'])(ind) = tsg.qc.active.Code;
Yves Gouriou
committed
% put last SSPS_QC in queue (Undo/Redo)
% -------------------------------------
tsg.queue = push( tsg.queue, tsg.([PARA '_QC']));
Yves Gouriou
committed
% store QC in queue object, for undo
% ----------------------------------
tsg.queue = push(tsg.queue, tsg.([PARA '_QC']));
Yves Gouriou
committed
% Save the modifications
% ----------------------
setappdata( hMainFig, 'tsg_data', tsg);
% Draw plot 1 of the validation figure
% ------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1, PARA );
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
%% 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 visible or not
% -----------------------
set( hbgQc, 'Visible', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
set( hCalToggletool, 'state', 'off', 'enable', 'on' );
set( hInterpToggletool, 'state', 'off', 'enable', 'on' );
% uibuttongroup uipanel used to choose a parameter is set to
% on only if the Correction screen (bottle toggletool) is off
% -----------------------------------------------------------
if strcmp( get( hBottleToggletool, 'state'), 'off')
set( hbgParameter, 'Visible', 'on');
end
% 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');
% Get the parameter (SSPS, SSJT or SSTP)
% --------------------------------------
PARA = tsg.preference.parameter;
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.([PARA '_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, PARA );
Yves Gouriou
committed
else
tsg.([PARA '_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, PARA );
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
%% Radiobutton Parameter choice ..................... Parameter choice
% ---------------------------------------------------------------
% Callback to select CODE and COLOR QC from the RadioButton Group
% ---------------------------------------------------------------
function RadiobuttonParameter(source, eventdata)
% If the map is visible, hide it
% ------------------------------
set( hMapPanel, 'visible', 'off' );
set( hMapToggletool, 'state', 'off');
set( hClimToggletool, 'state', 'off');
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
% Retrieve Default Quality Code and Color
% ---------------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Retrieve the key from the active RadioButton
% --------------------------------------------
rbTag_Old = get(eventdata.OldValue,'Tag');
rbTag = get(eventdata.NewValue,'Tag');
PARA = strrep(rbTag, 'TAG_PARA_RADIO_', '');
% Test if PARA exists
% -------------------
ind = find( isnan(tsg.(PARA)) == 0 );
if ~isempty( tsg.(PARA) ) & ~isempty (ind )
% store his handle to uibuttongroup userdata
% ------------------------------------------
set(hbgParameter,'Userdata', eventdata.NewValue);
tsg.preference.parameter = PARA;
setappdata( hMainFig, 'tsg_data', tsg );
% Get sample data
% ---------------
tsg_mergesample( hMainFig, PARA );
% The smooth TSG time series (tsg_moveaverage) is
% no more computed : too long
% We now computed a smooth value only at the position of the sample
% in diffTsgSample
% -----------------------------------------------------------------
%tsg_moveaverage(hMainFig, PARA);
% Draw the 3 plots of the validation figure
% -----------------------------------------
resetAxes( hMainFig, hPlotAxes )

jacques.grelet_ird.fr
committed
plot_Validation( hMainFig, hPlotAxes, 1, PARA );
plot_Validation( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Validation( hMainFig, hPlotAxes, 3, 'SPDC' );
else
msgbox( ['No ' PARA ' data in the file'], 'Parameter choice', 'warn', 'modal');
% Set the old radio-button active
% -------------------------------
hbgChildren = get(hbgParameter,'Children'); % Get the handles of the rbg
hbgTagCell = get(hbgChildren, 'tag'); % get the TAG of the rbg
ind = strcmp(rbTag_Old, hbgTagCell); % Compare the TAG
hRadioButton = hbgChildren( ind == 1 ); % Get the handle of the button
set(hbgParameter, 'SelectedObject', hRadioButton); % Make this button active
end
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'))
if ~isnan( tsg.LONX(indCursor(1)) )
hMarker = m_line( tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),...
'Marker','o','MarkerSize',5, ...
'Color','r', 'MarkerFaceColor','r');
set(hMapPanel, 'UserData', hMarker);
end
if ~isnan( tsg.LONX(indCursor(1)) )
delete(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);
end

jacques.grelet_ird.fr
committed
end
Loading
Loading full blame...