Version: dev

MTBS_severity

Pure-I/O data loader for MTBS (Monitoring Trends in Burn Severity) post-fire burn-severity products. Provides the time-invariant final burn-severity raster for a single fire: a thematic severity class layer (1=unburned/low … 6=non-processing-area mask) and the continuous dNBR (differenced Normalized Burn Ratio) layer, on the native Albers/geographic raster the MTBS product ships. Sourced as GeoTIFF bands of the per-fire MTBS bundle (one final product per fire — there is no temporal progression).

.esm schema
1.0.0
Source
components/earthsci_data/mtbs_severity_loader.esm

Description

Pure-I/O data loader for MTBS (Monitoring Trends in Burn Severity) post-fire burn-severity products. Provides the time-invariant final burn-severity raster for a single fire: a thematic severity class layer (1=unburned/low … 6=non-processing-area mask) and the continuous dNBR (differenced Normalized Burn Ratio) layer, on the native Albers/geographic raster the MTBS product ships. Sourced as GeoTIFF bands of the per-fire MTBS bundle (one final product per fire — there is no temporal progression).

This is a pure-I/O data-source CATALOG: it declares its source (url_template) and nothing else the 1.0.0 schema defines. It declares NO grid — esm 0.8.0 removed the loader grid/GDD-Grid descriptor outright, so the native raster geometry is documentation in the data source’s metadata — and NO variables: esm 1.0.0 moved every former loader variable onto the model parameter that consumes it, and this catalog has no consumer, so its two file_variable declarations are parked verbatim in metadata.unconsumed_file_variables (see metadata.unconsumed_file_variables_note; a shared catalog is not self-describing at 1.0.0). It performs NO reprojection and NO regridding — those are per-variable concerns of an owning regridding model, if one is ever added. MTBS is a VALIDATION reference for fire-model burned-area/extent comparison (campfire-e2e Phase E1/E2); it does NOT feed the model RHS, so it has no companion forcing wrapper — the validation harness (E2) aligns it to the comparison grid using the same ESD regridding rules.

This is a STATIC (time-invariant) dataset: there is NO temporal block, so the loader seeds CONST cadence (ess-v9a.5) — the runtime fetches the final burn-severity product once per fire and never refreshes it (kind: static). Cadence derives from the absence of temporal, orthogonal to the kind enum. Mirrors the usgs3dep_loader static-raster pattern (two variables read from one fetched product, distinguished by file_variable).

USER-ACTION (campfire-e2e plan, 2026-06-26): confirm the exact per-fire bundle URL / fire id and the MTBS citation per the program’s data-use terms (public domain, US Government work). The url_template uses the documented MTBS bundle path with a {fire_id} substitution; see metadata.access_note.

Reference

Eidenshink, J. et al. (2007). A project for monitoring trends in burn severity. Fire Ecology, 3(1), 3-21. MTBS: https://www.mtbs.gov/

Data source

Kindstatic
URL templatehttps://edcintl.cr.usgs.gov/downloads/sciweb1/shared/MTBS_Fire/data/individual_fire_data/{fire_id}/{fire_id}_mtbs.tif
Mirrorshttps://apps.fs.usda.gov/arcx/rest/services/RDW_Wildfire/MTBS_CONUS/ImageServer/exportImage?bbox={bbox_west},{bbox_south},{bbox_east},{bbox_north}&size={width},{height}&format=tiff&bboxSR=4326&imageSR=4326&pixelType=U8&f=image

Raw .esm

