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.

Band-integrated forward model + plume injection

Band integration, forward models & nB-LUT plume injection

The line-by-line LUT from notebook 01 gives σ(ν,T,P)\sigma(\nu, T, P) at fine wavenumber resolution. Real multispectral instruments observe band-integrated radiance — each band bb collects photons across a wavelength window weighted by its Spectral Response Function (SRF) fb(λ)f_b(\lambda). This notebook closes the loop from the HR LUT to per-pixel band radiance via three steps:

  1. Forward models side-by-side. Three flavours of Beer–Lambert — exact, Maclaurin, and Taylor — exposed through plumax.radtran.forward. We plot them at a single wavenumber to see where the linearisations break.

  2. SRF band integration. Build a Gaussian SRF at two S2-like bands (B11 @ 1610 nm, B12 @ 2190 nm) and apply it to a per-wavelength transmittance spectrum.

  3. Normalised-brightness LUT. Pre-tabulate nBb(ΔX)=∫fb(λ) exp⁡[−AMF⋅σ(λ)⋅ΔX] dλ / ∫fb(λ) dλnB_b(\Delta X) = \int f_b(\lambda)\, \exp[-\mathrm{AMF}\cdot\sigma(\lambda)\cdot\Delta X]\,d\lambda\,/\,\int f_b(\lambda)\,d\lambda over a 1-D grid of column enhancements, then apply it per-pixel to a clean synthetic scene via inject_plume.

Notebook 05 builds on this to do a matched-filter retrieval. The physics is derived in 00_hapi_lut_derivation.md (same Beer–Lambert start) and motivated by Orbio’s Project Eucalyptus Radiative_Transfer.md — which argues that at the single-slab, band-integrated level the nB-LUT cancels most of the aerosol / albedo ignorance to first order.

LUT spans 4000-4500 cm^-1 (λ ≈ 2500-2222 nm), 10000 points.

1. Atmospheric state and viewing geometry

Mid-troposphere state — same as notebook 03. The ObservationGeometry dataclass packs the solar / viewing angles plus the single-slab vertical path into one immutable object; the air-mass factor is derived from the plane-parallel formula.

AMF = 2.155

2. Forward-model flavours

All three models return a ForwardResult(radiance, jacobian, transmittance). Below we sweep ΔVMR\Delta\mathrm{VMR} at the strongest CH4_4 absorption line in our LUT (~4300 cm⁻¹, ≈ 2326 nm) and plot the normalised radiance Lnorm=L/LbgL_\text{norm} = L/L_\text{bg}. The Maclaurin-1 variant is the linear matched-filter assumption; the Taylor-1 around the background collapses to the same at first order (we show only Maclaurin here). The nonlinear curve exposes where linearisations break.

Representative line: ν = 4267.1 cm^-1 (λ = 2343.5 nm), σ = 8.52e-21 cm²/molec
<Figure size 700x400 with 1 Axes>

The three curves agree to within a fraction of a percent up to ~0.2 ppm, after which the exact Beer–Lambert model bends below the linear approximation. Order-2 Maclaurin tracks the nonlinear curve to ~0.5 ppm. Beyond that the expansions diverge quickly — but 0.5 ppm is already several times larger than the per-pixel enhancement in a typical oil-and-gas leak, so the matched filter’s linear assumption is safe in the ordinary regime.

3. Synthetic multispectral instrument and SRF

InstrumentSpec describes a two-band Gaussian-SRF instrument patterned on Sentinel-2 B11/B12 (but nothing in the radtran package is S2-specific — swap in measured SRFs via SpectralResponseFunction(srf_type='custom', custom_srfs=...)).

<Figure size 700x300 with 1 Axes>

4. Normalised-brightness LUT

The nB-LUT pre-tabulates, for each band,

nBb(ΔX)  =  ∫fb(λ) exp⁡ ⁣[−AMF⋅σ(λ)⋅ΔX] dλ∫fb(λ) dλ ,ΔX∈[0,Xmax] mol/m2.\mathrm{nB}_b(\Delta X) \;=\; \frac{\int f_b(\lambda)\, \exp\!\bigl[-\mathrm{AMF}\cdot\sigma(\lambda)\cdot\Delta X\bigr]\,d\lambda}{\int f_b(\lambda)\,d\lambda}\,, \qquad \Delta X \in [0, X_\text{max}]\ \text{mol/m}^2.

Per-pixel injection is then nB_b(ΔX_map) — one linear interpolation per pixel per band, irrespective of how many wavenumber points the underlying σ(ν) LUT has.

nB LUT: 2 bands × 2001 ΔX points (0 to 50 mol/m²)
<Figure size 700x400 with 1 Axes>

B12 absorbs noticeably more than B11 — consistent with the 2190 nm window overlapping the stronger CH4_4 ν3\nu_3 Q-branch.

5. Plume injection into a synthetic scene

Build a Gaussian plume column map via gauss_plume.simulate_plume, then inject into a clean, unit-reflectance two-band scene. In a real pipeline this scene would be a radiance-rescaled Sentinel-2 tile; the injection mathematics (multiply clean B11/B12 by the band-integrated nB factor) is identical.

ΔX map shape: (61, 121), peak 29.76 mol/m²
<Figure size 1600x350 with 8 Axes>

The B12/B11 ratio plot is how classical matched-filter retrievals surface the plume footprint: methane absorbs more strongly in B12 than B11 so the ratio dips below 1 inside the plume. In notebook 05 we replace the visual check with a quantitative matched-filter retrieval that estimates the per-pixel column enhancement.

6. lookup_nb directly — diagnostic view

inject_plume is a thin wrapper around lookup_nb + multiplication. The lookup itself is useful standalone for diagnostics: the per-band nB map shows where each band “sees” the plume most strongly.

<Figure size 1000x350 with 4 Axes>

Both bands drop below 1 where the plume is dense, but the B12 dip is sharper. The next notebook uses this asymmetry to quantify ΔX\Delta X via a matched-filter retrieval.