% a21_metcity_save_flux_to_nc.m
% save hourly metcity flux matlab table in netCDF format with file
% and variable attributes - using ClimateData Toolbox buildnc()

% netCDF file and variable attributes are defined in excel spreadsheets:
% metcity_flux_hourly_merged_fileatts.xlsx
% metcity_flux_hourly_merged_varatts.xlsx

% Jan 2023, BWB

%% init
clear
close all
warning('off','MATLAB:MKDIR:DirectoryExists');

root_path = '/Users/byronb/Raw_Data_Files.noindex/MOSAIC_2019/_processed/metcity_flux_V3';
data_path = fullfile(root_path,'flux_merged');

path_prog = '/Users/byronb/Raw_Data_Files.noindex/MOSAIC_2019/_matlab/co2_ch4_o3_flux';
cd(path_prog);
addpath(genpath(path_prog));

% paths to spreadsheets for file and variable attributes
fattsf = fullfile(path_prog,'metcity_flux_hourly_merged_fileatts.xlsx');
vattsf = fullfile(path_prog,'metcity_flux_hourly_merged_varatts.xlsx');

% load mc_flx_hr table, 8208x64
load(fullfile(data_path,'MOSAiC_metcity_flux_co2_ch4_hr.mat'));
% compute hourly stress
mc_flx_hr.tau_hr = -mc_flx_hr.wu_csp_hr.*mc_flx_hr.rhoair_hr;

% name for output nc file
sname = fullfile(data_path,'MOSAiC_metcity_flux_co2_ch4_hr.nc');

%% read global and variable attributes
% the first column in vatts gives the original variable names in mc_flx_hr
% cols 8:end in vatts give the new variable names and attributes
fatts = readcell(fattsf);
vatts = readcell(vattsf);
vars = vatts(8:end,1);          % variable names in the vlx_hr table
vatts_row = vatts(8:end,2:end); % nc variable names and atts

% format fatts into row vector of att_name:att_value pairs.
% this is the required input format for attributes in ncbuild()
fatts_row = fatts';
fatts_row = fatts_row(:)';

%% set creation time and time range for this version
t1 = datetime('now','TimeZone','local');
create_time = [datestr(t1 - tzoffset(t1)),' UTC'];
fatts_row(2) = {create_time};
fatts_row(6) = {[datestr(mc_flx_hr.datenum(1)),' 00:00:00 UTC']};
fatts_row(8) = {[datestr(mc_flx_hr.datenum(end)),' UTC']};

%% set up time variables and add to nc file
% remove any missing attribute cells from each row
vatts_time = vatts(strcmp(vatts(:,2),'time'),3:end);
vatts_time = vatts_time(~ismissing(vatts_time));

vatts_yr = vatts(strcmp(vatts(:,2),'yr'),3:end);
vatts_yr = vatts_yr(~ismissing(vatts_yr));

vatts_mo = vatts(strcmp(vatts(:,2),'mo'),3:end);
vatts_mo = vatts_mo(~ismissing(vatts_mo));

vatts_day = vatts(strcmp(vatts(:,2),'day'),3:end);
vatts_day = vatts_day(~ismissing(vatts_day));

vatts_hr = vatts(strcmp(vatts(:,2),'hr'),3:end);
vatts_hr = vatts_hr(~ismissing(vatts_hr));

vatts_min = vatts(strcmp(vatts(:,2),'min'),3:end);
vatts_min = vatts_min(~ismissing(vatts_min));

vatts_sec = vatts(strcmp(vatts(:,2),'sec'),3:end);
vatts_sec = vatts_sec(~ismissing(vatts_sec));

% compute timestamp variables
time = (mc_flx_hr.datenum - datenum(1970,1,1,00,00,00))*86400*1000; % CDF epoch time
dvec = datevec(mc_flx_hr.datenum);
yr = dvec(:,1); mo = dvec(:,2); day = dvec(:,3);
hr = dvec(:,4); min = dvec(:,5); sec = dvec(:,6);

% open nc file as sname and add timestamps
% add dimension variable with attributes & add glogal attributes
ncbuild(sname,time,'dimnames',{'time'},'varatts',vatts_time,'fileatts',fatts_row);

ncbuild(sname,yr,'varatts',vatts_yr);
ncbuild(sname,mo,'varatts',vatts_mo);
ncbuild(sname,day,'varatts',vatts_day);
ncbuild(sname,hr,'varatts',vatts_hr);
ncbuild(sname,min,'varatts',vatts_min);
ncbuild(sname,sec,'varatts',vatts_sec);

%% now add the remaining variables to the file
% replace NaN with -99999 in each variable as required

N = length(vars);
for ii = 1:N
    jj = find(isnan(mc_flx_hr.(vars{ii}))); % find any NaNs in each variable
    mc_flx_hr.(vars{ii})(jj) = -99999;      % replace with -99999
    ncbuild(sname,mc_flx_hr.(vars{ii}),'name',vatts_row{ii,1},'varatts',vatts_row(ii,2:end)); % save to nc
end

disp('DONE')


