Skip to content
Snippets Groups Projects
tsgqc_GUI.m 41.4 KiB
Newer Older
% tsgqc_GUI 
% TSG (Thermosalinograph) Quality Control software
%
% $Id$
%

%% COPYRIGHT & LICENSE
%  Copyright 2007 - IRD US191, all rights reserved.
%
%  This file is part of tsgqc_GUI.
%
%    Datagui is free software; you can redistribute it and/or modify
%    it under the terms of the GNU General Public License as published by
%    the Free Software Foundation; either version 2 of the License, or
%    (at your option) any later version.
%
%    tsgqc_GUI is distributed in the hope that it will be useful,
%    but WITHOUT ANY WARRANTY; without even the implied warranty of
%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%    GNU General Public License for more details.
%
%    You should have received a copy of the GNU General Public License
%    along with Datagui; if not, write to the Free Software
%    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

%%  Initialization tasks
%   ********************
    % 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]
    % Screen limits for the GUI
    % -------------------------
    set(0,'Units','normalized');
    guiLimits = get(0,'ScreenSize');
    guiLimits(1) = guiLimits(1) + 0.05;
    guiLimits(2) = guiLimits(2) + 0.1;
    guiLimits(3) = guiLimits(3) - 0.1;
    guiLimits(4) = guiLimits(4) - 0.2;
    
    % Create and then hide the GUI as it is being constructed.
    % --------------------------------------------------------
    hMainFig = figure(...
                'Name', 'TSG Validation', ...
                'NumberTitle', 'off', ...
                'Resize', 'on', ...
                'Menubar','none', ...
                'Toolbar', 'none', ...
                'UserData', 'ButtonMotionOff', ...
                'WindowButtonMotionFcn', @MouseMotion, ...
                'HandleVisibility','callback',...
                'Visible','on',...
                'Units', 'normalized',...
                'Position',guiLimits, ...
                'Color', get( 0, 'DefaultUIControlBackgroundColor' ));
    
    %  Construct the Menu
    %   -----------------
    hFileMenu = uimenu(...
                    'Parent', hMainFig,...
                    'HandleVisibility','callback',...
                    'Label', 'File');
    hOpenMenu = uimenu(...
                    'Parent', hFileMenu,...
                    'UserData', 'off', ...
                    'Label','Open',...
                    'Accelerator','O',...
                    'HandleVisibility','callback',...
                    'Callback', @OpenMenuCallback);
    hSaveMenu = uimenu(...
                    'Parent', hFileMenu,...
                    'Label','Save',...
                    'Accelerator','S',...
                    'UserData', 'off', ...
                    'HandleVisibility','callback',...
                    'Callback',@SaveMenuCallback);
    hQuitMenu = uimenu(...
                    'Parent',hFileMenu,...
                    'Label','Quit',...
                    'Separator','on',...
                    'Accelerator','Q',...
                    'HandleVisibility','callback',...
                    'Callback',@QuitMenuCallback);

    %  Construct the Toolbar
    %   -----------------
    hToolbar       =   uitoolbar(...   % Toolbar for Open and Print buttons
                        'Parent',hMainFig, ...
                        'HandleVisibility','callback');
    hOpenPushtool  =   uipushtool(...   % Opendoc toolbar button
                        'Parent',hToolbar,...
                        'TooltipString','Open file',...
                        'CData', iconRead(fullfile(matlabroot, ...
                                     '/toolbox/matlab/icons/opendoc.mat')),...
                        'HandleVisibility','callback', ...
                        'Tag','PUSHTOOL_OPEN',...
                        'UserData', 'off',...
                        'Enable', 'on',...
                        'ClickedCallback', @OpenMenuCallback);
    hSavePushtool  =   uipushtool(...   % Open Save toolbar button
                        'TooltipString','Save NetCDF file',...
                           [DEFAULT_PATH_FILE 'tsg_icon' filesep 'savedoc.mat']),...
                        'HandleVisibility','callback', ...
                        'Tag','PUSHTOOL_SAVE',...
                        'Enable', 'off',...
                        'ClickedCallback', @SaveMenuCallback);
    hZoomPushtool  =   uipushtool(...   % Open Zoom toolbar button
                        'Parent',hToolbar,...
                        'Separator', 'on', ...
                        'TooltipString','Zoom',...
                        'CData', iconRead(fullfile(matlabroot, ...
                                     '/toolbox/matlab/icons/zoom.mat')),...
                        'HandleVisibility','callback', ...
                        'Tag','PUSHTOOL_ZOOM',...
                        'Enable', 'off',...
                        'ClickedCallback', @ZoomMenuCallback);
    hPanPushtool  =   uipushtool(...   % Open Pan toolbar button
                        'Parent',hToolbar,...
                        'TooltipString','Pan',...
                        'CData',iconRead(fullfile(matlabroot, ...
                                      '/toolbox/matlab/icons/pan.mat')),...
                        'HandleVisibility','callback', ...
                        'Tag','PUSHTOOL_PAN',...
                        'Enable', 'off',...
                        'ClickedCallback', @PanMenuCallback);
    hQCPushtool  =   uipushtool(...   % Open QC toolbar button
                        'Parent',hToolbar,...
                        'TooltipString','Validation codes',...
                        'Separator', 'on', ...
                        'CData',iconRead(...
                            [DEFAULT_PATH_FILE 'tsg_icon' filesep 'qcicon.mat']),...
                        'HandleVisibility','callback', ...
                        'Tag','QC',...
                        'UserData', 'off',...
                        'Enable', 'off',...
                        'ClickedCallback', @QCMenuCallback);
    hMapPushtool  =   uipushtool(...   % Open Map toolbar button
                        'Parent',hToolbar,...
                        'TooltipString','Map and ship track',...
                        'Separator', 'on', ...
                        'CData',iconRead(...
                            [DEFAULT_PATH_FILE 'tsg_icon' filesep 'mapicon.mat']),...
                        'HandleVisibility','callback', ...
                        'Tag','PUSHTOOL_MAP',...
                        'UserData', 'off', ...
                        'Enable', 'off',...
                        'ClickedCallback', @MapMenuCallback);
    hClimPushtool  =   uipushtool(...   % Open Climatology toolbar button
                        'Parent',hToolbar,...
                        'TooltipString','Climatology',...
                        'Separator', 'on', ...
                        'CData',iconRead(...
                           [DEFAULT_PATH_FILE 'tsg_icon' filesep 'climicon.mat']),...
                        'HandleVisibility','callback', ...
                        'Tag','PUSHTOOL_CLIM',...
                        'UserData', 'off',...
                        'Enable', 'off',...
                        'ClickedCallback', @ClimMenuCallback);
    hBottlePushtool  = uipushtool(...   % Open toolbar button
                        'Parent',hToolbar,...
Yves Gouriou's avatar
Yves Gouriou committed
                        'TooltipString','Plot the Samples',...
                        'Separator', 'on', ...
                        'CData',iconRead(...
                         [DEFAULT_PATH_FILE 'tsg_icon' filesep 'bottleicon.mat']),...
                        'HandleVisibility','callback', ...
                        'Tag','BOTTLE',...
                        'Enable', 'off',...
                        'ClickedCallback', @BottleMenuCallback);
    hHeaderPushtool  = uipushtool(...   % Open headerForm button
                        'Parent',hToolbar,...
                        'TooltipString','Fill the header form',...
                        'Separator', 'on', ...
                        'CData',iconRead(...
                         [DEFAULT_PATH_FILE 'tsg_icon' filesep 'hdricon.mat']),...
                        'HandleVisibility','callback', ...
                        'Tag','PUSHTOOL_HEADER',...
                        'Enable', 'off',...
                        'ClickedCallback', @HeaderMenuCallback);                      

    % Static text that displays the position, salinity and temperature
    % ----------------------------------------------------------------
    hInfoText = uicontrol(...
                'Parent', hMainFig, ...
                'Style', 'text', ...
                'Fontsize', 12, ...
                'Visible','on',...
                'Units', 'normalized',...
                'String', 'Information sur la position du curseur', ...
                'Position', [.05, .95, .9, .03]);

    
    % Construct the plot axes
    % -----------------------
    hPlotAxes(1) = axes(...     % the axes for plotting Salinity
                'Parent', hMainFig, ...
                'Units', 'normalized', ...
                'Visible', 'off', ...
                'HandleVisibility','callback', ...
                'Position',[.05, .6, .9, .32]); 
    hPlotAxes(2) = axes(...     % the axes for plotting temperature
                'Parent', hMainFig, ...
                'Units', 'normalized', ...
                'Visible', 'off', ...
                'HandleVisibility','callback', ...
                'Position',[.05, .3, .9, .25]); 
    hPlotAxes(3) = axes(...     % the axes for plotting ship velocity
                'Parent', hMainFig, ...
                'Units', 'normalized', ...
                'Visible', 'off', ...
                'HandleVisibility','callback', ...
                'Position',[.05, .05, .9, .2]); 
            
    % The map will be plot in a uipanel
    hMapPanel = uipanel( ...
                'Parent', hMainFig, ...
                'Units', 'normalized', ...
                'Visible', 'off', ...
                'Position',[0, 0, 1, .57]); 
                
    hPlotAxes(4) = axes(...     % the axes for plotting ship track map
                'Parent', hMapPanel, ...
                'Units', 'normalized', ...
                'Visible', 'off', ...
                'Color', 'none', ...
                'UserData', 'off', ...
                'UserData', [], ...
                'HandleVisibility','callback', ...
                'Position',[.05, .05, .9, .9]); 
                     
    % Construct the context menu for the Quality control codes
    % -------------------------------------------------------
    hQcCmenu = uicontextmenu(...
                           'Parent', hMainFig, ...
                           'HandleVisibility','callback' );
    hQcCmenuNocontrol = uimenu(...
                            'Parent', hQcCmenu,... 
                            'HandleVisibility','off', ...
                            'Label', 'No control',...
                            'ForegroundColor', 'k',...
                            'Callback', @QcNoControl);
    hQcCmenuGood      = uimenu(...
                            'Parent', hQcCmenu,... 
                            'HandleVisibility','off', ...
                            'Label', 'Good',...
                            'ForegroundColor', 'b',...
                            'Callback', @QcGood);
    hQcCmenuProbGood  = uimenu(...
                            'Parent', hQcCmenu,... 
                            'HandleVisibility','off', ...
                            'Label', 'Probably Good',...
                            'Callback', @QcProbGood,...
                            'ForegroundColor', 'g');
    hQcCmenuProbBad   = uimenu(...
                            'Parent', hQcCmenu,... 
                            'HandleVisibility','off', ...
                            'Label', 'Probably bad',...
                            'ForegroundColor', 'm',...
                             'Callback', @QcProbBad);
    hQcCmenuBad       = uimenu(...
                            'Parent', hQcCmenu,... 
                            'HandleVisibility','off', ...
                            'Label', 'Bad',...
                            'ForegroundColor', 'r',...
                            'Callback', @QcBad);

                        
    % Initialisation
    % --------------
    tsg_initialisation(hMainFig, hQcCmenu)    

    
