Newer
Older
% TSGQC: Thermosalinograph (TSG) Quality Control software
%% COPYRIGHT & LICENSE
% Copyright 2007 - IRD US191, all rights reserved.
%
% This file is part of tsgqc.
% TSG-QC 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 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
%% TIPS
% To get tsg anywhere during debug:
% tsg = getappdata( findobj('Tag', 'TAG_TSG-QC_GUI'), 'tsg_data')

jacques.grelet_ird.fr
committed
%% Define global variables for VERSIONING
% ---------------------------------------

jacques.grelet_ird.fr
committed
global CHAR_VERSION
global NETCDF_FORMAT_VERSION
% version number, may be used to initialize some files when it change
% 0.90x -> 1.0RCx
% -------------------------------------------------------------------
VERSION = 1.1; % -> 1.1
CHAR_VERSION = '1.1';

jacques.grelet_ird.fr
committed
% netcdf file version, see DATA FORMAT TSG document:
% CORTSG_format_gosud_1.5.doc
% --------------------------------------------------
NETCDF_FORMAT_VERSION = '1.6';

jacques.grelet_ird.fr
committed
%% Initialization tasks
% ********************
% Clear Command Window display, giving up a "clean screen."
% ---------------------------------------------------------
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,[ 'tsg_util' pathsep],...
DEFAULT_PATH_FILE,[ 'tsg_data' pathsep],...
DEFAULT_PATH_FILE,[ 'tsg_io' pathsep]
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
];
addpath( p, '-END' );
rehash;
% define 'HandleVisibility' property for all objects
% --------------------------------------------------
handleVisibility = 'on';
% get screen dimensions (pixels)
% ------------------------------
set(0,'Units','pixels');
screenSize = get(0,'ScreenSize');
% define default font size based on screen resolution
% ---------------------------------------------------
if screenSize(3) <= 1024
tsg.fontSize = 9;
end
% Screen limits for the GUI
% -------------------------
set(0,'Units','normalized');
guiLimits = get(0,'ScreenSize');
guiLimits(1) = guiLimits(1) + 0.01;
guiLimits(2) = guiLimits(2) + 0.05;
guiLimits(3) = guiLimits(3) - 0.02;
guiLimits(4) = guiLimits(4) - 0.15;
%% Main TSGQC GUI
% ---------------
% Check if main TSGQC figure exist
% --------------------------------
hMainFig = findobj('Tag', 'TAG_TSG-QC_GUI');
% if TSGQC figure exist and still running, don't create a new instance
% --------------------------------------------------------------------
if ~isempty(hMainFig)
% ---------------------------------
errordlg({'An instance of TSGQC is still running !!!', ...
'Open it from you task bar'}, 'Warning TSGQC');
return;
% Create and then hide the GUI as it is being constructed.
% --------------------------------------------------------
hMainFig = figure(...
'Name', 'TSG Validation', ...
'NumberTitle', 'off', ...
'Resize', 'on', ...
'Toolbar', 'none', ...
'UserData', 'ButtonMotionOff', ...
'WindowButtonMotionFcn', @MouseMotion, ...

jacques.grelet_ird.fr
committed
'CloseRequestFcn', @QuitMenuCallback,...
'Visible','on',...
'Tag','TAG_TSG-QC_GUI',...
'Units', 'normalized',...
'Position',guiLimits, ...
'Color', get( 0, 'DefaultUIControlBackgroundColor' ));

jacques.grelet_ird.fr
committed
%% Check Matlab version for use of KeyPressFcn and KeyReleaseFcn properties
% -------------------------------------------------------------------------
switch ( version('-release') )
case { '11', '12', '13', '14', '2006a', '2006b' }
% dont process KeyPressFcn and KeyReleaseFcn events
otherwise
% show crossline when shitf key is pressed, vertical bar when ctrl key
% --------------------------------------------------------------------
set( hMainFig, 'KeyPressFcn', @keyPressFcnCallback,...
'KeyReleaseFcn', @keyReleaseFcnCallback);
end
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
%% Initialize tsg structure with tsg_preference function
% -----------------------------------------------------
tsg_preferences(hMainFig, tsgqcname, DEFAULT_PATH_FILE);
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
%% Menu File
% -----------------------------------------------------------------------
hFileMenu = uimenu(...
'Parent', hMainFig,...
'HandleVisibility', handleVisibility,...
'Label', 'File');
hOpenMenu = uimenu(...
'Parent', hFileMenu,...
'Label','Open',...
'Accelerator','O',...
'HandleVisibility', handleVisibility,...
'UserData', 'off',...
'Callback', @OpenMenuCallback);
hSaveMenu = uimenu(...
'Parent', hFileMenu,...
'Label','Save',...
'Accelerator','S',...
'Enable', 'off',...
'UserData', 'off',...
'HandleVisibility', handleVisibility,...
'Callback',@SaveMenuCallback);
hExportMenu = uimenu(...
'Parent', hFileMenu,...
'Label','Export',...
'Accelerator','E',...
'Enable', 'off',...
'UserData', 'off',...
'HandleVisibility', handleVisibility);
hExportTSG = uimenu(...
'Parent', hExportMenu,...
'Enable', 'on',...
'HandleVisibility', handleVisibility,...
'Callback',@ExportTsgCallback);
hExportSAMPLE = uimenu(...
'Parent', hExportMenu,...
'Label','Sample ascii file',...
'Enable', 'on',...
'HandleVisibility', handleVisibility,...
'Callback',@ExportSampleCallback);
hQuitMenu = uimenu(...
'Parent',hFileMenu,...
'Label','Quit',...
'Separator','on',...
'Accelerator','Q',...
'HandleVisibility', handleVisibility,...
204
205
206
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
% ---------------------------------
hEditMenu = uimenu(hMainFig,'Label','Edit');
uimenu(hEditMenu,'Label','Undo',...
'Accelerator','Z',...
'Tag','UIMENU_UNDO',...
'Enable', 'off',...
'Callback',@UndoMenuCallback);
uimenu(hEditMenu,'Label','Redo',...
'Accelerator','R',...
'Tag','UIMENU_REDO',...
'Enable', 'off',...
'Callback',@RedoMenuCallback);
%% Menu Climatology with Annual/Seasonal/Monthly submenu
% --------------------------------------------------------
% define structure s stored in userdata
% -------------------------------------
s = struct('type', 'annual', 'time', 1);
hClimatoMenu = uimenu(hMainFig,'Label','Climatology', ...
'Tag', 'TAG_UIMENU_CLIMATO_MAIN', ...
'UserData', s);
% by defautl at startup, select climatology to annual
% ---------------------------------------------------
uimenu(hClimatoMenu,'Label','Annual',...
'Checked','on',...
'Tag','TAG_UIMENU_CLIMATO_ANNUAL',...
'Enable', 'on',...
'Callback', {@ClimatoSelectMenuCallback, 'annual', 1});
% declare top-level seasonal menu
% -------------------------------
hClimatoSeasonalMenu = uimenu(hClimatoMenu,'Label','Seasonal');
% declare label for seasonal submenu
% ----------------------------------
label = {'jan-feb-mar','apr-may-jun','jul-aug-sept','oct-nov-dec'};
% loop over the four submenu
% --------------------------
uimenu(hClimatoSeasonalMenu,'Label',label{i},...
'Checked','off',...
'Tag',['TAG_UIMENU_CLIMATO_SEASONAL_' i],...
'Enable', 'on',...
'Callback',{@ClimatoSelectMenuCallback, 'seasonal', i});
end
% declare top-level monthly menu
% -------------------------------
hClimatoMonthlyMenu = uimenu(hClimatoMenu,'Label','Monthly');
% declare label for monthly submenu
% ----------------------------------
label = {'january','february','march','april','may','june','july','august',...
% loop over the four submenu
% --------------------------
uimenu(hClimatoMonthlyMenu,'Label',label{i},...
'Checked','off',...
'Tag',['TAG_UIMENU_CLIMATO_MONTHLY_' i],...
'Enable', 'on',...
'Callback',{@ClimatoSelectMenuCallback, 'monthly', i});
end
%% Menu Option with Preferences submenu
% --------------------------------------------------------
hOptionMenu = uimenu(hMainFig,'Label','Option');
uimenu(hOptionMenu,'Label','Preferences',...
'Tag','TAG_UIMENU_OPTION_PREFERENCES',...
'Enable', 'on',...
'Callback', {@PreferencesMenuCallback});
%% Menu QC automatic
% Dependent functions : preferenceForm.m; tsg_preference.m,
% @QCMenuCallback
% ----------------------------------------------------------
hQCMenu = uimenu(...
'Parent', hMainFig, 'Enable', 'off', 'HandleVisibility', handleVisibility,...
'Label', 'QCauto');
hFlowMenu = uimenu(...
'Parent', hQCMenu, 'Label','Flow', 'HandleVisibility', handleVisibility,...
Yves Gouriou
committed
'UserData', 'off', 'Callback', {@QCMenuCallback,'Flow'});
hPressMenu = uimenu(...
'Parent', hQCMenu, 'Label','Press', 'HandleVisibility', handleVisibility,...
'UserData', 'off', 'Callback', {@QCMenuCallback,'Press'});
hSpeedMenu = uimenu(...
'Parent', hQCMenu, 'Label','Ship Speed', 'HandleVisibility', handleVisibility,...
'UserData', 'off', 'Callback', {@QCMenuCallback,'Speed'});
hSSPSminMenu = uimenu(...
'Parent', hQCMenu, 'Label','SSPS min', 'HandleVisibility', handleVisibility,...
'UserData', 'off', 'Callback', {@QCMenuCallback,'SSPSmin'});
hSSPSmaxMenu = uimenu(...
'Parent', hQCMenu, 'Label','SSPS max', 'HandleVisibility', handleVisibility,...
'UserData', 'off', 'Callback', {@QCMenuCallback,'SSPSmax'});
hSSJTminMenu = uimenu(...
'Parent', hQCMenu, 'Label','SSJT min', 'HandleVisibility', handleVisibility,...
'UserData', 'off', 'Callback', {@QCMenuCallback,'SSJTmin'});
hSSJTmaxMenu = uimenu(...
'Parent', hQCMenu, 'Label','SSJT max', 'HandleVisibility', handleVisibility,...
'UserData', 'off', 'Callback', {@QCMenuCallback,'SSJTmax'});
hSSTPminMenu = uimenu(...
'Parent', hQCMenu, 'Label','SSTP min', 'HandleVisibility', handleVisibility,...
'UserData', 'off', 'Callback', {@QCMenuCallback,'SSTPmin'});
hSSTPmaxMenu = uimenu(...
'Parent', hQCMenu, 'Label','SSTP max', 'HandleVisibility', handleVisibility,...
'UserData', 'off', 'Callback', {@QCMenuCallback,'SSTPmax'});
%% Menu Help with F1 Help and About submenu
% --------------------------------------------------------
hOptionMenu = uimenu(hMainFig,'Label','Help');
uimenu(hOptionMenu,'Label','Help',...
'Tag','TAG_UIMENU_HELP_HELP',...
'Enable', 'on',...
'Callback', {@HelpMenuCallback});
uimenu(hOptionMenu,'Label','About TSGQC',...
'Tag','TAG_UIMENU_HELP_ABOUT',...
'Enable', 'on',...
'Callback', {@AboutMenuCallback});
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
%% Toolbar pushbuttons
% -----------------------------------------------------------------------
hToolbar = uitoolbar(... % Toolbar for Open and Print buttons
'Parent',hMainFig, ...
'HandleVisibility','on');
hOpenPushtool = uipushtool(... % Opendoc toolbar button
'Parent',hToolbar,...
'TooltipString','Open file',...
'CData', iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/opendoc.mat')),...
'HandleVisibility','on', ...
'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','on', ...
'Tag','PUSHTOOL_SAVE',...
'Enable', 'off',...
'ClickedCallback', @SaveMenuCallback);
hPrintFigPushtool = uipushtool(... % Open Save toolbar button
'Parent',hToolbar,...
'TooltipString','Print figures',...
'CData',iconRead( ...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'printdoc.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_PRINTFIG',...
'visible', 'on', 'Enable', 'on',...
'ClickedCallback', @PrintFigMenuCallback);
hZoomInToggletool = uitoggletool(... % Open Zoom In (increase) toolbar button
'Parent',hToolbar,...
'Separator', 'on', ...
'TooltipString','Zoom In (increase)',...
'CData', iconRead(fullfile(matlabroot,...
'Tag','PUSHTOOL_ZOOM_IN',...
'OnCallback', @ZoomIn_OnMenuCallback,...
'OffCallback', @ZoomIn_OffMenuCallback);
hZoomOutToggletool = uitoggletool(... % Open Zoom Out (decrease) toolbar button
'Parent',hToolbar,...
'Separator', 'on', ...
'TooltipString','Zoom Out (decrease)',...
'CData', iconRead(fullfile(matlabroot,...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_ZOOM_OUT',...
'OnCallback', @ZoomOut_OnMenuCallback,...
'OffCallback', @ZoomOut_OffMenuCallback);
hPanToggletool = uitoggletool(... % Open Pan toolbar button
'Parent',hToolbar,...
'TooltipString','Pan',...
'CData',iconRead(fullfile(matlabroot, ...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_PAN',...
'Enable', 'off',...
'OffCallback', @Pan_OffMenuCallback,...
'OnCallback', @Pan_OnMenuCallback);
hQCToggletool = uitoggletool(... % Open QC toolbar button
'Parent',hToolbar,...
'TooltipString','Validation codes',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'qcicon.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_QC',...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @QC_OffMenuCallback,...
'OnCallback', @QC_OnMenuCallback);
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
'Parent',hToolbar,...
'TooltipString','Select time limit',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'selecttime.mat']),...
'HandleVisibility','on', ...
'Tag', 'CORRECT_STARTTIME', ...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @SelectTime_OffMenuCallback,...
'OnCallback', @SelectTime_OnMenuCallback);
hMapToggletool = uitoggletool(... % Open Map toolbar button
'Parent',hToolbar,...
'TooltipString','Map and ship track',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'mapicon.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_MAP',...
'UserData', 'off', ...
'Enable', 'off',...
'OffCallback', @Map_OffMenuCallback,...
'OnCallback', @Map_OnMenuCallback);
hClimToggletool = uitoggletool(... % Open Climatology toolbar button
'Parent',hToolbar,...
'TooltipString','Climatology',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'climicon.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_CLIM',...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @Clim_OffMenuCallback,...
'OnCallback', @Clim_OnMenuCallback);
'Parent',hToolbar,...
'TooltipString','Calibration sensors',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'outils.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_CAL',...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @Cal_OffMenuCallback,...
'OnCallback', @Cal_OnMenuCallback);
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
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
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
'Parent',hToolbar,...
'TooltipString','Interpolate missing position',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'interp.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_INTERP',...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @Inter_OffMenuCallback,...
'OnCallback', @Inter_OnMenuCallback);
hBottleToggletool = uitoggletool(... % Correction module toolbar button
'Parent',hToolbar,...
'TooltipString','Correct the SSS TSG data',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'bottleicon.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_BOTTLE',...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @Bottle_OffMenuCallback,...
'OnCallback', @Bottle_OnMenuCallback);
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','on', ...
'Tag','PUSHTOOL_HEADER',...
'Enable', 'off',...
'ClickedCallback', @HeaderMenuCallback);
hReportPushtool = uipushtool(... % Open Report saving button
'Parent',hToolbar,...
'TooltipString','Save a report',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'reporticon.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_REPORT',...
'Enable', 'off',...
'ClickedCallback', @ReportMenuCallback);
%% Dynamic text area
% -----------------------------------------------------------------------
% Dynamic text area that displays the loaded filename, date, position and
% salinity, temperature
% ------------------------------------------------------------------------
% Create an uipanel
% -----------------
hInfoPanel = uipanel( ...
'Parent', hMainFig, ...
'Units', 'normalized', ...
'BorderType', 'none',...
'Visible', 'on', ...
'Position',[.01, .96, .98, .04]);
% Dynamic text area that displays the date
% ----------------------------------------
uicontrol(...
'Parent', hInfoPanel, ...
'Units', 'normalized', ...
'Style', 'Text', ...
'Fontsize', tsg.fontSize, ...
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.01, .25, .04, .6], ...
'String', 'File:');
hInfoFileText = uicontrol(...
'Parent', hInfoPanel, ...
'Style', 'text', ...
'Fontsize', tsg.fontSize, ...
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'No file loaded', ...
'Position', [.05, .25, .1, .6]);
% Text area that displays the date
% --------------------------------
uicontrol(...
'Parent', hInfoPanel, ...
'Units', 'normalized', ...
'Style', 'Text', ...
'Fontsize', tsg.fontSize, ...
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.15, .25, .04, .6], ...
'String', 'Date:');
hInfoDateText = uicontrol(...
'Parent', hInfoPanel, ...
'Style', 'text', ...
'Fontsize', tsg.fontSize, ...
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.20, .25, .13, .6]);
% Text area that displays the latitude
% ------------------------------------
uicontrol(...
'Parent', hInfoPanel, ...
'Units', 'normalized', ...
'Style', 'Text', ...
'Fontsize', tsg.fontSize, ...
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.33, .25, .06, .6], ...
'String', 'Latitude:');
hInfoLatText = uicontrol(...
'Parent', hInfoPanel, ...
'Style', 'text', ...
'Fontsize', tsg.fontSize, ...
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.4, .25, .9, .6]);
% Text area that displays the longitude
% -------------------------------------
uicontrol(...
'Parent', hInfoPanel, ...
'Units', 'normalized', ...
'Style', 'Text', ...
'Fontsize', tsg.fontSize, ...
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.495, .25, .08, .6], ...
'String', 'Longitude:');
hInfoLongText = uicontrol(...
'Parent', hInfoPanel, ...
'Style', 'text', ...
'Fontsize', tsg.fontSize, ...
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.585, .25, .09, .6]);
% Text area that display salinity and temperature
% -----------------------------------------------
uicontrol(...
'Parent', hInfoPanel, ...
'Units', 'normalized', ...
'Style', 'Text', ...
'Fontsize', tsg.fontSize, ...
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position', [.68, .25, .05, .6], ...
'String', 'SSPS:');
hInfoSSPSText = uicontrol(...
'Parent', hInfoPanel, ...
'Style', 'text', ...
'Fontsize', tsg.fontSize, ...
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.73, .25, .05, .6]);
uicontrol(...
'Parent', hInfoPanel, ...
'Units', 'normalized', ...
'Style', 'Text', ...
'Fontsize', tsg.fontSize, ...
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.785, .25, .05, .6], ...
'String', 'SSJT:');
hInfoSSJTText = uicontrol(...
'Parent', hInfoPanel, ...
'Style', 'text', ...
'Fontsize', tsg.fontSize, ...
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.835, .25, .05, .6]);
uicontrol(...
'Parent', hInfoPanel, ...
'Units', 'normalized', ...
'Style', 'Text', ...
'Fontsize', tsg.fontSize, ...
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.89, .25, .05, .6], ...
'String', 'SSTP:');
hInfoSSTPText = uicontrol(...
'Parent', hInfoPanel, ...
'Style', 'text', ...
'Fontsize', tsg.fontSize, ...
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.94, .25, .05, .6]);
%% Plot axes
% -----------------------------------------------------------------------
% The axes 1,2 and 3 will be plot in a uipanel
% axe 1 as propertie 'HandleVisibility' set to 'on' to prevent hidden
% visibility when first plot is empty
%--------------------------------------------------------------------
hPlotsPanel = uipanel( ...
'Parent', hMainFig, ...
'Units', 'normalized', ...
'BorderType', 'etchedin',...
'Visible', 'on',...
hPlotAxes(1) = axes( 'Parent', hPlotsPanel, 'Visible', 'off', ...
'box', 'on', 'Units', 'normalized','Tag', 'TAG_AXES_1', ...
'HandleVisibility','on', 'Position',[.05, .64, .93, .35]);
hPlotAxes(2) = axes( 'Parent', hPlotsPanel, 'Visible', 'off',...
'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_2', ...
'HandleVisibility','on', 'Position',[.05, .33, .93, .27]);
hPlotAxes(3) = axes('Parent', hPlotsPanel, 'Visible', 'off',...
'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_3', ...
'HandleVisibility','on', 'Position',[.05, .02, .93, .27]);
% ---------------------------------
% hMapPanel = uipanel( ...
% 'Parent', hMainFig, ...
% 'Units', 'normalized', ...
% 'Visible', 'off', ...
% 'Position',[0.15, 0, .85, .58]);
% The map will be plot a new figure
% ---------------------------------
'Name', 'TSG SHIP TRACK', ...
'NumberTitle', 'off', ...
'Resize', 'on', ...
'Toolbar', 'none', ...
'Tag', 'MAP_FIGURE', ...
'Visible','off',...
'WindowStyle', 'normal', ...
'CloseRequestFcn', @QuitMapCallback,...
'Units', 'normalized',...
'Position',[0.17, 0.05, .8, .44],...
'Color', get(0, 'DefaultUIControlBackgroundColor'));
hPlotAxes(4) = axes(... % the axes for plotting ship track map
'Units', 'normalized', ...
'Visible', 'off', ...
'Color', 'none', ...
'UserData', 'off', ...
'HandleVisibility','on', ...
'Position',[.05, .05, .9, .9]);
%% uipanel for Quality Control Buttons - uibutton group
% -----------------------------------------------------------------------
hbgQc = uibuttongroup(...
'Parent', hMainFig, ...
'Title', 'Validation Codes', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'tag', 'TAG_QC_DISPLAY_PANEL',...
'HandleVisibility','on',...
'Visible', 'off',...
'BorderType', 'etchedin',...
'Units', 'normalized', 'Position', [.0, .71, .15, .25]);
% Initialize CallBack for button group properties
% -----------------------------------------------
set(hbgQc,'SelectionChangeFcn',@RadiobuttonQc);
%% Context Menu and RadioButtons for Quality control
% -----------------------------------------------------------------------
hQcCmenu = uicontextmenu(...
'Parent', hMainFig, ...
'HandleVisibility','on' );
% get list of keys from hashtable tsg.qc.hash, defined inside
% tsg_initialisation.m
% -----------------------------------------------------------

