SELEX (Systematic Evolution of Ligands by EXponential enrichment) starts from a library of ~1014–1015 random-sequence single-stranded oligonucleotides and, over repeated rounds, converges on the small subset that folds into a shape binding a chosen target tightly. Each simulated aptamer carries a dissociation constant Kd; at equilibrium the bound fraction follows the Langmuir isotherm:
θ = [T] / ([T] + K_d)
survival probability p = θ^(1 + 4·stringency)
Raising θ to a power sharper than 1 models a stringent wash step: it preferentially keeps sequences whose Kd is well below [T], discarding weak or non-specific binders even though they were nominally "bound". Every round proceeds as:
- Partition — each sequence's fate is drawn stochastically from its survival probability (a real gel-shift / column-partition step is itself imperfect and probabilistic).
- Amplify (PCR) — surviving strands are cloned back up to full library size; each copy accumulates polymerase error, nudging log₁₀(Kd) by a Gaussian step scaled by the mutation-rate slider — this reseeds diversity and occasionally improves affinity further.
- [T] — lowering target concentration between rounds (as real SELEX protocols do) raises the bar, since only sequences with Kd ≲ [T] bind appreciably.
This 2D view plots the same population directly in affinity space instead of as an orbiting 3D cloud: the top strip is the Langmuir isotherm θ(Kd) and the sharper survival-probability curve p(Kd) for the current [T] and stringency, both drawn live against a shared log-Kd axis; the bottom strip is a per-round dot histogram — every one of the 260 aptamers plotted as a single dot at its own Kd position, stacked within bins so the population's shape is countable, not just colored. Watch the dot cloud slide from the weak (blue, left) edge toward the tight (gold, right) edge and pile up as rounds proceed — the same enrichment the 3D orbital-shell view shows, read here as a shifting histogram instead of a shrinking radius.