%  Callbacks for tsgcqc_GUI
%  ************************

    %----------------------------------------------------------------------
    function OpenMenuCallback(hObject, eventdata)
    % Callback function run when the Open menu item is selected    
    
        % Pointer set to watch during reading and plotting
        % ------------------------------------------------
        set( hMainFig, 'Pointer', 'watch' );
    
        % Make the filename
        % ATTENTION : function OpenMenuCallback(hObject, eventdata)
        % This has to be made general for UNIX and WINDOWS system
        % ---------------------------------------------------------
        [filename, pathname, filterIndex] = uigetfile( ...
Yves Gouriou's avatar
Yves Gouriou committed
                    {'*.txt';'*.xml';'*.nc';'*.btl'}, 'Pick a file');
Yves Gouriou's avatar
Yves Gouriou committed
        error1 = -1;
        error2 = -1;
        if ~isequal(filename, 0)
            
            % Read the data
            % -------------
                error1 = readTsgDataTxt( hMainFig, filename );
                error1 = readTsgDataXML( hMainFig, filename );
                error1 = readTsgDataNetCDF( hMainFig, filename );
                %# a modifier
                if error1 == 1
                  error2 = error1;
                end  
Yves Gouriou's avatar
Yves Gouriou committed
              case 4
                error2 = readBucketData(hMainFig, filename );
