Technical details
Experimental research output for the NASA Space Apps 2026 MODIS/VIIRS challenge, not an official forecast. Do not use it for evacuation or tactical decisions. Numbers below come from MODELLING_LOG.md in the repository (entry numbers in brackets) and the result files it cites.
What it doesDataHarmonizationForecastingVerificationWhat did not helpLimits and next
1. What the system does
Fire watch shows 12-hour spread forecasts for the 76 fires in NASA's FEDS perimeter snapshots of 2 August 2026, with the burning perimeter, a most-likely case and a worst case, hotspots and wind. History is a calendar of satellite fire activity over the lower 48 states from 2000 to 2026, with MODIS made comparable to VIIRS, plus a daily map and an overlay of NASA FIRMS hotspots. A shorter overview, with the field-map features and the Space Apps summary, is on the About page. This page goes deeper on the modelling.
2. Data
| Source | Used for |
|---|---|
| MODIS Terra MOD14A1 and Aqua MYD14A1 (daily, 1 km) | Fire record 2000 on (Aqua from 2002); inputs to harmonization |
| VIIRS S-NPP VNP14A1, NOAA-20 VJ114A1 (LAADS DAAC), and FIRMS hotspots incl. NOAA-21 | Target of harmonization (S-NPP, from 2012-01-19); hotspots at fire start and in the History overlay |
| NASA FEDS perimeters | Fire start state and truth, every 12 h |
| NIFC WFIGS incidents | Names, containment dates (display and scoring only) |
| NOAA HRRR (15-minute wind) | Fire-model weather |
| gridMET | Daily weather for the activity and growth models |
| LANDFIRE LF2025 | Fuels and canopy |
| USGS 3DEP and ETOPO elevation | Terrain |
Formats and the layout of the files the site serves are in docs/DATASETS.md in the repository.
3. Harmonizing MODIS with VIIRS
MODIS (2000 on) and VIIRS (2012 on) see fire differently, so a raw MODIS count is not comparable with a VIIRS count. We built a per-cell model of one question: on a given day, in a 0.1 degree cell (about 10 km), would VIIRS S-NPP have seen fire, given what MODIS Terra and Aqua saw? Inputs are MODIS fire pixels and power, the same for neighbouring cells and the previous and next day, days since fire, month and location. It is a boosted-tree model trained on 2012-2024 overlap years, using only days VIIRS looked at clearly, so cloud is never counted as "no fire" [10].
Held-out years (2013, 2016, 2019, 2022; the model was trained on the other nine) [10]:
| Method | AUC | Brier | Log loss | Expected fire cell-days (observed 183,677) |
|---|---|---|---|---|
| MODIS fire used as-is | 0.739 | 0.001255 | 0.01733 | 235,121 |
| Per-month logistic rescaling | 0.783 | 0.000809 | 0.00543 | 180,007 |
| Boosted-tree harmonization | 0.961 | 0.000709 | 0.00393 | 179,844 |
- The probabilities are calibrated: predicted 0.145 matched an observed rate of 0.142, and 0.963 matched 0.960. A MODIS fire cell-day is a VIIRS fire cell-day only 37% of the time.
- No step at 2012. Harmonized divided by raw MODIS is 0.75 to 0.80 in every year 2003-2013. Nationally the annual total is close to a constant rescaling (about x0.78); the gain is in where and when fire occurred. Raw MODIS overstates VIIRS fire cell-days by about 27%, partly because one large hot MODIS pixel paints several grid cells.
- "Not observed" is not "no fire". Cloud, smoke or a missing pass leave the ground unseen. The History calendar hatches such weeks (clear view of under 35% of the region's land) rather than showing zero.
- Small fires are only a smeared likelihood. For VIIRS-only fires with no MODIS fire in the cell (22,861 cell-days in 2013), the expected count is right (22,625), but only 1.8% of it lands on the actual cells. Totals over regions and months are trustworthy; single-cell maps of these are not.
- Strict refit for experiments. The comparison experiments (below) used a version fitted on 2012-2020 only and applied to 2003-2011, so nothing saw 2021-2024 [12]. The History page uses the all-years fit through 2024.
4. Forecasting
- Spread model. ELMFIRE: Rothermel surface spread, a level-set front, on a 37.5 m grid with LANDFIRE fuels and 3DEP terrain, run for 12 hours from the FEDS perimeter known at 12:00 UTC, with VIIRS hotspots marking the edges still burning [13, 14].
- Weather. HRRR 15-minute wind (10 m wind scaled by 0.87 to 20 ft). Dead fuel moisture is an equilibrium estimate from 2 m temperature and humidity (Simard 1968), with the 10-h and 100-h classes set 1 and 2 points above the 1-h class; live moisture is a constant [2, 23]. These are crude and untuned.
- Calibration. Raw ELMFIRE over-predicts area: on the 12 held-out fires the median forecast area was 2.7 times the observed area [24].
- Most likely case. A growth model decides how much. LightGBM trained on the harmonized 2003-2011 and VIIRS 2012-2019 record predicts next-day new fire cells per event, converted to km2 (45.7 km2 per cell, fitted on 8 fires), and ELMFIRE's arrival-time map is cut at the isochrone that gives that area [24].
- Worst case. The 90th percentile of next-day growth among the 100 most similar past fire-days (size, recent growth, season, location, weather, fuels), with ELMFIRE's footprint cut at that area [25].
- Unsuppressed potential. Firefighting is not modelled. Containment from WFIGS is shown as a label and used to split scores, never as an input [27].
5. Verification
Headline subset: wildfires that were not contained at issue time and match a WFIGS incident, since forecasting unsuppressed spread for fires already contained is not meaningful. Truth is the FEDS perimeter 12 hours later; the issue time is 2 Aug 2026 12:00 UTC. Growth IoU is the overlap between the predicted and the observed new area; "no growth" scores 0 by construction.
| Held-out, 7 uncontained fires (6 with growth) [27] | Growth IoU | Growth recall | Whole IoU | Median area ratio |
|---|---|---|---|---|
| No growth | 0 | 0 | 0.933 | 0 |
| Raw ELMFIRE | 0.104 | 0.52 | 0.744 | 3.7 |
| Most likely (area-constrained) | 0.113 | 0.20 | 0.897 | 0.64 |
| Worst case | 0.109 | 0.48 | 0.761 | 2.7 |
On all 12 held-out fires the worst case recovered about three quarters of raw ELMFIRE's growth recall at about half the false-alarm area (11.4 vs 20.5 km2 per fire) [25]. These fires were frozen before any model was run on them.
Where does it grow? With "how much" removed (every method is given the true growth area), ELMFIRE's arrival order was compared with a plain distance-to-fire buffer on 26 uncontained, incident-matched fires [29]:
| n = 26 fires | AUC | Recall at observed area | Growth IoU |
|---|---|---|---|
| ELMFIRE arrival time | 0.863 | 0.277 | 0.170 |
| Distance buffer | 0.880 | 0.241 | 0.148 |
| Stretched downwind | 0.825 | 0.220 | 0.133 |
ELMFIRE minus buffer: AUC -0.017 (95% CI -0.045 to +0.006), recall +0.037 (-0.018 to +0.085). So the physics shows no demonstrated skill in choosing where beyond proximity to the existing fire. On four development fires (in-sample-ish) it was worse than the buffer.
Caveats. Small samples, one issue date, FEDS edges are uncertain by about 375 m (comparable to the 12 h advance of many fires), many fires are small, and the held-out results are descriptive. In-sample results (the area conversion, development fires) are marked as such in the log.
6. What we tested that did not help
These are findings, not failures to report. Each was tested on development fires first and then on the 12 frozen held-out fires.
- A global spread multiplier. A fitted factor (such as x0.02) improved one case study, but needs wetter fuels and weaker wind to be physically justified, and it was chosen on few fires [3, 7, 8].
- Weather and fuel corrections. Halving the wind and wetting dead fuels by 6 points matched the multiplier in sensitivity tests, but it was not confirmed against stations [7]. A seasonal live-moisture proxy and a wind-factor option helped the development fires (growth IoU 0.066 to 0.093, in-sample) and did not transfer: 0.058 to 0.052 on the held-out fires, 6 worse of 8 [23].
- Self-calibration from the fire's recent progression. One fire, direction signal present but not usable; not adopted [17].
- Learned edge activation and front weighting. Held-out growth IoU 0.058 (control) vs 0.063 (binary) and 0.055 (weighted); five of 12 fires had no edge data, and the differences are within noise [21, 22].
- Burn-scar fuel correction from the harmonized record. No effect: 0.1 degree history cells are too coarse, and excluding those touching the fire leaves scars out of a 12 h reach [26].
- Harmonized history for the growth model. No better than raw MODIS history or VIIRS only (test MAE 0.556, 0.560, 0.571 cells; none beats predicting zero growth) [24]. Not for the tail either: the worst-case pinball loss favoured harmonized by -0.008 against raw, CI -0.026 to +0.003 [25]. Nor for uncontained fire-days only: Spearman 0.404 harmonized, 0.400 raw, differences within noise [28].
- Harmonized history for next-day activity (U-Net). Test AP 0.138 harmonized, 0.139 raw, 0.140 VIIRS only (2021-2024, three seeds) [12]. The harmonized record is still the right thing for the History view, where it removes the sensor step.
7. Limitations and what is next
- US only. Spread is unsuppressed; the models are not calibrated probabilities.
- The held-out evaluation is one issue date and about a dozen fires. The growth model predicts about 0.4 new 10 km cells for almost every fire, so its "most likely" case sits near no growth.
- The harmonization uses the next day's MODIS as a feature, so the History record is retrospective, not real time.
- Next: a perimeter-based fine burn-scar map, more issue dates and fires, station-checked fuel moisture and wind, a calibrated worst case.
Code and notes: github.com/scholar-e/Ignopticon. Full log: MODELLING_LOG.md. Overview: About.
TODO (team): team members and credits.