Scientific Methodology

Flagstaff Wildfire Detection System v2.0 — NAU Wildfire Detection Team
Northern Arizona (Flagstaff area) Wildfire Monitoring
Last updated: April 2026

1. System Overview

This is a near-real-time wildfire detection system designed for monitoring the Northern Arizona (Flagstaff area) region. The system ingests publicly available satellite data from multiple sensors, applies a blockwise probabilistic fusion pipeline, and produces fire alerts with calibrated confidence scores, bootstrap confidence intervals, and quantified location uncertainty. The design philosophy is Bayesian log-odds fusion: every processing module contributes continuous log-likelihood ratios (LLRs) rather than binary decisions, and the only threshold in the entire system is at the final GeoJSON export stage.

The architecture distinguishes three kinds of processing blocks:

Satellite Data (GOES-West, GOES-East, VIIRS/MODIS) PER-FRAME PROCESSING Cloud Quality Block SZA Quality Block q_cloud ∈ [0,1] q_SZA ∈ [0,1] RF Pixel Scorer Persistence Pattern ℓ_RF (LLR) ℓ_persist (LLR) Spatiotemporal Data Cube (rolling 6h window) Trajectory Analysis ℓ_traj (LLR, residualized) Cross-Satellite (GOES-East) ℓ_GK2A (LLR) Fusion Engine (Anchored Logistic Combiner) η = ℓ_prior + q_cloud · q_SZA · (ℓ_RF + ℓ_persist + ℓ_cloud) + β_traj · ℓ_traj + β_xsat · ℓ_GK2A + γ · ℓ_pix · ℓ_traj P(fire) = sigmoid(η) Event Management (DBSCAN clustering, provenance tracking) Output: Portal, GeoJSON, Daily Reports P(fire), [p_lo, p_hi] confidence interval ℓ_prior (green) Quality Evidence Fusion

The system ingests satellite data from GOES-West ABI (geostationary, 10-minute cadence), GOES-East ABI (geostationary cross-check), and VIIRS/MODIS (polar-orbiting, via DEA Hotspots and NASA FIRMS). Each frame is processed through quality and evidence blocks in parallel. Results accumulate in a spatiotemporal data cube (rolling 6-hour window), which feeds trajectory analysis for temporal pattern discrimination. All log-likelihood ratios are combined in a single fusion equation that produces a calibrated fire probability $P(\text{fire})$ with bootstrap confidence intervals $[p_{lo}, p_{hi}]$. There are no hard thresholds anywhere in the pipeline — the only decision boundary is at GeoJSON export, where the operational false-positive rate determines the export cutoff.

Key design principle: Quality blocks dampen trust in evidence when conditions are poor (clouds, high solar zenith angle), but they never veto a detection outright. Evidence blocks contribute fire probability in log-odds space, where contributions are additive and naturally handle correlated information. The fusion engine anchors everything to a learned prior, producing calibrated probabilities with honest uncertainty bounds rather than ad hoc confidence levels.

2. Data Sources & Ingestion

2.1 GOES-West ABI (Advanced Baseline Imager)

GOES-18 (GOES-West) is a geostationary meteorological satellite operated by NOAA, positioned at 137.2°W longitude. Its Advanced Baseline Imager (ABI) provides full-disk observations every 10 minutes, making it the primary data source for continuous fire monitoring over Northern Arizona.

ParameterValueNotes
OrbitGeostationary (137.2°W)Continuous view of western North America
Temporal resolution10 minutes (full disk) / 5 min CONUSKey advantage over LEO sensors
Band 7 (MIR)3.9 μm, 2 km nadirPrimary fire detection band
Band 14 (TIR)11.2 μm, 2 km nadirBackground temperature & cloud detection
NAZ pixel size~2.0–2.5 kmNear-nadir viewing at NAZ latitudes
Data formatNetCDF (GOES-R Series)Standard GOES-R product format
Data sourceAWS NODD (noaa-goes18)SNS/SQS push notification
Typical latency5–10 minutesObservation to S3 availability
Resolution impact on fire detection: At Northern Arizona viewing angles (near-nadir), ABI pixels are approximately 3.0–3.5 km across. A typical grass fire of 500 m² occupies only ~0.005% of a pixel, producing a brightness temperature anomaly of approximately 12.7 K in the 3.9 μm band (Band 7) — roughly 85× more diluted than the same fire observed by VIIRS at 375 m resolution.[1]

2.2 VIIRS & MODIS (via DEA Hotspots and FIRMS)

The Visible Infrared Imaging Radiometer Suite (VIIRS) and Moderate Resolution Imaging Spectroradiometer (MODIS) are polar-orbiting sensors that provide high-spatial-resolution fire detections. We ingest pre-processed active fire products from two operational services:

SourceSensorsResolutionLatency
DEA Hotspots VIIRS (NOAA-20, NOAA-21, Suomi NPP), MODIS (Terra, Aqua) 375 m (VIIRS I-band), 1000 m (MODIS) ~17 minutes (WFS)
NASA FIRMS VIIRS (NOAA-20, NOAA-21, Suomi NPP), MODIS, Landsat 375 m (VIIRS I-band), 1000 m (MODIS) ~3 hours (NRT for CONUS)

VIIRS detections from DEA Hotspots are the primary confirmation mechanism. When a VIIRS detection spatially matches an existing GOES event, it provides independent corroboration at much higher spatial resolution, significantly tightening the location uncertainty estimate.

2.3 LEO Overpass Tracking (TLE-Based)

DEA Hotspots and FIRMS are databases of positive detections. They tell us when a satellite saw a fire, but they are silent about the much more common case: a LEO satellite flew over an active event and saw nothing. This matters for Bayesian closure (Section 8) — a high-quality "satellite saw nothing" observation is strong evidence that an event has cooled off, and ignoring it delays CLOSED status for fires that have already been extinguished.

LEO negative evidence is recorded by two complementary layers:

SatelliteInstrumentSwathNegative LLR in closure
Suomi NPP, NOAA-20, NOAA-21VIIRS (375 m I-band)3060 km–1.5
Terra, AquaMODIS (1 km)2330 km–1.0
Sentinel-3A, Sentinel-3BSLSTR (1 km, dual-view)1400 km–0.8
Sentinel-2A, Sentinel-2BMSI (20 m SWIR)290 km–2.0

Landsat 8/9 are tracked in the analyst view but are intentionally excluded from the closure scanner catalog: Landsat's narrow 185 km swath gives inconsistent NSW coverage, and the TIRS instrument currently has no calibrated negative LLR in the closure evidence table — using the VIIRS fallback would over-weight Landsat non-detections. Re-adding Landsat requires calibrated leo_negative_llr values in src/leo_evidence.py.

The TLE-driven path uses the standard cross-track distance formula against each great-circle segment between consecutive sub-satellite points, not a naive point-to-sub-point disk test. At LEO orbital speed (~7 km·s−1) a satellite moves ~210 km along-track between 30 s samples, so a disk test would produce false negatives for narrow-swath instruments whose half-swath is smaller than the along-track sample spacing (e.g. Landsat TIRS at 92.5 km half-swath). The scanner also emits one observation per distinct pass via an entry/exit state machine: a delayed polling cycle covering several real passes yields one entry per pass, not just the closest.

Dedup across the two layers keys on (event, instrument) within a 15-minute window. Since LEO observations are written with obs_source = "LEO:{instrument}", closure (Section 8) recovers the canonical negative LLR by instrument tier using the published sensor performance characteristics.[3], [2]

Why the two layers are complementary, not redundant. The detection-driven path runs on polling cadence and cannot distinguish "no overpass happened" from "overpass happened but found no fires" when a poll returns zero detections. The TLE-driven scanner answers the second question definitively from orbit geometry, independent of whether any polling source reported anything. The first layer handles positive evidence robustly by leveraging native per-feature orbit metadata; the second layer guarantees closure gets negative evidence even during polling gaps and from passes that produced zero NSW detections.

2.4 Latency Budget

The end-to-end latency from satellite observation to alert display comprises:

  1. Satellite to ground station: ~2–3 minutes (RF downlink)
  2. Ground processing to cloud mirror: ~5–12 minutes (JMA → NOAA → AWS S3)
  3. Our ingestion + detection: <2 seconds (HSD decode + contextual algorithm)
  4. Event association + confidence: <100 ms

