Data sources
- NASA FIRMS active fires: MODIS Collection 6.1 (Terra from Nov 2000, Aqua from Jul 2002, 1 km) and VIIRS 375 m (Suomi NPP from Jan 2012, NOAA-20 from 2018, NOAA-21 from 2024). Science-quality archives are used where available, near-real-time for recent months.
- NASA POWER daily temperature, humidity, wind and corrected precipitation at every region centroid, 2000 to today, topped up with Open-Meteo analysis for the last days.
- Open-Meteo 7-day forecasts for the short-term risk.
- Vegetation (NDVI): MODIS MOD13 via the ORNL DAAC service when enabled; otherwise a seasonal climatology, which the app labels as such.
- Administrative units: Azerbaijan's 66 districts and 12 cities, plus the provinces of Georgia and Armenia. The unit list follows geoBoundaries; the borders come from OpenStreetMap, the same data the basemap draws.
This public demo runs on a synthetic fire world driven by the real NASA POWER weather, because the FIRMS archive needs a personal MAP_KEY. The generator simulates true fires first, then observes them through each sensor's detection physics (pixel size, fire size, cloud cover, satellite launch dates). Because it also records what S-NPP would have seen before 2012, it gives us something the real world can't: a hidden ground truth to test harmonization against.
Quality control
Detections with low confidence (MODIS < 30, VIIRS “low”) are dropped. Only FIRMS type 0 (presumed vegetation fire) is kept. Near-real-time products carry no type flag, so persistent static heat sources such as the Absheron and Sangachal gas flares are found empirically: a ~1 km cell that is hot in more than 20% of all months is excluded.
Harmonization
The reference scale is the single-satellite VIIRS S-NPP record: consistent from 2012, and the scale every later sensor can be tied to. For each district and season (winter, spring, summer, autumn), weekly MODIS counts are paired with S-NPP counts over the overlap years.
- Two-part model. Weeks with MODIS detections are mapped with an empirical quantile mapping
T(x) = F_viirs⁻¹(F_modis(x)), fitted on fire weeks only. Weeks MODIS saw as empty go to a logistic zero-inflation model that estimates how much VIIRS-scale activity such a week typically holds, from the season and the activity in neighbouring weeks and in the country. - Conditional bias correction. Quantile mapping preserves distributions but, with noisy pairs, under-maps small weeks. A factor per MODIS-size bin,
E[y|bin] / E[T(x)|bin], makes sums of weeks unbiased. - Hierarchical fallback. Districts with too few fire weeks borrow the pooled country map for that season.
- Eras. Before Aqua (Jul 2002) only Terra flew, so that era gets its own map, fitted on Terra-only counts.
From 2012 the harmonized record is the S-NPP record. Calibration never reconstructs individual fires MODIS missed. It estimates how much activity there was, with an honest interval.
Uncertainty
Uncertainty comes from a predictive block bootstrap (200 replicates). Overlap years are resampled with replacement (years as blocks, to keep within-year dependence), every map is refitted, and each replicate draws observation noise: multiplicative residuals from the same MODIS-size bin, Bernoulli × empirical magnitude for empty weeks, and a shared year effect per district and year, because errors within a year do not cancel. Intervals for any aggregate (annual totals, countries, seasons) are percentiles of summed replicate draws, never sums of weekly bounds.
Validation
Leave-one-year-out. Each overlap year in turn is removed from calibration, its MODIS weeks are harmonized, and the result is compared with what S-NPP actually recorded. Over 14 held-out years, the harmonized totals are off by +1.3% overall, where raw MODIS undercounts by −75%. Annual 90% intervals contain the truth 88% of the time (weekly: 94%).
Synthetic ground truth. In the synthetic world, the harmonized 2001–2011 record recovers the hidden S-NPP counterfactual with — bias.
Bias
+1.3%
Raw MODIS
−75%
Annual coverage
88%
Rank corr.
0.94
Fire calendar
- Climatology: for every calendar week, the mean, median and 10/25/75/90th percentiles over all complete years.
- Season on a circular year that starts at the quietest four weeks, so seasons crossing New Year still work. Onset is the week 10% of the annual activity has occurred, end is 90%.
- Critical windows: contiguous weeks above the 75th percentile of the smoothed climatology, ranked by their share of annual activity. Peaks come from prominence-based peak finding, which also tells us when a region has two seasons (spring field burning and summer stubble burning).
- Unusual years: robust z-scores (median/MAD) of annual total, peak intensity, onset and end. A year is flagged only if it is both statistically unusual (|z| ≥ 2) and practically so (at least 1.5× or ≤ 1/1.5× the median, or a shift of 2 or more weeks).
Risk model
Target. Will harmonized activity in the next 7 days exceed the 75th percentile of what is normal for this district and week? Features include recent activity (7–90 days) and anomalies, climatology, observed weather (dry spell, VPD, wind, rain over 7 and 30 days), the 7-day forecast, vegetation, season and terrain. Training uses the observed weather as a perfect-prognosis forecast, and inference uses Open-Meteo.
Model. A LightGBM classifier and a Tweedie regressor for expected counts. Probabilities are cross-fit calibrated with isotonic regression on out-of-fold predictions grouped by year, so one unusual year can't distort the calibration. Explanations are exact TreeSHAP contributions, grouped into named drivers.
Evaluation uses rolling-origin cross-validation: train on every year before Y, then test on Y, for the last six years. Against a climatology baseline, ODLAR reaches ROC-AUC 0.86 (climatology 0.72) and a Brier skill of 0.19. The same model trained on the raw, unharmonized record scores a Brier skill of 0.10: the sensor jump teaches it the wrong baseline. Harmonization is what makes the AI usable.
Season outlook. Quantile LightGBM (10th, 50th and 90th percentiles) for the next 13 weeks of activity, compared against the climatological range.
| Harmonized | Raw | Climatology | |
|---|---|---|---|
| ROC-AUC | 0.86 | 0.86 | 0.72 |
| PR-AUC | 0.41 | 0.41 | 0.15 |
| Brier skill | 0.19 | 0.10 | 0 |
Feature importance (gain)
- Climatology of the coming week20%
- Activity, last 14 days17%
- Activity, last 7 days13%
- Threshold (75th percentile)8%
- Days since last fire6%
- Forecast precipitation5%
- Forecast min humidity4%
- 7-day anomaly3%
- Activity, last 30 days3%
- Forecast dry days2%
Limitations
- Detection counts are not burned area; a large fire produces many pixels.
- The calibration assumes the relationship between MODIS and VIIRS during 2012 onward also held before. Leave-one-year-out shows how well this holds, but conditions that never occurred in the overlap are extrapolated.
- Small districts have few fire weeks and lean on the country-level map; their intervals are wider.
- Without an Earthdata/ORNL NDVI pull, vegetation is a seasonal climatology.
- Alerts are a working prototype (in-app and email). SMS and push delivery are design-only.
After Suomi NPP
S-NPP retires in November 2026. NOAA-20 and NOAA-21 carry the same VIIRS instrument; the pipeline maps each to the S-NPP scale over their own overlap with S-NPP, using the same machinery, so the unified record continues without a new seam.
System
Python (pandas, GeoPandas, SciPy, scikit-learn, LightGBM) for the pipeline, FastAPI for analytics, Laravel with PostgreSQL/PostGIS for users, regions, subscriptions and alerts, and Next.js + MapLibre for this interface. The full pipeline, from raw detections to models, runs in about eight minutes and is covered by property-based and ground-truth tests.