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],... DEFAULT_PATH_FILE,[filesep 'tsg_io' 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', ... 'UserData', 'ButtonMotionOff', ... 'WindowButtonMotionFcn', @MouseMotion, ... 'CloseRequestFcn', @QuitProgram,... 'HandleVisibility','callback',... 'Visible','on',... 'Units', 'normalized',... 'Position',guiLimits, ... 'Color', get( 0, 'DefaultUIControlBackgroundColor' )); %% Construct the Menu % ----------------- hFileMenu = uimenu(... 'Parent', hMainFig,... 'HandleVisibility','callback',... 'Label', 'File'); hOpenMenu = uimenu(... 'Parent', hFileMenu,... 'UserData', 'off', ... 'Label','Open',... 'Accelerator','O',... 'HandleVisibility','callback',... 'Callback', @OpenMenuCallback); hSaveMenu = uimenu(... 'Parent', hFileMenu,... 'Label','Save',... 'Accelerator','S',... 'UserData', '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'); 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); hZoomPushtool = uipushtool(... % Open Zoom toolbar button 'Parent',hToolbar,... 'Separator', 'on', ... 'TooltipString','Zoom',... 'CData', iconRead(fullfile(matlabroot, ... '/toolbox/matlab/icons/zoom.mat')),... 'HandleVisibility','callback', ... 'Tag','PUSHTOOL_ZOOM',... 'Enable', 'off',... 'ClickedCallback', @ZoomMenuCallback); hPanPushtool = uipushtool(... % Open Pan toolbar button 'Parent',hToolbar,... 'TooltipString','Pan',... 'CData',iconRead(fullfile(matlabroot, ... '/toolbox/matlab/icons/pan.mat')),... 'HandleVisibility','callback', ... 'Tag','PUSHTOOL_PAN',... 'Enable', 'off',... 'ClickedCallback', @PanMenuCallback); hQCToggletool = uitoggletool(... % Open QC toolbar button 'Parent',hToolbar,... 'TooltipString','Validation codes',... 'Separator', 'on', ... 'CData',iconRead(... [DEFAULT_PATH_FILE 'tsg_icon' filesep 'qcicon.mat']),... 'HandleVisibility','callback', ... 'Tag','PUSHTOOL_QC',... 'UserData', 'off',... 'Enable', 'off',... 'OffCallback', @QC_OffMenuCallback,... 'ONCallback', @QC_OnMenuCallback); hMapToggletool = uitoggletool(... % Open Map toolbar button 'Parent',hToolbar,... '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',... 'OffCallback', @Map_OffMenuCallback,... 'ONCallback', @Map_OnMenuCallback); hClimToggletool = uitoggletool(... % Open Climatology toolbar button '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',... 'OffCallback', @Clim_OffMenuCallback,... 'ONCallback', @Clim_OnMenuCallback); hBottlePushtool = uipushtool(... % Open toolbar button 'Parent',hToolbar,... 'TooltipString','Plot the Samples',... 'Separator', 'on', ... 'CData',iconRead(... [DEFAULT_PATH_FILE 'tsg_icon' filesep 'bottleicon.mat']),... 'HandleVisibility','callback', ... 'Tag','PUSHTOOL_BOTTLE',... 'Enable', 'off',... 'ClickedCallback', @BottleMenuCallback); 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 % --------------------------------------------------- % Dynamic text area that displays the date % ---------------------------------------- uicontrol(... 'Parent', hMainFig, ... 'Units', 'normalized', ... 'Style', 'Text', ... 'Fontsize', 11, ... 'Fontweight', 'bold', ... 'HorizontalAlignment', 'left', ... 'Position',[.02, .95, .03, .03], ... 'String', 'File:'); hInfoFileText = uicontrol(... 'Parent', hMainFig, ... 'Style', 'text', ... 'Fontsize', 11, ... 'Visible','on',... 'Units', 'normalized',... 'HorizontalAlignment', 'left', ... 'String', 'No file loaded', ... 'Position', [.05, .95, .10, .03]); % Text area that displays the date % -------------------------------- uicontrol(... 'Parent', hMainFig, ... 'Units', 'normalized', ... 'Style', 'Text', ... 'Fontsize', 11, ... 'Fontweight', 'bold', ... 'HorizontalAlignment', 'left', ... 'Position',[.17, .95, .03, .03], ... 'String', 'Date:'); hInfoDateText = uicontrol(... 'Parent', hMainFig, ... 'Style', 'text', ... 'Fontsize', 11, ... 'Visible','on',... 'Units', 'normalized',... 'HorizontalAlignment', 'left', ... 'String', 'N/A', ... 'Position', [.21, .95, .11, .03]); % Text area that displays the latitude % ------------------------------------ uicontrol(... 'Parent', hMainFig, ... 'Units', 'normalized', ... 'Style', 'Text', ... 'Fontsize', 11, ... 'Fontweight', 'bold', ... 'HorizontalAlignment', 'left', ... 'Position',[.35, .95, .05, .03], ... 'String', 'Latitude:'); hInfoLatText = uicontrol(... 'Parent', hMainFig, ... 'Style', 'text', ... 'Fontsize', 11, ... 'Visible','on',... 'Units', 'normalized',... 'HorizontalAlignment', 'left', ... 'String', 'N/A', ... 'Position', [.41, .95, .07, .03]); % Text area that displays the longitude % ------------------------------------- uicontrol(... 'Parent', hMainFig, ... 'Units', 'normalized', ... 'Style', 'Text', ... 'Fontsize', 11, ... 'Fontweight', 'bold', ... 'HorizontalAlignment', 'left', ... 'Position',[.50, .95, .06, .03], ... 'String', 'Longitude:'); hInfoLongText = uicontrol(... 'Parent', hMainFig, ... 'Style', 'text', ... 'Fontsize', 11, ... 'Visible','on',... 'Units', 'normalized',... 'HorizontalAlignment', 'left', ... 'String', 'N/A', ... 'Position', [.57, .95, .07, .03]); % Text area that display salinity and temperature % ----------------------------------------------- uicontrol(... 'Parent', hMainFig, ... 'Units', 'normalized', ... 'Style', 'Text', ... 'Fontsize', 11, ... 'Fontweight', 'bold', ... 'HorizontalAlignment', 'left', ... 'Position',[.65, .95, .03, .03], ... 'String', 'SSPS:'); hInfoSSPSText = uicontrol(... 'Parent', hMainFig, ... 'Style', 'text', ... 'Fontsize', 11, ... 'Visible','on',... 'Units', 'normalized',... 'HorizontalAlignment', 'left', ... 'String', 'N/A', ... 'Position', [.69, .95, .05, .03]); uicontrol(... 'Parent', hMainFig, ... 'Units', 'normalized', ... 'Style', 'Text', ... 'Fontsize', 11, ... 'Fontweight', 'bold', ... 'HorizontalAlignment', 'left', ... 'Position',[.75, .95, .03, .03], ... 'String', 'SSJT:'); hInfoSSJTText = uicontrol(... 'Parent', hMainFig, ... 'Style', 'text', ... 'Fontsize', 11, ... 'Visible','on',... 'Units', 'normalized',... 'HorizontalAlignment', 'left', ... 'String', 'N/A', ... 'Position', [.79, .95, .05, .03]); uicontrol(... 'Parent', hMainFig, ... 'Units', 'normalized', ... 'Style', 'Text', ... 'Fontsize', 11, ... 'Fontweight', 'bold', ... 'HorizontalAlignment', 'left', ... 'Position',[.85, .95, .03, .03], ... 'String', 'SSTP:'); hInfoSSTPText = uicontrol(... 'Parent', hMainFig, ... 'Style', 'text', ... 'Fontsize', 11, ... 'Visible','on',... 'Units', 'normalized',... 'HorizontalAlignment', 'left', ... 'String', 'N/A', ... 'Position', [.89, .95, .05, .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]); % The second and third axes will be plot in a uipanel hPlotsPanel = uipanel( ... 'Parent', hMainFig, ... 'Units', 'normalized', ... 'BorderType', 'none',... 'Visible', 'on', ... 'Position',[0, 0, 1, .57]); hPlotAxes(2) = axes(... % the axes for plotting temperature 'Parent', hPlotsPanel, ... 'Units', 'normalized', ... 'Visible', 'off', ... 'HandleVisibility','callback', ... 'Position',[.05, .48, .9, .47]); hPlotAxes(3) = axes(... % the axes for plotting ship velocity 'Parent', hPlotsPanel, ... 'Units', 'normalized', ... 'Visible', 'off', ... 'HandleVisibility','callback', ... 'Position',[.05, .06, .9, .32]); % 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', ... 'UserData', 'off', ... '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', @Qc); hQcCmenuGood = uimenu(... 'Parent', hQcCmenu,... 'HandleVisibility','off', ... 'Label', 'Good',... 'ForegroundColor', 'b',... 'Callback', @Qc); hQcCmenuProbGood = uimenu(... 'Parent', hQcCmenu,... 'HandleVisibility','off', ... 'Label', 'Probably Good',... 'Callback', @Qc,... 'ForegroundColor', 'g'); hQcCmenuProbBad = uimenu(... 'Parent', hQcCmenu,... 'HandleVisibility','off', ... 'Label', 'Probably bad',... 'ForegroundColor', 'm',... 'Callback', @Qc); hQcCmenuBad = uimenu(... 'Parent', hQcCmenu,... 'HandleVisibility','off', ... 'Label', 'Bad',... 'ForegroundColor', 'r',... 'Callback', @Qc); % Initialisation % -------------- tsg_initialisation(hMainFig, hQcCmenu) % ------------------------- % Callbacks for tsgcqc_GUI % ------------------------ %---------------------------------------------------------------------- % Callback function run when the Open menu item is selected %---------------------------------------------------------------------- function OpenMenuCallback(hObject, eventdata) % 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';'*.lbv';'*.btl'}, 'Pick a file'); error1 = -1; error2 = -1; if ~isequal(fileName, 0) % Read the data % ------------- switch filterIndex case 1 error1 = readTsgDataTxt( hMainFig, fileName ); case 2 error1 = readTsgDataXML( hMainFig, fileName ); case 3 error1 = readTsgDataNetCDF( hMainFig, fileName ); %# a modifier if error1 == 1 error2 = error1; end case 4 error1 = readTsgDataLabview( hMainFig, fileName ); case 5 error2 = 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, 'UserData', 'on' ); % enable menu pushtool % -------------------- hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_'); set(hdl_pushtool, 'Enable', 'on'); % update the filename display % --------------------------- set( hInfoFileText, 'String', fileName); % update some fields in tsg structure % ----------------------------------- updateTsgStruct(hMainFig); % The callback to detect the mouse motion can be set to on % -------------------------------------------------------- set( hMainFig, 'UserData', 'ButtonMotionOn'); % Make the Salinity, temperature and velocity plot % ------------------------------------------------ plot_SalTempVel( hMainFig, hPlotAxes ); % Plot the Map with the ship trackline % ------------------------------------ plotmap( hMainFig, hPlotAxes) end end % 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 %donn�es validee %@[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 % ------------------------------------------------------- if error2 ~= -1 plot_SalTsgSample( hMainFig, hPlotAxes ); 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 % Desactivate the QC toggle button % -------------------------------- set(hQCPushtool, 'state', '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 % Desactivate the QC toggle button % -------------------------------- set(hQCPushtool, 'state', 'off' ); pan on panAdaptiveDateTicks('on'); end end %---------------------------------------------------------------------- %---------------------------------------------------------------------- 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'); end %---------------------------------------------------------------------- %---------------------------------------------------------------------- function QC_OnMenuCallback(gcbo, eventdata) % Desactivate the Zoom and Pan functions. % --------------------------------------- zoom off; pan off panAdaptiveDateTicks('off');zoomAdaptiveDateTicks('off'); % Activate right clic context menu on first axes (salinity) % --------------------------------------------------------- set(hPlotAxes(1),'UIContextMenu', hQcCmenu); % Activate clic mouse menu on first axes (salinity) % ------------------------------------------------- set(hPlotAxes(1),'ButtonDownFcn', @QC_SelectCallback); % Try to make visible the context menu a the top of % the figure. DOESN'T WORK %oldUnits = get(hMainFig,'units' ); %set(hMainFig,'units', 'pixels'); %figPos = get(hMainFig,'Position'); %set(hQcCmenu, 'Visible', 'on', 'Position', [figPos(1) figPos(4)]); %set(hMainFig,'units', oldUnits); % change cursor to crosshai aspect % -------------------------------- set( hMainFig, 'Pointer', 'crosshair'); % ------------------------------------------------------------- % nested function on mouse clic % ------------------------------------------------------------- function QC_SelectCallback(gcbo, eventdata) % disable ButtonMotion on main fig during select % ---------------------------------------------- set( hMainFig, 'WindowButtonMotionFcn', []); % Retrieve named application data % ------------------------------- tsg = getappdata( hMainFig, 'tsg_data'); % Selection of the data within the figure % --------------------------------------- point1 = get(gca,'CurrentPoint'); % button down detected finalRect = rbbox; % return figure units point2 = get(gca,'CurrentPoint'); % button up detected point1 = point1(1,1:2); % extract x and y point2 = point2(1,1:2); p1 = min(point1,point2); p2 = max(point1,point2); % calculate locations % 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)); tsg.SSPS_QC(ind) = tsg.qc.Code.ACTIVE; % set current axes and plot % ------------------------- axes(hPlotAxes(1)); hold on color = ['.' tsg.qc.Color.ACTIVE]; 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); % disable ButtonMotion on main fig during select % ---------------------------------------------- set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion); end end % %---------------------------------------------------------------------- % function QCMenuCallback_old(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'); % % % Toggle the tag of the Qc pushbutton to 'on' or 'off' % % ---------------------------------------------------- % switch get(hQCToggletool, 'UserData'); % case 'off' % set(hQCToggletool, 'UserData', 'on' ); % set(hPlotAxes(1),'UIContextMenu', hQcCmenu); % set( hMainFig, 'Pointer', 'crosshair'); % case 'on' % set(hQCToggletool, 'UserData', 'off' ); % set(hPlotAxes(1),'UIContextMenu', []); % set(hMainFig,'Pointer','arrow'); % end % % qualityCode = -1; % ind = []; % while strcmp( get(hQCToggletool, 'UserData'),'on') % % k = waitforbuttonpress; % % % If the QC pushbutton is pressed we quit the callback % % ---------------------------------------------------- % if strcmp( get(hQCToggletool, 'UserData'),'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, 'UserData', '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 % % % Retrieve named application data % % ------------------------------- % tsg = getappdata( hMainFig, 'tsg_data'); % % ind = find(tsg.DAYD > p1(1,1) & tsg.DAYD < p2(1,1) & ... % tsg.SSPS > p1(1,2) & tsg.SSPS < p2(1,2)); % % % As soon as a modification took place the data should be saved % % ------------------------------------------------------------- % set( hSaveMenu, 'UserData', 'on' ); % % % Selection made : Mouse motion callback re-activated % % -------------------------------------------------- % set( hMainFig, 'UserData', '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 % % % Retrieve named application data - Code could have been changed % % -------------------------------------------------------------- % tsg = getappdata( hMainFig, 'tsg_data'); % % tsg.SSPS_QC(ind) = tsg.qc.Code.ACTIVE; % % % Save the modifications % % ---------------------- % setappdata( hMainFig, 'tsg_data', tsg); % % axes(hPlotAxes(1)); % hold on % color = ['.' tsg.qc.Color.ACTIVE]; % plot(tsg.DAYD(ind), tsg.SSPS(ind), color ); % hold off % % end % end % end %---------------------------------------------------------------------- % Callback function run when the QC context menu is selected %--------------------------------------------------------------------- function Qc(hObject, eventdata) % Retrieve Default Quality Code and Color % --------------------------------------- tsg = getappdata( hMainFig, 'tsg_data'); switch hObject case hQcCmenuNocontrol tsg.qc.Code.ACTIVE = tsg.qc.Code.NO_CONTROL; tsg.qc.Color.ACTIVE = tsg.qc.Color.NO_CONTROL; case hQcCmenuGood tsg.qc.Code.ACTIVE = tsg.qc.Code.GOOD; tsg.qc.Color.ACTIVE = tsg.qc.Color.GOOD; case hQcCmenuProbGood tsg.qc.Code.ACTIVE = tsg.qc.Code.PROBABLY_GOOD; tsg.qc.Color.ACTIVE = tsg.qc.Color.PROBABLY_GOOD; case hQcCmenuProbBad tsg.qc.Code.ACTIVE = tsg.qc.Code.PROBABLY_BAD; tsg.qc.Color.ACTIVE = tsg.qc.Color.PROBABLY_BAD; case hQcCmenuBad tsg.qc.Code.ACTIVE = tsg.qc.Code.BAD; tsg.qc.Color.ACTIVE = tsg.qc.Color.BAD; end setappdata( hMainFig, 'tsg_data', tsg ); % uiwait in the QCMenuCallback function % ------------------------------------- %uiresume end %--------------------------------------------------------------------- %--------------------------------------------------------------------- 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)); % Dynamically display data in uicontrol % ------------------------------------- if x > tsg.DAYD(1) && x < tsg.DAYD(end) indCursor = find( tsg.DAYD > x); set( hInfoDateText, 'String',... datestr(tsg.DAYD(indCursor(1)),'dd/mm/yyyy HH:MM')); set( hInfoLatText, 'String', dd2dm(tsg.LATX(indCursor(1)),0)); set( hInfoLongText, 'String', dd2dm(tsg.LONX(indCursor(1)),1)); set( hInfoSSPSText, 'String', tsg.SSPS(indCursor(1))); set( hInfoSSJTText, 'String', tsg.SSJT(indCursor(1))); if ~isempty(tsg.SSTP) set( hInfoSSTPText, 'String', tsg.SSTP(indCursor(1))); end % Plot the position on the map if this one is active % -------------------------------------------------- if strcmp( get(hMapPanel, 'Visible'), 'on') % Select the map axes % ------------------- axes( hPlotAxes(4)); if isempty( get(hMapPanel, 'UserData')) hMarker = m_line( ... tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),... 'Marker','o','MarkerSize',5, ... 'Color','r', 'MarkerFaceColor','r'); set(hMapPanel, 'UserData', hMarker) else delete(get(hMapPanel, 'UserData')); hMarker = m_line( ... tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),... 'Marker','o','MarkerSize',5, ... 'Color','r', 'MarkerFaceColor','r'); set(hMapPanel, 'UserData', hMarker); end end end end end end %--------------------------------------------------------------------- % Callback function run when the Map tool bar item is unselected %--------------------------------------------------------------------- function Map_OffMenuCallback(hObject, eventdata) % Make the earth map invisible % ---------------------------- set(hMapPanel, 'Visible', 'off' ); end %--------------------------------------------------------------------- % Callback function run when the Map tool bar item is selected %--------------------------------------------------------------------- function Map_OnMenuCallback(hObject, eventdata) % Make the earth map visible % -------------------------- set(hMapPanel, 'Visible', 'on' ); end %--------------------------------------------------------------------- %--------------------------------------------------------------------- function BottleMenuCallback(hObject, eventdata) % Callback function run when the Bottle tool bar item is selected % Get the tsg data structure % -------------------------- tsg = getappdata( hMainFig, 'tsg_data'); % Test if tsg and sample data have been loaded % -------------------------------------------- if ~isempty( tsg.SSPS_WS ) || ~isempty( tsg.SSPS_EXT ) % 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 % Vieux bout de code pour le trace et la suppression des bouteilles % 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, 'UserData'), 'off') % Sample Push button - UserData set to 'on' % ------------------------------------ % set( hBottlePushtool, 'UserData', 'on' ); % Plot the samples if the TSG file has been read % ---------------------------------------------- % if strcmp( get(hOpenMenu, 'UserData'), '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, 'UserData', '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 %------------------------------------------------------------------------ % Callback function run when the Levitus climatology toolbar is unselected %------------------------------------------------------------------------ function Clim_OffMenuCallback(hObject, eventdata) % Get line handles % ---------------------------------------------- hLine1 = get( hPlotAxes(1), 'UserData'); hLine2 = get( hPlotAxes(2), 'UserData'); % Delete climatology linesthe on axes % ----------------------------------- try delete(hLine1.stdClimMinus); delete(hLine1.stdClimPlus); delete(hLine1.meanClim); delete(hLine2.stdClimMinus); delete(hLine2.stdClimPlus); delete(hLine2.meanClim); catch end end %------------------------------------------------------------------------ % Callback function run when the Levitus climatology toolbar is unselected %------------------------------------------------------------------------ function Clim_OnMenuCallback(hObject, eventdata) % Test if the TSG and bucket files have been read % ----------------------------------------------- if strcmp( get(hOpenMenu, 'UserData'), 'on' ) % Get data % ----------------------- tsg = getappdata( hMainFig, 'tsg_data' ); % Get line handles % ---------------- hLine1 = get( hPlotAxes(1), 'UserData'); hLine2 = get( hPlotAxes(2), 'UserData'); % 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)); for i=1:length(ind) ilat = find(tsg.levitus.data.WOA01_LATX == lat2(i)); ilon = find(tsg.levitus.data.WOA01_LONX == lon2(i)); mean_temp(i) = tsg.levitus.data.WOA01_MEAN_TEMP(ilat,ilon,1); mean_psal(i) = tsg.levitus.data.WOA01_MEAN_PSAL(ilat,ilon,1); std_temp(i) = tsg.levitus.data.WOA01_STD_TEMP(ilat,ilon,1); std_psal(i) = tsg.levitus.data.WOA01_STD_PSAL(ilat,ilon,1); end % 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 ); end end % ------------------------------------------------------------------- % Callback function run when the headerForm tool bar item is selected % ------------------------------------------------------------------- function HeaderMenuCallback(hObject, eventdata) % call header form function % ------------------------- headerForm(hMainFig); end % ------------------------------------------------------------------- % Callback function run when the Save menu item is selected % ------------------------------------------------------------------- function SaveMenuCallback(hObject, eventdata) % Retrieve named application data % ------------------------------- tsg = getappdata( hMainFig, 'tsg_data'); % get fileName without extension in cell % -------------------------------------- file = textscan( tsg.file.name,'%s','delimiter','.'); % fill or append header form % ------------------------- error = headerForm(hMainFig); % if user press continue button, ask for netcdf file % ------------------------------------------------ if error ~= -1 [fileName, pathName, filterIndex] = uiputfile('*.nc', ... 'Save file name', [file{1}{1} '.nc']); % 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 % ----------------- error = writeTSGDataNetCDF( hMainFig, [pathName fileName] ); % Pointer reset to arrow % ---------------------- set( hMainFig, 'Pointer', 'arrow' ); % Check for a writing pb to NetCDF % must to be rewriting % -------------------------------- if error == -1 warning(['NetCDF writing error:' [pathName fileName]]); return; end % update the display % ------------------ set( hInfoFileText, 'String', fileName); % enable Quality Control mode % --------------------------- hdl_pushtool = findobj('Tag', 'QC'); set(hdl_pushtool, 'Enable', 'on'); end end % ----------------------------------------------------------------- % Callback function run when the Quit menu item is selected % ----------------------------------------------------------------- function QuitMenuCallback(hObject, eventdata) % If the data have been modified and not save, the program % ask to save the data % -------------------------------------------------------- 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 end end % ----------------------------------------------------------------- % call from: % QuitMenuCallback % callback 'CloseRequestFcn', @QuitProgram % ----------------------------------------------------------------- function QuitProgram(hObject, eventdata) % close the main windows % ---------------------- delete(hMainFig); % reset Matlab search path to default % ----------------------------------- rmpath( [DEFAULT_PATH_FILE filesep 'tsg_util'] ); rmpath( [DEFAULT_PATH_FILE filesep 'tsg_data'] ); rmpath( [DEFAULT_PATH_FILE filesep 'tsg_io'] ); rehash; end end