Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Tier V.A — Instantaneous emission estimation

UNEP
IMEO
MARS

Question: Given one satellite overpass with a detected plume, what is the posterior over the source’s instantaneous emission rate QQ?

This sub-page is the glue between the per-event physics tiers (I–IV) and the population tier (V). It defines the formal interface that turns a per-event posterior into evidence for the population-scale fit. The cross-tier payload schema is pinned in the Tier V index; this page formalises how each payload is converted into a mark-likelihood contribution.


Two regimes of “instantaneous Q”

A. Full-physics posterior (Tier I / II / III output)

When you have radiance / column data and the wind field, run the per-event inversion described in Tier I (or II / III for richer transport):

p(Qoverpassi)    Li(Q)πper-event(Q),Li(Q)  =  p(observationiQ)p(Q \mid \text{overpass}_i) \;\propto\; L_i(Q) \cdot \pi_\text{per-event}(Q), \qquad L_i(Q) \;=\; p(\text{observation}_i \mid Q)

This is the gold-standard per-event evidence — calibrated, with proper UQ, accounting for wind, transport, and instrument noise. Both Li(Q)L_i(Q) and the prior πper-event(Q)\pi_\text{per-event}(Q) are exposed downstream because the population fit needs to divide out the prior (see § Mark likelihood below).

B. Catalog QQ with wind-source consistency rescaling

For published plume catalogs (IMEO, Carbon Mapper alerts Carbon Mapper, 2024, Tanager monthly reports, GHGSat releases GHGSat Inc., 2016Jervis et al., 2021), what’s available is typically a single point estimate of QQ (mass flux, t/h or kg/s) per detection plus a per-event uncertainty estimate.

Catalog QQ is not Q/UQ/U — it’s already wind-multiplied. Operational catalogs use the IME (Integrated Mass Enhancement) method Varon et al., 2018: QcatalogIMEUcatalog/LplumeQ_\text{catalog} \approx \text{IME} \cdot U_\text{catalog} / L_\text{plume}, where UcatalogU_\text{catalog} is the wind value the catalog producer used at retrieval time. When fusing catalogs that used different wind sources (IMEO uses GEOS-FP, Tanager uses HRRR, Carbon Mapper uses ECMWF, GHGSat uses its 1 km downscaled product), inconsistent winds give inconsistent QQ. The fix is wind-source consistency rescaling:

Qcorrected  =  QcatalogUtargetUcatalogQ_\text{corrected} \;=\; Q_\text{catalog} \cdot \frac{U_\text{target}}{U_\text{catalog}}

with UtargetU_\text{target} from a single agreed-upon reanalysis (default: ERA5).

Per-event uncertainty comes from controlled-release calibration. Sherwin et al. (2024) report 1σ log-scale errors per instrument:

Table (1):Per-instrument 1σ (log-scale) per-event errors from Sherwin et al. 2024 controlled-release flights.

InstrumentPer-event 1σ (log scale)
TROPOMI (Veefkind et al., 2012)~0.50 (≈ ±50%)
GHGSat (GHGSat Inc., 2016)~0.25 (≈ ±25%)
EMIT (Green & others, 2022)~0.30
Tanager (Carbon Mapper, 2024)~0.30

Mark likelihood — importance-weighted Monte Carlo

The TMTPP mark-likelihood contribution at detection ii is (see Tier V index § TMTPP foundations):

p(detectedif,λ,Pd)  =  Pd(Q)Li(Q)f(Q)dQp(\text{detected}_i \mid f, \lambda, P_d) \;=\; \int P_d(Q)\, L_i(Q)\, f(Q)\, \mathrm{d}Q

with Li(Q)=p(observationiQ)L_i(Q) = p(\text{observation}_i \mid Q) the per-event likelihood, not the posterior. In sample-based practice (per-event posterior samples Qi(s)p(Qobservationi)Q_i^{(s)} \sim p(Q \mid \text{observation}_i)):

p(detectedif,λ,Pd)    1Ss=1SPd(Qi(s))f(Qi(s))πper-event(Qi(s))p(\text{detected}_i \mid f, \lambda, P_d) \;\approx\; \frac{1}{S}\, \sum_{s=1}^{S}\, P_d(Q_i^{(s)})\, \frac{f(Q_i^{(s)})}{\pi_\text{per-event}(Q_i^{(s)})}

The ratio f/πper-eventf / \pi_\text{per-event} is the importance weight that re-points the per-event posterior at the population mark distribution.

Three implementation regimes — with importance correction in each

