Newer
Older

jacques.grelet_ird.fr
committed
% 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
% ********************

jacques.grelet_ird.fr
committed
% Clear Command Window display, giving up a "clean screen."
% ---------------------------------------------------------
clc;

jacques.grelet_ird.fr
committed
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
% 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);

jacques.grelet_ird.fr
committed
hZoomToggletool = uitoggletool(... % Open Zoom toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'Separator', 'on', ...
'TooltipString','Zoom',...
'CData', iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/zoom.mat')),...
'HandleVisibility','callback', ...
'Tag','PUSHTOOL_ZOOM',...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @Zoom_OffMenuCallback,...
'ONCallback', @Zoom_OnMenuCallback);
hPanToggletool = uitoggletool(... % Open Pan toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'TooltipString','Pan',...
'CData',iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/pan.mat')),...
'HandleVisibility','callback', ...
'Tag','PUSHTOOL_PAN',...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @Pan_OffMenuCallback,...
'ONCallback', @Pan_OnMenuCallback);
%'ClickedCallback', @PanMenuCallback);
hQCToggletool = uitoggletool(... % Open QC toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'TooltipString','Validation codes',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'qcicon.mat']),...
'HandleVisibility','callback', ...

jacques.grelet_ird.fr
committed
'UserData', 'off',...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @QC_OffMenuCallback,...
'ONCallback', @QC_OnMenuCallback);
hMapToggletool = uitoggletool(... % Open Map toolbar button

jacques.grelet_ird.fr
committed
'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',...

jacques.grelet_ird.fr
committed
'OffCallback', @Map_OffMenuCallback,...
'ONCallback', @Map_OnMenuCallback);
hClimToggletool = uitoggletool(... % Open Climatology toolbar button

jacques.grelet_ird.fr
committed
'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',...

jacques.grelet_ird.fr
committed
'OffCallback', @Clim_OffMenuCallback,...
'ONCallback', @Clim_OnMenuCallback);

jacques.grelet_ird.fr
committed
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', ...

jacques.grelet_ird.fr
committed
'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, ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.02, .95, .03, .03], ...
'String', 'File:');
hInfoFileText = uicontrol(...
'Parent', hMainFig, ...
'Style', 'text', ...
'Fontsize', 11, ...

jacques.grelet_ird.fr
committed
'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, ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...

jacques.grelet_ird.fr
committed
'Position',[.17, .95, .03, .03], ...

jacques.grelet_ird.fr
committed
'String', 'Date:');
hInfoDateText = uicontrol(...
'Parent', hMainFig, ...
'Style', 'text', ...
'Fontsize', 11, ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...

jacques.grelet_ird.fr
committed
'Position', [.21, .95, .11, .03]);

jacques.grelet_ird.fr
committed
% Text area that displays the latitude
% ------------------------------------
uicontrol(...
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Style', 'Text', ...
'Fontsize', 11, ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...

jacques.grelet_ird.fr
committed
'Position',[.35, .95, .05, .03], ...

jacques.grelet_ird.fr
committed
'String', 'Latitude:');
hInfoLatText = uicontrol(...
'Parent', hMainFig, ...
'Style', 'text', ...
'Fontsize', 11, ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...

jacques.grelet_ird.fr
committed
'Position', [.41, .95, .07, .03]);

jacques.grelet_ird.fr
committed
% Text area that displays the longitude
% -------------------------------------
uicontrol(...
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Style', 'Text', ...
'Fontsize', 11, ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...

jacques.grelet_ird.fr
committed
'Position',[.50, .95, .06, .03], ...

jacques.grelet_ird.fr
committed
'String', 'Longitude:');
hInfoLongText = uicontrol(...
'Parent', hMainFig, ...
'Style', 'text', ...
'Fontsize', 11, ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...

jacques.grelet_ird.fr
committed
'Position', [.57, .95, .07, .03]);

jacques.grelet_ird.fr
committed
% Text area that display salinity and temperature
% -----------------------------------------------
uicontrol(...
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Style', 'Text', ...
'Fontsize', 11, ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...

jacques.grelet_ird.fr
committed
'Position',[.65, .95, .03, .03], ...

jacques.grelet_ird.fr
committed
'String', 'SSPS:');
hInfoSSPSText = uicontrol(...
'Parent', hMainFig, ...
'Style', 'text', ...
'Fontsize', 11, ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...

jacques.grelet_ird.fr
committed
'Position', [.69, .95, .05, .03]);

