% save_metcity_10Hz_merged_to_nc.m
% save merged 10Hz matlab tables in netCDF format with file
% and variable attributes - using ClimateData Toolbox buildnc()

% file and variable attributes are defined in excel spreadsheets:
% merged_fileatts.xlsx and merged_varatts.xlsx

% Aug 2022, 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,'merged_10Hz_turb');
save_path = fullfile(root_path,'merged_10Hz_turb_nc'); mkdir(save_path);

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

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

%% read global and variable attributes
fatts = readcell(fattsf);
vatts = readcell(vattsf);

% format 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 for these files
t1 = datetime('now','TimeZone','local');
create_time = [datestr(t1 - tzoffset(t1)),' UTC'];
fatts_row(2) = {create_time};

% set up attribute row vector for each variable
% remove any missing attribute cells from each row
vatts_time = vatts(strcmp(vatts(:,1),'time'),2:end);
vatts_time = vatts_time(~ismissing(vatts_time));

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

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

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

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

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

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

vatts_u = vatts(strcmp(vatts(:,1),'u'),2:end);
vatts_u = vatts_u(~ismissing(vatts_u));

vatts_v = vatts(strcmp(vatts(:,1),'u'),2:end);
vatts_v = vatts_v(~ismissing(vatts_v));

vatts_w = vatts(strcmp(vatts(:,1),'u'),2:end);
vatts_w = vatts_w(~ismissing(vatts_w));

vatts_Tson = vatts(strcmp(vatts(:,1),'Tson'),2:end);
vatts_Tson = vatts_Tson(~ismissing(vatts_Tson));

vatts_co2 = vatts(strcmp(vatts(:,1),'co2'),2:end);
vatts_co2 = vatts_co2(~ismissing(vatts_co2));

vatts_ch4 = vatts(strcmp(vatts(:,1),'ch4'),2:end);
vatts_ch4 = vatts_ch4(~ismissing(vatts_ch4));

%% read hourly mat tables and save to nc
% directory of all files to process
files = dir(fullfile(data_path,'*MOSAiC_10Hz_winds_gases_metcity.mat'));

for ii = 1:length(files)
    fname = fullfile(files(ii).folder,files(ii).name);
    load(fname); % loading flx_10Hz table for this hour
    [~,fn,~] = fileparts(fname);
    sname = fullfile(save_path,[fn,'.nc']); % nc file name
    disp(['converting ',files(ii).name])
    
    % start time & stop time strings for this hour
    fatts_row(6) = {[datestr(flx_10Hz.datenum(1)),'.0 UTC']};
    fatts_row(8) = {[datestr(flx_10Hz.datenum(end)),'.9 UTC']};
    
    % prepare time variables for this hour
    time = (flx_10Hz.datenum - datenum(1970,1,1,00,00,00))*86400*1000; % CDF epoch time
    dvec = datevec(flx_10Hz.datenum);
    yr = dvec(:,1); mo = dvec(:,2); day = dvec(:,3);
    hr = dvec(:,4); min = dvec(:,5); sec = dvec(:,6);
    
    % open nc file as sname
    % add dimension variable with attributes & add glogal attributes
    ncbuild(sname,time,'dimnames',{'time'},'varatts',vatts_time,'fileatts',fatts_row);

    % add time variables and attributes
    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
    rwdir = winds.rwdir.u; u(isnan(u)) = -99999;
    ncbuild(sname,u,'varatts',vatts_u);
    
    v = flx_10Hz.v; v(isnan(v)) = -99999;
    ncbuild(sname,v,'varatts',vatts_v);
    
    w = flx_10Hz.w; w(isnan(w)) = -99999;
    ncbuild(sname,w,'varatts',vatts_w);
    
    Tson = flx_10Hz.Ts_C; Tson(isnan(Tson)) = -99999;
    ncbuild(sname,Tson,'varatts',vatts_Tson);
    
    co2 = flx_10Hz.co2_ppm; co2(isnan(co2)) = -99999;
    ncbuild(sname,co2,'varatts',vatts_co2);
    
    ch4 = flx_10Hz.ch4_ppm; ch4(isnan(ch4)) = -99999;
    ncbuild(sname,ch4,'varatts',vatts_ch4);
end

disp('DONE')