Total typical latency: 7–15 minutes from satellite observation to portal display. Our processing contributes less than 0.1% of the total latency; the bottleneck is upstream data distribution from JMA through NOAA to AWS.

3. Contextual Fire Detection Algorithm

The core detection algorithm is a contextual anomaly detector adapted from the heritage MODIS active fire algorithm (MOD14)[2] and the VIIRS 375 m active fire product (VNP14IMG)[3], with modifications to account for the coarser spatial resolution and geostationary viewing geometry of AHI. The algorithm operates on two spectral bands: Band 7 (3.9 μm, mid-infrared) and Band 14 (11.2 μm, thermal infrared).

3.1 Solar Zenith Angle Computation

The solar zenith angle (SZA) determines whether a pixel is observed under daytime or nighttime conditions, which critically affects the detection thresholds. SZA is computed using the pyorbital library's spherical astronomy routines, which implement standard solar position algorithms based on the astronomical almanac.

Day/night classification
$$\text{is\_day} = \begin{cases} \text{true} & \text{if } \theta_z < 85° \\ \text{false} & \text{if } \theta_z \geq 85° \end{cases}$$

where $\theta_z$ is the solar zenith angle. The 85° threshold includes civil twilight, during which reflected solar radiation in the 3.9 μm band can still produce false anomalies.

3.2 Masking Pipeline

Before detection, pixels are filtered through a multi-layer masking pipeline:

  1. Cloud mask: $T_{11.2} < 270\,\text{K}$ — cloud tops are cold in the thermal infrared. Cloud-adjacent pixels (2-pixel buffer via morphological dilation) are also excluded to avoid cloud-edge thermal artifacts.[2]
  2. Water mask: Hybrid of the global-land-mask ocean product and GSHHS (Global Self-consistent Hierarchical High-resolution Shorelines) for inland water bodies. Pre-computed and cached per grid shape.
  3. Northern Arizona spatial mask: Bounding box filter restricting processing to the monitoring region.
  4. Valid-data check: All float bands must contain finite values (not NaN or Inf).

3.3 Absolute Threshold Detection

Extremely high brightness temperatures indicate unambiguous fire signals that bypass contextual analysis entirely. These are assigned HIGH confidence immediately:

ConditionThresholdRationale
Saturated$T_{3.9} \geq 400\,\text{K}$Radiometer saturation — unambiguously fire
Extreme (day)$T_{3.9} \geq 360\,\text{K}$ ($\theta_z < 85°$)No natural surface reaches this temperature in MIR
Extreme (night)$T_{3.9} \geq 320\,\text{K}$ ($\theta_z \geq 85°$)Lower threshold at night (no solar contribution)
These thresholds are based on the physical upper bounds of surface temperatures in the mid-infrared. At 3.9 μm, maximum solar-heated land surfaces in the arid Southwest reach approximately 330–340 K during extreme heatwaves. The daytime threshold of 360 K provides a substantial margin above the hottest plausible non-fire signal.[2]

3.4 Candidate Selection

Pixels that are not absolute detections must pass minimum thresholds to become candidates for contextual analysis. These thresholds have been specifically tuned for AHI's coarser resolution:

Daytime candidates ($\theta_z < 85°$)
$$T_{3.9} \geq 310\,\text{K} \quad \text{AND} \quad \Delta T \geq 8\,\text{K}$$
Nighttime candidates ($\theta_z \geq 85°$)
$$T_{3.9} \geq 285\,\text{K} \quad \text{AND} \quad \Delta T \geq 2\,\text{K}$$

where $\Delta T = T_{3.9} - T_{11.2}$ is the brightness temperature difference (BTD). The BTD exploits the differential sensitivity of the 3.9 μm and 11.2 μm bands to sub-pixel hot sources: at fire temperatures (600–1200 K), Planck radiance in the MIR increases far more steeply than in the TIR, producing a characteristic positive BTD anomaly even when the fire occupies a tiny fraction of the pixel.

AHI-specific tuning: These thresholds are substantially lower than the VIIRS VNP14IMG equivalents (BTD ≥ 22 K daytime). At AHI's ~3 km pixel size, the same fire produces a BTD anomaly approximately 85× smaller than at VIIRS's 375 m resolution (proportional to pixel area ratio). Using VIIRS-scale thresholds on AHI data resulted in an 84% miss rate in our validation testing.

3.5 Background Characterization

The contextual approach compares each candidate pixel against its local background to determine whether it is anomalous. Background statistics are computed using an expanding window strategy:

Background statistics computation

For each candidate pixel at position $(i, j)$ and window size $W \in \{11, 15, 21, 31\}$:

$$\bar{T}_{bg} = \frac{1}{N_{valid}} \sum_{(m,n) \in \mathcal{W}} T_{m,n} \cdot \mathbb{1}_{valid}(m,n)$$ $$\sigma_{bg} = \max\left(\sqrt{\frac{1}{N_{valid}} \sum_{(m,n) \in \mathcal{W}} T_{m,n}^2 \cdot \mathbb{1}_{valid}(m,n) - \bar{T}_{bg}^2},\;\; 1.5\,\text{K}\right)$$

where $\mathcal{W}$ is the $W \times W$ window centered on $(i,j)$, $\mathbb{1}_{valid}$ excludes cloud, water, absolute fire, and obvious fire pixels, and $N_{valid}$ is the count of valid background pixels. Statistics are computed independently for $T_{3.9}$, $T_{11.2}$, and $\Delta T$.

Key implementation details:

3.6 Contextual Fire Tests

Candidate pixels must pass a battery of contextual tests to be classified as fire. The tests use split sigma multipliers — different significance thresholds for $T_{3.9}$ and $\Delta T$ — following the VNP14IMG ATBD approach:[3]

Contextual test suite (all must pass)

Test 1 — MIR anomaly:

$$T_{3.9} > \bar{T}_{3.9,bg} + \sigma_{3.9} \cdot \sigma_{3.9,bg}$$

where $\sigma_{3.9} = 3.0$ (day) or $2.5$ (night)

Test 2 — BTD sigma anomaly:

$$\Delta T > \overline{\Delta T}_{bg} + \sigma_{\Delta T} \cdot \sigma_{\Delta T,bg}$$

where $\sigma_{\Delta T} = 2.0$ (day) or $2.5$ (night)

Test 3 — BTD floor:

$$\Delta T > \overline{\Delta T}_{bg} + \delta_{floor}$$

where $\delta_{floor} = 6\,\text{K}$ (day) or $3\,\text{K}$ (night)

Test 4 — MIR absolute floor:

$$T_{3.9} \geq 310\,\text{K}\;\text{(day)}\;\text{or}\;290\,\text{K}\;\text{(night)}$$

Test 5 — TIR consistency (daytime only):

$$T_{11.2} > \bar{T}_{11.2,bg} + \sigma_{11.2,bg} - 6\,\text{K}$$

This test catches MIR-only anomalies where reflected sunlight boosts $T_{3.9}$ but not $T_{11.2}$. The −6 K offset is deliberately permissive because AHI fires produce negligible TIR signal (~0.04 K for a 500 m² fire at 3 km resolution).

Split sigma rationale: VNP14IMG uses MAD (median absolute deviation) rather than standard deviation, with MAD ≈ 0.8 × std for Gaussian distributions. Our std-based sigma multipliers are scaled by ~0.8× to match: a VNP14IMG threshold of 3.5×MAD corresponds to approximately 2.8×std. We use 3.0/2.5 (BT7 day/night) and 2.0/2.5 (BTD day/night) based on empirical optimization against labeled fire/non-fire pixels from historical GOES observations over Northern Arizona.

3.7 Per-Pixel Confidence Assignment

Pixels that pass contextual tests are assigned confidence levels based on the strength of the anomaly:

ConfidenceCriterionMeaning
HIGH (3)Absolute threshold metUnambiguous fire signal
NOMINAL (2)$\Delta T - \overline{\Delta T}_{bg} > 15\,\text{K}$Strong contextual anomaly
LOW (1)Contextual tests passed, BTD anomaly ≤ 15 KModerate anomaly

