Skip to content

Add GNSS velocity-field analysis toolbox - #46

Merged
mgovorcin merged 3 commits into
mainfrom
analysis-toolbox
Jul 13, 2026
Merged

mgovorcin merged 3 commits into
mainfrom
analysis-toolbox

Conversation

@mgovorcin

Copy link
Copy Markdown
Contributor

Summary

Lands the standalone GNSS velocity-field analysis toolbox as a clean PR off main (post-#45), separated from the old viewer WIP that shared the unr-grid-viewer-updates branch.

New modules operate on plain numpy/pandas so they compose with the existing gps_sources downloaders:

Module Purpose
trend MLE trend estimation under power-law + white noise (Bos 2013, Williams 2003); annual/semi-annual + step handling
collocation Least-squares collocation velocity interpolation
euler Euler-pole / rigid-plate rotation fitting
gps_imaging Median spatial-structure-function interpolation (GPS imaging)
strain Strain-rate tensor from a velocity field
variability Spatial structure functions / semivariograms
cme Common-mode error estimation
steps / synthetic Step handling and synthetic series generators
validation GNSS-vs-InSAR comparison + scatter/semivariogram plots

Plus supporting additions to analysis, workflows, io, plotting, processing, quality, rates.

Docs

  • docs/analysis-modules.md + geepers_tour and gnss_insar_validation notebooks, wired into the mkdocs nav.
  • Notebooks carry stored outputs (rendered by mkdocs-jupyter without execution) and are excluded from ruff (rendered documentation, pedagogical inline style).

Dependencies

  • Added scipy as a runtime dependency (top-level import in trend, collocation, variability, gps_imaging). It is already resolved in pixi.lock transitively, so the lock is unchanged — avoiding a v6→v7 format bump incompatible with the CI-pinned pixi v0.48.2. CI's non-locked pixi install reconciles the manifest spec.

Validation

  • Tests: 209 passed, 5 skipped.
  • black + ruff (pinned v0.11.13) + all pre-commit hooks pass.
  • Matrix/covariance argument names (A, C, Css, …) allowed via per-file N803 ignores, matching the repo's existing N806 "for math" convention.
  • mypy not run as a gate — it is pytest-only in CI and the local pre-commit mypy hook is broken by a numpy-stub mismatch (unchanged from Add interactive UNR grid web viewer + 0.3 grid data layer #45).

Reconstruction note

unr-grid-viewer-updates branched before #45, so it carried the stale pre-#45 viewer. This PR was rebuilt fresh on current main, bringing only the toolbox code/tests/docs and leaving #45's gps_sources grid data layer untouched (verified the toolbox has no gps_sources coupling).

🤖 Generated with Claude Code

Standalone analysis modules for GNSS velocity fields, operating on plain
numpy/pandas so they compose with the existing gps_sources downloaders:

- trend: MLE trend estimation under power-law + white noise (Bos 2013,
  Williams 2003), with annual/semi-annual terms and step handling
- collocation: least-squares collocation for velocity interpolation
- euler: Euler-pole / rigid-plate rotation fitting
- gps_imaging: median spatial-structure-function interpolation (GPS imaging)
- strain: strain-rate tensor from a velocity field
- variability: spatial structure functions and semivariograms
- cme: common-mode error estimation
- steps / synthetic: step handling and synthetic series generators
- validation: GNSS-vs-InSAR comparison, scatter and semivariogram plots
- supporting additions to analysis, workflows, io, plotting, processing,
  quality, rates

Docs: analysis-modules.md plus geepers_tour and gnss_insar_validation
notebooks, wired into the mkdocs nav.

scipy added as a runtime dependency (already present transitively in
pixi.lock). Notebooks excluded from ruff (rendered documentation).

Tests: 209 passed, 5 skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on  ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

mgovorcin and others added 2 commits July 13, 2026 16:29
setup-pixi runs `pixi install --locked`, so the lock must match the
manifest. Regenerated with pixi 0.48.2 to keep the v6 format (0.72 would
bump to v7, which the CI-pinned 0.48.2 cannot read).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The suite runs with filterwarnings=error; CI's locked pandas/pyproj emit
warnings that newer local versions don't:

- steps.detect_steps_enu: skip empty per-component frames before concat
  (pandas deprecates concatenating empty/all-NA entries)
- pyproj 3.7 raises a numpy "ndim > 0 to scalar" DeprecationWarning on
  single-point Geod/Transformer calls (collocation, euler); add a
  filterwarnings ignore scoped to the pyproj module so it cannot mask
  array-to-scalar bugs in our own code

Verified in the CI-matched pixi test env: 209 passed, 5 skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@mgovorcin
mgovorcin merged commit bd042a3 into main Jul 13, 2026
6 checks passed
@mgovorcin
mgovorcin deleted the analysis-toolbox branch July 13, 2026 23:42
mgovorcin added a commit that referenced this pull request Jul 13, 2026
Bring the analysis-toolbox documentation authored alongside the code but
not included in #46:

- how-to-guides.md: validate vs GPS, network screening, velocity
  uncertainty, interpolation, plate-boundary-constrained interpolation
  (resolves the dead anchor links from analysis-modules.md)
- background-theory.md: theory for the trend / collocation / euler methods
- tutorials.md, getting-started.md, index.md: toolbox coverage + polish
- fix a malformed mkdocstrings link in getting-started.md

All pages already exist in the mkdocs nav, so this is a content update.
mkdocs build is clean (no unresolved links).

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant