| .gitignore | ||
| .python-version | ||
| 1-phenocam.py | ||
| 2-phenocam-screening.py | ||
| 3-sentinel-data.py | ||
| 4-fusion.py | ||
| 5-metrics.py | ||
| common.js | ||
| fix-tile-boundary.py | ||
| index.html | ||
| LICENSE | ||
| pyproject.toml | ||
| README.md | ||
| uv.lock | ||
EFAST fusion with phenocam validation.
End-to-end pipeline from selecting sites from the global PhenoCam Network to run EFAST spatio-temporal fusion with Sentinel-2 / Sentinel-3 and validate GCCs accross sensors. The five numbered steps cover site selection, Sentinel data acquisition, different fusion orders, and accuracy metrics, all feeding a static web QA viewer.
Pipeline overview
| Step | Script | What it does |
|---|---|---|
| 1 | 1-phenocam.py |
Download PhenoCam metadata and one_day_summary GCC CSVs |
| 2 | 2-phenocam-screening.py |
Apply PhenoCam count, SNR, and proximity gates to select feasible sites |
| 3 | 3-sentinel-data.py |
Acquire S2 (Earth Search COG) and S3 OLCI SYN L2 (CDSE OpenEO); prepare REFL, DIST_CLOUD, and composite GeoTIFFs |
| 4 | 4-fusion.py |
Run EFAST BtI (fuse reflectance → GCC) and ItB (fuse GCC directly) for each screened site |
| 5 | 5-metrics.py |
Extract PhenoCam-matched timeseries, compute NSE/RMSE/r baselines and fusion metrics, emit per-site JSON and webapp manifest |
Quick start
uv sync
uv run python 1-phenocam.py --evaluation-year 2025
uv run python 2-phenocam-screening.py --evaluation-year 2025
uv run python 3-sentinel-data.py --evaluation-year 2025
uv run python 4-fusion.py --evaluation-year 2025
uv run python 5-metrics.py --evaluation-year 2025
All steps accept --evaluation-year (default 2025) and --site (optional, for single-site runs). Steps 3–5 are resumable — existing output files are skipped.
# single site
uv run python 3-sentinel-data.py --evaluation-year 2025 --site ICOSFR-Fon1
uv run python 4-fusion.py --evaluation-year 2025 --site ICOSFR-Fon1
uv run python 5-metrics.py --evaluation-year 2025 --site ICOSFR-Fon1
Credentials
Step 3 S3 download uses CDSE OpenEO (SENTINEL3_SYN_L2_SYN). Set CDSE_USER and CDSE_PASSWORD in ../.env at the workspace root. S2 uses AWS Earth Search COG range reads (no auth required).
Outputs (under data/)
| Artifact | Step | Role |
|---|---|---|
phenocam/{year}.json |
1 | Site list + sites_dir pointer |
phenocam/{year}/{site}.json, {site}_1day.csv |
1 | Raw API payload and GCC CSV |
phenocam_screening/{year}.json / .csv |
2 | Gate results (pass/fail per site) |
sentinel_data/{year}/{site}/prepared/s2/ |
3 | S2 REFL + DIST_CLOUD GeoTIFFs |
sentinel_data/{year}/{site}/prepared/s3/ |
3 | S3 composite GeoTIFFs |
fusion/{year}/{site}/bti/, .../itb/ |
4 | BtI fused reflectance + GCC; ItB fused GCC |
metrics/{year}/{site}/ |
5 | Per-site timeseries, metrics, covariates JSON |
metrics/manifest.json |
5 | Webapp manifest (years + site metadata) |
Web viewer
python3 -m http.server 8080 runs the webapp on http://localhost:8000/index.html. Requires step 5 output (data/metrics/manifest.json).