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