jacques.grelet_ird.fr
committed
qc_list = keys(tsg.qc.hash);
% internal loop count with state to on
% ------------------------------------
count = 0;
% iterate (loop) on each key store inside hastable
% ------------------------------------------------

jacques.grelet_ird.fr
committed
for key = qc_list

jacques.grelet_ird.fr
committed
% get key and some values in hashtable tsg.qc.hash
% ------------------------------------------------
label = tsg.qc.hash.(key).label;
color = tsg.qc.hash.(key).color;
state = tsg.qc.hash.(key).state;
% construct context menu with only code set to 'on' (valid)
% ---------------------------------------------------------
if strcmp( state, 'on')
% add menu to hQcCmenu uicontextmenu
% ----------------------------------
uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','on', ...
'Label', label,...
'ForegroundColor', color,...
'Callback', {@Qc, key});
% add button QC to hbgQc uibuttongroup
% ------------------------------------
uicontrol(...
'Parent', hbgQc,...
'Style', 'radiobutton',...
'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...
'HorizontalAlignment', 'left', ...
'HandleVisibility','on', ...
'String', label,...

jacques.grelet_ird.fr
committed
'Tag', ['TAG_QC_RADIO_' char(key)], ...
'Units', 'normalized', 'Position', [.01, .85-count*.12, .6, 0.09]);
% add text QC display statistic on hQcPanel
% -----------------------------------------
uicontrol(...
'Parent', hbgQc,...
'Style', 'text',...
'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...
'HorizontalAlignment', 'right', ...
'HandleVisibility','on', ...
'String', 'N/A ',...

jacques.grelet_ird.fr
committed
'Tag', ['TAG_QC_TEXT_' char(key)],...
'Units', 'normalized', 'Position', [.61, .85-count*.12, .37, 0.09]);
% increment count
% ---------------
count = count + 1;
end
% --------------------------------------
hCorPanel = uipanel(...
'Parent', hMainFig, ...
'Title', 'Correction applied to ...', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'tag', 'TAG_CORRECTION_DISPLAY_PANEL',...
'HandleVisibility','on',...
'Visible', 'off',...
'BorderType', 'etchedin',...
gael.alory_legos.obs-mip.fr
committed
'Units', 'normalized', 'Position', [.0, .001, .15, .24]);
% internal loop count with state to on
% ------------------------------------
count = 0;
% iterate (loop) on each key store inside hastable
% ------------------------------------------------

jacques.grelet_ird.fr
committed
for key = qc_list

jacques.grelet_ird.fr
committed
% get key and some values in hashtable tsg.qc.hash
% ------------------------------------------------
label = tsg.qc.hash.(key).label;
color = tsg.qc.hash.(key).color;
state = tsg.qc.hash.(key).state;

