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.

The SBMP, MBSP and MBMP family

radtrax · 2 · Multi-band and multi-pass methane retrievals, from the radiative transfer equation to the double difference

Abstract

Sentinel-2 sees methane as a dip in band 12 (2.2 μm), but so does a darker patch of ground. The single-band multi-pass (SBMP), multi-band single-pass (MBSP) and multi-band multi-pass (MBMP) retrievals remove the ground in three ways: compare two dates, compare two bands, or both. This page merges two derivations of the family, from the radiative transfer equation to the double difference, and runs every method on one synthetic two-pass scene with the nuisances the derivations name. A stable mineral patch, a wetted field, a patch whose spectral ratio changes, a 5 % scene-wide brightening and a 1 % water-vapour change are all in it. The chain holds: MBMP cancels everything but the patch whose band ratio changed, which reads as 0.039 kg/m² of methane. Four corrections come out of the run:

  • Fit the scale factor on background pixels. Fitted over every pixel, as one derivation does, the plume moves it by 0.31 % and MBMP loses 11 % of the plume’s mass.

  • Invert with the band table, not a slope. A linear inversion in m Δαm\,\Delta\alpha recovers 91 % of the mass; the exact two-band table 99 %.

  • Band 11 absorbs. Setting σ11=0\sigma_{11} = 0 and using σˉ12\bar\sigma_{12} as the slope, as the other derivation does, recovers 78 %.

  • geotoolz’s SBMP is an MBMP. It takes two bands and two passes, and without per-pass scale factors it reads the 1 % water-vapour change as a 0.013 kg/m² offset.

Keywords:radtraxMBMPMBSPSBMPSentinel-2methane retrieval

The radiative transfer equation in the SWIR

TL;DR. Two terms of the radiative transfer equation vanish in the shortwave infrared, and what is left integrates to Beer–Lambert.

Problem. For the intensity IλI_\lambda in a plane-parallel atmosphere,

μdIλdτλ=Iλ−Jλ,\mu \frac{dI_\lambda}{d\tau_\lambda} = I_\lambda - J_\lambda ,

with μ=cos⁡θ\mu = \cos\theta, τλ\tau_\lambda the optical depth and JλJ_\lambda the source function, emission plus scattering into the beam. Between 1.6 and 2.3 μm both are small. Thermal emission: a 300 K surface emits 2×10−42\times10^{-4} of the sunlight it reflects at 2.2 μm (albedo 0.2, θs=35°\theta_s = 35°). Rayleigh scattering: its optical depth falls as λ−4\lambda^{-4}, 16 times weaker at 2 μm than at 1 μm, and is 3.7×10−43.7\times10^{-4} in band 12. With Jλ→0J_\lambda \to 0, (1) reduces along the path ss to

dIλds=−σλ n(s) Iλ,\frac{dI_\lambda}{ds} = -\sigma_\lambda\, n(s)\, I_\lambda ,

with σλ\sigma_\lambda the absorption cross-section and nn the absorber’s density. Integrating (2) down to a Lambertian surface of albedo AλA_\lambda and back up, through the column Ω=∫n dz\Omega = \int n\, dz along the slant paths, it gives the TOA reflectance

Rλ=πLλEλ,⊙cos⁡θs=Aλ exp⁡(−m σλ Ω),m=1cos⁡θs+1cos⁡θv,R_\lambda = \frac{\pi L_\lambda}{E_{\lambda,\odot} \cos\theta_s} = A_\lambda\, \exp(-m\, \sigma_\lambda\, \Omega) , \qquad m = \frac{1}{\cos\theta_s} + \frac{1}{\cos\theta_v} ,

where LλL_\lambda is the radiance at the sensor, Eλ,⊙E_{\lambda,\odot} the solar irradiance and mm the geometric air-mass factor, as in radtrax · 1. Every pixel has two unknowns per wavelength, AλA_\lambda and Ω\Omega; the rest of the page is about removing AλA_\lambda.

1
2
3
4
5
6
# Shapes: scalars; λ in μm
# B_λ(T) = 2hc² / λ⁵ / (exp(hc / λkT) − 1)
planck(2.2, 300.0) / L_reflected      # → 2.0 × 10⁻⁴           user
# τ_R(λ) ≈ 0.008569 λ⁻⁴ (1 + 0.0113 λ⁻² + 0.00013 λ⁻⁴)
tau_rayleigh(1.0) / tau_rayleigh(2.0) # → 16.1                 user
tau_rayleigh(2.2)                     # → 3.7 × 10⁻⁴           user

