Sentinel-2 MSI Payload Data Ground Segment Processor

Status: Completed Stack: Python · EOPF CPM 2.8.1 · Zarr · GDAL Lifecycle: ECSS-E-ST-40C Category C

L1B TOA reflectance quicklook

Overview

msi-processor is a generic high-resolution pushbroom multispectral imager (MSI) ground-segment data processor that process downlinked raw Level-0 instrument data into calibrated, geophysically usable products up to Level 2. It is built on the ESA EOPF Core Python Modules (eopf == 2.8.1, Zarr output) and developed under an ECSS-E-ST-40C Rev.1 documentation-first software lifecycle.

Each processing stage is an EOPF EOProcessingUnit: it consumes the previous unit’s product under a named input key, takes Auxiliary Data Files (ADFs) as run inputs, and emits its product under a named output key.

Architecture

flowchart TD
    RAW[/"L0 downlink product"/] -- "l0c" --> L0["l0_decode"]:::done
    L0 -- "l1a" --> RAD["radiometric"]:::done
    RAD -- "rad" --> ENH["enhancement"]:::done
    RAD -. "calibration mode" .-> CAL[/"derived NUC"/]
    ENH -- "enh" --> TOA["toa"]:::done
    TOA -- "l1b" --> COR["coregister"]:::done
    COR -- "cor" --> GEO["georeference"]:::done
    GEO -- "l1c" --> ATM["atmospheric"]:::done
    ATM -- "l2a" --> PRD[/"L2 Zarr products"/]
    ATM -- "l2a" --> PAN["pansharpen — opt, off"]:::done
    PAN -- "pan" --> PRD
    classDef done fill:#1f7a1f,color:#fff,stroke:#0d3d0d,stroke-width:2px;

Implemented (CI-green): foundation layer plus all eight processing units — l0_decode, radiometric (nominal and calibration modes), enhancement (MTF compensation + denoise), toa, coregister, georeference, atmospheric, and optional default-off pansharpen.

Key technical work

Results — Synthetic L0→L1B run

Output of a L0→L1B end-to-end run (l0_decode → radiometric → enhancement → toa, nominal mode): a persisted L1B TOA-reflectance EOPF product from the synthetic raw generator’s open-container Synthetic L0 + cal-DB ADFs.

Band mean (refl.) std SNR (dB)
B02 0.1753 0.0053 30.3
B03 0.1888 0.0066 29.1
B04 0.1911 0.0070 28.7
B08 0.2648 0.0094 29.0
B11 0.0434 0.0017 28.3
B12 0.0535 0.0019 28.8

A second E2E result — L1A bit-identity through l0_decode (L1A′ ≡ L1A, 13/13 bands) — is documented in the generator’s validation pages.

Reproduce: python scripts/run_pipeline.py <store> with phases fetch-store → l0-decode → radiometric → enhancement → toa → stats → report.

Documentation (GitHub Pages)

User documentation

ECSS technical specification & design

ECSS verification, validation & reviews

ECSS management & assurance

← All projects