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.

For whole-sensor interchange, use get_sensor_definition() for registry sensors and coerce_sensor_definition() or load_sensor_definition() for custom payloads. These APIs normalize canonical and user-supplied sensors into the same versioned SensorDefinition contract with per-band response_definition payloads and namespaced extensions.

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.3.0.tar.gz (100.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.3.0-py3-none-any.whl (79.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: rsrf-0.3.0.tar.gz
  • Upload date:
  • Size: 100.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.3.0.tar.gz
Algorithm Hash digest
SHA256 2466a002186ed7855ef39738816f219abe7f7d627664b99dd10c124e3bedc038
MD5 8b189cfe73a8a98764a932af20af4f86
BLAKE2b-256 c98c80f4da4969e3fe97c32b57ec5fd1d33aeb5d10af41e7db7aa00fe964d580

See more details on using hashes here.

Provenance

The following attestation bundles were made for rsrf-0.3.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.3.0-py3-none-any.whl.

File metadata

  • Download URL: rsrf-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 79.9 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.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 07cf1ee834b16e31126bf9857ee2101dabbbdff2ce2f220322b36eb2a42537df
MD5 87726b0b37c3ced8ef02186693aee1db
BLAKE2b-256 145d1a63cd6925bff8e2356fc2a4207b75e6d97f563475f2d05776ea16a6895c

See more details on using hashes here.

Provenance

The following attestation bundles were made for rsrf-0.3.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