10  Spike-in normalisation

Sometimes a treatment changes a mark across the whole genome. This chapter explains why ordinary normalisation then hides the change, how a spike-in shows it, and how EpiNexus uses spike-ins. The example is a CUT&Tag experiment in which H3K27me3 drops across the genome. Chapter 15 follows the same experiment from start to end.

10.1 The question

Compare two samples. In the second sample, a region has fewer reads than in the first. Did the mark drop in that region only? Or did it drop everywhere? An ordinary analysis can answer only the first question. A spike-in lets you answer the second.

10.2 How it works

Why ordinary normalisation hides a global change

A sequencing library does not measure how much of a mark a sample has. Labs make each library to a similar size, and the sequencer reads a similar number of fragments from each one. A sample with half as much H3K27me3 still gives about the same number of reads. Those reads just come from fewer marked DNA molecules.

Normalisation then makes the samples comparable (Chapter 9). RLE, TMM and library size all assume that most regions do not change. They scale each sample so that the typical region looks the same in every sample. When the mark drops everywhere, no typical region stays the same. These methods then scale the loss away. A drug that removes half of a mark can look as if it changed nothing (Orlando et al. 2014; Chen et al. 2016).

What a spike-in adds

A spike-in is a fixed amount of material from another species, added to every sample at the start. “Fixed” is the key word: for example, the same number of fly cells in every sample. The spike-in goes through every step with the sample: the antibody, the washes, the library and the sequencer. So its reads show how much each sample was scaled up or down by these steps.

If a sample has less of the mark, the spike-in makes up a larger share of its reads. Spike-in normalisation divides each sample by its number of spike-in reads. A sample with more spike-in reads is scaled down more. The loss that ordinary normalisation hid becomes visible.

Three kinds of spike-in are common:

  • Chromatin or cells from another species, with the same antibody. The antibody binds the mark in both species. The first method of this kind, ChIP-Rx, added fly chromatin to human chromatin (Orlando et al. 2014). Others add whole cells: “we spiked-in a fixed number of control cells” (Fursova et al. 2019).
  • Cells from another species in CUT&Tag. The example data in this chapter add fly cells to mouse cells before the antibody step (Hu et al. 2024).
  • E. coli DNA that comes with the enzyme. The enzyme of CUT&Tag, pA-Tn5, is made in bacteria. It carries a little E. coli DNA into every reaction. The CUT&Tag authors “used the small amount of tracer genomic DNA derived from the E. coli during transposase protein production to normalize sample read counts in lieu of the heterologous spike-in DNA” (Kaya-Okur et al. 2019). This needs no extra step. But the amount depends on the enzyme batch and on how the enzyme was handled. Keeping it at room temperature “resulted in a 1–2 order-of-magnitude increase in the number of tagmented E. coli fragments” (Kaya-Okur et al. 2019). So E. coli DNA works as a spike-in only within a series of samples made with the same enzyme, in the same way.

From spike-in reads to scale factors

There are two common ways to turn spike-in reads into a scale factor.

Spike-in reads alone. Each sample’s scale factor is a constant divided by its number of spike-in reads (Orlando et al. 2014). The constant only sets the units. Tracks scaled this way can be compared directly between samples (Chapter 8). For the differential test, the spike-in counts give the size factors: “read counts for the spike-in genome … were supplied to calculate DESeq2 size factors” (Fursova et al. 2019).

Corrected by the input. The amount of spike-in is never exactly the same in every sample. In ChIP-seq, each sample’s input can measure this, because the input contains the spike-in too. In the input, the ratio of spike-in reads to sample reads should be the same for every sample. In practice it is not. In one survey of published data, the ratio varied between samples by a median of 1.4-fold, and by up to 12.4-fold (Patel et al. 2024). The input-corrected method multiplies each spike-in factor by this ratio (Fursova et al. 2019; Bressan et al. 2024).

Assigning reads to the right genome

The spike-in reads must be told apart from the sample’s own reads. Some reads align to both genomes, especially in sequences that the two species share. If you align the reads to each genome separately, these reads are counted twice. The risk is largest for close species, such as human and mouse (Patel et al. 2024).

