How a kmerseek region gets an E-value

How kmerseek scores a region and decides whether it could be chance, with every quantity named and a slider on everything that moves. Drag anything below; the equations recompute. Many marks on the figures can be dragged too: a line or curve with a small ring on it, or a dot with a ring around it. A grey halo appears under the pointer, and the slider the mark stands for follows.

\[E = K\,m\,n\,e^{-\lambda_{\text{pair}} \cdot r_{\text{database}} \cdot S}\]

The region score \(S\): matches minus \(C\) per mismatch, stopped by the give-up margin \(X\)

The search finds an exact k-mer that query and target share, 12 letters of a reduced alphabet (two letters, hydrophobic and polar, by default), and walks outward from it along the diagonal. The stretch it keeps is a region, and Figure 1 draws one.

the seed: 12 matches, offsets 0 to 11 score of the segment from the seed out to this position where the walk stopped: the score had fallen X below its best the best score on each side; the region runs between them row under the plot: a match at this position a mismatch the region bar the ends of the shared-domain stretch (drag them)
Figure 1. One seed in a random pair drawn with the compositions of section 2, and the walk out of it. Between the purple dotted lines a fraction κ of the positions is forced to match; outside them, matches are chance. Drag either line, X or κ.

From each end of the seed the search walks one residue at a time: \(+1\) at a match, \(-C\) at a mismatch, remembering the best score seen. When the score has fallen \(X\) below that best, the walk stops and the region is cut back to where the best was. Between unrelated sequences a mismatch costs more than a match earns, so the walk usually dies within a few residues of the seed. Across a shared domain it climbs until the domain ends. Walks on one diagonal that meet are merged into one region.

What the walk’s settings do, and what this region is worth
  • \(X\), the give-up margin (--extend-xdrop, default 8). The walk remembers the best score it has reached. As soon as the current score is \(X\) points below that best, the walk stops and the region ends where the best was. With \(C = 2\), four differing positions in a row cost 8 and end it; a mix of matches and mismatches can carry it further. A larger \(X\) lets the walk cross a short patch of mismatches inside a real shared domain, and also lets it wander further into unrelated sequence before it gives up.
  • Shared-domain stretch: a knob of this model, not of kmerseek. It is the number of residues on each side of the seed where the target carries the same domain as the query, so the classes match more often than chance; beyond it the two sequences are unrelated and match only by chance. In a real search this is however far the shared domain extends past the seed.
  • \(\kappa\) inside that stretch, the copy rate. The model builds the target from the query one position at a time, flipping a weighted coin at each position. Heads, with probability \(\kappa\): the target gets the class the query has there, as a conserved position would. Tails, with probability \(1 - \kappa\): the query is ignored and the target's class is drawn from the target's own composition, as at a position that has drifted, or between unrelated sequences. So \(\kappa\) is the fraction of positions matching above chance in the chosen alphabet; the rest match only as often as chance allows. At \(\kappa = 0\) the stretch is no different from unrelated sequence. 0.46 is the value measured for hp_thomas_dill2 in aligned Pfam pairs at 20–30% identity (analysis notebook 230). Part 2 shows that this copy rate is Cohen's \(\kappa\) and measures it on a real pair.

Fixed in the walk: \(k = 12\) for the seed, \(C = 2\), and the two compositions, which section 2 lets you set. Draw another pair redraws the random sequences with the same settings.

The chance match rate \(\Pr(\text{match} \mid \text{unrelated})\) comes from the two compositions

(2a)\[\Pr(\text{match} \mid \text{unrelated}) = h_{\text{query}}\,h_{\text{target}} + p_{\text{query}}\,p_{\text{target}}\]
(2b)\[\Pr(\text{match} \mid \text{unrelated}) = \sum_{c \,\in\, \text{classes}} \bigl(f_{\text{query}}(c) \cdot f_{\text{target}}(c)\bigr)\]

\(f_{\text{query}}(c)\), \(f_{\text{target}}(c)\): the share of class \(c\) in the query, in the target; for two classes, \(h\) and \(p\).

same class (the diagonal) different class
Figure 2. Every way of putting one query position beside one target position. Column widths are the query's class shares, row heights the target's, so each rectangle is the chance that those two classes meet. Pr(match | unrelated) is the purple diagonal. Drag an edge between two columns or rows to move share.
Where the shares and the alphabet tables come from

