2 The basics: what is classified, and how it is scored
The unit is one cell on one day. A cell is a 0.01° square, about 1.1 km across. For every cell on every day, each satellite product says one of three things: flood, dry, or couldn’t see. Fusion turns the three products’ reports into a probability P, and calls the cell flooded when P ≥ 0.5. A gold map, on the day it was made, labels each cell it examined flooded or dry; cells it did not examine have no label.
Only labelled cells on map days are scored. A map day is a day with a gold map. Scoring compares the product’s call with the gold label, cell by cell, on those days only:
| gold: flooded | gold: dry | |
|---|---|---|
| product: flood | hit | false alarm |
| product: dry or couldn’t see | miss | correct dry |
Cell level: counts, summed. Hits, misses and false alarms are counted over every labelled cell, every map day and every event, then:
- recall = hits ÷ (hits + misses): the share of gold-flooded cells the product flagged. The denominator is all 404,014 gold flooded cell-days in the 170 events.
- precision = hits ÷ (hits + false alarms): the share of the product’s flood calls that gold confirms. The denominator is the product’s own flood calls on labelled cells.
- F1 combines the two. Because counts are summed, a flood of 80,000 cells weighs 800 times a flood of 100.
Event level: one verdict per event. An event is caught if, on some day from 3 days before its first map to 3 days after its last, the product flags at least 10% of the cells gold flooded (and at least 5). It is a false event if the same rule fires on days 30 to 10 before the first map, when no flood was mapped. Both are reported as shares of the 148 events with at least 5 flooded cells. Here every event counts once, whatever its size.
Which days are used for what:
| days | what they give |
|---|---|
| map days | the gold labels; all recall, precision and F1 |
| 30 days before and 60 after each event | dry labels for fitting each product’s false-alarm rate (cells flooded on a map day get no label); the false-event check |
| ordinary days, anywhere else | no gold, so not scored. Only the base flood rate comes from them, from a random sample of places with no mapped event |
Two rates that come up often, with their denominators:
- 12% of open-land cells are flooded on map days = 355,927 gold-flooded ÷ 2,856,112 labelled floodable open-land cell-days on map days (all land types: 404,014 ÷ 4,387,050 = 9.2%). This is the flood rate inside mapped floods, on the days they were mapped.
- 0.2% on ordinary days = 1,493 ÷ 647,443: in 30 random places with no mapped event, over every day of 2023–2025, the share of open-land cell-days GFM saw on which GFM called flood. There are no gold maps there, so GFM stands in. Fusion uses this as the starting probability for every cell (the base rate).
Why the gap between them matters. Precision depends on how common flood is where you score. With the same false-alarm rate, a flood 60 times rarer gives far lower precision. Every precision on this page is from map days inside mapped floods; precision on ordinary days has not been measured yet (Next steps, 6).
2.1 From pixels to cells: how every layer lands on one grid
Nothing is compared at a product’s own resolution. Every layer, from 20 m radar to 9 km microwave, is first put onto the same grid of 0.01° cells (about 1.1 km). “Pixel” always means a product’s own native pixel; “cell” always means our grid square. The rules below are the whole resampling; each lives in configs/fusion.yaml under the key shown.
| layer | native pixel | how it reaches a cell | cell is observed when | cell is positive when | config |
|---|---|---|---|---|---|
| GFM flood | 20 m, read at 80 m (every 4th pixel) | each pixel goes to the cell holding its centre; about 190 pixels per cell | at least 50% of the expected pixels were evaluated (not excluded, not flagged) | at least 30% of the observed pixels are flood | sources.gfm |
| VIIRS flood map | 375 m | same: pixel centre to cell; about 9 pixels per cell | at least 50% of its pixels observed (not cloud, shadow, snow or no data) | at least 30% of the observed pixels are flood | sources.viirs |
| FloodScan SFED | about 9 km (300 arcsec): one value, the flooded fraction | each cell takes the FloodScan pixel that contains the cell’s centre; about 81 cells share one pixel | the region’s file exists for that day | that pixel’s flooded fraction is at least 30% | sources.floodscan |
| GFDS | about 9 km | same containing-pixel rule; the signal is turned into a flooded fraction against GFDS’s long-term mean | the day’s file exists | that fraction is at least 30% | sources.gfds |
| CYGNSS watermask (experiment) | 0.01°, but offset by half a cell | each cell is the average of the four CYGNSS pixels at its corners, a quarter each | at least 50% of that area has data | at least 30% of the observed area is water | experiment_cygnss.py |
| gold map (flood polygons and examined area) | vector | drawn onto a 0.001° grid: 10 × 10 = 100 sub-pixels per cell | at least 50% of the sub-pixels are inside the examined area (otherwise no label) | at least 30% of the examined sub-pixels are flood; “flood possible” above 30% gives no label | gold |
| HAND (floodable) | 30 m, read at every 4th pixel | fraction of samples per cell | always | at least 30% of the cell is under 15 m above the nearest stream | static.hand |
| permanent water (JRC occurrence) | 30 m, every 4th pixel | fraction per cell | always | removed from the domain if at least 50% of the cell is water at least 90% of the time | static.gsw |
| land type (ESA WorldCover) | 10 m, every 4th pixel | fraction per cell | always | urban if built-up is at least 20%; else vegetated if trees at least 30%; else open | static.worldcover |
| normally wet (JRC monthly recurrence) | 30 m: exactly 40 × 40 pixels per cell | fraction per cell and calendar month | always | at least 30% of the pixels were water in that month in at least half the years | baseline |
Why the same 50% and 30% everywhere. Half observed before a cell counts as seen, and 30% flooded before it counts as flood, are applied to every product and to gold alike, so no product is held to a different standard than the answer key. The cost is that a flood covering less than 30% of a cell is invisible to everyone, gold included.
What this means for the coarse products. One FloodScan or GFDS pixel sets about 81 of our cells at once, so their hits and false alarms come in 9 km blocks (visible as squares in the maps in this book). They are scored cell by cell like everything else, which is fair to them where a flood is large and harsh where it is narrow.
Days. Every layer is daily except the static ones (HAND, permanent water, land type: fixed) and normally wet (one map per calendar month). A product that has no file for a day gives “couldn’t see” on every cell, never dry.