Post-detection confidence adjustments:

4. CUSUM Temporal Fire Detection

The CUSUM (Cumulative Sum) module provides a complementary temporal detection capability that can identify fires too small to trigger the single-frame contextual detector. It maintains a per-pixel statistical model of expected brightness temperature difference (BTD) at each time of day and flags persistent positive anomalies using a dual-rate CUSUM statistic. The approach is inspired by sequential change-point detection theory[4] adapted for satellite fire detection.[5]

4.1 Harmonic Kalman Filter Background Model

The expected BTD at each pixel follows a diurnal cycle driven by solar heating. We model this with a 6-parameter harmonic function estimated online via a Kalman filter:

Diurnal BTD model
$$\hat{\Delta T}(t) = \bar{T} + a_1 \cos(\omega t) + b_1 \sin(\omega t) + a_2 \cos(2\omega t) + b_2 \sin(2\omega t) + \beta \cdot \tilde{T}_{11.2}(t)$$

where $\omega = 2\pi/24$ rad/hour (24-hour period), $\bar{T}$ is the baseline mean BTD, $a_1, b_1$ capture the fundamental diurnal harmonic, $a_2, b_2$ capture the second harmonic (12-hour semi-diurnal cycle), and $\beta$ is a covariate coefficient for the BT14 anomaly $\tilde{T}_{11.2}$ (exponential moving average deviation) which accounts for land surface temperature fluctuations.

The state vector $\mathbf{x} = [\bar{T},\, a_1,\, b_1,\, a_2,\, b_2,\, \beta]^T$ is updated via the standard Kalman filter equations:

Kalman filter update

Prediction:

$$\mathbf{x}_{k|k-1} = \mathbf{x}_{k-1|k-1}, \qquad \mathbf{P}_{k|k-1} = \mathbf{P}_{k-1|k-1} + \mathbf{Q}$$

Innovation:

$$r_k = \Delta T_{obs}(k) - \mathbf{h}_k^T \mathbf{x}_{k|k-1}$$

Kalman gain (fire-softened):

$$\mathbf{K}_k = (1 - P_{fire}) \cdot \frac{\mathbf{P}_{k|k-1} \mathbf{h}_k}{\mathbf{h}_k^T \mathbf{P}_{k|k-1} \mathbf{h}_k + R_k}$$

State update:

$$\mathbf{x}_{k|k} = \mathbf{x}_{k|k-1} + \mathbf{K}_k \, r_k$$

where $\mathbf{h}_k = [1,\, \cos(\omega t_k),\, \sin(\omega t_k),\, \cos(2\omega t_k),\, \sin(2\omega t_k),\, \tilde{T}_{11.2}(k)]^T$ is the observation model vector, $R_k$ is the observation noise variance (0.25 K² day / 0.09 K² night), and $\mathbf{Q} = \text{diag}(\sigma_q^2)$ is the process noise covariance.

Fire-softened Kalman gain: The key innovation is multiplying the Kalman gain by $(1 - P_{fire})$. When the system has high confidence that a pixel contains fire ($P_{fire} \to 1$), the background model is effectively frozen — preventing the model from "chasing" the fire anomaly and adapting to it as the new normal. A minimum weight of 0.01 prevents total freeze. This is critical: without softening, a sustained fire would be incorporated into the background model within ~30 minutes, causing the CUSUM to reset and the fire to be lost.
ParameterValuePurpose
Initial variance[25, 4, 4, 1, 1, 1] K²Prior uncertainty on each state component
Process noise σ[0.001, 0.0001, 0.0001, 5e-5, 5e-5, 0.0001] K/stepSlow adaptation (~0.14 K/day drift for mean)
$R_{day}$0.25 K²Higher noise during day (solar heating variability)
$R_{night}$0.09 K²Lower noise at night (more stable background)
Min. initialization48 clear-sky observations~8 hours at 10-min cadence before CUSUM activates

4.2 Dual-Rate CUSUM Decision Rule

The CUSUM statistic accumulates normalized positive residuals to detect persistent anomalies. We run two CUSUM statistics in parallel to catch fires of different sizes:

Dual-rate CUSUM statistics

Slow CUSUM (small fires over hours):

$$S_{slow}(k) = \max\left(0,\; S_{slow}(k-1) + \frac{r_k}{\sigma_{obs}} - k_{slow}\right)$$

with reference value $k_{slow} = 0.5$

Fast CUSUM (large fires in minutes):

$$S_{fast}(k) = \max\left(0,\; S_{fast}(k-1) + \frac{r_k}{\sigma_{obs}} - k_{fast}\right)$$

with reference value $k_{fast} = 1.5$

Combined statistic:

$$S_{max}(k) = \max\left(S_{slow}(k),\; S_{fast}(k)\right)$$

The reference value $k$ determines the minimum shift (in units of $\sigma_{obs}$) that the CUSUM is tuned to detect. $k_{slow} = 0.5$ is optimized for detecting persistent anomalies of 0.5σ that accumulate over hours (small fires at AHI resolution). $k_{fast} = 1.5$ catches large, sudden anomalies within 2–3 frames.

4.3 Bayesian Fire Confidence

Rather than using a fixed CUSUM threshold, we convert $S_{max}$ to a calibrated fire probability using a Bayesian sigmoid mapping:

CUSUM to probability conversion
$$P(\text{fire}) = \frac{1}{1 + \frac{1-\pi_0}{\pi_0} \cdot e^{-\alpha \cdot S_{max}}}$$

where $\pi_0 = 10^{-5}$ is the fire prior (probability of fire per pixel per frame) and $\alpha = 2.0$ is the log-odds scale factor. This maps $S_{max} \approx 5.76$ to $P(\text{fire}) = 0.5$, which is the detection threshold.

BT14 rejection: To suppress false alarms from atmospheric changes that affect both bands simultaneously, detections are attenuated when the 11.2 μm band also shows an anomaly ($3\sigma < \tilde{T}_{11.2} < 6\sigma$). Anomalies exceeding 6σ in $T_{11.2}$ are not rejected, as they may indicate very large fires that produce detectable TIR signals.

5. Trajectory Analysis

Trajectory analysis examines how a candidate pixel's thermal signature evolves over time. This is the key discriminator between real fire ignition (which shows characteristic monotonic warming and BTD growth) and transient false alarms (which tend to be noisy or short-lived). All features are continuous — no binary decisions are made at this stage.

5.1 Spectral Trajectory Features

For each candidate pixel, we query its recent history (typically 2–6 hours of 10-minute observations) from the spatiotemporal data cube and compute:

Linear slope (short/medium/full lookback)
$$\hat{\beta} = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^{n}(x_i - \bar{x})^2}$$

Computed for each of $T_{3.9}$, $T_{11.2}$, $\Delta T$, and split-window ($T_{11.2} - T_{10.4}$) time series. Short = last 3 frames (~20 min), medium = last 7 frames (~60 min), full = entire lookback window.