The two dropped terms, in numbers, from a real run.

The band model and its linearisation

TL;DR. Average over the band, split the column into background and plume, and see how far a straight line carries.

Problem. Band bb integrates over its spectral response fb(λ)f_b(\lambda). With the albedo flat across the band, Rb=Ab Tb(Ω)R_b = A_b\, \mathcal{T}_b(\Omega), where Tb\mathcal{T}_b is the band average of e−mσλΩe^{-m \sigma_\lambda \Omega}, the exact band model of radtrax · 1. Split Ω=Ωbg+ΔΩ\Omega = \Omega_{\text{bg}} + \Delta\Omega, with Ωbg=0.0109\Omega_{\text{bg}} = 0.0109 kg/m² (1.9 ppm). The exact plume optical depth of band bb is τb(ΔΩ)=−ln⁡[Tb(Ωbg+ΔΩ)/Tb(Ωbg)]\tau_b(\Delta\Omega) = -\ln[\mathcal{T}_b(\Omega_{\text{bg}} + \Delta\Omega) / \mathcal{T}_b(\Omega_{\text{bg}})], and its tangent at the background is the sensitivity

αb=−1m∂ln⁡Tb∂Ω∣Ωbg,Rb≈Ab Tb(Ωbg)⏟Rb0 e−m αb ΔΩ.\alpha_b = -\frac{1}{m} \frac{\partial \ln \mathcal{T}_b}{\partial \Omega} \bigg|_{\Omega_{\text{bg}}} , \qquad R_b \approx \underbrace{A_b\, \mathcal{T}_b(\Omega_{\text{bg}})}_{R_b^0}\, e^{-m\, \alpha_b\, \Delta\Omega} .
1
2
3
4
5
6
7
8
9
10
11
# Shapes: G = 100,000 wavelengths (0.01 nm); m = 2.225
srf_s2 = read_srf("S2A")         # 1 nm table, one column per band  today
# f_b(λ) on the 0.01 nm grid, zero outside the table          (G,) each
f11 = np.interp(WL, srf_s2.index, srf_s2["B11"], left=0, right=0)  # user
f12 = np.interp(WL, srf_s2.index, srf_s2["B12"], left=0, right=0)  # user
# σ̄_b = ⟨σ⟩_b: 0.040 and 0.400 m²/kg (chosen)
# α_b = −(1/m) ∂ ln T_b / ∂Ω at Ω_bg       → 0.0398, 0.3953  user
# m α₁₂ ΔΩ / τ₁₂(ΔΩ) at ΔΩ = 0.3 kg/m²     → 1.16           user
# nB_b(ΔX) = ⟨exp(−m σ ΔX)⟩_b, no background         (181,)
nb = build_nb_lut(ds, srf, T_K=280, p_atm=0.8, amf=m)       # today
# −ln nB₁₂ / τ₁₂ at 0.3 kg/m²                → 1.011          user

The band sensitivities and the linear range, from a real run.

αb\alpha_b sits just below σˉb\bar\sigma_b, because the background has already darkened the strongest line cores. At 0.3 kg/m² the straight line is 16 % above the exact optical depth, the curve of growth. Band 11, the 1.66 μm band’s edge, absorbs a tenth as much as band 12 on this spectrum (a modelling choice; it is not zero on real spectra either). plumax’s band table, nB, integrates the plume without the background column, which overstates band 12’s plume optical depth by 1.1 %.

Three ways to remove the surface

TL;DR. Ratio across passes (SBMP), across bands (MBSP), or both (MBMP); each ratio cancels what it assumes is constant.

Problem. Write (4) for bands 11 and 12, on a plume pass (p)(p) and a plume-free reference pass (r)(r) over the same pixels. The three estimators are:

SBMP:s=−ln⁡csR12(p)R12(r)=τ12(ΔΩ)+ln⁡csA12(p)A12(r),MBSP:s=−ln⁡(1+δ(p)),δ=c R12R11−1=τ12−τ11+ln⁡c A12 T12bgA11 T11bg,MBMP:s=−ln⁡1+δ(p)1+δ(r)=τ12−τ11+ln⁡c(p)r(p)c(r)r(r),r=A12A11.\begin{aligned} \text{SBMP:}\quad & s = -\ln \frac{c_s R_{12}^{(p)}}{R_{12}^{(r)}} = \tau_{12}(\Delta\Omega) + \ln\frac{c_s A_{12}^{(p)}}{A_{12}^{(r)}} , \\ \text{MBSP:}\quad & s = -\ln(1 + \delta^{(p)}) , \quad \delta = \frac{c\, R_{12}}{R_{11}} - 1 = \tau_{12} - \tau_{11} + \ln\frac{c\, A_{12}\, \mathcal{T}_{12}^{\text{bg}}}{A_{11}\, \mathcal{T}_{11}^{\text{bg}}} , \\ \text{MBMP:}\quad & s = -\ln \frac{1 + \delta^{(p)}}{1 + \delta^{(r)}} = \tau_{12} - \tau_{11} + \ln\frac{c^{(p)} r^{(p)}}{c^{(r)} r^{(r)}} , \quad r = \frac{A_{12}}{A_{11}} . \end{aligned}

Each scale factor is a least-squares fit through the origin over background pixels: csc_s from R12(r)≈csR12(p)R_{12}^{(r)} \approx c_s R_{12}^{(p)}, and cc per pass from R11≈c R12R_{11} \approx c\, R_{12}. The leftover log is what each method assumes away. SBMP needs the band-12 albedo unchanged between passes, up to one scene-wide factor. MBSP needs the band ratio rr the same everywhere in the scene, up to cc. MBMP needs only rr unchanged at each pixel between passes, up to one scene-wide factor per pass: it is a difference in differences, across bands and then across dates. The column comes from inverting the exact table, ΔΩ=τ12−1(s)\Delta\Omega = \tau_{12}^{-1}(s) for SBMP and ΔΩ=g−1(s)\Delta\Omega = g^{-1}(s) with g=τ12−τ11g = \tau_{12} - \tau_{11} for MBSP and MBMP, or, to first order, s/(m α12)s / (m\, \alpha_{12}) and s/(m Δα)s / (m\, \Delta\alpha) with Δα=α12−α11\Delta\alpha = \alpha_{12} - \alpha_{11}.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Shapes: obs, ref (2, 200, 200) = (B11, B12) × (H, W)
# c = Σ x y / Σ x² over background pixels                 () per fit
c_s = fit_c(R12r, R12p, bg)                                # user
c_p, c_r = fit_c(R11p, R12p, bg), fit_c(R11r, R12r, bg)    # user
# δ = c R₁₂ / R₁₁ − 1, per pass               (200, 200) → (200, 200)
d_p, d_r = c_p * R12p / R11p - 1, c_r * R12r / R11r - 1    # user
# ΔΩ = τ₁₂⁻¹(−ln(c_s R₁₂ / R₁₂′))              (200, 200) → (200, 200)
sbmp = invert(-np.log(c_s * R12p / R12r), tau12_tab)       # user
# ΔΩ = g⁻¹(−ln(1 + δ))                          (200, 200) → (200, 200)
mbsp = invert(-np.log1p(d_p), g_mb)                        # user
# ΔΩ = g⁻¹(−ln((1 + δ) / (1 + δ′)))             (200, 200) → (200, 200)
mbmp = invert(-(np.log1p(d_p) - np.log1p(d_r)), g_mb)      # user
# ln(R₁₁/R₁₂) − ln(R₁₁′/R₁₂′), no scale factors   (2, 200, 200) → ()
gz = gz.plume.SBMP(swir1=0, swir2=1, axis=0)(obs, ref)     # today

The three estimators on a two-pass cube, from a real run.

The running example: one scene, every nuisance

TL;DR. One plume, two passes, and every surface and atmospheric change the derivations warn about, each in its own patch.

Problem. A 200 × 200 scene with 20 m pixels holds a plume of peak 0.3 kg/m² (148,700 kg) on the plume pass only. Both passes share a textured surface: albedo varies by 15 %, the band ratio rr by 4 %, and a mineral patch has rr 15 % low. Between the passes the whole scene brightens 5 %, a field is wetted (both bands × 0.8), one patch’s ratio drops 3 %, and band 12’s water-vapour transmission drops 1 % everywhere. Pixels enter through plumax’s inject_plume, with the band table built against the background column.