Raw .esm JSON (this component)
{
  "kind": "static",
  "source": {
    "url_template": "https://edcintl.cr.usgs.gov/downloads/sciweb1/shared/MTBS_Fire/data/individual_fire_data/{fire_id}/{fire_id}_mtbs.tif",
    "mirrors": [
      "https://apps.fs.usda.gov/arcx/rest/services/RDW_Wildfire/MTBS_CONUS/ImageServer/exportImage?bbox={bbox_west},{bbox_south},{bbox_east},{bbox_north}&size={width},{height}&format=tiff&bboxSR=4326&imageSR=4326&pixelType=U8&f=image"
    ]
  },
  "reference": {
    "citation": "Eidenshink, J. et al. (2007). A project for monitoring trends in burn severity. Fire Ecology, 3(1), 3-21. MTBS: https://www.mtbs.gov/",
    "url": "https://www.mtbs.gov/",
    "doi": "10.4996/fireecology.0301003"
  },
  "metadata": {
    "tags": [
      "mtbs",
      "burn_severity",
      "wildfire",
      "validation",
      "static",
      "raster",
      "dnbr"
    ],
    "native_crs_epsg": "EPSG:5070 (NAD83 / CONUS Albers Equal-Area) in the shipped product — declared here as geographic (longlat/WGS84) per the former GDD crs descriptor; the consuming coupling edge applies the Albers→target reprojection. The 0.7.0 `grid.crs` carried only {projection: longlat, datum: WGS84} (EPSG:4326), the envelope this loader REQUESTS, not the product's own Albers crs; that descriptor is preserved verbatim in native_crs_descriptor. At esm 0.8.0 the crs is documentation only — a data source no longer carries a `grid`/crs descriptor.",
    "native_resolution_m": 30,
    "severity_class_codes": {
      "1": "Unburned to Low",
      "2": "Low",
      "3": "Moderate",
      "4": "High",
      "5": "Increased Greenness (post-fire regrowth)",
      "6": "Non-Processing Area Mask"
    },
    "file_format": "GeoTIFF (per-fire MTBS bundle: thematic severity *_dnbr6.tif + continuous *_dnbr.tif)",
    "static_note": "No temporal block: kind='static' and the absence of `temporal` seed CONST cadence (ess-v9a.5). MTBS ships ONE final post-fire product per fire (no progression). The runtime fetches it once per simulation domain.",
    "use": "Validates TOTAL burned area + final extent + severity gradient (the end-state footprint), complementary to the daily NIFC perimeters (progression) and VIIRS active fire (sub-daily front timing).",
    "access_note": "MTBS distributes per-fire bundles and annual CONUS burn-severity mosaics (thematic class + dNBR) from https://www.mtbs.gov/direct-download (public domain, US Government work; cite Eidenshink et al. 2007 and the MTBS program). The url_template above uses the documented per-fire individual-fire-data path with a {fire_id} substitution (e.g. the MTBS fire id such as 'ca3995712175620181108' for the 2018 Camp Fire); the mirror is the USFS RDW_Wildfire ImageServer exportImage endpoint for a bbox-cropped CONUS mosaic. USER-ACTION: confirm the exact fire id / endpoint for the target fire and the program citation. Like the era5 loader, the toolkit does not yet resolve a local data cache (EARTHSCIDATADIR) at the URL layer (see the observed-fire framework-gaps report); populate a local cache or a file:// path until that C2 mechanism lands.",
    "user_action": "Confirm per-fire bundle URL / fire id (campfire-e2e plan §User-action). Default target: 2018 Camp Fire (MTBS id ca3995712175620181108).",
    "native_grid_family": "cartesian",
    "native_crs_descriptor": {
      "projection": "longlat",
      "datum": "WGS84"
    },
    "native_dimensions": [
      "lon",
      "lat"
    ],
    "native_dimension_extents": {
      "lon": {
        "n": "n_lon",
        "spacing": "uniform"
      },
      "lat": {
        "n": "n_lat",
        "spacing": "uniform"
      }
    },
    "native_grid_parameters": {
      "n_lon": {
        "units": "1",
        "description": "Longitude cell count, resolved from the source MTBS raster at load time (domain/fire-extent derived)."
      },
      "n_lat": {
        "units": "1",
        "description": "Latitude cell count, resolved from the source MTBS raster at load time (domain/fire-extent derived)."
      }
    },
    "native_staggering": "Not stated by the former `grid` block, which recorded family/crs/dimensions/extents/parameters only; none is asserted here. The former `grid.description` (verbatim in native_grid_description) records the ~30 m native cell size (~0.00027° at CONUS latitudes) and that cells outside the fire's mapped extent carry the non-processing-area/no-data class.",
    "native_grid_description": "Native MTBS raster expressed as a geographic (longlat/WGS84) lattice. The shipped MTBS product is a 30 m raster on an Albers Equal-Area (CONUS) projection; this loader declares the geographic envelope of the requested fire/domain and leaves any reprojection from Albers to the owning regridding model (ESD reprojection rule), consistent with the pure-IO no-reprojection rule (RFC §4.1-§4.2). Cell counts (n_lon, n_lat) are resolved from the source raster at load time; the 30 m native cell size is ~0.00027° at CONUS latitudes. Cells outside the fire's mapped extent carry the non-processing-area / no-data class.",
    "unconsumed_file_variables": {
      "burn_severity_class": {
        "file_variable": "burn_severity",
        "units": "1",
        "description": "Thematic MTBS burn-severity class (dimensionless integer code): 1 = unburned to low, 2 = low, 3 = moderate, 4 = high, 5 = increased greenness / regrowth, 6 = non-processing area mask. Read from the thematic severity band of the per-fire MTBS bundle (the *_dnbr6.tif / severity GeoTIFF). Used to validate the simulated final burned footprint and severity gradient, not the fire's day-by-day progression."
      },
      "dnbr": {
        "file_variable": "dnbr",
        "units": "1",
        "description": "Continuous differenced Normalized Burn Ratio (dNBR = NBR_prefire − NBR_postfire), scaled per the MTBS product (dimensionless index, conventionally ×1000 integer in the shipped GeoTIFF). Read from the continuous dNBR band of the same per-fire MTBS bundle (the *_dnbr.tif GeoTIFF). Shares the fetched bundle with burn_severity_class — the two variables are distinguished by file_variable, mirroring the usgs3dep_loader 'two variables from one fetched product' pattern."
      }
    },
    "unconsumed_file_variables_note": "esm 1.0.0 removed the loader `variables` map: a data source is no longer a component, and every former loader variable becomes a PARAMETER on the model that CONSUMES it, carrying `update: {kind: \"data\", source: \"<registry key>\", from: {file_variable, unit_conversion?, codes?, select?}}` with `units` and `shape` declared once on that parameter (esm-spec §8). This file is a SHARED CATALOG with NO consuming .esm — nothing in the corpus mounts it; it is read only by tools/leaves/nifc_perimeters_rasterize.py and test/observed_fire_loaders_feasibility.py — so there is no consuming parameter to carry these declarations, and the 1.0.0 DataSource (additionalProperties:false over {kind, source, temporal, determinism, reader_options, select, record_filter, extent, reference, metadata}) has no `variables` key. The map is therefore parked VERBATIM in `unconsumed_file_variables` above so that not one file_variable, unit or description is lost. This is a demotion from a structured field to metadata, NOT an equivalent: a 1.0.0 consumer still has to re-declare each entry as a parameter `update.from.file_variable` + `units` before the runtime can read this source (earthsci_ast.load_data takes `bindings` = {consuming parameter name -> DataSourceBinding}, which a catalog with no consumer cannot supply). Recorded as the 'a shared catalog is not self-describing' reversion.",
    "migration_note": "esm 0.7.0 -> 0.8.0: removed the `grid` block (family/crs/dimensions/extents/parameters/description), which no schema at or after 0.8.0 permits — 0.8.0 deleted the native-grid descriptor outright (esm-spec §8.4). Nothing was dropped: `family` → native_grid_family; `crs` → native_crs_epsg + native_crs_descriptor (verbatim); `dimensions` → native_dimensions; `extents` (per-dimension cell count + spacing) → native_dimension_extents; `parameters` (the runtime-resolved n_lon/n_lat cell-count parameters, with their units and descriptions) → native_grid_parameters; `description` → native_grid_description (verbatim). Native grid geometry is now ordinary data — a source exposes its coordinates/connectivity/metric arrays as ordinary `file_variable`s bound to consuming parameters, and reprojection/regridding are ordinary `aggregate` coupling expressions (esm-spec §8.6). No other field changed. esm 0.x -> 1.0.0: renamed the top-level `data_loaders` key to `data_sources` and removed this source's `variables` map — see unconsumed_file_variables_note. A data_sources-only catalog (no `models`) is a valid 1.0.0 document and loads through earthsci_ast.load; it is simply not mountable as a subsystem, which is correct — a data source is not a component, not a coupling endpoint and not a scoped-name path root."
  }
}