Yves Gouriou's avatar
Yves Gouriou committed
            end

            % A TSG file has been read. Plot the data.
            % ----------------------------------------
            if error1 ~= -1
Yves Gouriou's avatar
Yves Gouriou committed
                % A TSG file has been open and read
                % ---------------------------------
                set( hOpenMenu, 'UserData', 'on' );
                hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
                set(hdl_pushtool, 'Enable', 'on');
              
            
                % The callback to detect the mouse motion can be set to on
                % --------------------------------------------------------
                set( hMainFig, 'UserData', 'ButtonMotionOn');
                
                % Make the Salinity, temperature and velocity plot
                % ------------------------------------------------
                plot_SalTempVel( hMainFig, hPlotAxes );
            
                % Plot the Map with the ship trackline
                % ------------------------------------
                plotmap( hMainFig, hPlotAxes)

        % Merge the different water sample (NetCdf or ASCII files) in
        % a unique structure : 'sample'
        % -----------------------------------------------------------
        %@ desactive le merge pour l'instant en attente d'une structure de
        %donnes validee
        %@[sample] = tsg_mergesample( hMainFig );
               
        %@ Save the 'sample' struct. as an application data
        % ------------------------------------------------
        %if ~isempty( sample )
        %    setappdata( hMainFig, 'sample', sample );
        %end

        % Plot Salinity bucket
        % ------------------------------------------------
        if error2 ~= -1             
            plot_SalTsgSample( hMainFig, hPlotAxes );
        % Pointer reset to arrow
        % ----------------------
        set( hMainFig, 'Pointer', 'arrow' );

    end

    %----------------------------------------------------------------------
    function ZoomMenuCallback(hObject, eventdata)
    % Callback function run when the Open menu item is selected    
        
        % Returns a zoom mode object for the figure handle
        hZoom = zoom(hMainFig);
        % Specifies whether this mode is currently enabled on the figure
        zoomOnOff = get(hZoom, 'Enable' );
        switch zoomOnOff
            case 'on'
                zoom off
                zoomAdaptiveDateTicks('off');
            case 'off'
                pan off
                set(hQCPushtool, 'UserData', 'off' );

                zoom on
                zoomAdaptiveDateTicks('on');
        end
      %  zoomColor = get(hZoomPushtool,'CData');
      % set(hZoomplusPushtool,'CData', zoomColor);
    end

    %----------------------------------------------------------------------
    function PanMenuCallback(hObject, eventdata)
    % Callback function run when the Open menu item is selected    
        
        % Returns a pan mode object for the figure handle
        hPan = pan(hMainFig);
        % Specifies whether this mode is currently enabled on the figure
        panOnOff = get(hPan, 'Enable' );
        switch panOnOff
            case 'on'
                pan off
                panAdaptiveDateTicks('off');
            case 'off'
                zoom off
                set(hQCPushtool, 'UserData', 'off' );

                pan on
                panAdaptiveDateTicks('on');
                
        end
    end

    %----------------------------------------------------------------------
    function QCMenuCallback(gcbo, eventdata,handles)
    % Callback function run when the QC pushbutton is selected
        
        % Desactivate the Zoom and Pan functions.
        % ---------------------------------------
        zoom off; pan off
        panAdaptiveDateTicks('off');zoomAdaptiveDateTicks('off');

        % Retrieve named application data
        % -------------------------------
        tsg = getappdata( hMainFig, 'tsg_data');
        
        % Toggle the tag of the Qc pushbutton to 'on' or 'off'
        % ----------------------------------------------------
        switch get(hQCPushtool, 'UserData'); 
                set(hQCPushtool, 'UserData', 'on' );
                set(hPlotAxes(1),'UIContextMenu', hQcCmenu);
                set( hMainFig, 'Pointer', 'crosshair');
            case 'on'
                set(hQCPushtool, 'UserData', 'off' );
                set(hPlotAxes(1),'UIContextMenu', []);
                set(hMainFig,'Pointer','arrow');
        end
        
        qualityCode = -1;
        ind = [];
        while strcmp( get(hQCPushtool, 'UserData'),'on')
        
            k = waitforbuttonpress;
        
            % If the QC pushbutton is pressed we quit the callback
            % ----------------------------------------------------
            if strcmp( get(hQCPushtool, 'UserData'),'off')
                        
                % Desactivate the context menu use to choose the
                % Quality Codes
                % ----------------------------------------------
                set(hQcCmenu, 'Visible', 'off');
                break
            end

            % Test if the right mouse button is clicked
            % -----------------------------------------
            if strcmp(get(hMainFig, 'SelectionType'), 'alt') && ~isempty(ind)
                % Wait for a QC Context Menu choice : The user choose the
                % quality code
                % -------------------------------------------------------
                uiwait
                qualityCode = 1;

            else

                % Mouse motion callback desactivated when a selection is
                % made. Otherwise there is a conflict with the map if it
                % is activated
                % -------------------------------------------------------
                set( hMainFig, 'UserData', 'ButtonMotionOff');
                
                % Selection of the data within the figure
                % ---------------------------------------
                point1 = get(gca,'CurrentPoint');    % button down detected
                finalRect = rbbox;                   % return figure units
                point2 = get(gca,'CurrentPoint');    % button up detected

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

                ind = find(tsg.DAYD > p1(1,1) & tsg.DAYD < p2(1,1) & ...
                            tsg.SSPS > p1(1,2) & tsg.SSPS < p2(1,2));
                
                % As soon as a modification took place the data should be
                % saved
                % -------------------------------------------------------
                set( hSaveMenu, 'UserData', 'on' );
                        
                % Selection made : Mouse motion callback re-activated
                % --------------------------------------------------
                set( hMainFig, 'UserData', 'ButtonMotionOn');

            end

            % Plot the data with the color of the chosen quality Code.
            % Is it the right place for this source code ????
            % --------------------------------------------------------
            if qualityCode ~= -1
                
                quality = get( hQcCmenu, 'UserData');

                tsg.SSPS_QC(ind) = quality.Code;   
                
                % Save the modifications
                % ----------------------
                setappdata( hMainFig, 'tsg_data', tsg);
               
                axes(hPlotAxes(1));
                hold on
                color = ['.' quality.Color];
                plot(tsg.DAYD(ind), tsg.SSPS(ind), color );
                hold off
                
            end
        end
    end

    %---------------------------------------------------------------------
    function QcNoControl(hObject, eventdata)
    % Callback function run when the QC context menu is selected
    
         % Retrieve Default Quality Code and Color
         % ---------------------------------------
         qc = getappdata( hMainFig, 'qcColor');
         
         quality.Code  = qc.Code.NO_CONTROL;
         quality.Color = qc.Color.NO_CONTROL;
         set( hQcCmenu, 'UserData', quality );
         
         % uiwait in the QCMenuCallback function
         % -------------------------------------
         uiresume
     end

    %---------------------------------------------------------------------
     function QcGood(hObject, eventdata)
    % Callback function run when the QC context menu is selected
         
         % Retrieve named application data
         % -------------------------------
         qc = getappdata( hMainFig, 'qcColor');
         
         quality.Code  = qc.Code.GOOD;
         quality.Color = qc.Color.GOOD;
         set( hQcCmenu, 'UserData', quality );
         
         % uiwait in the QCMenuCallback function
         % -------------------------------------
         uiresume
     end

    %---------------------------------------------------------------------
     function QcProbGood(hObject, eventdata)
    % Callback function run when the QC context menu is selected
        
         % Retrieve named application data
         % -------------------------------
         qc = getappdata( hMainFig, 'qcColor');
         
         quality.Code  = qc.Code.PROBABLY_GOOD;
         quality.Color = qc.Color.PROBABLY_GOOD;
         set( hQcCmenu, 'UserData', quality );
         
         % uiwait in the QCMenuCallback function
         % -------------------------------------
         uiresume
     end

    %---------------------------------------------------------------------
     function QcProbBad(hObject, eventdata)
    % Callback function run when the QC context menu is selected
         
         % Retrieve named application data
         % -------------------------------
         qc = getappdata( hMainFig, 'qcColor');
         
         quality.Code  = qc.Code.PROBABLY_BAD;
         quality.Color = qc.Color.PROBABLY_BAD;
         set( hQcCmenu, 'UserData', quality );
         
         % uiwait in the QCMenuCallback function
         % -------------------------------------
         uiresume
     end

    %---------------------------------------------------------------------
     function QcBad(hObject, eventdata)
    % Callback function run when the QC context menu is selected

         % Retrieve named application data
         % -------------------------------
         qc = getappdata( hMainFig, 'qcColor');
         
         quality.Code  = qc.Code.BAD;
         quality.Color = qc.Color.BAD;
        
         % uiwait in the QCMenuCallback function
         % -------------------------------------
         uiresume
     end

    %---------------------------------------------------------------------
    function MouseMotion(hObject, eventdata)
     
      % Test if the callback can be activated
      % -------------------------------------
      if strcmp( get( hMainFig, 'UserData'), 'ButtonMotionOn')
          
        % Retrieve named application data
        % -------------------------------
        tsg = getappdata( hMainFig, 'tsg_data');
        
        % Get the mouse position
        % ----------------------
        point = get(gcf,'CurrentPoint');
        
        if point(1) > .05 && point(2) > .6 && point(1) < .95 && point(2) < .92
    
            % Get current position of cusor and return its coordinates in
            % axes with handle h_axes
            % -----------------------------------------------------------
            [x, y] = gpos(hPlotAxes(1));
                    
            if x > tsg.DAYD(1) && x < tsg.DAYD(end)
                indCursor = find( tsg.DAYD > x);
                % use sprintf with format instead strcat & num2str but flag
                % - don't work with 0, eg %+07.4f
                set( hInfoText, 'String',...
                  sprintf(['%s   -   Latitude = %s   -   Longitude = %s '...
                           '  -   Salinity = %07.4f   -   Temperature = %07.4f'],...
                    datestr(tsg.DAYD(indCursor(1)),'dd/mm/yyyy HH:MM'),...
                    dd2dm(tsg.LATX(indCursor(1)),0), ...
                    dd2dm(tsg.LONX(indCursor(1)),1), ...
                    tsg.SSPS(indCursor(1)), ...
                    tsg.SSJT(indCursor(1))...
                ));
            
               % Plot the position on the map if this one is active
               % --------------------------------------------------
                if strcmp( get(hMapPanel, 'Visible'), 'on')
                    
                    % Select the map axes
                    % -------------------
                    axes( hPlotAxes(4));
                    
                    if isempty( get(hMapPanel, 'UserData'))
                       hMarker = m_line( ...
                             tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),...
                             'Marker','o','MarkerSize',5, ...
                             'Color','r', 'MarkerFaceColor','r');
                       set(hMapPanel, 'UserData', hMarker)
                    else
                       delete(get(hMapPanel, 'UserData'));
                       hMarker = m_line( ...
                             tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),...
                             'Marker','o','MarkerSize',5, ...
                             'Color','r', 'MarkerFaceColor','r');
                       set(hMapPanel, 'UserData', hMarker);
                    end
                end
            end
        end
      end
    end

    %---------------------------------------------------------------------
    function MapMenuCallback(hObject, eventdata)
    % Callback function run when the Map tool bar item is selected
    % Make the earth map visible or not
        
        if strcmp( get(hMapPanel, 'Visible'), 'off' )
            set(hMapPanel, 'Visible', 'on' );
        else
            set(hMapPanel, 'Visible', 'off' );
        end
    end

    %---------------------------------------------------------------------
    function BottleMenuCallback(hObject, eventdata)
    % Callback function run when the Bottle tool bar item is selected
    %
    % Plot or Delete the buckets measurements on the Salinity graph
    %
    % Need to read them right now - but they will be soon in the NetCdf
    % file
 
