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
% 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
%% Create and then hide the GUI as it is being constructed.
% --------------------------------------------------------
hMainFig = figure(...
'Name', 'TSG Validation', ...
'NumberTitle', 'off', ...
'Resize', 'on', ...
'Menubar','none', ...
'Toolbar', 'none', ...
'UserData', 'ButtonMotionOff', ...
'WindowButtonMotionFcn', @MouseMotion, ...
'CloseRequestFcn', @QuitProgram,...
'HandleVisibility','callback',...
'Visible','on',...
'Units', 'normalized',...
'Position',guiLimits, ...
'Color', get( 0, 'DefaultUIControlBackgroundColor' ));

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

jacques.grelet_ird.fr
committed
%% Construct the Menu
% -----------------
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);
hQuitMenu = uimenu(...
'Parent',hFileMenu,...
'Label','Quit',...
'Separator','on',...
'Accelerator','Q',...
'HandleVisibility','callback',...
'Callback',@QuitMenuCallback);
% Edit menu with Undo/Redo submenu
% --------------------------------
hEditMenu = uimenu(hMainFig,'Label','Edit');
uimenu(hEditMenu,'Label','Undo',...
'Accelerator','Z',...
'Tag','Undo',...
'Enable', 'off',...
'Callback',@UndoMenuCallback);
uimenu(hEditMenu,'Label','Redo',...
'Accelerator','R',...
'Tag','Redo',...
'Enable', 'off',...
'Callback',@RedoMenuCallback);

jacques.grelet_ird.fr
committed
%% Construct the Toolbar
% -----------------
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','callback', ...
'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','callback', ...
'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','callback', ...
'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);
%'ClickedCallback', @PanMenuCallback);
hQCToggletool = uitoggletool(... % Open QC toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'TooltipString','Validation codes',...
'Separator', 'on', ...
'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);
hMapToggletool = uitoggletool(... % Open Map toolbar button

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

jacques.grelet_ird.fr
committed
'TooltipString','Map and ship track',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'mapicon.mat']),...
'HandleVisibility','callback', ...
'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',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'climicon.mat']),...
'HandleVisibility','callback', ...
'Tag','PUSHTOOL_CLIM',...
'UserData', 'off',...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @Clim_OffMenuCallback,...
'ONCallback', @Clim_OnMenuCallback);
hBottlePushtool = uitoggletool(... % Open toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'TooltipString','Correct the SSS TSG data',...

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

jacques.grelet_ird.fr
committed
'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','callback', ...
'Tag','PUSHTOOL_HEADER',...
'Enable', 'off',...
'ClickedCallback', @HeaderMenuCallback);
%% Dynamic text area that displays the loaded filename, date, position and
% salinity, temperature
% ---------------------------------------------------

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

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

jacques.grelet_ird.fr
committed
'Position',[.01, .25, .04, .5], ...

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

jacques.grelet_ird.fr
committed
'Position', [.05, .25, .1, .5]);

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

jacques.grelet_ird.fr
committed
'Position',[.16, .25, .03, .5], ...

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

jacques.grelet_ird.fr
committed
'Position', [.20, .25, .13, .5]);

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

jacques.grelet_ird.fr
committed
'Position',[.34, .25, .05, .5], ...

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

jacques.grelet_ird.fr
committed
'Position', [.4, .25, .9, .5]);

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

jacques.grelet_ird.fr
committed
'Position',[.50, .25, .06, .5], ...

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

jacques.grelet_ird.fr
committed
'Position', [.57, .25, .07, .5]);

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',[.65, .25, .04, .5], ...

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

jacques.grelet_ird.fr
committed
'Position', [.69, .25, .05, .5]);

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',[.75, .25, .04, .5], ...

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

jacques.grelet_ird.fr
committed
'Position', [.79, .25, .05, .5]);

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',[.85, .25, .04, .5], ...

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

jacques.grelet_ird.fr
committed
'Position', [.89, .25, .05, .5]);

jacques.grelet_ird.fr
committed
%% Construct the 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, .85, .95]);

jacques.grelet_ird.fr
committed
hPlotAxes(1) = axes(... % the axes for plotting Salinity
'Parent', hPlotsPanel, ...
'Units', 'normalized', ...
'Visible', 'off', ...
'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', ...
'HandleVisibility','callback', ...
'Position',[.05, .32, .93, .27]);

jacques.grelet_ird.fr
committed

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', ...
'HandleVisibility','callback', ...
'Position',[.05, .06, .93, .22]);

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, .57]);

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

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

