Newer
Older
% 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
% Find program directory.
% functions (icons) should be store at a lower level

jacques.grelet_ird.fr
committed
% add directories to Matlab search path, works on UNIX
% and Windows host
% ---------------------------------------------------
tsgqcname = mfilename;
fulltsgqcname = mfilename('fullpath');
DEFAULT_PATH_FILE = strrep(fulltsgqcname, tsgqcname, '') ;

jacques.grelet_ird.fr
committed
p = [pathsep,...
DEFAULT_PATH_FILE,[filesep 'tsg_util' pathsep],...
DEFAULT_PATH_FILE,[filesep 'tsg_data' pathsep],...
DEFAULT_PATH_FILE,[filesep 'tsg_io' pathsep]

jacques.grelet_ird.fr
committed
];
addpath( p, '-END' );
rehash;

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

jacques.grelet_ird.fr
committed
'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,...
'Label','Open',...
'Accelerator','O',...
'HandleVisibility','callback',...
'Callback', @OpenMenuCallback);
hSaveMenu = uimenu(...
'Parent', hFileMenu,...
'Label','Save',...
'Accelerator','S',...
'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( ...

jacques.grelet_ird.fr
committed
[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);
hQCPushtool = uipushtool(... % Open QC toolbar button
'Parent',hToolbar,...
'TooltipString','Validation codes',...
'Separator', 'on', ...
'CData',iconRead(...

jacques.grelet_ird.fr
committed
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'qcicon.mat']),...
'HandleVisibility','callback', ...
'Tag','QC',...
'UserData', 'off',...
'Enable', 'off',...
'ClickedCallback', @QCMenuCallback);
hMapPushtool = uipushtool(... % Open Map toolbar button
'Parent',hToolbar,...
'TooltipString','Map and ship track',...
'Separator', 'on', ...
'CData',iconRead(...

jacques.grelet_ird.fr
committed
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'mapicon.mat']),...
'HandleVisibility','callback', ...
'Tag','PUSHTOOL_MAP',...
'UserData', 'off', ...
'Enable', 'off',...
'ClickedCallback', @MapMenuCallback);
hClimPushtool = uipushtool(... % Open Climatology toolbar button
'Parent',hToolbar,...
'TooltipString','Climatology',...
'Separator', 'on', ...
'CData',iconRead(...

jacques.grelet_ird.fr
committed
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'climicon.mat']),...
'HandleVisibility','callback', ...
'Tag','PUSHTOOL_CLIM',...
'UserData', 'off',...
'Enable', 'off',...
'ClickedCallback', @ClimMenuCallback);
hBottlePushtool = uipushtool(... % Open toolbar button
'Parent',hToolbar,...
'Separator', 'on', ...
'CData',iconRead(...

jacques.grelet_ird.fr
committed
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'bottleicon.mat']),...
'HandleVisibility','callback', ...
'Tag','BOTTLE',...
'Enable', 'off',...
'ClickedCallback', @BottleMenuCallback);
hHeaderPushtool = uipushtool(... % Open headerForm button
'Parent',hToolbar,...
'TooltipString','Fill the header form',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'hdricon.mat']),...
'HandleVisibility','callback', ...
'Tag','PUSHTOOL_HEADER',...
'Enable', 'off',...
'ClickedCallback', @HeaderMenuCallback);
% Static text that displays the position, salinity and temperature
% ----------------------------------------------------------------
hInfoText = uicontrol(...
'Parent', hMainFig, ...
'Style', 'text', ...
'Fontsize', 12, ...
Yves Gouriou
committed
'Fontweight', 'bold', ...
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
'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', hMainFig, ...
'Units', 'normalized', ...
'Visible', 'off', ...
'HandleVisibility','callback', ...
'Position',[.05, .6, .9, .32]);
hPlotAxes(2) = axes(... % the axes for plotting temperature
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Visible', 'off', ...
'HandleVisibility','callback', ...
'Position',[.05, .3, .9, .25]);
hPlotAxes(3) = axes(... % the axes for plotting ship velocity
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Visible', 'off', ...
'HandleVisibility','callback', ...
'Position',[.05, .05, .9, .2]);
% 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', [], ...
'HandleVisibility','callback', ...
'Position',[.05, .05, .9, .9]);
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
% Construct the context menu for the Quality control codes
% -------------------------------------------------------
hQcCmenu = uicontextmenu(...
'Parent', hMainFig, ...
'HandleVisibility','callback' );
hQcCmenuNocontrol = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'No control',...
'ForegroundColor', 'k',...
'Callback', @QcNoControl);
hQcCmenuGood = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'Good',...
'ForegroundColor', 'b',...
'Callback', @QcGood);
hQcCmenuProbGood = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'Probably Good',...
'Callback', @QcProbGood,...
'ForegroundColor', 'g');
hQcCmenuProbBad = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'Probably bad',...
'ForegroundColor', 'm',...
'Callback', @QcProbBad);
hQcCmenuBad = uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','off', ...
'Label', 'Bad',...
'ForegroundColor', 'r',...
'Callback', @QcBad);
% Initialisation
% --------------
tsg_initialisation(hMainFig, hQcCmenu)
% Callbacks for tsgcqc_GUI
% ************************
%----------------------------------------------------------------------
function OpenMenuCallback(hObject, eventdata)
% Callback function run when the Open menu item is selected
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
% Make the filename
% ATTENTION : function OpenMenuCallback(hObject, eventdata)
% This has to be made general for UNIX and WINDOWS system
% ---------------------------------------------------------