jacques.grelet_ird.fr
committed
if strcmp(char(key), 'NO_CONTROL') || strcmp(char(key), 'GOOD') ||...
strcmp(char(key), 'PROBABLY_GOOD')
% construct context menu with only code set to 'on' (valid)
% ---------------------------------------------------------
if strcmp( state, 'on')
% add button QC to hbgQc uibuttongroup
cbCorr(i) = uicontrol(...
'Parent', hCorPanel, ...
'Style', 'checkbox', ...
'String', label, ...
'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...
'Value', value, ...

jacques.grelet_ird.fr
committed
'Tag', ['TAG_CHECK_CORRECTION_' char(key)], ...
'HandleVisibility', 'on',...
'Units', 'normalized', 'Position', [.01, .85-count*.12, .6, 0.09]);
% increment count
% ---------------
count = count + 1;
end
%% uibutton group panel - Choose the parameter (SSPS - SSTP - SSJT)
% POP_UP filled in with the function "initParameterChoice"
% -----------------------------------------------------------------------
hbgParameter = uibuttongroup(...
'Parent', hMainFig, ...
'Title', 'TSG Parameter', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'tag', 'TAG_PARA_DISPLAY_PANEL',...
'HandleVisibility','on',...
'Visible', 'off',...
'BorderType', 'etchedin',...
'Units', 'normalized', 'Position', [.0, .78, .15, .18]);
text= {'Validation - Top'; 'Middle plot'; 'Bottom plot'};
ybottom = [.7 .38 .05];
for ipmh= 1 : 3
pmhPara(ipmh) = uicontrol(...
'Parent', hbgParameter, 'Style', 'popupmenu', ...
'String', { 'NONE' }, 'Value', 1, ...
'HandleVisibility', handleVisibility, ...
'Callback', {@SelectParameter, ipmh}, ...
'Units', 'normalized', 'Position', [.01, ybottom(ipmh), .3, 0.25]);
htParameter(ipmh) = uicontrol( ...
'Parent', hbgParameter, 'Style', 'Text', ...
'String', text{ipmh}, ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.35, ybottom(ipmh), .6, 0.25]);
% Initialize CallBack for button group properties
% -----------------------------------------------
set(hbgParameter,'SelectionChangeFcn',@RadiobuttonParameter);
%% uiButtonGroup set to choose the Correction method
% -------------------------------------------------------------------------
% Create the button group
hbgCorMethod = uibuttongroup( ...
'Parent',hMainFig, ...
'Title','Correction Method', ...
'Units', 'normalized', ...
'FontSize',tsg.fontSize-1, 'Fontweight', 'bold',...
'Visible', 'off', ...
Yves Gouriou
committed
'Position',[.0, .24, .15, .29]);
gael.alory_legos.obs-mip.fr
committed
% Create 4 radio buttons in the button group
hrbCorCancel = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_CANCEL_PUSH', ...
Yves Gouriou
committed
'pos',[.05 .04 .9 .13],...
'HandleVisibility', handleVisibility, ...
'Callback', {@cancelCorrectionCallback,'total'});
hrbPartCorCancel = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'String',{'Cancel within Date Limits'},...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_PART_CANCEL_PUSH', ...
'pos',[.05 .19 .9 .13],...
'HandleVisibility', handleVisibility, ...
'Callback', {@cancelCorrectionCallback,'part'});
Yves Gouriou
committed
hrbCorBiais = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'String','Bias adjustment',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_BIAIS_PUSH', ...
'pos',[.05 .41 .9 .13],...
'HandleVisibility', handleVisibility, ...
gael.alory_legos.obs-mip.fr
committed
hrbCorGradient = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'String','Gradient adjustment',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_GRADIENT_PUSH', ...
Yves Gouriou
committed
'pos',[.05 .56 .9 .13],...
gael.alory_legos.obs-mip.fr
committed
'HandleVisibility', handleVisibility, ...
hrbCorLinear = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'String','Linear adjustment',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_LINEAR_PUSH', ...
Yves Gouriou
committed
'pos',[.05 .71 .9 .13], ...
'HandleVisibility', handleVisibility, ...
hrbCorMedian = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_MEDIAN_PUSH', ...
Yves Gouriou
committed
'pos',[.05 .86 .9 .13], ...
'HandleVisibility', handleVisibility, ...
%% uiPanel for the Date limits used in the Correction module
% Choose the date limits for the correction
% --------------------------------------------------
% Create the uipanel
hpDateLimit = uipanel( ...
'Parent', hMainFig, ...
'Title', 'Date Limits', ...
'Units', 'normalized', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'Visible', 'off', ...
Yves Gouriou
committed
'Position', [.0, .53, .15, .18]);
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
htDateMin = uicontrol( ...
'Parent', hpDateLimit, ...
'Style', 'Text', ...
'String', 'Min : yyyy-mm-dd hh:mm:ss', ...
'HorizontalAlignment', 'left', ...
'Units', 'normalized', ...
'FontSize', tsg.fontSize-1, ...
'Position',[.01 .8 .95 .15]);
hetDateMin = uicontrol( ...
'Parent', hpDateLimit, ...
'Style', 'edit', ...
'Units', 'normalized', ...
'BackgroundColor', 'white',...
'FontSize', tsg.fontSize, ...
'Tag', 'CORRECT_DATEMIN_EDIT',...
'Position',[.01 .6 .95 .17]);
htDateMax = uicontrol( ...
'Parent', hpDateLimit, ...
'Style', 'Text', ...
'String', 'Max : yyyy-mm-dd hh:mm:ss', ...
'HorizontalAlignment', 'left', ...
'Units', 'normalized', ...
'FontSize', tsg.fontSize-1, ...
'Position',[.01 .35 .95 .15]);
hetDateMax = uicontrol( ...
'Parent', hpDateLimit, ...
'Style', 'edit', ...
'Units', 'normalized', ...
'BackgroundColor', 'white',...
'FontSize', tsg.fontSize, ...
'Tag', 'CORRECT_DATEMAX_EDIT',...
'Position',[.01 .15 .95 .17]);
%% uiPanel for the Calibration coefficient used the Correction module
% Create the uipanel
hpCalCoef = uipanel( ...
'Parent', hMainFig, ...
'Title', 'Calibration', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'Visible', 'off', ...
'Units', 'normalized','Position', [.0, .46, .15, .50]);
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
htCalCNDC1 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'Conductivity : C = A*C + B', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .925 .95 .05]);
htCalCNDC2 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'A', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .85 .08 .05]);
hetCalCNDCSlope = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'edit', ...
'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
'Tag', 'CORRECT_CAL_CNDC_A',...
'HandleVisibility','on', ...
'Units', 'normalized', 'Position',[.1 .85 .85 .05]);
htCalCNDC3 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'B', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .775 .08 .05]);
hetCalCNDCOffset = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'edit', ...
'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
'HandleVisibility','on', ...
'Tag', 'CORRECT_CAL_CNDC_B',...
'Units', 'normalized', 'Position',[.1 .775 .85 .05]);
htCalSSJT1 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'SSJT : T = A*T + B', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .675 .95 .05]);
htCalSSJT2 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'A', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .6 .08 .05]);
hetCalSSJTSlope = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'edit', ...
'BackgroundColor', 'white',...
'FontSize', tsg.fontSize, ...
'HandleVisibility','on', ...
'Tag', 'CORRECT_CAL_SSJT_A',...
'Units', 'normalized', 'Position',[.1 .6 .85 .05]);
htCalSSJT3 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'B', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .525 .08 .05]);
hetCalSSJTOffset = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'edit', ...
'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
'HandleVisibility','on', ...
'Tag', 'CORRECT_CAL_SSJT_B',...
'Units', 'normalized', 'Position',[.1 .525 .85 .05]);
htCalSSTP1 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'SSPT : T = A*T + B', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .425 .95 .05]);
htCalSSTP2 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'A', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .35 .08 .05]);
hetCalSSTPSlope = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'edit', ...
'BackgroundColor', 'white',...
'FontSize', tsg.fontSize, ...
'HandleVisibility','on', ...
'Tag', 'CORRECT_CAL_SSJT_A',...
'Units', 'normalized', 'Position',[.1 .35 .85 .05]);
htCalSSTP3 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'B', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .275 .08 .05]);
hetCalSSTPOffset = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'edit', ...
'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
'HandleVisibility','on', ...
'Tag', 'CORRECT_CAL_SSJT_B',...
'Units', 'normalized', 'Position',[.1 .275 .85 .05]);
hrbCal = uicontrol( ...
'Style','pushbutton', 'Parent',hpCalCoef, ...
'String','Calibrate',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_CAL_PUSH', ...
'Units', 'normalized','pos',[.05 .15 .9 .075], ...
'HandleVisibility', handleVisibility, ...
'Callback', @CalibrateCallback);
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
'Style','pushbutton', 'Parent',hpCalCoef, ...
'String','Cancel calibration',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_CAL_PUSH', ...
'Units', 'normalized','pos',[.05 .05 .9 .075], ...
'HandleVisibility', handleVisibility, ...
'Callback', @CancelCalibrationCallback);
%% uiPanel for Interpolation of position
% Create the uipanel
hpInterpPos = uipanel( ...
'Parent', hMainFig, ...
'Title', 'Lat-Lon interpolation', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'Visible', 'off', ...
'Units', 'normalized','Position', [.0, .75, .15, .21]);
hrbInterpLinear = uicontrol( ...
'Style','pushbutton', 'Parent',hpInterpPos, ...
'String','Linear interpolation',...
'FontSize',tsg.fontSize-1,...
'Tag', 'TAG_PUSH_INTERP_LINEAR', ...
'Units', 'normalized','pos',[.05 .65 .9 .25], ...
'HandleVisibility', handleVisibility, ...
'Callback', @InterpPosLinearCallback);
hrbInterpOther = uicontrol( ...
'Style','pushbutton', 'Parent',hpInterpPos, ...
'String','Other method',...
'FontSize',tsg.fontSize-1,...
'Tag', 'TAG_PUSH_INTERP_OTHER', ...
'Units', 'normalized','pos',[.05 .35 .9 .25], ...
'HandleVisibility', handleVisibility, ...
'Callback', @InterpPosOtherCallback);
hrbInterpCancel = uicontrol( ...
'Style','pushbutton', 'Parent',hpInterpPos, ...
'String','Cancel interpolation',...
'FontSize',tsg.fontSize-1,...
'Tag', 'TAG_PUSH_INTERP_CANCEL', ...
'Units', 'normalized','pos',[.05 .05 .9 .25], ...
'HandleVisibility', handleVisibility, ...
'Callback', @InterpPosCancelCallback);
%
% end of main function (GUI definition)
%
%% *************************** CALLBACKS **********************************
%----------------------------------------------------------------------
%% OpenMenuCallback function run when the Open menu item is selected
%----------------------------------------------------------------------
function OpenMenuCallback(hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'off' );
set( hpDateLimit, 'Visible', 'off' );
set( hpInterpPos, 'Visible', 'off' );
% set( hMapFig, 'Visible', 'off' );
% set( hbgParameter, 'Visible', 'off');
% Toggle button
% -------------
set( hBottleToggletool, 'state', 'off' );
set( hCalToggletool, 'state', 'off' );
set( hClimToggletool, 'state', 'off' );
set( hInterpToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
% Open standard dialog box for retrieving files
% ---------------------------------------------
[fileName, pathname, filterIndex] = uigetfile( ...
Yves Gouriou
committed
{'*.arg';'*.ast';'*.btl';'*.lbv';'*.nc';'*.ora';'*.sdf';'*.spl';'*.transmit*'; '*.tsgqc';'*.xml'}, 'Pick a file');
% flushes the event queue and updates the closed uigetfile window
% ---------------------------------------------------------------
drawnow;
% if the user clicks the Cancel button or closes the dialog window,
% FileName and PathName are set to 0.
% -----------------------------------------------------------------
if ~isequal(fileName, 0)
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
% construct valid and full file path
% -----------------------------------
fullFileName = strcat(pathname, fileName);
% Read the data
% -------------
errTsg = -2;
errSpl = -2;
switch filterIndex
Yves Gouriou
committed
case 1 % Read Argo file *.arg (G. Reverdin format)
Yves Gouriou
committed
errSpl = readArgoLocean( hMainFig, fullFileName );
msgbox('Load a TSG file before a Water sample file', 'Read Bucket');
end
Yves Gouriou
committed
case 2 % read TSG Astrolabe text file *.ast
tsg_initialisation(hMainFig);
errTsg = readTsgDataAstrolabe( hMainFig, fullFileName);
Yves Gouriou
committed
case 3 % read bucket file *.btl
Yves Gouriou
committed
errSpl = readAsciiSample( hMainFig, fullFileName, 'WS');
msgbox('Load a TSG file before a Water sample file', 'Read Bucket');
Yves Gouriou
committed
case 4 % read TSG labview file *.lbv
tsg_initialisation(hMainFig);
Yves Gouriou
committed
errTsg = readTsgDataLabview( hMainFig, fullFileName );
Yves Gouriou
committed
case 5 % read TSG netcdf file *.nc
gael.alory_legos.obs-mip.fr
committed
tsg_initialisation(hMainFig);
Yves Gouriou
committed
errTsg = readTsgDataNetCDF( hMainFig, fullFileName );
gael.alory_legos.obs-mip.fr
committed
Yves Gouriou
committed
case 6 % read TSG Oracle text file *.ora
tsg_initialisation(hMainFig);
Yves Gouriou
committed
errTsg = readTsgDataOracle( hMainFig, fullFileName);
case 7 % read TSG SDF file *.sdf
tsg_initialisation(hMainFig);
errTsg = readTsgDataSDF( hMainFig, fullFileName );
case 8 % Read Sample file *.spl
if ~isempty( tsg.SSPS )
errSpl = readAsciiSample( hMainFig, fullFileName, 'SPL');
else
msgbox('Load a TSG file before a Water sample file', 'Read Bucket');
end
Yves Gouriou
committed
case 9 % read TSG Nuka transmit file *.transmit*
gael.alory_legos.obs-mip.fr
committed
tsg_initialisation(hMainFig);
errTsg = readTsgDataNuka( hMainFig, fullFileName);
Yves Gouriou
committed
case 10 % read TSG text file *.tsgqc
gael.alory_legos.obs-mip.fr
committed
tsg_initialisation(hMainFig);
Yves Gouriou
committed
errTsg = readAsciiTsg( hMainFig, fullFileName);
case 11 % read TSG XML file *.xml
tsg_initialisation(hMainFig);
errTsg = readTsgDataXML( hMainFig, fullFileName );
gael.alory_legos.obs-mip.fr
committed
% Reset pointer to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
% diplay warning msgbox
% ---------------------
msgbox( {['Invalid TSG file: ' fileName],...
'Please select another file'},...
'Warning open file', 'warn', 'modal' );
% Get the tsg structure
% ---------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Keep the pathname of the tsgqc m_file
% -------------------------------------
tsgqcname = mfilename;
fulltsgqcname = mfilename('fullpath');
tsg.DEFAULT_PATH_FILE = strrep(fulltsgqcname, tsgqcname, '') ;
setappdata( hMainFig, 'tsg_data', tsg);
% A TSG file has been read
% ------------------------
if errTsg > 0
% set WindowButtonMotionFcn on
% ----------------------------
set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
% A TSG file has been open and read
% ---------------------------------
set( hOpenMenu, 'UserData', 'on' );
% enable toolbar menu pushtool
% ----------------------------
hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
set(hdl_pushtool, 'Enable', 'on');
% Enable Save and Export menu
% ---------------------------
set(hSaveMenu, 'Enable', 'on');
set(hExportMenu, 'Enable', 'on');
set(hQCMenu, 'Enable', 'on');
% update some fields in tsg structure and restore tsg
% ---------------------------------------------------
updateTsgStruct(hMainFig );
tsg = getappdata( hMainFig, 'tsg_data');
% update the filename display
% ---------------------------
set( hInfoFileText, 'String', strcat(tsg.file.name, tsg.file.ext));
% The callback to detect the mouse motion can be set to on
% --------------------------------------------------------
set( hMainFig, 'UserData', 'ButtonMotionOn');
% Update QC statistics
% --------------------
display_QC( hMainFig );
% Initialise the popupmenu displaying the parameters that can be
% plot
% --------------------------------------------------------------
initParameterChoice( hMainFig, pmhPara );
tsg = getappdata( hMainFig, 'tsg_data');
% Test if there is records with the same date and time.
% very simple test made because of a bug in the acquisition
% software used on IRD VOS
% ---------------------------------------------------------
testDoubleDate(hMainFig);
% Problem to read the file or
% Choice of parameters for Labview file canceled by the user
% Disable toolbar menu pushtool except the open file button
% ----------------------------------------------------------
hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
set(hdl_pushtool, 'Enable', 'off');
set( hOpenPushtool, 'Enable', 'on' );
end %if errTsg > 0
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
if errTsg == 1 || errSpl == 1
% Draw the 3 plots of the validation figure
% The plots need to be re-initialize because of a bug with
% the zoom function. When you open a new TSG file and you
% have used the zoom funtion with the preceding file.
% The zoom function keep the X and Y limits of the preceding file
% ---------------------------------------------------------------
delete( hPlotAxes(1) );
delete( hPlotAxes(2) );
delete( hPlotAxes(3) );
hPlotAxes(1) = axes( 'Parent', hPlotsPanel, 'Visible', 'off', ...
'box', 'on', 'Units', 'normalized','Tag', 'TAG_AXES_1', ...
'HandleVisibility','on', 'Position',[.05, .64, .93, .35]);
hPlotAxes(2) = axes( 'Parent', hPlotsPanel, 'Visible', 'off',...
'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_2', ...
'HandleVisibility','on', 'Position',[.05, .33, .93, .27]);
hPlotAxes(3) = axes('Parent', hPlotsPanel, 'Visible', 'off',...
'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_3', ...
'HandleVisibility','on', 'Position',[.05, .02, .93, .27]);
resetAxes( hMainFig, hPlotAxes )
plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );
set( hMapFig, 'Name', tsg.file.name);
% Update the map if already displayed
% -----------------------------------
if strcmp( get(hMapFig,'visible'), 'on') == 1
erase_Line( hPlotAxes, 4 );
plot_map( hMainFig, hPlotAxes);
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
end
%% Inter_OnMenuCallback ................................... Interpolation
%----------------------------------------------------------------------
% Callback function run when
%
function Inter_OnMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpDateLimit, 'Visible', 'on' );
set( hpInterpPos, 'Visible', 'on' );
set( hpCalCoef, 'Visible', 'off');
set( hbgQc, 'Visible', 'off');
set( hbgParameter, 'Visible', 'off');
% Toggle button
% -------------
set( hBottleToggletool, 'state', 'off', 'enable', 'off');
set( hCalToggletool, 'state', 'off', 'enable', 'off');
set( hClimToggletool, 'state', 'off', 'enable', 'off');
set( hPanToggletool, 'state', 'off', 'enable', 'on' );
set( hQCToggletool, 'enable', 'off');
set( hTimelimitToggletool, 'state', 'off', 'enable', 'on' );
set( hZoomInToggletool, 'state', 'off', 'enable', 'on' );
set( hZoomOutToggletool, 'state', 'off', 'enable', 'on' );
set( hHeaderPushtool, 'enable', 'off' );
% Get application data TSG
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Get the information on time limits of the time series
% Write them in the uipanel
% -----------------------------------------------------
noNaN = tsg.DAYD(~isnan( tsg.DAYD ));
set( hetDateMin, 'String', datestr(noNaN(1), 31));
set( hetDateMax, 'String', datestr(noNaN(end), 31));
% Draw the 3 plots of the interpolation figure
% --------------------------------------------
plot_Interpolation( hMainFig, hPlotAxes, 1 );
plot_Interpolation( hMainFig, hPlotAxes, 2 );
plot_Interpolation( hMainFig, hPlotAxes, 3 );
end
%% Inter_OffMenuCallback .................................. Interpolation
%----------------------------------------------------------------------
% Callback function run when
%
function Inter_OffMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'off' );
set( hpDateLimit, 'Visible', 'off' );
set( hpInterpPos, 'Visible', 'off' );
set( hbgParameter, 'Visible', 'on' );
% Enable Pushbuttons
% ------------------
set( hBottleToggletool, 'state', 'off', 'enable', 'on' );
set( hCalToggletool, 'state', 'off', 'enable', 'on' );
set( hClimToggletool, 'state', 'off', 'enable', 'on' );
set( hPanToggletool, 'state', 'off', 'enable', 'on' );
set( hQCToggletool, 'state', 'off', 'enable', 'on' );
set( hTimelimitToggletool, 'state', 'off', 'enable', 'off' );
set( hZoomInToggletool, 'state', 'off', 'enable', 'on' );
set( hZoomOutToggletool, 'state', 'off', 'enable', 'on' );
set( hHeaderPushtool, 'enable', 'on' );
% Get tsg structure
% -----------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );
% Set the pointer
% ---------------
set( hMainFig, 'Pointer', 'arrow');
end
%% InterpLinearCallback ...............................Interpolation Linear
%------------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function InterpPosLinearCallback( hObject, eventdata)
% Get the time limits for the correction A TESTER
% --------------------------------------
dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
error = interpPosLinear( hMainFig, dateMin, dateMax );
switch error
case 1
% Plot in the 3 axes
% ------------------
plot_Interpolation( hMainFig, hPlotAxes, 2 );
plot_Interpolation( hMainFig, hPlotAxes, 3 );
case -1
msgbox( 'Date limits are not correct',...
'Correction module', 'warn', 'modal');
end
end
%% InterpOtherCallback ...............................Interpolation OTher
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function InterpPosOtherCallback( hObject, eventdata)
msgbox( 'Method not yet implemented', ...
'Function InterpOtherCallback', ...
'warn',...
'modal' );
end
%% InterpPosCancelCallback ..........................Cancel Interpolation
%----------------------------------------------------------------------
function InterpPosCancelCallback(hObject, eventdata)
% Callback function run when
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Get NO_CONTROL and INTERPOLATED_VALUE codes
% -------------------------------------------