Monotonicity
$$M = \frac{\#\{i : y_{i+1} > y_i\}}{n - 1}$$

Fraction of consecutive pairs showing increase. $M = 1.0$ indicates perfectly monotonic warming; $M = 0.5$ is neutral (random walk). Fire ignition typically shows $M > 0.7$ in the BTD channel.

Variability (coefficient of variation)
$$CV = \frac{\sigma_y}{|\bar{y}|}$$

High variability suggests atmospheric noise or cloud contamination rather than a stable fire signal. Real fires tend to have $CV < 0.1$ in the BTD channel after ignition.

Maximum jump
$$J_{max} = \max_{i} |y_{i+1} - y_i|$$

Large frame-to-frame changes in sigma-deviation suggest sudden onset, which can indicate either a new fire or cloud clearing.

5.2 Spatial Behavior Features

Spatial features assess whether the thermal anomaly is anchored in space (fire) or drifting (cloud edge, atmospheric artifact):

5.3 Cloud Context Features

Cloud history is critical because many false alarms occur at cloud edges, where differential clearing between 3.9 μm and 11.2 μm bands can mimic fire BTD signatures:

6. Random Forest Classifier

The primary pixel-level scorer is a Random Forest classifier. It operates on the feature space described in Sections 3 and 5, trained on labeled fire and false-alarm pixels from historical GOES-West ABI observations over Northern Arizona using time-reversed labeling from FIRMS confirmations.

6.1 Feature Engineering

The classifier uses 62 features organized in tiers:

TierFeaturesCount
Core spatial$T_{3.9}$, $T_{11.2}$, $\Delta T$, SZA, is_day, background stats (μ, σ), sigma deviations, BT ratio, 3×3 neighborhood max/mean15
Temporal10/30/60-min deltas for $\Delta T$ and $T_{3.9}$, neighborhood temporal stats, z-scores7
Spatial-temporalPixel z-score trend, neighbor divergence, spatial gradient change3
Multi-scale5×5 and 7×7 neighborhood max/mean (inspired by MSSTF[6])8
WeatherTemperature, rainfall, evaporation, vapor pressure, humidity, radiation (from SILO)9
Nuisance priorData-driven false alarm frequency at each pixel location (day, night, combined)3
Climatology residualsObserved $-$ expected $T_{3.9}$ and $\Delta T$ per pixel/SZA bin, z-scored against climatological variance, plus fire-asymmetry ratio5
Per-pixel baseline$T_{3.9}$ and $\Delta T$ z-scores against a B-spline baseline model conditioned on pixel identity, SZA, and weather4

The climatology and baseline tiers were added in the v4 retrain (2026-04-16). They provide pixel-specific "what should this location look like right now?" context that the spatial-background features alone cannot capture, reducing false positives from locations with unusual emissivity or persistent thermal anomalies.

6.2 Training & Validation Strategy

Training uses time-reversed labeling: pixels that were later confirmed as fire by VIIRS are labeled positive in prior AHI frames where they appeared as thermal anomalies. This naturally creates training data from the "hard" period before a fire is obvious.

Spatial cross-validation: We use GroupKFold with groups defined by 1° lat/lon grid cells. This ensures that fires in the same geographic region are never split between train and test folds, preventing spatial autocorrelation from inflating performance metrics. Each fold trains with $n = 200$ trees, $\text{max\_depth} = 15$, $\text{min\_samples\_leaf} = 10$, and class_weight="balanced".

6.3 Probability Calibration

Raw Random Forest probabilities tend to be poorly calibrated (clustered near 0 and 1). We apply isotonic regression post-hoc calibration[7] on a disjoint held-out 20% calibration split. The RF is trained on 80% of the data; the isotonic calibrator is then fit on the remaining 20% that the RF never saw during training. This honest separation prevents the calibrator from memorizing the RF's own training-set predictions, which previously compressed the calibrated score distribution into a near-step-function (every raw score above 0.74 mapped to calibrated ≥ 0.93, destroying downstream fusion's ability to discriminate). The v4 calibration fix reduced the fraction of scores pinned at ≥ 0.99 from 8.8% to 0.9% on held-out data.

Threshold selection
$$\tau^* = \arg\max_\tau \text{Recall}(\tau) \quad \text{subject to} \quad \text{Precision}(\tau) \geq 0.90$$

We select the operating threshold that maximizes recall (sensitivity) while maintaining at least 90% precision, targeting <5% false positive rate.

7. Bayesian Log-Odds Fusion

The fusion engine is the central integration point of the detection pipeline. Rather than cascading binary decisions (detect → confirm → score), every processing module contributes a continuous log-likelihood ratio (LLR) to a single fusion equation. The result is a calibrated fire probability with bootstrap confidence intervals. This section describes the fusion formula, the three block types, and how uncertainty propagates through the system.

7.1 Block Types

The fusion architecture distinguishes three kinds of blocks, each with a distinct mathematical role:

Prior Block

The prior $\ell_{\text{prior}}$ encodes the background fire rate in log-odds space, varying by geographic location, time of day, and season. It is learned from historical fire data and acts as the anchor for the fusion equation — all evidence is accumulated relative to this baseline. In fire-prone areas during peak season, $\ell_{\text{prior}}$ may be modestly positive; in urban or water areas, it is strongly negative.

Evidence Blocks

Evidence blocks observe the scene and produce LLRs quantifying how much more (or less) likely fire is given the observation:

BlockSymbolGroupInputOutput
RF Pixel Scorer$\ell_{\text{RF}}$pixelSpectral, spatial, temporal, weather, climatology, baseline featuresLLR from empirical class-conditional histogram (50 bins over calibrated probability)
Persistence Pattern$\ell_{\text{persist}}$pixel3-frame binary detection history (8 patterns: 000 through 111)Empirical LLR per pattern from training-set fire/non-fire counts
Multiband Z-Score$\ell_{\text{mz}}$pixelWien's law ratio ($T_{3.9}/T_{11.2}$), spectral asymmetry, split-window z-scoreSum of 3 per-feature LLR tables (30 bins each)
Multiband Trajectory$\ell_{\text{mt}}$trajectoryTemporal evolution of Wien's law ratio over 1-hour lookback: slope, mean, max, acceleration, divergence, standard deviationSum of 6 per-feature LLR tables (30 bins each)
GRU Temporal Detector$\ell_{\text{GRU}}$pixelPer-pixel z-score time series through a recurrent neural networkLLR from empirical histogram of GRU fire probability (currently unfit; contributes zero)
LEO Cross-Check$\ell_{\text{LEO}}$pixelTemporally-decayed evidence from VIIRS/MODIS overpasses injected onto the ABI gridDecayed LLR with half-life of 2 hours, pruned after 8 hours
Block composition rule: All pixel-group blocks ($\ell_{\text{RF}}$, $\ell_{\text{persist}}$, $\ell_{\text{mz}}$, $\ell_{\text{GRU}}$) are summed into a single pixel evidence term before the quality multiplier is applied. Trajectory-group blocks ($\ell_{\text{mt}}$) enter the fusion equation through a separate coefficient $\beta_{\text{traj}}$, with an interaction term $\gamma \cdot \ell_{\text{pix}} \cdot \ell_{\text{traj}}$ to capture the synergy between per-frame and temporal evidence.
Residualization of $\ell_{\text{traj}}$: The trajectory classifier is trained on features that overlap with the RF pixel scorer (e.g., BT7 sigma deviation). To prevent double-counting, $\ell_{\text{traj}}$ is residualized: the trajectory LLR is the incremental information in the temporal pattern beyond what the single-frame RF score already captures. This is achieved by including $\ell_{\text{RF}}$ as a feature in the trajectory classifier and measuring the marginal contribution.

Quality Blocks

Quality blocks assess observation reliability. They produce multipliers $q \in [0, 1]$ that dampen the evidence terms when conditions degrade, without themselves claiming fire or not-fire:

BlockSymbolMechanism
Cloud Quality$q_{\text{cloud}}$3-state probabilistic cloud model (see Section 10): $q = P(\text{clear}) + \lambda \cdot P(\text{edge})$
SZA Quality$q_{\text{SZA}}$Smooth sigmoid ramp from 1.0 (low SZA) to ~0.3 (high SZA, twilight), reflecting reduced discriminability of the BTD channel near the solar terminator
Key insight: Quality blocks dampen trust in evidence; they never veto detections. A fire under heavy cloud still receives reduced but non-zero evidence weight. This avoids the information-destroying behavior of binary masks, where a single threshold decision discards all information about partially-obscured scenes.

7.2 The Anchored Logistic Combiner

All blocks feed a single fusion equation in log-odds space:

Fusion equation
$$\eta = \ell_{\text{prior}} + q_{\text{cloud}} \cdot q_{\text{SZA}} \cdot \left(\ell_{\text{RF}} + \ell_{\text{persist}} + \ell_{\text{cloud}}\right) + \beta_{\text{traj}} \cdot \ell_{\text{traj}} + \beta_{\text{xsat}} \cdot \ell_{\text{GK2A}} + \gamma \cdot \ell_{\text{pix}} \cdot \ell_{\text{traj}}$$

where $\ell_{\text{pix}} = \ell_{\text{RF}} + \ell_{\text{persist}} + \ell_{\text{cloud}}$ is the combined per-frame evidence, $\beta_{\text{traj}}$ and $\beta_{\text{xsat}}$ are learned scaling coefficients for the trajectory and cross-satellite terms, and $\gamma$ is the interaction coefficient capturing the synergy between per-frame and trajectory evidence.

