%% DOCUMENT TITLE % INTRODUCTORY TEXT %% function tsgqc % tsgqc % % Thermosalinograph (TSG) Quality Control software % % $Id$ % %% 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') %% Initialization tasks % ******************** % Clear Command Window display, giving up a "clean screen." % --------------------------------------------------------- clc; % Define global variable VERSION number % ------------------------------------- global VERSION CHAR_VERSION % version number, may be used to initialize some files when it change % 0.90x -> 1.0RCx % ------------------------------------------------------------------- VERSION = 0.905; % -> 1.0RC5 CHAR_VERSION = '1.0RC5'; % Find program directory. % functions (icons) should be store at a lower level % add directories to Matlab search path, works on UNIX % and Windows host % --------------------------------------------------- tsgqcname = mfilename; fulltsgqcname = mfilename('fullpath'); DEFAULT_PATH_FILE = strrep(fulltsgqcname, tsgqcname, '') ; % p = [pathsep,... % DEFAULT_PATH_FILE,[filesep 'tsg_util' pathsep],... % DEFAULT_PATH_FILE,[filesep 'tsg_data' pathsep],... % DEFAULT_PATH_FILE,[filesep 'tsg_io' pathsep] % ]; p = [pathsep,... DEFAULT_PATH_FILE,[ 'tsg_util' pathsep],... DEFAULT_PATH_FILE,[ 'tsg_data' pathsep],... DEFAULT_PATH_FILE,[ 'tsg_io' pathsep] ]; 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) % display error dialog box and quit % --------------------------------- errordlg({'An instance of TSGQC is still running !!!', ... 'Open it from you task bar'}, 'Warning TSGQC'); return; end % Create and then hide the GUI as it is being constructed. % -------------------------------------------------------- hMainFig = figure(... 'Name', 'TSG Validation', ... 'NumberTitle', 'off', ... 'Resize', 'on', ... 'Menubar','none', ... 'Toolbar', 'none', ... 'UserData', 'ButtonMotionOff', ... 'WindowButtonMotionFcn', @MouseMotion, ... %{ CloseRequestFcn is remove at this time use use block comments, see: http://blogs.mathworks.com/loren/2006/08/30/commenting-code/ -------------------------------------- 'CloseRequestFcn', @QuitMenuCallback,... %} 'CloseRequestFcn', @QuitMenuCallback,... 'HandleVisibility', handleVisibility,... 'Visible','on',... 'Tag','TAG_TSG-QC_GUI',... 'Units', 'normalized',... 'Position',guiLimits, ... 'Color', get( 0, 'DefaultUIControlBackgroundColor' )); %% 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,... 'Label','Tsg ascci file',... '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,... 'Callback',@QuitMenuCallback); %% Menu Edit with Undo/Redo submenu % --------------------------------- 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 % -------------------------- for i=1:4 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',... 'september','october','november','december'}; % loop over the four submenu % -------------------------- for i=1:12 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 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}); %% 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', 'off', 'Enable', 'off',... 'ClickedCallback', @PrintFigMenuCallback); hZoomInToggletool = uitoggletool(... % Open Zoom In (increase) toolbar button 'Parent',hToolbar,... 'Separator', 'on', ... 'TooltipString','Zoom In (increase)',... 'CData', iconRead(fullfile(matlabroot,... '/toolbox/matlab/icons/zoomplus.mat')),... 'HandleVisibility','on', ... '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,... '/toolbox/matlab/icons/zoomminus.mat')),... '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, ... '/toolbox/matlab/icons/pan.mat')),... '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); hTimelimitToggletool = uitoggletool(... '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); hCalToggletool = uitoggletool(... % '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); hInterpToggletool = uitoggletool(... % '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',... 'Position',[0.15, 0.0, .85, .95]); 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]); % The map will be plot in a uipanel % --------------------------------- % hMapPanel = uipanel( ... % 'Parent', hMainFig, ... % 'Units', 'normalized', ... % 'Visible', 'off', ... % 'Position',[0.15, 0, .85, .58]); % The map will be plot a new figure % --------------------------------- hMapFig = figure(... 'BackingStore','off',... 'Name', 'TSG SHIP TRACK', ... 'NumberTitle', 'off', ... 'Resize', 'on', ... 'Menubar','figure', ... '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 'Parent', hMapFig, ... 'Units', 'normalized', ... 'Visible', 'off', ... 'Tag', 'TAG_AXES_MAP', ... '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 % ----------------------------------------------------------- qc_list = get(tsg.qc.hash); % internal loop count with state to on % ------------------------------------ count = 0; % iterate (loop) on each key store inside hastable % ------------------------------------------------ for i=1:numel(qc_list) % get key and some values in hashtable % ------------------------------------ key = qc_list{i}; label = get(tsg.qc.hash, key, 'label'); color = get(tsg.qc.hash, key, 'color'); state = get(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,... 'Tag', ['TAG_QC_RADIO_' 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 ',... 'Tag', ['TAG_QC_TEXT_' key],... 'Units', 'normalized', 'Position', [.61, .85-count*.12, .37, 0.09]); % increment count % --------------- count = count + 1; end end %% uipanel for checkboxes % -------------------------------------- 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',... 'Units', 'normalized', 'Position', [.0, .001, .15, .25]); % get list of keys from hashtable tsg.qc.hash, defined inside % tsg_initialisation.m % ----------------------------------------------------------- qc_list = get(tsg.qc.hash); % internal loop count with state to on % ------------------------------------ count = 0; % iterate (loop) on each key store inside hastable % ------------------------------------------------ for i=1:numel(qc_list) % get key and some values in hashtable % ------------------------------------ key = qc_list{i}; label = get(tsg.qc.hash, key, 'label'); color = get(tsg.qc.hash, key, 'color'); state = get(tsg.qc.hash, key, 'state'); value = 0; if strcmp(key, 'NO_CONTROL') || strcmp(key, 'GOOD') ||... strcmp(key, 'PROBABLY_GOOD') value = 1; end % 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, ... 'Tag', ['TAG_CHECK_CORRECTION_' key], ... 'HandleVisibility', 'on',... 'Units', 'normalized', 'Position', [.01, .85-count*.12, .6, 0.09]); % increment count % --------------- count = count + 1; end end %% uibutton group panel - Choose the parameter (SSPS - SSTP - SSJT) % ----------------------------------------------------------------------- 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]); end % 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', ... 'Position',[.0, .29, .15, .18]); % Create 2 radio buttons in the button group hrbCorCancel = uicontrol( ... 'Style','pushbutton', ... 'Parent',hbgCorMethod, ... 'Units', 'normalized', ... 'String','Cancel the adjustment',... 'FontSize',tsg.fontSize-1,... 'Tag', 'CORRECT_CANCEL_PUSH', ... 'pos',[.05 .08 .9 .25],... 'HandleVisibility', handleVisibility, ... 'Callback', @CorCancelCallback); hrbCorLinear = uicontrol( ... 'Style','pushbutton', ... 'Parent',hbgCorMethod, ... 'Units', 'normalized', ... 'String','Linear adjustment',... 'FontSize',tsg.fontSize-1,... 'Tag', 'CORRECT_LINEAR_PUSH', ... 'pos',[.05 .38 .9 .25], ... 'HandleVisibility', handleVisibility, ... 'Callback', @CorLinearCallback); hrbCorMedian = uicontrol( ... 'Style','pushbutton', ... 'Parent',hbgCorMethod, ... 'Units', 'normalized', ... 'String','Running median filter',... 'FontSize',tsg.fontSize-1,... 'Tag', 'CORRECT_MEDIAN_PUSH', ... 'pos',[.05 .68 .9 .25], ... 'HandleVisibility', handleVisibility, ... 'Callback', @CorMedianCallback); %% 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', ... 'Position', [.0, .5, .15, .18]); 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]); 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); hrbCancelCal = uicontrol( ... '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); %% *************************** CALLBACKS ********************************** %% OpenMenuCallback %---------------------------------------------------------------------- % Callback 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( hMapToggletool, 'state', 'off' ); set( hTimelimitToggletool, 'state', 'off' ); % set( hZoomToggletool, 'state', 'off' ); % Open standard dialog box for retrieving files % --------------------------------------------- [fileName, pathname, filterIndex] = uigetfile( ... {'*.nc';'*.lbv';'*.tsgqc';'*.btl';'*.ext';'*.arg';'*.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 case 1 % read TSG netcdf file *.nc tsg_initialisation(hMainFig); errTsg = readTsgDataNetCDF( hMainFig, fullFileName ); case 2 % read TSG labview file *.lbv tsg_initialisation(hMainFig); errTsg = readTsgDataLabview( hMainFig, fullFileName ); case 3 % read TSG text file *.tsg tsg_initialisation(hMainFig); errTsg = readAsciiTsg( hMainFig, fullFileName); case 4 % Read bucket file *.btl if ~isempty( tsg.SSPS ) errSpl = readAsciiSample( hMainFig, fullFileName, 'WS'); else msgbox('Load a TSG file before a Water sample file', 'Read Bucket'); end case 5 % Read External file *.ext if ~isempty( tsg.SSPS ) errSpl = readAsciiSample( hMainFig, fullFileName, 'EXT'); else msgbox('Load a TSG file before a Water sample file', 'Read Bucket'); end case 6 % Read Argo file *.arg (G. Reverdin format) if ~isempty( tsg.SSPS ) errSpl = readArgoLocean( hMainFig, fullFileName ); else msgbox('Load a TSG file before a Water sample file', 'Read Bucket'); end case 7 % read TSG XML file *.xml tsg_initialisation(hMainFig); errTsg = readTsgDataXML( hMainFig, fullFileName ); otherwise % 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' ); return; end % switch filterIndex % 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'); set( hbgParameter, 'Visible', 'on'); % Enable Save and Export menu % --------------------------- set(hSaveMenu, 'Enable', 'on'); set(hExportMenu, '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, hPlotAxes); % Initialise the popupmenu displaying the parameters that can be % plot % -------------------------------------------------------------- initParameterChoice( hMainFig, pmhPara ); tsg = getappdata( hMainFig, 'tsg_data'); elseif errTsg > -2 % Problem to read the file or % Choice of parameters for Labview file canceled by the user % TSG structure has been reinitialize % 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 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); end end % if ~isequal(fileName, 0) % 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 % ------------------------------------------- NO_CONTROL = get(tsg.qc.hash, 'NO_CONTROL', 'code'); INTERPOLATED_VALUE = get(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' ); % Write the Cal Coef in the Editable uicontrol % -------------------------------------------- set( hetCalCNDCSlope, 'String', num2str(tsg.CNDC_LINCOEF(1))); set( hetCalCNDCOffset, 'String', num2str(tsg.CNDC_LINCOEF(2))); set( hetCalSSJTSlope, 'String', num2str(tsg.SSJT_LINCOEF(1))); set( hetCalSSJTOffset, 'String', num2str(tsg.SSJT_LINCOEF(2))); set( hetCalSSTPSlope, 'String', num2str(tsg.SSTP_LINCOEF(1))); set( hetCalSSTPOffset, 'String', num2str(tsg.SSTP_LINCOEF(2))); 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' ); % Save the calibration coefficient % -------------------------------- tsg.CNDC_LINCOEF(1) = str2num(get( hetCalCNDCSlope, 'String')); tsg.CNDC_LINCOEF(2) = str2num(get( hetCalCNDCOffset, 'String')); tsg.SSJT_LINCOEF(1) = str2num(get( hetCalSSJTSlope, 'String')); tsg.SSJT_LINCOEF(2) = str2num(get( hetCalSSJTOffset, 'String')); tsg.SSTP_LINCOEF(1) = str2num(get( hetCalSSTPSlope, 'String')); tsg.SSTP_LINCOEF(2) = str2num(get( hetCalSSTPOffset, 'String')); % 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' ); % Get the calibration coefficients. % They will be used in the function calibration % --------------------------------------------- tsg.CNDC_LINCOEF(1) = str2num(get( hetCalCNDCSlope, 'String')); tsg.CNDC_LINCOEF(2) = str2num(get( hetCalCNDCOffset, 'String')); tsg.SSJT_LINCOEF(1) = str2num(get( hetCalSSJTSlope, 'String')); tsg.SSJT_LINCOEF(2) = str2num(get( hetCalSSJTOffset, 'String')); tsg.SSTP_LINCOEF(1) = str2num(get( hetCalSSTPSlope, 'String')); tsg.SSTP_LINCOEF(2) = 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 % ------------------------------------------------------------------- % updateAdjustedVariable( hMainFig ); % 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 ); % Update the Adjusted variables % ----------------------------- % updateAdjustedVariable( hMainFig ); % 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 % ------------------------------------------------- % set( hMapToggletool, 'state', 'off' ); % returns a zoom mode object for the figure hMainFig handle % --------------------------------------------------------- hZoom = zoom(hMainFig); % 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 % -------------------------------------------------- % setAllowAxesZoom(hZoom, hPlotAxes(4), false); % 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 % ------------------------------------------------- % set( hMapToggletool, 'state', 'off' ); % 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 % -------------------------------------------------- % setAllowAxesZoom(hZoom, hPlotAxes(4), false); % 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'); end %% Pan_OnMenuCallback %---------------------------------------------------------------------- % 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 % ------------------------------------------------- % set( hMapToggletool, 'state', 'off' ); % Returns a pan mode object for the figure handle % ----------------------------------------------- hPan = pan(hMainFig); % Disallows a pan operation on the MAP axes objects % -------------------------------------------------- % setAllowAxesPan(hPan, hPlotAxes(4), false); % 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); end %% Pan_OffMenuCallback %---------------------------------------------------------------------- % 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 % Re-draw the map once the zoom/pan is off % ---------------------------------------- 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 = tsg.plot.parameter{1}; SAMPLE = tsg.plot.sample; % 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) % 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,1) & tsg.DAYD_EXT < p2(1,1) & ... tsg.EXT_DIF > p1(1,2) & tsg.EXT_DIF < p2(1,2)); % 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; % Save the modifications % ---------------------- setappdata( hMainFig, 'tsg_data', tsg); % plot selected data with selected code % -------------------------------------- plot_Correction( hMainFig, hPlotAxes, PARA); end else % get index on selected zone % --------------------------- ind = find(tsg.DAYD > p1(1,1) & tsg.DAYD < p2(1,1) & ... tsg.(PARA) > p1(1,2) & tsg.(PARA) < p2(1,2)); % Keep the information on the indices of the selected zone % -------------------------------------------------------- tsg.rbboxind = ind .* ones(size(ind)); % Modifiy the QC % -------------- tsg.([PARA '_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); % Draw plot 1 of the validation figure % ------------------------------------ plot_Validation( hMainFig, hPlotAxes, 1, PARA ); % refresh QC statistic panel % -------------------------- display_QC( 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' ); set( hTimelimitToggletool, 'state', '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 = tsg.plot.parameter{1}; SAMPLE = tsg.plot.sample; % get key and some values in hashtable % ------------------------------------ code = get(tsg.qc.hash, key, 'code'); color = get(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; % Save tsg.SSPS_QC and 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 '_QC'])(tsg.rbboxind) = tsg.qc.active.Code; % Save tsg.SSPS_QC in the application data % ---------------------------------------- setappdata( hMainFig, 'tsg_data', tsg ); % Draw plot 1 of the validation figure % ------------------------------------ plot_Validation( hMainFig, hPlotAxes, 1, PARA ); 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 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); % get key and some values in hashtable % ------------------------------------ code = get(tsg.qc.hash, key, 'code'); color = get(tsg.qc.hash, key, 'color'); % set active code and color from selected context menu % ---------------------------------------------------- tsg.qc.active.Code = code; tsg.qc.active.Color = color; setappdata( hMainFig, 'tsg_data', tsg ); 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 % --------------------------------------------------------------- function postQcPanCallback(obj, evd) % 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' ); end %% MouseMotion %--------------------------------------------------------------------- % 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) % 2 callback are needed : % 1 - one to desactivate QC when Pan is set to on. % 2 - one to reactivate QC once the pan has been used. % --------------------------------------------------------- qcState = get(hQCToggletool, 'state' ); if strcmp(qcState, '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 pan(hMainFig, 'off'); end end % Dynamically display data in uicontrol % ------------------------------------- if x > tsg.DAYD(1) && x < tsg.DAYD(end) %if x > limx(1) && x < limx(2) indCursor = find( tsg.DAYD > x); set( hInfoDateText, 'String',... datestr(tsg.DAYD(indCursor(1)),'dd/mm/yyyy HH:MM')); set( hInfoLatText, 'String', dd2dm(tsg.LATX(indCursor(1)),0)); set( hInfoLongText, 'String', dd2dm(mod(tsg.LONX(indCursor(1))+180,360)-180,1)); if ~isempty(tsg.SSPS) set( hInfoSSPSText, 'String', tsg.SSPS(indCursor(1))); end if ~isempty(tsg.SSJT) set( hInfoSSJTText, 'String', tsg.SSJT(indCursor(1))); end if ~isempty(tsg.SSTP) set( hInfoSSTPText, 'String', tsg.SSTP(indCursor(1))); 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(1)) ) % Plot a Marker (Red point) on the ship track % ------------------------------------------- hMarker = m_line( tsg.LONX(indCursor(1)), 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' ); end else % a marker exists if ~isnan( tsg.LONX(indCursor(1)) ) % Delete the Marker and redraw it % ------------------------------- delete( h); hMarker = m_line( ... tsg.LONX(indCursor(1)), 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' ); end end end end end end %% Map_OnMenuCallback %--------------------------------------------------------------------- % 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) end %% Map_OffMenuCallback %--------------------------------------------------------------------- % Callback function run when the Map tool bar item is unselected %--------------------------------------------------------------------- function Map_OffMenuCallback(hObject, eventdata) % Make the earth map invisible % ---------------------------- set(hMapFig, 'Visible', 'off' ); end %% 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 = tsg.plot.parameter{1}; SAMPLE = tsg.plot.sample; % Switch somme buttons % -------------------- set( hQCToggletool, 'state', 'off' ); set( hZoomInToggletool, 'state', 'off', 'enable', 'on' ); set( hZoomOutToggletool, 'state', 'off', 'enable', 'on' ); set( hPanToggletool, 'state', 'off' ); % set( hMapToggletool, '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']) ) % Compute the sample-TSG differences % ---------------------------------- diffTsgSample( hMainFig, PARA ); else msgbox('No sample data file has been read', 'modal'); end % Plot in the 3 axes % ------------------ plot_Correction( hMainFig, hPlotAxes, PARA ); % 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( hMapToggletool, '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' ); % Get the parameter (SSPS, SSJT, SSTP) % ------------------------------------ % PARA = tsg.plot.parameter; % 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 %% CorCancelCallback .................................... Correction Module function CorCancelCallback(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 tsg application data % ------------------------ tsg = getappdata(hMainFig, 'tsg_data'); % Get parameter we are working on (SSPS, SSJT, SSTP) % -------------------------------------------------- PARA = tsg.plot.parameter{1}; % To cancel the correction set the ADJUSTED variable % to [] % -------------------------------------------------- tsg.([PARA '_ADJUSTED']) = []; tsg.([PARA '_ADJUSTED_QC']) = []; tsg.([PARA '_ADJUSTED_ERROR']) = []; % Save tsg data % ------------- setappdata(hMainFig, 'tsg_data', tsg); % Set the ADJUSTED variable either to the raw variable or to % the calibrated variable % ---------------------------------------------------------- % updateAdjustedVariable( hMainFig ); % Plot in the 3 axes % ------------------ plot_Correction( hMainFig, hPlotAxes, PARA ); end %% CorLinearCallback .................................... Correction Module function CorLinearCallback(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 the parameter (SSPS, SSJT, or SSTP) % --------------------------------------- tsg = getappdata(hMainFig, 'tsg_data'); PARA = tsg.plot.parameter{1}; SAMPLE = tsg.plot.sample; if ~isempty( tsg.([SAMPLE '_EXT']) ) % Compute the sample-TSG differences % ---------------------------------- diffTsgSample( hMainFig, PARA ); % Correction % ---------- error = corTsgLinear(hMainFig, PARA, dateMin, dateMax); switch error case 1 % Plot in the 3 axes % ------------------ plot_Correction( hMainFig, hPlotAxes, PARA ); case -1 msgbox( 'Date limits are not correct',... 'Correction module', 'warn', 'modal'); end end end %% CorMedianCallback .................................... Correction Module function CorMedianCallback(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 the parameter (SSPS, SSJT, or SSTP) % --------------------------------------- tsg = getappdata(hMainFig, 'tsg_data'); PARA = tsg.plot.parameter{1}; SAMPLE = tsg.plot.sample; if ~isempty( tsg.([SAMPLE '_EXT']) ) % Compute the sample-TSG differences % ---------------------------------- diffTsgSample( hMainFig, PARA ); % Correction % ---------- error = corTsgMedian(hMainFig, PARA, dateMin, dateMax); switch error case 1 % Plot in the 3 axes % ------------------ plot_Correction( hMainFig, hPlotAxes, PARA ); otherwise % Nothing is done - Error msg within the corTsgMedian function end end end %% PopupMenu Select Parameter % --------------------------- 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.parameter{nplot} = selected_string; if nplot == 1 tsg.plot.sample = selected_string; if strcmp( tsg.plot.sample, 'SSJT' ) tsg.plot.sample = 'SSTP'; end end % 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); end end %% 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 % 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) % Callback function run when the .... % 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); end %% Clim_OnMenuCallback %------------------------------------------------------------------------ % 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 end %% PreferencesMenuCallback % ------------------------------------------------------------------- % Callback function run when Option/Preference is selected % ------------------------------------------------------------------- function PreferencesMenuCallback(hObject, eventdata) % 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 end end %% 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); end %% 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 % prevent drawing to map % ---------------------------------------------- set( hMainFig, 'WindowButtonMotionFcn', []); % Get the tsg structure % --------------------- tsg = getappdata( hMainFig, 'tsg_data'); % Default parameter % ----------------- PARA = tsg.plot.parameter{1}; 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); if strcmp(get(hBottleToggletool,'state'), 'on') 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 ); else 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} ); % I = getframe(hPlotAxes(1)); % imwrite(I.cdata, 'myplot.png'); end for i = 1 : length( hPlot ) set(hPlot(i), 'box', 'on','XTickMode','auto'); datetick(hPlot(i),'x','keeplimits' ); end % enable ButtonMotion on main fig after select QC area % ---------------------------------------------------- set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion); 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' ); % Check for NetCDF writing error % 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 %% ExportTsgCallback % ------------------------------------------------------------------- % 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 % -------------------------- 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 % -------------------------------------------------------- if error == -1 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 % ----------------------------------------- [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 return; end % Pointer set to watch during reading and plotting % ------------------------------------------------ set( hMainFig, 'Pointer', 'watch' ); % 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'); end %% QuitMapCallback % ----------------------------------------------------------------- % Callback function run when the Quit Map Figure item is selected % ----------------------------------------------------------------- function QuitMapCallback(hObject, eventdata) % Make the earth map invisible % ---------------------------- set(hMapFig, 'Visible', 'off' ); set(hMapToggletool, 'state', 'off' ); end %% QuitMenuCallback % ----------------------------------------------------------------- % Callback function run when the Quit menu item is selected % ----------------------------------------------------------------- function QuitMenuCallback(hObject, eventdata) % save config mat file in prefdir % ------------------------------- config_file = [prefdir, filesep, tsgqcname, '.mat']; % save preference mat file % ------------------------ preference = tsg.preference; save( config_file, 'preference'); % 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; end % quit program % ------------ quitProgram(DEFAULT_PATH_FILE, hMainFig, hMapFig); else 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 end end % end of tsgqc % ---------------- end