NASA FIRMS country archives for Morocco. MODIS 2000–2025 and VIIRS Suomi NPP 2012–2025. All 40 files were retrieved from their recorded NASA URLs and their original SHA-256 hashes verified. There are 43,301 original rows and 30,287 eligible detections. Retained scientific version strings are MODIS 6.03 (2000–2022), 61.03 (2023–2025) and VIIRS 2. No NRT files are included. NASA's country subset determines the geographic extent. The original rows, exact UTC times, platform, confidence, FRP, scan/track footprint and file/line provenance are retained separately.
NASA promotes open sharing with source citation and its data-use disclaimer. See country archives, archive availability and FIRMS attribution and disclaimer. This pilot uses the country archive's actual versions, which differ from the current archive portal's Collection 6.1 description.
We measure occupied 5 km equal-area EPSG:6933 cell-day/illumination strata. MODIS raw totals retain Terra and Aqua separately in exported rows. Calibration uses Aqua alone and S-NPP alone to limit changes in platform sampling. Eligible detections have type=0 and MODIS confidence ≥30 or VIIRS nominal/high. These confidence filters have different meanings. Distinct spatial cells count once per UTC day and D/N stratum.
The baseline is unscaled VIIRS occupancy versus Aqua occupancy. The adjusted model fits separate nonnegative through-origin coefficients for day and night from 2013–2018 pairs. A pair requires positive detections by both sensors with median detection times within 90 minutes in the region. Coefficients are local to each region. No previously harmonized input product is corrected again. Raw detection-count disagreement is reported in its own units. Calibration requires at least 20 training pairs per stratum.
Primary metric fixed before evaluation: occupancy MAE. RMSE and signed VIIRS-minus-Aqua bias are also reported. Training is 2013–2018. Primary evaluation is 2019–2022, within MODIS 6.03. Transfer to MODIS 61.03 in 2023–2025 and all monthly and seasonal breakdowns, including matched-month aggregate errors, are in evaluation.json. No best-model selection is performed on these holdouts.
| Region | Method | Pairs | MAE | RMSE | Bias |
|---|---|---|---|---|---|
| morocco | raw_hotspot_counts | 272 | 8.522058823529411 | 21.758027592267695 | 8.147058823529411 |
| morocco | occupancy_baseline | 272 | 2.099264705882353 | 2.9907947006065916 | 1.8860294117647058 |
| morocco | harmonized | 272 | 0.9922237241141235 | 1.4991691715916493 | -0.6974224612423021 |
| rif | raw_hotspot_counts | 156 | 9.60897435897436 | 24.07560207730256 | 9.237179487179487 |
| rif | occupancy_baseline | 156 | 1.2179487179487178 | 1.8116432546313532 | 0.9487179487179487 |
| rif | harmonized | 156 | 0.825034591745513 | 1.1767283320314188 | -0.5650229667200343 |
| atlas | raw_hotspot_counts | 55 | 3.6545454545454548 | 8.471342063902057 | 3.3636363636363638 |
| atlas | occupancy_baseline | 55 | 0.6 | 1.0 | 0.38181818181818183 |
| atlas | harmonized | 55 | 0.7963882618510159 | 0.9923013045416692 | -0.7448389082700595 |
Agreement is conditional on positive paired detection days. Without swath/cloud masks, missing detections cannot identify observed fire-free cells. This selection excludes days detected by only one sensor. Applying coefficients to unpaired days is an extrapolation. A harmonized value is an estimated Aqua-equivalent activity unit. It cannot quantify independent fires or burned hectares. The 400-replicate monthly-block bootstrap quantifies coefficient uncertainty only, not prediction, cloud, geolocation or version-transfer uncertainty. The calendar exposes missing files separately from zero eligible detections. January 2012 and sensor-start months are incomplete. Current/future months are withheld from seasonal comparisons.
Monthly historical medians exclude the selected year and incomplete months, use at least five years, and stay within the selected sensor basis. Ratios are unavailable for zero medians. A 2× median threshold flags unusual historical activity descriptively. MODIS historical observation availability and orbital drift remain unresolved. Propagation simulations are a separate scenario-exploration feature and do not validate this harmonization.
Python 3.11+ with requests and pyproj. Install dependencies locally with python -m pip install --target .calendar-deps requests pyproj.
python scripts/fire_calendar.py fetch --years 2000:2025 python scripts/fire_calendar.py build python scripts/fire_calendar.py verify python -m unittest discover -s tests -p test_fire_calendar.py npm test npm run typecheck npm run build # With FireZone running locally: python scripts/check_calendar_http.py
The server reads prepared files and caches them in memory. File revision checks invalidate that cache after data are rebuilt; reload the page to read the new revision. Requests never download the historical archive. Raw CSV exports include quality-excluded rows and eligibility flags, while the calendar aggregates eligible rows. Region and selected year range apply to both exports.