i7aof.biascorr¶
Purpose: Bias-correction methods (time-slice statistics and projection
workflows) to align model fields with a reference climatology, producing
corrected temperature (thetao) and salinity (so) on the ISMIP grid.
Public Python API (by module)¶
Import paths and brief descriptions by module:
Module:
i7aof.biascorr.timesliceTimeslice: A container and helper for extracting per-year (or mean) gridded T and S, computing 3D volume, binning volume in T–S space by basin, and building per-basin bias anomalies relative to a model reference period.Key methods:
get_all_data()— convenience to call T/S extraction, volume, and binning.get_T_and_S()— loadthetaoandsofor a given time index or the first time.get_volume()— compute grid-cell volume from uniformdx,dy,dzbased on the first differences ofx,y,z.get_bins()— compute per-basin 2D histograms in (S, T) space:Vb, with edgesSb,Tb.compute_delta(modref)()— compute filled per-basin anomaliesdeltaSf,deltaTfon the model-ref bins.apply_anomaly(base)()— map filled anomalies back to 3D to produceS_corrected,T_correctedusing the “base” fields.
Notable attributes:
T,S,V,Vb,Sb,Tb,deltaSf,deltaTf,S_corrected,T_corrected,Nbins,Nbasins.
Module:
i7aof.biascorr.projectionProjection: Orchestrates the bias-correction workflow across reference, model-reference, base (extrapolated), and future model periods; constructs continental-shelf basin masks; loops over years to write corrected outputs.Key methods:
read_reference()— buildTimeslicefor reference (ref), model reference (modref), and base (base) and compute their data.compute_bias()— compute salinity and temperature bin bias corrections (Sc,Tc) on the model reference bins.read_model()— iterate over all model files in the future period, apply anomalies per time index, and write corrected outputs.read_model_timeslice()— one-year helper used byread_model().create_basin_masks()— construct per-basin masks over the continental shelf using topography and IMBIE basins.plot_TS_diagrams(filename)()— quick-look T–S histograms per basin for ref/modref/bias-corrected bins.
Important attributes:
ref,modref,base,basinNumber,basinmask,basinmask_extrap,Nbins, input filename patterns.
Required config options¶
Section [biascorr] is required. Keys used by the workflow:
Input datasets (NetCDF files or glob patterns):
thetao_ref,so_ref— reference dataset over the reference period (observational or reanalysis), on the ISMIP grid.thetao_modref,so_modref— model over the reference period (non- extrapolated). Used to build model reference bins and anomalies.thetao_base,so_base— model over the reference period with extrapolated fields, used as the base to which anomalies are applied.thetao_mod,so_mod— model over the target/future period to be corrected (glob patterns; yearly or chunked files expected).
Ancillary inputs and parameters:
filename_topo— ISMIP topography file (output of i7aof.topo); used to mask out deep ocean and non-shelf regions.filename_imbie— IMBIE basin mask file (output of i7aof.imbie), with variablebasinNumber.z_shelf(float, meters) — maximum bed elevation for “continental shelf” mask (e.g., -1500 m).Nbins(int) — number of equally spaced bins for both S and T per basin.
Assumptions:
Input variables are named
thetaoandso, with dims(time, z, y, x).Horizontal and vertical spacing are uniform and read from
x,y,zcoords. Volume currently ignores partial cell fractions (see Internals).
Outputs¶
Corrected NetCDF files written by
Projection.read_model()in the current working directory, one pair per input chunk:thetao_corrected_{startYear}_{endYear}.ncso_corrected_{startYear}_{endYear}.nc
Optional: T–S diagram figure from
Projection.plot_TS_diagrams(filename)().
Data model¶
Gridded variables:
T(thetao),S(so), 3D volumeV(z,y,x).Per-basin T–S histograms:
Vb(Nbasins,Nbins,Nbins)with bin edgesSb(Nbasins,Nbins+1),Tb(Nbasins,Nbins+1).Filled per-basin anomalies on model-ref bins:
deltaSf,deltaTf.Corrected gridded fields:
S_corrected(z,y,x),T_corrected(z,y,x).Basin metadata:
basinNumber(y,x), masksbasinmask(Nbasins,y,x)andbasinmask_extrap(Nbasins,y,x).
Runtime and external requirements¶
Core:
numpy,xarray,tqdm,matplotlib(for plotting).Inputs are expected on the ISMIP grid; see i7aof.grid, i7aof.topo, and i7aof.imbie for producing required ancillary files.
For the authoritative conda-forge environment, see
dev-spec.txt(notepyproject.tomllists a PyPI-only subset).
Usage¶
High-level workflow to bias-correct a model period:
from i7aof.biascorr.projection import Projection
proj = Projection(config, logger)
proj.read_reference() # loads ref, modref, base and computes bins/volumes
proj.compute_bias() # derives per-basin Sc and Tc on model-ref bins
proj.read_model() # loops over future files; writes corrected outputs
# Optional quick-look TS plots
proj.plot_TS_diagrams('ts_diagrams.png')
Notes:
Ensure
filename_topoandfilename_imbiepoint to files on the same ISMIP grid as the inputs.Use sensible
z_shelfso shelf basins contain finite volume.
Internals (for maintainers)¶
Timeslice volume and histograms:
Volume assumes uniform
dx, dy, dzcomputed from the first grid steps; a TODO notes applying cell fractions in the future.get_bins()builds 2D histograms in (S, T) per basin, weighting by grid cell volume masked bybasinmask.
Anomaly computation and filling:
compute_delta(modref)forms volume-weighted anomalies on the model-ref bins and fills missing bins iteratively by averaging neighbor bins until full coverage.
Bias curves (Sc, Tc):
Salinity: per-basin search over scalings in [0.5, 1.5) to best match the reference S PDF while anchoring the chosen percentile (
perc=99by default).Temperature: scale the (T - Tmin) distribution so the
percpercentile matches reference; anchor at Tmin.
Apply to 3D fields: anomalies are looked up by bin indices derived from the base fields per basin and added to produce corrected fields.
Basin masks:
create_basin_masks()reads topography and IMBIE basins; the shelf mask usesbed > z_shelfto exclude deep ocean; an “extrapolated” mask includes full basins for applying anomalies to base fields.
Edge cases / validations¶
File pairing:
read_model()assumes eachthetaofile has a matchingsofile via name replacement. An assertion will fail otherwise.Dimensions and names: variables must be named
thetaoandsoand share the same time coordinate and (x,y,z) grids. The code usesxr.testing.assert_equalontimeto enforce matching time axes.Uniform spacing: volume assumes uniform spacing; highly nonuniform grids aren’t supported in the current implementation.
Binning robustness: empty bins lead to NaNs which are then filled iteratively; extreme cases could require tuning
Nbins.
Extension points¶
Allow custom output paths/filenames for corrected fields instead of the current hard-coded names.
Incorporate partial-cell fractions and exact grid metrics in volume.
Support alternative binning strategies, percentiles, and scaling ranges.
Generalize variable names/dimension names or pass them via config.