jacques.grelet_ird.fr
committed
'Position',[.05, .05, .9, .9]);
%% Construct Button Group panel for QC
% -------------------------------------
hbgQc = uibuttongroup(...
'Parent', hMainFig, ...
'tag', 'TAG_QC_DISPLAY_PANEL',...
'HandleVisibility','on',...

jacques.grelet_ird.fr
committed
'Visible', 'on',...
'BorderType', 'etchedin',...
'Position', [.0, .70, .15, .25]);
% Initialize CallBack for button group properties
% -----------------------------------------------
set(hbgQc,'SelectionChangeFcn',@RadiobuttonQc);
%% Construct the 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 uicontextmenu
% -------------------------
uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','on', ...
'Label', label,...
'ForegroundColor', color,...
'Callback', {@Qc, key});

jacques.grelet_ird.fr
committed
% add button QC on hbgQc Button group
% -----------------------------------

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.08]);

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', ...
'String', 'N/A',...
'ForegroundColor', color,...
'Tag', ['TAG_QC_TEXT_' key],...
'Position', [.61, .85-count*.12, .37, 0.08]);
% increment count
% ---------------
count = count + 1;

jacques.grelet_ird.fr
committed
end
end

jacques.grelet_ird.fr
committed
% -------------------------
% Callbacks for tsgcqc_GUI

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

jacques.grelet_ird.fr
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
% Make the fileName

jacques.grelet_ird.fr
committed
% ATTENTION : function OpenMenuCallback(hObject, eventdata)
% This has to be made general for UNIX and WINDOWS system
% ---------------------------------------------------------

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

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

jacques.grelet_ird.fr
committed
if ~isequal(fileName, 0)

jacques.grelet_ird.fr
committed
% Read the data
% -------------
switch filterIndex
case 1

jacques.grelet_ird.fr
committed
error1 = readTsgDataTxt( hMainFig, fileName );

jacques.grelet_ird.fr
committed
case 2

jacques.grelet_ird.fr
committed
error1 = readTsgDataXML( hMainFig, fileName );

jacques.grelet_ird.fr
committed
case 3

jacques.grelet_ird.fr
committed
error1 = readTsgDataNetCDF( hMainFig, fileName );

jacques.grelet_ird.fr
committed
%# a modifier
if error1 == 1
error2 = error1;
end
case 4
error1 = readTsgDataLabview( hMainFig, fileName );
case 5

jacques.grelet_ird.fr
committed
error2 = readBucketData(hMainFig, fileName );

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
% ---------------------------

jacques.grelet_ird.fr
committed
set( hInfoFileText, 'String', fileName);

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');
% Make the Salinity, temperature and velocity plot
% ------------------------------------------------

jacques.grelet_ird.fr
committed
plot_SalTempVel( hMainFig, hPlotAxes );
% Plot the Map with the ship trackline
% ------------------------------------
plotmap( hMainFig, hPlotAxes)

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
% Merge the different water sample (NetCdf or ASCII files) in
% a unique structure : 'sample'
% -----------------------------------------------------------
%@ desactive le merge pour l'instant en attente d'une structure de

jacques.grelet_ird.fr
committed
%donn�es validee

jacques.grelet_ird.fr
committed
%@[sample] = tsg_mergesample( hMainFig );
%@ Save the 'sample' struct. as an application data
% ------------------------------------------------
%if ~isempty( sample )
% setappdata( hMainFig, 'sample', sample );
%end
% Plot Salinity bucket
% NOT at that step. It will interfere with the QC process
% Maybe use a new pushbutton to draw or delete the bucket
% -------------------------------------------------------

jacques.grelet_ird.fr
committed
if error2 ~= -1

jacques.grelet_ird.fr
committed
plot_WS( hMainFig, hPlotAxes );
plot_EXT( hMainFig, hPlotAxes );

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
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;

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
% 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');

jacques.grelet_ird.fr
committed
% Desactivate the QC and Pan toggle buttons

jacques.grelet_ird.fr
committed
% -----------------------------------------
set(hQCToggletool, 'state', 'off' );
set(hPanToggletool, '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;

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
% turns on interactive pan (same effect than pan on) but prevent
% side effect on another figure
% -------------------------------------------------------------------
set(hPan,'enable', 'on');
% Turns on the automatic adaptation of date ticks
% -----------------------------------------------
panAdaptiveDateTicks('on');
% Desactivate the QC and pan toggle button
% ----------------------------------------
set(hQCToggletool, 'state', 'off' );
set(hZoomToggletool, 'state', 'off' );

jacques.grelet_ird.fr
committed
end
%% QC_OffMenuCallback

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

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

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
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', []);
% cursor back to normal
% ---------------------
set(hMainFig,'Pointer','arrow');

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
%% QC_OnMenuCallback

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)

