Saturation genome editing (SGE) introduces every possible single-nucleotide variant across a target exon, delivers the pooled library to cells, and measures each variant's abundance before and after a selection period. A variant's functional score is its log2 fold-change (LFC) in read counts:
LFC_i = G · log2(1 − s_i) + ε
s_i = fitness cost of variant i (0 = neutral, 1 = lethal)
G = generations of selection
ε = sequencing/sampling noise (fixed σ, independent of G)
Each of the 60 exon positions carries an intrinsic domain criticality profile — two structured regions where an amino-acid change disrupts folding or catalysis, flanked by tolerant loop regions. Fitness cost is derived from that profile per mutation class:
- Missense — cost scales with local criticality; a random per-substitution severity factor stands in for the fact that not every amino-acid swap at a site is equally damaging.
- Nonsense — a premature stop truncates everything downstream, so cost is the average criticality of the whole remaining C-terminal stretch — early truncations are almost always damaging, late ones often tolerated.
- Synonymous — no amino-acid change, so cost stays near zero; this class is the built-in neutral control, exactly as in a real SGE experiment.
Variants are classified by comparing their measured per-generation score (LFC / G — this normalisation is why raising the generations slider does not itself shift the functional/non-functional split) against the classification-stringency cutoff, mirroring how Findlay et al. (2019) sorted 3,893 BRCA1 exonic SNVs into functional / intermediate / non-functional classes months before any of them would be seen in a patient. What more generations does change is statistical power: the noise term stays fixed while the true signal scales with G, so the signal fidelity (R² between the noisy measured score and the true underlying criticality) improves at higher stringent, longer screens — visible directly in the scatter panel below.