Post-processing routines (adjusted CTD variables)#
PyGlider applies a post-processing protocol to conductivity, temperature, and salinity variables in NetCDF timeseries files, and then generates depth–time NetCDF grids using xarray. The resulting NetCDF files are largely CF-compliant.
The basic workflow converts a NetCDF timeseries into an adjusted timeseries and corresponding depth–time grids. This follows the binary_to_timeseries (for Slocum gliders) and raw_to_timeseries (for Alseamar gliders) protocols, which convert raw glider data into NetCDF format. outname refers to the NetCDF timeseries produced by the initial conversion step.
The adjusted file is generated through three steps: flagging CTD data, adjusting CTD variables, and gridding the time series. This workflow uses known thermal lag constants and the lag between temperature and conductivity signals for each sensor.
An example of how to determine these constants is available at: https://cproof.uvic.ca/gliderdata/deployments/reports/
Workflow Overview#
The CTD adjustment pipeline consists of three main steps:
Flag CTD data Identify and flag unphysical conductivity, temperature, and salinity values.
Apply CTD corrections
Correct temperature–conductivity lag (
dTdC)Apply thermal lag correction (
alpha,tau)
Generate gridded products Create depth–time NetCDF grids from the adjusted time series.
User Options#
The following parameters can be customized:
alpha, tau Thermal lag correction constants.
Can be provided as function arguments
Or stored in the deployment YAML file or an new YML file. Note that
utils._get_deployment(deploymentyaml)can take a list of files in deploymentyaml and parse them for deployment information, with subsequent files overwriting previous files.If information is provided in either method, a thermal lag correction is not applied.
dTdC Time lag (seconds) between temperature and conductivity sensors
interpolate_filter Optional function to interpolate over small gaps before applying thermal lag correction
max_gap (in gridding) Maximum vertical gap size (in meters) to interpolate
Example Processing Script#
import logging
from pathlib import Path
import xarray as xr
import pyglider.ncprocess as ncprocess
import pyglider.utils as utils
logging.basicConfig(level=logging.INFO)
_log = logging.getLogger(__name__)
cwd = Path.cwd()
deploy_name = cwd.name
glider_name = cwd.parent.name
openfile = f'./L0-timeseries/{deploy_name}_delayed.nc'
deploymentyaml = './deploymentRealtime.yml'
gridpath = './L0-gridfiles/'
ts_path = './L0-timeseries/'
ts = xr.open_dataset(openfile)
deployment = utils._get_deployment(deploymentyaml)
ts = utils.flag_CTD_data(ts)
ts2 = utils.adjust_CTD(ts, deployment, interpolate_filter=None)
outfile = f'{ts_path}/{deploy_name}_adjusted.nc'
_log.info('Saving adjusted timeseries to netcdf')
outname = ts2.to_netcdf(outfile)
outname2 = ncprocess.make_gridfiles(
outname,
gridpath,
deploymentyaml,
fnamesuffix='_adjusted',
maskfunction=None,
max_gap=100
)
The following sections describe each processing step in detail.
flag_CTD_data#
This step identifies and flags CTD values that are clearly unphysical (QC4), typically caused by air bubbles in the conductivity cell.
Conductivity data are grouped into profile bins (d_profile) and depth bins (dz). Within each depth bin:
Values more than 5 standard deviations from the mean are temporarily excluded
A cleaned mean and standard deviation are recomputed
Values exceeding
clean_stdevfrom the cleaned mean are flagged as QC4
If accuracy is provided, small deviations below this threshold are not flagged.
General behavior:
QC variables are added if missing
Values not flagged as QC4 are set to QC1
salinity_QCis set to QC4 whereverconductivity_QCis QC4
adjust_CTD#
This step applies two corrections:
CT lag correction (
dTdC)Thermal lag correction (
alpha,tau)
Correction constants can be:
Passed as function arguments
Loaded from the deployment YAML file
If both are provided and differ, function arguments take precedence and a warning is issued.
Example YAML configuration#
glider_devices:
ctd:
Thermal_lag_constants_[alpha,tau]: [0.2, 2]
dTdC: 0
CT lag correction#
If dTdC is not None, temperature is shifted back in time to align with conductivity.
If dTdC is None or 0, no lag correction is applied.
Thermal lag correction#
If alpha and tau are provided, apply_thermal_lag is used to:
Estimate conductivity cell temperature
Recalculate
salinity_adjusted
Optional: interpolate_filter#
An optional preprocessing step can be applied to reduce noise and prevent spikes from propagating when applying the thermal lag correction. This function should take and return an xarray Dataset of salinity (e.g., linear interpolation over short gaps).
Example: utils.interpolate_over_salinity_NANs
Output Variables#
The adjusted dataset includes:
temperature_adjustedsalinity_adjustedpotential_density_adjustedpotential_temperature_adjusted
Quality control flags are propagated to adjusted variables.
Metadata are updated to document:
Applied corrections
Processing date
Data provenance
Notes#
Thermal lag correction is only applied if
alphaandtauare definedCT lag correction is only applied if
dTdCis non-zeroQC4 values may be excluded from processing if a masking function is applied during gridding
Small data gaps can be interpolated prior to filtering to improve stability
Summary#
This workflow provides a reproducible method for:
Flagging bad CTD data
Correcting sensor response lags
Producing adjusted physical variables
Generating gridded NetCDF products
It is designed to be flexible, allowing users to customize correction parameters and preprocessing steps depending on sensor characteristics and mission requirements.