Skip to content
Snippets Groups Projects
writeTSGDataNetCDF.m 9.13 KiB
Newer Older
function [error] = writeTSGDataNetCDF( hTsgGUI, filename)
% [error] = writeTSGDataNetCDF( hTsgGUI, filename)
% Function to write TSG data in NetCDF file.
% hTsgGUI ............ Handle to the main user interface
% filename ........... Data filename
%
% Output
% ------
%       ............. -1 : an error occured
%
% The data are store using setappdata - Variable name : 'tsg_data'
%
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
% Actually, with DAYD, DAYD_WS and DAT_EXT dimensions defined: 61 variables
%                DAYD, DAYD_WS dimensions defined:             57 variables
%                DAYD only dimension defined:                  53 variables
% -------------
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;
% 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);

jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
% Get variables list codes from class tsg_nc with file 'tsg_ncvar.csv'
% --------------------------------------------------------------------
ncv             = tsg_nc('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')      = numel(tsg.DAYD);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed

% if dimension is empty (no data), don't create, because create empty
% dimension quive it unlimited dimension, but you can only have one
% unlimited dimension in a file
% --------------------------------------------------------------------

% number of water samples
% -----------------------
%   nc('DAYD_WS')   = numel(tsg.DAYD_WS);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed

% number of external SSPS or SSTP comparison
% ------------------------------------------
if ~isempty(tsg.DAYD_EXT)
  nc('DAYD_EXT')  = numel(tsg.DAYD_EXT);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
end

% number of calibration coefficients
% ----------------------------------
nc('NCOEF_CAL') = tsg.dim.CALCOEF;   % 7
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed

% number of linearisation coefficients
% ------------------------------------
nc('NCOEF_LIN') = tsg.dim.LINCOEF;   % 2

% Fixed dimensions
% ----------------
nc('STRING256') = tsg.dim.STRING256;
nc('STRING14')  = tsg.dim.STRING14;
nc('STRING8')   = tsg.dim.STRING8;
nc('STRING4')   = tsg.dim.STRING4;
nc('N1')        = tsg.dim.N1;

% 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);

% Create NetCDF variables and attributes
  % get variable dimension declare in file
  % --------------------------------------
  dimension = get(ncv, variable, ncv_fieldNames{1});
  % get variable type declare in file
  % --------------------------------------
  nctype    = get(ncv, variable, ncv_fieldNames{2});
  % create netcdf variable with dimension, dimension must be a cell
  % ---------------------------------------------------------------
  switch nctype
    case 'double'
      nc{variable} = ncdouble(dimension);
    case 'float'
      nc{variable} = ncfloat(dimension);
    case 'int'
      nc{variable} = ncint(dimension);
    case 'short'
      nc{variable} = ncshort(dimension);
    case 'byte'
      nc{variable} = ncbyte(dimension);
    case 'char'
      nc{variable} = ncchar(dimension);
      % by default, display a warning and cast to char
      % ----------------------------------------------
      warning('tsgqc_GUI:writeTSGDataNetCDF', ...
        'unknow type ''%s'' for  dimension ''%s'' of  ''%s'' variable.\nCheck your %s file', ...
        nctype, dimension{1}, variable, file(ncv));

      nc{variable} = ncchar(dimension);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  % create variable attribute, jump dimension and nctype fields
  % -----------------------------------------------------------
  for j=3:numel(ncv_fieldNames)

    % see new us191.netcdf toolbox, we'll not use index to get type
    % but structure with special variable, eg: s.type__
    % -------------------------------------------------
    value     = get(ncv, variable, fieldName);
    nctype    = get(ncv, variable, ncv_fieldNames{2});

jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % if field is empy, it's not a attribute for this netcdf variable
    % ---------------------------------------------------------------
      % ncatt(theAttname, theAttvalue, theParent) uses the class of
      % theAttvalue as theAtttype ('char' or 'double').
      % need to be cast before assignment
      % -----------------------------------------------------------
      if isnumeric(value)

        % le cast ne marche pas avec cette toolbox de netcdf
        % a voir
        % -------------------------------
%         if strcmp(fieldName, 'FillValue_')
%           switch nctype
%             case {'double', 'real'}
%               value = double(value);
%             case {'float', 'single'}
%               value = single(value);
%             case {'int', 'integer', 'int32'}
%               value = int32(value);
%             case {'short', 'int16'}
%               value = int16(value);
%             case {'byte', 'int8'}
%               value = int8(value);
%           end
%           nc{variable}.(fieldName) = value;
%         else
          nc{variable}.(fieldName) = double(value);
%        end

        nc{variable}.(fieldName) = char(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};

% 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

% shift to [-180 180] longitude range if needed
% ---------------------------------------------
if ~isempty(tsg.indcross)
  tsg.LONX = mod(tsg.LONX+180,360)-180;
% Write measurements (tsg.variables)
% ----------------------------------
  % get netcdf variable name
  % ------------------------
  variable = ncv_keys{i};
  % ---------------
  waitbar( i/numel(ncv_keys), wb, ['writing ' variable ' variable']);
  % get ncvar type object nv
  % ------------------------
  nv = nc{variable};

  % be careful, if dimension DAYD_EXT not defined (no sample data),
  % nv is empty
  % ---------------------------------------------------------
  if ~isempty(nv)
    % set autonan mode (FillValue_)
    % -----------------------------

    % tsg variable is not empty, fill nv with it
    % ------------------------------------------
    if ~isempty(tsg.(variable))

      % fill netcdf variables nv with corresponding tsg variable
      % --------------------------------------------------------
      nv(:) = tsg.(variable);
      % In case of unlimited dimension, for example only, use:
      % nc{variable}(1:length(tsg.(variable))) = tsg.(variable)
      % -------------------------------------------------------

    else

      % if default_value defined, fill nv with it
      % -----------------------------------------
      if ~isempty(nv.default_value(:))
        nv(:) = int8(nv.default_value(:));
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  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