jacques.grelet_ird.fr
committed
NO_CONTROL = tsg.qc.hash.NO_CONTROL.code;
INTERPOLATED_VALUE = tsg.qc.hash.INTERPOLATED_VALUE.code;
if ~isempty( tsg.POSITION_QC )
iINTERP = find( tsg.POSITION_QC == INTERPOLATED_VALUE);
tsg.LATX( iINTERP ) = NaN * ones( size( iINTERP), 1 );
tsg.LONX( iINTERP ) = NaN * ones( size( iINTERP), 1 );
tsg.POSITION_QC = [];
end
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Refresh plots
% -------------
plot_Interpolation( hMainFig, hPlotAxes, 1 );
plot_Interpolation( hMainFig, hPlotAxes, 2 );
plot_Interpolation( hMainFig, hPlotAxes, 3 );
end
%% Cal_OnMenuCallback ..................................... Calibration
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function Cal_OnMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'on' );
set( hbgParameter, 'Visible', 'off');
set( hbgQc, 'Visible', 'off');
% Pushbutton
% ----------
set( hQCToggletool, 'enable', 'off' );
set( hClimToggletool, 'enable', 'off', 'state', 'off' );
set( hBottleToggletool, 'enable', 'off' );
set( hInterpToggletool, 'enable', 'off' );
set( hHeaderPushtool, 'enable', 'off' );
set( hPanToggletool, 'state', 'off', 'enable', 'on' );
set( hTimelimitToggletool, 'state', 'off', 'enable', 'off' );
set( hZoomInToggletool, 'state', 'off', 'enable', 'on' );
set( hZoomOutToggletool, 'state', 'off', 'enable', 'on' );
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );

jacques.grelet_ird.fr
committed
% find SLOPE (A) and OFFSET (B) indices in _LINCOEF_CONV array
% ------------------------------------------------------------
A_CNDC = strmatch('SLOPE', tsg.CNDC_LINCOEF_CONV);
B_CNDC = strmatch('OFFSET',tsg.CNDC_LINCOEF_CONV);
A_SSJT = strmatch('SLOPE', tsg.SSJT_LINCOEF_CONV);
B_SSJT = strmatch('OFFSET',tsg.SSJT_LINCOEF_CONV);
A_SSTP = strmatch('SLOPE', tsg.SSTP_LINCOEF_CONV);
B_SSTP = strmatch('OFFSET',tsg.SSTP_LINCOEF_CONV);
% Write the Cal Coef in the Editable uicontrol
% --------------------------------------------

jacques.grelet_ird.fr
committed
set( hetCalCNDCSlope, 'String', num2str(tsg.CNDC_LINCOEF(A_CNDC)));
set( hetCalCNDCOffset, 'String', num2str(tsg.CNDC_LINCOEF(B_CNDC)));

jacques.grelet_ird.fr
committed
set( hetCalSSJTSlope, 'String', num2str(tsg.SSJT_LINCOEF(A_SSJT)));
set( hetCalSSJTOffset, 'String', num2str(tsg.SSJT_LINCOEF(B_SSJT)));
set( hetCalSSTPSlope, 'String', num2str(tsg.SSTP_LINCOEF(A_SSTP)));
set( hetCalSSTPOffset, 'String', num2str(tsg.SSTP_LINCOEF(B_SSTP)));
% Intermediate variables
% ----------------------

jacques.grelet_ird.fr
committed
tsg.CNDC_LINCOEF_NEW(A_CNDC) = str2num(get( hetCalCNDCSlope, 'String'));
tsg.CNDC_LINCOEF_NEW(B_CNDC) = str2num(get( hetCalCNDCOffset, 'String'));
tsg.SSJT_LINCOEF_NEW(A_SSJT) = str2num(get( hetCalSSJTSlope, 'String'));
tsg.SSJT_LINCOEF_NEW(B_SSJT) = str2num(get( hetCalSSJTOffset, 'String'));
tsg.SSTP_LINCOEF_NEW(A_SSTP) = str2num(get( hetCalSSTPSlope, 'String'));
tsg.SSTP_LINCOEF_NEW(B_SSTP) = str2num(get( hetCalSSTPOffset, 'String'));
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
end
%% Cal_OffMenuCallback ..................................... Calibration
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function Cal_OffMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'off' );
set( hbgParameter, 'Visible', 'on');
% Enable Pushbuttons
% ------------------
set( hClimToggletool, 'enable', 'on' );
set( hBottleToggletool, 'enable', 'on' );
set( hInterpToggletool, 'enable', 'on' );
set( hHeaderPushtool, 'enable', 'on' );
set( hQCToggletool, 'state', 'off', 'enable', 'on' );
set( hPanToggletool, 'state', 'off', 'enable', 'on' );
set( hTimelimitToggletool, 'state', 'off', 'enable', 'on' );
set( hZoomInToggletool, 'state', 'off', 'enable', 'on' );
set( hZoomOutToggletool, 'state', 'off', 'enable', 'on' );
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );

jacques.grelet_ird.fr
committed
% find SLOPE (A) and OFFSET (B) indices in _LINCOEF_CONV array
% ------------------------------------------------------------
A_CNDC = strmatch('SLOPE', tsg.CNDC_LINCOEF_CONV);
B_CNDC = strmatch('OFFSET',tsg.CNDC_LINCOEF_CONV);
A_SSJT = strmatch('SLOPE', tsg.SSJT_LINCOEF_CONV);
B_SSJT = strmatch('OFFSET',tsg.SSJT_LINCOEF_CONV);
A_SSTP = strmatch('SLOPE', tsg.SSTP_LINCOEF_CONV);
B_SSTP = strmatch('OFFSET',tsg.SSTP_LINCOEF_CONV);
% Save the calibration coefficient
% --------------------------------

jacques.grelet_ird.fr
committed
tsg.CNDC_LINCOEF(A_CNDC) = tsg.CNDC_LINCOEF_NEW(A_CNDC);
tsg.CNDC_LINCOEF(B_CNDC) = tsg.CNDC_LINCOEF_NEW(B_CNDC);
tsg.SSJT_LINCOEF(A_SSJT) = tsg.SSJT_LINCOEF_NEW(A_SSJT);
tsg.SSJT_LINCOEF(B_SSJT) = tsg.SSJT_LINCOEF_NEW(B_SSJT);
tsg.SSTP_LINCOEF(A_SSTP) = tsg.SSTP_LINCOEF_NEW(A_SSTP);
tsg.SSTP_LINCOEF(B_SSTP) = tsg.SSTP_LINCOEF_NEW(B_SSTP);
tsg.CNDC_LINCOEF_NEW = [];
tsg.SSJT_LINCOEF_NEW = [];
tsg.SSTP_LINCOEF_NEW = [];
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );
end
%% CalibrateCallback .......................................... Calibration
function CalibrateCallback(hObject, eventdata)
% Callback function run when
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );

jacques.grelet_ird.fr
committed
% find SLOPE (A) and OFFSET (B) indices in _LINCOEF_CONV array
% ------------------------------------------------------------
A_CNDC = strmatch('SLOPE', tsg.CNDC_LINCOEF_CONV);
B_CNDC = strmatch('OFFSET',tsg.CNDC_LINCOEF_CONV);
A_SSJT = strmatch('SLOPE', tsg.SSJT_LINCOEF_CONV);
B_SSJT = strmatch('OFFSET',tsg.SSJT_LINCOEF_CONV);
A_SSTP = strmatch('SLOPE', tsg.SSTP_LINCOEF_CONV);
B_SSTP = strmatch('OFFSET',tsg.SSTP_LINCOEF_CONV);
% They will be used in the function calibration
% ---------------------------------------------

