oceanarray 0.5.0__tar.gz → 0.5.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {oceanarray-0.5.0 → oceanarray-0.5.1}/.github/workflows/tests.yml +9 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/CHANGELOG.md +42 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/CITATION.cff +2 -2
- {oceanarray-0.5.0 → oceanarray-0.5.1}/CONTRIBUTING.md +23 -7
- {oceanarray-0.5.0/oceanarray.egg-info → oceanarray-0.5.1}/PKG-INFO +4 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/README.md +2 -0
- oceanarray-0.5.1/docs/source/cli_reference.rst +320 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/conf.py +1 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/legacy.rst +2 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/project_structure.md +1 -2
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/yaml_configuration.rst +38 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/notebooks/legacy/demo_batch_instrument.ipynb +3 -3
- {oceanarray-0.5.0 → oceanarray-0.5.1}/notebooks/legacy/demo_instrument.ipynb +3 -3
- {oceanarray-0.5.0 → oceanarray-0.5.1}/notebooks/legacy/demo_instrument_rdb.ipynb +3 -3
- oceanarray-0.5.1/oceanarray/_version.py +1 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/cli.py +6 -5
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/config/parameters.py +139 -111
- oceanarray-0.5.1/oceanarray/config/unit_tables.py +199 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/config/validation.py +10 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/plotters/_cli_legacy.py +6 -2
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/plotters/animation.py +2 -2
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/plotters/current.py +40 -22
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/plotters/diagnostic.py +44 -20
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/plotters/helpers.py +6 -6
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/plotters/hydrography.py +10 -4
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/plotters/primitives.py +1 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/plotters/spectrum.py +8 -2
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/plotters/timeseries.py +6 -6
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/plotters/ts.py +1 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/processors/coordinate.py +11 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/processors/grid.py +5 -5
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/processors/pressure.py +133 -27
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/processors/qc.py +2 -2
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/processors/stack.py +33 -9
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/processors/stage1.py +109 -4
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/processors/stage2.py +2 -2
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/processors/stage3.py +3 -3
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/processors/units.py +98 -91
- oceanarray-0.5.1/oceanarray/reports/__init__.py +32 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/_array.py +253 -24
- oceanarray-0.5.1/oceanarray/reports/_env.py +194 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/_figdebug.py +90 -10
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/_grid.py +49 -48
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/_html_helpers.py +123 -152
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/_instrument.py +41 -30
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/_mooring.py +16 -24
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/_navs.py +3 -3
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/_plots.py +8 -8
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/_slots.py +1 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/_stack.py +41 -19
- oceanarray-0.5.1/oceanarray/reports/_vendored/MANIFEST.txt +22 -0
- oceanarray-0.5.1/oceanarray/reports/_vendored/README.md +36 -0
- oceanarray-0.5.1/oceanarray/reports/_vendored/__init__.py +18 -0
- oceanarray-0.5.1/oceanarray/reports/_vendored/check.py +337 -0
- oceanarray-0.5.0/oceanarray/reports/_css.py → oceanarray-0.5.1/oceanarray/reports/_vendored/css.py +183 -15
- oceanarray-0.5.0/oceanarray/config/report_tokens.py → oceanarray-0.5.1/oceanarray/reports/_vendored/design_tokens.py +200 -20
- oceanarray-0.5.0/oceanarray/reports/_encode.py → oceanarray-0.5.1/oceanarray/reports/_vendored/figure_png.py +58 -8
- oceanarray-0.5.1/oceanarray/reports/_vendored/leaflet/LICENSE +26 -0
- oceanarray-0.5.1/oceanarray/reports/_vendored/leaflet/leaflet.min.css +8 -0
- oceanarray-0.5.1/oceanarray/reports/_vendored/leaflet/leaflet.min.js +12 -0
- oceanarray-0.5.1/oceanarray/reports/_vendored/leaflet.py +241 -0
- oceanarray-0.5.1/oceanarray/reports/_vendored/nc_tables.py +888 -0
- oceanarray-0.5.0/oceanarray/reports/_manifest.py → oceanarray-0.5.1/oceanarray/reports/_vendored/page_model.py +35 -4
- oceanarray-0.5.1/oceanarray/reports/_vendored/templates/_map.html +259 -0
- {oceanarray-0.5.0/oceanarray/reports → oceanarray-0.5.1/oceanarray/reports/_vendored}/templates/_nav.html +6 -1
- oceanarray-0.5.1/oceanarray/reports/_vendored/templates/_nc_tables.html +321 -0
- oceanarray-0.5.1/oceanarray/reports/_vendored/units.py +366 -0
- oceanarray-0.5.1/oceanarray/reports/_vendored/units_tables.py +161 -0
- oceanarray-0.5.1/oceanarray/reports/design.py +127 -0
- oceanarray-0.5.1/oceanarray/reports/templates/_grid_history.html +18 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_instrument_files.html +8 -2
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_macros.html +2 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/array.html +29 -13
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/base.html +1 -15
- oceanarray-0.5.1/oceanarray/tools/readers.py +558 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/utilities.py +2 -2
- {oceanarray-0.5.0 → oceanarray-0.5.1/oceanarray.egg-info}/PKG-INFO +4 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray.egg-info/SOURCES.txt +36 -18
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray.egg-info/requires.txt +1 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray.egg-info/scm_file_list.json +36 -18
- oceanarray-0.5.1/oceanarray.egg-info/scm_version.json +8 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/pyproject.toml +10 -4
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/conftest.py +6 -5
- oceanarray-0.5.1/tests/fixtures/adcp/dsG2_adcp_stage3_knockdown.nc +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/golden/dune2/dune2_1_2026_grid_report.html +292 -414
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/golden/dune2/dune2_1_2026_report.html +132 -21
- oceanarray-0.5.1/tests/fixtures/golden/dune2/dune2_1_2026_stack_report.html +1045 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/golden/dune2/instrument/dune2_1_2026_2941_report.html +328 -612
- oceanarray-0.5.1/tests/fixtures/golden/dune2/instrument/dune2_1_2026_9920_report.html +1378 -0
- oceanarray-0.5.1/tests/fixtures/raw/osnap/CF7_MCTD_2020_22225_50m.nc +0 -0
- oceanarray-0.5.1/tests/fixtures/raw/osnap/OS_OSNAP-10633_KPO_1111_K7_201408_D_MCTD_OSNAPstyleOceanSITES.nc +0 -0
- oceanarray-0.5.1/tests/fixtures/raw/osnap/OS_OSNAP_WHOI_CF7_202007_CM_500m.nc +0 -0
- oceanarray-0.5.1/tests/fixtures/raw/osnap/README.md +38 -0
- oceanarray-0.5.1/tests/fixtures/raw/osnap/rtwb1_01_2014_001.microcat +491 -0
- oceanarray-0.5.1/tests/fixtures/raw/osnap/rtwb1_01_2014_11021.edt +492 -0
- oceanarray-0.5.1/tests/fixtures/raw/osnap/run_example.sh +42 -0
- oceanarray-0.5.1/tests/integration/test_osnap_pipeline.py +141 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/integration/test_stage1_from_raw.py +5 -5
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_array.py +43 -1
- oceanarray-0.5.1/tests/unit/test_base_css_no_vendored_dup.py +79 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_canonical_units.py +207 -68
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_grid_manifest.py +7 -19
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_instrument_manifest.py +1 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_manifest.py +1 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_mooring_manifest.py +1 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_nav.py +1 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_nc_tables.py +24 -17
- oceanarray-0.5.1/tests/unit/test_osnap_readers.py +155 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_parameters.py +15 -7
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_plot_guard.py +1 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_plotters.py +49 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_pressure.py +128 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_report.py +99 -19
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_report_golden.py +12 -18
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_report_tokens.py +2 -2
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_stack_omission.py +39 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_stage1.py +1 -1
- oceanarray-0.5.1/tests/unit/test_stub_reason.py +63 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_unit_label_literals.py +5 -1
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_utilities.py +12 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_validation.py +12 -0
- oceanarray-0.5.1/tests/unit/test_vendored.py +38 -0
- oceanarray-0.5.0/VENDORED.txt +0 -9
- oceanarray-0.5.0/docs/source/cli_reference.rst +0 -666
- oceanarray-0.5.0/oceanarray/_version.py +0 -1
- oceanarray-0.5.0/oceanarray/reports/__init__.py +0 -6
- oceanarray-0.5.0/oceanarray/reports/_env.py +0 -126
- oceanarray-0.5.0/oceanarray/reports/_nc_tables.py +0 -176
- oceanarray-0.5.0/oceanarray/reports/_report_css.py +0 -23
- oceanarray-0.5.0/oceanarray/reports/templates/_grid_history.html +0 -10
- oceanarray-0.5.0/oceanarray/reports/templates/_nc_coords.html +0 -15
- oceanarray-0.5.0/oceanarray/reports/templates/_nc_globals.html +0 -21
- oceanarray-0.5.0/oceanarray/reports/templates/_nc_scalars.html +0 -24
- oceanarray-0.5.0/oceanarray/reports/templates/_nc_var_macros.html +0 -32
- oceanarray-0.5.0/oceanarray/reports/templates/_nc_variables.html +0 -20
- oceanarray-0.5.0/oceanarray/tools/readers.py +0 -304
- oceanarray-0.5.0/oceanarray.egg-info/scm_version.json +0 -8
- oceanarray-0.5.0/scripts/check_vendored.py +0 -111
- oceanarray-0.5.0/tests/fixtures/golden/dune2/dune2_1_2026_stack_report.html +0 -1529
- oceanarray-0.5.0/tests/fixtures/golden/dune2/instrument/dune2_1_2026_9920_report.html +0 -2091
- oceanarray-0.5.0/tests/unit/test_vendored.py +0 -41
- {oceanarray-0.5.0 → oceanarray-0.5.1}/.gitattributes +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/.github/ISSUE_TEMPLATE.md +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/.github/dependabot.yml +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/.github/workflows/docs.yml +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/.github/workflows/docs_deploy.yml +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/.github/workflows/pypi.yml +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/.gitignore +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/LICENSE +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/Makefile +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/environment.yml +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/How do I transform a coordinate system manually_ /342/200/223 Nortek Support Center.pdf" +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/array_processing.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/array_processing_v2.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/code/3_beam_transformation.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/code/auto_filt.m +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/code/hydro_grid.m +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/code/microcat2rodb_2.m +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/code/microcat2rodb_3.m +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/code/microcat_apply_cal.m +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/code/microcat_apply_cal_plus.m +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/code/microcat_raw2use_003.m +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/code/mooring_interp_wb2_3_5.m +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/css/custom.css +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/demo/dune2/dune2_1_2026_grid_report.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/demo/dune2/dune2_1_2026_report.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/demo/dune2/dune2_1_2026_stack_report.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/demo/dune2/instrument/dune2_1_2026_2941_report.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/demo/dune2/instrument/dune2_1_2026_9920_report.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/github_solo_workflow.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/github_workflow2.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/instrument_processing.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/instrument_processing_v2.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/instrument_processing_v4.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/instrument_processing_v5.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/instrument_processing_v6.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/logo.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/mooring_processing.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/mooring_processing_V2.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/mooring_processing_v3.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/mooring_processing_v4.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/oceanarray_grid_report.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/oceanarray_icon.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/oceanarray_instrument_report.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/oceanarray_report_header.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/oceanarray_stack_report.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/_static/rotary_spectrum_plan.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/calibration_dips.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/clock_offset.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/directory_structure.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/file_naming_conventions.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/index.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/installation.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/methods/acquisition.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/methods/auto_qc.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/methods/calibration.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/methods/concatenation.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/methods/conversion.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/methods/multisite_merging.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/methods/nortek_coordinate_transform.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/methods/standardisation.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/methods/time_gridding.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/methods/trimming.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/methods/vertical_gridding.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/migration.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/oceanSITES_manual.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/oceanarray.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/oceanarray_format.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/processing_framework.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/quickstart.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/reports.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/roadmap.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/style_guide.md +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/docs/source/troubleshooting.rst +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/notebooks/demo_climatology.ipynb +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/notebooks/demo_mooring.ipynb +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/notebooks/dsE_1_2018_microcat_7518_temperature.png +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/notebooks/legacy/README.md +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/notebooks/legacy/demo_check_clock.ipynb +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/notebooks/legacy/demo_clock_offset.ipynb +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/notebooks/legacy/demo_mooring_rdb.ipynb +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/notebooks/legacy/demo_stage1.ipynb +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/notebooks/legacy/demo_stage2.ipynb +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/__init__.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/analysis/__init__.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/analysis/clock.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/analysis/hydrographic.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/analysis/science.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/analysis/spectral.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/analysis/temporal.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/analysis/vector.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/config/__init__.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/config/legacy/project_RAPID.yaml +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/config/legacy/rodb_keys.txt +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/config/legacy/rodb_keys.yaml +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/config/logging.yaml +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/inspect.py +0 -0
- /oceanarray-0.5.0/oceanarray/config/OS1_sensor_attrs.yaml → /oceanarray-0.5.1/oceanarray/legacy/OS1_sensor_attributes.yaml +0 -0
- /oceanarray-0.5.0/oceanarray/legacy/OS1_vocab_attrs.yaml → /oceanarray-0.5.1/oceanarray/legacy/OS1_variable_attributes.yaml +0 -0
- /oceanarray-0.5.0/oceanarray/config/OS1_var_names.yaml → /oceanarray-0.5.1/oceanarray/legacy/OS1_variable_names.yaml +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/legacy/__init__.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/legacy/caldip.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/legacy/convertOS.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/legacy/find_deployment.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/legacy/mooring_rodb.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/legacy/process_rodb.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/legacy/rodb.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/legacy/tools.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/logger.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/paths.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/plotters/__init__.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/processors/__init__.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/processors/caldip.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/processors/helpers.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/_pdf.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/_recovery_table.py +0 -0
- {oceanarray-0.5.0/oceanarray/config → oceanarray-0.5.1/oceanarray/reports/_vendored}/report.mplstyle +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_instrument_analog_yaml.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_instrument_qc.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_instrument_rose_note.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_instrument_windows_note.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_calibration.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_clock_table.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_diagram.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_instruments.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_issues.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_pipeline.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_qc.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_timing.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_stack_instr_table.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_stack_roses_note.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/grid.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/instrument.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/mooring.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/recovery_table.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/reports/templates/stack.html +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/tools/__init__.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/tools/rapid_interp.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/writers/__init__.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray/writers/netcdf.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray.egg-info/dependency_links.txt +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray.egg-info/entry_points.txt +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/oceanarray.egg-info/top_level.txt +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/setup.cfg +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/caldip/castM4_caldip.nc +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/proc/MIXSED2026.array.yaml +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage1.nc +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage2.nc +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage3.nc +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026.mooring.yaml +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026_grid.nc +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026_stack.nc +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage1.nc +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage2.nc +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage3.nc +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/raw/dune2_1_2026/aquadopp/9920_recovery.dat +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/raw/dune2_1_2026/aquadopp/9920_recovery.hdr +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/raw/dune2_1_2026/microcat/2941_recovery.asc +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/fixtures/regenerate_dune2_microcat.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/integration/__init__.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/integration/conftest.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/integration/test_pipeline.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/integration/test_readers.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/integration/test_recovery_table.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/integration/test_stage1.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/integration/test_stage2.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/integration/test_time_gridding.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/legacy/__init__.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/legacy/test_convertOS.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/legacy/test_mooring_rodb.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/legacy/test_process_rodb.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/legacy/test_rodb.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/test_imports.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/__init__.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_caldip.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_cli.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_flag_merge.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_grid_clamp.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_helpers.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_logger.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_paths.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_pdf_report.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_process_api.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_qc.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_recovery_table.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_stage2.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_stage3.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_time_gridding.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_tools.py +0 -0
- {oceanarray-0.5.0 → oceanarray-0.5.1}/tests/unit/test_writers_netcdf.py +0 -0
|
@@ -43,9 +43,17 @@ jobs:
|
|
|
43
43
|
- name: Run unit tests
|
|
44
44
|
# Coverage gate runs once, on the canonical ubuntu + 3.11 leg; the extra
|
|
45
45
|
# version legs run --no-cov so they only verify install + test pass.
|
|
46
|
+
env:
|
|
47
|
+
# Windows: the netCDF4 wheel points HDF5_PLUGIN_PATH at its bundled plugins
|
|
48
|
+
# folder, and HDF5 rescans it on every filter query -- xarray calls
|
|
49
|
+
# var.filters() once per variable, so each NETCDF4 open costs ~36 ms/variable
|
|
50
|
+
# on the hosted runner. "::" preloads no plugins. oceanarray writes zlib
|
|
51
|
+
# (built into HDF5), so only zstd/bzip2/blosc files would need them -- none
|
|
52
|
+
# here. No effect on Linux/macOS.
|
|
53
|
+
HDF5_PLUGIN_PRELOAD: "::"
|
|
46
54
|
run: >
|
|
47
55
|
pytest tests/unit -m "not slow and not local and not needs_seasenselib" -q
|
|
48
|
-
${{ (matrix.os == 'ubuntu-latest' && matrix.python-version == '3.11') && '--cov=oceanarray --cov-report=term-missing --cov-fail-under=
|
|
56
|
+
${{ (matrix.os == 'ubuntu-latest' && matrix.python-version == '3.11') && '--cov=oceanarray --cov-report=term-missing --cov-fail-under=58' || '--no-cov' }}
|
|
49
57
|
|
|
50
58
|
integration:
|
|
51
59
|
runs-on: ubuntu-latest
|
|
@@ -6,6 +6,48 @@ All notable changes to oceanarray are documented here.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.5.1] — 2026-10-23
|
|
10
|
+
|
|
11
|
+
> The units-display entries — *Units tables come from the shared report layer*, *N² keeps the spelling it arrives with*, *Legacy vocabulary files moved and renamed*, and the two *Deprecated* items — landed as direct-to-main commits (`cdcffc9`/`8982831`/`735adaa`, the units display sweep), not a pull request; [#107](https://github.com/ocean-uhh/oceanarray/pull/107) documented the sweep and added the derived-quantity guard. See `.claude/done/ROADMAP.md`.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- **Post-release tidy** ([#105](https://github.com/ocean-uhh/oceanarray/pull/105)): `find_best_dtype` passes `timedelta64` variables through with their native kind instead of miscasting them; the dead `proc_machine` report-context key is removed; the CLI reference page is generated from the argument parser (`sphinx-argparse`); CONTRIBUTING and the README scope line refreshed.
|
|
16
|
+
|
|
17
|
+
- **Vendored report-design layer adopted** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): the report presentation layer moves to `oceanarray/reports/_vendored/`, a directory copied byte-identical from ctdcast `15fa38b` that carries its own `MANIFEST.txt` and self-check (`check.py`). The six scattered vendored files (`config/report_tokens.py`, `config/report.mplstyle`, `reports/_encode.py`, `_css.py`, `_manifest.py`, `templates/_nav.html`), the root `VENDORED.txt`, and `scripts/check_vendored.py` are removed; a new owned `reports/design.py` holds the oceanarray-specific configuration (package accent, QC/sensor predicates, `ATTR_GROUP_EXTRAS`, the per-figure source toggle). `reports/__init__.py` resolves its public names lazily so importing the vendored layer does not pull the page pipeline. No change to the NetCDF outputs or the public API.
|
|
18
|
+
- **NetCDF-inventory tables rendered by the vendored builders** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): the coordinates/variables/scalars/globals tables now come from the shared `nc_tables` builders and `_nc_tables.html` macros. Type labels read `string` rather than `str`, each table carries a `source:` caption, the coordinates table gains a Dims column, and the `history` global attribute is shown once (in its dedicated processing-history panel, excluded from the globals table via the builder's `exclude=`). An all-empty Standard/long-name column drops along with units/min-max/attributes (`optional=` includes `stdname`). The QC-companion marker shows the file's real suffix — `(_qc)` for oceanarray's lowercase QC variables, not a hard-coded `(_QC)` — and is coloured with the shared `--qc-mark` token. The local inventory templates and row builders are removed.
|
|
19
|
+
- **Processing-history panel is now tables** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): the instrument/grid/stack reports render the processing history as a key/value `properties_table` for the header items plus a sortable Time·Event table for the dated entries (a `|`-joined entry splits into same-time rows), replacing the `dl`-style list that wrapped long entries into orphan rows. The Time·Event table carries a leading `#` column — the row's 1-based position in the `history` attribute — so sorting any column never loses the original sequence (events sharing one timestamp would otherwise be unorderable).
|
|
20
|
+
- **Array page map** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): the mooring-position map is the vendored Leaflet `track_map` (a marker per mooring, each carrying a permanent name label in the marker's colour, hover-linked to the mooring list via `data-track-id`, offline bundled assets) behind the `design.ARRAY_MAP_LEAFLET` flag — the interactive map on screen, its matplotlib PNG fallback when printing (never both). The static PNG gains a `source:` caption, a Mercator-square framed extent (a line of moorings no longer renders as a sliver), and family marker colours; the mooring name links to its report and the jump-nav uses the family markup.
|
|
21
|
+
- **Array masthead metadata** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): the array summary masthead gains deployment/recovery and duration, position and mooring extent, water-depth range, an instrument by-type breakdown, deployment status, and processed-to counts — all read or derived from the array/mooring YAMLs at render (a missing value is an em-dash).
|
|
22
|
+
- **base.html de-duplicated against the shared stylesheet** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): report chrome rules that `emit_css()` already provides are removed from the per-page `<style>` block (only the oceanarray-specific additions remain), guarded by `test_no_base_rule_duplicates_vendored_css`.
|
|
23
|
+
- **Absent figure panels say why** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): a figure whose draw raises now renders a short stub with the reason instead of vanishing (`as_panel`, ported from ctdcast).
|
|
24
|
+
- **Coverage floor raised** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)) from 38% to 58%: `main` and this branch both measure 59% unit coverage, so the CI `--cov-fail-under` gate is ratcheted to one point below.
|
|
25
|
+
- **Units tables come from the shared report layer**: the vendored layer is re-copied from ctdcast `f2af1d8`, where `units_display.py` became `units.py` + `units_tables.py` (canonical spellings, accepted aliases with factors, display labels, keyed by CF `standard_name`). `oceanarray.config.unit_tables` holds oceanarray's differences from those tables (N² stored as `s-2`; the `ml l-1`, `mL/L` and `s⁻²` spellings) and `unit_label()`, the display entry point the plotters now call. The storage pass is `processors.units.to_canonical_units`. It accepts the same spellings as before for every registry quantity (N² aside, below), still takes each variable's canonical spelling from `parameters.VARIABLES`, still raises on a missing units attribute, and still records `units_converted_from` / `units_conversion_factor` on a conversion; the dune2 goldens are byte-identical.
|
|
26
|
+
- **Plot-axis units derived from the registry through the pipeline** ([#107](https://github.com/ocean-uhh/oceanarray/pull/107)): `parameters.vunit`/`vlabel` now format each variable's canonical CF `units` through `unit_label` (`degree_Celsius` → `°C`), so every axis/colorbar label is produced by the one display rule; the duplicate `label_units` column is removed from `VARIABLES`. The attitude/engineering variables `pitch`, `roll`, `heading`, `tilt`, `current_direction`, `bin_pressure` are registered (canonical CF `degree`/`dbar`), and the reader spellings `degrees`/`volts` are accepted as aliases of `degree`/`V`; the storage pass rewrites a stored `degrees` to `degree` at factor 1. Rendered labels are unchanged.
|
|
27
|
+
- **Derived-quantity unit guard** ([#107](https://github.com/ocean-uhh/oceanarray/pull/107)): a plot whose output unit is computed from a source variable (displacement in km from velocity, height-above-seabed in m from pressure, instrument spacing in dbar, temperature PSD) warns via `unit_tables.warn_if_not_canonical` when the source variable does not carry the canonical unit the derivation assumes. Silent on every oceanarray-written file (the storage pass guarantees canonical units); it catches a foreign or hand-edited file the derivation would otherwise mislabel.
|
|
28
|
+
- **N² keeps the spelling it arrives with**: `s-2` and `rad2 s-2` are both accepted and neither is rewritten into the other (`rad2 s-2` used to be refused), so N² is the one quantity whose stored spelling can differ between files.
|
|
29
|
+
- **Legacy vocabulary files moved and renamed**: `config/OS1_var_names.yaml`, `config/OS1_sensor_attrs.yaml` and `legacy/OS1_vocab_attrs.yaml` are now `legacy/OS1_variable_names.yaml`, `legacy/OS1_sensor_attributes.yaml` and `legacy/OS1_variable_attributes.yaml`, beside the legacy `convertOS.py` that takes them as inputs. No other oceanarray code reads them; the wheel no longer ships them.
|
|
30
|
+
- **Report figure layout** ([#110](https://github.com/ocean-uhh/oceanarray/pull/110)): a single-tier current rose (one QC tier, no magnetic panel) renders as a third-slot circle centred in whitespace instead of a full-slot-width square; the knockdown-displacement figure reserves left margin for its pressure y-labels so a deep mooring's four-digit dbar labels no longer clip. The unreachable `GRID_COMBINED_HYDRO` grid profile is removed (T-S stays its own section).
|
|
31
|
+
- **`°` accepted as a degree spelling** ([#110](https://github.com/ocean-uhh/oceanarray/pull/110)): the storage pass accepts the `°` symbol as the canonical `degree` (factor 1) for attitude variables. `deg` is not accepted here — it is scoped to latitude/longitude in the vendored unit tables and arrives, scoped, at the next vendored sync.
|
|
32
|
+
- **Report layer re-vendored from ctdcast v0.4.0** ([#111](https://github.com/ocean-uhh/oceanarray/pull/111)): the `degree`/`degrees`/`°` alias moves into the vendored family tables (the duplicate package-side copy is removed; unit resolution is unchanged). The array-map graticule gains edge labels drawn inside the west/south edges, a bottom-right scale bar, and antimeridian handling for basin-scale tracks.
|
|
33
|
+
- **ADCP bin pressures are tilt-corrected for knock-down** ([#112](https://github.com/ocean-uhh/oceanarray/pull/112)): `compute_adcp_bin_pressure` reduces each bin's vertical range by `cos(θ)` (θ = instrument tilt from pitch/roll, `arccos(cos P_true·cos R)`) before converting to pressure, so a knocked-down profiler's bins are placed at their true depth; `bin_pressure` gains `tilt_correction` / `tilt_definition` attributes. When the firmware recorded earth coordinates with bin mapping on (RDI `EX` command), it has already tilt-placed the bins, so the correction is **not** applied (`tilt_correction = "none (firmware bin mapping)"`). Every current UHH deployment is earth + bin-mapping, so stored outputs are unchanged; the correction is exercised only by beam-coordinate input. Stage 1 surfaces `firmware_coordinate_system` / `firmware_bin_mapping` from the raw metadata for the guard.
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- **Readers for files already processed by their originator** ([#108](https://github.com/ocean-uhh/oceanarray/pull/108)): `file_type: oceansites` (OceanSITES 1.3 netCDF, and the OSNAP variant with variables on `TIME`) and `file_type: rodb` (RAPID/BODC `.microcat`, `.edt`, `.lowedt`), in `oceanarray.tools.readers` (`read_oceansites`, `read_rodb`). Variables are renamed to oceanarray names; the originator's QC flags are kept as `<name>_qc_originator`; the originator's metadata as `originator_*` attributes. Velocities are geographic, so Stage 3 applies no rotation and no second magnetic declination (`originator_magnetic_declination`). New instrument class `currentmeter` for a processed point current meter. Tested on trimmed real OSNAP files (WHOI, GEOMAR, Scripps, RODB) in `tests/fixtures/raw/osnap/`.
|
|
38
|
+
- **`units_override`** ([#108](https://github.com/ocean-uhh/oceanarray/pull/108)) per instrument in the mooring YAML corrects a file whose units attribute is wrong; Stage 1 refuses an imported (`oceansites` / `rodb`) instrument whose values fall outside the registry's valid range for the stated units, naming this key.
|
|
39
|
+
- **`stack: false`** ([#108](https://github.com/ocean-uhh/oceanarray/pull/108)) per instrument in the mooring YAML keeps an instrument out of the stack and grid while it is still processed through stages 1-3 and reported (reference data); the stack names it in an `instruments_excluded` attribute. A low-passed file (`originator_low_passed`, e.g. RODB `.lowedt`) reaching the stack without it is omitted with an error naming the key.
|
|
40
|
+
- Unit spellings accepted: `decibar`, `meter/second`, `meter`, `psu` (practical salinity only), and RODB `cm s-1` (converted ×0.01 to `m s-1`).
|
|
41
|
+
|
|
42
|
+
### Deprecated
|
|
43
|
+
|
|
44
|
+
- `oceanarray.processors.units.canonicalise_units` → `to_canonical_units`, and `oceanarray.processors.units.format_units` → `oceanarray.config.unit_tables.unit_label`. The old names warn and are removed in 0.6.0.
|
|
45
|
+
- `oceanarray.parameters.UNIT_ALIASES` and `VARIABLE_UNIT_ALIASES`: the spellings now live in the shared units tables (`oceanarray.config.unit_tables.TABLES`, with `PSU` / `NTU` scoped by CF `standard_name`). Both names still resolve, rebuilt from those tables, with a warning; removed in 0.6.0.
|
|
46
|
+
|
|
47
|
+
### Breaking changes
|
|
48
|
+
|
|
49
|
+
- None. The NetCDF outputs and the public API (`oceanarray` CLI, `from oceanarray.reports import MooringReport`) are unchanged. The report HTML changes (masthead nav, inventory-table layout and type labels, `source:` captions); the committed report goldens are rebaselined to match.
|
|
50
|
+
|
|
9
51
|
## [0.5.0] — 2026-10-12
|
|
10
52
|
|
|
11
53
|
### Added
|
|
@@ -7,8 +7,8 @@ authors:
|
|
|
7
7
|
affiliation: University of Hamburg, Bundesstraße 53, 20146 Hamburg, Germany
|
|
8
8
|
title: oceanarray
|
|
9
9
|
doi: 10.5281/zenodo.21890564
|
|
10
|
-
version: 0.5.
|
|
11
|
-
date-released: 2026-10-
|
|
10
|
+
version: 0.5.1
|
|
11
|
+
date-released: 2026-10-23
|
|
12
12
|
url: https://github.com/ocean-uhh/oceanarray
|
|
13
13
|
repository-code: https://github.com/ocean-uhh/oceanarray
|
|
14
14
|
license: MIT
|
|
@@ -79,7 +79,21 @@ For all other bugs:
|
|
|
79
79
|
- Why it would be useful to other users (not just your specific cruise).
|
|
80
80
|
- Whether you are willing to implement it yourself.
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
### Scope
|
|
83
|
+
|
|
84
|
+
oceanarray **processes moored-array observations**: raw instrument files from a mooring (MicroCATs, RBRs, Nortek and RDI current meters and ADCPs, SBE 16/56, Seapoint, …) → CF-NetCDF at each stage — stage 1 (raw → NetCDF), stage 2 (deployment window, clock), stage 3 (QC, velocity rotation, calibration-dip offsets applied) — then a stack on a common time axis and a grid on pressure levels, each step documented in an HTML report. The OceanSITES export of the stacked and gridded products is the next in-scope step.
|
|
85
|
+
|
|
86
|
+
**Fixed — not open to variation:** the output contract. Variable names, CF standard names and the canonical unit spellings come from one registry (`config/parameters.py`) and are the same in every file the package writes; QC flags follow the QARTOD/OceanSITES vocabulary; every processing parameter is recorded in the output's attributes so a file can be reprocessed from itself. Contributions that change these change every user's files, and are discussed first, as an issue.
|
|
87
|
+
|
|
88
|
+
**Open — alternative methods welcome, as selectable options with the default unchanged:**
|
|
89
|
+
|
|
90
|
+
- **Gridding.** The grid step is where the method choices are made — today linear interpolation in pressure onto a fixed `dp` grid, with σ₀ targets for isopycnal products. Alternatives: a **PCHIP spline**; the **RAPID climatological-gradient interpolation** (`tools/rapid_interp.py`, written but **not yet integrated** into `grid.py`); and bounds handling above the shallowest instrument — **extrapolate to the surface**, clip, or mask. All welcome as named methods the user picks in the config, each recording its name and parameters in the output.
|
|
91
|
+
- **Corrections to individual instruments.** How calibration-dip offsets and other per-instrument corrections (drift, pressure-sensor offset) are applied in stage 3 — constant, linear in time, pre/post weighted — is a method choice; the *derivation* of caldip offsets stays in `caldip`, oceanarray applies its output.
|
|
92
|
+
- **QC tests.** New QARTOD-style tests or thresholds, as long as the flags land in the existing `_qc` companions with their thresholds recorded.
|
|
93
|
+
- **Diagnostic figures and report panels.** New figures are welcome, and the report is meant to let a user choose their own selection of panels per page (a config-driven profile); contributions that make that selection easier are in scope.
|
|
94
|
+
- **Readers.** Instrument readers live in `seasenselib`; oceanarray's stage 1 dispatches on the file type (`config/parameters.INSTRUMENT_FILE_TYPES`) and keeps only a small set of its own legacy readers (`tools/readers.py`: RODB and the old Nortek CSV). A reader for an instrument `seasenselib` does not cover is welcome — but write it in `seasenselib` first and add the file type here; a reader that only oceanarray would ever use can live in `tools/readers.py`. (Where exactly that line is drawn is not written down yet — ask.)
|
|
95
|
+
|
|
96
|
+
**Out of scope, because a sibling owns it:** shipboard CTD processing (`ctdcast`); deriving calibration-dip offsets (`caldip`); glider data (`glidertest`, `seagliderOG1`); transport and AMOC estimates from the gridded products (`AMOCatlas`); general-purpose plotting. Also out: features that need cruise-specific raw data in the repository, heavy new dependencies, or that break the CF-NetCDF contract. If you are unsure whether an idea fits, open an issue describing it rather than deciding alone.
|
|
83
97
|
|
|
84
98
|
---
|
|
85
99
|
|
|
@@ -89,10 +103,10 @@ Keep in mind that oceanarray is designed for reproducible processing of moored a
|
|
|
89
103
|
|
|
90
104
|
| Layer | Modules | Role |
|
|
91
105
|
|-------|---------|------|
|
|
92
|
-
| Tier 1 | `tools/`, `utilities.py` |
|
|
106
|
+
| Tier 1 | `tools/`, `writers/`, `utilities.py`, `inspect.py` | Low-level I/O and pure functions — raw-file readers, the single netCDF writer, dataset inspection |
|
|
93
107
|
| Tier 2 | `processors/stage1.py` … `processors/grid.py` | Processing orchestrators — read, transform, write CF-NetCDF |
|
|
94
108
|
| Tier 3 | `cli.py` | Entry point — argument parsing, subcommand dispatch |
|
|
95
|
-
| — | `plotters/`, `
|
|
109
|
+
| — | `plotters/`, `reports/` | Visualisation and HTML report generation |
|
|
96
110
|
| — | `analysis/` | Science utilities (filtering, isopycnals, QC) |
|
|
97
111
|
| — | `config/` | Parameters, variable registry, YAML validation |
|
|
98
112
|
|
|
@@ -117,7 +131,7 @@ PDF report output (WeasyPrint, which needs native pango/cairo libraries), use
|
|
|
117
131
|
|
|
118
132
|
1. Fork the repository and create a feature branch from `main`.
|
|
119
133
|
2. Make your changes, following the conventions below.
|
|
120
|
-
3. Run `ruff check . --fix` and then `pytest` — all tests must pass.
|
|
134
|
+
3. Run `ruff check . --fix` and `ruff format .`, then `pytest` — all tests must pass. (`ruff format` owns line wrapping, which is why `E501` is ignored in `pyproject.toml`.)
|
|
121
135
|
4. Open a pull request against `main`. Prefix the title with a bracket tag: `[FEAT]`, `[FIX]`, `[REFACTOR]`, `[DOC]`, `[TEST]`, `[CI]`, or `[CLEANUP]`. (PR titles use bracket tags; individual **commit messages** use conventional-commit prefixes — see below.)
|
|
122
136
|
|
|
123
137
|
Keep each pull request to one logical change. A rename PR that also fixes a bug is a PR nobody can review — split them. (This matters most once more than one person is working on the code.)
|
|
@@ -135,8 +149,8 @@ Co-authored-by: Name <email@example.com>
|
|
|
135
149
|
- **Docstrings**: NumPy style on every public function and class. Include `Parameters`, `Returns`, and `Raises` sections. Period at the end.
|
|
136
150
|
- **Type annotations**: all public function arguments and return values.
|
|
137
151
|
- **Lint**: `ruff check .` must be clean. No bare `except:`. No suppressed warnings without a comment explaining why.
|
|
138
|
-
- **Units**:
|
|
139
|
-
- **Plot style**: discrete colorbars (`BoundaryNorm`, ≤ 20 levels)
|
|
152
|
+
- **Units**: every registered variable carries the registry's canonical spelling (`config/parameters.VARIABLES[var]["units"]`), and that spelling is identical in every file the package writes — except N², kept as `s-2` or `rad2 s-2` as it arrives (`config/unit_tables.UNIT_SPELLINGS_KEPT`). The pipeline rewrites known spellings through the shared units tables (`config/unit_tables.TABLES`) and refuses unknown ones. A new spelling is added **with evidence** — a reader that emits it — never from memory: to `config/unit_tables.UNIT_ALIAS_EXTRAS` if only oceanarray's readers emit it, or upstream in ctdcast's vendored `units_tables.py` if it belongs to the family. A mass↔volume conversion is never a scalar alias. Use `gsw` for all seawater property calculations.
|
|
153
|
+
- **Plot style**: discrete colorbars (`BoundaryNorm`, ≤ 20 levels). Report figures are styled at one choke point — `reports/_encode.render_b64` applies the vendored `report.mplstyle` and `reports/_slots.render` draws each figure at its slot width — so a report plotter does not call `plt.style.use` itself.
|
|
140
154
|
- **Data provenance**: store all processing parameters (thresholds, coefficients) in NC output attributes so any file can be reprocessed exactly from itself.
|
|
141
155
|
- **No silent defaults**: never substitute a default, guess, or approximation when the correct value cannot be determined. Raise, or warn loudly and record what was assumed in the output's metadata. A plausible wrong number is worse than an error, because nothing downstream can detect it.
|
|
142
156
|
|
|
@@ -150,7 +164,9 @@ pytest tests/unit -m "not slow and not needs_seasenselib" # without seasenselib
|
|
|
150
164
|
pytest --cov=oceanarray --cov-report=term-missing -q # with coverage
|
|
151
165
|
```
|
|
152
166
|
|
|
153
|
-
New or changed code must have a test. For anything numerical, assert a **value** you can justify independently of the code — `pytest.approx` or `numpy.testing.assert_allclose` against an analytic case, an invariant that must hold for any input, or a cross-check against `gsw` or another implementation — rather than a value produced by running the code (which proves only that the code has not changed). Do not add tests that pass when nothing happened: `assert result is not None` on a function that returns `None` on failure is the shape to avoid.
|
|
167
|
+
New or changed code must have a test. For anything numerical, assert a **value** you can justify independently of the code — `pytest.approx` or `numpy.testing.assert_allclose` against an analytic case, an invariant that must hold for any input, or a cross-check against `gsw` or another implementation — rather than a value produced by running the code (which proves only that the code has not changed). Do not add tests that pass when nothing happened: `assert result is not None` on a function that returns `None` on failure is the shape to avoid.
|
|
168
|
+
|
|
169
|
+
Fixtures are **real instrument data** — the committed `dune2` raw/proc set in `tests/fixtures/`, trimmed down — not synthetic mocks; a new reader path gets a small real file. Report HTML is **golden-tested** (`tests/fixtures/golden/`, rendered and compared by `tests/unit/test_report_golden.py`): a change to the rendered output is re-baselined (`REBASELINE_GOLDEN=1 pytest`) only after a before/after look, never silently, so the intended change *is* the reviewable diff.
|
|
154
170
|
|
|
155
171
|
---
|
|
156
172
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: oceanarray
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.1
|
|
4
4
|
Summary: Multi-stage processing pipeline for moored oceanographic observations: raw instrument files to QC-flagged CF-compliant NetCDF with automated HTML reports.
|
|
5
5
|
Maintainer-email: Eleanor Frajka-Williams <eleanorfrajka@gmail.com>
|
|
6
6
|
License: MIT License
|
|
@@ -63,6 +63,7 @@ Requires-Dist: pytest-cov>=4.1; extra == "test"
|
|
|
63
63
|
Provides-Extra: docs
|
|
64
64
|
Requires-Dist: sphinx>=7.2; extra == "docs"
|
|
65
65
|
Requires-Dist: sphinx-rtd-theme>=2.0; extra == "docs"
|
|
66
|
+
Requires-Dist: sphinx-argparse>=0.4; extra == "docs"
|
|
66
67
|
Requires-Dist: myst-nb>=1.0; extra == "docs"
|
|
67
68
|
Requires-Dist: nbsphinx>=0.9; extra == "docs"
|
|
68
69
|
Requires-Dist: pypandoc>=1.11; extra == "docs"
|
|
@@ -86,6 +87,8 @@ Dynamic: license-file
|
|
|
86
87
|
|
|
87
88
|
Python tools for processing moored oceanographic array observations from raw instrument files to quality-controlled, CF-compliant NetCDF.
|
|
88
89
|
|
|
90
|
+
It covers a single mooring's instruments — stages 1–3, stacking, and pressure gridding, each documented in an HTML report. Deriving calibration-dip offsets is handled by `caldip`, and shipboard CTD processing by `ctdcast`.
|
|
91
|
+
|
|
89
92
|
**Documentation**: https://ocean-uhh.github.io/oceanarray/
|
|
90
93
|
|
|
91
94
|
## Installation
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
|
|
10
10
|
Python tools for processing moored oceanographic array observations from raw instrument files to quality-controlled, CF-compliant NetCDF.
|
|
11
11
|
|
|
12
|
+
It covers a single mooring's instruments — stages 1–3, stacking, and pressure gridding, each documented in an HTML report. Deriving calibration-dip offsets is handled by `caldip`, and shipboard CTD processing by `ctdcast`.
|
|
13
|
+
|
|
12
14
|
**Documentation**: https://ocean-uhh.github.io/oceanarray/
|
|
13
15
|
|
|
14
16
|
## Installation
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
.. _cli_reference:
|
|
2
|
+
|
|
3
|
+
===================
|
|
4
|
+
CLI Reference
|
|
5
|
+
===================
|
|
6
|
+
|
|
7
|
+
The typical workflow is: validate the YAML, run ``oceanarray process`` stage by
|
|
8
|
+
stage (including the ``stack`` and ``grid`` stages), inspect with
|
|
9
|
+
``oceanarray report``, then use ``oceanarray run`` to reproduce the full pipeline
|
|
10
|
+
in one command.
|
|
11
|
+
|
|
12
|
+
All processing subcommands accept a mooring name as the first positional
|
|
13
|
+
argument. The mooring name is used to locate the YAML file at
|
|
14
|
+
``{proc_dir}/{mooring}/{mooring}.mooring.yaml``.
|
|
15
|
+
|
|
16
|
+
Without ``--force``, every subcommand skips any output file that already
|
|
17
|
+
exists. Add ``--force`` to overwrite.
|
|
18
|
+
|
|
19
|
+
The flag lists below are generated from the argument parser
|
|
20
|
+
(:func:`oceanarray.cli.build_parser`), so they cannot drift from the code.
|
|
21
|
+
|
|
22
|
+
----
|
|
23
|
+
|
|
24
|
+
``oceanarray validate``
|
|
25
|
+
------------------------
|
|
26
|
+
|
|
27
|
+
Check one or more YAML configuration files for missing required fields,
|
|
28
|
+
unrecognised values, and structural errors. Does not require ``--raw-dir``
|
|
29
|
+
or ``--proc-dir``. Run this before any processing to catch typos in
|
|
30
|
+
``file_type``, missing ``hab``, or malformed serial numbers.
|
|
31
|
+
|
|
32
|
+
.. argparse::
|
|
33
|
+
:module: oceanarray.cli
|
|
34
|
+
:func: build_parser
|
|
35
|
+
:prog: oceanarray
|
|
36
|
+
:path: validate
|
|
37
|
+
:nodescription:
|
|
38
|
+
|
|
39
|
+
**Example**
|
|
40
|
+
|
|
41
|
+
.. code-block:: bash
|
|
42
|
+
|
|
43
|
+
oceanarray validate /data/proc/dsG3_1_2026/dsG3_1_2026.mooring.yaml
|
|
44
|
+
|
|
45
|
+
Prints errors and warnings to the console. Exits with a non-zero status
|
|
46
|
+
if any errors are found.
|
|
47
|
+
|
|
48
|
+
----
|
|
49
|
+
|
|
50
|
+
``oceanarray init``
|
|
51
|
+
-------------------
|
|
52
|
+
|
|
53
|
+
Create a skeleton mooring YAML file with commented template fields for all
|
|
54
|
+
mandatory metadata and one example entry per instrument type. Edit the file
|
|
55
|
+
to fill in real values and delete unused instrument blocks. Typically run
|
|
56
|
+
once, before ``oceanarray validate``.
|
|
57
|
+
|
|
58
|
+
.. argparse::
|
|
59
|
+
:module: oceanarray.cli
|
|
60
|
+
:func: build_parser
|
|
61
|
+
:prog: oceanarray
|
|
62
|
+
:path: init
|
|
63
|
+
:nodescription:
|
|
64
|
+
|
|
65
|
+
**Example**
|
|
66
|
+
|
|
67
|
+
.. code-block:: bash
|
|
68
|
+
|
|
69
|
+
oceanarray init dsG3_1_2026 --proc-dir /data/proc
|
|
70
|
+
|
|
71
|
+
Creates ``/data/proc/dsG3_1_2026/dsG3_1_2026.mooring.yaml`` (the directory
|
|
72
|
+
is created if it does not exist).
|
|
73
|
+
|
|
74
|
+
----
|
|
75
|
+
|
|
76
|
+
``oceanarray process``
|
|
77
|
+
-----------------------
|
|
78
|
+
|
|
79
|
+
Run one or more per-instrument processing stages. Stage 2 requires that
|
|
80
|
+
stage 1 has already run; stage 3 requires stage 2.
|
|
81
|
+
|
|
82
|
+
The recommended sequence for a new mooring is:
|
|
83
|
+
|
|
84
|
+
1. ``--stage 1``: verify that all raw files are reachable.
|
|
85
|
+
2. ``--stage 2``: check that trimming looks right; adjust
|
|
86
|
+
``deployment_time`` / ``recovery_time`` in the YAML if needed.
|
|
87
|
+
3. ``--stage 3``: apply QC and velocity rotation once stages 1 and 2 are
|
|
88
|
+
confirmed.
|
|
89
|
+
|
|
90
|
+
.. argparse::
|
|
91
|
+
:module: oceanarray.cli
|
|
92
|
+
:func: build_parser
|
|
93
|
+
:prog: oceanarray
|
|
94
|
+
:path: process
|
|
95
|
+
:nodescription:
|
|
96
|
+
|
|
97
|
+
**Stage descriptions**
|
|
98
|
+
|
|
99
|
+
- **Stage 1**: reads raw instrument files via seasenselib and writes
|
|
100
|
+
``{mooring}_{serial}_stage1.nc``. Data are stored as-is — no QC, no
|
|
101
|
+
trimming.
|
|
102
|
+
- **Stage 2**: trims to ``deployment_time`` / ``recovery_time`` from the
|
|
103
|
+
YAML and applies clock drift correction. Writes
|
|
104
|
+
``{mooring}_{serial}_stage2.nc``.
|
|
105
|
+
- **Stage 3**: applies QARTOD gross-range QC flags, derives salinity,
|
|
106
|
+
interpolates pressure for instruments without a pressure port, rotates
|
|
107
|
+
Aquadopp velocities to earth coordinates, and applies magnetic declination
|
|
108
|
+
correction. Writes ``{mooring}_{serial}_stage3.nc``.
|
|
109
|
+
- **stack**: interpolates all instruments onto a common time axis and writes
|
|
110
|
+
``{mooring}_stack.nc``. Instruments sampling faster than ``--dt`` are
|
|
111
|
+
subsampled by nearest-neighbour; slower instruments are interpolated linearly.
|
|
112
|
+
The 60-second default suits most mooring data; for high-frequency analysis
|
|
113
|
+
(e.g. internal waves from fast thermistors) work from the ``_stage3.nc`` files
|
|
114
|
+
or build a finer stack with ``--dt``.
|
|
115
|
+
- **grid**: interpolates the stack onto a regular pressure grid and writes
|
|
116
|
+
``{mooring}_grid.nc``. Values outside the instrument depth range at each time
|
|
117
|
+
step are set to NaN. QC flags from stage 3 are not consulted — data flagged
|
|
118
|
+
suspect or bad are treated the same as good unless already NaN.
|
|
119
|
+
|
|
120
|
+
**Output created**
|
|
121
|
+
|
|
122
|
+
Per-instrument: ``{mooring}_{serial}_stage{N}.nc`` in ``{proc_dir}/{mooring}/{instrument}/``.
|
|
123
|
+
Mooring-level: ``{mooring}_stack.nc`` and ``{mooring}_grid.nc`` in ``{proc_dir}/{mooring}/``.
|
|
124
|
+
|
|
125
|
+
**Examples**
|
|
126
|
+
|
|
127
|
+
Run stage 1 for all instruments:
|
|
128
|
+
|
|
129
|
+
.. code-block:: bash
|
|
130
|
+
|
|
131
|
+
oceanarray process dsG3_1_2026 --raw-dir /data/raw --proc-dir /data/proc --stage 1
|
|
132
|
+
|
|
133
|
+
Rerun stage 2 for a single instrument after updating the YAML:
|
|
134
|
+
|
|
135
|
+
.. code-block:: bash
|
|
136
|
+
|
|
137
|
+
oceanarray process dsG3_1_2026 --raw-dir /data/raw --proc-dir /data/proc --stage 2 --serial 26261 --force
|
|
138
|
+
|
|
139
|
+
Full pipeline — all instrument stages plus stack and grid:
|
|
140
|
+
|
|
141
|
+
.. code-block:: bash
|
|
142
|
+
|
|
143
|
+
oceanarray process dsG3_1_2026 --raw-dir /data/raw --proc-dir /data/proc --stage 1 2 3 stack grid
|
|
144
|
+
|
|
145
|
+
Stack and grid only (after stages 1–3 already ran), non-default grid spacing:
|
|
146
|
+
|
|
147
|
+
.. code-block:: bash
|
|
148
|
+
|
|
149
|
+
oceanarray process dsG3_1_2026 --proc-dir /data/proc --stage stack grid --dp 10 --pmin 100 --pmax 2000
|
|
150
|
+
|
|
151
|
+
----
|
|
152
|
+
|
|
153
|
+
``oceanarray report``
|
|
154
|
+
----------------------
|
|
155
|
+
|
|
156
|
+
Generate HTML reports for a mooring. Without any report-type flags,
|
|
157
|
+
generates only the mooring summary page. See :doc:`reports` for a
|
|
158
|
+
description of what each report page contains.
|
|
159
|
+
|
|
160
|
+
.. argparse::
|
|
161
|
+
:module: oceanarray.cli
|
|
162
|
+
:func: build_parser
|
|
163
|
+
:prog: oceanarray
|
|
164
|
+
:path: report
|
|
165
|
+
:nodescription:
|
|
166
|
+
|
|
167
|
+
**Output created**
|
|
168
|
+
|
|
169
|
+
``{mooring}_report.html`` (always), plus optional
|
|
170
|
+
``{mooring}_stack_report.html``, ``{mooring}_grid_report.html``, and
|
|
171
|
+
``report/instrument/{mooring}_{serial}_report.html``.
|
|
172
|
+
|
|
173
|
+
**Examples**
|
|
174
|
+
|
|
175
|
+
Summary and per-instrument pages:
|
|
176
|
+
|
|
177
|
+
.. code-block:: bash
|
|
178
|
+
|
|
179
|
+
oceanarray report dsG3_1_2026 --raw-dir /data/raw --proc-dir /data/proc --instruments
|
|
180
|
+
|
|
181
|
+
All report types (equivalent to ``--stack --grid --instruments --pdf``):
|
|
182
|
+
|
|
183
|
+
.. code-block:: bash
|
|
184
|
+
|
|
185
|
+
oceanarray report dsG3_1_2026 --raw-dir /data/raw --proc-dir /data/proc --all
|
|
186
|
+
|
|
187
|
+
Array-level index across all moorings:
|
|
188
|
+
|
|
189
|
+
.. code-block:: bash
|
|
190
|
+
|
|
191
|
+
oceanarray report cruise.array.yaml --array --report-dir /data/reports
|
|
192
|
+
|
|
193
|
+
Cruise recovery table:
|
|
194
|
+
|
|
195
|
+
.. code-block:: bash
|
|
196
|
+
|
|
197
|
+
oceanarray report dsG3_1_2026 --raw-dir /data/raw --proc-dir /data/proc --cruise-table
|
|
198
|
+
|
|
199
|
+
----
|
|
200
|
+
|
|
201
|
+
``oceanarray run``
|
|
202
|
+
------------------
|
|
203
|
+
|
|
204
|
+
Run the complete processing pipeline in one command: stages 1, 2, and 3,
|
|
205
|
+
followed by stack, grid, and all report pages. Continues past individual
|
|
206
|
+
instrument failures — check the processing logs in
|
|
207
|
+
``{proc_dir}/{mooring}/processing_logs/`` for details.
|
|
208
|
+
|
|
209
|
+
Use ``oceanarray run`` only after confirming that stage 1 can read all raw
|
|
210
|
+
files and that the ``deployment_time`` / ``recovery_time`` values in the
|
|
211
|
+
YAML produce the correct trim (verified with ``oceanarray process --stage 2``
|
|
212
|
+
and a quick report inspection).
|
|
213
|
+
|
|
214
|
+
.. argparse::
|
|
215
|
+
:module: oceanarray.cli
|
|
216
|
+
:func: build_parser
|
|
217
|
+
:prog: oceanarray
|
|
218
|
+
:path: run
|
|
219
|
+
:nodescription:
|
|
220
|
+
|
|
221
|
+
**Output created**
|
|
222
|
+
|
|
223
|
+
All stage NC files, ``{mooring}_stack.nc``, ``{mooring}_grid.nc``,
|
|
224
|
+
mooring summary report, stack report, grid report, and per-instrument
|
|
225
|
+
reports.
|
|
226
|
+
|
|
227
|
+
**Example**
|
|
228
|
+
|
|
229
|
+
.. code-block:: bash
|
|
230
|
+
|
|
231
|
+
oceanarray run dsG3_1_2026 --raw-dir /data/raw --proc-dir /data/proc --force
|
|
232
|
+
|
|
233
|
+
----
|
|
234
|
+
|
|
235
|
+
``oceanarray list``
|
|
236
|
+
--------------------
|
|
237
|
+
|
|
238
|
+
Print a reference table of allowed ``instrument:`` and ``file_type:`` values
|
|
239
|
+
for mooring YAML configuration. Use this to look up the correct reader name
|
|
240
|
+
for a given instrument type, or to check which ``instrument:`` values are
|
|
241
|
+
recognised.
|
|
242
|
+
|
|
243
|
+
Does not require a mooring name, ``--raw-dir``, or ``--proc-dir``.
|
|
244
|
+
|
|
245
|
+
.. argparse::
|
|
246
|
+
:module: oceanarray.cli
|
|
247
|
+
:func: build_parser
|
|
248
|
+
:prog: oceanarray
|
|
249
|
+
:path: list
|
|
250
|
+
:nodescription:
|
|
251
|
+
|
|
252
|
+
**Example**
|
|
253
|
+
|
|
254
|
+
.. code-block:: bash
|
|
255
|
+
|
|
256
|
+
oceanarray list
|
|
257
|
+
|
|
258
|
+
----
|
|
259
|
+
|
|
260
|
+
Preliminary visualisation commands
|
|
261
|
+
------------------------------------
|
|
262
|
+
|
|
263
|
+
The following commands produce standalone plots and animations. They are
|
|
264
|
+
available for quick inspection but are considered preliminary — the output
|
|
265
|
+
style, variable names, and flag set may change in a future release.
|
|
266
|
+
|
|
267
|
+
``oceanarray plot``
|
|
268
|
+
~~~~~~~~~~~~~~~~~~~~
|
|
269
|
+
|
|
270
|
+
Show an interactive overview plot of processed data, or save it to a file.
|
|
271
|
+
|
|
272
|
+
.. argparse::
|
|
273
|
+
:module: oceanarray.cli
|
|
274
|
+
:func: build_parser
|
|
275
|
+
:prog: oceanarray
|
|
276
|
+
:path: plot
|
|
277
|
+
:nodescription:
|
|
278
|
+
|
|
279
|
+
**Example**
|
|
280
|
+
|
|
281
|
+
.. code-block:: bash
|
|
282
|
+
|
|
283
|
+
oceanarray plot dsG3_1_2026 --proc-dir /data/proc --var_y pressure --var_color temperature --output overview.png
|
|
284
|
+
|
|
285
|
+
----
|
|
286
|
+
|
|
287
|
+
``oceanarray animate``
|
|
288
|
+
~~~~~~~~~~~~~~~~~~~~~~~
|
|
289
|
+
|
|
290
|
+
Generate an animated hodograph (tip of the velocity vector tracing a path
|
|
291
|
+
over time) for Aquadopp or ADCP instruments. Requires ``east_velocity``
|
|
292
|
+
and ``north_velocity`` in the stage 3 output. The ``Pillow`` library must
|
|
293
|
+
be installed for GIF output.
|
|
294
|
+
|
|
295
|
+
.. argparse::
|
|
296
|
+
:module: oceanarray.cli
|
|
297
|
+
:func: build_parser
|
|
298
|
+
:prog: oceanarray
|
|
299
|
+
:path: animate
|
|
300
|
+
:nodescription:
|
|
301
|
+
|
|
302
|
+
**Example**
|
|
303
|
+
|
|
304
|
+
.. code-block:: bash
|
|
305
|
+
|
|
306
|
+
oceanarray animate dsG3_1_2026 --proc-dir /data/proc --serial 400115 -o dsG3_400115_hodograph.gif
|
|
307
|
+
|
|
308
|
+
----
|
|
309
|
+
|
|
310
|
+
Deprecated flags
|
|
311
|
+
----------------
|
|
312
|
+
|
|
313
|
+
``--basedir DIR`` (removed)
|
|
314
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
315
|
+
|
|
316
|
+
The ``--basedir`` flag has been **removed**. Passing it prints a migration
|
|
317
|
+
message naming the replacement and exits without processing. Use
|
|
318
|
+
``--raw-dir`` and ``--proc-dir`` with the mooring-first layout instead.
|
|
319
|
+
|
|
320
|
+
See :doc:`migration` for step-by-step migration instructions.
|
|
@@ -38,6 +38,8 @@ active processing code:
|
|
|
38
38
|
|
|
39
39
|
``convertOS.py``
|
|
40
40
|
OceanSites format conversion from RODB — superseded by the Stage 1–3 pipeline.
|
|
41
|
+
Its YAML inputs live beside it: ``OS1_variable_names.yaml``,
|
|
42
|
+
``OS1_variable_attributes.yaml`` and ``OS1_sensor_attributes.yaml``.
|
|
41
43
|
|
|
42
44
|
``rapid_interp.py`` (top-level)
|
|
43
45
|
RAPID-specific interpolation helpers — not part of the active pipeline.
|
|
@@ -71,8 +71,7 @@ oceanarray/
|
|
|
71
71
|
│ ├── config/ # Configuration
|
|
72
72
|
│ │ ├── parameters.py # Package-level defaults (VARIABLES, QC ranges, style)
|
|
73
73
|
│ │ ├── validation.py # Mooring YAML validation
|
|
74
|
-
│ │ ├──
|
|
75
|
-
│ │ ├── OS1_sensor_attrs.yaml # OceanSITES sensor attributes
|
|
74
|
+
│ │ ├── unit_tables.py # Units: oceanarray's overrides over the shared tables
|
|
76
75
|
│ │ ├── logging.yaml # Logging configuration
|
|
77
76
|
│ │ └── legacy/ # Legacy RAPID/RODB configuration files
|
|
78
77
|
│ │
|
|
@@ -297,6 +297,23 @@ Optional fields
|
|
|
297
297
|
- string
|
|
298
298
|
- Special sentinel value indicating no data file exists yet.
|
|
299
299
|
Processing is skipped; the instrument appears in reports as pending.
|
|
300
|
+
* - ``stack``
|
|
301
|
+
- boolean
|
|
302
|
+
- Set to ``false`` to keep this instrument out of the stack and grid
|
|
303
|
+
while still processing it through Stages 1–3 and its instrument
|
|
304
|
+
report (reference data, e.g. a low-passed RODB ``.lowedt`` file).
|
|
305
|
+
The stack records it in its ``instruments_excluded`` attribute.
|
|
306
|
+
Default ``true``. A low-passed file reaching the stack without it is
|
|
307
|
+
omitted with an error naming this key.
|
|
308
|
+
* - ``units_override``
|
|
309
|
+
- mapping
|
|
310
|
+
- Corrects a file whose ``units`` attribute is wrong, as
|
|
311
|
+
``{variable: units}``, e.g. ``{conductivity: mS/cm}`` for a file that
|
|
312
|
+
labels mS/cm values ``S/m``. Applied in Stage 1 before the units pass;
|
|
313
|
+
the stated value is kept in the variable's ``units_override_from``
|
|
314
|
+
attribute. For ``oceansites`` and ``rodb`` files Stage 1 checks each
|
|
315
|
+
variable's median against the registry's valid range and refuses the
|
|
316
|
+
instrument, naming this key, when the stated units look wrong.
|
|
300
317
|
|
|
301
318
|
Additional fields
|
|
302
319
|
~~~~~~~~~~~~~~~~~
|
|
@@ -349,7 +366,7 @@ Valid values and their descriptions:
|
|
|
349
366
|
- Reader families accepted by ``file_type``
|
|
350
367
|
* - ``microcat``
|
|
351
368
|
- SeaBird SBE37 CTD
|
|
352
|
-
- ``sbe-cnv``, ``sbe-ascii``, ``sbe-hex``
|
|
369
|
+
- ``sbe-cnv``, ``sbe-ascii``, ``sbe-hex``, ``oceansites``, ``rodb``
|
|
353
370
|
* - ``sbe56``
|
|
354
371
|
- SeaBird SBE56 temperature logger
|
|
355
372
|
- ``sbe-cnv``
|
|
@@ -365,6 +382,10 @@ Valid values and their descriptions:
|
|
|
365
382
|
* - ``aquadopp``
|
|
366
383
|
- Nortek Aquadopp current meter
|
|
367
384
|
- ``nortek-raw``, ``nortek-ascii``, ``nortek-csv``
|
|
385
|
+
* - ``currentmeter``
|
|
386
|
+
- Point current meter delivered already processed (e.g. an Aanderaa RCM
|
|
387
|
+
from an OceanSITES or RODB archive)
|
|
388
|
+
- ``oceansites``, ``rodb``
|
|
368
389
|
* - ``ADCP``
|
|
369
390
|
- RDI WorkHorse broadband ADCP
|
|
370
391
|
- ``rdi-raw``
|
|
@@ -417,6 +438,22 @@ Valid ``file_type`` values
|
|
|
417
438
|
- Nortek CSV string-data export
|
|
418
439
|
- Aquadopp (400### series)
|
|
419
440
|
-
|
|
441
|
+
* - ``oceansites``
|
|
442
|
+
- OceanSITES netCDF (oceanarray reader)
|
|
443
|
+
- MicroCAT, current meter
|
|
444
|
+
- A single-instrument time series already processed by its originator:
|
|
445
|
+
OceanSITES 1.3 (variables on ``TIME, DEPTH``) or the OSNAP variant
|
|
446
|
+
(variables on ``TIME``). ``TEMP``, ``PSAL``, ``CNDC``, ``PRES``,
|
|
447
|
+
``UCUR``, ``VCUR``, ``WCUR`` are read; a ``<CODE>_QC`` variable is kept
|
|
448
|
+
as ``<name>_qc_originator``. Velocities are geographic, so Stage 3
|
|
449
|
+
applies no rotation and no magnetic declination.
|
|
450
|
+
* - ``rodb``
|
|
451
|
+
- RODB text (oceanarray reader)
|
|
452
|
+
- MicroCAT, current meter
|
|
453
|
+
- RAPID/BODC ``.microcat``, ``.edt`` and ``.lowedt`` files. Units are
|
|
454
|
+
those documented for each column code (``U``/``V``/``W`` in cm/s,
|
|
455
|
+
converted to m s-1). An ``.edt`` header's ``MagDeviation`` is recorded
|
|
456
|
+
as ``originator_magnetic_declination`` and not applied again.
|
|
420
457
|
* - ``rbr-rsk``
|
|
421
458
|
- RBR Ruskin SQLite
|
|
422
459
|
- RBR Solo, Duet, etc.
|
|
@@ -46,9 +46,9 @@
|
|
|
46
46
|
"ds_list = readers.load_dataset(files)\n",
|
|
47
47
|
"\n",
|
|
48
48
|
"config_dir = Path(\"..\") / \"oceanarray\" / \"config\"\n",
|
|
49
|
-
"var_map_yaml =
|
|
50
|
-
"vocab_yaml =
|
|
51
|
-
"sensor_yaml =
|
|
49
|
+
"var_map_yaml = Path(\"..\") / \"oceanarray\" / \"legacy\" / \"OS1_variable_names.yaml\"\n",
|
|
50
|
+
"vocab_yaml = Path(\"..\") / \"oceanarray\" / \"legacy\" / \"OS1_variable_attributes.yaml\"\n",
|
|
51
|
+
"sensor_yaml = Path(\"..\") / \"oceanarray\" / \"legacy\" / \"OS1_sensor_attributes.yaml\"\n",
|
|
52
52
|
"project_yaml = config_dir / \"project_RAPID.yaml\"\n",
|
|
53
53
|
"\n",
|
|
54
54
|
"ds_list_OS = []\n",
|
|
@@ -323,9 +323,9 @@
|
|
|
323
323
|
"if 0:\n",
|
|
324
324
|
" metadata_txt = data_dir / \"wb1_12_2015_6123.use\"\n",
|
|
325
325
|
" config_dir = Path(\"..\") / \"oceanarray\" / \"config\"\n",
|
|
326
|
-
" var_map_yaml =
|
|
327
|
-
" vocab_yaml =
|
|
328
|
-
" sensor_yaml =
|
|
326
|
+
" var_map_yaml = Path(\"..\") / \"oceanarray\" / \"legacy\" / \"OS1_variable_names.yaml\"\n",
|
|
327
|
+
" vocab_yaml = Path(\"..\") / \"oceanarray\" / \"legacy\" / \"OS1_variable_attributes.yaml\"\n",
|
|
328
|
+
" sensor_yaml = Path(\"..\") / \"oceanarray\" / \"legacy\" / \"OS1_sensor_attributes.yaml\"\n",
|
|
329
329
|
" project_yaml = config_dir / \"project_RAPID.yaml\"\n",
|
|
330
330
|
" ds_OS = convertOS.convert_rodb_to_oceansites(\n",
|
|
331
331
|
" ds_cal,\n",
|