function tsgcor_GUI( hMainFig ) % tsgcor_GUI % % GUI for correction of TSG data by comparison to samples % this GUI is a children of tsgqc_GUI % % %% 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.05; guiLimits(3) = guiLimits(3) - 0.1; guiLimits(4) = guiLimits(4) - 0.2; % Create and then hide the GUI as it is being constructed. % -------------------------------------------------------- hChild1Fig = figure(... 'Name', 'TSG Correction', ... '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', hChild1Fig,... 'HandleVisibility','callback',... 'Label', 'File'); 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',hChild1Fig, ... '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); 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', hChild1Fig, ... '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', hChild1Fig, ... 'Units', 'normalized', ... 'Visible', 'off', ... 'HandleVisibility','callback', ... 'Position',[.25, .6, .7, .32]); hPlotAxes(2) = axes(... % the axes for plotting temperature 'Parent', hChild1Fig, ... 'Units', 'normalized', ... 'Visible', 'off', ... 'HandleVisibility','callback', ... 'Position',[.25, .3, .7, .25]); hPlotAxes(3) = axes(... % the axes for plotting ship velocity 'Parent', hChild1Fig, ... 'Units', 'normalized', ... 'Visible', 'off', ... 'HandleVisibility','callback', ... 'Position',[.25, .05, .7, .2]); % Choose the date limits for the correction % -------------------------------------------------- % Create the uipanel hpDateLimit = uipanel( ... 'Parent', hChild1Fig, ... 'Title', 'Date Limits', ... 'Units', 'normalized', ... 'FontSize', 11, ... 'Fontweight', 'bold', ... 'BackgroundColor', 'white',... 'Position',[.01 .75 .2 .19]); htDateMin = uicontrol( ... 'Parent', hpDateLimit, ... 'Style', 'Text', ... 'String', 'Minimum (mm/dd/yyyy)', ... 'HorizontalAlignment', 'left', ... 'Units', 'normalized', ... 'backgroundcolor', 'white', ... 'FontSize', 10, ... 'Position',[.05 .8 .9 .15]); hetDateMin = uicontrol( ... 'Parent', hpDateLimit, ... 'Style', 'edit', ... 'Units', 'normalized', ... 'FontSize', 10, ... 'Position',[.05 .6 .9 .18]); htDateMax = uicontrol( ... 'Parent', hpDateLimit, ... 'Style', 'Text', ... 'String', 'Maximum (mm/dd/yyyy)', ... 'HorizontalAlignment', 'left', ... 'Units', 'normalized', ... 'backgroundcolor', 'white', ... 'FontSize', 10, ... 'Position',[.05 .3 .9 .15]); hetDateMax = uicontrol( ... 'Parent', hpDateLimit, ... 'Style', 'edit', ... 'Units', 'normalized', ... 'FontSize', 10, ... 'Position',[.05 .1 .9 .18]); % Choose the correction method % -------------------------------------------------- % Create the button group hbgMethod = uibuttongroup( ... 'Parent',hChild1Fig, ... 'Title','Correction Method', ... 'Units', 'normalized', ... 'FontSize',11, ... 'Fontweight', 'bold', ... 'BackgroundColor','white',... 'Position',[.01 .6 .2 .14]); % Create 2 radio buttons in the button group hrbLinear = uicontrol( ... 'Style','pushbutton', ... 'Parent',hbgMethod, ... 'Units', 'normalized', ... 'String','Linear adjustment',... 'pos',[.05 .55 .9 .4], ... 'HandleVisibility','callback', ... 'Callback', @CorLinearCallback); hrbMedian = uicontrol( ... 'Style','pushbutton', ... 'Parent',hbgMethod, ... 'Units', 'normalized', ... 'String','Running median filter',... 'pos',[.05 .05 .9 .4],... 'HandleVisibility','callback', ... 'Callback', @CorMedianCallback); % Initialize some button group properties set(hbgMethod,'SelectionChangeFcn',@selcbk); set(hbgMethod,'SelectedObject',[]); % No selection set(hbgMethod,'Visible','on'); % Construct the context menu to delete samples % -------------------------------------------- hSampleCmenu = uicontextmenu(... 'Parent', hChild1Fig, ... 'HandleVisibility','callback' ); hSampleCmenuDel = uimenu(... 'Parent', hSampleCmenu,... 'HandleVisibility','off', ... 'Label', 'Delete',... 'ForegroundColor', 'k',... 'Callback', @QcDel); hSampleCmenuNoDel = uimenu(... 'Parent', hSampleCmenu,... 'HandleVisibility','off', ... 'Label', 'Keep',... 'ForegroundColor', 'b',... 'Callback', @QcKeep); % Pointer set to watch during reading and plotting % ------------------------------------------------ set( hChild1Fig, 'Pointer', 'watch' ); % Get the data useful to the correction GUI % ----------------------------------------- tsg = getappdata( hMainFig, 'tsg_data' ); sample = getappdata( hMainFig, 'sample' ); cst = getappdata( hMainFig, 'constante'); dateMin = datestr(tsg.TIME(1), 23); dateMax = datestr(tsg.TIME(end), 23); set( hetDateMin, 'String', dateMin); set( hetDateMax, 'String', dateMax); % dt between 2 tsg measurements TSG_SAMPLING_TIME = tsg.TIME(2) - tsg.TIME(1); % Running average of TSG time series over TSG_DT_SMOOTH hour. [psal_smooth, nval] = ... dev_moveaverage(tsg.TIME, tsg.PSAL, cst.TSG_DT_SMOOTH, cst.TSG_STDMAX); % Compute the sample-TSG differences sample = dev_diffTsgSample(tsg, psal_smooth, sample, TSG_SAMPLING_TIME); % Update application data sample setappdata( hMainFig, 'sample', sample ); % Trac� % ----- tsg_plot_SalTsgSample( hMainFig, hPlotAxes ); % Pointer reset to arrow % ---------------------- set( hChild1Fig, 'Pointer', 'arrow' ); % The callback to detect the mouse motion can be set to on % -------------------------------------------------------- set( hChild1Fig, 'Tag', 'ButtonMotionOn'); % Callbacks for tsgcqc_GUI % ************************ %---------------------------------------------------------------------- function ZoomMenuCallback(hObject, eventdata) % Callback function run when the ... % Returns a zoom mode object for the figure handle % ------------------------------------------------ hZoom = zoom(hChild1Fig); % 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 end %---------------------------------------------------------------------- function PanMenuCallback(hObject, eventdata) % Callback function run when the .... % Returns a pan mode object for the figure handle % ----------------------------------------------- hPan = pan(hChild1Fig); % 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 QcDel(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 QcKeep(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 MouseMotion(hObject, eventdata) % Test if the callback can be activated % ------------------------------------- if strcmp( get( hChild1Fig, '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))... )); end end 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' ); % Retrieve named application data % ------------------------------- % sample = getappdata( hMainFig, 'sample'); % 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 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 CorLinearCallback(hObject, eventdata) % Callback function run when msgbox('Method not yet implemented', 'modal' ); end % ----------------------------------------------------------------- function CorMedianCallback(hObject, eventdata) % Callback function run when msgbox('Method not yet implemented', 'modal' ); % Get the time limits for the correction A TESTER % -------------------------------------- %dateMin = get( hetDateMin, 'String'); %dateMax = get( hetDateMax, 'String'); % Correction % ---------- % tsg = dev_corMethod1(tsg, sample, dateMin, dateMax, cst.COR_TIME_WINDOWS); % Update application data 'tsg' % ---------------------------- %tsg = getappdata( hMainFig, 'tsg_data' ); 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(hChild1Fig, 'Name') '?'],... ['Quit ' get(hChild1Fig, 'Name') '?'],... 'Yes', 'No', 'Yes'); if strcmp(selection, 'No') return; else QuitProgram; end end end % ---------------------------------------------------------------- function QuitProgram(hObject, eventdata) delete(hChild1Fig); end end