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
31
32
33
34
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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);

jacques.grelet_ird.fr
committed
hQCPushtool = 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);
hMapPushtool = 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);
hClimPushtool = 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
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
% 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
% Initialisation
% --------------
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
% enable 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
plot_SalTsgSample( hMainFig, hPlotAxes );
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
%----------------------------------------------------------------------
%----------------------------------------------------------------------

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

jacques.grelet_ird.fr
committed
zoom on
zoomAdaptiveDateTicks('on');

jacques.grelet_ird.fr
committed
% zoomColor = get(hZoomPushtool,'CData');
% set(hZoomplusPushtool,'CData', zoomColor);
end

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

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

jacques.grelet_ird.fr
committed
pan on
panAdaptiveDateTicks('on');
end
end

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
%----------------------------------------------------------------------
%----------------------------------------------------------------------
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_ZoomCallback);
% 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);

jacques.grelet_ird.fr
committed
% change cursor to crosshai aspect
% --------------------------------
set( hMainFig, 'Pointer', 'crosshair');
% -------------------------------------------------------------
% nested function on mouse clic
% -------------------------------------------------------------
function QC_ZoomCallback(gcbo, eventdata)

jacques.grelet_ird.fr
committed

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

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
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
% %----------------------------------------------------------------------
% 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(hQCPushtool, 'UserData');
% case 'off'
% set(hQCPushtool, 'UserData', 'on' );
% set(hPlotAxes(1),'UIContextMenu', hQcCmenu);
% set( hMainFig, 'Pointer', 'crosshair');
% case 'on'
% set(hQCPushtool, 'UserData', 'off' );
% set(hPlotAxes(1),'UIContextMenu', []);
% set(hMainFig,'Pointer','arrow');
% end
%
% qualityCode = -1;
% ind = [];
% while strcmp( get(hQCPushtool, 'UserData'),'on')
%
% k = waitforbuttonpress;
%
% % If the QC pushbutton is pressed we quit the callback
% % ----------------------------------------------------
% if strcmp( get(hQCPushtool, '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

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed

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
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
% ----------------------------------------------
% 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' );

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

jacques.grelet_ird.fr
committed
%------------------------------------------------------------------------
% Callback function run when the Levitus climatology toolbar is unselected
%------------------------------------------------------------------------
function Clim_OffMenuCallback(hObject, eventdata)

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Get line handles
% ----------------------------------------------
hLine1 = get( hPlotAxes(1), 'UserData');
hLine2 = get( hPlotAxes(2), 'UserData');
% Delete climatology linesthe on axes
% -----------------------------------