Table (2):Mark-integration regimes by per-event posterior representation.

RegimePer-event inputMark integration
PointQ^i\hat{Q}_i (MAP / median)Pd(Q^i)f(Q^i)/πper-event(Q^i)P_d(\hat{Q}_i) \cdot f(\hat{Q}_i) / \pi_\text{per-event}(\hat{Q}_i); ignores per-event uncertainty
Gaussian summary(μlogQ,σlogQ2)(\mu_{\log Q}, \sigma^{2}_{\log Q}) (lognormal)Closed form when ff is a power-law: QαLogNormal(Qμ,σ2)dQ=exp(αμ+12α2σ2)\int Q^{-\alpha}\, \operatorname{LogNormal}(Q \mid \mu, \sigma^{2})\, \mathrm{d}Q = \exp(-\alpha\mu + \tfrac{1}{2}\alpha^{2}\sigma^{2}). The full integrand requires a PdP_d model — for sigmoidal POD with logistic form, the integral is tractable via Gauss–Hermite quadrature (≤ 10 nodes for 4-decimal accuracy)
Full posteriorsample set {Qi(s)}\{Q_i^{(s)}\} from Tier I–IV MCMC(1/S)sPd(Qi(s))f(Qi(s))/πper-event(Qi(s))(1/S)\, \sum_s P_d(Q_i^{(s)}) \cdot f(Q_i^{(s)}) / \pi_\text{per-event}(Q_i^{(s)}) — the importance-weighted MC estimator

Each row evaluates the same Pdf/πP_d \cdot f / \pi integrand; the only difference is the per-event posterior representation.

Regime selection rule

def pick_regime(per_event: PosteriorPayload, mark_class: type[MarkDistribution]) -> Regime:
    cv = per_event.coefficient_of_variation()
    if cv < 0.20 and mark_class.is_smooth_on_scale(cv):
        return "point"
    elif cv < 0.50 and mark_class in CONJUGATE_FAMILIES:
        return "gaussian"
    else:
        return "full"      # CV > 0.50 (detection-floor events), multimodal posteriors

Operational rule:


Detection-floor and non-detection — explicit handling

Detected events with posterior mass below the threshold

The importance-weighted MC handles this automaticallyPd(Q(s))P_d(Q^{(s)}) is small for small Q(s)Q^{(s)} so the contribution is naturally downweighted. No special code path. Just don’t point-summarise these events; promote to Full-posterior regime.

Non-detection events (catalog gaps)

Non-detections do not flow through the per-event payload — there’s no posterior to ingest. They contribute through the integrated thinned-rate term in the TMTPP likelihood:

0Tλ(t)[Pd(Q)f(Q)dQ]dt- \int_{0}^{T} \lambda(t) \left[\int P_d(Q)\, f(Q)\, \mathrm{d}Q\right] \mathrm{d}t

What the cross-tier interface needs from the catalog: per-instrument overpass coverage (which times each instrument was looking at the basin), so the integral can be computed correctly.

The catalog ingestion module owns the distinction between “non-detect” and “noisy-detect-near-floor” — it’s a catalog/ingestion concern, not a per-event-payload concern.


Multi-source per overpass

Tier I Step 6 (RJMCMC), Tier IV §1 (K=nsourcesK = n_\text{sources} first-class), and Tier V index all assume K>1K > 1 is supported. The mark-likelihood contribution at a multi-source overpass is a product over sources, assuming within-overpass independence:

p(detectionsif,)    k1Ss=1SPd(Qk(s))f(Qk(s))πper-event(Qk(s))p(\text{detections}_i \mid f, \dots) \;\approx\; \prod_{k} \frac{1}{S}\sum_{s=1}^{S}\, P_d(Q_k^{(s)})\, \frac{f(Q_k^{(s)})}{\pi_\text{per-event}(Q_k^{(s)})}

Per-event payload for Ki>1K_i > 1 is a list of KiK_i sub-payloads, each with its own samples / summary / prior. v2 relaxes within-overpass independence — sources sharing a met realisation have correlated marks.

Per-event payload schema (full)

Pinned in the Tier V index; reproduced here for the implementation cycle:

@dataclass
class PerEventPayload:
    sources: list[SourcePayload]               # K_i entries; K_i ≥ 1
    instrument_id: str                         # per-satellite POD dispatch
    t_detection: float                         # UTC seconds, for λ(t)
    quality: dict                              # bitmask from Tier I–IV