jacques.grelet_ird.fr
committed
uicontrol(...
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Style', 'Text', ...
'Fontsize', 11, ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...

jacques.grelet_ird.fr
committed
'Position',[.75, .95, .03, .03], ...

jacques.grelet_ird.fr
committed
'String', 'SSJT:');
hInfoSSJTText = uicontrol(...
'Parent', hMainFig, ...
'Style', 'text', ...
'Fontsize', 11, ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...

jacques.grelet_ird.fr
committed
'Position', [.79, .95, .05, .03]);

jacques.grelet_ird.fr
committed
uicontrol(...
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Style', 'Text', ...
'Fontsize', 11, ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...

jacques.grelet_ird.fr
committed
'Position',[.85, .95, .03, .03], ...

jacques.grelet_ird.fr
committed
'String', 'SSTP:');
hInfoSSTPText = uicontrol(...
'Parent', hMainFig, ...
'Style', 'text', ...
'Fontsize', 11, ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...

jacques.grelet_ird.fr
committed
'Position', [.89, .95, .05, .03]);

jacques.grelet_ird.fr
committed
%% 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]);

jacques.grelet_ird.fr
committed
% The second and third axes will be plot in a uipanel
hPlotsPanel = uipanel( ...

jacques.grelet_ird.fr
committed
'Parent', hMainFig, ...
'Units', 'normalized', ...

jacques.grelet_ird.fr
committed
'BorderType', 'none',...
'Visible', 'on', ...
'Position',[0, 0, 1, .57]);
hPlotAxes(2) = axes(... % the axes for plotting temperature
'Parent', hPlotsPanel, ...
'Units', 'normalized', ...

jacques.grelet_ird.fr
committed
'Visible', 'off', ...
'HandleVisibility','callback', ...

jacques.grelet_ird.fr
committed
'Position',[.05, .48, .9, .47]);

jacques.grelet_ird.fr
committed
hPlotAxes(3) = axes(... % the axes for plotting ship velocity

jacques.grelet_ird.fr
committed
'Parent', hPlotsPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Visible', 'off', ...
'HandleVisibility','callback', ...

jacques.grelet_ird.fr
committed
'Position',[.05, .06, .9, .32]);

jacques.grelet_ird.fr
committed
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
% 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',...

jacques.grelet_ird.fr
committed
hQcCmenuGood = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'Good',...
'ForegroundColor', 'b',...

jacques.grelet_ird.fr
committed
hQcCmenuProbGood = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'Probably Good',...

jacques.grelet_ird.fr
committed
'ForegroundColor', 'g');
hQcCmenuProbBad = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'Probably bad',...
'ForegroundColor', 'm',...

jacques.grelet_ird.fr
committed
hQcCmenuBad = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'Bad',...
'ForegroundColor', 'r',...

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Initialize tsg structure
% ------------------------

jacques.grelet_ird.fr
committed
tsg_initialisation(hMainFig, hQcCmenu)

jacques.grelet_ird.fr
committed
% -------------------------
% Callbacks for tsgcqc_GUI

jacques.grelet_ird.fr
committed
% ------------------------

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
% Callback function run when the Open menu item is selected
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
function OpenMenuCallback(hObject, eventdata)

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
Yves Gouriou
committed

jacques.grelet_ird.fr
committed
% Make the fileName

jacques.grelet_ird.fr
committed
% ATTENTION : function OpenMenuCallback(hObject, eventdata)
% This has to be made general for UNIX and WINDOWS system
% ---------------------------------------------------------

jacques.grelet_ird.fr
committed
[fileName, pathname, filterIndex] = uigetfile( ...
{'*.txt';'*.xml';'*.nc';'*.lbv';'*.btl'}, 'Pick a file');

jacques.grelet_ird.fr
committed
error1 = -1;
error2 = -1;

jacques.grelet_ird.fr
committed
if ~isequal(fileName, 0)

jacques.grelet_ird.fr
committed
% Read the data
% -------------
switch filterIndex
case 1

jacques.grelet_ird.fr
committed
error1 = readTsgDataTxt( hMainFig, fileName );

jacques.grelet_ird.fr
committed
case 2

jacques.grelet_ird.fr
committed
error1 = readTsgDataXML( hMainFig, fileName );