Six maps of the column enhancement. The truth shows one plume. The source note's SBMP shows the plume weakened, a uniform negative offset and the wetted field as strong false methane. The scaled SBMP removes most of the offset but keeps the wetted field. MBSP is dominated by the surface texture and the mineral patch. MBMP shows the plume alone, with a faint patch where the spectral ratio changed. geotoolz's SBMP shows the plume, the same faint patch, and a uniform positive offset.

Figure 1:The truth and five retrievals on the same two-pass scene. Outlines: the stable mineral patch (brown), the wetted field (blue), the patch whose spectral ratio changed (purple).

Table 1:What each retrieval makes of the scene: the share of the plume’s mass it recovers, its offset over clean pixels, and each patch’s mean above the offset (kg/m²).

RetrievalMassOffsetMineralWettedRatio changeClean sd
SBMP, no scale factor (derivation 1)0.46−0.0450.0000.280.0360.000
SBMP, scene-wide csc_s0.86−0.0110.0000.290.0350.000
MBSP0.76−0.0160.210.0060.0230.054
MBMP, exact table, cc on background0.99−0.0010.0000.0000.0390.000
MBMP, cc over every pixel (derivation 1)0.89−0.0090.0000.0000.0390.000
MBMP, log ratio, linear in m Δαm\,\Delta\alpha0.91−0.0010.0000.0000.0390.000
MBMP, δ\delta difference, linear in m Δαm\,\Delta\alpha (derivation 1)0.88−0.0010.0000.0000.0390.000
MBMP, δ\delta difference, σ11=0\sigma_{11} = 0, σˉ12\bar\sigma_{12} (derivation 2)0.78−0.0010.0000.0000.0350.000
geotoolz plume.SBMP (with a reference), exact table1.16+0.0130.0000.0000.0400.000

The hierarchy is as the derivations say (Figure 1, Table 1). SBMP, with or without a scale factor, reads the wetted field as 0.28–0.29 kg/m² of methane, nearly the plume’s peak; MBSP reads the stable mineral patch as 0.21 kg/m² and the 4 % ratio texture as 0.054 kg/m² of clutter; MBMP removes both, and the scene-wide brightening and water-vapour change with them. What it keeps is the patch whose band ratio changed: 3 % reads as 0.039 kg/m². The plume mass then depends on two choices the derivations make differently. A scale factor fitted over every pixel takes in the plume, moves by 0.31 % and leaves a −0.009 kg/m² offset that costs 11 % of the mass. And the slope that converts the signal to a column matters: the exact table recovers 99 %, a linear inversion 91 %, the δ\delta difference 88 %, and σˉ12\bar\sigma_{12} with σ11=0\sigma_{11} = 0 78 %. geotoolz’s SBMP keeps the 1 % water-vapour change as a +0.013 kg/m² offset over the whole scene, 16 % extra mass on this plume (why).

Noise

TL;DR. Each ratio cancels a surface term and adds the noise of the bands it uses.

Problem. With independent noise of relative size ε\varepsilon in each band and pass, the log ratios add variances: SBMP uses two band-12 images, MBSP one image of each band, MBMP four images, and the two-band methods divide by the smaller Δα\Delta\alpha. To first order,

sd(ΔΩ^)≈2 εm α12 (SBMP),2 εm Δα (MBSP),2 εm Δα (MBMP).\text{sd}(\Delta\hat\Omega) \approx \frac{\sqrt{2}\, \varepsilon}{m\, \alpha_{12}} \ (\text{SBMP}), \quad \frac{\sqrt{2}\, \varepsilon}{m\, \Delta\alpha} \ (\text{MBSP}), \quad \frac{2\, \varepsilon}{m\, \Delta\alpha} \ (\text{MBMP}) .
1
2
3
# Shapes: obs, ref (2, 200, 200); ε = 0.01 per band and pass
# sd(ΔΩ̂_noisy − ΔΩ̂_clean) off the plume       (200, 200) → ()
# → SBMP 0.016, MBSP 0.018, MBMP 0.025 kg/m²; theory within 3 %

Retrieval noise for 1 % band noise on a stable surface, from a real run.

As (6) predicts, MBMP pays for its robustness with 1.6 times SBMP’s noise. On a surface that is stable in time, SBMP with a scale factor is the more precise retrieval; on a surface that is uniform in its band ratio, MBSP needs no reference pass. MBMP is the default because real surfaces are neither, and its noise falls with averaging where a surface artefact does not.

When MBMP is not the right choice