jacques.grelet_ird.fr
committed
% Desactivate Zoom and Pan functions.
% ----------------------------------
set(hZoomToggletool, 'state', 'off' );
set(hPanToggletool, 'state', 'off' );

jacques.grelet_ird.fr
committed
% Activate right clic context menu on first axes (salinity)
% ---------------------------------------------------------
set(hPlotAxes(1),'UIContextMenu', hQcCmenu);

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
% Active keyPress/release callback in QC mode for PAN and Zoom
% ------------------------------------------------------------
%set( hMainFig, 'KeyReleaseFcn', @QC_keyReleaseCallback);

jacques.grelet_ird.fr
committed
%set( hMainFig, 'KeyReleaseFcn',@QC_keyReleaseCallback);

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)

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

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
point1 = point1(1,1:2); % extract x and y
point2 = point2(1,1:2);
p1 = min(point1,point2);
p2 = max(point1,point2); % calculate locations

jacques.grelet_ird.fr
committed

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

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
tsg.SSPS_QC(ind) = tsg.qc.active.Code;

jacques.grelet_ird.fr
committed
% set current axes and plot
% -------------------------
axes(hPlotAxes(1));
hold on

jacques.grelet_ird.fr
committed
color = ['.' tsg.qc.active.Color];

jacques.grelet_ird.fr
committed
% plot selected data with selected code
% --------------------------------------

jacques.grelet_ird.fr
committed
plot(tsg.DAYD(ind), tsg.SSPS(ind), color );
hold off
% As soon as a modification took place the data should be saved
% -------------------------------------------------------------
set( hSaveMenu, 'UserData', 'on' );
% Save the modifications
% ----------------------
setappdata( hMainFig, 'tsg_data', tsg);

jacques.grelet_ird.fr
committed
% refresh QC statistic panel
% --------------------------
display_QC( hMainFig, hPlotAxes );

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

jacques.grelet_ird.fr
committed
% -------------------------------------------------------------
% nested function on keypress when QC selected
% -------------------------------------------------------------
% function QC_keyReleaseCallback(gcbo, evnt)
% out = sprintf('Character: %c\nKey: %s\n',evnt.Character,evnt.Key);
% disp(out)
% if strcmp(evnt.Key, 'control')
% panState = get(hZoomToggletool, 'state');
% if strcmp(panState, 'on')
% set(hZoomToggletool, 'state', 'off' );
% set(hQCToggletool, 'state', 'on' );
% else
% set(hZoomToggletool, 'state', 'on' );
% end
% end
% set( hMainFig, 'KeyReleaseFcn', @QC_keyReleaseCallback);
% end

jacques.grelet_ird.fr
committed
% -------------------------------------------------------------
% nested function on keyRelease when QC selected
% -------------------------------------------------------------
% function QC_keyReleaseCallback(gcbo, event)
% if strcmp(event.Key, 'control')
% set(hPanToggletool, 'state', 'off' );
% end
% end

jacques.grelet_ird.fr
committed
end
%% Qc context menu selected

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
% Callback function run when the QC context menu is selected
%---------------------------------------------------------------------

jacques.grelet_ird.fr
committed
function Qc(hObject, eventdata, key)
% Retrieve Default Quality Code and Color
% ---------------------------------------
tsg = getappdata( hMainFig, 'tsg_data');

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

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
%% Radiobutton Quality Control
% ---------------------------------------------------------------
% 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');
% Retrieve the Kye frome the active RadioButton
% ---------------------------------------------
rbTag = get(eventdata.NewValue,'Tag');
key = strrep(rbTag, 'TAG_QC_RADIO_', '');
% 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
%% 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 the mouse position
% ----------------------
point = get(gcf,'CurrentPoint');
if point(1) > .05 && point(2) > .6 && point(1) < .95 && point(2) < .92
% Get current position of cusor and return its coordinates in
% axes with handle h_axes
% -----------------------------------------------------------
[x, y] = gpos(hPlotAxes(1));

jacques.grelet_ird.fr
committed
% Dynamically display data in uicontrol
% -------------------------------------

jacques.grelet_ird.fr
committed
if x > tsg.DAYD(1) && x < tsg.DAYD(end)
indCursor = find( tsg.DAYD > x);
set( hInfoDateText, 'String',...

jacques.grelet_ird.fr
committed
datestr(tsg.DAYD(indCursor(1)),'dd/mm/yyyy HH:MM'));

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

jacques.grelet_ird.fr
committed
% 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');
set(hMapPanel, 'UserData', hMarker);

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)
% Make the earth map invisible
% ----------------------------

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