jacques.grelet_ird.fr
committed
case 3

jacques.grelet_ird.fr
committed
error1 = readTsgDataNetCDF( hMainFig, fileName );

jacques.grelet_ird.fr
committed
%# a modifier
if error1 == 1
error2 = error1;
end
case 4
error1 = readTsgDataLabview( hMainFig, fileName );
case 5

jacques.grelet_ird.fr
committed
error2 = readBucketData(hMainFig, fileName );

jacques.grelet_ird.fr
committed
otherwise
return;

jacques.grelet_ird.fr
committed
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' );

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% enable toolbar menu pushtool
% ----------------------------

jacques.grelet_ird.fr
committed
hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
set(hdl_pushtool, 'Enable', 'on');

jacques.grelet_ird.fr
committed
% update the filename display
% ---------------------------

jacques.grelet_ird.fr
committed
set( hInfoFileText, 'String', fileName);

jacques.grelet_ird.fr
committed
% update some fields in tsg structure
% -----------------------------------
updateTsgStruct(hMainFig);

jacques.grelet_ird.fr
committed
% The callback to detect the mouse motion can be set to on
% --------------------------------------------------------
set( hMainFig, 'UserData', 'ButtonMotionOn');
% Make the Salinity, temperature and velocity plot
% ------------------------------------------------

jacques.grelet_ird.fr
committed
plot_SalTempVel( hMainFig, hPlotAxes );
% Plot the Map with the ship trackline
% ------------------------------------
plotmap( hMainFig, hPlotAxes)

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
% 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

jacques.grelet_ird.fr
committed
%donn�es validee

jacques.grelet_ird.fr
committed
%@[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
% -------------------------------------------------------

jacques.grelet_ird.fr
committed
if error2 ~= -1

jacques.grelet_ird.fr
committed
plot_WS( hMainFig, hPlotAxes );
plot_EXT( hMainFig, hPlotAxes );

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
end

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
% Callback function run when the zoom toggle toolbar is released

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
function Zoom_OffMenuCallback(hObject, eventdata)
% returns the plot to its initial zoom setting
% --------------------------------------------

jacques.grelet_ird.fr
committed
%zoom out;

jacques.grelet_ird.fr
committed
% turns interactive zooming off
% -----------------------------
zoom off;
end

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
% Callback function run when the zoom toggle toolbar is released
%----------------------------------------------------------------------
function Zoom_OnMenuCallback(hObject, eventdata)
% returns a zoom mode object for the figure hMainFig handle
% --------------------------------------------------------

jacques.grelet_ird.fr
committed
hZoom = zoom(hMainFig);

jacques.grelet_ird.fr
committed
% turns on interactive zooming (same effect than zoom on) but prevent
% side effect on another figure
% -------------------------------------------------------------------
set(hZoom,'enable', 'on');
% Turns on the automatic adaptation of date ticks
% -----------------------------------------------
zoomAdaptiveDateTicks('on');
% Desactivate the QC and pan toggle buttons
% -----------------------------------------
set(hQCToggletool, 'state', 'off' );
set(hPanToggletool, 'state', 'off' );

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Callback function run when the pan toggle toolbar is released

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
function Pan_OffMenuCallback(hObject, eventdata)
% turns interactive pan off
% -------------------------
pan off;
% reset to original figure
% ------------------------

jacques.grelet_ird.fr
committed
%zoom out;

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
% Callback function run when the pan toggle toolbar is selected
%----------------------------------------------------------------------
function Pan_OnMenuCallback(hObject, eventdata)

jacques.grelet_ird.fr
committed
% Returns a pan mode object for the figure handle

jacques.grelet_ird.fr
committed
% -----------------------------------------------

jacques.grelet_ird.fr
committed
hPan = pan(hMainFig);

jacques.grelet_ird.fr
committed
% turns on interactive pan (same effect than pan on) but prevent
% side effect on another figure
% -------------------------------------------------------------------
set(hPan,'enable', 'on');
% Turns on the automatic adaptation of date ticks
% -----------------------------------------------
panAdaptiveDateTicks('on');
% Desactivate the QC and pan toggle button
% ----------------------------------------
set(hQCToggletool, 'state', 'off' );
set(hZoomToggletool, 'state', 'off' );

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Callback function run when the QC toggle tool is released

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
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

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Callback function run when the QC toggle tool is pressed

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
function QC_OnMenuCallback(gcbo, eventdata)

jacques.grelet_ird.fr
committed
% Desactivate the Zoom and Pan functions.
% ---------------------------------------
zoom off; pan off
panAdaptiveDateTicks('off');zoomAdaptiveDateTicks('off');

jacques.grelet_ird.fr
committed
% Activate right clic context menu on first axes (salinity)
% ---------------------------------------------------------
set(hPlotAxes(1),'UIContextMenu', hQcCmenu);

jacques.grelet_ird.fr
committed
% Activate clic mouse menu on first axes (salinity)
% -------------------------------------------------
set(hPlotAxes(1),'ButtonDownFcn', @QC_SelectCallback);

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% change cursor to crosshair aspect
% ---------------------------------

jacques.grelet_ird.fr
committed
set( hMainFig, 'Pointer', 'crosshair');
% -------------------------------------------------------------

jacques.grelet_ird.fr
committed
% nested function on mouse clic when QC toggle tool is selected

jacques.grelet_ird.fr
committed
% -------------------------------------------------------------
function QC_SelectCallback(gcbo, eventdata)

jacques.grelet_ird.fr
committed
% disable ButtonMotion on main fig during select

jacques.grelet_ird.fr
committed
% prevent drawing to map
% ----------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', []);

jacques.grelet_ird.fr
committed
% 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

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
point1 = point1(1,1:2); % extract x and y
point2 = point2(1,1:2);
p1 = min(point1,point2);
p2 = max(point1,point2); % calculate locations

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% 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);