Derivation (1) lists three cases, and the run bears on each:

  1. No good reference pass. MBMP and SBMP both need a plume-free date with the same surface. If the only reference is from another season, the local ratio changes grow and MBSP, which needs none, may do better.

  2. A strongly wavelength-dependent surface. Where rr varies widely across the scene, one cc fits it poorly; MBMP still cancels the stable part of rr (the mineral patch is 0.000 kg/m² above the offset), but the fitted cc is less well defined, and SBMP avoids the band ratio.

  3. Water vapour that changes between passes. Band 12 has water-vapour lines. A scene-wide change is a scene-wide factor and the per-pass cc absorbs it; a change that varies across the scene (a front, terrain) does not, and reads like a changed band ratio: 1 % is 0.013 kg/m².

What each method cancels

Table 2 collects the run: what each method removes, what it leaves, and its noise.

Table 2:The family as a difference in differences, from the run.

MethodRemovesLeavesNoise (1 %)Reference pass
SBMPstable surface; scene-wide change (with csc_s)any local change in band 12 (wetted field: 0.29)0.016needed
MBSPscene-wide change; the mean band ratiothe band ratio’s spatial texture (0.054) and stable patches (mineral: 0.21)0.018none
MBMPstable surface, in both bands; scene-wide change; local changes that keep the band ratiolocal changes of the band ratio (3 %: 0.039)0.025needed

Where it lives in the stack

The package boundaries inventory lists the pieces: plumax’s radtran.nb_lut (build_nb_lut, lookup_nb, inject_plume) for the band tables, georeader’s read_srf for the real response functions (B11 1569–1658 nm, B12 2113–2286 nm at half maximum), and geotoolz’s plume.SBMP for the two-pass, two-band log signal. The scale factors, the background masks and the exact inversion exist nowhere in the stack; the notebook writes them.

Open questions

  1. What should the operators be called? An MBMP operator in radtrax, with SBMP and MBSP beside it, each with the scale factors and a background mask, would match the literature; the current SBMP could become MBMP’s scale_factors=False mode.

  2. Where does the background mask come from? The run uses a first-pass detection grown by a Gaussian of 2 pixels; an iterated fit, or the plume mask from geotoolz’s PlumeMask, are the alternatives, and the choice moves the offset.

  3. Should the band table include the background? plumax’s nB omits it; including it is one extra integral and changes band 12 by 1 % here, more over high background or long air-mass paths.

Upcoming work

Table 3 lists the follow-ups.

Table 3:Follow-ups from merging the two derivations.

Follow-upWhereWhy
Rename plume.SBMP (with a reference) to MBMP, and add per-pass scale factorsgeotoolz now, radtrax after the moveit is an MBMP; without cc, a 0.013 kg/m² offset
Add SBMP and MBSP operators with scale factors fitted on a background maskradtraxthe run: an all-pixel fit costs 11 % of the mass
Invert with the two-band table g=τ12−τ11g = \tau_{12} - \tau_{11}radtrax, on plumax’s nb_lutthe run: 99 % of the mass against 91 % for the linear slope
Build nB against the background columnplumax radtran.nb_lutband model: 1.1 % on band 12
Share the synthetic spectrum and band transmittance between radtrax · 1 and 2radtraxboth notebooks carry the same helpers

References

References
  1. Johnson, J. E. (2026). Deriving the MBMP Method Family from First Principles: from the radiative transfer equation to multi-band multi-pass methane retrieval. Unpublished design note.
  2. Johnson, J. E. (2026). An explicit optical derivation of the multi-band multi-pass (MBMP) method. Unpublished design note, generated with Gemini.
  3. Varon, D. J., Jervis, D., McKeever, J., Spence, I., Gains, D., & Jacob, D. J. (2021). High-frequency monitoring of anomalous methane point sources with multispectral Sentinel-2 satellite observations. Atmospheric Measurement Techniques, 14(4), 2771–2785. 10.5194/amt-14-2771-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. Chen, Y., & others. (2022). Detecting and quantifying methane emissions from oil and gas production: algorithm development with ground-truth calibration based on Sentinel-2 satellite imagery. Atmospheric Measurement Techniques, 15, 7155–7169.
  6. Watine-Guiu, M., Varon, D. J., & others. (2023). Geostationary satellite observations of extreme and transient methane emissions from oil and gas infrastructure. Proceedings of the National Academy of Sciences, 120(52).