Source code for stglib.aqd.cdf2nc

import xarray as xr

from ..core import qaqc, utils
from . import aqdutils


[docs]def cdf_to_nc(cdf_filename, atmpres=False): """ Load a raw .cdf file and generate a processed .nc file """ # Load raw .cdf data VEL = aqdutils.load_cdf(cdf_filename, atmpres=atmpres) # Clip data to in/out water times or via good_ens VEL = utils.clip_ds(VEL) # Create water_depth attribute # VEL = utils.create_water_depth(VEL) VEL = utils.create_nominal_instrument_depth(VEL) # create Z depending on orientation VEL, T, T_orig = aqdutils.set_orientation(VEL, VEL["TransMatrix"].values) # Transform coordinates from, most likely, BEAM to ENU if "VEL1" in VEL: theu = VEL["VEL1"].values thev = VEL["VEL2"].values thew = VEL["VEL3"].values elif "U" in VEL: theu = VEL["U"].values thev = VEL["V"].values thew = VEL["W"].values elif "X" in VEL: theu = VEL["X"].values thev = VEL["Y"].values thew = VEL["Z"].values out = "ENU" if VEL.attrs["AQDCoordinateSystem"] != out: histtext = f"Transforming data from {VEL.attrs['AQDCoordinateSystem']} coordinates to {out} coordinates." VEL = utils.insert_history(VEL, histtext) u, v, w = aqdutils.coord_transform( theu, thev, thew, VEL["Heading"].values, VEL["Pitch"].values, VEL["Roll"].values, T, T_orig, VEL.attrs["AQDCoordinateSystem"], out=out, ) VEL["U"] = xr.DataArray(u, dims=("time", "bindist")) VEL["V"] = xr.DataArray(v, dims=("time", "bindist")) VEL["W"] = xr.DataArray(w, dims=("time", "bindist")) VEL = aqdutils.magvar_correct(VEL) VEL["AGC"] = (VEL["AMP1"] + VEL["AMP2"] + VEL["AMP3"]) / 3 VEL = aqdutils.trim_vel(VEL) VEL = aqdutils.make_bin_depth(VEL) # swap vert dim to z or user specified in vert_dim VEL = aqdutils.ds_swap_dims(VEL) # Rename DataArrays for EPIC compliance VEL = aqdutils.ds_rename(VEL) # Drop unused variables VEL = ds_drop(VEL) VEL = qaqc.drop_vars(VEL) # Add EPIC and CMG attributes VEL = aqdutils.ds_add_attrs(VEL) # should function this for var in VEL.data_vars: VEL = qaqc.trim_min(VEL, var) VEL = qaqc.trim_max(VEL, var) VEL = qaqc.trim_min_diff(VEL, var) VEL = qaqc.trim_min_diff_pct(VEL, var) VEL = qaqc.trim_max_diff(VEL, var) VEL = qaqc.trim_max_diff_pct(VEL, var) VEL = qaqc.trim_med_diff(VEL, var) VEL = qaqc.trim_med_diff_pct(VEL, var) VEL = qaqc.trim_max_blip(VEL, var) VEL = qaqc.trim_max_blip_pct(VEL, var) VEL = qaqc.trim_bad_ens(VEL, var) VEL = qaqc.trim_bad_ens_indiv(VEL, var) VEL = qaqc.trim_maxabs_diff_2d(VEL, var) VEL = aqdutils.trim_single_bins(VEL, var) VEL = qaqc.trim_fliers(VEL, var) # fill with AGC threshold VEL = aqdutils.fill_agc(VEL) # after check for masking vars by other vars for var in VEL.data_vars: VEL = qaqc.trim_mask(VEL, var) # Add min/max values VEL = utils.add_min_max(VEL) # Add DELTA_T for EPIC compliance VEL = aqdutils.add_delta_t(VEL) # Add start_time and stop_time attrs VEL = utils.add_start_stop_time(VEL) # Add history showing file used VEL = utils.add_history(VEL) VEL = utils.add_standard_names(VEL) if "prefix" in VEL.attrs: nc_filename = VEL.attrs["prefix"] + VEL.attrs["filename"] + "-a.nc" else: nc_filename = VEL.attrs["filename"] + "-a.nc" VEL.to_netcdf(nc_filename, encoding={"time": {"dtype": "i4"}}) utils.check_compliance(nc_filename, conventions=VEL.attrs["Conventions"]) print("Done writing netCDF file", nc_filename) return VEL
def ds_drop(ds): """ Drop old DataArrays from Dataset that won't make it into the final .nc file """ todrop = [ "VEL1", "VEL2", "VEL3", "X", "Y", "Z", "AMP1", "AMP2", "AMP3", "TransMatrix", "AnalogInput1", "AnalogInput2", "jd", "Depth", "avgamp1", "avgamp2", "avgamp3", ] if ("AnalogInput1" in ds.attrs) and (ds.attrs["AnalogInput1"].lower() == "true"): todrop.remove("AnalogInput1") if ("AnalogInput2" in ds.attrs) and (ds.attrs["AnalogInput2"].lower() == "true"): todrop.remove("AnalogInput2") return ds.drop([t for t in todrop if t in ds.variables])