From a02563325fb11d3ee07862cf678768f3b3ba2e52 Mon Sep 17 00:00:00 2001 From: Yves Gouriou <yves.gouriou@ird.fr> Date: Tue, 4 Dec 2007 15:56:25 +0000 Subject: [PATCH] =?UTF-8?q?dev=5Ftsgcor=20renomm=C3=A9=20tsgcor=5FGUI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tsgcor_GUI.m | 643 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 643 insertions(+) create mode 100644 tsgcor_GUI.m diff --git a/tsgcor_GUI.m b/tsgcor_GUI.m new file mode 100644 index 0000000..690a379 --- /dev/null +++ b/tsgcor_GUI.m @@ -0,0 +1,643 @@ +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','Radio', ... + 'Parent',hbgMethod, ... + 'Units', 'normalized', ... + 'String','Linear adjustment',... + 'pos',[.05 .55 .9 .4], ... + 'HandleVisibility','off'); + hrbMedian = uicontrol( ... + 'Style','Radio', ... + 'Parent',hbgMethod, ... + 'Units', 'normalized', ... + 'String','Running median filter',... + 'pos',[.05 .05 .9 .4],... + 'HandleVisibility','off'); + + % 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'); + +% 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'); + + +% tsg = dev_corMethod1(tsg, sample, dateMin, dateMax, cst.COR_TIME_WINDOWS); + + +% 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 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 -- GitLab