The shares are counted from the two sequences of the pair: not from the database, and not from a uniform assumption. The sliders stand in for those counts. What the theory assumes is only that each position is independent of its neighbours; that is the part real sequences break, and \(r_{\text{database}}\) in section 5 measures by how much.

The tables are kmerseek's own, from src/rust/alphabets.rs, clusters in the order their classes are numbered; the hp alphabets write their classes as h and p (and c for cysteine in hp_lehninger_hpc3), every other alphabet writes a class as its first residue in lowercase. A F I L M V is hydrophobic and D E H K N Q R S T polar in every hp table; they disagree only about C, G, P, W and Y.

The expected score per position, and the boundary \(\Pr(\text{match} \mid \text{unrelated}) = C / (1 + C)\)

Equation (1) gives one position of an unrelated pair two possible scores: \(+1\) at a match, \(-C\) at a mismatch. A match happens with probability \(\Pr(\text{match} \mid \text{unrelated})\). The expected score per position, written \(\mathbb{E}[\text{score per position}]\), is the average of the two scores weighted by how often each happens: how far a long stretch of unrelated positions drifts, per position, on average. Equation (3) is that weighted average, then the same thing with the brackets multiplied out.

(3)\[\begin{aligned}\mathbb{E}[\text{score per position}] &= \bigl(\Pr(\text{match} \mid \text{unrelated}) \cdot (+1)\bigr) \\ &\quad + \Bigl(\bigl(1 - \Pr(\text{match} \mid \text{unrelated})\bigr) \cdot (-C)\Bigr) \\ &= \bigl((1 + C) \cdot \Pr(\text{match} \mid \text{unrelated})\bigr) - C\end{aligned}\]

Karlin–Altschul needs this number to be negative. Then a long unrelated stretch drifts down, a stretch that climbs high is rare, and it can be given a probability. Setting Equation (3) to zero gives the boundary, \(\Pr(\text{match} \mid \text{unrelated}) = C / (1 + C)\), which is \(2/3\) at \(C = 2\). It is a limit on the chance match rate, not on the E-value.

Why a positive average score leaves no E-value

If the average were zero or positive, chance alone would keep the score climbing, a high score would be the normal outcome, and it would mean nothing. A pair of unrelated sequences that already match at more than two positions in three by luck cannot be assessed at all, whatever the score. Whether one region is significant is a different question, answered by \(E\) itself in section 4. Section 3 turns the same requirement into the value of \(\lambda_{\text{pair}}\): the expected score is the slope of the curve in Figure 3 at \(\lambda = 0\), and only a negative slope lets the curve come back to zero.

\(\lambda_{\text{pair}}\), nats per score point, converts the score to nats and vanishes at the boundary

Karlin and Altschul (1990) showed that between two random sequences the number of regions scoring at least \(S\) falls as \(e^{-\lambda S}\). \(\lambda\) converts points to nats, the natural-log unit of evidence (one nat is \(1/\ln 2 = 1.44\) bits). It is solved from this pair's own class shares, so the page calls it \(\lambda_{\text{pair}}\). Equation (4) defines it: the positive number that makes the left side equal 1.

(4)\[\Pr(\text{match} \mid \text{unrelated})\,e^{\lambda_{\text{pair}}} + \bigl(1 - \Pr(\text{match} \mid \text{unrelated})\bigr)\,e^{-C\,\lambda_{\text{pair}}} = 1\]

\(\Pr(\text{match} \mid \text{unrelated})\) from Equation (2b); \(C\) from section 1; \(\lambda_{\text{pair}}\) the only unknown. At \(C = 2\) the root has a closed form, Equation (5), derived below.

left side of Equation (4) minus 1, at trial values of λ_pair its slope at λ = 0, which is the expected score per position the solution λ_pair, where the curve comes back to 0
Figure 3. The left side of Equation (4) minus 1, at trial values of λ_pair. The curve leaves 0 downward only when the expected score per position is negative, and then crosses 0 again on the way up; that crossing is λ_pair. Leaving upward, there is no crossing and λ_pair = 0.
Derive Equation (5), and why dividing by \(y - 1\) is safe

At \(C = 2\) the positive root has a closed form, Equation (5), written with \(u\) as shorthand for \(\Pr(\text{match} \mid \text{unrelated})\) in this equation and its derivation only:

(5)\[\begin{aligned}u &= \Pr(\text{match} \mid \text{unrelated}) \\ \lambda_{\text{pair}} &= \ln \frac{(1 - u) + \sqrt{(1 - u) \cdot (1 + 3 \cdot u)}}{2 \cdot u} \qquad (C = 2)\end{aligned}\]