jacques.grelet_ird.fr
committed
[filename, pathname, filterIndex] = uigetfile( ...
{'*.txt';'*.xml';'*.nc';'*.btl'}, 'Pick a file');
if ~isequal(filename, 0)
% Read the data
% -------------

jacques.grelet_ird.fr
committed
switch filterIndex
case 1
error1 = readTsgDataTxt( hMainFig, filename );

jacques.grelet_ird.fr
committed
case 2
error1 = readTsgDataXML( hMainFig, filename );

jacques.grelet_ird.fr
committed
case 3
error1 = readTsgDataNetCDF( hMainFig, filename );
%# a modifier
if error1 == 1
error2 = error1;
end
error2 = readBucketData(hMainFig, filename );

jacques.grelet_ird.fr
committed
otherwise
return;
end
% A TSG file has been read. Plot the data.
% ----------------------------------------
if error1 ~= -1
% A TSG file has been open and read
% ---------------------------------
set( hOpenMenu, 'UserData', 'on' );
hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
set(hdl_pushtool, 'Enable', 'on');
% The callback to detect the mouse motion can be set to on
% --------------------------------------------------------
set( hMainFig, 'UserData', 'ButtonMotionOn');
% Make the Salinity, temperature and velocity plot
% ------------------------------------------------
plot_SalTempVel( hMainFig, hPlotAxes );
% Plot the Map with the ship trackline
% ------------------------------------
Yves Gouriou
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
%donnes validee
%@[sample] = tsg_mergesample( hMainFig );
%@ Save the 'sample' struct. as an application data
Yves Gouriou
committed
% ------------------------------------------------
%if ~isempty( sample )
% setappdata( hMainFig, 'sample', sample );
%end
% Plot Salinity bucket
% ------------------------------------------------
if error2 ~= -1
plot_SalTsgSample( hMainFig, hPlotAxes );
Yves Gouriou
committed
end
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
end
%----------------------------------------------------------------------
function ZoomMenuCallback(hObject, eventdata)
% Callback function run when the Open menu item is selected
% Returns a zoom mode object for the figure handle
hZoom = zoom(hMainFig);
% Specifies whether this mode is currently enabled on the figure
zoomOnOff = get(hZoom, 'Enable' );
switch zoomOnOff
case 'on'
zoom off
zoomAdaptiveDateTicks('off');
case 'off'
pan off
set(hQCPushtool, 'UserData', 'off' );
zoom on
zoomAdaptiveDateTicks('on');
end
% zoomColor = get(hZoomPushtool,'CData');
% set(hZoomplusPushtool,'CData', zoomColor);
end
%----------------------------------------------------------------------
function PanMenuCallback(hObject, eventdata)
% Callback function run when the Open menu item is selected
% Returns a pan mode object for the figure handle
hPan = pan(hMainFig);
% Specifies whether this mode is currently enabled on the figure
panOnOff = get(hPan, 'Enable' );
switch panOnOff
case 'on'
pan off
panAdaptiveDateTicks('off');
case 'off'
zoom off
set(hQCPushtool, 'UserData', '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, 'UserData');
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
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
quality = get( hQcCmenu, 'UserData');
tsg.SSPS_QC(ind) = quality.Code;
% Save the modifications
% ----------------------
setappdata( hMainFig, 'tsg_data', tsg);
axes(hPlotAxes(1));
hold on
color = ['.' quality.Color];
plot(tsg.DAYD(ind), tsg.SSPS(ind), color );
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
hold off
end
end
end
%---------------------------------------------------------------------
function QcNoControl(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 QcGood(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 QcProbGood(hObject, eventdata)
% Callback function run when the QC context menu is selected
% Retrieve named application data
% -------------------------------
qc = getappdata( hMainFig, 'qcColor');
quality.Code = qc.Code.PROBABLY_GOOD;
quality.Color = qc.Color.PROBABLY_GOOD;
set( hQcCmenu, 'UserData', quality );
% uiwait in the QCMenuCallback function
% -------------------------------------
uiresume
end
%---------------------------------------------------------------------
function QcProbBad(hObject, eventdata)
% Callback function run when the QC context menu is selected
% Retrieve named application data
% -------------------------------
qc = getappdata( hMainFig, 'qcColor');
quality.Code = qc.Code.PROBABLY_BAD;
quality.Color = qc.Color.PROBABLY_BAD;
set( hQcCmenu, 'UserData', quality );
% uiwait in the QCMenuCallback function
% -------------------------------------
uiresume
end
%---------------------------------------------------------------------
function QcBad(hObject, eventdata)
% Callback function run when the QC context menu is selected
% Retrieve named application data
% -------------------------------
qc = getappdata( hMainFig, 'qcColor');
quality.Code = qc.Code.BAD;
quality.Color = qc.Color.BAD;
Yves Gouriou
committed
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( 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));
if x > tsg.DAYD(1) && x < tsg.DAYD(end)
indCursor = find( tsg.DAYD > 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.DAYD(indCursor(1)),'dd/mm/yyyy HH:MM'),...
dd2dm(tsg.LATX(indCursor(1)),0), ...
dd2dm(tsg.LONX(indCursor(1)),1), ...
tsg.SSPS(indCursor(1)), ...
tsg.SSJT(indCursor(1))...
));
% 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);
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
end
end
end
end
end
end
%---------------------------------------------------------------------
function MapMenuCallback(hObject, eventdata)
% Callback function run when the Map tool bar item is selected
% Make the earth map visible or not
if strcmp( get(hMapPanel, 'Visible'), 'off' )
set(hMapPanel, 'Visible', 'on' );
else
set(hMapPanel, 'Visible', 'off' );
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, 'UserData'), 'off')
% Sample Push button - UserData set to 'on'
% ------------------------------------
set( hBottlePushtool, 'UserData', 'on' );
Yves Gouriou
committed
% Test if tsg and sample data have been loaded
% --------------------------------------------
if ~isempty( getappdata( hMainFig, 'tsg_data') ) && ...
Yves Gouriou
committed
~isempty( getappdata( hMainFig, 'sample') )
% Call the GUI for tsg correction
% -------------------------------
Yves Gouriou
committed
%msgbox('The correction module has not been implemented', 'modal');
tsgcor_GUI( hMainFig );
Yves Gouriou
committed
else
Yves Gouriou
committed
msgbox('TSG or Sample data not loaded in the program', 'modal');
Yves Gouriou
committed
end
% hLine = get( hPlotAxes(1), 'UserData');
% Plot the samples if the TSG file has been read
% ----------------------------------------------
% if strcmp( get(hOpenMenu, 'UserData'), 'on' ) && ~isempty( sample )
Yves Gouriou
committed
% 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
% ----------------------------------
Yves Gouriou
committed
% set( hPlotAxes(1), 'UserData', hLine );
% end
Yves Gouriou
committed
% else
set( hBottlePushtool, 'UserData', 'off' );
% The bucket pushbutton has been pressed again :
% Delete the bucket on figure
% ----------------------------------------------
Yves Gouriou
committed
% hLine = get( hPlotAxes(1), 'UserData');
% if ~isempty( hLine ) && ishandle( hLine.Sample )
% delete(hLine.Sample);
% end
end
end
%---------------------------------------------------------------------
function ClimMenuCallback(hObject, eventdata)
% Callback function run when the ClimMenu menu item is selected
%
% Plot or delete salinity climatology over Salinity plot
%
% Function to be written
% Test if the climatology Push button has been pressed
% ----------------------------------------------------
if strcmp( get(hClimPushtool, 'UserData'), 'off')
% Climatology push button - UserData set to 'on'
% -----------------------------------------
set( hClimPushtool, 'UserData', 'on' );
% Test if the TSG and bucket files have been read
% -----------------------------------------------
if strcmp( get(hOpenMenu, 'UserData'), 'on' )
% -----------------------
tsg = getappdata( hMainFig, 'tsg_data' );
hLine1 = get( hPlotAxes(1), 'UserData');
hLine2 = get( hPlotAxes(2), 'UserData');
% Read Climatology
% ----------------
if isempty( tsg.levitus.data)
levitus = read_file_woa01( 'woa01an.nc' );
if ~isstruct(levitus)
errordlg({'NetCDF climatology file not present in you path',...
'Check your matlab path or download it from',...
'ftp://ftp.ifremer.fr/ifremer/ird/us191/oceano/lib/matlab/woa01an.nc'},...
'NetCDF climatology file access error');
return;
else
tsg.levitus.data = levitus;
tsg.levitus.type = 'woa01an';
end
setappdata( hMainFig, 'tsg_data', tsg );
end
% round positive latitude and Longitude toward zero
% -------------------------------------------------
ind = find(tsg.LATX > 0);
lat(ind) = fix(tsg.LATX(ind)) + 0.5;
ind = find(tsg.LONX > 0);
lon(ind) = fix(tsg.LONX(ind)) + 0.5;
% rounds negative latitude and Longitudeto the nearest lowest integers
% ---------------------------------------------------------------------
ind = find(tsg.LATX <= 0);
lat(ind) = floor(tsg.LATX(ind)) + 0.5;
ind = find(tsg.LONX <= 0);
lon(ind) = floor(tsg.LONX(ind)) + 0.5;
% Calculates differences between adjacent elements of X.
% 0 if adajacent latitude or longitude are equal
% - 1 or -1 otherwise
% ------------------------------------------------------------
lat_diff = [diff( lat )'; 0];
lon_diff = [diff( lon )'; 0];
% Select latitude and longitude
% -----------------------------
Yves Gouriou
committed
ind = find(abs(lat_diff) == 1 | abs(lon_diff == 1));
lat2 = lat( ind );
lon2 = lon( ind );
time = tsg.DAYD( ind );
temp = tsg.SSJT( ind );
psal = tsg.SSPS( ind );

jacques.grelet_ird.fr
committed
% Get Climatology
% LATX(80) = -0.5 et LATX(81) = 0.5
% LONX(180) = -0.5 et LONX(181) = 0.5
% ----------------
axes( hPlotAxes(1) );
Yves Gouriou
committed
mean_temp = zeros(size(ind));
mean_psal = zeros(size(ind));
std_temp = zeros(size(ind));
std_psal = zeros(size(ind));
ilat = find(tsg.levitus.data.WOA01_LATX == lat2(i));
ilon = find(tsg.levitus.data.WOA01_LONX == lon2(i));
mean_temp(i) = tsg.levitus.data.WOA01_MEAN_TEMP(ilat,ilon,1);
mean_psal(i) = tsg.levitus.data.WOA01_MEAN_PSAL(ilat,ilon,1);
std_temp(i) = tsg.levitus.data.WOA01_STD_TEMP(ilat,ilon,1);
std_psal(i) = tsg.levitus.data.WOA01_STD_PSAL(ilat,ilon,1);
end
% Plot mean salinity climatology
hLine1.meanClim = line( ...
time, mean_psal,'Linestyle', '-', 'Color','k');
% Plot 2 standard deviation
hLine1.stdClimPlus = line( ...
time, mean_psal + 3 * std_psal ,'Linestyle', '-', 'Color','r');
hLine1.stdClimMinus = line( ...
time, mean_psal - 3 * std_psal ,'Linestyle', '-', 'Color','r');
% Plot mean temperature climatology
axes( hPlotAxes(2));
hLine2.meanClim = line( ...
time, mean_temp,'Linestyle', '-', 'Color','k');
hLine2.stdClimPlus = line( ...
time, mean_temp + 3 * std_temp ,'Linestyle', '-', 'Color','r');
hLine2.stdClimMinus = line( ...
time, mean_temp - 3 * std_temp ,'Linestyle', '-', 'Color','r');
% Store the handle of the bucketline
% ----------------------------------
set( hPlotAxes(1), 'UserData', hLine1 );
set( hPlotAxes(2), 'UserData', hLine2 );
end
else
set( hClimPushtool, 'UserData', 'off' );
% The bucket pushbutton has been pressed again :
% Delete the bucket on figure
% ----------------------------------------------
hLine1 = get( hPlotAxes(1), 'UserData');
hLine2 = get( hPlotAxes(2), 'UserData');
delete(hLine1.stdClimMinus);
delete(hLine1.stdClimPlus);
delete(hLine1.meanClim);
delete(hLine2.stdClimMinus);
delete(hLine2.stdClimPlus);
delete(hLine2.meanClim);
% -------------------------------------------------------------------
function HeaderMenuCallback(hObject, eventdata)
% Callback function run when the headerForm tool bar item is selected
% call header form function
% -------------------------
headerForm(hMainFig);
end
% -------------------------------------------------------------------
function SaveMenuCallback(hObject, eventdata)
% Callback function run when the Save menu item is selected
% fill or append header form
% -------------------------
error = headerForm(hMainFig);
% if user press continue button, ask for netcdf file
% ------------------------------------------------
if error ~= -1
[fileName, pathName, filterIndex] = uiputfile('*.nc', ...
'Save file name');
% if user press cancel button, all var set to zero
% ------------------------------------------------
if fileName == 0
return;
end
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
% flushes the event queue and updates the closed uiputfile window
% ---------------------------------------------------------------
drawnow;
% write netcdf file
% -----------------
fileName = [pathName fileName];
error = writeTSGDataNetCDF( hMainFig, fileName );
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
% Check for a writing pb to NetCDF
% must to be rewriting
% --------------------------------
if error == -1
warning(['NetCDF writing error:' fileName]);
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, 'UserData' ), 'on')
selection = ...
questdlg('The file has been modified. Do you want to save it ?',...
'Save before Quit?',...
'Yes', 'No', 'Yes');
if strcmp(selection, 'Yes')
return;
else

jacques.grelet_ird.fr
committed
QuitProgram;
end
else
selection = ...
questdlg(['Quit ' get(hMainFig, 'Name') '?'],...
['Quit ' get(hMainFig, 'Name') '?'],...
'Yes', 'No', 'Yes');
if strcmp(selection, 'No')
return;
else

jacques.grelet_ird.fr
committed
QuitProgram;

jacques.grelet_ird.fr
committed
end
% ----------------------------------------------------------------
function QuitProgram(hObject, eventdata)
delete(hMainFig);

jacques.grelet_ird.fr
committed
% reset Matlab search path to default