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' % % 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 % % $Id$ %% Open the file % ------------- 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 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); % 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 % ----------------------- if ~isempty(tsg.DAYD_WS) nc('DAYD_WS') = numel(tsg.DAYD_WS); end % number of external SSPS or SSTP comparison % ------------------------------------------ if ~isempty(tsg.DAYD_EXT) nc('DAYD_EXT') = numel(tsg.DAYD_EXT); end % number of calibration coefficients % ---------------------------------- nc('NCOEF_CAL') = 5; % number of linearisation coefficients % ------------------------------------ nc('NCOEF_LIN') = 2; % Fixed dimensions % ---------------- nc('STRING256') = 256; nc('STRING14') = 14; nc('STRING4') = 4; nc('N1') = 1; nc('DAYD_HIST') = 5; % 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) variable = ncv_keys{i}; % 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); otherwise % 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); end % create variable attribute, jump dimension and nctype fields % ----------------------------------------------------------- for j=3:numel(ncv_fieldNames) fieldName = ncv_fieldNames{j}; value = get(ncv, variable, fieldName); % if field is empy, it's not a attribute for this netcdf variable % --------------------------------------------------------------- if ~isempty(value) % value has the rigth netcdf type, don't need to cast with nc[type] % like ncfloat or ncchar % ----------------------------------------------------------------- nc{variable}.(fieldName) = value; end end end %% 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 (tsg.variables) % ---------------------------------- for i=1:numel(ncv_keys) % get netcdf variable name % ------------------------ variable = ncv_keys{i}; % display waitbar % --------------- waitbar( i/numel(ncv_keys), wb, ['writing ' variable ' variable']); % get ncvar type object nv % ------------------------ nv = nc{variable}; % be careful, if dimensions DAYD_WS or DAYD_EXT not defined % (no sample data), nv is empty % --------------------------------------------------------- if ~isempty(nv) % set autonan mode (FillValue_) % ----------------------------- nv = autonan(nv,1); % 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 missing_value defined, fill nv with it % ----------------------------------------- if ~isempty(nv.missing_value(:)) nv(:) = int8(nv.missing_value(:)); end end 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