jacques.grelet_ird.fr
committed
% enable ButtonMotion on main fig after select QC area
% ----------------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
% %----------------------------------------------------------------------
% 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');

jacques.grelet_ird.fr
committed
% case 'off'
% set(hQCToggletool, 'UserData', 'on' );

jacques.grelet_ird.fr
committed
% set(hPlotAxes(1),'UIContextMenu', hQcCmenu);
% set( hMainFig, 'Pointer', 'crosshair');
% case 'on'
% set(hQCToggletool, 'UserData', 'off' );

jacques.grelet_ird.fr
committed
% set(hPlotAxes(1),'UIContextMenu', []);
% set(hMainFig,'Pointer','arrow');
% end
%
% qualityCode = -1;
% ind = [];
% while strcmp( get(hQCToggletool, 'UserData'),'on')

jacques.grelet_ird.fr
committed
%
% k = waitforbuttonpress;
%
% % If the QC pushbutton is pressed we quit the callback
% % ----------------------------------------------------
% if strcmp( get(hQCToggletool, 'UserData'),'off')

jacques.grelet_ird.fr
committed
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
%
% % 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 );

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
%---------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Callback function run when mouse pointer is moving on temperature plot
% draw corresponding measurement position on map

jacques.grelet_ird.fr
committed
%---------------------------------------------------------------------

jacques.grelet_ird.fr
committed
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));

jacques.grelet_ird.fr
committed
% Dynamically display data in uicontrol
% -------------------------------------

jacques.grelet_ird.fr
committed
if x > tsg.DAYD(1) && x < tsg.DAYD(end)
indCursor = find( tsg.DAYD > x);
set( hInfoDateText, 'String',...

jacques.grelet_ird.fr
committed
datestr(tsg.DAYD(indCursor(1)),'dd/mm/yyyy HH:MM'));

jacques.grelet_ird.fr
committed
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

jacques.grelet_ird.fr
committed
% 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);

jacques.grelet_ird.fr
committed
end
end
end
end

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
%---------------------------------------------------------------------
% 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

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
%---------------------------------------------------------------------
% 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' );

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
%---------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Callback function run when the bootle push tool is pressed

jacques.grelet_ird.fr
committed
%---------------------------------------------------------------------

jacques.grelet_ird.fr
committed
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

jacques.grelet_ird.fr
committed
% Test if the sample Push button has been pressed
% -----------------------------------------------
% if strcmp( get(hBottlePushtool, 'UserData'), 'off')

jacques.grelet_ird.fr
committed
% Sample Push button - UserData set to 'on'
% ------------------------------------
% set( hBottlePushtool, 'UserData', 'on' );

jacques.grelet_ird.fr
committed
% Plot the samples if the TSG file has been read
% ----------------------------------------------