Four steps, all at \(C = 2\) and with \(u = \Pr(\text{match} \mid \text{unrelated})\). First, put \(C = 2\) into Equation (4):

\[u \cdot e^{\lambda_{\text{pair}}} + (1 - u) \cdot e^{-2 \lambda_{\text{pair}}} = 1\]

Second, write \(y = e^{\lambda_{\text{pair}}}\), so \(e^{-2\lambda_{\text{pair}}} = 1 / y^{2}\) and \(y > 0\). Multiply both sides by \(y^{2}\) and move everything to the left. The equation in \(\lambda_{\text{pair}}\) becomes a cubic in \(y\):

\[u \cdot y^{3} - y^{2} + (1 - u) = 0\]

Third, \(y = 1\) (that is, \(\lambda_{\text{pair}} = 0\)) is always a root: \(u - 1 + (1 - u) = 0\). That is the root the page keeps saying to ignore. Dividing the cubic by \((y - 1)\) removes it and leaves a quadratic; multiply the right side out to check it gives the cubic back:

\[u \cdot y^{3} - y^{2} + (1 - u) = (y - 1) \cdot \bigl(u \cdot y^{2} - (1 - u) \cdot y - (1 - u)\bigr)\]

Nothing is divided by zero here. The line above is a statement that two expressions are equal for every \(y\), and checking it needs multiplication only. A product is zero when one of its factors is zero, so the cubic is zero when \(y = 1\) or when the quadratic is zero, and the root we want comes from the second case, where \(y\) is not 1 and \(y - 1\) is not 0. The quadratic at \(y = 1\) is \(3 \cdot u - 2\), which is 0 only at \(u = 2/3\): there the root we want has met the one we threw away, and \(\lambda_{\text{pair}} = 0\).

Fourth, solve the quadratic \(u \cdot y^{2} - (1 - u) \cdot y - (1 - u) = 0\) with the usual formula. Under the square root, \((1 - u)^{2} + 4 \cdot u \cdot (1 - u)\) has the common factor \((1 - u)\), and \((1 - u) + 4 \cdot u = 1 + 3 \cdot u\). Taking the \(+\) sign gives the larger root, which is the positive one because the other has a negative numerator:

\[y = \frac{(1 - u) + \sqrt{(1 - u) \cdot (1 + 3 \cdot u)}}{2 \cdot u}\]

\(\lambda_{\text{pair}} = \ln y\), which is Equation (5). Check against the boundary of section 2: at \(u = 2/3\) the numerator is \(1/3 + \sqrt{(1/3) \cdot 3} = 4/3\) and the denominator is \(4/3\), so \(y = 1\) and \(\lambda_{\text{pair}} = 0\), which is where the expected score per position reaches zero. Below \(2/3\) the fraction is above 1 and \(\lambda_{\text{pair}}\) is positive. A number to hold on to: at \(u = 1/2\), \(y = 1/2 + \sqrt{5/4} = 1.618\) and \(\lambda_{\text{pair}} = 0.481\) nats per score point; putting \(y = 1.618\) back into the first line gives \(0.809 + 0.191 = 1\). For any other \(C\) the same substitution gives a polynomial of degree \(C + 1\) in \(y\) (when \(C\) is a whole number), which is why the code bisects instead.

Solving \(\lambda\) per pair is in the spirit of BLAST's composition-based statistics (Schäffer et al. 2001), which adjust per query. kmerseek's code and its CSV columns write \(a\) for what this page writes \(\Pr(\text{match} \mid \text{unrelated})\).

\(\lambda_{\text{pair}}\) for every alphabet: fewer classes, more chance matches, fewer nats per point

λ_pair against Pr(match | unrelated) at this C the boundary Pr(match | unrelated) = C / (1 + C) this pair each alphabet at the Swiss-Prot average composition

Hover a dot or a name to read it off; click one to make it the alphabet of the whole page (the drop-down in section 2 follows).

Figure 4. λ_pair against Pr(match | unrelated) at the C set above: Equation (5) at C = 2, bisection otherwise. Coral: the pair from section 2. Grey: each alphabet at the Swiss-Prot average composition. Figure 3 is one point on this curve.

The E-value \(E\) multiplies the search space \(K \cdot m \cdot n\) by the chance of a score of at least \(S\)