Calibrated probability
$$P(\text{fire}) = \sigma(\eta) = \frac{1}{1 + e^{-\eta}}$$

The sigmoid function maps the combined log-odds $\eta$ to a probability in $[0, 1]$. Because all inputs are calibrated LLRs and the prior is learned from data, the resulting probability is well-calibrated: a predicted 30% means approximately 30% of such detections are real fires.

Why log-odds? In log-odds space, independent evidence is additive. This makes the fusion equation a linear model over LLRs, which is both interpretable and computationally trivial. The quality multipliers $q_{\text{cloud}} \cdot q_{\text{SZA}}$ apply as a single scalar gate on the per-frame evidence group, dampening all three per-frame terms equally when observation quality is poor.

7.3 Uncertainty Propagation

The fusion engine does not produce a single point estimate; it produces a probability with a confidence interval derived from bootstrap resampling:

Bootstrap confidence interval
$$[p_{lo}, p_{hi}] = \left[\sigma\left(\hat{\eta} - z_{\alpha/2} \cdot \hat{\sigma}_\eta\right),\;\; \sigma\left(\hat{\eta} + z_{\alpha/2} \cdot \hat{\sigma}_\eta\right)\right]$$

where $\hat{\sigma}_\eta$ is the standard deviation of $\eta$ across $B = 200$ bootstrap replicates of the training data, and $z_{\alpha/2} = 1.96$ for a 95% interval. The sigmoid is applied after constructing the interval in log-odds space, which naturally produces asymmetric probability intervals that respect the $[0, 1]$ bound.

The confidence interval captures uncertainty from two sources: (a) finite training data for the RF and trajectory classifiers, and (b) estimation noise in the quality block parameters (cloud model, SZA ramp). It does not capture model misspecification — if the fusion equation itself is wrong, the CI will not help. However, because the equation is anchored to a learned prior and all terms are calibrated independently, this structural risk is mitigated.

Key insight: Exported alerts include both $P(\text{fire})$ and $[p_{lo}, p_{hi}]$. A detection with $P = 0.6$ but $[0.2, 0.9]$ communicates genuine ambiguity; a detection with $P = 0.6$ and $[0.55, 0.65]$ communicates high precision despite moderate probability. Fire managers can use the interval width to decide whether to wait for more evidence or act immediately.

8. Multi-Sensor Fusion & Event Management

All detections — from GOES contextual detection, CUSUM temporal detection, DEA Hotspots, or FIRMS — feed into a shared event store. The fusion system handles deduplication, spatial association, and progressive confidence upgrading.

8.1 Spatial Association (Haversine Distance)

Detections are associated with existing events using the Haversine great-circle distance formula:

Haversine distance
$$d = 2R \cdot \arctan2\left(\sqrt{a},\; \sqrt{1-a}\right)$$ $$a = \sin^2\!\left(\frac{\Delta\phi}{2}\right) + \cos\phi_1 \cdot \cos\phi_2 \cdot \sin^2\!\left(\frac{\Delta\lambda}{2}\right)$$

where $R = 6371$ km is the Earth's mean radius, $\phi$ is latitude, and $\lambda$ is longitude (all in radians). The value $a$ is clamped to $[0, 1]$ for numerical stability.

A new detection is associated with the nearest active event within a 25 km radius. If no event is within range, a new event is created with PROVISIONAL status. When a detection is associated with an existing event, the event centroid is updated as a running average weighted by detection count.

25 km association radius: This is deliberately larger than the GOES pixel size (~2.0 km at NAZ) to account for: (a) geolocation errors in ABI data (~2 km), (b) fire spread between observations (a fast-moving grass fire can advance 1–2 km in 10 min), and (c) the displacement between AHI and VIIRS detections of the same fire due to different viewing geometries and pixel footprints.

8.2 Confidence Ladder

Events progress through a rule-based confidence ladder. Confidence only upgrades, never downgrades — once confirmed, an event stays confirmed. Downward transitions (closure and retraction) are handled separately by the Bayesian closure model (Section 8.4).

Confidence state transitions
$$\text{PROVISIONAL} \xrightarrow{\text{2+ sources OR 2 passes}} \text{LIKELY} \xrightarrow{\text{3+ passes OR Sentinel}} \text{CONFIRMED} \xrightarrow{\text{auto}} \text{MONITORING}$$

A temporally distinct pass is defined as a detection separated from the previous one by more than 30 minutes. Multiple detections within a 30-minute window (e.g., several pixels in one AHI frame) count as a single pass. This ensures that promotion requires evidence of persistence across observation cycles, not just spatial extent within one frame.

Internal StatusPortal LabelTriggerMeaning
PROVISIONAL Unverified First detection from any single source Unverified satellite anomaly; may be false positive
LIKELY Probable Two or more independent sources (e.g., DEA + FIRMS), OR two temporally distinct passes (>30 min apart) Probable fire, awaiting further confirmation
CONFIRMED Cross-validated Three or more temporally distinct passes (>30 min apart), OR any Sentinel-2/Sentinel-3 SLSTR detection Multi-source or high-resolution corroboration
MONITORING Monitored Automatic promotion when a CONFIRMED event enters the characterization engine (15-min cycle) Previously cross-validated, now under active observation with characterization updates
RETRACTED Retracted Bayesian posterior $P(\text{active}) < \theta_{\text{close}}$ for a PROVISIONAL event Detection not corroborated; likely false positive
CLOSED Closed Bayesian posterior $P(\text{active}) < \theta_{\text{close}}$ for a LIKELY, CONFIRMED, or MONITORING event Fire no longer active
Single-frame cluster guard. A Himawari-only event whose detections all fall within a single 10-minute AHI frame cannot promote past PROVISIONAL, regardless of how many pixels were flagged. Real fires persist across at least two AHI frames; a single-frame cluster is likely a transient artefact (cloud edge flicker, solar geometry glint, or industrial thermal gradient). A second AHI frame ≥10 minutes later, or any non-Himawari corroboration (DEA, FIRMS, Sentinel), lifts the guard.
Sentinel auto-confirmation. Any Sentinel-2 (20 m MSI) or Sentinel-3 SLSTR detection immediately promotes an event to CONFIRMED, bypassing the pass-count rules. These LEO sensors have spatial resolution 5–50× finer than AHI, making their fire detections definitive independent verification.
One observation = one evidence contribution. Each detection from each source contributes once to the confidence assessment. A detection that appears in both DEA and FIRMS (from the same VIIRS overpass) is deduplicated at ingestion via a SHA256 hash of (source, latitude, longitude, acquisition time), so it contributes only once.

8.3 Portal Display Labels

The dispatcher portal uses its own satellite-detection labels that describe Embersat's confidence in the detection. These are not public agency alert levels (Advice, Watch and Act, Emergency Warning), which carry legal and operational weight that satellite detection alone cannot justify. Embersat never auto-assigns agency alert levels; those are displayed only when sourced from an actual agency feed match or dispatcher confirmation referencing one.

Portal LabelColorInternal StatusCAP Certainty
Cross-validated #E67E22CONFIRMEDObserved
Probable #F1C40FLIKELYLikely
Unverified #3498DBPROVISIONALPossible
Monitored #27AE60MONITORINGObserved
Retracted #95A5A6RETRACTEDUnlikely
Closed #BDC3C7CLOSEDUnlikely

8.4 Bayesian Closure Model

Event closure uses a time-integrated Bayesian model that accumulates evidence from post-detection observations. Each clear-sky AHI frame or LEO overpass that does not detect fire contributes negative evidence; any re-detection resets the integration window.

Closure posterior
$$\eta = \eta_{\text{prior}} + r \int_{t_{\text{last\_det}}}^{t_{\text{now}}} \text{logit}\!\bigl(f\!(t)\bigr)\;\omega(t)\;dt \;+\; \eta_{\text{FRP}}$$ $$P(\text{active}) = \sigma(\eta) = \frac{1}{1 + e^{-\eta}}$$

where:

Status at Last DetectionLog-Odds Prior $\eta_{\text{prior}}$Interpretation
PROVISIONAL1.0Might be false alarm; closes faster
LIKELY1.5Probably real; needs more negative evidence
CONFIRMED / MONITORING2.0Definitely real; closes slowest

The event closes when $P(\text{active}) < \theta_{\text{close}}$ (default 0.1). The distinction between RETRACTED and CLOSED depends on the event's status at the time of closure: PROVISIONAL events are retracted (likely false positives), while events that had reached LIKELY or higher are closed (real fires that have gone out).

Closure evidence is symmetric. Positive observations (detections matching the event) drive the posterior up; negative observations (a cloud-free AHI frame with no detection, or a LEO satellite overpass that found nothing — see Section 2.3) drive it down. The TLE-driven overpass scanner guarantees closure sees per-instrument "satellite saw nothing" evidence even when the polling source returns an empty batch. Without it, closure would rely solely on AHI clear-sky frames and events already extinguished would stay MONITORING longer than necessary.
Per-pixel closure. For multi-pixel events, each registered fire pixel is evaluated independently by the closure model. An event closes only when all of its active pixels have $P(\text{active}) < \theta_{\text{close}}$. This prevents premature closure when one edge of a fire has gone out while another is still burning.

9. Location Uncertainty

Every fire event is displayed with an uncertainty circle representing the estimated spatial accuracy of the detection. The uncertainty radius depends on the sensor(s) that contributed to the event and the number of independent detections.

9.1 Sources of Geolocation Error

Uncertainty in fire location arises from several sources:

  1. Pixel size: Fire can be anywhere within the sensor pixel. GOES ABI pixels are ~2 km at nadir at Northern Arizona viewing angles (near sub-satellite point). VIIRS I-band pixels are 375 m at nadir.
  2. Geometric registration error: Systematic and random errors in satellite attitude and orbit knowledge. GOES-18 ABI has a navigation accuracy of ~0.5–1.0 km (1σ).[8]
  3. Sub-pixel fire location: The fire is typically not at the pixel center. Without sub-pixel retrieval, the fire position uncertainty is approximately the pixel radius.
  4. Viewing geometry: Geostationary sensors view at oblique angles, increasing the effective ground footprint. At Northern Arizona latitudes, the GOES-West view zenith angle is relatively small, expanding the pixel by a factor of approximately $1/\cos(\text{VZA})$.

9.2 Uncertainty Calculation

Initial uncertainty is set based on the detecting sensor. When multiple sensors contribute to the same event, the tighter constraint is used:

SensorInitial UncertaintyFloorBasis
GOES ABI2000 m500 m~1 pixel radius at nadir (~2 km pixel radius at NAZ)
VIIRS I-band375 m100 mI-band nadir pixel size
MODIS1000 m500 m1 km thermal band pixel
DEA Hotspots (VIIRS)375 m100 mBased on VIIRS I-band

When a higher-resolution sensor (e.g., VIIRS) constrains a detection originally from GOES, the uncertainty radius is reduced to reflect the tighter localization. Multiple concordant detections further reduce uncertainty following $\sqrt{n}$ scaling:

Multi-detection uncertainty reduction
$$u_{updated} = \max\left(\frac{u_{sensor}}{\sqrt{n}},\;\; u_{floor}\right)$$

where $u_{sensor}$ is the single-detection uncertainty for the best available sensor, $n$ is the number of concordant detections from that sensor type, and $u_{floor}$ is the irreducible geolocation error. For example, a CONFIRMED event with 5 VIIRS detections would have uncertainty of $\max(375/\sqrt{5},\; 100) = \max(168,\; 100) \approx 170$ m.

9.3 Circle Geometry for GeoJSON Export

Uncertainty circles are represented as GeoJSON Polygons using an equirectangular approximation:

Uncertainty circle polygon generation

For $N = 32$ vertices at angles $\theta_i = 2\pi i / N$:

$$\Delta\phi_i = r \cdot \sin(\theta_i) \cdot \frac{1}{111{,}320\;\text{m/deg}}$$ $$\Delta\lambda_i = r \cdot \cos(\theta_i) \cdot \frac{1}{111{,}320 \cdot \cos(\phi_0)\;\text{m/deg}}$$

where $r$ is the uncertainty radius in meters, $\phi_0$ is the event centroid latitude, $\Delta\phi$ is the latitude offset, and $\Delta\lambda$ is the longitude offset. The factor $111{,}320$ m/deg is the meridional arc length for one degree of latitude on the WGS84 ellipsoid (mean Earth radius approximation). The $\cos(\phi_0)$ correction accounts for the convergence of meridians at higher latitudes. This approximation introduces <0.1% error for the radii involved (100 m – 4 km).

Why not geodetic circles? For the small radii involved (typically <4 km), the equirectangular approximation is indistinguishable from a true geodetic calculation. The maximum error at the competition latitude (-37°S) for a 4 km radius circle is approximately 3 meters — negligible compared to the sensor geolocation uncertainty itself. The equirectangular method avoids the computational overhead of Vincenty or Karney geodetic algorithms and the dependency on geographic libraries.

10. Cloud Masking

Cloud masking is essential to prevent thermal artifacts at cloud edges from generating false fire detections. Rather than a binary threshold, the system uses a 3-state probabilistic cloud model that classifies each pixel as Clear, Edge, or Opaque and produces a continuous quality score $q_{\text{cloud}} \in [0, 1]$ for the fusion engine.

10.1 Three-State Cloud Classification

The cloud model uses a binned Naive Bayes classifier with four spectral inputs:

FeatureBandRole
$T_{11.2}$Band 14 (TIR)Primary cloud indicator — cold tops indicate optically thick cloud
$T_{11.2} - T_{10.4}$Split-windowCirrus and thin cloud detection via differential water vapor absorption
$T_{3.9} - T_{11.2}$BTDCloud edge signature — differential emissivity at cloud boundaries
$\sigma_{3\times3}(T_{11.2})$Spatial textureLocal heterogeneity — cloud edges have high spatial variance

Each feature is discretized into learned bins, and class-conditional probabilities are estimated with Dirichlet smoothing ($\alpha = 1$) to handle sparse bins without overfitting:

Binned Naive Bayes with Dirichlet smoothing
$$P(c \mid \mathbf{x}) \propto P(c) \prod_{j=1}^{4} \frac{n_{c,j,b(x_j)} + \alpha}{n_{c,j,\cdot} + \alpha \cdot B_j}$$

where $c \in \{\text{Clear}, \text{Edge}, \text{Opaque}\}$, $b(x_j)$ is the bin index for feature $j$, $B_j$ is the number of bins for feature $j$, and $n_{c,j,b}$ is the count of training pixels with class $c$, feature $j$, falling in bin $b$. The class prior $P(c)$ is estimated from labeled data.

10.2 Cloud Quality Score

The three-state posterior is collapsed to a single quality score for the fusion engine:

Cloud quality score
$$q_{\text{cloud}} = P(\text{Clear} \mid \mathbf{x}) + \lambda \cdot P(\text{Edge} \mid \mathbf{x})$$

where $\lambda \in [0, 1]$ is a tunable parameter (default $\lambda = 0.3$) controlling how much trust to place in edge-classified pixels. Setting $\lambda = 0$ treats cloud edges as fully opaque; $\lambda = 1$ treats them as fully clear.

The quality score enters the fusion equation (Section 7) as a multiplicative gate on the per-frame evidence terms. When $q_{\text{cloud}} \approx 0$ (opaque cloud), per-frame evidence is nearly zeroed out but the prior and trajectory terms still contribute. When $q_{\text{cloud}} \approx 1$ (clear sky), evidence passes through at full weight.

Key insight: Cloud edges are their own regime, not just "partly cloudy." At cloud boundaries, differential clearing between the 3.9 and 11.2 μm bands creates BTD signatures that closely mimic fire. The 3-state model gives the system a way to express "this observation is unreliable because it comes from a cloud edge" without discarding it entirely. The binary mask approach (previous $T_{11.2} < 270\,$K threshold) either passed or blocked pixels, losing information in both directions: it missed warm low clouds and unnecessarily masked cold clear-sky pixels in winter.