The usual answer is to align the reads to one combined genome, and to drop the reads that fit both genomes (Orlando et al. 2014; Fursova et al. 2019; Bressan et al. 2024). A similar method aligns each read to both genomes, and gives the read to the genome where it aligns better. Reads that fit both genomes equally well are dropped. This rule comes from the sequencing of human tumours grown in mice (Ahdesmäki et al. 2016).

How much spike-in is enough

With too few spike-in reads, the scale factor is noisy. One spike-in pipeline is “designed to automatically exclude any samples with a calculated percentage of spike-in reads below 0.5%”. Its authors warn that below about 2 %, “small variations in spike-in content would drastically impact normalization” (Tallan et al. 2025). With too much spike-in, sequencing is wasted on the other species.

TipBest practice
  • Add the same amount of spike-in to every sample, at the start of the experiment.
  • Check the share of spike-in reads in every sample. Below 0.5 %, leave the sample out; below about 2 %, treat its factor with care (Tallan et al. 2025).
  • Make sure that no read counts for both genomes (Patel et al. 2024).
  • For ChIP-seq with inputs, check the spike-in ratio in the inputs, and correct for it (Patel et al. 2024; Fursova et al. 2019).

No publication sets a minimum number of spike-in fragments. EpiNexus uses 1,000: a sample with fewer is not calibrated.

10.3 In EpiNexus

NoteIn EpiNexus 1.2

On the Parameters step of the run wizard, open Advanced Parameters:

  • Use spike-in normalization turns spike-ins on. It is on by default for CUT&Tag and CUT&RUN, with E. coli as the spike-in genome.
  • Spike-in genome lists the installed genomes of other species. Choose the species that you added, for example Fruit Fly (dm6/BDGP6). If the GEO records of imported samples name a spike-in, the wizard suggests it.

The Review step names the spike-in, and says that a sample with fewer than 1,000 spike-in fragments falls back to RLE.

During the run, EpiNexus:

  • aligns every read to both genomes and gives it to the genome where it aligns better. Reads that fit both equally well are dropped;
  • counts the spike-in fragments (read pairs for paired-end data) with mapping quality 30 or more. For CUT&Tag and CUT&RUN, it counts them before duplicate removal, and only pairs whose two reads do not overlap, as nf-core/cutandrun does (nf-core community 2026). For ChIP-seq and ATAC-seq, it counts them after duplicate removal;
  • scales each track by 10,000 divided by the sample’s spike-in fragments;
  • uses input-corrected factors for ChIP-seq when every sample has its own input. Otherwise it uses the spike-in fragments alone;
  • uses size factors in proportion to the spike-in fragments in the differential test;
  • warns when a sample’s spike-in share is below 0.5 % or 2 %, or above 20 %, and when more than 5 % of the spike-in reads fit both genomes. The 20 % and 5 % values are EpiNexus’s own. The warnings for a low share are not given for E. coli, whose share is usually small.

The QC page lists each sample’s spike-in reads and whether it was calibrated. The methods text states which method was used.

Figure 10.1 shows these settings for the example below.

Part of the Parameters step: Peak Caller SEACR, Normalization RLE, Q-value Threshold 0.01, Min Peak Length empty because SEACR has no minimum length, a ticked box Use spike-in normalization with its explanation, a list of spike-in genomes with Fruit Fly (dm6/BDGP6) selected, and an unticked box Remove duplicate reads from target samples.
Figure 10.1: Spike-in settings on the Parameters step of the run wizard, for the CUT&Tag example: Use spike-in normalization is ticked and Fruit Fly (dm6/BDGP6) is chosen as the spike-in genome. The blue line says that GEO notes a spike-in for the four samples but not which genome. Normalization (RLE) is used for a sample with too few spike-in fragments. Remove duplicate reads from target samples is unticked here, as by default; the example run ticked it (Chapter 15). EpiNexus 1.2 interface; not covered by the book’s licence.

10.4 Reading the result: GSE221942