@dataclass
class SourcePayload:
    posterior_samples: jax.Array | None        # (S,) draws of Q
    posterior_summary: tuple[float, float] | None   # (μ_logQ, σ_logQ) lognormal shorthand
    per_event_prior_logpdf: Callable[[float], float]  # required for importance correction
    x0_posterior: tuple[jax.Array, jax.Array]  # (mu_xy, Cov_xy) — for spatial Cox v2 + de-dup

per_event_prior_logpdf is the load-bearing field — without it the importance correction can’t be done.


Catalog ingestion — heterogeneous sources

Per-source ingestion adapters because schemas, units, wind sources, and quality conventions differ:

Table (3):Catalog ingestion — schema, units, wind source, quality flags per provider.

CatalogFormatUnitsWind sourceQuality flags
IMEO (UNEP)CSVt/hGEOS-FPprovider-supplied
Tanager monthly (Carbon Mapper, 2024)parquetkg/sHRRRconfidence tier
Carbon Mapper alerts (Carbon Mapper, 2024)JSONkg/hECMWFper-pixel mask
GHGSat releases (GHGSat Inc., 2016)CSVt/h1-km downscaled GHGSat productbinary detection

Each ingestion adapter normalises to the internal PerEventPayload, applies wind-source consistency rescaling against UERA5U_\text{ERA5}, and emits a unified catalog with explicit provenance fields.

De-duplication

Same physical leak detected by multiple satellites → multiple catalog rows. v1’s independence assumption (see Tier V index § Independence assumption) requires de-duplication before the population fit. Default rule: spatial-temporal clustering with thresholds (Δd5 km,Δt12 h)(\Delta d \leq 5\text{ km}, \Delta t \leq 12\text{ h}). Multi-instrument detections of the same cluster either collapse to one event with a fused per-event payload (preferred, when posteriors are compatible) or to the highest-confidence detection (fallback).


Module layout

Table (4):Tier V.A module layout — concern, target module, status.

ConcernModuleStatus
Per-event posterior (Tier I)gauss_plume.inference✓ — needs to emit per_event_prior_logpdf
Per-event posterior (Tier II/III)assimilation.solve🚧
Per-event posterior export adaptertier-specific posterior_export modules
Per-event payload summariserplume_simulation.population.adapter.summariser
Per-event prior recallplume_simulation.population.adapter.prior_recall
Importance-weight calculatorplume_simulation.population.adapter.importance
Regime selectorplume_simulation.population.adapter.regime
De-duplication / spatial-temporal clusteringplume_simulation.population.adapter.dedup
Wind-source consistency rescalingplume_simulation.population.proxy.wind_rescale
Catalog ingest — IMEOplume_simulation.population.ingest.imeo
Catalog ingest — Tanagerplume_simulation.population.ingest.tanager
Catalog ingest — Carbon Mapperplume_simulation.population.ingest.carbon_mapper
Catalog ingest — GHGSatplume_simulation.population.ingest.ghgsat
Per-instrument overpass coverage (for non-detection integral)plume_simulation.population.ingest.coverage

Validation strategy


Open questions

References
  1. Carbon Mapper. (2024). Carbon Mapper: airborne and satellite imaging spectroscopy for greenhouse gas monitoring. https://carbonmapper.org/
  2. GHGSat Inc. (2016). GHGSat WAF-P imaging spectrometer constellation. https://www.ghgsat.com/
  3. Jervis, D., McKeever, J., Durak, B. O. A., Sloan, J. J., Gains, D., Varon, D. J., Ramier, A., Strupler, M., & Tarrant, E. (2021). The GHGSat-D imaging spectrometer. Atmospheric Measurement Techniques, 14(3), 2127–2140. 10.5194/amt-14-2127-2021
  4. Varon, D. J., Jacob, D. J., McKeever, J., Jervis, D., Durak, B. O. A., Xia, Y., & Huang, Y. (2018). Quantifying methane point sources from fine-scale satellite observations of atmospheric methane plumes. Atmospheric Measurement Techniques, 11(10), 5673–5686. 10.5194/amt-11-5673-2018
  5. Veefkind, J. P., Aben, I., McMullan, K., Förster, H., de Vries, J., Otter, G., Claas, J., Eskes, H. J., de Haan, J. F., Kleipool, Q., & others. (2012). TROPOMI on the ESA Sentinel-5 Precursor: a GMES mission for global observations of the atmospheric composition for climate, air quality and ozone layer applications. Remote Sensing of Environment, 120, 70–83.
  6. Green, R. O., & others. (2022). EMIT: Earth Surface Mineral Dust Source Investigation. https://earth.jpl.nasa.gov/emit/