-
Yves Gouriou authoredYves Gouriou authored
tsgqc_GUI.m 37.25 KiB
function tsgqc_GUI
% 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
% ********************
clc
% Find program directory.
% functions (icons) should be store at a lower level
% add directories to Matlab search path, works on UNIX
% and Windows host
% ---------------------------------------------------
tsgqcname = mfilename;
fulltsgqcname = mfilename('fullpath');
DEFAULT_PATH_FILE = strrep(fulltsgqcname, tsgqcname, '') ;
p = [pathsep,...
DEFAULT_PATH_FILE,[filesep 'tsg_util' pathsep],...
DEFAULT_PATH_FILE,[filesep 'tsg_data' pathsep]
];
addpath( p, '-END' );
rehash;
% Screen limits for the GUI
% -------------------------
set(0,'Units','normalized');
guiLimits = get(0,'ScreenSize');
guiLimits(1) = guiLimits(1) + 0.05;
guiLimits(2) = guiLimits(2) + 0.1;
guiLimits(3) = guiLimits(3) - 0.1;
guiLimits(4) = guiLimits(4) - 0.2;
% Create and then hide the GUI as it is being constructed.
% --------------------------------------------------------
hMainFig = figure(...
'Name', 'TSG Validation', ...
'NumberTitle', 'off', ...
'Resize', 'on', ...
'Menubar','none', ...
'Toolbar', 'none', ...
'Tag', 'ButtonMotionOff', ...
'WindowButtonMotionFcn', @MouseMotion, ...
'CloseRequestFcn', @QuitProgram,...
'HandleVisibility','callback',...
'Visible','on',...
'Units', 'normalized',...
'Position',guiLimits);
% Construct the Menu
% -----------------
hFileMenu = uimenu(...
'Parent', hMainFig,...
'HandleVisibility','callback',...
'Label', 'File');
hOpenMenu = uimenu(...
'Parent', hFileMenu,...
'Tag', 'off', ...
'Label','Open',...
'Accelerator','O',...
'HandleVisibility','callback',...
'Callback', @OpenMenuCallback);
hSaveMenu = uimenu(...
'Parent', hFileMenu,...
'Label','Save',...
'Accelerator','S',...
'Tag', 'off', ...
'HandleVisibility','callback',...
'Callback',@SaveMenuCallback);
hQuitMenu = uimenu(...
'Parent',hFileMenu,...
'Label','Quit',...
'Separator','on',...
'Accelerator','Q',...
'HandleVisibility','callback',...
'Callback',@QuitMenuCallback);
% Construct the Toolbar
% -----------------
hToolbar = uitoolbar(... % Toolbar for Open and Print buttons
'Parent',hMainFig, ...
'HandleVisibility','callback');
hSavePushtool = uipushtool(... % Open Save toolbar button
'Parent',hToolbar,...
'TooltipString','Save file',...
'CData',iconRead( ...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'savedoc.mat']),...
'HandleVisibility','callback', ...
'ClickedCallback', @SaveMenuCallback);
hZoomPushtool = uipushtool(... % Open Zoom toolbar button
'Parent',hToolbar,...
'Separator', 'on', ...
'TooltipString','Zoom',...
'CData', iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/zoom.mat')),...
'HandleVisibility','callback', ...
'ClickedCallback', @ZoomMenuCallback);
hPanPushtool = uipushtool(... % Open Pan toolbar button
'Parent',hToolbar,...
'TooltipString','Pan',...
'CData',iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/pan.mat')),...
'HandleVisibility','callback', ...
'ClickedCallback', @PanMenuCallback);
hQCPushtool = uipushtool(... % Open QC toolbar button
'Parent',hToolbar,...
'TooltipString','Validation codes',...
'Separator', 'on', ...
'Tag', 'off', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'qcicon.mat']),...
'HandleVisibility','callback', ...
'ClickedCallback', @QCMenuCallback);
hMapPushtool = uipushtool(... % Open Map toolbar button
'Parent',hToolbar,...
'TooltipString','Map and ship track',...
'Separator', 'on', ...
'Tag', 'off', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'mapicon.mat']),...
'HandleVisibility','callback', ...
'ClickedCallback', @MapMenuCallback);
hClimPushtool = uipushtool(... % Open Climatology toolbar button
'Parent',hToolbar,...
'TooltipString','Climatology',...
'Separator', 'on', ...
'Tag', 'off', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'climicon.mat']),...
'HandleVisibility','callback', ...
'ClickedCallback', @ClimMenuCallback);
hBottlePushtool = uipushtool(... % Open toolbar button
'Parent',hToolbar,...
'TooltipString','Plot the Samples',...
'Separator', 'on', ...
'Tag', 'off', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'bottleicon.mat']),...
'HandleVisibility','callback', ...
'ClickedCallback', @BottleMenuCallback);
% Static text that displays the position, salinity and temperature
% ----------------------------------------------------------------
hInfoText = uicontrol(...
'Parent', hMainFig, ...
'Style', 'text', ...
'Fontsize', 12, ...
'Fontweight', 'bold', ...
'Visible','on',...
'Units', 'normalized',...
'String', 'Information sur la position du curseur', ...
'Position', [.05, .95, .9, .03]);
% Construct the plot axes
% -----------------------
hPlotAxes(1) = axes(... % the axes for plotting Salinity
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Visible', 'off', ...
'HandleVisibility','callback', ...
'Position',[.05, .6, .9, .32]);
hPlotAxes(2) = axes(... % the axes for plotting temperature
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Visible', 'off', ...
'HandleVisibility','callback', ...
'Position',[.05, .3, .9, .25]);
hPlotAxes(3) = axes(... % the axes for plotting ship velocity
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Visible', 'off', ...
'HandleVisibility','callback', ...
'Position',[.05, .05, .9, .2]);
% The map will be plot in a uipanel
hMapPanel = uipanel( ...
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Visible', 'off', ...
'Position',[0, 0, 1, .57]);
hPlotAxes(4) = axes(... % the axes for plotting ship track map
'Parent', hMapPanel, ...
'Units', 'normalized', ...
'Visible', 'off', ...
'Color', 'none', ...
'Tag', 'off', ...
'UserData', [], ...
'HandleVisibility','callback', ...
'Position',[.05, .05, .9, .9]);
% Construct the context menu for the Quality control codes
% -------------------------------------------------------
hQcCmenu = uicontextmenu(...
'Parent', hMainFig, ...
'HandleVisibility','callback' );
hQcCmenuNocontrol = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'No control',...
'ForegroundColor', 'k',...
'Callback', @QcNoControl);
hQcCmenuGood = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'Good',...
'ForegroundColor', 'b',...
'Callback', @QcGood);
hQcCmenuProbGood = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'Probably Good',...
'Callback', @QcProbGood,...
'ForegroundColor', 'g');
hQcCmenuProbBad = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'Probably bad',...
'ForegroundColor', 'm',...
'Callback', @QcProbBad);
hQcCmenuBad = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'Bad',...
'ForegroundColor', 'r',...
'Callback', @QcBad);
% Initialisation
% --------------
tsg_initialisation(hMainFig, hQcCmenu)
% Callbacks for tsgcqc_GUI
% ************************
%----------------------------------------------------------------------
function OpenMenuCallback(hObject, eventdata)
% Callback function run when the Open menu item is selected
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
% Make the filename
% ATTENTION : function OpenMenuCallback(hObject, eventdata)
% This has to be made general for UNIX and WINDOWS system
% ---------------------------------------------------------
[filename, pathname, filterIndex] = uigetfile( ...
{'*.txt';'*.xml';'*.nc';'*.btl'}, 'Pick a file');
error1 = -1;
error2 = -1;
if ~isequal(filename, 0)
% Read the data
% -------------
switch filterIndex
case 1
error1 = tsg_readTsgDataTxt( hMainFig, filename );
case 2
error1 = tsg_readTsgDataXML( hMainFig, filename );
case 3
error1 = tsg_readTsgDataNetCDF( hMainFig, filename );
case 4
error2 = tsg_readBucketData(hMainFig, filename );
otherwise
return;
end
% A TSG file has been read. Plot the data.
% ----------------------------------------
if error1 ~= -1
% A TSG file has been open and read
% ---------------------------------
set( hOpenMenu, 'Tag', 'on' );
% The callback to detect the mouse motion can be set to on
% --------------------------------------------------------
set( hMainFig, 'Tag', 'ButtonMotionOn');
% Make the Salinity, temperature and velocity plot
% ------------------------------------------------
tsg_plot_SalTempVel( hMainFig, hPlotAxes );
% Plot the Map with the ship trackline
% ------------------------------------
tsg_plotmap( hMainFig, hPlotAxes)
end
% Merge the different water sample (NetCdf or ASCII files) in
% a unique structure : 'sample'
% -----------------------------------------------------------
if error2 ~= -1
[sample] = tsg_mergesample( hMainFig );
% Save the 'sample' struct. as an application data
% ------------------------------------------------
setappdata( hMainFig, 'sample', sample );
end
end
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
end
%----------------------------------------------------------------------
function ZoomMenuCallback(hObject, eventdata)
% Callback function run when the Open menu item is selected
% Returns a zoom mode object for the figure handle
hZoom = zoom(hMainFig);
% Specifies whether this mode is currently enabled on the figure
zoomOnOff = get(hZoom, 'Enable' );
switch zoomOnOff
case 'on'
zoom off
zoomAdaptiveDateTicks('off');
case 'off'
pan off
set(hQCPushtool, 'Tag', 'off' );
zoom on
zoomAdaptiveDateTicks('on');
end
% zoomColor = get(hZoomPushtool,'CData');
% set(hZoomplusPushtool,'CData', zoomColor);
end
%----------------------------------------------------------------------
function PanMenuCallback(hObject, eventdata)
% Callback function run when the Open menu item is selected
% Returns a pan mode object for the figure handle
hPan = pan(hMainFig);
% Specifies whether this mode is currently enabled on the figure
panOnOff = get(hPan, 'Enable' );
switch panOnOff
case 'on'
pan off
panAdaptiveDateTicks('off');
case 'off'
zoom off
set(hQCPushtool, 'Tag', 'off' );
pan on
panAdaptiveDateTicks('on');
end
end
%----------------------------------------------------------------------
function QCMenuCallback(gcbo, eventdata,handles)
% Callback function run when the QC pushbutton is selected
% Desactivate the Zoom and Pan functions.
% ---------------------------------------
zoom off; pan off
panAdaptiveDateTicks('off');zoomAdaptiveDateTicks('off');
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Toggle the tag of the Qc pushbutton to 'on' or 'off'
% ----------------------------------------------------
switch get(hQCPushtool, 'Tag');
case 'off'
set(hQCPushtool, 'Tag', 'on' );
set(hPlotAxes(1),'UIContextMenu', hQcCmenu);
set( hMainFig, 'Pointer', 'crosshair');
case 'on'
set(hQCPushtool, 'Tag', 'off' );
set(hPlotAxes(1),'UIContextMenu', []);
set(hMainFig,'Pointer','arrow');
end
qualityCode = -1;
ind = [];
while strcmp( get(hQCPushtool, 'Tag'),'on')
k = waitforbuttonpress;
% If the QC pushbutton is pressed we quit the callback
% ----------------------------------------------------
if strcmp( get(hQCPushtool, 'Tag'),'off')
% Desactivate the context menu use to choose the
% Quality Codes
% ----------------------------------------------
set(hQcCmenu, 'Visible', 'off');
break
end
% Test if the right mouse button is clicked
% -----------------------------------------
if strcmp(get(hMainFig, 'SelectionType'), 'alt') && ~isempty(ind)
% Wait for a QC Context Menu choice : The user choose the
% quality code
% -------------------------------------------------------
uiwait
qualityCode = 1;
else
% Mouse motion callback desactivated when a selection is
% made. Otherwise there is a conflict with the map if it
% is activated
% -------------------------------------------------------
set( hMainFig, 'Tag', 'ButtonMotionOff');
% Selection of the data within the figure
% ---------------------------------------
point1 = get(gca,'CurrentPoint'); % button down detected
finalRect = rbbox; % return figure units
point2 = get(gca,'CurrentPoint'); % button up detected
point1 = point1(1,1:2); % extract x and y
point2 = point2(1,1:2);
p1 = min(point1,point2);
p2 = max(point1,point2); % calculate locations
ind = find(tsg.TIME > p1(1,1) & tsg.TIME < p2(1,1) & ...
tsg.PSAL > p1(1,2) & tsg.PSAL < p2(1,2));
% As soon as a modification took place the data should be
% saved
% -------------------------------------------------------
set( hSaveMenu, 'Tag', 'on' );
% Selection made : Mouse motion callback re-activated
% --------------------------------------------------
set( hMainFig, 'Tag', 'ButtonMotionOn');
end
% Plot the data with the color of the chosen quality Code.
% Is it the right place for this source code ????
% --------------------------------------------------------
if qualityCode ~= -1
quality = get( hQcCmenu, 'UserData');
tsg.PSAL_QC(ind) = quality.Code;
% Save the modifications
% ----------------------
setappdata( hMainFig, 'tsg_data', tsg);
axes(hPlotAxes(1));
hold on
color = ['.' quality.Color];
plot(tsg.TIME(ind), tsg.PSAL(ind), color );
hold off
end
end
end
%---------------------------------------------------------------------
function QcNoControl(hObject, eventdata)
% Callback function run when the QC context menu is selected
% Retrieve Default Quality Code and Color
% ---------------------------------------
qc = getappdata( hMainFig, 'qcColor');
quality.Code = qc.Code.NO_CONTROL;
quality.Color = qc.Color.NO_CONTROL;
set( hQcCmenu, 'UserData', quality );
% uiwait in the QCMenuCallback function
% -------------------------------------
uiresume
end
%---------------------------------------------------------------------
function QcGood(hObject, eventdata)
% Callback function run when the QC context menu is selected
% Retrieve named application data
% -------------------------------
qc = getappdata( hMainFig, 'qcColor');
quality.Code = qc.Code.GOOD;
quality.Color = qc.Color.GOOD;
set( hQcCmenu, 'UserData', quality );
% uiwait in the QCMenuCallback function
% -------------------------------------
uiresume
end
%---------------------------------------------------------------------
function QcProbGood(hObject, eventdata)
% Callback function run when the QC context menu is selected
% Retrieve named application data
% -------------------------------
qc = getappdata( hMainFig, 'qcColor');
quality.Code = qc.Code.PROBABLY_GOOD;
quality.Color = qc.Color.PROBABLY_GOOD;
set( hQcCmenu, 'UserData', quality );
% uiwait in the QCMenuCallback function
% -------------------------------------
uiresume
end
%---------------------------------------------------------------------
function QcProbBad(hObject, eventdata)
% Callback function run when the QC context menu is selected
% Retrieve named application data
% -------------------------------
qc = getappdata( hMainFig, 'qcColor');
quality.Code = qc.Code.PROBABLY_BAD;
quality.Color = qc.Color.PROBABLY_BAD;
set( hQcCmenu, 'UserData', quality );
% uiwait in the QCMenuCallback function
% -------------------------------------
uiresume
end
%---------------------------------------------------------------------
function QcBad(hObject, eventdata)
% Callback function run when the QC context menu is selected
% Retrieve named application data
% -------------------------------
qc = getappdata( hMainFig, 'qcColor');
quality.Code = qc.Code.BAD;
quality.Color = qc.Color.BAD;
set( hQcCmenu, 'UserData', quality );
% uiwait in the QCMenuCallback function
% -------------------------------------
uiresume
end
%---------------------------------------------------------------------
function MouseMotion(hObject, eventdata)
% Test if the callback can be activated
% -------------------------------------
if strcmp( get( hMainFig, 'Tag'), '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));
if x > tsg.TIME(1) && x < tsg.TIME(end)
indCursor = find( tsg.TIME > x);
% use sprintf with format instead strcat & num2str but flag
% - don't work with 0, eg %+07.4f
set( hInfoText, 'String',...
sprintf(['%s - Latitude = %s - Longitude = %s '...
' - Salinity = %07.4f - Temperature = %07.4f'],...
datestr(tsg.TIME(indCursor(1)),'dd/mm/yyyy HH:MM'),...
dd2dm(tsg.LATITUDE(indCursor(1)),0), ...
dd2dm(tsg.LONGITUDE(indCursor(1)),1), ...
tsg.PSAL(indCursor(1)), ...
tsg.TEMP_TSG(indCursor(1))...
));
% 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.LONGITUDE(indCursor(1)), tsg.LATITUDE(indCursor(1)),...
'Marker','o','MarkerSize',5, ...
'Color','r', 'MarkerFaceColor','r');
set(hMapPanel, 'UserData', hMarker)
else
delete(get(hMapPanel, 'UserData'));
hMarker = m_line( ...
tsg.LONGITUDE(indCursor(1)), tsg.LATITUDE(indCursor(1)),...
'Marker','o','MarkerSize',5, ...
'Color','r', 'MarkerFaceColor','r');
set(hMapPanel, 'UserData', hMarker);
end
end
end
end
end
end
%---------------------------------------------------------------------
function MapMenuCallback(hObject, eventdata)
% Callback function run when the Map tool bar item is selected
% Make the earth map visible or not
if strcmp( get(hMapPanel, 'Visible'), 'off' )
set(hMapPanel, 'Visible', 'on' );
else
set(hMapPanel, 'Visible', 'off' );
end
end
%---------------------------------------------------------------------
function BottleMenuCallback(hObject, eventdata)
% Callback function run when the Bottle tool bar item is selected
%
% Plot or Delete the buckets measurements on the Salinity graph
%
% Need to read them right now - but they will be soon in the NetCdf
% file
% Test if the sample Push button has been pressed
% -----------------------------------------------
if strcmp( get(hBottlePushtool, 'Tag'), 'off')
% Sample Push button - Tag set to 'on'
% ------------------------------------
set( hBottlePushtool, 'Tag', 'on' );
% Test if tsg and sample data have been loaded
% --------------------------------------------
if ~isempty( getappdata( hMainFig, 'tsg_data') ) && ...
~isempty( getappdata( hMainFig, 'sample') )
% Call the GUI for tsg correction
% -------------------------------
msgbox('The correction module has not been implemented');
%dev_tsgcor_GUI( hMainFig );
else
msgbox('TSG or Sample data not loaded in the program');
end
% hLine = get( hPlotAxes(1), 'UserData');
% Plot the samples if the TSG file has been read
% ----------------------------------------------
% if strcmp( get(hOpenMenu, 'Tag'), 'on' ) && ~isempty( sample )
% axes( hPlotAxes(1) );
% hLine.Sample = line( ...
% sample.TIME, sample.PSAL,...
% 'Linestyle', 'none', 'Marker','o','MarkerSize',5, ...
% 'Color','r', 'MarkerFaceColor','r');
% Store the handle of the bucketline
% ----------------------------------
% set( hPlotAxes(1), 'UserData', hLine );
% end
% else
set( hBottlePushtool, 'Tag', 'off' );
% The bucket pushbutton has been pressed again :
% Delete the bucket on figure
% ----------------------------------------------
% hLine = get( hPlotAxes(1), 'UserData');
% if ~isempty( hLine ) && ishandle( hLine.Sample )
% delete(hLine.Sample);
% end
end
end
%---------------------------------------------------------------------
function ClimMenuCallback(hObject, eventdata)
% Callback function run when the ClimMenu menu item is selected
%
% Plot or delete salinity climatology over Salinity plot
%
% Function to be written
% Test if the climatology Push button has been pressed
% ----------------------------------------------------
if strcmp( get(hClimPushtool, 'Tag'), 'off')
% Climatology push button - Tag set to 'on'
% -----------------------------------------
set( hClimPushtool, 'Tag', 'on' );
% Test if the TSG and bucket files have been read
% -----------------------------------------------
if strcmp( get(hOpenMenu, 'Tag'), 'on' )
% Get data
% -----------------------
tsg = getappdata( hMainFig, 'tsg_data' );
hLine1 = get( hPlotAxes(1), 'UserData');
hLine2 = get( hPlotAxes(2), 'UserData');
% Read Climatology
% ----------------
if ~isfield( tsg, 'LEVITUS')
lev = read_file_woa01( 'woa01an.nc' );
if ~isstruct(lev)
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 = lev;
end
setappdata( hMainFig, 'tsg_data', tsg );
end
% round positive latitude and Longitude toward zero
% -------------------------------------------------
ind = find(tsg.LATITUDE > 0);
lat(ind) = fix(tsg.LATITUDE(ind)) + 0.5;
ind = find(tsg.LONGITUDE > 0);
lon(ind) = fix(tsg.LONGITUDE(ind)) + 0.5;
% rounds negative latitude and Longitudeto the nearest lowest integers
% ---------------------------------------------------------------------
ind = find(tsg.LATITUDE <= 0);
lat(ind) = floor(tsg.LATITUDE(ind)) + 0.5;
ind = find(tsg.LONGITUDE <= 0);
lon(ind) = floor(tsg.LONGITUDE(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.TIME( ind );
temp = tsg.TEMP_TSG( ind );
psal = tsg.PSAL( 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));
for i=1:length(ind)
ilat = find(tsg.LEVITUS.WOA01_LATX == lat2(i));
ilon = find(tsg.LEVITUS.WOA01_LONX == lon2(i));
mean_temp(i) = tsg.LEVITUS.WOA01_MEAN_TEMP(ilat,ilon,1);
mean_psal(i) = tsg.LEVITUS.WOA01_MEAN_PSAL(ilat,ilon,1);
std_temp(i) = tsg.LEVITUS.WOA01_STD_TEMP(ilat,ilon,1);
std_psal(i) = tsg.LEVITUS.WOA01_STD_PSAL(ilat,ilon,1);
end
% Plot mean salinity climatology
hLine1.meanClim = line( ...
time, mean_psal,'Linestyle', '-', 'Color','k');
% Plot 2 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 );
end
else
set( hClimPushtool, 'Tag', 'off' );
% The bucket pushbutton has been pressed again :
% Delete the bucket on figure
% ----------------------------------------------
hLine1 = get( hPlotAxes(1), 'UserData');
hLine2 = get( hPlotAxes(2), 'UserData');
% bug......
try
delete(hLine1.stdClimMinus);
delete(hLine1.stdClimPlus);
delete(hLine1.meanClim);
delete(hLine2.stdClimMinus);
delete(hLine2.stdClimPlus);
delete(hLine2.meanClim);
catch
end
end
end
% -----------------------------------------------------------------
function SaveMenuCallback(hObject, eventdata)
% Callback function run when the Save menu item is selected
[fileName, pathName, filterIndex] = uiputfile('*.txt', ...
'Save file name');
fileName = [pathName fileName];
error = tsg_writeTsgData( hMainFig, fileName );
if ~error
%
end
end
% -----------------------------------------------------------------
function QuitMenuCallback(hObject, eventdata)
% Callback function run when the Quit menu item is selected
% If the data have been modified and not save, the program
% propose to save the data
% --------------------------------------------------------
if strcmp( get( hSaveMenu, 'Tag' ), '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
end
end
% ----------------------------------------------------------------
function QuitProgram(hObject, eventdata)
delete(hMainFig);
% reset Matlab search path to default
rmpath( [DEFAULT_PATH_FILE filesep 'tsg_util'] );
rmpath( [DEFAULT_PATH_FILE filesep 'tsg_data'] );
rehash;
end
end