jacques.grelet_ird.fr
committed
tsg.CNDC_LINCOEF_NEW(A_CNDC) = str2num(get( hetCalCNDCSlope, 'String'));
tsg.CNDC_LINCOEF_NEW(B_CNDC) = str2num(get( hetCalCNDCOffset, 'String'));
tsg.SSJT_LINCOEF_NEW(A_SSJT) = str2num(get( hetCalSSJTSlope, 'String'));
tsg.SSJT_LINCOEF_NEW(B_SSJT) = str2num(get( hetCalSSJTOffset, 'String'));
tsg.SSTP_LINCOEF_NEW(A_SSTP) = str2num(get( hetCalSSTPSlope, 'String'));
tsg.SSTP_LINCOEF_NEW(B_SSTP) = str2num(get( hetCalSSTPOffset, 'String'));
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Calibrate the sensors
% ---------------------
calibration( hMainFig );
% Update the Adjusted variables (SSPS - SSJT) with calibrated records
% -------------------------------------------------------------------
% Refresh plot #1
% ---------------
plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );
% As soon as a modification took place the data should be saved
% -------------------------------------------------------------
set( hSaveMenu, 'UserData', 'on' );
end
%% CancelCalibrationCallback .................................. Calibration
function CancelCalibrationCallback(hObject, eventdata)
% Callback function run when
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Emptied the CAL variables
% -------------------------
tsg.CNDC_CAL = [];
tsg.SSPS_CAL = [];
tsg.SSJT_CAL = [];
tsg.SSTP_CAL = [];
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );

jacques.grelet_ird.fr
committed
% find SLOPE (A) and OFFSET (B) indices in _LINCOEF_CONV array
% ------------------------------------------------------------
A_CNDC = strmatch('SLOPE', tsg.CNDC_LINCOEF_CONV);
B_CNDC = strmatch('OFFSET',tsg.CNDC_LINCOEF_CONV);
A_SSJT = strmatch('SLOPE', tsg.SSJT_LINCOEF_CONV);
B_SSJT = strmatch('OFFSET',tsg.SSJT_LINCOEF_CONV);
A_SSTP = strmatch('SLOPE', tsg.SSTP_LINCOEF_CONV);
B_SSTP = strmatch('OFFSET',tsg.SSTP_LINCOEF_CONV);
% Write the Cal Coef in the Editable uicontrol
% --------------------------------------------

jacques.grelet_ird.fr
committed
set( hetCalCNDCSlope, 'String', num2str(tsg.CNDC_LINCOEF(A_CNDC)));
set( hetCalCNDCOffset, 'String', num2str(tsg.CNDC_LINCOEF(B_CNDC)));
set( hetCalSSJTSlope, 'String', num2str(tsg.SSJT_LINCOEF(A_SSJT)));
set( hetCalSSJTOffset, 'String', num2str(tsg.SSJT_LINCOEF(B_SSJT)));
set( hetCalSSTPSlope, 'String', num2str(tsg.SSTP_LINCOEF(A_SSTP)));
set( hetCalSSTPOffset, 'String', num2str(tsg.SSTP_LINCOEF(B_SSTP)));
% Refresh plot #1
% ---------------
plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );
% As soon as a modification took place the data should be saved
% -------------------------------------------------------------
set( hSaveMenu, 'UserData', 'on' );
end
%% ZoomIn_OnMenuCallback
%----------------------------------------------------------------------
% Callback function run when the toolbar zoom in (increase) push button
% is pressed
%----------------------------------------------------------------------
function ZoomIn_OnMenuCallback(hObject, eventdata)
% Desactivate some toggle buttons, hZoomOutToggletool changed state
% must be call before zoom function because the callback set zoom to
% off
% -------------------------------------------------------------------
set( hZoomOutToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
% Hide the map. Otherwise it slows down the zooming
% -------------------------------------------------
% returns a zoom mode object for the figure hMainFig handle
% ---------------------------------------------------------
% Turns off the automatic adaptation of date ticks
% ------------------------------------------------
zoomAdaptiveDateTicks('off');
% turns interactive zooming to in (increase)
% ------------------------------------------
set(hZoom, 'direction', 'in');
% Disallows a zoom operation on the MAP axes objects
% --------------------------------------------------
% turns on interactive zooming (same effect than zoom on) but prevent
% side effect on another figure
% -------------------------------------------------------------------
set(hZoom, 'enable', 'on');
% Set this callback to listen to when a zoom operation finishes
% must be call after enable zoom (bug ?)
% -------------------------------------------------------------
set(hZoom, 'ActionPostCallback', @ZoomPan_PostCallback);
end
%% ZoomIn_OffMenuCallback
%----------------------------------------------------------------------
% Callback function run when the toolbar zoom in (increase) push button
% is pressed
%----------------------------------------------------------------------
function ZoomIn_OffMenuCallback(hObject, eventdata)
% disable zoom mode
% -----------------
zoom off;
end
%% ZoomOut_OnMenuCallback
%------------------------------------------------------------------------
% Callback function run when the toolbar zoom out (descrease) push button
% is pressed
%------------------------------------------------------------------------
function ZoomOut_OnMenuCallback(hObject, eventdata)
% Desactivate Zoom In Toggle toggle button
% -----------------------------------------
set( hZoomInToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
% Hide the map. Otherwise it slows down the zooming
% -------------------------------------------------
% returns a zoom mode object for the figure hMainFig handle
% ---------------------------------------------------------
hZoom = zoom(hMainFig);
% turns interactive zooming out (decrease)
% ----------------------------------------
set(hZoom, 'direction', 'out');
% Disallows a zoom operation on the MAP axes objects
% --------------------------------------------------
% turns on interactive zooming (same effect than zoom on) but prevent
% side effect on another figure
% -------------------------------------------------------------------
set(hZoom, 'enable', 'on');
% Set this callback to listen to when a zoom operation finishes
% -------------------------------------------------------------
set(hZoom, 'ActionPostCallback', @ZoomPan_PostCallback);
end
%% ZoomOut_OffMenuCallback
%------------------------------------------------------------------------
% Callback function run when the toolbar zoom out (descrease) push button
% is pressed
%------------------------------------------------------------------------
function ZoomOut_OffMenuCallback(hObject, eventdata)
% turns interactive zooming off
% -----------------------------
zoom off;
% cursor back to normal, test if it's really necessery
% -----------------------------------------------------
%set(hMainFig, 'Pointer', 'arrow');
%----------------------------------------------------------------------
% Callback function run when the pan toggle toolbar is selected
%----------------------------------------------------------------------
function Pan_OnMenuCallback(hObject, eventdata)
% Desactivate some toggle buttons
% -------------------------------
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
set( hZoomInToggletool, 'state', 'off' );
set( hZoomOutToggletool, 'state', 'off' );
% Hide the map. Otherwise it slows down the panning
% -------------------------------------------------
% Returns a pan mode object for the figure handle
% -----------------------------------------------
hPan = pan(hMainFig);
% Disallows a pan operation on the MAP axes objects
% --------------------------------------------------
% turns on interactive pan (same effect than pan on) but prevent
% side effect on another figure
% --------------------------------------------------------------
set(hPan, 'enable', 'on');
% Set this callback to listen to when a zoom operation finishes
% must be call after enable zoom (bug ?)
% -------------------------------------------------------------
set(hPan, 'ActionPostCallback', @ZoomPan_PostCallback);
%----------------------------------------------------------------------
% Callback function run when the pan toggle toolbar is released
%----------------------------------------------------------------------
function Pan_OffMenuCallback(hObject, eventdata)
% turns interactive pan off
% -------------------------
pan off;
% cursor back to normal, test if it's really necessery
% -----------------------------------------------------
%set(hMainFig, 'Pointer', 'arrow');
end
%% ZoomPan_PostCallback
%------------------------------------------------------------------------
% Callback function run when zoom or pan action finishes: redraw axes
%------------------------------------------------------------------------
function ZoomPan_PostCallback(hObject, eventdata)
% Set the right limit and interval to the 3 axes
% ----------------------------------------------
for iaxe = 1:3
set(hPlotAxes(iaxe), 'XTickMode', 'auto')
datetick(hPlotAxes(iaxe), 'x', 'keeplimits')
end
% ----------------------------------------
if strcmp( get(hMapFig,'visible'), 'on') == 1
erase_Line( hPlotAxes, 4 );
plot_map( hMainFig, hPlotAxes);
end
Yves Gouriou
committed
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
%% QCMenuCallback
%----------------------------------------------------------------------
% Callback function run when the Automatic QC menu item is selected
%
% Si vous modiifer ce CallBack verifier les modifications a apporter a
% 1 - preferenceForm.m
% 2 - tsg_preference.m
%----------------------------------------------------------------------
function QCMenuCallback(hObject, eventdata, test)
switch test
case 'Speed'
minSpeedQC(hMainFig)
case 'Flow'
minFlowQC(hMainFig)
case 'Press'
minPressQC(hMainFig)
case 'SSPSmin'
minSSPSQC(hMainFig)
case 'SSPSmax'
maxSSPSQC(hMainFig)
case 'SSJTmin'
minSSJTQC(hMainFig)
case 'SSJTmax'
maxSSJTQC(hMainFig)
Yves Gouriou
committed
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
case 'SSTPmin'
minSSTPQC(hMainFig)
case 'SSTPmax'
maxSSTPQC(hMainFig)
otherwise
msgbox('QCMenuCallback : erreur', 'QCMenuCallback','error', 'modal');
end
% --------------------------
% refresh QC statistic panel
% --------------------------
display_QC( hMainFig );
% ------------------
% Refresh the plots
%-------------------
% Get the parameter displayed on plot number 1 : figure at the top
% -----------------------------------------------------------------
PARA = getParaCorModule( hMainFig );
% Draw plot 1
% -----------
plot_Validation( hMainFig, hPlotAxes, 1, PARA{1} );
% Update the map if already displayed
% -----------------------------------
if strcmp( get(hMapFig,'visible'), 'on') == 1
erase_Line( hPlotAxes, 4 );
plot_map( hMainFig, hPlotAxes);
end
end
%% QC_OnMenuCallback ............................... Quality Control Module
%----------------------------------------------------------------------
% Callback function run when the QC toggle tool is pressed
%----------------------------------------------------------------------
function QC_OnMenuCallback(gcbo, eventdata)
% Make the QC code uipanel visible
% --------------------------------
set( hbgQc, 'Visible' ,'on');
set( hbgParameter, 'Visible', 'off');
% Desactivate toggletools.
% ------------------------
set( hZoomInToggletool, 'state', 'off', 'enable', 'on' );
set( hZoomOutToggletool, 'state', 'off', 'enable', 'on' );
set( hPanToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
set( hCalToggletool, 'state', 'off', 'enable', 'off' );
set( hInterpToggletool, 'state', 'off', 'enable', 'off' );
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
PARA = getParaCorModule( hMainFig );
% refresh QC statistic panel
% --------------------------
display_QC( hMainFig );
% Activate right clic context menu on first axes (salinity)
% ---------------------------------------------------------
set(hPlotAxes(1),'UIContextMenu', hQcCmenu);
% Activate clic mouse menu on first axes (salinity) for next rbbox
% ----------------------------------------------------------------
set(hPlotAxes(1),'ButtonDownFcn', @QC_SelectCallback);
% change cursor to crosshair aspect
% ---------------------------------
set( hMainFig, 'Pointer', 'crosshair');
% -------------------------------------------------------------
% nested function on mouse clic when QC toggle tool is selected
% -------------------------------------------------------------
function QC_SelectCallback(gcbo, eventdata)
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
% disable ButtonMotion on main fig during select
% prevent drawing to map
% ----------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', []);
% 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
% The following code is only executed if the left mouse button is clicked.
% If the right mouse button is clicked, this code must not be
% executed as the variable 'ind' will be emptied. And this variable
% is used when the context menu (callback 'Qc') is called
% -----------------------------------------------------------------
if ~strcmp( get(gcf, 'SelectionType'), 'alt')
% The QC is applied either on TSG data either on Sample data.
% it depends if the Botte Toggle button has been cliked on
% -----------------------------------------------------------
if strcmp( get(hBottleToggletool, 'state'), 'on')
% get index on selected zone
% --------------------------
if ~isempty(tsg.DAYD_EXT)
ind = find(tsg.DAYD_EXT > p1(1) & tsg.DAYD_EXT < p2(1) & ...
tsg.EXT_DIF > p1(2) & tsg.EXT_DIF < p2(2));
Yves Gouriou
committed
% Keep the information on the indices of the selected zone
% --------------------------------------------------------
tsg.rbboxind = ind .* ones(size(ind));
% Modifiy the QC
% --------------
tsg.([SAMPLE '_EXT_QC'])(ind) = tsg.qc.active.Code;
Yves Gouriou
committed
% Save the modifications
% ----------------------
setappdata( hMainFig, 'tsg_data', tsg);
% plot selected data with selected code
% --------------------------------------
plot_Correction( hMainFig, hPlotAxes, PARA);
Yves Gouriou
committed
end
else
% get index on selected zone
% ---------------------------
ind = find(tsg.DAYD > p1(1,1) & tsg.DAYD < p2(1,1) & ...
tsg.(PARA{1}) > p1(1,2) & tsg.(PARA{1}) < p2(1,2));
% Keep the information on the indices of the selected zone
% --------------------------------------------------------
tsg.rbboxind = ind .* ones(size(ind));
% Modifiy the QC
% --------------
tsg.([PARA{1} '_QC'])(ind) = tsg.qc.active.Code;
% put last SSPS_QC in queue (Undo/Redo)
% -------------------------------------
%tsg.queue = push( tsg.queue, tsg.([PARA '_QC']));
% store QC in queue object, for undo
% ----------------------------------
%tsg.queue = push(tsg.queue, tsg.([PARA '_QC']));
% Save the modifications
% ----------------------
setappdata( hMainFig, 'tsg_data', tsg);
% ------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1, PARA{1} );
% refresh QC statistic panel
% --------------------------
display_QC( hMainFig );
% Update the map if already displayed
% -----------------------------------
if strcmp( get(hMapFig,'visible'), 'on') == 1
erase_Line( hPlotAxes, 4 );
plot_map( hMainFig, hPlotAxes);
% enable undo menu
% ----------------
set(findobj('tag','UIMENU_UNDO'),'enable','on');
end
% As soon as a modification took place the data should be saved
% -------------------------------------------------------------
set( hSaveMenu, 'UserData', 'on' );
end
% enable ButtonMotion on main fig after select QC area
% ----------------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
end
end
%% QC_OffMenuCallback .............................. Quality Control Module
%----------------------------------------------------------------------
% Callback function run when the QC toggle tool is released
%----------------------------------------------------------------------
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', []);
% Uipanel visible or not
% -----------------------
set( hbgQc, 'Visible', 'off' );
if strcmp( get(hBottleToggletool, 'state'), 'off' )
set( hCalToggletool, 'state', 'off', 'enable', 'on' );
set( hInterpToggletool, 'state', 'off', 'enable', 'on' );
end
% uibuttongroup uipanel used to choose a parameter is set to
% on only if the Correction screen (bottle toggletool) is off
% -----------------------------------------------------------
if strcmp( get( hBottleToggletool, 'state'), 'off')
set( hbgParameter, 'Visible', 'on');
end
% cursor back to normal
% ---------------------
set(hMainFig,'Pointer','arrow');
end
%% Qc context menu selected ........................ Quality Control Module
%-----------------------------------------------------------
% Callback function run when the QC context menu is selected
%
% Context menu used to attribute a QC to the TSG time series
%
%-----------------------------------------------------------
function Qc(hObject, eventdata, key)
% Retrieve Default Quality Code and Color
% ---------------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Get the parameter (SSPS, SSJT or SSTP)
% --------------------------------------
PARA = getParaCorModule( hMainFig );
% get key and some values in hashtable
% ------------------------------------

jacques.grelet_ird.fr
committed
code = tsg.qc.hash.(key).code;
color = tsg.qc.hash.(key).color;
% set active code and color from selected context menu
% ----------------------------------------------------
tsg.qc.active.Code = code;
tsg.qc.active.Color = color;
% Modify and plot the last selected tsg data
% ------------------------------------------
if isfield(tsg, 'rbboxind') && ~isempty( tsg.rbboxind )
if strcmp( get(hBottleToggletool, 'state'), 'on')
tsg.([SAMPLE '_EXT_QC'])(tsg.rbboxind) = tsg.qc.active.Code;
% in the application data
% ----------------------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Draw the 3 plots of the Correction figure
% -----------------------------------------
plot_Correction( hMainFig, hPlotAxes, PARA );
else
tsg.([PARA{1} '_QC'])(tsg.rbboxind) = tsg.qc.active.Code;
% Save tsg.SSPS_QC in the application data before use
% inside plot_Validation
% ---------------------------------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Draw plot 1 of the validation figure
% ------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1, PARA{1} );
end
end
% Update the radio button corresponding to the selected
% QC context menu (rbg : RadioButtonGroup)
% -----------------------------------------------------
% radioTag = ['TAG_QC_RADIO_' key]; % Build the TAG of the CODE
% hbgChildren = get(hbgQc,'Children'); % Get the handles of the rbg
% hbgTagCell = get(hbgChildren, 'tag'); % get the TAG of the rbg
% ind = strcmp(radioTag, hbgTagCell); % Compare the TAG
% hRadioButton = hbgChildren( ind == 1 ); % Get the handle of the button
% set(hbgQc, 'SelectedObject', hRadioButton); % Make this button active
display_QC( hMainFig);
setappdata( hMainFig, 'tsg_data', tsg );
end
%% Radiobutton Quality Control ..................... Quality Control Module
% ---------------------------------------------------------------
% Callback to select CODE and COLOR QC from the RadioButton Group
% ---------------------------------------------------------------
function RadiobuttonQc(source, eventdata)
% Retrieve Default Quality Code and Color
% ---------------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Retrieve the key from the active RadioButton
% --------------------------------------------
rbTag = get(eventdata.NewValue,'Tag');
key = strrep(rbTag, 'TAG_QC_RADIO_', '');
% store his handle to uibuttongroup userdata
% ------------------------------------------
set(hbgQc,'Userdata', eventdata.NewValue);
% set active code and color from selected context menu
% ----------------------------------------------------

jacques.grelet_ird.fr
committed
tsg.qc.active.Code = tsg.qc.hash.(key).code;
tsg.qc.active.Color = tsg.qc.hash.(key).color;

jacques.grelet_ird.fr
committed
% save tsg struct
% ----------------
end
%% preQcPanCallback .................................Quality Control Module
% ---------------------------------------------------------------
% Callback function ... to be completed
% ---------------------------------------------------------------
function preQcPanCallback(obj, evd)
set(hQCToggletool, 'state', 'off' );
end
%% postQcPanCallback ............................... Quality Control Module
% ---------------------------------------------------------------
% Callback function ... to be completed
% ---------------------------------------------------------------
% Set the right limit and interval to the 3 axes
% ----------------------------------------------
for iaxe = 1:3
set(hPlotAxes(iaxe),'XTickMode','auto')
datetick(hPlotAxes(iaxe),'x','keeplimits')
end
% Re-draw the map once the pan is off - only valide in QC mode
% -------------------------------------------------------------
if strcmp( get(hMapFig, 'visible'), 'on') == 1
erase_Line( hPlotAxes, 4 );
plot_map( hMainFig, hPlotAxes);
end
% restacks the figure to the top of the screen
% --------------------------------------------
figure( hMainFig);
set(hQCToggletool, 'state', 'on' );
%---------------------------------------------------------------------
% Callback function run when mouse pointer is moving on temperature plot
% draw corresponding measurement position on map
%---------------------------------------------------------------------
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 current position of cusor and return its coordinates in
% axes with handle h_axes
% -----------------------------------------------------------
a = get(hPlotAxes(1), 'CurrentPoint');
x = a(2,1);
y = a(2,2);
% Get the Limits of axes 1
% ------------------------
limx = get(hPlotAxes(1), 'XLim');
limy = get(hPlotAxes(1), 'YLim');
% Code to Activate the PAN function when QC mode is active
% A PAN zone is defined in the bottom (10%) of PlotAxes(1)
% 1 - one to desactivate QC when Pan is set to on.
% 2 - one to reactivate QC once the pan has been used.
% ---------------------------------------------------------
% if we are in QC mode
% ---------------------
if strcmp( get(hQCToggletool, 'state' ), 'on' );
% Suppose that Y axes is increasing from the bottom to the top
% ------------------------------------------------------------
limy2 = limy(1) + (limy(2)-limy(1)) * 0.10;
if x > limx(1) && x < limx(2) && y <= limy2 && y >= limy(1)
hPan = pan(hMainFig);
set(hPan,'ActionPreCallback', @preQcPanCallback);
set(hPan,'ActionPostCallback', @postQcPanCallback);
set(hPan,'Enable','on');
else

jacques.grelet_ird.fr
committed
try
pan(hMainFig, 'off');
catch
end
end % end of cursor test location
end % end of QC mode test
% Dynamically display data in uicontrol for valid data
% ----------------------------------------------------
if x > tsg.DAYD(1) && x < tsg.DAYD(end)
% get index of cursor location
% ----------------------------
indCursor = find( tsg.DAYD > x, 1, 'first');
% display informations of cursor location in text uicontrol
% ---------------------------------------------------------
datestr(tsg.DAYD(indCursor),'dd/mm/yyyy HH:MM'));
set( hInfoLatText, 'String', dd2dm(tsg.LATX(indCursor), 0) );
set( hInfoLongText, 'String', ...
dd2dm(mod(tsg.LONX(indCursor) + 180, 360) - 180, 1) );
set( hInfoSSPSText, 'String', tsg.SSPS(indCursor) );
end
if ~isempty(tsg.SSJT)
set( hInfoSSJTText, 'String', tsg.SSJT(indCursor) );
set( hInfoSSTPText, 'String', tsg.SSTP(indCursor) );
end
% Plot the position on the map if this one is active
% --------------------------------------------------
if strcmp( get(hMapFig, 'Visible'), 'on')
% Select the map axes
% -------------------
axes( hPlotAxes(4));
% Look for a MARKER (Red point) on the ship track
% -----------------------------------------------
h = findobj( hPlotAxes(4), '-regexp','Tag', 'TAG_PLOT4_LINE_MARKER');
if isempty( h ) % if no Marker
if ~isnan( tsg.LONX(indCursor) )
% Plot a Marker (Red point) on the ship track
% -------------------------------------------
hMarker = m_line( mod(tsg.LONX(indCursor(1)) + ...
tsg.lonplus, tsg.lonmod) - tsg.lonplus,...
tsg.LATX(indCursor(1)),...
'Marker', 'o', 'MarkerSize', 5, ...
'Color', 'r', 'MarkerFaceColor', 'r');
% Put a tag on the Marker - This tag allows to get the handle
% of the Marker
% -----------------------------------------------------------
set( hMarker, 'TAG', 'TAG_PLOT4_LINE_MARKER' );
if ~isnan( tsg.LONX(indCursor) )
% Delete the Marker and redraw it
% -------------------------------
delete( h);
tsg.LONX(indCursor), tsg.LATX(indCursor),...
'Marker', 'o', 'MarkerSize', 5, ...
'Color', 'r', 'MarkerFaceColor', 'r');
% Put a tag on the Marker - This tag allows to get the handle
% of the Marker
% -----------------------------------------------------------
set( hMarker, 'TAG', 'TAG_PLOT4_LINE_MARKER' );
end % end of map visible
else
% if cursor is out of valid data, display blank
% ---------------------------------------------
set( hInfoDateText, 'String', '' );
set( hInfoLatText, 'String', '' );
set( hInfoLongText, 'String', '' );
set( hInfoSSPSText, 'String', '' );
set( hInfoSSTPText, 'String', '' );
set( hInfoSSJTText, 'String', '' );
end % end of BuntonMotionOn
end % end of mouseMotion function
%---------------------------------------------------------------------
% Callback function run when the Map tool bar item is selected
%---------------------------------------------------------------------
function Map_OnMenuCallback(hObject, eventdata)
% Desactivate Zoom and Pan toggle buttons
% ---------------------------------------
set(hZoomInToggletool, 'state', 'off' );
set(hZoomOutToggletool, 'state', 'off' );
set(hPanToggletool, 'state', 'off' );
% Make the earth map visible
% --------------------------
set(hMapFig, 'Visible', 'on' );
erase_Line( hPlotAxes, 4 );
plot_map( hMainFig, hPlotAxes)