jacques.grelet_ird.fr
committed
end
%% Bottle_OnMenuCallback

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
Yves Gouriou
committed
% Desactivate the Climatology button
% ----------------------------------
set( hClimToggletool, 'Enable', 'off');
% Test if tsg and sample data have been loaded
% --------------------------------------------
if ~isempty( tsg.SSPS_WS ) || ~isempty( tsg.SSPS_EXT )
% Merge bucket and external samples
% ---------------------------------
tsg_mergesample( hMainFig );
% Compute the sample-TSG differences
% ----------------------------------
Yves Gouriou
committed
diffTsgSample( hMainFig );
% plot Salinity Difference
% ------------------------
plot_Sample( hMainFig, hPlotAxes );
% Call the GUI for tsg correction
% -------------------------------
msgbox('Correction module not yet implemented', 'modal');
% tsgcor_GUI( hMainFig );
else
msgbox('TSG or Sample data not loaded in the program', 'modal');
end

jacques.grelet_ird.fr
committed
end
%% Bottle_OffMenuCallback
%---------------------------------------------------------------------
% Callback function run when the bootle push tool is selected
%---------------------------------------------------------------------
function Bottle_OffMenuCallback(hObject, eventdata)
Yves Gouriou
committed
% Activate the Climatology button
% -------------------------------
set( hClimToggletool, 'Enable', 'on');
% Plot the SSS, SST and Velocity
% ------------------------------
plot_SalTempVel( hMainFig, hPlotAxes );
plot_WS( hMainFig, hPlotAxes );
plot_EXT( hMainFig, hPlotAxes );
end
Yves Gouriou
committed
%% 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

jacques.grelet_ird.fr
committed
% Get line handles
% ----------------------------------------------
hLine1 = get( hPlotAxes(1), 'UserData');
hLine2 = get( hPlotAxes(2), 'UserData');

jacques.grelet_ird.fr
committed
% Delete climatology lines on axes

jacques.grelet_ird.fr
committed
% -----------------------------------
try
delete(hLine1.stdClimMinus);
delete(hLine1.stdClimPlus);
delete(hLine1.meanClim);
delete(hLine2.stdClimMinus);
delete(hLine2.stdClimPlus);
delete(hLine2.meanClim);
% if handle is missing, prevent warning message on console
% --------------------------------------------------------

jacques.grelet_ird.fr
committed
catch
end

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
% Get data
% -----------------------
tsg = getappdata( hMainFig, 'tsg_data' );

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Get line handles
% ----------------

jacques.grelet_ird.fr
committed
hLine1 = get( hPlotAxes(1), 'UserData');
hLine2 = get( hPlotAxes(2), 'UserData');