this pair four reference pairs at fixed chance match rates 0.40, 0.50, 0.58 and 0.64, each labelled at the end of its line E = 1 and E = 0.001 the S of the slider (drag it or the coral dot)
Figure 5. Equation (6a) against S for this pair (coral) and four made-up pairs (grey) that differ only in their chance match rate: the same score, E-values orders of magnitude apart. Drag the coral dot or the dotted line sideways to set S.
  • \(E\): the expected number of regions scoring at least \(S\) between an unrelated query of length \(m\) and a database of \(n\) residues. Smaller is better.
  • \(m\): query length in residues. \(n\): residues in the database.
  • \(K\): one number per database, the fraction of the \(m \cdot n\) grid squares that can start an independent region; measured when the index is built, section 5.
  • \(r_{\text{database}}\): one number per database, the share of a region's score that counts as evidence; 0.865 on Swiss-Prot, so 40 points are judged as 35. Section 5.
  • bits: the same evidence on BLAST's bit scale; larger is better.
What \(r_{\text{database}}\) takes off, what stands in for \(n\), and the four grey pairs

\(r_{\text{database}}\): the database factor, the share of a region's score that counts as evidence. The E-value judges a region with score \(S\) as if it had scored \(r_{\text{database}} \cdot S\) between sequences whose positions were independent. On Swiss-Prot, \(r_{\text{database}} = 0.865\): a region scoring 40 is judged like one scoring 35. The 5 points taken off are matches that real proteins hand out for free: a helix, a strand or a membrane stretch keeps one class for several residues in a row, in both sequences, so neighbouring positions match together without the two proteins being related. A plain number with no unit, one per database, measured on that database's own sequences when its index is built (section 5): 1.00 would mean positions are independent; SCOPe40 domains give 0.947, full-length proteins 0.83–0.87. In the code it is ka_r_database. Figure 10 draws the discount and Figure 11 the histogram behind it.

\(n\) is the index's k-mer count, which stands in for the residues in the database. --ka-k overrides \(K\).

In an hp alphabet a chance match rate near 0.40 is a polar protein against a membrane protein. They almost never match by luck, so the same \(S\) is rare between them. 0.64 is two membrane proteins, which match on most positions for free. That line is nearly flat because 0.64 sits just under the boundary \(2/3\), where \(\lambda_{\text{pair}}\) reaches 0.

\(K\) and \(r_{\text{database}}\) are measured when the index is built

the real queries, their search and their counts the same queries shuffled (the reference), their search and their counts the rest of the database; bins not used baseline through the eight lowest bins ± 2σ around it where the fit stops the fitted line the eight bins fitted

Figure 6. The seven steps of the calibration, one at a time. Click a box to jump to it; the panel under the boxes shows what that step does to a made-up database whose real queries carry a few relatives.
The seven steps in full, and why \(K\) is measured, not computed
  1. Sample 200 sequences from the database.
  2. Search them as they are, and search the same sequences shuffled so that every neighbouring pair of residues stays as common as it was (the reference).
  3. Bin every region from both searches by \(x = \lambda_{\text{pair}}\,S\) in half-nat bins and count.
  4. Per bin, take the log ratio of the two counts, \(r(x)\).
  5. Fit a straight line through the eight lowest bins that both searches fill with at least 30 regions. That is the baseline; \(\sigma\) is the scatter of those bins around it. A constant ratio is a difference in \(K\); a gentle tilt is sequence structure the reference lacks.
  6. Walk up in \(x\). The first bin whose ratio sits more than \(2\sigma\) above the line is where the real queries have something the same sequences, shuffled, cannot have: relatives. The fit stops there.
  7. Fit \(\ln c_{\text{real}}(x)\) on the eight highest bins that made it in: \(r_{\text{database}}\) is minus the slope, \(K\) comes from the intercept.

In \(E = K \cdot m \cdot n \cdot e^{-\lambda_{\text{pair}} \cdot r_{\text{database}} \cdot S}\) the product \(m \cdot n\) is the number of squares in the grid of query positions against target positions, and the formula treats every square as a fresh chance at a region. That overcounts: squares next to each other on one diagonal belong to the same excursion, and a region is counted once, at its peak. \(K\) is the fraction of those \(m \cdot n\) squares that are real, independent starting points, so it is well under 1. For plain ungapped scoring Karlin and Altschul (1990) give a formula for \(K\) from the score distribution. kmerseek cannot use it, because its regions are not plain excursions. A region exists only if it contains an exact 12-mer seed, the give-up margin \(X\) ends it, and walks on one diagonal are merged. Each of those removes chance regions, mostly low-scoring ones, and the formula knows nothing about them. So \(K\) is measured instead, the way BLAST measures its gapped constants by simulation: it is what is left of the intercept of Equation (7a) once the sizes and the bin width are divided out, Equation (7c):