10.3 Cloud Adjacency

In addition to the per-pixel cloud quality score, the system computes a spatial context feature: the fraction of neighboring pixels (in a 5×5 window) classified as Edge or Opaque. This neighborhood cloud fraction is included as an input to the RF pixel scorer, allowing the classifier to learn that thermal anomalies surrounded by cloud are less likely to be fire.[2] Unlike the previous morphological dilation approach (which created a hard buffer zone), this is a soft, learned integration of spatial cloud context.

11. Sun Glint Detection

Specular reflection of sunlight from water surfaces (sun glint) can produce elevated 3.9 μm brightness temperatures that mimic fire signals. The system computes the sun glint angle for each pixel — the angular separation between the satellite viewing direction and the specular reflection direction:

Glint angle computation
$$\cos(\Theta_{glint}) = \cos\theta_{sun} \cos\theta_{sat} + \sin\theta_{sun} \sin\theta_{sat} \cos(\phi_{sun} - \phi_{sat} + \pi)$$

where $\theta_{sun}$ and $\theta_{sat}$ are the solar and satellite zenith angles, $\phi_{sun}$ and $\phi_{sat}$ are the solar and satellite azimuth angles, and the $+\pi$ accounts for the azimuthal reversal in specular reflection. The satellite position is fixed at 137.2°W (GOES-West geostationary position) with an altitude of 35,786 km.

Pixels with $\Theta_{glint} < 12°$ during daytime are flagged as being in the glint zone. Rather than rejecting these pixels outright (which would create detection gaps near water bodies), the system downgrades their confidence from NOMINAL to LOW. This preserves the ability to detect fires near coastlines and rivers, while flagging them for additional scrutiny.

The satellite zenith angle from each ground point is computed using the geostationary geometry: $$\theta_{sat} = \arctan\left(\frac{\sqrt{1 - \cos^2\gamma}}{\cos\gamma - R_E/(R_E + h)}\right)$$ where $\cos\gamma = \cos\phi \cos\Delta\lambda$, $R_E = 6371$ km, and $h = 35{,}786$ km.

12. GeoJSON Export & OGC Compliance

All fire event data is exported in GeoJSON format following RFC 7946.[9] Key compliance features:

Daily reports are generated automatically at 18:00 MST and include all active and historical events for the day.

13. Values at Risk & Residential Proximity

For each detected fire, the system assesses values at risk: residential proximity, critical infrastructure, and community assets within defined distance bands. This information appears in the dispatcher portal alongside detection data, providing operational context for resource allocation decisions.

13.1 Residential Address Layer (G-NAF)

Residential proximity is computed from Australia's Geocoded National Address File (G-NAF), the authoritative geocoded address database maintained by Geoscape and published quarterly on data.gov.au under CC BY 4.0. The February 2026 release contains 15.86 million addresses nationally.

We extract 4,025,394 NSW residential addresses by filtering on three criteria:

  1. STATE = NSW (geographic scope)
  2. ALIAS_PRINCIPAL = P (principal addresses only, avoiding alias duplicates)
  3. MB_CATEGORY_2021 = Residential (ABS mesh block land-use classification, joined via the MB_2021_PID field linking each G-NAF address to its 2021 Census mesh block)

The resulting coordinates are stored as a compressed float32 array (14.9 MB) and loaded into a scipy cKDTree spatial index at startup. The KD-tree operates in an approximate Euclidean coordinate system (latitude scaled by 111 km/deg, longitude scaled by 111 × cos(33°) km/deg, matching mid-NSW latitude) with a 5% safety margin on query radius to account for the planar approximation at NSW's latitude extremes. Candidate points returned by the KD-tree are refined with exact Haversine distances.

Per-fire queries count addresses in three distance bands: <2 km, <5 km, and <10 km. Typical query time is 0.2 ms (sub-millisecond), adding negligible overhead to the detection pipeline.

13.2 Critical Infrastructure & Community Assets

Nine GeoJSON asset layers are indexed using Shapely 2.0 STRtrees for O(log n) spatial queries:

LayerSourceCountImportance (0–9)
Hospitals & HealthNSW Health~8009
Schools & ChildcareNSW Education~2,0009
Aged CareNSW Health(incl. above)9
Power StationsGeoscience Australia~1008
SubstationsGeoscience Australia~2,0008
Transmission LinesGeoscience Australia~200 segments7
Gas/Oil PipelinesGeoscience Australia~30 segments7
Fuel DepotsGeoscience Australia~5007
Heritage SitesHeritage NSW~20,0005

Point assets use Haversine distance; line assets (transmission corridors, pipelines) use nearest-point-on-line distance. Assets are weighted by importance (0–9) and distance band (1.0 within 2 km, 0.7 within 5 km, 0.4 within 10 km).

13.3 Composite VaR Scoring

The composite Values at Risk score (0–9 scale) aggregates five category groups using weighted maximum scores:

CategoryWeightComponents
People30%Hospitals, schools, aged care
Residential25%G-NAF address count (log10 transform)
Infrastructure25%Power, transmission, pipelines, fuel
Services10%Fire stations, emergency services
Heritage10%State heritage register sites

The residential score uses a log10 transform of the G-NAF address count within 5 km, scaled to 0–9: a fire with 10 nearby residences scores 2.25, 100 residences scores 4.5, and 10,000+ residences scores 9.0. This provides discrimination across the full range from remote bushland to dense suburban areas. Fire radiative power (FRP) optionally scales the hazard weight.

The composite score maps to priority labels: Critical (≥7.0), High (≥4.5), Moderate (≥2.0), Low (<2.0).

14. Dispatch Alert Review

Before any detection reaches a dispatcher's inbox, it passes through an LLM-based alerter agent that investigates the event using the same data a human would review: the multi-frame pixel timeline, thermal values relative to background, retraction history at the pixel location, current fire weather, infrastructure and population exposure (VaR), and any prior alerts already sent for this event.

14.1 Architecture

The alerter runs as a host-level daemon (event-reviewer.service) that polls the alert queue every 60 seconds. When the in-app characterization cycle promotes an event above the VaR or TTI threshold, a row is enqueued in the agent_alerts table. The daemon claims pending rows, invokes a Claude agent (currently Opus) with bypassPermissions mode and full tool access to the detection database, and captures the agent's structured JSON verdict.

Each evaluation typically requires 11–14 agent turns and 100–210 seconds. The agent uses CLI tools to query per-pixel observation timelines, check retracted-event history within a configurable radius, retrieve fire weather (FFDI, wind, humidity), and compute derived quantities like time-since-last-detection before producing a verdict.

14.2 Decision Factors

The agent produces a structured data_story alongside every verdict, documenting the factors it weighed and their relative influence on the decision. Common decisive factors include:

14.3 Fatigue Management

The alerter tracks prior alerts for each event and globally. Duplicate alerts for stable fires are suppressed: if a WATCH-level email was sent 2 hours ago and conditions have not materially escalated, the agent declines the re-trigger with explicit reasoning. A per-event cooldown (configurable, default 120 minutes) prevents email storms during extended events. Over the competition window, the system has evaluated over 1,400 alert candidates. Of those, roughly 1 in 12 has been deemed send-worthy. The other 11 are declined with written reasoning retained for audit.

Key insight: The alerter is not a binary filter. It produces three verdicts: send (email immediately), hold (re-evaluate next cycle), and decline (record reasoning, do not email). The hold verdict allows the system to wait for confirming evidence without losing track of the candidate. Every verdict, including declines, is retained with its full agent transcript and data package for retrospective analysis.

15. Fire Characterization

Once an event is created and tracked, a background characterization loop (every 15 minutes) computes operational metrics that inform the dispatch alert system and the daily report. Characterization is modular: each dimension is a standalone module registered in a module registry.

15.1 Intensity (FRP)

Fire radiative power (FRP) is estimated from the excess $T_{3.9}$ signal above background using the Wooster et al. (2003) method adapted for Himawari AHI geometry. Multiple FRP estimators are available through a module registry (Dozier bi-spectral, MIR-radiance, empirical VIIRS-scale); the production system uses MIR-radiance as the default. FRP is reported as a point estimate with confidence interval derived from the estimator's calibration uncertainty. Intensity classes (low / moderate / high / extreme) are assigned based on the FRP point estimate.

