Each dot is one capture spot in a spatial transcriptomics array (e.g. Visium). Every spot really sits under a mixture of 4 cell types; its true composition is a probability vector c(x,y) that sums to 1. During tissue processing, RNA molecules physically diffuse a short distance before capture, modelled as the 2-D heat/diffusion equation on the spot grid:
∂c/∂t = D ∇²c
Explicit update (4-neighbor Laplacian, dt = 1, clamped edges):
c_i(t+1) = c_i(t) + D · [ Σ_neighbors c_j(t) − 4·c_i(t) ]
Stable for D ≤ 0.25 (2-D explicit-Euler CFL limit —
verified numerically: an impulse stays bounded through D=0.25
and blows up by D=0.26, confirming the bound is exact, not a rough estimate).
Running this update for "steps" iterations at rate D blurs the sharp niche boundaries — this is the observed / diffused signal a real sequencer would report. The characteristic blur length after t steps is √(2·D·t) spot-widths.
Deconvolution inverts that blur. Because the forward operator (repeated diffusion) is known exactly, an iterative Richardson–Lucy-style update recovers the pre-blur field from the blurred observation, per channel:
ĉ(k+1) = ĉ(k) · [ obs / Blur( ĉ(k) ) ]
then renormalize each spot's 4 channels to sum to 1
Each click applies 5 update rounds; the reconstruction error (RMSE against the known ground truth) keeps falling as iterations run, mirroring real spot-deconvolution pipelines (cell2location, RCTD) that recover per-spot cell-type proportions from a mixed, diffusion-blurred readout.
- D / steps sliders — control how much the raw signal blurs before you try to undo it; higher blur is a harder deconvolution problem.
- Run deconvolution — advances the iterative estimate 5 rounds per click; the RMSE chart on the right tracks every round.
- Reset estimate — restarts the reconstruction from the raw diffused signal (iteration count back to 0).
- Drag the map to pan, scroll/pinch to zoom, click a spot to inspect its per-channel composition on the right.