Authoritative on-disk locations of the datasets this repo processes, so you don't
have to guess. All roots are absolute paths on the lab's /spray storage and
are defined as module constants in code — make them overridable via CLI flags,
never hardcode a new one inline (mirror the existing DEFAULT_*_ROOT pattern).
Conventions used throughout:
- Bounding boxes are west south east north in degrees. Longitudes come in both
[-180,180) and [0,360); normalize with the shared BBox/normalize_longitudes
helpers rather than re-rolling.
- Downloaders land raw files under raw/{collection}/YYYY/MM/DD/, processed under
processed/…, with manifests/. Downloads are idempotent (skip existing unless
an --overwrite-* flag is set).
- Data files are not committed (.gitignore excludes *.nc *.csv *.png *.bin);
write run outputs to tmp/ or a --out path.
Altimetry (SSH / SSHA)
SWOT L2 LR SSH Expert — /spray/swot/versionD
Constant: DEFAULT_SWOT_ROOT (swot/utils.py, multi_altimeters/*).
- Per-pass granules: cycle_XXX/SWOT_L2_LR_SSH_Expert_<CYC>_<PASS>_<START>_<STOP>_PGD0_02.nc
- Glob: cycle_*/SWOT_L2_LR_SSH_Expert_*.nc
- Sample: /spray/swot/versionD/cycle_001/SWOT_L2_LR_SSH_Expert_001_134_20230726T000155_20230726T000155_PGD0_02.nc
- Concatenated per cycle: combined/SWOT_L2_LR_SSH_Expert_cycle_<CYC>_combined.nc (7–33 GB;
adds a leading num_passes dim + pass_number(num_passes)).
- Structure: 2-D swath num_lines(9866) × num_pixels(69).
SSHA vars ssha_karin, ssha_karin_2 (no ssha_noiseless here); coords
latitude/longitude (2-D), time(num_lines) (seconds since 2000-01-01),
nadir tracks latitude_nadir/longitude_nadir. Quality ssha_karin_2_qual,
crossover height_cor_xover, internal tide internal_tide_hret,
ocean mask depth_or_elevation < 0.
- Longitude: [0, 360). Coverage: science phase from 2023-07-26 onward.
- Other SWOT dirs under /spray/swot/ (expert/, expert_aviso/, regridded/,
ssha_mean, pass_stats, subsets/, grids/, pixc/, orbits/) are
derived/auxiliary — the primary L2 archive is versionD.
PIXC downloads default to /spray/swot/pixc (DEFAULT_PIXC_ROOT).
AVISO science-orbit shapefiles default to /spray/swot/orbits
(DEFAULT_ORBIT_DIR: sph_science_nadir.zip, sph_science_swath.zip).
- Domain gotcha: SWOT restarted cycle numbering between orbits. Science phase
(21-day, 584 passes/cycle) numbers from 1; cal/val phase (1-day, early 2023,
28 passes/cycle) numbers ~474–577. cycle >= 474 is cal/val (swot.constants.CALVAL_CYCLE_MIN).
SWOT 1 km Unsmoothed OI — /spray/swot/regrid_1km
Constants: GRID_ROOT / OUTPUT_ROOT (swot/regrid_unsmoothed_to_1km.py).
- Coordinate grids: {science,calval}/pass_NNN_grid_1km.nc (1 km merged L+R,
~131 × 19 731, lat/lon + cross/along-track metres).
- Pass products: cycle_CCC/pass_PPP_regridded_1km.nc (ssha, uncert;
two OI parameter sets on n_param by default).
- QC: ssha_karin_2 + height_cor_xover, qual==0, ocean class==0, |ssha|≤3 m.
SWOT 250 m FFT+OI tiles — /spray/swot/statistics/oi_250m_fft4km
- Per side:
cycle_XXX/pass_YYY_{left,right}.h5+ sidecar.csv. - Groups
seg_NNNN:ssha_native,ssha_fft,ssha_oi, lat/lon. - Job log:
logs/process.log. Resume-safe (skip existing.h5).
SWOT tile diagnostics — /spray/swot/statistics/
- Aggregated 40×40 tile stats:
diagnostics/(Parquet). - Raw 40×40 SSHA extracts:
raw_tiles/cycle_XXX_tiles.h5.
RADS nadir altimetry — /spray/rads/data (+ /spray/rads/tables)
Constants: DEFAULT_RADS_ROOT / DEFAULT_RADS_TABLES_DIR (rads/utils.py).
- Layout: <sat>/<phase>/c<CCC>/<sat>p<PPPP>c<CCC>.nc
(sat ∈ 3a 3b 6a c2 e1 e2 g1 gs j1 j2 j3 n1 pn sa sw tx; phase ∈ a b c d).
- Glob: */[abcd]/c[0-9][0-9][0-9]/*.nc
- Sample: /spray/rads/data/j3/a/c104/j3p0100c104.nc
- Structure: 1-D along-track, single dim time. SSHA var ssha
(m, scale_factor 1e-4; variants ssha_mle3, ssha_adaptive, ssha_plrm);
coords time (seconds since 1985-01-01), lat, lon. Aux: swh_ku, flags,
topography topo_srtm15plus/topo_ace2, sea-ice seaice_conc*.
- Longitude: [0, 360). ~170 vars/file. mission_name/cycle_number/pass_number
in global attrs.
- /spray/rads/data/sw holds the SWOT-nadir tracks used to spatially prefilter
SWOT Expert passes (DEFAULT_RADS_SW_ROOT in swot/utils.py).
- Pass-index CSV used by colocate: /spray/rads/data/lookup_tables/rads_pass_index.csv
(rads.utils.DEFAULT_PASS_INDEX; odsl-colocate-refresh --targets rads).
If that file is absent, odsl-colocate-swot-rads falls back to the
cycle-repack copy /spray/rads/cycle_files/lookup_tables/rads_pass_index.csv
(currently Jason-3).
SWOT × RADS pair files — /spray/swot/swot_rads
Constant: DEFAULT_OUT_ROOT (colocate/colocate_swot_rads.py).
- One NetCDF4 file per SWOT Expert × RADS pass crossing (±1 h, 10 km default):
swot_c<CYC>_p<PASS>_x_<mission>_c<CYC>_p<PASS>.nc
- Groups: /swot (native Expert excerpt + collocated ssha), /rads
(along-track excerpt), /profile (RADS line through the swath), /matchup
(nearest pixel, distance_km, dt_seconds, swot_cross_track_km).
A pair is kept only when the RADS profile crosses the KaRIn swath
(≥ 60 km cross-track and both half-swaths by default).
AVISO DUACS SWOT products — /spray/aviso/swot_products
Constant: AVISO_L4_ROOT (multi_altimeters/utils.py).
- L4 gridded maps (the only populated tree):
l4_karin_nadir/v3_0/miost/dt_global_allsat_phy_l4_<YYYYMMDD>_<PROCDATE>.nc
- Glob: l4_karin_nadir/v3_0/miost/dt_global_allsat_phy_l4_*.nc
- Structure: regular grid time(1) × latitude(1441) × longitude(2880) (~0.125°).
SSHA var sla (+ adt, ugosa/vgosa, ugos/vgos, relative_vorticity);
coords latitude/longitude/time (days since 1950-01-01).
- Longitude: [-180, 180) ← differs from RADS/SWOT.
- Coverage: 2023-03-28 … 2023-04-20 (24 daily maps as of this writing).
- L3 along-track l3_karin_nadir/l3_lr_ssh/v3_0/Basic/ — scaffold exists but is
empty (0 files).
Sea-surface temperature (SST)
- Suomi-NPP VIIRS L2P —
/spray/snpp(raw/,processed/,regridded/,grids/,manifests/,footprints/snpp_granule_footprints.parquet). Raw:raw/VIIRS_NPP-STAR-L2P-v2.80/YYYY/MM/DD/*.nc. - GOES ABI L2P (geostationary GOES satellites, not the NASA GEOS model) —
/spray/geos(raw/,processed/,regridded/,manifests/,footprints/geos_granule_footprints.parquet).DEFAULT_OUT_ROOTingeos/geos_sst.py. - SST processing convention: kelvin→
sst_celsius,recommended_quality(quality_level >= 5), decodel2p_flagsday/night →is_day/is_night.
Ocean colour
- PACE OCI L2 —
/spray/pacewith per-product dirsPACE_OCI_L2_BGC/,PACE_OCI_L2_IOP/(AOP excluded on disk), eachYYYY/MM/DD/*.nc; plusfootprints/,logs/. Note: a science backfill may be running here.
In-situ / auxiliary
- Argo —
/spray/argo/<dac>/<wmo>/<wmo>_prof.nc(dacs:aoml bodc coriolis csio csiro incois jma kiost kma meds nmdis …); processed indexprocessed/argo_profile_index.parquet. - Drifters —
/spray/drifters/(drifter_hourly_qc/,drifter_6hour_qc/, derived means/variance/loopers;footprints/drifter_footprints.parquet). - Gliders —
/spray/gliders/netcdf/(+catalog/,metadata/,footprints/glider_footprints.parquet). National IOOS DAC dump (odsl-glider-download). GCOOS-submitted deployments can also be filtered with--gcoosand optionally--layout tree. - GCOOS —
/spray/gcoos(DEFAULT_GCOOS_ROOTingcoos/utils.py). Sorted tree:moorings/{nrt,historical}/{network}/*.nc,ship_ctd/{campaign}/*.nc,grids/{family}/*.nc, andgliders/{operational,historical}/{operator}/…. Catalogs undercatalog/. Seedocs/GCOOS_SYNC.md. Do not relocate/spray/gliders/netcdf. - ICESat-2 —
/spray/icesat2is release 007:ATL07/(sea_ice_segments),ATL10/(freeboard in per-beam groupfreeboard_segment— v007; the oldfreeboard_beam_segmentyields 0 rows), plus derivedthin/,polar-segments/,catalog/,footprints/. Beamsgt1l gt1r gt2l gt2r gt3l gt3r. - In-situ wind —
/spray/wind/insitu/(ndbc/,oceansites/,ooi_erddap/,pmel_erddap/,samos/,tao_rama_pirata/, unified inunified/,footprints/insitu_wind_stations.parquet). - ECCO V4r4 observations —
/spray/ecco(DEFAULT_ECCO_ROOTinecco/utils.py). Official PO.DAAC observational constraints live underraw/ECCO_L4_ANCILLARY_DATA_V4R4/(thedata_constraintstar) and extract todata_constraints/{input_sla,input_sst,input_sss,input_bp,input_seaice_conc,input_insitu,input_other,data_error}. Existing 0.5° model output is inv4r4-0.5deg/and is not this archive.
Registration / footprint indices (fast bbox+time search)
Persistent broad-phase indices used by colocate/ and the regional subsetter
(odsl-super-subsetter). Build/inspect them all with
odsl-colocate-refresh {status,refresh}; authoritative map in
colocate/refresh_registration.py::_FALLBACK_INDEX.
| Source | Index parquet | One row per |
|---|---|---|
| swot | /spray/swot/versionD/footprints/swot_pass_segments_science.parquet |
pass segment |
| pace | /spray/pace/footprints/pace_granule_footprints.parquet |
granule (auto-updated by odsl-pace-download from CMR bboxes for locally-present files; the subsetter falls back to a date-tree scan if it ever lags) |
| argo | /spray/argo/processed/argo_profile_index.parquet |
profile (~922k rows) |
| glider | /spray/gliders/footprints/glider_footprints.parquet |
deployment file |
| drifter | /spray/drifters/footprints/drifter_footprints.parquet |
buoy file (6-hour product) |
| icesat2 | /spray/icesat2/footprints/icesat2_granule_footprints.parquet |
polar-segments parquet granule (not the raw .h5) |
| snpp | /spray/snpp/footprints/snpp_granule_footprints.parquet |
processed VIIRS L2P granule |
| geos | /spray/geos/footprints/geos_granule_footprints.parquet |
processed GOES ABI L2P granule |
| rads | /spray/rads/data/lookup_tables/rads_pass_index.csv |
nadir pass (time only; bbox at load) |
| aviso | /spray/aviso/footprints/aviso_l4_daily.parquet |
L4 daily map (global bbox; cells sampled at load) |
| wind | /spray/wind/insitu/footprints/insitu_wind_stations.parquet |
unified-parquet station |
Build/refresh every table with odsl-colocate-refresh refresh. SNPP/GOES
builders are incremental (skip paths already in the parquet).
Note on the editable install
import <package> / the odsl-* console scripts resolve against whatever is on
sys.path. If /opt/miniforge3/.../site-packages/<package> is a stale copy
(not an editable link), your source edits won't be seen and you'll get errors like
ImportError: cannot import name 'AVISO_L4_ROOT'. Refresh with
python -m pip install -e ".[all]", or run against the source tree with
PYTHONPATH=<repo-root> python <dir>/<script>.py.