Barcode & Index Design
Design a sample-index set whose minimum distance is guaranteed rather than hoped for, then check the pool you are about to load against the instrument that will read it.
| Reached by | Tools → Barcode & Index Design |
| Formats | CSV TSV FASTA JSON, carrying the guarantee Illumina SampleSheet v2 IDT bulk-input sheet |
| Sample project | Barcode & index design |
What it does
Multiplexing works by writing a short tag into every molecule from a sample, sequencing everything together, and sorting the reads back out afterwards. The sorting only works if the tags are far enough apart that a sequencing error cannot turn one into another. That distance is not something you can eyeball: two eight-base indexes that look nothing alike can still be one substitution apart, and a pool whose closest pair is one apart mis-assigns reads on every single error.
This panel does the two halves of that problem.
Design builds a set of barcodes with a guaranteed minimum distance, by enumerating every candidate of the length you ask for, screening out the ones that are bad to synthesise or bad to sequence, and then picking a maximally separated subset. The guarantee is stated in the terms that matter at the bench: a set with minimum distance d corrects ⌊(d−1)/2⌋ errors and detects d−1.
Check my pool takes the indexes you are actually about to run — from a vendor kit, from a list you already hold, or from the set you just designed — and reports what will go wrong on the specific instrument you name. Colour balance per index read, the distance the pool really holds, the samples that collide once the run's index cycles truncate them, the index-2 orientation, and how much of the index hopping will be removable.
On the real 96-plex IDT for Illumina UD Indexes, Plate A, read as 8+8 index cycles on a NovaSeq X, the pool holds a minimum sequence-Levenshtein distance of 4 (one error correctable, three detectable), five i7 and two i5 indexes begin with GG and will fail cluster registration, and 96 of 9,216 possible i7 × i5 combinations are in use, so 99.0% of hopped reads land in Undetermined rather than on another sample.
What this computes
About a set, at every point you can look at one
- the minimum, mean, median and maximum pairwise distance, under all four error models rather than only the one the set was designed against
- the guarantee those imply: how many errors are correctable and how many merely detectable
- how many pairs sit at the minimum, out of all of them — the number that separates a set held back by one unlucky pair from a set that is uniformly that tight, because only the first is fixed by replacing two barcodes
- per barcode: GC fraction, longest run of one base, the distance to its nearest neighbour, every neighbour at that distance, and which composition screens it fails
- the distributions behind the summary: pairwise distances, nearest-neighbour distances, GC spread with mean, standard deviation and range, per-cycle base composition, per-cycle Shannon entropy in bits, prefix collisions, and the full pairwise distance grid
- the closest pairs by name — the two barcodes a read gets confused between first
About whether it can be sequenced
- per-cycle channel occupancy on four-channel, two-channel, XLEAP and one-channel chemistries
- every violated rule, with the consequence and the vendor article it comes from, and the indexes responsible
- the same pool judged on every chemistry generation at once, since a pool balanced on one is not automatically balanced on the next
- how much of this pool's index hopping would be detectable, which is a structural property of the pool and needs no rate data at all. A hopped read carries one library's i7 with another's i5, so it lands somewhere in the i7 × i5 combination space; if that combination belongs to no sample it is discarded as Undetermined and costs you nothing but reads. What the check reports is the arithmetic: how many combinations exist, how many are in use, therefore what share of hops are removable, and — the part that matters — whether any single swap turns one sample's read into another sample's read, which no amount of filtering can undo. On a 96-plex unique-dual kit that reads 96 of 9,216 combinations in use, 99.0% of hops removable, no single swap aliases one sample onto another; on a combinatorial pool it does not
About whether it can be demultiplexed
- whether the demultiplexing software will accept the set at all — Illumina's BCL Convert requires indexes to differ by at least 3 bases at its default mismatch tolerance, and refuses to start a run that violates it. This is measured in Hamming distance whatever the set was designed under, because the software counts mismatched bases
- the largest mismatch tolerance the set actually supports, and the pairs that would collide at the tolerance you choose
About the reads
- which reads are assigned, which are ambiguous and which matched nothing, where ambiguous means beyond the correction radius the set guarantees, and the distance of every assignment
- for indel-correcting codes: which reads decoded, which were undecodable, and behind which constant prefix each was found
About what gets ordered
- every assembled oligo with its length, and each junction problem that exists only once index and adapter are one strand: a homopolymer run spanning the junction, a 5′ tetramer recurring as its reverse complement, and total length against the 60 nt synthesis guideline
Uncertainty. A distance guarantee is exact, not estimated: it is a counted minimum over every pair, so it carries no interval — and neither does the hopping arithmetic, which is a property of the combination space rather than a measurement. The quantities that are uncertain are given as what they are. The index-hopping rate is reported as Illumina's own published range for the library-prep class you pick, never as a single number and never as a figure for your run: the vendor qualifies it by the type, quality and handling of the library, so a midpoint would be a prediction it does not make. There is no per-instrument rate, and none is invented. The yield of a stochastic search is the other, which is why those strategies expose their seed.
When you'd use this
Four situations, and what you want differs in each:
- You are ordering custom barcodes and need to know how many you can have. Design a set at the length and distance you want and read the count. Length and distance trade against each other brutally: at 8 nt, one error-tolerance step costs 97% of the set — the published FREE-divergence sets in the sample project make the same point with 213 codes at one and 7 at two.
- You already own kits and want to know if this particular pool is safe. That is Check my pool. You do not need to design anything; pick your kit, pick your instrument, read the verdict.
- You are pooling a small number of samples. Two- and three-plex pools are where colour balance actually bites, because there are not enough libraries to average out a dark cycle. Illumina's own guidance is that a minimum plexity of three is colour-balanced on any of their systems; below that you have to look.
- You are decoding reads and want to know which are trustworthy. The Validate tab assigns observed reads to barcodes and separates the ones beyond the guaranteed correction radius as ambiguous, rather than reporting them as clean hits.
Reach for something else when: you want to find barcodes in reads you already have, rather than design or check them. That is demultiplexing, and it lives in the same panel's Validate tab.
Where it lives
Tools → Barcode & Index Design opens it in the right rail. Eight tabs follow the real workflow: Design → Set → Analysis → FREE codes → Color balance → Pool → Validate → Oligos.
One working set runs through all of them. Whatever Design produces, Set edits, and every other tab reads — there is no per-tab copy that can drift out of step. Colour balance and pool checking both read the instrument you chose, so changing it in one place changes it everywhere.
Inputs and outputs
Design needs nothing but parameters: it enumerates its own candidate pool.
Set, Analysis, Color and Oligos read the working set, which you can also load from a plain list of barcodes in the project, or paste.
Check my pool takes three shapes of input:
- a vendor kit from the bundled Illumina catalogue (see Algorithms and data you can choose);
- pasted indexes: one sample per line, name, i7 and optionally i5, separated by tabs or commas. Bare sequences one per line work too, and a header row is ignored;
- the working set designed in this panel.
What it refuses, and says so. A pool that mixes single- and dual-indexed samples is rejected with "2 of 3 samples carry an i5 index. A pool is either single- or dual-indexed; mixing the two on one run leaves the single-indexed samples unassignable." A combinatorial kit with no chosen combinations is rejected, because any i7 may pair with any i5 and there is no defensible default. A pasted line carrying no ACGT sequence is reported with its line number and the reason, never silently dropped.
Worked example
Open the Barcode & index design sample project.
- Go to Pool, leave the source on Vendor kit, and pick IDT for Illumina UD Indexes, Plate A/Set 1. The readout under the picker says 96 indexes · unique dual · i7 10 nt · i5 10 nt.
- Set Instrument to NovaSeq X / X Plus. The note under it says the instrument reads index 2 reverse-complemented but its demultiplexing software expects the forward value in the sample sheet — the two genuinely differ, and this is the single most common real-world pooling error.
- Set i7 cycles and i5 cycles to 8. These are ten-base indexes, so an 8-cycle read never sees the last two bases of either.
- Set Claimed minimum distance to 3, then press Check pool.
The verdict is Do not run this pool, and the reasons are itemised:
- all 96 samples remain distinct at 8+8 cycles, so the truncation is a warning rather than a failure;
- five i7 and two i5 indexes begin with GG — Illumina tier unacceptable, because an index read starting with two G calls generates no signal and cluster registration fails for those samples;
- measured minimum sequence-Levenshtein distance over i7+i5 is 4, comfortably above the 3 you claimed;
- 96 of 9,216 i7 × i5 combinations are in use, so 99.0% of index hops are removable.
Now change the instrument to MiSeq and press Check pool again. The GG failures disappear: four-channel chemistry gives every base its own dye, so no index cycle can be dark and colour balance imposes no constraint. The same plate is safe on one machine and not on another, which is the whole reason this check exists.
Controls
Design tab — barcode length; minimum distance (with the guarantee it implies stated live); error model; search strategy; the three candidate filters, each reporting how many candidates it removed before the run; and, for the non-deterministic strategies, the search budget (evolutions or restarts) and population.
Set tab — every barcode with its GC, its longest run of one base, the distance to its closest neighbour and its flags. Sort and filter by any of them; edit a barcode in place and watch the set's minimum distance change as you type; remove rows; lock a subset and close over the pool again from there; drop rejected barcodes and refill exactly that many vacancies. Every change is snapshotted, so an exploration is walkable backwards, and the set itself belongs to the project: close the tab or reload the page and it comes back, with a line saying when it was saved.
Analysis tab — minimum, mean, median and maximum pairwise distance under every metric, not only the one you designed against, plus the pairwise-distance histogram, per-barcode nearest neighbour, GC spread, per-cycle base composition, Shannon entropy, shared prefixes and the full distance grid. The phaseshift metric is opt-in with its cost stated, because it is a search per pair and takes minutes on plate-scale sets where the other three take milliseconds. It runs in the background: the panel stays usable while it searches, the row for it says it is searching, and you can stop it and get the metric back as "not computed" rather than as an error.
Color balance tab — instrument; the tier verdict; every violating index, clickable through to the set browser; per-cycle channel occupancy as both a plot and a table; and the same pool judged across all four chemistry generations at once.
Validate tab — the error model to judge by; the homopolymer run length to flag at; and the demultiplexer mismatch tolerance, offered as the values the software accepts with its own default marked. Raising it does not make the check stricter in a vacuum: every extra mismatch tolerated needs two more bases of distance between every pair, so the tolerance you pick decides whether the run starts.
Pool tab — pool source; index kit; instrument; index-read length per read; the minimum distance you claim. Every check reports pass, warn, fail or skipped — a check with no input to run against says so, because a silently absent check reads as a passed one. The checked pool's i7 or i5 indexes can be taken up as the working set, so a vendor plate you already own can be profiled, colour-checked and turned into an order sheet like any set you designed.
Oligos tab — 5′/3′ adapter arms or a PCR primer, tag orientation, spacer bases, synthesis scale and purification for the ordering sheet.
The controls by the panel's own names:
| Control | Tab | Default | What it sets |
|---|---|---|---|
| Min distance | Design | 3 | The guarantee asked of the search. The set that comes back may exceed it, never fall below it |
| Error model | Design | Sequence-Levenshtein | Hamming, Levenshtein, Sequence-Levenshtein or Phaseshift: the errors the distance has to survive |
| Search strategy | Design | Conway closure | Conway closure, Max-clique, Random sampling or Evolutionary (Ashlock) |
| Random seed | Design | 1 | Fixes a non-deterministic search so it reproduces |
| Population | Design | 200 | For the evolutionary search, chromosomes per generation. DNABarcodes' default is 200 |
| No homopolymer triplets | Design | on | AAA, TTT, GGG and CCC cause synthesis and phasing errors |
| 40-60% GC | Design | on | Keeps barcodes melting consistently with each other |
| No self-complementary | Design | on | A barcode equal to its own reverse complement forms hairpins |
| Flagged only | Set | off | Shows only the barcodes carrying a flag |
| Shared prefixes | Analysis | 2 bases | Barcodes identical over their first bases: what a prefix-matching demultiplexer and the first sequencing cycles see |
| Flag homopolymer runs of | Validate | 3 | Identical bases in a row before a barcode is flagged |
| Length | Free codes | The length of the new codes | |
| Reserve the working set first | Free codes | Claims the indexes you already hold, so what comes back is compatible with them | |
| Index kit | Pool | IDT for Illumina UD Indexes, Plate A/Set 1 | The vendor plate the pool is drawn from |
| Your indexes | Pool | empty | Your own indexes, pasted, instead of a kit |
| Library prep | Pool | Patterned flow cell, ExAmp chemistry | Illumina's published index-hopping range for that class, multiplied by what this pool can throw away |
| 5′ adapter arm · 3′ adapter arm | Oligos | Illumina P5 · read 1 arms | The sequence either side of the tag |
| Insert reverse complement | Oligos | off | Needed when the instrument reads this index in the reverse-complement orientation |
| Tag a PCR primer (optional) · Spacer between tag and primer | Oligos | empty | Builds tagged primers instead of adapters |
| Synthesis scale · Purification | Oligos | 25nm · STD | Written onto the IDT order sheet |
Algorithms and data you can choose
Four distance metrics, and they answer different questions:
| Metric | What it counts | When it is the right one |
|---|---|---|
| Hamming | Substitutions only | The barcode's position in the read is exact |
| Levenshtein | Substitutions and indels, barcode read in isolation | Comparing tags out of context |
| Sequence-Levenshtein | Substitutions and indels in DNA context | The realistic sequencing case, where an indel pulls flanking bases into the barcode window. The default |
| Phaseshift | Substitutions plus front-biased indels | Chemistries whose errors cluster at the read start. Experimental |
Four set-construction strategies: Conway closure (greedy lexicographic, fastest, fully reproducible), max-clique (Pattabiraman's heuristic on the distance graph), random sampling (Conway repeated from random seeds), and Ashlock evolutionary search (usually the largest sets, slowest). The stochastic two are seeded, so a published design regenerates exactly.
Each strategy states what it will cost before you run it, in the sentence under the control, because "slower on large pools" does not tell you whether to expect two seconds or two minutes. Max-clique at 8 nt and minimum distance 4 takes a few minutes over the default 14,600-candidate pool. Every search runs in the background with a Stop beside it, so a long run is a choice you can take back rather than a frozen tab.
FREE divergence codes are a separate construction for indel-correcting barcodes, generated by sphere reservation over the whole 4ᵏ space and decoded in constant time by prefix identification. Decoding runs over real reads, not just over trimmed barcodes: it finds the barcode inside a read, optionally behind one or more constant prefixes tried in the order you list them. On the published 100-read example that ships with the sample project, decoding behind the paper's own two prefixes recovers 90 of 100 reads and names why the other 10 failed — whether no prefix matched or the barcode itself was outside every decode sphere.
Four sequencing chemistries, read from a versioned copy of Illumina's own documentation rather than embedded in code:
| Chemistry | Channels | Dark base | Why it differs |
|---|---|---|---|
| Four-channel SBS | red, green, blue, yellow | none | Every base carries its own dye, so colour balance imposes no constraint |
| Two-channel SBS | red, green | G | A is the dual-colour base |
| XLEAP-SBS | blue, green | G | C is the dual-colour base, not A. A set balanced on a NovaSeq 6000 is not automatically balanced on a NovaSeq X |
| One-channel SBS | image 1, image 2 | G | A in image 1 only, C in image 2 only, T in both |
Eleven instruments, each carrying two separate facts about index 2: the orientation the machine reads, and the orientation the demultiplexing software expects typed. They differ on purpose on the NextSeq 1000/2000 and the NovaSeq X.
Seven vendor index kits, 534 index records: TruSeq Single Indexes (24 × 6 nt), TruSeq DNA and RNA CD Indexes (12 i7 × 8 i5, combinatorial), IDT for Illumina–TruSeq DNA and RNA UD Indexes (100 pairs), and IDT for Illumina UD Indexes Plates A–D (96 · 96 · 98 · 100 pairs, 10 nt). Every i5 is stored in both published orientations, exactly as the vendor prints them.
The science
Barcodes are an error-correcting code. That framing is the whole engine. A set's minimum pairwise distance d is the only number that matters, because a code can correct any error pattern that leaves a read closer to its true codeword than to any other: ⌊(d−1)/2⌋ errors correctable, d−1 detectable. Everything else — GC window, homopolymer screening, self-complementarity — is about whether the barcode can be synthesised and read, not about whether it can be told apart.
Which distance you measure changes the answer. Hamming assumes the barcode sits at a known offset. Real reads have insertions and deletions, which shift everything downstream, so a set that corrects one substitution may correct zero indels. Sequence-Levenshtein is the honest metric for a barcode read in DNA context, and it is why the panel reports all four rather than the one you designed against.
Colour balance is a property of the pool, not of any single index. On two-channel and
one-channel chemistries, G carries no dye. If every library in a pool reads G at the same index
cycle, that cycle produces no signal at all and cannot be base-called. Separately, any individual
index read that begins with two G calls fails cluster registration for that library — Illumina names
exactly one of its own stock indexes, i7 [H/N]705 = GGACTCCT, as incompatible with single-plex
indexing on two-channel systems.
Being far enough apart to correct an error and being far enough apart to be accepted are two different requirements. Demultiplexing software does not run your error model; it counts mismatched bases and assigns a read to an index within its mismatch tolerance. Illumina's BCL Convert tolerates one mismatch per index read by default and requires every pair of indexes to differ by at least three bases; below that it reports a barcode collision and the run does not start. The arithmetic is the same sphere-packing bound the correction guarantee comes from — tolerating m mismatches needs a minimum distance of 2m+1 — which is why the vendor's stated threshold of 3 falls out of the default tolerance of 1 rather than being a separate number to look up. The consequence for design is sharp: a set built under sequence-Levenshtein can meet its own design distance by spending part of it on insertions and deletions the software does not model, and still be refused. Every index kit a vendor sells clears the requirement, at minimum Hamming distance 3 or 4.
Index hopping has two halves, and only one of them is knowable in advance. Hopping swaps one read's index for another library's. How often it happens depends on library preparation and flow-cell chemistry — Illumina publishes only direction (PCR-free worse than PCR-amplified, patterned ExAmp flow cells worse than non-patterned) and no per-instrument rate, so this panel reports none. Whether it can be removed, though, is exact arithmetic on the pool: a hopped read lands on some (i7, i5) combination, and if that combination is not itself an assigned sample the read is discarded as Undetermined. A unique-dual pool of 96 samples uses 96 of 9,216 combinations and rejects 99.0% of hops. A fully crossed combinatorial pool uses every combination and rejects none — every hopped read is silently filed as a real sample. That is the argument for unique dual indexes, stated as a number.
Provenance. The set-construction and distance engines are checked byte for byte against DNABarcodes; the FREE-divergence codes against the reference implementation from the paper that introduced them; and the pool-compatibility verdicts against checkMyIndex (Varet et al., Bioinformatics 35(5)
, 2018) over 5,721 verdicts spanning every pair of every index list that tool ships, under all three of its chemistries. Chemistry rules, instrument orientation, index-kit sequences and the demultiplexer's admission rule are copied from Illumina's own documentation with the source and retrieval date recorded, and refreshed from it rather than maintained by hand.Limitations
- The index-hopping rate is the vendor's, not a measurement of your pool. What is exact is the combination arithmetic: how many i7 × i5 combinations exist, how many you use, and therefore what share of hops lands somewhere harmless. The rate multiplied through it is Illumina's published typical range for a library-prep class — a range, with its retrieval date, for the class you chose. Nothing here observes your libraries, and there is no per-instrument figure, because the vendor publishes none.
- The i5 orientation check cannot tell which orientation you pasted. It tells you what the instrument reads and what its software expects; deciding which of the two your list is in is yours, because nothing in the sequence distinguishes them.
- Every distance in the audit is measured over every pair, so the work grows with the square of the set. A 179-barcode set is 15,931 pairs and the three standard error models are measured in about a tenth of a second; a 3,183-barcode set is 5,064,153 pairs and the same three take about 22 seconds, with nearest-neighbour profiles and the demultiplexer check adding roughly 11 more. Above a few hundred barcodes the audit therefore runs in the background: the page stays usable throughout, the panel reports how many of its measurements have finished, and there is a Stop beside it. Nothing about the answer changes — it is the same exhaustive comparison either way, and no sampling is substituted for it. The composition readouts (GC, per-cycle entropy and base composition, prefix collisions) do not depend on pairs and appear immediately whatever the size.
- Phaseshift is experimental and slow enough to be opt-in: on a 179-barcode 12 nt set it takes about twelve minutes, against about a tenth of a second for the other three metrics on the same set. It searches in the background and can be stopped, but the time itself is real — it is a search per pair, and there is no cheaper exact answer.
- Nextera XT v2 and AmpliSeq index kits are not in the bundled catalogue. They have no page in the vendor documentation set the others come from, and transcribing them by hand from a PDF would make them indistinguishable from invented data.
- Decoding assumes the barcode sits at the start of the read, or immediately after a constant prefix you name. A barcode at an arbitrary internal offset is not searched for.
- NovaSeq 6000 v1.0 reagents are not covered. Illumina publishes index-2 orientation guidance for v1.5 and not for v1.0, so v1.0 is absent rather than guessed.
Compared with other tools
Against the published checkMyIndex, whose compatibility rule this panel is validated against: it implements four-channel, two-channel and one-channel compatibility. This panel implements those three plus XLEAP-SBS, which moved the dual-colour base from A to C and which checkMyIndex predates. It also reports Illumina's own three-tier verdict (ideal / acceptable / unacceptable) with a per-cycle channel census rather than a single boolean, judges the same pool across all four chemistry generations at once, and carries the index-2 orientation per instrument.
Export
Indexes leave as CSV, TSV, FASTA, JSON carrying the distance guarantee, Illumina SampleSheet v2, or the clipboard. Assembled oligos leave as FASTA or an IDT bulk-input sheet with the synthesis scale and purification you chose.
Screenshots
Check my pool, run on a real vendor kit. The verdict is itemised: which indexes begin with GG, what the truncated read length does, and how much of the hopping is removable.
The same set, four chemistries. Ideal on one-channel and four-channel SBS, unacceptable on both two-channel generations.
A refusal that says what is wrong. The unreadable line is named rather than dropped.
Demultiplexing the published example. The panel says the reads are 100 bases and the barcodes 8
before anything runs, and offers to read the first 8 bases as the index while naming the layout that
assumes. Ambiguous reads are listed apart from assigned ones, each with the distance it landed at.
Ordering. Each assembled oligo shows its length and, at 70 nt, that it is over the 60 nt synthesis
guideline; the sheet asks for synthesis scale and purification rather than assuming them.
Indel-correcting decode over real reads. Each row names the prefix the read matched, and the failures say whether no prefix matched or the barcode was undecodable.
The Set tab. Every barcode carries its GC, its longest run of one base, the distance to its closest
neighbour and its flags; the line above says the set came back from the project, which is what you
see after reopening it or reloading the page.
What the same 32 barcodes guarantee under every metric rather than only the one they were
designed against — here identical (corrects 1, detects 3) under all four, which is the reassuring
answer and not the usual one. Phaseshift is the fourth row because it was asked for; until then it
sits in the table saying it has not been computed.
Related
In this group: Codon Optimization · Back-translate: protein → DNA, codon-usage weighted or degenerate · CRISPR Guide Design · Genetic Circuit · In-Situ Probes · CRISPR Edit Inference · RBS & Operon Design · Auto-Annotate · Apply features from a file · Power and sample size: replicates needed to detect an effect, or the power a design has · Trade-offs: which candidates in a table are not beaten on every objective at once
RBS & Operon Design
Work on the translation-initiation side of an expression construct: read the strength of an existing ribosome binding site, design a 5-prime UTR towards a strength you want, or stack several coding sequences into one operon.
Auto-annotate
Find the parts a construct is made of, from corpora that cite their own records, and put them on the map.