Skip to main content

Canonical spectral response definitions, ingest tooling, and QA workflows for optical satellite sensors.

Project description

RSRF

rsrfs

RSRF is a repository-backed Python toolkit and curated data repository for canonical optical sensor spectral response definitions.

It keeps the pieces that usually drift apart in one place:

  • a read API for sampled response curves and metadata-only band specs
  • a CLI for inspection, validation, and registry operations
  • manifest-driven ingest and provenance tracking for official upstream artifacts
  • checked-in canonical outputs, QA assets, and documentation visualizations

The distribution name is RSRF. The import package is rsrf.

Documentation: https://marcyin.github.io/spectral_response/

Interactive visualization: https://marcyin.github.io/spectral_response/visualizations/

What Lives In This Repository

  • canonical sampled curves under data/canonical/sampled_curve/
  • canonical metadata-only band specs under data/canonical/band_spec/
  • parquet registries under data/registry/
  • raw, extracted, and manifest-tracked source artifacts under sources/
  • Python package code under src/rsrf/
  • MkDocs content and browser visualization assets under docs/

The current repository includes both multispectral and hyperspectral coverage, including Sentinel-2, Sentinel-3 OLCI and SLSTR, Landsat, MODIS, VIIRS, ASTER, PlanetScope, SkySat, PROBA-V, PRISMA, EMIT, EnMAP, PACE OCI, Pleiades, FORMOSAT-5, Amazonia-1, and CBERS-4A families.

Installation

For repository development:

python3 -m pip install -e ".[dev]"

For a minimal install from a checkout:

python3 -m pip install .

Optional extras are split by workflow:

  • .[ingest] for HDF5, NetCDF, and xarray-based source parsers
  • .[qa] for validation plots
  • .[docs] for MkDocs site builds
  • .[release] for packaging checks
  • .[lint] for ruff-based code quality checks

The .[dev] extra composes all of the above.

Repository-Backed Data Access

The Python package does not bundle the full canonical repository, raw sources, or parquet registries. Point RSRF at a repository checkout or generated data root with one of these patterns:

  • run commands from the repository root
  • pass --root /path/to/repo
  • set RSRF_ROOT=/path/to/repo

If neither is supplied, RSRF searches upward from the current working directory for a repository root.

Quick Start

From a repository checkout:

python3 -m rsrf --help
export RSRF_ROOT="$PWD"
rsrf show-layout
rsrf list-sensors
rsrf list-bands sentinel-2c_msi --variant band_average
rsrf show-response sentinel-2c_msi B03 --variant band_average
rsrf show-metadata prisma_hsi --variant metadata_band_spec
rsrf validate-sensor sentinel-2c_msi --variant band_average

From Python:

from pathlib import Path

from rsrf import get_metadata, list_sensors, load_response_definition

root = Path(".")
sensors = list_sensors(root=root)
metadata = get_metadata("sentinel-2c_msi", "band_average", root=root)
response = load_response_definition("sentinel-2c_msi", "B03", "band_average", root=root)

load_response_definition() returns either a SampledCurve or a BandSpec, depending on the representation variant.

For runtime custom inputs, use coerce_response_definition() with either sampled points (wavelength_nm + response, or wavelength + relative_spectral_response), a band spec (center_wavelength_nm + fwhm_nm), or a zero-argument callable returning one of those forms. Downstream helpers realize center+FWHM inputs as Gaussian curves when they need sampled responses.

Manifest And Registry Workflows

Manifest-aware commands accept either explicit paths or checked-in manifest filenames from the manifest library. From the repository root, these work without the full manifest path:

rsrf validate-manifest rsrf_source_manifest_sentinel2c_v2.json
rsrf show-registry-rows rsrf_source_manifest_prisma_hsi_v2.json
rsrf register-manifest rsrf_source_manifest_prisma_hsi_v2.json

Planning catalog support is exposed separately:

rsrf list-planned-sensors
rsrf register-planned-sensors