The example data come from a CUT&Tag study of H3K27me3 in mouse spermatogonia, the cells that produce sperm (GEO GSE221942) (Hu et al. 2024). It compares undifferentiated spermatogonia with differentiating ones, with two replicates each. Each reaction held 10,000 mouse cells and 20,000 fly cells: “Drosophila S2 cells at a 2:1 ratio to mouse spermatogonial cells” (Hu et al. 2024). Chapter 15 describes the data and the run in full. The run used here is b44d28b1, made with EpiNexus 1.2.3, with the fly genome dm6 as the spike-in.

Is there enough spike-in?

Table 10.1: Spike-in reads in the four libraries (run b44d28b1). Fly: share of read pairs that aligned better to the fly genome. Fit both: share that aligned equally well to both genomes and was dropped. Fragments: the fly pairs that were counted as spike-in fragments. Read pairs from the European Nucleotide Archive.
Sample Read pairs Fly Fit both Fragments Size factor
Undifferentiated, rep 1 9.64 M 8.7 % 0.12 % 314,697 0.83
Undifferentiated, rep 2 10.65 M 8.3 % 0.11 % 338,448 0.89
Differentiating, rep 1 9.61 M 11.7 % 0.16 % 418,983 1.11
Differentiating, rep 2 10.40 M 11.7 % 0.16 % 439,454 1.16

Three things stand out (Table 10.1):

  • Every sample has plenty of spike-in. 8–12 % of the read pairs are fly, and each sample has more than 300,000 spike-in fragments. That is far above 0.5 % and 2 %.
  • Few reads fit both genomes: 0.11–0.16 %. Mouse and fly are distant species.
  • The differentiating cells have a larger fly share: 11.7 %, against 8.3–8.7 %. The same number of fly cells went into every reaction. So the differentiating cells gave less H3K27me3 signal for the same amount of spike-in.

The counted fragments are fewer than the fly share suggests: about 1.1 million pairs went to the fly genome in the first differentiating sample, and 418,983 were counted. Only well-aligned pairs whose two reads do not overlap are counted. The rule is the same for every sample, so the ratios between samples are what matter.

The Quality Control page shows the same counts, with each sample’s scale factor for its track (Figure 10.2).

A table with four rows and the columns NSC, RSC, Est. frag, Fingerprint JSD, Spike-in fragments (418,983, 439,454, 314,697, 338,448), Spike-in % (11.7, 11.7, 8.7, 8.3), Both genomes % (0.16, 0.16, 0.12, 0.11), Scale factor (0.0239, 0.0228, 0.0318, 0.0295) and Calibration (Calibrated for all four).
Figure 10.2: The spike-in columns of the Metrics tab on the Quality Control page (run b44d28b1). The table is scrolled to the right, so the sample names are out of view. The rows are, from the top: differentiating rep 1 and 2, undifferentiated rep 1 and 2. Scale factor is 10,000 divided by the spike-in fragments; every sample is Calibrated. EpiNexus 1.2 interface; not covered by the book’s licence.

What the spike-in changes

Table 10.2: Reads in the 10,713 tested regions, in total and per spike-in fragment (from the run’s raw counts and Table 10.1).
Sample Reads in tested regions Per spike-in fragment
Undifferentiated, rep 1 2.06 M 6.5
Undifferentiated, rep 2 2.14 M 6.3
Differentiating, rep 1 1.99 M 4.8
Differentiating, rep 2 2.18 M 5.0

The four libraries have almost the same number of reads in the tested regions: 2.0–2.2 million each (Table 10.2). Ordinary normalisation would treat them as equal. Per spike-in fragment, though, the differentiating cells have about a quarter less: 4.9 against 6.4 on average, a ratio of 0.76.

The size factors carry this difference into the test. They are in proportion to the spike-in fragments: 0.83 and 0.89 for the undifferentiated samples, 1.11 and 1.16 for the differentiating ones. Each sample’s counts are divided by its factor, so the differentiating samples are scaled down.