jacques.grelet_ird.fr
committed
% De-activate keyPressFcn callback on main fig
% --------------------------------------------
set(hMainFig, 'KeyPressFcn', []);
%---------------------------------------------------------------------
% Callback function run when the Map tool bar item is unselected
%---------------------------------------------------------------------
function Map_OffMenuCallback(hObject, eventdata)
% ----------------------------

jacques.grelet_ird.fr
committed
% Re-activate keyPressFcn callback on main fig
% ---------------------------------------------
set(hMainFig, 'KeyPressFcn', @keyPressFcnCallback);
%% Bottle_OnMenuCallback ................................ Correction Module
%---------------------------------------------------------------------
% Callback function run when the bootle push tool is selected
%---------------------------------------------------------------------
function Bottle_OnMenuCallback(hObject, eventdata)
% Callback function run when the Bottle tool bar item is selected
% Get the tsg structure
% ---------------------
tsg = getappdata(hMainFig, 'tsg_data');
% Get the parameter we are working on (SSPS, SSJT, SSTP)
% ------------------------------------------------------
PARA = getParaCorModule( hMainFig );
% Switch somme buttons
% --------------------
set( hQCToggletool, 'state', 'off' );
set( hZoomInToggletool, 'state', 'off', 'enable', 'on' );
set( hZoomOutToggletool, 'state', 'off', 'enable', 'on' );
set( hPanToggletool, 'state', 'off' );
set( hClimToggletool, 'state', 'off', 'enable', 'off');
set( hCalToggletool, 'enable', 'off' );
set( hInterpToggletool, 'enable', 'off' );
set( hTimelimitToggletool, 'enable', 'on' );
% Activate or desactivate uipanels
% ---------------------------------
set( hpDateLimit, 'Visible', 'on' );
set( hbgCorMethod, 'Visible', 'on' );
set( hCorPanel, 'Visible', 'on' );
set( hbgParameter, 'Visible', 'off');
set( hbgQc, 'Visible', 'off');
if ~isempty( tsg.([SAMPLE '_EXT']) )
Yves Gouriou
committed
% Compute the sample-TSG differences
% ----------------------------------
diffTsgSample( hMainFig, PARA );
else
msgbox('No sample data file has been read', 'modal');
Yves Gouriou
committed
end
Yves Gouriou
committed
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes, PARA );
% Necessary to unzoom as the new plot keep in memory the preceding zoom
% ---------------------------------------------------------------------
zoom out;
Yves Gouriou
committed
% Get the information on time limits of the time series
% Write them in the uipanel
% -----------------------------------------------------
noNaN = tsg.DAYD(~isnan( tsg.DAYD ));
set( hetDateMin, 'String', datestr(noNaN(1), 31));
set( hetDateMax, 'String', datestr(noNaN(end), 31));
end
%% Bottle_OffMenuCallback ............................... Correction module
%---------------------------------------------------------------------
% Callback function run when the bootle push tool is selected
%---------------------------------------------------------------------
function Bottle_OffMenuCallback(hObject, eventdata)
% If necessary toggle off some buttons
% ------------------------------------
set( hQCToggletool, 'state', 'off' );
set( hZoomInToggletool, 'state', 'off' );
set( hZoomOutToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hClimToggletool, 'enable', 'on');
set( hCalToggletool, 'enable', 'on' );
set( hInterpToggletool, 'enable', 'on' );
set( hTimelimitToggletool, 'enable', 'off' );
% Activate or Desactivate uipanel
% --------------------------------
set( hpDateLimit, 'Visible', 'off' );
set( hCorPanel, 'Visible', 'off' );
set( hbgCorMethod, 'Visible', 'off' );
set( hbgParameter, 'Visible', 'on');
% Desactivate Click Mouse on figure
% ---------------------------------
set( hMainFig, 'WindowButtonDownFcn', []);
% Get tsg structure
% -----------------
tsg = getappdata( hMainFig, 'tsg_data' );
Yves Gouriou
committed
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );
% Necessary to unzoom as the new plot keep in memory the preceding zoom
% ---------------------------------------------------------------------
zoom out;
% Set the pointer
% ---------------
set( hMainFig, 'Pointer', 'arrow');
end
%% OldCorCancelCallback .................................... Correction Module
function OldCorCancelCallback(hObject, eventdata)
% Desactivate somme Toggle button
% -------------------------------
set( hZoomInToggletool, 'state', 'off' );
set( hZoomOutToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
% Get tsg application data
% ------------------------
tsg = getappdata(hMainFig, 'tsg_data');
% Get parameter we are working on (SSPS, SSJT, SSTP)
% or SSPS_CAL, SSJT_CAL, SSTP_CAL
% -------------------------------------------------
PARA = getParaCorModule( hMainFig );
% --------------------------------------------------
tsg.([PARA{1} '_ADJUSTED']) = [];
tsg.([PARA{1} '_ADJUSTED_QC']) = [];
tsg.([PARA{1} '_ADJUSTED_ERROR']) = [];
% Save tsg data
% -------------
setappdata(hMainFig, 'tsg_data', tsg);
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes, PARA );
end
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
%% cancelCorrectionCallback .................................... Correction Module
function cancelCorrectionCallback(hObject, eventdata, Limits)
% Callback function run when the user want to cancel the
% corrections made from comparison with bottles or ARGO data.
% The deletion can be made for th whole time series or
% between 2 dates.
% $Id$
% Desactivate somme Toggle button
% -------------------------------
set( hZoomInToggletool, 'state', 'off' );
set( hZoomOutToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
% Get tsg application data
% ------------------------
tsg = getappdata(hMainFig, 'tsg_data');
% Get parameter we are working on (SSPS, SSJT, SSTP)
% or SSPS_CAL, SSJT_CAL, SSTP_CAL
% -------------------------------------------------
PARA = getParaCorModule( hMainFig );
% The correction will be cancelled either for the entire
% time series or within date limits
% ------------------------------------------------------
ind = 0;
switch Limits
% Get the indices of the whole time series
% ----------------------------------------
case 'total'
ind = find( tsg.DAYD >= tsg.DAYD(1) & tsg.DAYD <= tsg.DAYD(end) );
% ind = size(tsg.([PARA{1} '_ADJUSTED']));
% Get the indices between 2 dates
% --------------------------------
case 'part'
% Get the date limits used for the correction
% -------------------------------------------
dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
% Find indices within date limits
% --------------------------------
if dateMax > dateMin
ind = find( tsg.DAYD >= dateMin & tsg.DAYD <= dateMax );
end
otherwise
msgbox( 'CorCancelCallback : error', 'CorCancelCallback', 'error', modal);
end
if ~isempty(ind) && ~isempty( tsg.([PARA{1} '_ADJUSTED']) )
% Cancel the correction : set the ADJUSTED variable to NaN
% and ADJUSTED_QC to 0 (Bytes)
% --------------------------------------------------------
tsg.([PARA{1} '_ADJUSTED'])(ind) = ...
NaN*ones(size(tsg.([PARA{1} '_ADJUSTED'])(ind))) ;
tsg.([PARA{1} '_ADJUSTED_QC'])(ind) = ...
zeros*ones(size(tsg.([PARA{1} '_ADJUSTED_QC'])(ind))) ;
tsg.([PARA{1} '_ADJUSTED_ERROR'])(ind) = ...
NaN*ones(size(tsg.([PARA{1} '_ADJUSTED_ERROR'])(ind))) ;
end
% Save tsg data
% -------------
setappdata(hMainFig, 'tsg_data', tsg);
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes, PARA );
end
%% gradientCorrectionCallback .................................... Correction Module
function gradientCorrectionCallback(hObject, eventdata)
gael.alory_legos.obs-mip.fr
committed
% Callback function run when
% Desactivate somme Toggle button
% -------------------------------
set( hZoomInToggletool, 'state', 'off' );
set( hZoomOutToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
% Get the time limits for the correction
% --------------------------------------
gael.alory_legos.obs-mip.fr
committed
dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
% Get tsg application data
% ------------------------
tsg = getappdata(hMainFig, 'tsg_data');
gael.alory_legos.obs-mip.fr
committed
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
% Get parameter we are working on (SSPS, SSJT, SSTP)
% or SSPS_CAL, SSJT_CAL, SSTP_CAL
% -------------------------------------------------
PARA = getParaCorModule( hMainFig );
SAMPLE = tsg.plot.sample;
if ~isempty( tsg.([SAMPLE '_EXT']) )
% Compute the sample-TSG differences
% ----------------------------------
diffTsgSample( hMainFig, PARA );
% Correction
% ----------
error = corTsgGradient(hMainFig, PARA, dateMin, dateMax);
switch error
case 1
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes, PARA );
gael.alory_legos.obs-mip.fr
committed
if DateMax <= DateMin
msgbox( 'Date limits are not correct',...
'Correction module', 'warn', 'modal');
end
gael.alory_legos.obs-mip.fr
committed
end
end
end
%% biasCorrectionCallback .................................... Correction Module
function biasCorrectionCallback(hObject, eventdata)
Yves Gouriou
committed
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
% Callback function run when
% Desactivate somme Toggle button
% -------------------------------
set( hZoomInToggletool, 'state', 'off' );
set( hZoomOutToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
% Get the time limits for the correction A TESTER
% -----------------------------------------------
dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
% Get tsg application data
% ------------------------
tsg = getappdata(hMainFig, 'tsg_data');
% Get parameter we are working on (SSPS, SSJT, SSTP)
% or SSPS_CAL, SSJT_CAL, SSTP_CAL
% -------------------------------------------------
PARA = getParaCorModule( hMainFig );
SAMPLE = tsg.plot.sample;
if ~isempty( tsg.([SAMPLE '_EXT']) )
% Compute the sample-TSG differences
% ----------------------------------
diffTsgSample( hMainFig, PARA );
Yves Gouriou
committed
end
% Correction
% ----------
error = corTsgBias(hMainFig, PARA, dateMin, dateMax);
Yves Gouriou
committed
Yves Gouriou
committed
switch error
Yves Gouriou
committed
Yves Gouriou
committed
case 1
Yves Gouriou
committed
Yves Gouriou
committed
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes, PARA );
Yves Gouriou
committed
Yves Gouriou
committed
case -1
Yves Gouriou
committed
Yves Gouriou
committed
if DateMax <= DateMin
msgbox( 'Date limits are not correct',...
'Correction module', 'warn', 'modal');
end
otherwise
msgbox( 'CorBiasCallback : Error different or -1',' ', 'error');
Yves Gouriou
committed
end
end
%% linearCorrectionCallback .................................... Correction Module
function linearCorrectionCallback(hObject, eventdata)
% Callback function run when
% Desactivate somme Toggle button
% -------------------------------
set( hZoomInToggletool, 'state', 'off' );
set( hZoomOutToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
% Get the time limits for the correction A TESTER
% -----------------------------------------------
dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
% Get tsg application data
% ------------------------
tsg = getappdata(hMainFig, 'tsg_data');
% Get parameter we are working on (SSPS, SSJT, SSTP)
% or SSPS_CAL, SSJT_CAL, SSTP_CAL
% -------------------------------------------------
PARA = getParaCorModule( hMainFig );
if ~isempty( tsg.([SAMPLE '_EXT']) )
Yves Gouriou
committed
% Compute the sample-TSG differences
% ----------------------------------
diffTsgSample( hMainFig, PARA );
Yves Gouriou
committed
% Correction
% ----------
error = corTsgLinear(hMainFig, PARA, dateMin, dateMax);
Yves Gouriou
committed
switch error
Yves Gouriou
committed
case 1
Yves Gouriou
committed
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes, PARA );
case -1
msgbox( 'Date limits are not correct',...
'Correction module', 'warn', 'modal');
end
%% medianCorrectionCallback .................................... Correction Module
function medianCorrectionCallback(hObject, eventdata)
% Callback function run when
% Desactivate somme Toggle button
% -------------------------------
set( hZoomInToggletool, 'state', 'off' );
set( hZoomOutToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
% Get the time limits for the correction A TESTER
% --------------------------------------
dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
% Get tsg application data
% ------------------------
tsg = getappdata(hMainFig, 'tsg_data');
% Get parameter we are working on (SSPS, SSJT, SSTP)
% or SSPS_CAL, SSJT_CAL, SSTP_CAL
% -------------------------------------------------
PARA = getParaCorModule( hMainFig );
if ~isempty( tsg.([SAMPLE '_EXT']) )
Yves Gouriou
committed
% Compute the sample-TSG differences
% ----------------------------------
diffTsgSample( hMainFig, PARA );
Yves Gouriou
committed
% Correction
% ----------
error = corTsgMedian(hMainFig, PARA, dateMin, dateMax);
Yves Gouriou
committed
switch error
Yves Gouriou
committed
case 1
Yves Gouriou
committed
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes, PARA );
% Nothing is done - Error msg within the corTsgMedian function
Yves Gouriou
committed
end
%% PopupMenu Select Parameter
% POP_UP filled in with the function "initParameterChoice"
% ---------------------------
function SelectParameter(hObject, eventdata, nplot)
% Callback function run when the ....
% Get application data
% --------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Get the active string of the selected box
% -----------------------------------------
val = get( hObject, 'Value' );
string_list = get( hObject, 'String' );
selected_string = string_list{val};
% Get the default parameter
% -------------------------
tsg.plot.sample = selected_string;
if strcmp( tsg.plot.sample, 'SSJT' )
tsg.plot.sample = 'SSTP';
% Save application data
% --------------------
setappdata( hMainFig, 'tsg_data', tsg);
% Disable the climatology
% -----------------------
plotClim = 0;
if strcmp( get(hClimToggletool, 'state'), 'on' )
set( hClimToggletool, 'state', 'off' );
plotClim = 1;
end
% Disable the climatology
% -----------------------
set( hClimToggletool, 'state', 'off' );
plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );
% Plot the climatology if it was already plotted
% ----------------------------------------------
if plotClim
set( hClimToggletool, 'state', 'on' );
plot_Climatology(hMainFig, hPlotAxes);
%% SelectTime_OnMenuCallback
%---------------------------
function SelectTime_OnMenuCallback(hObject, eventdata)
% Callback function run when the ....
% Desactivate Zoom and Pan functions.
% ----------------------------------
set( hZoomInToggletool, 'state', 'off' );
set( hZoomOutToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
% Create a pointer to select the time limits
% ------------------------------------------
selTimePointer = ones(16)+1;
selTimePointer(1,:) = 1; selTimePointer(16,:) = 1;
selTimePointer(:,1) = 1; selTimePointer(:,16) = 1;
selTimePointer(1:4,8:9) = 1; selTimePointer(13:16,8:9) = 1;
selTimePointer(8:9,1:4) = 1; selTimePointer(8:9,13:16) = 1;
selTimePointer(5:12,5:12) = NaN; % Create a transparent region in the center
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
% Activate clic mouse menu on second axes (salinity) for next rbbox
% ----------------------------------------------------------------
set(hMainFig,'WindowButtonDownFcn', @Time_SelectCallback);
% change cursor
% ---------------
set( hMainFig, 'Pointer', 'custom',...
'PointerShapeCData', selTimePointer, 'PointerShapeHotSpot',[9 9]);
% ----------------------------------------------------------------------
% nested function on mouse clic when Select Time toggle tool is selected
% ----------------------------------------------------------------------
function Time_SelectCallback(gcbo, eventdata)
% disable ButtonMotion on main fig during select
% prevent drawing to map
% ----------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', []);
% 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
point1 = point1(1,1:2); % extract x and y
point2 = point2(1,1:2);
p1 = min(point1,point2);
p2 = max(point1,point2); % calculate locations
% get index on selected zone - Only on X axes (time)
% --------------------------------------------------
ind = find(tsg.DAYD >= p1(1,1) & tsg.DAYD <= p2(1,1));
% Write the date in the Editable uicontrol
% ----------------------------------------
set( hetDateMin, 'String', datestr(tsg.DAYD(ind(1)), 31));
set( hetDateMax, 'String', datestr(tsg.DAYD(ind(end)), 31));
% enable ButtonMotion on main fig after select QC area
% ----------------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
end
end
%% SelectTime_OffMenuCallback
%----------------------------
function SelectTime_OffMenuCallback(hObject, eventdata)
% Desactivate time limit buttons
% ------------------------------
set( hTimelimitToggletool, 'state', 'off');
set( hMainFig, 'WindowButtonDownFcn', []);
set( hMainFig, 'Pointer', 'arrow');
end
%% Clim_OffMenuCallback
%------------------------------------------------------------------------
% Callback function run when the Levitus climatology toolbar is unselected
%------------------------------------------------------------------------
function Clim_OffMenuCallback(hObject, eventdata)
% Get lines handles from tag
% --------------------------
hLines = findobj('-regexp', 'Tag', 'TAG_LINE_CLIMATO_');
% Delete climatology lines on axes
% ---------------------------------
delete(hLines);
%------------------------------------------------------------------------
% Callback function run when the Levitus climatology toolbar is unselected
%------------------------------------------------------------------------
function Clim_OnMenuCallback(hObject, eventdata)
% Test if the TSG and bucket files have been read
% -----------------------------------------------
if strcmp( get(hOpenMenu, 'UserData'), 'on' )
% plot climatology
% ----------------
plot_Climatology(hMainFig, hPlotAxes);
end
end
%% ClimatoSelectMenuCallback
% -------------------------------------------------------------------
% Callback function run when climato submenu is selected
% -------------------------------------------------------------------
function ClimatoSelectMenuCallback(hObject, eventdata, climato, time)
% find all climato submenu and set 'checked' property to 'off'
% ------------------------------------------------------------
hdl = findobj( '-regexp', 'tag', 'TAG_UIMENU_CLIMATO');
set(hdl, 'checked', 'off');
% set current climato submenu checked
% -----------------------------------
set(hObject, 'checked', 'on');
% memorize action on climatology menu for next use
% ------------------------------------------------
s.type = climato;
s.time = time;
set(hClimatoMenu, 'userdata', s);
% check if climatology toggle button is set
% -----------------------------------------
if strcmp(get(hClimToggletool, 'state'), 'on')
% clear last plotted climatology
% ------------------------------
Clim_OffMenuCallback;
% plot and read (eventually) new climatology
% ------------------------------------------
plot_Climatology(hMainFig, hPlotAxes);
end
%% PreferencesMenuCallback
% -------------------------------------------------------------------
% Callback function run when Option/Preference is selected
% -------------------------------------------------------------------
function PreferencesMenuCallback(hObject, eventdata)
oldmapres=tsg.preference.map_resolution;
% call preferences form function
% ------------------------------
if( preferencesForm(hMainFig) )
% if form is validate, update plots only if plot exist
% ----------------------------------------------------
if ~isempty(findobj( '-regexp', 'Tag', ('TAG_PLOT\d_LINE_')))
SelectParameter(pmhPara(1),[],1);
end
% Update the map (if visible) if ship speed QC has been applied
% or map resolution has been changed
% -------------------------------------------------------------
if (strcmp( get(hMapFig,'visible'), 'on') == 1 & ...
gael.alory_legos.obs-mip.fr
committed
tsg.preference.map_resolution ~= oldmapres)
erase_Line( hPlotAxes, 4 );
plot_map( hMainFig, hPlotAxes);
%% HelpMenuCallback
% -------------------------------------------------------------------
% Callback function run when Help/Help is selected
% -------------------------------------------------------------------
function HelpMenuCallback(hObject, eventdata)
msgbox( 'Function Help not yet implemented', 'warn', 'modal');
end
%% AboutMenuCallback
% -------------------------------------------------------------------
% Callback function run when Help/About is selected
% -------------------------------------------------------------------
function AboutMenuCallback(hObject, eventdata)
%splash('Thermo.jpg', 3000);
aboutDialog(hMainFig, DEFAULT_PATH_FILE);
%% HeaderMenuCallback
% -------------------------------------------------------------------
% Callback function run when the headerForm tool bar item is selected
% -------------------------------------------------------------------
function HeaderMenuCallback(hObject, eventdata)
% call header form function
% -------------------------
headerForm(hMainFig);
end
%% PrintFigMenuCallback
% -------------------------------------------------------------------
% Callback function run when the Report tool bar item is selected
% -------------------------------------------------------------------
function PrintFigMenuCallback(hObject, eventdata)
% disable ButtonMotion on main fig during select
% ----------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', []);
% Get the tsg structure
% ---------------------
tsg = getappdata( hMainFig, 'tsg_data');
hPrintFig = figure( 'Name', 'Print','NumberTitle', 'off','Resize', 'on');
hPlot(1) = subplot(3,1,1);
hPlot(2) = subplot(3,1,2);
hPlot(3) = subplot(3,1,3);
title( hPlot(1), tsg.file.name, 'interpreter', 'none');
if strcmp(get(hBottleToggletool,'state'), 'on')
% Default parameter
% -----------------------------------------------------
PARA = getParaCorModule( hMainFig );
plot_Correction( hMainFig, hPlot, PARA );
elseif strcmp(get(hCalToggletool,'state'), 'on')
plot_Calibration( hMainFig, hPlot, 1, 'SSPS' );
plot_Calibration( hMainFig, hPlot, 2, 'SSJT' );
plot_Calibration( hMainFig, hPlot, 3, 'SSTP' );
% elseif strcmp(get(hMapToggletool,'state'), 'on')
% plot_map( hMainFig, hPlot)
elseif strcmp(get(hInterpToggletool,'state'), 'on')
plot_Interpolation( hMainFig, hPlot, 1 );
plot_Interpolation( hMainFig, hPlot, 2 );
plot_Interpolation( hMainFig, hPlot, 3 );
plot_Validation( hMainFig, hPlot, 1, tsg.plot.parameter{1} );
plot_Validation( hMainFig, hPlot, 2, tsg.plot.parameter{2} );
plot_Validation( hMainFig, hPlot, 3, tsg.plot.parameter{3} );
% I = getframe(hPlotAxes(1));
% imwrite(I.cdata, 'myplot.png');
linkaxes([hPlot(1),hPlot(2),hPlot(3)], 'x');
% set(hPlot(i), 'box', 'on','XTickMode','auto');
set(hPlot(i), 'box', 'on','XTickMode','auto');
datetick(hPlot(i),'x','mm/dd','keepticks' );
% enable ButtonMotion on main fig after select QC area
% ----------------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
end
%% ReportMenuCallback
% -------------------------------------------------------------------
% Callback function run when the Report tool bar item is selected
% -------------------------------------------------------------------
function ReportMenuCallback(hObject, eventdata)
% call report function
% --------------------
saveReport(hMainFig);
end
%% SaveMenuCallback
% -------------------------------------------------------------------
% Callback function run when the Save menu item is selected
% -------------------------------------------------------------------
function SaveMenuCallback(hObject, eventdata)
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% 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', strcat(tsg.file.name, '.nc'));
% if user press cancel button, all var are set to zero
% ----------------------------------------------------
if filterindex == 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
% -----------------
error = writeTSGDataNetCDF(hMainFig, strcat(pathName, fileName));
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
% must to be rewriting
% ------------------------------
if error == -1
warning('tsgqc:SaveMenuCallback', ...
'NetCDF writing error: %s %s', pathName, fileName);
return;
end
% update the display
% ------------------
set( hInfoFileText, 'String', strcat(tsg.file.name, tsg.file.ext));
% enable Quality Control mode
% ---------------------------
hdl_pushtool = findobj('Tag', 'QC');
set(hdl_pushtool, 'Enable', 'on');
end
end
% -------------------------------------------------------------------
% Callback function run when the Export menu item is selected
% -------------------------------------------------------------------
function ExportTsgCallback(hObject, eventdata)
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Desactivate MouseMotion 'off'
% ----------------------------
set( hMainFig, 'WindowButtonMotionFcn', []);
% Open standard dialog box for saving files
% -----------------------------------------
[fileName, pathName, filterindex] = uiputfile('*.tsgqc', ...
'Save file name', strcat(tsg.file.name, '.tsgqc'));
% if user press cancel button, all var are set to zero
% ----------------------------------------------------
if filterindex == 0
return;
end
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
% Write a .TSG (ascii) file
% --------------------------
Yves Gouriou
committed
error = writeAsciiTsg(hMainFig, strcat(pathName, fileName));
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
% enable Quality Control mode
% ---------------------------
hdl_pushtool = findobj('Tag', 'QC');
set(hdl_pushtool, 'Enable', 'on');
% Set MouseMotion 'on'
% --------------------
set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
% Check for .TSG writing error - must to be rewriting
% Because of the 'return' - These line must be at the end
% --------------------------------------------------------
warning('tsgqc:SaveMenuCallback', ...
'TSG no ouput: %s %s', pathName, fileName);
return;
end
end
%% ExportSampleCallback
% -------------------------------------------------------------------
% Callback function run when the Export menu item is selected
% -------------------------------------------------------------------
function ExportSampleCallback(hObject, eventdata)
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Desactivate MouseMotion 'off'
% ----------------------------
set( hMainFig, 'WindowButtonMotionFcn', []);
% Open standard dialog box for saving files
% -----------------------------------------
gael.alory_legos.obs-mip.fr
committed
[fileName, pathName, filterindex] = uiputfile('*.spl', ...
'Save file name', strcat(tsg.file.name, '.spl'));
% if user press cancel button, all var are set to zero
% ----------------------------------------------------
if filterindex == 0
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
gael.alory_legos.obs-mip.fr
committed
% Write a .SPL (ascii) file
% --------------------------
error = writeAsciiSample(hMainFig, strcat(pathName, fileName));
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
% enable Quality Control mode
% ---------------------------
hdl_pushtool = findobj('Tag', 'QC');
set(hdl_pushtool, 'Enable', 'on');
% Set MouseMotion 'on'
% --------------------
set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
% Check for .TSG writing error - must to be rewriting
% Because of the 'return' - These line must be at the end
% --------------------------------------------------------
if error == -1
warning('tsgqc:SaveMenuCallback', ...
'TSG no ouput: %s %s', pathName, fileName);
return;
end
end
%% UndoMenuCallback
% -----------------------------------------------------------------------
% Callback function run when the Edit/Undo menu item is selected (Ctrl+Z)
% -----------------------------------------------------------------------
function UndoMenuCallback(hObject, eventdata)
% Undo module not yet implemented
% -------------------------------
% msgbox('Undo module not yet implemented', 'modal');
%tsg.queue = undo(tsg.queue);
%tsg.SSPS_QC = get(tsg.queue);
% Make the Salinity, temperature and velocity plot
% ------------------------------------------------
plot_SalTempVel( hMainFig, hPlotAxes );
end
%% RedoMenuCallback
% -----------------------------------------------------------------------
% Callback function run when the Edit/Redo menu item is selected (Ctrl+R)
% -----------------------------------------------------------------------
function RedoMenuCallback(hObject, eventdata)
% Redo module not yet implemented
% -------------------------------
msgbox('Redo module not yet implemented', 'modal');
%% KeyPressFcnCallback
% -----------------------------------------------------------------------
% Callback function run when key is pressed
% -----------------------------------------------------------------------
function keyPressFcnCallback(hObject, evnt)

jacques.grelet_ird.fr
committed
% MATLAB generates repeated KeyPressFcn events, desactivate callback
% ------------------------------------------------------------------
set(hObject, 'KeyPressFcn', []);

jacques.grelet_ird.fr
committed
% check if key is pressed
% -----------------------
if ~isempty(evnt.Key)

jacques.grelet_ird.fr
committed
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
% test key, shift or control
% --------------------------
switch evnt.Key
case 'shift'
% get current pointer shape
% -------------------------
pointerShape = get(hObject, 'pointer');
% save current cursor shape
% -------------------------
setappdata( hMainFig, 'tsg_pointer', pointerShape);
% set cursor to fullcross or reset to normal arrow
% ------------------------------------------------
set(hObject, 'pointer', 'fullcrosshair');
case 'control'
% Get current position of cusor and return its coordinates in
% axes
% -----------------------------------------------------------
a = get(hPlotAxes(1), 'CurrentPoint');
x = a(2,1);
% Test if cursor is inside data interval
% -------------------------------------
if x > tsg.DAYD(1) && x < tsg.DAYD(end)
% loop over 3 subplot and draw vertical lines
% -------------------------------------------
for iplot = 1:3
axes( hPlotAxes(iplot));
limy = get(hPlotAxes(iplot), 'YLim');
line([x x], limy, 'color', 'k', 'EraseMode', 'xor',...
'tag', 'VERTICAL_TAG_LINE');
end
end
end % end of switch
end
end

jacques.grelet_ird.fr
committed
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
%% KeyReleaseFcnCallback
% -----------------------------------------------------------------------
% Callback function run when key is release
% -----------------------------------------------------------------------
function keyReleaseFcnCallback(hObject, evnt)
% check if key is pressed
% -----------------------
if ~isempty(evnt.Key)
% test key, shift or control
% --------------------------
switch evnt.Key
case 'shift'
% get stored cursor shape
% -----------------------
pointerShape = getappdata( hMainFig, 'tsg_pointer');
% if pointer equal to fullcrosshair, oups, error, reset to arrow
% ---------------------------------------------------------------
if strcmp(pointerShape, 'fullcrosshair')
pointerShape = 'arrow';
set(hObject, 'pointer', pointerShape);
end
% set pointer
% -----------
set(hObject, 'pointer', pointerShape);
case 'control'
% find vertical lines and delete them
% -----------------------------------
hdl_lines = findobj( 'Tag', 'VERTICAL_TAG_LINE' );
delete(hdl_lines);
end % end of switch
end % end of if
% Re-activate callback
% --------------------
set(hObject, 'KeyPressFcn', @keyPressFcnCallback);
end
%% QuitMapCallback
% -----------------------------------------------------------------
% Callback function run when the Quit Map Figure item is selected
% -----------------------------------------------------------------
function QuitMapCallback(hObject, eventdata)
% Make the earth map invisible
% ----------------------------
set(hMapToggletool, 'state', 'off' );
% -----------------------------------------------------------------
% Callback function run when the Quit menu item is selected
% -----------------------------------------------------------------
function QuitMenuCallback(hObject, eventdata)
% Get the data from the application GUI
% -------------------------------------
tsg = getappdata(hMainFig, 'tsg_data');
% in case of bad initialisation, the user could close the windows
% ---------------------------------------------------------------
try
% save config mat file in prefdir
% -------------------------------
config_file = [prefdir, filesep, tsgqcname, '.mat'];
% save preference mat file
% ------------------------
if exist('tsg', 'var') && isfield( tsg, 'preference')
preference = tsg.preference;
save( config_file, 'preference');
end
% If the data have been modified and not save, the program
% ask 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')
% call File/Save Menu Callback before before quit
% -----------------------------------------------
SaveMenuCallback;
% quit program
% ------------
quitProgram(DEFAULT_PATH_FILE, hMainFig, hMapFig);
selection = ...
questdlg(['Quit ' get(hMainFig, 'Name') '?'],...
['Quit ' get(hMainFig, 'Name') '?'],...
'Yes', 'No', 'Yes');
if strcmp(selection, 'No')
return;
else
quitProgram(DEFAULT_PATH_FILE, hMainFig, hMapFig);
end
% catch error during close windows
% --------------------------------
catch
% display message to console and quit program
% -------------------------------------------
fprintf('abnormal program termination during close user request\n');
quitProgram(DEFAULT_PATH_FILE, hMainFig);