15.2 Spread Rate & Direction

Spread rate is estimated from the weighted centroid displacement between successive AHI frames (10-minute cadence). The centroid is weighted by per-pixel fire probability. Spread direction is the bearing of the displacement vector. Because AHI pixels are ~2 km, the minimum resolvable centroid shift is approximately 200 m per frame (subpixel precision from probability weighting), corresponding to a floor of ~1.2 km/h. Spread rates below this floor are reported as "stationary." Rates exceeding 3× wind speed at the current FFDI are flagged as potentially unreliable (pixel noise rather than real propagation).

15.3 Time-to-Impact (TTI)

Time-to-impact estimates how long until a fire's leading edge reaches a protected asset (school, hospital, fire station, transmission line, residential cluster) given the current spread vector. TTI is computed as $d / v$ where $d$ is the distance from the event centroid to the nearest asset along the spread direction, and $v$ is the observed spread rate. TTI is reported alongside the asset name and category, and drives the urgency classification in the dispatch alerter. TTI estimates inherit the uncertainty of the spread rate; they are suppressed in dispatch alerts when the underlying signal has collapsed (see Section 14.2).

16. Per-Pixel Fire Tracking

Since mid-April 2026, fires are tracked at the pixel level, not just the event-centroid level. Each fire event maintains a registry of individual AHI grid cells (row, col) that have been flagged as fire detections. This pixel registry drives three key behaviors:

  1. Per-pixel observations: Every 10-minute AHI frame records an observation for each active fire pixel in each tracked event, regardless of whether fire is re-detected. This produces a continuous timeseries per pixel that the Bayesian closure model (Section 8.4) uses to estimate $P(\text{active})$ per pixel.
  2. Per-pixel closure: An event closes only when all of its registered pixels have $P(\text{active}) < \theta_{\text{close}}$. This prevents premature closure when one edge of a multi-pixel fire has gone out while another is still burning.
  3. Detection deduplication: The unique constraint on observations is (event_id, obs_datetime, pixel_row, pixel_col), ensuring that each pixel-frame combination is recorded exactly once even when multiple data sources report the same pixel.

Band-gap observations (frames where AHI data is unavailable due to maintenance or incomplete S3 delivery) and LEO-sensor observations (VIIRS, MODIS) use sentinel pixel coordinates (pixel_row=-1, pixel_col=-1) to record event-level evidence without attributing it to a specific AHI grid cell.

17. Known Limitations

  1. ABI spatial resolution: At ~2 km pixel size over Northern Arizona, fires smaller than approximately 200–500 m² produce BTD anomalies below the detection noise floor for single-frame contextual detection. The CUSUM temporal detector partially mitigates this by accumulating evidence over multiple frames.
  2. Cloud model scope: The 3-state probabilistic cloud model uses four spectral features but does not incorporate visible-band reflectance (unavailable at night) or temporal cloud tracking. Multi-spectral cloud masks (e.g., CLAVR-x) with more input channels may achieve better thin cirrus discrimination. However, the quality-block architecture means cloud classification errors degrade evidence weight rather than causing hard misclassification.
  3. Sub-pixel fire characterization: The Dozier bi-spectral inversion for sub-pixel fire area and temperature[10] has been tested but produces physically plausible solutions for only ~4.5% of AHI fire pixels (Z11 pre-screening per Giglio & Schroeder[1]). It is documented for future integration as a temporal consistency feature.
  4. Location uncertainty model: The $\sqrt{n}$ scaling assumes independent, identically distributed detection errors. In practice, systematic biases (e.g., consistent view angle effects) limit the actual uncertainty reduction. Floor values mitigate this.
  5. FIRMS latency: The FIRMS NRT product has ~3 hour latency, making it useful only for retroactive confirmation, not rapid detection. DEA Hotspots (~17 min) is the faster LEO confirmation source.
  6. Night detection difficulty: At night, background BTD approaches zero for AHI pixels (no reflected solar in the MIR band), making BTD-based detection less discriminative. The night BT7-only detection path was tested but produced excessive false alarms from coastal and urban thermal anomalies; it is currently disabled pending RF classifier deployment.
  7. Absolute BT14 thresholds cannot gate fire detection at geostationary resolution: It is tempting to propose an absolute lower bound on B14 (11.2 μm longwave IR) as a physics floor for fire pixels — e.g., "real fires must have B14 ≥ 305 K." This approach fails at Himawari AHI's 2 km pixel size because fire signal lives in B07 (3.9 μm), not B14. The Planck function at 11 μm has approximately 5,600× weaker temperature sensitivity to fire-temperature hot spots than at 3.9 μm. Dozier sub-pixel radiative transfer[10] shows that a 1000 K fire occupying 0.01% of a 2 km pixel contributes only ~0.3 K to integrated B14 — well inside sensor noise — while contributing ~4–6 K to integrated B07. A 1 ha fire pushes B14 from 290 K ambient to only ~294 K; a 305 K B14 requires roughly a 4 ha fire, which rejects most early-stage ignitions. Empirically, against a 2.7M-detection production database on 2026-04-14, 95.8% of MONITORING (confirmed-real) events had max(B14) < 305 K, with a median B14 of 287.5 K and range 280–313.7 K. Detection must therefore rely on anomaly-relative features (B07 sigma deviation, BTD sigma deviation, CUSUM z-scores on BTD) and on persistence over multiple frames, not absolute temperature. Contextual Kaufman/Giglio/Maeda algorithms all use B14 strictly as a background reference and cloud mask, never as a detection gate. See docs/detection-knowledge-base.md § "Why BT14 absolute thresholds don't work at AHI 2 km resolution" for the full analysis and Dozier mixed-pixel table.

18. References

[1] Giglio, L., Schroeder, W., & Justice, C. O. (2016). "The collection 6 MODIS active fire detection algorithm and fire products." Remote Sensing of Environment, 178, 31–41. doi:10.1016/j.rse.2016.02.054
[2] Giglio, L., Descloitres, J., Justice, C. O., & Kaufman, Y. J. (2003). "An enhanced contextual fire detection algorithm for MODIS." Remote Sensing of Environment, 87(2–3), 273–282. doi:10.1016/S0034-4257(03)00184-6
[3] Schroeder, W., Oliva, P., Giglio, L., & Csiszar, I. A. (2014). "The New VIIRS 375 m active fire detection data product: Algorithm description and initial assessment." Remote Sensing of Environment, 143, 85–96. doi:10.1016/j.rse.2013.12.008
[4] Page, E. S. (1954). "Continuous inspection schemes." Biometrika, 41(1/2), 100–115. doi:10.2307/2333009
[5] Roberts, G. J., & Wooster, M. J. (2008). "Fire detection and fire characterization over Africa using Meteosat SEVIRI." IEEE Transactions on Geoscience and Remote Sensing, 46(4), 1200–1218. doi:10.1109/TGRS.2008.915751
[6] Li, F., Zhang, X., Kondragunta, S., & Csiszar, I. (2021). "Multi-scale fire detection algorithm based on temporal filtering." Remote Sensing of Environment, 255, 112260. doi:10.1016/j.rse.2020.112260
[7] Niculescu-Mizil, A., & Caruana, R. (2005). "Predicting good probabilities with supervised learning." Proceedings of the 22nd International Conference on Machine Learning, 625–632. doi:10.1145/1102351.1102430
[8] Bessho, K., Date, K., Hayashi, M., et al. (2016). "GOES-R Series Advanced Baseline Imager (ABI) Algorithm Theoretical Basis Document for Fire/Hot Spot Characterization." Journal of the Meteorological Society of Japan. Ser. II, 94(2), 151–183. doi:10.2151/jmsj.2016-009
[9] Butler, H., Daly, M., Doyle, A., Gillies, S., Hagen, S., & Schaub, T. (2016). "The GeoJSON Format." RFC 7946, IETF. doi:10.17487/RFC7946
[10] Dozier, J. (1981). "A method for satellite identification of surface temperature fields of subpixel resolution." Remote Sensing of Environment, 11, 221–229. doi:10.1016/0034-4257(81)90021-3