MA plot with mean normalised count on a log scale from 1.5 to 3.6 on the x axis and shrunk log2 fold change from −4.6 to 3.8 on the y axis. A dense blue cloud fills the area below zero, between about −0.5 and −2. A thinner band of grey points lies between −0.5 and 0.5. Fewer orange points lie above 0.5, most of them at low counts.
Figure 10.3: MA plot of the comparison, differentiating against undifferentiated cells, with spike-in size factors. Each point is a region. Blue: lost H3K27me3 (5,897); orange: gained (456); grey: not significant (4,360). Most of the cloud lies below zero. Figure made by EpiNexus 1.2.3 (run b44d28b1).

The result is a global loss (Figure 10.3). 84.5 % of the regions have less H3K27me3 in differentiating cells. The median change is log2 −0.57, about one third less. 5,897 regions are called lost and 456 gained. The Differential page names the normalisation that was used (Figure 10.4).

The Differential Analysis page for H3K27me3: the comparison Diff_WT versus Undiff_WT, a description naming DESeq2, spike-in normalisation and 10,713 merged regions, two orange notes about two replicates, four cards (10,713 total peaks, 6,353 significant, 456 gained, 5,897 lost) and a volcano plot with a large blue group of lost regions on the left and a smaller orange group of gained regions on the right.
Figure 10.4: The top of the Differential page for the CUT&Tag example (run b44d28b1). The line Normalisation: spike-in shows that the spike-in size factors were used. The regions are the samples’ peaks merged at full extent (10,713 regions). In the volcano plot, most significant regions are lost (blue, 5,897); 456 are gained (orange). EpiNexus 1.2 interface; not covered by the book’s licence.

The tracks show the same loss (Figure 10.5). They are scaled by the spike-in, so their heights can be compared directly. At the centre of the peaks, the signal is about 1.5 in undifferentiated cells and about 1.1 in differentiating cells.

Line plot of mean spike-in scaled signal against distance from the peak summit, from −5,000 to +5,000 bp. All four curves rise to a sharp peak at the summit. The undifferentiated replicates reach 1.55 and 1.49; the differentiating replicates reach 1.05 and 1.11. At the flanks, the differentiating curves are also lower: about 0.11 against 0.14.
Figure 10.5: Average H3K27me3 signal around the peak summits, in spike-in scaled tracks. The two undifferentiated samples (green and vermillion) peak at about 1.5; the two differentiating samples (blue and yellow) at about 1.1. Figure made by EpiNexus 1.2.3 (run b44d28b1).

What would ordinary normalisation have shown? RLE makes the typical region the same in every sample. Here it would move the cloud of Figure 10.3 up, so that its middle sits at zero. The global loss would disappear. Regions that lost less than most others would then look like gains.

NoteIn EpiNexus 1.2

To see the difference in your own data, use Run again on the run page, turn off Use spike-in normalization, and compare the two MA plots on the Differential page.

10.5 Pitfalls

WarningPitfall: a spike-in that was not the same in every sample

A spike-in corrects the data only if the same amount went into every sample. “Spike-in normalization typically makes use of a single scalar to normalize genome-wide data, making the approach particularly vulnerable to errors in implementation” (Patel et al. 2024). A pipetting error in the spike-in shifts every region of that sample. E. coli DNA from different enzyme batches is a common case. Check that the replicates agree after spike-in scaling, for example in the sample PCA. If one replicate sits apart, look at its spike-in share first.

WarningPitfall: some samples calibrated, others not

If a sample has fewer than 1,000 spike-in fragments, EpiNexus cannot calibrate it. Its track is then scaled by sequencing depth (RPKM), not by the spike-in, and cannot be compared with the calibrated tracks. The differential test then uses RLE for all samples. The run shows a warning, and the QC page shows the sample as not calibrated. Add more spike-in, or sequence deeper, if you need a calibrated result.

10.6 Further reading

  • Orlando et al. (2014): ChIP-Rx, the first spike-in method for ChIP-seq.
  • Patel et al. (2024): how spike-ins go wrong, and guidelines to avoid it.
  • Tallan et al. (2025): PerCell, a spike-in method with quality checks.
  • Kaya-Okur et al. (2019): CUT&Tag, and E. coli DNA as a spike-in.