From 6ca994a625c2a42bfb712ce576dd6a1a86af2128 Mon Sep 17 00:00:00 2001 From: Jacques Grelet <jacques.grelet@ird.fr> Date: Tue, 8 Jan 2008 15:19:58 +0000 Subject: [PATCH] utilise les conventions NetCDF V1.4 --- tsgqc_GUI.m | 259 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 175 insertions(+), 84 deletions(-) diff --git a/tsgqc_GUI.m b/tsgqc_GUI.m index ab23dae..5d0fd0f 100644 --- a/tsgqc_GUI.m +++ b/tsgqc_GUI.m @@ -62,13 +62,14 @@ function tsgqc_GUI 'Resize', 'on', ... 'Menubar','none', ... 'Toolbar', 'none', ... - 'Tag', 'ButtonMotionOff', ... + 'UserData', 'ButtonMotionOff', ... 'WindowButtonMotionFcn', @MouseMotion, ... 'CloseRequestFcn', @QuitProgram,... 'HandleVisibility','callback',... 'Visible','on',... 'Units', 'normalized',... - 'Position',guiLimits); + 'Position',guiLimits, ... + 'Color', get( 0, 'DefaultUIControlBackgroundColor' )); % Construct the Menu % ----------------- @@ -78,7 +79,7 @@ function tsgqc_GUI 'Label', 'File'); hOpenMenu = uimenu(... 'Parent', hFileMenu,... - 'Tag', 'off', ... + 'UserData', 'off', ... 'Label','Open',... 'Accelerator','O',... 'HandleVisibility','callback',... @@ -87,7 +88,7 @@ function tsgqc_GUI 'Parent', hFileMenu,... 'Label','Save',... 'Accelerator','S',... - 'Tag', 'off', ... + 'UserData', 'off', ... 'HandleVisibility','callback',... 'Callback',@SaveMenuCallback); hQuitMenu = uimenu(... @@ -103,12 +104,24 @@ function tsgqc_GUI hToolbar = uitoolbar(... % Toolbar for Open and Print buttons 'Parent',hMainFig, ... 'HandleVisibility','callback'); + hOpenPushtool = uipushtool(... % Opendoc toolbar button + 'Parent',hToolbar,... + 'TooltipString','Open file',... + 'CData', iconRead(fullfile(matlabroot, ... + '/toolbox/matlab/icons/opendoc.mat')),... + 'HandleVisibility','callback', ... + 'Tag','PUSHTOOL_OPEN',... + 'UserData', 'off',... + 'Enable', 'on',... + 'ClickedCallback', @OpenMenuCallback); hSavePushtool = uipushtool(... % Open Save toolbar button 'Parent',hToolbar,... - 'TooltipString','Save file',... + 'TooltipString','Save NetCDF file',... 'CData',iconRead( ... [DEFAULT_PATH_FILE 'tsg_icon' filesep 'savedoc.mat']),... 'HandleVisibility','callback', ... + 'Tag','PUSHTOOL_SAVE',... + 'Enable', 'off',... 'ClickedCallback', @SaveMenuCallback); hZoomPushtool = uipushtool(... % Open Zoom toolbar button 'Parent',hToolbar,... @@ -117,6 +130,8 @@ function tsgqc_GUI '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,... @@ -124,43 +139,62 @@ function tsgqc_GUI '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', ... - 'Tag', 'off', ... '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', ... - 'Tag', 'off', ... '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', ... - 'Tag', 'off', ... '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,... 'TooltipString','Plot the Samples',... 'Separator', 'on', ... - 'Tag', 'off', ... '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 % ---------------------------------------------------------------- @@ -208,11 +242,12 @@ function tsgqc_GUI 'Units', 'normalized', ... 'Visible', 'off', ... 'Color', 'none', ... - 'Tag', 'off', ... + 'UserData', 'off', ... 'UserData', [], ... 'HandleVisibility','callback', ... 'Position',[.05, .05, .9, .9]); + % Construct the context menu for the Quality control codes % ------------------------------------------------------- hQcCmenu = uicontextmenu(... @@ -275,6 +310,7 @@ function tsgqc_GUI error1 = -1; error2 = -1; + if ~isequal(filename, 0) % Read the data @@ -287,6 +323,10 @@ function tsgqc_GUI error1 = tsg_readTsgDataXML( hMainFig, filename ); case 3 error1 = tsg_readTsgDataNetCDF( hMainFig, filename ); + %# a modifier + if error1 == 1 + error2 = error1; + end case 4 error2 = tsg_readBucketData(hMainFig, filename ); otherwise @@ -300,12 +340,15 @@ function tsgqc_GUI % A TSG file has been open and read % --------------------------------- - set( hOpenMenu, 'Tag', 'on' ); + 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, 'Tag', 'ButtonMotionOn'); - + set( hMainFig, 'UserData', 'ButtonMotionOn'); + % Make the Salinity, temperature and velocity plot % ------------------------------------------------ tsg_plot_SalTempVel( hMainFig, hPlotAxes ); @@ -320,14 +363,22 @@ function tsgqc_GUI % Merge the different water sample (NetCdf or ASCII files) in % a unique structure : 'sample' % ----------------------------------------------------------- - [sample] = tsg_mergesample( hMainFig ); - - % Save the 'sample' struct. as an application data + %@ desactive le merge pour l'instant en attente d'une structure de + %données validee + %@[sample] = tsg_mergesample( hMainFig ); + + %@ Save the 'sample' struct. as an application data % ------------------------------------------------ - if ~isempty( sample ) - setappdata( hMainFig, 'sample', sample ); + %if ~isempty( sample ) + % setappdata( hMainFig, 'sample', sample ); + %end + + % Plot Salinity bucket + % ------------------------------------------------ + if error2 ~= -1 + tsg_plot_SalTsgSample( hMainFig, hPlotAxes ); end - + % Pointer reset to arrow % ---------------------- set( hMainFig, 'Pointer', 'arrow' ); @@ -348,7 +399,7 @@ function tsgqc_GUI zoomAdaptiveDateTicks('off'); case 'off' pan off - set(hQCPushtool, 'Tag', 'off' ); + set(hQCPushtool, 'UserData', 'off' ); zoom on zoomAdaptiveDateTicks('on'); @@ -371,7 +422,7 @@ function tsgqc_GUI panAdaptiveDateTicks('off'); case 'off' zoom off - set(hQCPushtool, 'Tag', 'off' ); + set(hQCPushtool, 'UserData', 'off' ); pan on panAdaptiveDateTicks('on'); @@ -394,26 +445,26 @@ function tsgqc_GUI % Toggle the tag of the Qc pushbutton to 'on' or 'off' % ---------------------------------------------------- - switch get(hQCPushtool, 'Tag'); + switch get(hQCPushtool, 'UserData'); case 'off' - set(hQCPushtool, 'Tag', 'on' ); + set(hQCPushtool, 'UserData', 'on' ); set(hPlotAxes(1),'UIContextMenu', hQcCmenu); set( hMainFig, 'Pointer', 'crosshair'); case 'on' - set(hQCPushtool, 'Tag', 'off' ); + set(hQCPushtool, 'UserData', 'off' ); set(hPlotAxes(1),'UIContextMenu', []); set(hMainFig,'Pointer','arrow'); end qualityCode = -1; ind = []; - while strcmp( get(hQCPushtool, 'Tag'),'on') + while strcmp( get(hQCPushtool, 'UserData'),'on') k = waitforbuttonpress; % If the QC pushbutton is pressed we quit the callback % ---------------------------------------------------- - if strcmp( get(hQCPushtool, 'Tag'),'off') + if strcmp( get(hQCPushtool, 'UserData'),'off') % Desactivate the context menu use to choose the % Quality Codes @@ -437,7 +488,7 @@ function tsgqc_GUI % made. Otherwise there is a conflict with the map if it % is activated % ------------------------------------------------------- - set( hMainFig, 'Tag', 'ButtonMotionOff'); + set( hMainFig, 'UserData', 'ButtonMotionOff'); % Selection of the data within the figure % --------------------------------------- @@ -451,17 +502,17 @@ function tsgqc_GUI p1 = min(point1,point2); p2 = max(point1,point2); % calculate locations - ind = find(tsg.TIME > p1(1,1) & tsg.TIME < p2(1,1) & ... - tsg.PSAL > p1(1,2) & tsg.PSAL < p2(1,2)); + 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, 'Tag', 'on' ); + set( hSaveMenu, 'UserData', 'on' ); % Selection made : Mouse motion callback re-activated % -------------------------------------------------- - set( hMainFig, 'Tag', 'ButtonMotionOn'); + set( hMainFig, 'UserData', 'ButtonMotionOn'); end @@ -472,7 +523,7 @@ function tsgqc_GUI quality = get( hQcCmenu, 'UserData'); - tsg.PSAL_QC(ind) = quality.Code; + tsg.SSPS_QC(ind) = quality.Code; % Save the modifications % ---------------------- @@ -481,7 +532,7 @@ function tsgqc_GUI axes(hPlotAxes(1)); hold on color = ['.' quality.Color]; - plot(tsg.TIME(ind), tsg.PSAL(ind), color ); + plot(tsg.DAYD(ind), tsg.SSPS(ind), color ); hold off end @@ -578,7 +629,7 @@ function tsgqc_GUI % Test if the callback can be activated % ------------------------------------- - if strcmp( get( hMainFig, 'Tag'), 'ButtonMotionOn') + if strcmp( get( hMainFig, 'UserData'), 'ButtonMotionOn') % Retrieve named application data % ------------------------------- @@ -595,19 +646,19 @@ function tsgqc_GUI % ----------------------------------------------------------- [x, y] = gpos(hPlotAxes(1)); - if x > tsg.TIME(1) && x < tsg.TIME(end) + if x > tsg.DAYD(1) && x < tsg.DAYD(end) - indCursor = find( tsg.TIME > x); + 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.TIME(indCursor(1)),'dd/mm/yyyy HH:MM'),... - dd2dm(tsg.LATITUDE(indCursor(1)),0), ... - dd2dm(tsg.LONGITUDE(indCursor(1)),1), ... - tsg.PSAL(indCursor(1)), ... - tsg.TEMP_TSG(indCursor(1))... + 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 @@ -620,17 +671,17 @@ function tsgqc_GUI if isempty( get(hMapPanel, 'UserData')) hMarker = m_line( ... - tsg.LONGITUDE(indCursor(1)), tsg.LATITUDE(indCursor(1)),... + 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.LONGITUDE(indCursor(1)), tsg.LATITUDE(indCursor(1)),... + tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),... 'Marker','o','MarkerSize',5, ... 'Color','r', 'MarkerFaceColor','r'); - set(hMapPanel, 'UserData', hMarker); + set(hMapPanel, 'UserData', hMarker); end end end @@ -661,11 +712,11 @@ function tsgqc_GUI % Test if the sample Push button has been pressed % ----------------------------------------------- - if strcmp( get(hBottlePushtool, 'Tag'), 'off') + if strcmp( get(hBottlePushtool, 'UserData'), 'off') - % Sample Push button - Tag set to 'on' + % Sample Push button - UserData set to 'on' % ------------------------------------ - set( hBottlePushtool, 'Tag', 'on' ); + set( hBottlePushtool, 'UserData', 'on' ); % Test if tsg and sample data have been loaded % -------------------------------------------- @@ -688,7 +739,7 @@ function tsgqc_GUI % Plot the samples if the TSG file has been read % ---------------------------------------------- -% if strcmp( get(hOpenMenu, 'Tag'), 'on' ) && ~isempty( sample ) +% if strcmp( get(hOpenMenu, 'UserData'), 'on' ) && ~isempty( sample ) % axes( hPlotAxes(1) ); % hLine.Sample = line( ... % sample.TIME, sample.PSAL,... @@ -702,7 +753,7 @@ function tsgqc_GUI % else - set( hBottlePushtool, 'Tag', 'off' ); + set( hBottlePushtool, 'UserData', 'off' ); % The bucket pushbutton has been pressed again : % Delete the bucket on figure @@ -724,16 +775,16 @@ function tsgqc_GUI % Test if the climatology Push button has been pressed % ---------------------------------------------------- - if strcmp( get(hClimPushtool, 'Tag'), 'off') + if strcmp( get(hClimPushtool, 'UserData'), 'off') - % Climatology push button - Tag set to 'on' + % Climatology push button - UserData set to 'on' % ----------------------------------------- - set( hClimPushtool, 'Tag', 'on' ); + set( hClimPushtool, 'UserData', 'on' ); % Test if the TSG and bucket files have been read % ----------------------------------------------- - if strcmp( get(hOpenMenu, 'Tag'), 'on' ) + if strcmp( get(hOpenMenu, 'UserData'), 'on' ) % Get data % ----------------------- @@ -743,35 +794,36 @@ function tsgqc_GUI % Read Climatology % ---------------- - if ~isfield( tsg, 'LEVITUS') - lev = read_file_woa01( 'woa01an.nc' ); - if ~isstruct(lev) + 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 = lev; + 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.LATITUDE > 0); - lat(ind) = fix(tsg.LATITUDE(ind)) + 0.5; + ind = find(tsg.LATX > 0); + lat(ind) = fix(tsg.LATX(ind)) + 0.5; - ind = find(tsg.LONGITUDE > 0); - lon(ind) = fix(tsg.LONGITUDE(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.LATITUDE <= 0); - lat(ind) = floor(tsg.LATITUDE(ind)) + 0.5; + ind = find(tsg.LATX <= 0); + lat(ind) = floor(tsg.LATX(ind)) + 0.5; - ind = find(tsg.LONGITUDE <= 0); - lon(ind) = floor(tsg.LONGITUDE(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 @@ -785,9 +837,9 @@ function tsgqc_GUI ind = find(abs(lat_diff) == 1 | abs(lon_diff == 1)); lat2 = lat( ind ); lon2 = lon( ind ); - time = tsg.TIME( ind ); - temp = tsg.TEMP_TSG( ind ); - psal = tsg.PSAL( ind ); + time = tsg.DAYD( ind ); + temp = tsg.SSJT( ind ); + psal = tsg.SSPS( ind ); % Get Climatology % LATX(80) = -0.5 et LATX(81) = 0.5 @@ -799,12 +851,12 @@ function tsgqc_GUI std_temp = zeros(size(ind)); std_psal = zeros(size(ind)); for i=1:length(ind) - ilat = find(tsg.LEVITUS.WOA01_LATX == lat2(i)); - ilon = find(tsg.LEVITUS.WOA01_LONX == lon2(i)); - mean_temp(i) = tsg.LEVITUS.WOA01_MEAN_TEMP(ilat,ilon,1); - mean_psal(i) = tsg.LEVITUS.WOA01_MEAN_PSAL(ilat,ilon,1); - std_temp(i) = tsg.LEVITUS.WOA01_STD_TEMP(ilat,ilon,1); - std_psal(i) = tsg.LEVITUS.WOA01_STD_PSAL(ilat,ilon,1); + 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 @@ -832,7 +884,7 @@ function tsgqc_GUI else - set( hClimPushtool, 'Tag', 'off' ); + set( hClimPushtool, 'UserData', 'off' ); % The bucket pushbutton has been pressed again : % Delete the bucket on figure @@ -852,31 +904,70 @@ function tsgqc_GUI end end - % ----------------------------------------------------------------- + % ------------------------------------------------------------------- + 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 - [fileName, pathName, filterIndex] = uiputfile('*.txt', ... + % fill or append header form + % ------------------------- + error = headerForm(hMainFig); + + % if user press continue button, ask for netcdf file + % ------------------------------------------------ + if error ~= -1 + [fileName, pathName, filterIndex] = uiputfile('*.nc', ... 'Save file name'); + + % if user press cancel button, all var set to zero + % ------------------------------------------------ + if fileName == 0 + return; + end + + % Pointer set to watch during reading and plotting + % ------------------------------------------------ + set( hMainFig, 'Pointer', 'watch' ); + % flushes the event queue and updates the closed uiputfile window + % --------------------------------------------------------------- + drawnow; + + % write netcdf file + % ----------------- fileName = [pathName fileName]; - error = tsg_writeTsgData( hMainFig, fileName ); - if ~error - % + error = tsg_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 + end 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, 'Tag' ), 'on') + if strcmp( get( hSaveMenu, 'UserData' ), 'on') selection = ... questdlg('The file has been modified. Do you want to save it ?',... 'Save before Quit?',... -- GitLab