Yves Gouriou's avatar
Yves Gouriou committed
    % Test if the sample Push button has been pressed
    % -----------------------------------------------
        if strcmp( get(hBottlePushtool, 'UserData'), 'off')
            % Sample Push button - UserData set to 'on'
            % ------------------------------------
            set( hBottlePushtool, 'UserData', 'on' );
            % Test if tsg and sample data have been loaded
            % --------------------------------------------
            if ~isempty( getappdata( hMainFig, 'tsg_data') ) && ...
               ~isempty( getappdata( hMainFig, 'sample') )
           
                % Call the GUI for tsg correction
                % -------------------------------
                %msgbox('The correction module has not been implemented', 'modal');
                tsgcor_GUI( hMainFig );
                msgbox('TSG or Sample data not loaded in the program', 'modal');
Yves Gouriou's avatar
Yves Gouriou committed
            % Plot the samples if the TSG file has been read
            % ----------------------------------------------
%            if strcmp( get(hOpenMenu, 'UserData'), 'on' ) && ~isempty( sample )
%                axes( hPlotAxes(1) );
%                hLine.Sample = line( ...
%                    sample.TIME, sample.PSAL,...
%                    'Linestyle', 'none', 'Marker','o','MarkerSize',5, ...
%                    'Color','r', 'MarkerFaceColor','r');
 
                % Store the handle of the bucketline
                % ----------------------------------