Checked-in manifests live under sources/manifests/official/, planning catalogs under sources/manifests/planning/, and templates under sources/manifests/templates/.

Data Model

RSRF currently works with two canonical representation types:

  • sampled_curve: full spectral response samples stored in curves.parquet
  • band_spec: metadata-only band definitions stored in band_specs.parquet

Each sensor representation also carries a metadata.json sidecar, and sampled-curve variants can include trusted overlay references at:

sources/extracted/<sensor_unit_id>/<representation_variant>/overlay_reference.csv

When only metadata-level band specs are available, RSRF can realize approximate sampled curves for QA and visualization workflows.

Repository Structure

.
|-- data/
|   |-- canonical/
|   |-- common_grid/
|   |-- realized/
|   `-- registry/
|-- docs/
|-- plans/
|-- scripts/
|   |-- build/
|   |-- ingest/
|   `-- validate/
|-- sources/
|   |-- extracted/
|   |-- manifests/
|   |   |-- official/
|   |   |-- planning/
|   |   `-- templates/
|   `-- raw/
|-- src/rsrf/
|   |-- commands/
|   `-- parsers/
`-- tests/

Useful code entry points:

  • src/rsrf/api.py for read-side access to canonical sensor definitions
  • src/rsrf/commands/ for CLI parser, dispatch, and output helpers
  • src/rsrf/ingest.py for canonical artifact writing and registry updates
  • src/rsrf/manifests.py for manifest library lookup and path resolution
  • src/rsrf/planning.py for registry-first planning catalog support
  • src/rsrf/qa.py for validation reports and plot export
  • src/rsrf/registry.py for repository layout and parquet registry helpers
  • src/rsrf/visualization.py and src/rsrf/docs_site.py for docs visualization asset export and site preparation

Documentation

Project documentation is built with MkDocs and published at https://marcyin.github.io/spectral_response/.

Key entry points:

To refresh the generated docs site files and versioned visualization bundles:

python3 scripts/build/prepare_docs_site.py --root .

This refreshes docs/assets/visualization/, renders docs/visualizations.md from its template, and syncs the versioned JS and CSS bundles referenced by mkdocs.yml.

Development

Run the local verification stack with:

ruff check src/ tests/ scripts/
ruff format --check src/ tests/ scripts/
python3 -m unittest discover -s tests/unit
python3 -m unittest discover -s tests/regression
python3 scripts/build/prepare_docs_site.py --root .
python3 -m build
python3 -m twine check dist/*
mkdocs build --strict

Project Status

Active design and implementation history lives under plans/, including:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rsrf-0.2.0.tar.gz (91.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rsrf-0.2.0-py3-none-any.whl (74.2 kB view details)

Uploaded Python 3

File details

Details for the file rsrf-0.2.0.tar.gz.

File metadata

  • Download URL: rsrf-0.2.0.tar.gz
  • Upload date:
  • Size: 91.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rsrf-0.2.0.tar.gz
Algorithm Hash digest
SHA256 83ba5d5b0cd593cb319e462384a593393288f3d79f41784b1384368abd275094
MD5 03477c06cc0181ae124d2227ec9f3e75
BLAKE2b-256 4874b27148c0e4ce87fbf704a05c72e7bd4a4c1f34f0ca8609788481b34798ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for rsrf-0.2.0.tar.gz:

Publisher: release-package.yml on MarcYin/spectral_response

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rsrf-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: rsrf-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 74.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rsrf-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ee011860ac7c03a0b7d9e0cc47455440c828f22fe9efa02b79841366ae269c35
MD5 794051bb798bee6c5c312227ac314d8d
BLAKE2b-256 33af19d2b817bb1b35cce21273c5b3f1ed468ddd9735e3a537b765f6872585d3

See more details on using hashes here.

Provenance

The following attestation bundles were made for rsrf-0.2.0-py3-none-any.whl:

Publisher: release-package.yml on MarcYin/spectral_response

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page