jacques.grelet_ird.fr
committed
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
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
% Read Climatology
% ----------------
if isempty( tsg.levitus.data)
levitus = read_file_woa01( 'woa01an.nc' );
if ~isstruct(levitus)
errordlg({'NetCDF climatology file not present in you path',...
'Check your matlab path or download it from',...
'ftp://ftp.ifremer.fr/ifremer/ird/us191/oceano/lib/matlab/woa01an.nc'},...
'NetCDF climatology file access error');
return;
else
tsg.levitus.data = levitus;
tsg.levitus.type = 'woa01an';
end
setappdata( hMainFig, 'tsg_data', tsg );
end
% round positive latitude and Longitude toward zero
% -------------------------------------------------
ind = find(tsg.LATX > 0);
lat(ind) = fix(tsg.LATX(ind)) + 0.5;
ind = find(tsg.LONX > 0);
lon(ind) = fix(tsg.LONX(ind)) + 0.5;
% rounds negative latitude and Longitudeto the nearest lowest integers
% ---------------------------------------------------------------------
ind = find(tsg.LATX <= 0);
lat(ind) = floor(tsg.LATX(ind)) + 0.5;
ind = find(tsg.LONX <= 0);
lon(ind) = floor(tsg.LONX(ind)) + 0.5;
% Calculates differences between adjacent elements of X.
% 0 if adajacent latitude or longitude are equal
% - 1 or -1 otherwise
% ------------------------------------------------------------
lat_diff = [diff( lat )'; 0];
lon_diff = [diff( lon )'; 0];
% Select latitude and longitude
% -----------------------------
ind = find(abs(lat_diff) == 1 | abs(lon_diff == 1));
lat2 = lat( ind );
lon2 = lon( ind );
time = tsg.DAYD( ind );
temp = tsg.SSJT( ind );
psal = tsg.SSPS( ind );
% Get Climatology
% LATX(80) = -0.5 et LATX(81) = 0.5
% LONX(180) = -0.5 et LONX(181) = 0.5
% ----------------
axes( hPlotAxes(1) );
mean_temp = zeros(size(ind));
mean_psal = zeros(size(ind));
std_temp = zeros(size(ind));
std_psal = zeros(size(ind));

jacques.grelet_ird.fr
committed
for ii=1:length(ind)
ilat = find(tsg.levitus.data.WOA01_LATX == lat2(ii));
ilon = find(tsg.levitus.data.WOA01_LONX == lon2(ii));
mean_temp(ii) = tsg.levitus.data.WOA01_MEAN_TEMP(ilat,ilon,1);
mean_psal(ii) = tsg.levitus.data.WOA01_MEAN_PSAL(ilat,ilon,1);
std_temp(ii) = tsg.levitus.data.WOA01_STD_TEMP(ilat,ilon,1);
std_psal(ii) = tsg.levitus.data.WOA01_STD_PSAL(ilat,ilon,1);

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
% Plot mean salinity climatology
% ------------------------------
hLine1.meanClim = line( ...
time, mean_psal,'Linestyle', '-', 'Color','k');
% Plot with 3 standard deviation
% ------------------------------
hLine1.stdClimPlus = line( ...
time, mean_psal + 3 * std_psal ,'Linestyle', '-', 'Color','r');
hLine1.stdClimMinus = line( ...
time, mean_psal - 3 * std_psal ,'Linestyle', '-', 'Color','r');
% Plot mean temperature climatology
% ---------------------------------
axes( hPlotAxes(2));
hLine2.meanClim = line( ...
time, mean_temp,'Linestyle', '-', 'Color','k');
hLine2.stdClimPlus = line( ...
time, mean_temp + 3 * std_temp ,'Linestyle', '-', 'Color','r');
hLine2.stdClimMinus = line( ...
time, mean_temp - 3 * std_temp ,'Linestyle', '-', 'Color','r');
% Store the handle of the bucketline
% ----------------------------------
set( hPlotAxes(1), 'UserData', hLine1 );
set( hPlotAxes(2), 'UserData', hLine2 );

jacques.grelet_ird.fr
committed
end
%% 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
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
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% get fileName without extension in cell
% --------------------------------------
file = textscan( tsg.file.name,'%s','delimiter','.');

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

jacques.grelet_ird.fr
committed
'Save file name', [file{1}{1} '.nc']);

jacques.grelet_ird.fr
committed
% if user press cancel button, all var set to zero
% ------------------------------------------------
if fileName == 0
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
% -----------------

jacques.grelet_ird.fr
committed
error = writeTSGDataNetCDF( hMainFig, [pathName fileName] );

jacques.grelet_ird.fr
committed
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
% Check for a writing pb to NetCDF
% must to be rewriting
% --------------------------------
if error == -1

jacques.grelet_ird.fr
committed
warning('NetCDF writing error: %s %s', pathName, fileName);

jacques.grelet_ird.fr
committed
return;

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

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

jacques.grelet_ird.fr
committed
end
%% QuitMenuCallback

jacques.grelet_ird.fr
committed
% -----------------------------------------------------------------
% Callback function run when the Quit menu item is selected
% -----------------------------------------------------------------
function QuitMenuCallback(hObject, eventdata)

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
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
% --------------------------------------------------------
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');
if strcmp(selection, 'Yes')
return;
else
QuitProgram;
end
else
selection = ...
questdlg(['Quit ' get(hMainFig, 'Name') '?'],...
['Quit ' get(hMainFig, 'Name') '?'],...
'Yes', 'No', 'Yes');
if strcmp(selection, 'No')
return;
else
QuitProgram;
end

jacques.grelet_ird.fr
committed
end

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

jacques.grelet_ird.fr
committed
% -----------------------------------------------------------------
% call from:
% QuitMenuCallback
% callback 'CloseRequestFcn', @QuitProgram

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

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

jacques.grelet_ird.fr
committed
% close the main windows
% ----------------------

jacques.grelet_ird.fr
committed
delete(hMainFig);

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% reset Matlab search path to default

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

jacques.grelet_ird.fr
committed
rmpath( [DEFAULT_PATH_FILE filesep 'tsg_util'] );
rmpath( [DEFAULT_PATH_FILE filesep 'tsg_data'] );
rmpath( [DEFAULT_PATH_FILE filesep 'tsg_io'] );

jacques.grelet_ird.fr
committed
% Refresh file system caches
% --------------------------

jacques.grelet_ird.fr
committed
rehash;

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
end

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