%                set( hPlotAxes(1), 'UserData', hLine );
%            end
            set( hBottlePushtool, 'UserData', 'off' );

            % The bucket pushbutton has been pressed again : 
            % Delete the bucket on figure
            % ----------------------------------------------
%            hLine = get( hPlotAxes(1), 'UserData');
%            if ~isempty( hLine ) && ishandle( hLine.Sample )
%                delete(hLine.Sample);
 %           end
        end
    end

    %---------------------------------------------------------------------
    function ClimMenuCallback(hObject, eventdata)
    % Callback function run when the ClimMenu menu item is selected
    %
    % Plot or delete salinity climatology over Salinity plot
    %
    % Function to be written
 
    % Test if the climatology Push button has been pressed
    % ----------------------------------------------------
        if strcmp( get(hClimPushtool, 'UserData'), 'off')
            % Climatology push button - UserData set to 'on'
            % -----------------------------------------
            set( hClimPushtool, 'UserData', 'on' );
            % Test if the TSG and bucket files have been read
            % -----------------------------------------------
            if strcmp( get(hOpenMenu, 'UserData'), 'on' )
                % -----------------------
                tsg = getappdata( hMainFig, 'tsg_data' );
                hLine1 = get( hPlotAxes(1), 'UserData');
                hLine2 = get( hPlotAxes(2), 'UserData');
                
                % Read Climatology 
                % ----------------
                if isempty( tsg.levitus.data)
                  levitus = read_file_woa01( 'woa01an.nc' );
                  if ~isstruct(levitus)
                    errordlg({'NetCDF climatology file not present in you path',...
                              'Check your matlab path or download it from',...
                              'ftp://ftp.ifremer.fr/ifremer/ird/us191/oceano/lib/matlab/woa01an.nc'},...
                              'NetCDF climatology file access error');
                    return;   
                  else
                    tsg.levitus.data = levitus;
                    tsg.levitus.type = 'woa01an';
                  end  
                  setappdata( hMainFig, 'tsg_data', tsg );
                end
                % round positive latitude and Longitude toward zero
                % -------------------------------------------------
                ind = find(tsg.LATX > 0);
                lat(ind) = fix(tsg.LATX(ind)) + 0.5;
                ind = find(tsg.LONX > 0);
                lon(ind) = fix(tsg.LONX(ind)) + 0.5;
                
                % rounds negative latitude and Longitudeto the nearest lowest integers
                % ---------------------------------------------------------------------
                ind = find(tsg.LATX <= 0);
                lat(ind) = floor(tsg.LATX(ind)) + 0.5;
                ind = find(tsg.LONX <= 0);
                lon(ind) = floor(tsg.LONX(ind)) + 0.5;
                
                % Calculates differences between adjacent elements of X.
                % 0 if adajacent latitude or longitude are equal
                % - 1 or -1 otherwise
                % ------------------------------------------------------------
                lat_diff = [diff( lat )'; 0];
                lon_diff = [diff( lon )'; 0];
                
                % Select latitude and longitude
                % -----------------------------
                ind  = find(abs(lat_diff) == 1 | abs(lon_diff == 1));
                lat2 = lat( ind );
                lon2 = lon( ind );
                time = tsg.DAYD( ind );
                temp = tsg.SSJT( ind );
                psal = tsg.SSPS( ind );
                %           LATX(80)  = -0.5 et LATX(81)  = 0.5
                %           LONX(180) = -0.5 et LONX(181) = 0.5
                % ----------------
                mean_temp = zeros(size(ind));
                mean_psal = zeros(size(ind));
                std_temp  = zeros(size(ind));
                std_psal  = zeros(size(ind));                
                for i=1:length(ind)
                  ilat         = find(tsg.levitus.data.WOA01_LATX == lat2(i));
                  ilon         = find(tsg.levitus.data.WOA01_LONX == lon2(i));
                  mean_temp(i) = tsg.levitus.data.WOA01_MEAN_TEMP(ilat,ilon,1);
                  mean_psal(i) = tsg.levitus.data.WOA01_MEAN_PSAL(ilat,ilon,1);
                  std_temp(i)  = tsg.levitus.data.WOA01_STD_TEMP(ilat,ilon,1);
                  std_psal(i)  = tsg.levitus.data.WOA01_STD_PSAL(ilat,ilon,1);              
                end  
                
                % Plot mean salinity climatology
                hLine1.meanClim = line( ...
                    time, mean_psal,'Linestyle', '-', 'Color','k');
                % Plot 2 standard deviation  
                hLine1.stdClimPlus = line( ...
                    time,  mean_psal + 3 * std_psal ,'Linestyle', '-', 'Color','r');
                hLine1.stdClimMinus = line( ...
                    time,  mean_psal - 3 * std_psal ,'Linestyle', '-', 'Color','r');
                % Plot mean temperature climatology
								axes( hPlotAxes(2));
                hLine2.meanClim = line( ...
                    time, mean_temp,'Linestyle', '-', 'Color','k');  
                hLine2.stdClimPlus = line( ...
                    time,  mean_temp + 3 * std_temp ,'Linestyle', '-', 'Color','r');
                hLine2.stdClimMinus = line( ...
                    time,  mean_temp - 3 * std_temp ,'Linestyle', '-', 'Color','r');

                % Store the handle of the bucketline
                % ----------------------------------
                set( hPlotAxes(1), 'UserData', hLine1 );
                set( hPlotAxes(2), 'UserData', hLine2 );
            set( hClimPushtool, 'UserData', 'off' );

            % The bucket pushbutton has been pressed again : 
            % Delete the bucket on figure
            % ----------------------------------------------
            hLine1 = get( hPlotAxes(1), 'UserData');
            hLine2 = get( hPlotAxes(2), 'UserData');
              delete(hLine1.stdClimMinus);
              delete(hLine1.stdClimPlus);
              delete(hLine1.meanClim);
              delete(hLine2.stdClimMinus);
              delete(hLine2.stdClimPlus);
              delete(hLine2.meanClim);
    % -------------------------------------------------------------------
    function HeaderMenuCallback(hObject, eventdata)
    % Callback function run when the headerForm tool bar item is selected
     
      % call header form function
      % -------------------------
      headerForm(hMainFig);
    end
  
    % -------------------------------------------------------------------
    function SaveMenuCallback(hObject, eventdata)
    % Callback function run when the Save menu item is selected
        
      % fill or append header form
      % -------------------------
      error = headerForm(hMainFig);
      
      % if user press continue button, ask for netcdf file
      % ------------------------------------------------  
      if error ~= -1  
        [fileName, pathName, filterIndex] = uiputfile('*.nc', ...
                                          
        % if user press cancel button, all var set to zero
        % ------------------------------------------------                            
        if fileName == 0
          return;
        end  
         
        % Pointer set to watch during reading and plotting
        % ------------------------------------------------
        set( hMainFig, 'Pointer', 'watch' );
        % flushes the event queue and updates the closed uiputfile window
        % ---------------------------------------------------------------
        drawnow;
        
        % write netcdf file
        % -----------------
        fileName = [pathName fileName];
        error = writeTSGDataNetCDF( hMainFig, fileName );
        
        % Pointer reset to arrow
        % ----------------------
        set( hMainFig, 'Pointer', 'arrow' );
        
        % Check for a writing pb to NetCDF
        % must to be rewriting
        % --------------------------------
        if error == -1
            warning(['NetCDF writing error:'  fileName]);
    end

        
    % -----------------------------------------------------------------
    function QuitMenuCallback(hObject, eventdata)
    % Callback function run when the Quit menu item is selected
        % If the data have been modified and not save, the program
        % propose to save the data
        % --------------------------------------------------------
        if  strcmp( get( hSaveMenu, 'UserData' ), 'on')
            selection = ...
            questdlg('The file has been modified.  Do you want to save it ?',...
                      'Save before Quit?',...
                      'Yes', 'No', 'Yes');
            if strcmp(selection, 'Yes')
                return;
            else
            end
        else
            selection = ...
                    questdlg(['Quit ' get(hMainFig, 'Name') '?'],...
                             ['Quit ' get(hMainFig, 'Name') '?'],...
                              'Yes', 'No', 'Yes');
            if strcmp(selection, 'No')
                return;
            else    
    end
  
  % ----------------------------------------------------------------
  function QuitProgram(hObject, eventdata)

    delete(hMainFig);