The seed requirement is why kmerseek's values (0.0227 on SCOPe40, 0.0180 on Swiss-Prot, 0.0139 on UniRef50) are several times smaller than BLAST's ungapped \(K\): most squares of the grid can never start a region because no 12-mer matches there. \(K\) is fitted once per database, pooled over every pair, so it is a region-weighted average; the theory says \(K\) varies with composition too, but far less than \(\lambda\) does, which is why the composition goes into \(\lambda_{\text{pair}}\) and not into \(K\).

A simulation of the calibration you can push on

real queries, regions per bin reference, the same queries shuffled fitted line the eight bins fitted (drag its left edge to change how many) 30 regions; bins below are not fitted (drag it) where the fit stopped
Figure 7. Regions per bin from the real queries and from the same queries shuffled, the line of Equation (7a) fitted on the shaded bins, and where the fit stopped. kmerseek's calibration figure is this panel on the real runs. Drag the window's left edge or the count floor.
r(x) = ln(real / reference), per bin baseline through the eight lowest bins ± kσ around it (drag its top edge to change k) the eight bins fitted first bin above the band: where the fit stops
Figure 8. Equation (7b), what the stop rule reads. Anything the reference lacks trips it, wanted or not: a reference without runs makes the real curve depart early for the wrong reason (try the plain shuffle on the raw-S axis). Drag the band's top edge to change k.
What the simulation assumes, and why the fitted slope is below the true value

Two things pull the fitted slope under the true average. Relatives enter gradually, so the bins just below the stop already carry a few. And a mixture of queries with different \(r_{\text{database}}\) is shallower than their average at high \(x\), because the shallow ones dominate there. The equation at the top of the page uses the constants measured for the chosen database and does not move with these sliders.

The two figures below are not kmerseek's calibration output. They come from a small simulation inside this page that makes up region counts with the shapes described above, so you can change things the real run does not let you change and watch what each one does to the fitted slope. In the simulation each calibration query departs from independent positions by its own amount, drawn around the r_database you set with the spread you set, and has its own share of relatives. The pooled counts are the sum over queries, so the r_database the fit recovers is a region-weighted average over them. Relatives add a shallow tail that begins around 9 nats, the reference is the chance curve without relatives, and Poisson noise is added to every count. The switches change what the reference keeps, how many queries you spend, how much they differ, and how the stop rule is set. The readouts compare the fitted slope with the true average the simulation was given.

What moves \(r_{\text{database}}\), and what does not

regions per point of score, real queries (0.3% of seeds sit in a shared domain) the same queries shuffled keeping neighbour pairs: same ρ, no relatives the fitted line; its slope is −r_database the eight bins fitted where the stop rule fires right: r_database fitted against ρ with no relatives at all this run, at the ρ and κ set (drag it sideways to set ρ)

Figure 9. Left: the calibration of Figure 6 run on made-up pairs whose neighbouring residues repeat a class at rate ρ, with a small share of seeds inside a shared domain conserved at κ. Right: the fitted r_database against ρ with no relatives at all; the coral dot is the left panel's fit. Drag it sideways to set ρ.
How \(\rho\) enters the model, and why the coral dot sits under the curve

\(r_{\text{database}}\) is fitted on chance regions only: the bins below the stop rule, where the real queries and the same queries shuffled agree. Relatives never enter those bins, so \(\kappa\), which describes relatives, cannot tilt them; it can only decide where the fit stops. What tilts them is run structure inside the sequences. Real proteins have helices, strands and membrane stretches where one class repeats for several residues in a row. The Karlin–Altschul model assumes each position is drawn on its own.

Figure 9 puts one knob on that. \(\rho\) (rho) is the neighbour repeat rate: at each position, with probability \(\rho\) the sequence keeps the class of the position before, and otherwise draws a class from its composition. Both sequences of a pair get it, so the chance that two neighbours carry the same class is \(\rho + ((1 - \rho) \cdot \Pr(\text{match} \mid \text{unrelated}))\), the same shape the coin of section 1 gives a match inside a shared domain, with \(\rho\) in place of \(\kappa\). At \(\rho = 0\) the positions are independent and the fitted slope is close to 1, the Karlin–Altschul value. When neighbours repeat, a lucky match tends to be followed by another lucky match, chance regions run longer, the tail of the counts falls more slowly, and \(r_{\text{database}}\) drops below 1. The shuffled reference keeps the neighbour pairs, so it keeps \(\rho\) and the stop rule still fires only on relatives.

