Skip to content

Detecting Contamination in Sequencing Data

11 min read · updated August 11, 2026

“My taxonomic report says 3 percent of reads are from a species that cannot be in this sample.” That single observation is consistent with four different problems, and two cheap checks separate them before you touch any parameters.

The symptom

The usual form is a classification report with an entry that makes no sense: a marine bacterium in a human stool sample, a plant pathogen in a clinical isolate, a second bacterial species in what was supposed to be a pure culture. Variants of the same underlying problem show up elsewhere and should be recognised as the same thing:

  • A genome assembly whose contigs split into two groups with clearly different GC content and coverage depth.
  • Variant calls with allele fractions clustered around some low value such as 0.05 rather than around 0.5 and 1.0 — the signature discussed in variant calling, where a contaminating sample contributes its own alleles at the fraction it occupies.
  • A negative control that produced reads at all, when by construction it contained no template.
  • A low overall alignment rate to the expected reference with the missing reads unaccounted for.

Resist the first instinct, which is to raise a classifier threshold until the offending line disappears. That silences the report without establishing whether there is a real problem, and if the contamination is real it is still in every downstream result.

Four causes that look identical

  • Classification artefact. No foreign DNA at all. Reads from your organism, or from low-complexity and conserved regions, are matching k-mers attributed to another taxon. This is the default behaviour of a permissive classifier: with a confidence threshold of zero, a read is assigned on a single matching k-mer, as worked through in taxonomic classification from short reads.
  • Reagent and environmental contamination. Real foreign DNA introduced from extraction kits, buffers, water or the laboratory environment. The taxa involved are a fairly consistent set of common soil and water organisms, and the defining behaviour is that the absolute amount is roughly constant per reaction, so it dominates low-biomass samples and vanishes in high-biomass ones.
  • Cross-sample contamination during preparation. Real DNA from another sample in the same batch, introduced by aerosols, pipetting or a shared surface. Physical, and usually traceable to plate position.
  • Index hopping during sequencing. Real DNA from another sample on the same flow cell, misassigned at demultiplexing because a free adapter carrying one sample’s index primed a cluster from another. This one happens after your bench work is finished and no amount of clean technique prevents it.

Check one: coverage breadth

This check separates cause one from the other three, and it is the most useful diagnostic in the whole area because it is cheap and decisive.

Take the reads assigned to the suspicious taxon, align them to that organism’s reference genome, and look not at how many aligned but at where they aligned.

Real organism present:
  reads distributed across the whole genome
  breadth of coverage roughly as expected from depth
  e.g. 3% of 20M reads at 150 bp over a 4 Mb genome
       = 600,000 x 150 / 4e6 = 22x mean depth,
       and at 22x you should see near-complete breadth

Classification artefact:
  reads pile onto a few loci -- rRNA operons, conserved
  housekeeping genes, repetitive or low-complexity regions
  breadth is a few percent of the genome at high local
  depth, with most of the genome at zero

The reasoning is that a real organism’s DNA was fragmented randomly, so its reads sample the whole genome. Reads that were mis-assigned came from a homologous region, and homologous regions are a small and specific part of the genome. Breadth and depth disagreeing by an order of magnitude is the signature, and read count alone cannot show it.

Check two: read fraction across the run

If breadth says the organism is really there, the next question is where it came from, and the discriminating evidence is how its abundance behaves across the other samples in the batch. Build one table: for each sample, the fraction of reads assigned to the suspect taxon, alongside that sample’s plate position, lane, index pair and input biomass.

  • Index hopping. The suspect appears in every sample on the same flow cell at a small fraction that is roughly proportional to its abundance in the sample where it is genuinely dominant. Published rates for patterned flow cells using exclusion-amplification chemistry are commonly quoted in the range of about 0.1 to 2 percent, so a sample at 3 percent when the neighbouring sample is at 60 percent is within the expected band. The decisive evidence is the index: if you used combinatorial rather than unique dual indexes, hopped reads produce valid-looking index pairs and are silently assigned. With unique dual indexes, hopped reads produce pairs that match no sample and land in the undetermined bin, so check its size — the undetermined fraction is the measurement of your hopping rate.
  • Cross-sample contamination at the bench. The contribution is not uniform across the run. It concentrates in samples adjacent on the plate to the high-abundance source, or in samples processed consecutively. Plotting the suspect fraction as a plate heatmap makes a row, a column or a neighbour relationship visible immediately, and that spatial pattern is something index hopping does not produce.
  • Reagent contamination. The fraction is inversely related to input biomass — highest in your lowest-input samples, negligible in the highest — because the absolute contribution is fixed. It appears in negative controls, which is what negative controls are for. It is consistent across runs sharing a reagent lot and disappears when the lot changes. Prevalence-based decontamination methods formalise exactly this: a taxon whose prevalence is higher in negative controls than in true samples, or whose frequency scales inversely with DNA concentration, is flagged as a contaminant.
Index-hopping rates are instrument-, chemistry- and library-preparation-dependent and change with platform generation. Treat the range above as a published order of magnitude, and measure your own rate from the undetermined-index fraction rather than assuming it.

Fixing each cause

  1. If breadth says artefact: raise the classifier confidence threshold from its default and re-run, and add the host genome and known common contaminant genomes to the reference database so those reads are labelled rather than mis-assigned. Also mask low-complexity regions if the tool supports it. Re-check breadth afterwards to confirm the entry is gone for the right reason.
  2. If the pattern is index hopping: the reads are real and belong to another sample, so they must be removed rather than explained. Re-demultiplex with unique dual indexes if the library design supports it, and discard reads whose index pair is not a valid combination. If it does not, the honest options are to subtract an estimated hopping fraction and treat any result near that level as unreliable, or to re-sequence with a corrected design. Do not pool low-biomass samples on a lane with a high-biomass sample of the organism you are looking for.
  3. If the pattern is spatial: the problem is at the bench. Re-extract affected samples, separate high- and low-biomass samples physically and temporally, and include a blank well in the plate layout so the next run measures the rate rather than inferring it.
  4. If it tracks input biomass: the reagents are the source. Process negative controls through the full protocol with every batch, apply a statistical decontamination method using those controls, and record the reagent lot so the pattern is attributable next time.
  5. In every case, record the decision. Note which reads were removed, by which rule, and what the residual rate was. A contamination correction applied silently is indistinguishable downstream from data that was always clean, and the next person to look at an odd result will re-derive all of this from scratch.

One boundary is worth stating explicitly. In a diagnostic setting the distinction between a real organism and a contaminant is not a computational determination — it is made against validated laboratory procedures, run controls and clinical context, in an accredited laboratory under a regulatory framework. The checks above are how you investigate an anomaly in research data, not how a clinical result is established.