Skip to content
Snippets Groups Projects
writeTSGDataNetCDF.m 5.32 KiB
Newer Older
function [error] = writeTSGDataNetCDF( hTsgGUI, filename)
% Function to write TSG data in NetCDF file. 
%
% Input
% -----
% hTsgGUI ............ Handel to the main user interface
% filename ........... Data filename
%
% Output
% ------
% error .............  1 : OK 
%       ............. -1 : an error occured
%
% The data are store using setappdata - Variable name : 'tsg_data'
%
% Caution : replace the fill-value with NaN
% -------------
nc = netcdf(filename, 'clobber');
if isempty(nc)
   msg_error = ['TSG_GOSUD file_lecture : Open file error : ' filename];
   warndlg( msg_error, 'NetCDF write dialog');
   error = -1;
   return;
end

% Display read file info on console
% ---------------------------------
fprintf('\nWRITE_NETCDF_FILE\n'); tic;

% Initialize loading NetCDF file waitbar
% --------------------------------------
wb = waitbar(0, 'Initializing NetCDF file. Please  wait...');

% We cannot change title property to 'none' (default set as 'tex') inside
% waitbar function (line 81), see
% http://www.mathworks.co.uk/matlabcentral/newsreader/view_thread/115725
% -----------------------------------------------------------------------
hchild = get(wb,'children');
htitle = get(hchild,'title');
set(htitle,'Interpreter','None');

% Get the data from the application GUI
% -------------------------------------
tsg = getappdata( hTsgGUI, 'tsg_data');

% Get global attributes list from class tsg_nc with file 'tsg_ncattr.csv'
% -----------------------------------------------------------------------
nca             = tsg_nc('tsg_ncattr.csv');
nca_keys        = keys(nca);

% Get GF3 variables list codes from class tsg_nc with file 'tsg_ncvar.csv'
% -----------------------------------------------------------------------
ncv_keys        = keys(ncv);
ncv_fieldNames  = get_fieldnames(ncv);

% Display more info about write file on console
% ---------------------------------------------
fprintf('...writing %s : ', filename);

%% Create NetCDF file:
% -------------------

% Variable dimensions
% -------------------
nc('DAYD_WS')   = numel(tsg.DAYD_WS);  % number of water samples
nc('DAYD_EXT')  = numel(tsg.DAYD_EXT); % number of external SSPS or SSTP comparison
nc('NCOEF_CAL') = 5;                   % number of calibration coefficients
nc('NCOEF_LIN') = 2;                   % number of linearisation coefficients

% Fixed dimensions
% ----------------
nc('STRING256') = 256;   
nc('STRING14')  = 14;
nc('STRING4')   = 4;
nc('N1')        = 1;

% display filename after 'Interpreter','None' initialization to prevent
% display console warning
% ---------------------------------------------------------------------
waitbar(1/50,wb,['Writing file: ' filename ' Please  wait...']);

%% Create NetCDF global attributes 
% -------------------------------
for i=1:numel(nca_keys)
  global_att = nca_keys{i};
  nc.(global_att) = tsg.(global_att);
end 

% Create NetCDF variables and attributes
% --------------------------------------
for i=1:numel(ncv_keys)
  for j=1:numel(ncv_fieldNames)
    variable  = ncv_keys{i};
    fieldName = ncv_fieldNames{j};
    value = get(ncv, variable, fieldName);
    
    % ----------------
    if strcmp(fieldName,'dimension')
      s = ['nc{''' variable '''} = {''' value '''}'];
      eval(s);
      
    % define variable attributes
    % --------------------------
    elseif ~isempty(value)
      if ischar(value)
        nc{variable}.(fieldName) = ncchar(value);
%% Create data to NetCDF file:
% ---------------------------

% Write global attributes
% -----------------------
for i=1:numel(nca_keys)
  
  % get netcdf global attribute name
  % --------------------------------
  global_attr = nca_keys{i};
  
  nc.(global_attr) = tsg.(global_attr);
end 

% Convert Matlab julian days (datenum) to 1950 reference
% ------------------------------------------------------
d = strmatch('DAYD',ncv_keys);
for i=1:numel(d)
  tsg.(ncv_keys{d(i)}) = datenumToJulian(tsg.(ncv_keys{d(i)}));
end

% Write measurements (variables)
% -------------------------------
for i=1:numel(ncv_keys)
  
  % get netcdf variable name
  % ------------------------
  variable = ncv_keys{i};
  
  % ---------------
  waitbar( i/numel(ncv_keys), wb, ['writing ' variable ' variable']);
  
  % nc{variable}(:) = tsg.(variable);
  if strmatch('DATE', variable)
    nc{variable}(:,:) = tsg.(variable);  
    % under Linux, when you write an with empty matrix to an unlimited
    % variable dimension, nc was corrupted to double object
    % works well on windows
    if ~isempty(tsg.(variable))
      %nc{variable}(1:length(tsg.(variable))) = tsg.(variable); 
      nc{variable}(:) = tsg.(variable); 
  end
end

% Close waitbar
% -------------
close(wb)

% Close NetCDF file
% -----------------
endef(nc)
close(nc)

% Display time to write file on console
% -------------------------------------
t = toc; fprintf('...done (%6.2f sec).\n\n',t);

% Everything OK
% -------------
error = 1;

end