Drag \(\rho\) and the whole tail tilts; the purple curve on the right is that tilt. Drag \(\kappa\) and the chance bins do not move, but the pink line does. Relatives pile up at the score their shared domain can reach: at \(\kappa = 0.46\) that is just above the chance regions, so the stop rule fires early and the fit is cut off where the tail is still bending, which is why the coral dot sits under the curve. At \(\kappa = 0\) there is nothing to stop on, and at \(\kappa = 0.9\) the relatives climb past every chance region, so in both cases the fit runs to the end of the counts. This is the same effect the readout of Figure 7 calls relatives entering gradually. The alphabet and \(C\) from section 2 and \(X\) from section 1 also enter, because they set which chance regions exist; the sliders of section 2 do not, because this model draws both compositions at the Swiss-Prot average.

What \(r_{\text{database}}\) means

points of the score that count as evidence, r_database × S points taken off: matches that runs hand out for free, (1 − r_database) × S a match a mismatch a run of three or more matches in a row the best-scoring stretch, +1 per match and −C per mismatch

Figure 10. Top: the region of section 4 scored S points; the E-value counts r_database × S of them as evidence. Bottom: two made-up pairs with the same class shares, one where each position keeps the class before it 6 times in 10, one with independent positions. Same match rate, but with runs the best stretch climbs higher.

The histogram behind \(r_{\text{database}}\)

left: regions per point of score in one search of this query against this database (chance regions; relatives are not drawn) the tail's slope, −λ_pair × r_database per point (drag it: sets r_database) the tail if every position were independent of its neighbours, slope −λ_pair per point right: the same regions binned by the E-value they get, E computed with r_database the same regions with r_database left out of the formula E = 0.001 the region of section 4: its score, and its E each way

Figure 11. Left: regions per point of score in one search, with the tail's slope at r_database (purple, drag it) and the slope independent positions would give (grey dashed). Right: the same regions binned by the E-value each one gets, with r_database in Equation (6a) (purple) and without it (grey).

Three references, and what each one keeps

The reference only has to lack relatives and keep everything that makes chance regions. The closer it is to the real sequences, the flatter the baseline and the later the stop rule fires. On SCOPe40 domains all three references, fitted on their own shuffled runs, give the same line (slope 1.04, K 0.064–0.070): runs and periodicity add nothing there. The numbers the search uses (0.947 and 0.0227) come from the runs on real sequences in section 5, cut off where the stop rule fires. On full-length proteins they differ.

referencekeepsloseswhat happens
plain shufflecompositionruns, helix and strand periodicityit is the independent-positions model itself, so its slope is the closed form (1.0 in x). Real membrane pairs have runs it lacks, so on the raw score the stop rule fired at score 23 and the fit read the seed end. Swiss-Prot: slope 1.015.
shuffle keeping dipeptidescomposition, the number of runs and their average lengththe longest runs, periodicitythe current reference. In a two-letter alphabet, keeping neighbouring pairs fixes how often h follows h and p follows p. Past raw score 49 it carries 5–20× more regions than the plain shuffle: that is run structure. Swiss-Prot: slope 0.942.
reversedcomposition, runs, periodicityalmost nothingclosest to the real curve (Swiss-Prot: 0.858 against 0.865), but a helix or a strand reads the same backwards, so reversed relatives still share single elements with their forward family: the small tail at high x in the reversed column. The reference keeps some relatives.

One region, start to finish: from class shares to an E-value

rows: once per query–target pair, once per region, once per database (labelled at the left) the current step this pair, this region an alike pair (chance match rate 0.60), for comparison pooled counts from the real calibration queries
Figure 12. The region of Figure 1 through the whole chain. Top: eight steps with their current values; the top row happens once per pair, the middle row once per region, the bottom row once per database. Bottom: the current step drawn with this region's numbers. Everything is live from sections 1 to 4.

What two letters can carry, the copy rate κ, bits per position, the alphabet trade, short motifs and the best C, is Part 2, its own page.

Glossary

Alphabetical: Latin letters first (upper and lower case together), then Greek by name, then words and options.