Chatomics Field GuideWhat They Don't Teach You

Sanity check · ChIP-seq

How to Call Peaks You Can Trust in ChIP-seq

A matched input control and the ENCODE blacklist are the two things standing between your peak list and a stack of copy-number and repeat artifacts you'd otherwise write up as binding sites.

By Ming "Tommy" Tang, Director of Bioinformatics in Big Pharma · Reviewed September 2026 · 5 min read

You aligned your ChIP-seq reads, ran macs2 callpeak, and got a peak file back. Maybe there was no input BAM handy so you called peaks against the sample alone. Maybe the genome build on your blacklist doesn't match the one you aligned to. Either way, MACS2 will not warn you: it will happily hand you thousands of confidently-scored peaks whether or not the antibody pull-down worked.

The cost of skipping this check is that you interpret genome assembly artifacts and copy-number gains as transcription factor binding or histone modification, then spend weeks chasing a biological story that was never there. In a cancer cell line this is especially easy to miss, because amplified regions produce more reads everywhere, including at your target, and a peak caller run without a control has no way to tell enrichment from ploidy.

This page gives you the checks to run in the next hour, in order of cost: read depth and library complexity from stats you likely already have, cross-correlation and FRiP once peaks exist, a blacklist filter, and a five-minute look at your top peaks and a known positive-control locus in a browser. By the end you'll know whether your peak list reflects the antibody or the genome assembly.

What it looks like when it's happening

  • Top-ranked peaks by MACS2 score sit in centromeric or satellite repeat regions when you open them in IGV
  • FRiP score comes back well under 1% even though MACS2 reports thousands of peaks
  • Peak calls pile up across large stretches that track whole chromosome arms rather than discrete binding events, especially in cancer cell lines
  • No signal at your known positive-control locus, e.g. no ER peak at TFF1 or GREB1
  • Cross-correlation plot from phantompeakqualtools is flat, or RSC sits well below 0.8 for a transcription factor experiment
  • MACS2 was run without -c because no input BAM was ever generated, and nobody flagged it before the run
  • Peaks called with default narrow settings on a histone mark like H3K27me3 come back fragmented into thousands of tiny intervals instead of broad domains
  • A large fraction of aligned reads land in a handful of blacklisted intervals genome-wide

Why it happens

ChIP-seq measures relative enrichment of a factor's binding over chromatin background, not absolute signal. Without a matched input or IgG control, MACS2 falls back to a local Poisson background model built from the ChIP sample itself. Open chromatin regions (active promoters, enhancers) and PCR- or GC-biased sequencing already produce more reads there than in closed chromatin, so those regions look enriched even with no antibody involved. In a cancer cell line with copy-number gains, amplified regions produce proportionally more reads across the whole locus, including wherever your factor happens to sit, so a caller with no control ranks amplicons as top hits independent of true binding.

The blacklist problem is a genome assembly problem, not a chromatin problem. Satellite DNA, centromeres, rRNA genes, and NUMTs are collapsed or misassembled in the reference, so multi-mapping reads originating from many true genomic copies all pile onto the few reference copies that exist. That produces enormous, structureless read stacks in every ChIP-seq library, including the input, independent of cell type or antibody. Left in, they inflate genome-wide statistics like FRiP and any correlation-based QC, because a small number of blacklisted loci can absorb a disproportionate share of total reads.

Narrow versus broad mismatch is a biology problem dressed up as a parameter choice. A transcription factor binds a short specific motif, producing sharp peaks a few hundred base pairs wide with a crisp cross-correlation profile. A histone mark like H3K27me3 or H3K36me3 spreads across kilobase- to megabase-scale domains with lower per-base fold enrichment and a flatter cross-correlation curve even in a technically successful experiment. Calling a broad mark with narrow defaults fragments real domains into pieces that individually fail significance; calling a TF with --broad merges adjacent independent binding events into one meaningless blob.

Underneath all three failure modes is the same trap the caller can't warn you about: MACS2's default p-value of 0.01 is intentionally relaxed and was never meant to be a final answer on its own, it's meant to feed a downstream comparison like IDR across replicates. Treating the raw peak list as truth, without checking depth, control, blacklist overlap, and biology first, is how artifacts end up in a results section.

The checks

Run them in order. Each one tells you what healthy looks like and what the problem looks like.

0/8 checked · saved in this browser

  1. Run flagstat-style read counting on each aligned BAM and count uniquely mapped, non-duplicate fragments per replicate.

    bash
    samtools flagstat sample.bam
    Healthy
    ENCODE's standard for TF ChIP-seq is at least 20 million usable mapped fragments per replicate.
    Red flag
    Under 10 million mapped fragments is insufficient by ENCODE's own standard, and under 5 million is extremely low; low-depth libraries produce unstable peak calls regardless of everything else you check.
  2. Verify the alignment pipeline filtered out low-confidence multi-mapped alignments (MAPQ below 5-10) before the BAM was handed to MACS2.

    Healthy
    A filtered BAM with only confidently-mapped reads going into peak calling.
    Red flag
    Unfiltered BAMs where reads with MAPQ under 5 are still present introduce noise from repetitive regions that MACS2 will happily call as peaks.
  3. Intersect the aligned BAM against the build-matched ENCODE blacklist and compare read counts before and after removal.

    bash
    bedtools intersect -v -abam sample.bam -b blacklist.bed > sample_filtered.bam
    Healthy
    A small, roughly consistent fraction of reads removed across your samples and their input control.
    Red flag
    A disproportionate share of reads concentrated in a handful of blacklisted intervals; ENCODE found 582 million of 2.5 billion uniquely aligning human reads landing in blacklisted regions in aggregate, so this is not a rare failure mode.
  4. From the deduplicated, filtered BAM, compute the fraction of non-redundant reads (NRF) and the PCR Bottleneck Coefficients (PBC1, PBC2) that ENCODE uses to flag over-amplified libraries.

    Healthy
    NRF above 0.9, PBC1 above 0.9, PBC2 above 10.
    Red flag
    Lower values mean the library was over-amplified by PCR, so what looks like signal at many loci may just be duplicate reads from a handful of original fragments.
  5. Run phantompeakqualtools on each replicate BAM to get the normalized and relative strand cross-correlation coefficients.

    Healthy
    For transcription factor ChIP-seq: NSC at least 1.05 and RSC at least 0.8. For broad histone marks (H3K27me3, H3K36me3): RSC commonly sits in the 0.4-0.8 range and a flatter profile is expected even when the experiment succeeded.
    Red flag
    A flat cross-correlation profile with NSC near 1 and RSC well under 0.8 for a transcription factor experiment; the same numbers on a broad histone mark are not automatically a failure, see below.
  6. Call peaks with MACS2 using the matched input as control, choosing narrow or broad mode to match the target, then compute the fraction of reads falling inside called peaks.

    bash
    # narrow, e.g. transcription factor
    macs2 callpeak -t treatment.bam -c control.bam -f BAM -n output -p 0.01 --nomodel --extsize 147
    
    # broad, e.g. H3K27me3 or H3K36me3
    macs2 callpeak -t treatment.bam -c control.bam -f BAM -n output --broad -p 0.01 --nomodel --extsize 147
    Healthy
    FRiP at or above 1% for point-source data called with MACS2 default parameters.
    Red flag
    FRiP well under 1%, or a peak set that was called without -c at all because no control BAM existed for the run.
  7. Load the bigWig tracks and peak calls in a genome browser. Check for signal at a locus your biology predicts (e.g. ER ChIP should show a peak at TFF1 or GREB1), then sort peaks by score and look at the top 20 by eye.

    Healthy
    Clear enrichment at the expected biological locus, and top-scoring peaks that look like punctate factor binding or coherent domains over input, not flat repetitive stacks.
    Red flag
    No signal at the expected positive-control locus, or top-ranked peaks sitting in satellite repeats, centromeres, or regions that track whole chromosome arms rather than a specific binding pattern.
  8. Compare peak shape and count from narrow mode against --broad mode for the same sample, and check whether the broad-cutoff parameter (set independently from the narrow p-value) is appropriate for the mark.

    Healthy
    Transcription factors produce a manageable number of sharp, narrow peaks a few hundred base pairs wide. Histone marks like H3K27me3 or H3K36me3 produce broad domains spanning kilobases to megabases under --broad.
    Red flag
    A histone mark called with narrow defaults comes back as thousands of tiny fragmented intervals instead of coherent domains, or a TF called with --broad merges obviously distinct binding events into one region.

What to do about it

Get or reconstruct a matched input control

When: Peaks were called without -c, or the only control available is from an unrelated batch or cell state.

Re-run MACS2 with a matched input or IgG BAM from the same cell line and condition as -c. If a true matched input truly does not exist, at minimum use a pooled input from the same cell line processed in the same batch, and flag every downstream peak as candidate-only until validated against a positive-control locus.

Caveat: A pooled or mismatched-condition input is still better than no control, but it can under- or over-correct condition-specific chromatin state changes, so treat peaks near the edge of significance with extra suspicion.

Filter blacklist regions before, not after, normalization

When: A meaningful fraction of reads or your top peaks fall inside ENCODE blacklist regions.

Download the ENCODE blacklist matched to your exact genome build, then filter the BAM with bedtools intersect -v -abam sample.bam -b blacklist.bed before peak calling, or subtract blacklist regions from an existing peak set with bedtools subtract -a peaks.bed -b blacklist.bed -A.

Caveat: Filtering only the final peak file after you've already computed genome-wide correlations, FRiP, or normalization factors is too late, those statistics are already skewed by the same reads; filter the BAM upstream whenever possible.

Match narrow/broad mode and thresholds to the target

When: Default narrow calling fragments a known-broad histone mark, or --broad merges what should be distinct TF peaks.

Re-run with --broad and tune broad-cutoff independently from the narrow p-value of 0.01 for domain-forming marks; keep narrow mode with an explicit --extsize derived from cross-correlation (or the 147 bp default) for point-source factors.

Caveat: broad-cutoff and the narrow p-value are separate knobs; changing one without the other can merge unrelated domains together or keep fragmenting real ones.

Investigate ChIP efficiency before touching thresholds

When: FRiP is under 1% or NSC/RSC fail the transcription-factor thresholds.

Before relaxing any statistical cutoff, check whether the antibody itself is the problem: does the peak set show signal at a known positive-control locus at all, and is there a knockout or cross-reactivity check available for this antibody the way ENCODE and antibody validation studies use KO-vs-WT lines to separate real signal from nonspecific noise.

Caveat: A relaxed p-value threshold does not fix poor immunoprecipitation efficiency, it just widens the noise floor around the same failed pull-down.

Relax the p-value only as a labeled, last-resort step

When: The dataset is genuinely low-depth or low-replicate, biology predicts many true binding sites, and default MACS2 settings return almost nothing.

Rerun with a relaxed p-value (e.g. p<0.1 instead of the 0.01 default) or rank peaks by score and take the top N for enrichment analysis, then require IDR across true replicates or biological validation before trusting any specific call.

Caveat: This produces a hypothesis-generating peak set, not a defensible final one; label it as such in any report and don't carry it into a publication-grade peak list without IDR or orthogonal validation.

When not to "fix" it

Don't force transcription-factor-grade cross-correlation thresholds onto broad histone mark data. An RSC of 0.4-0.8 on H3K27me3 or H3K36me3 is the expected flatter profile of a genuinely broad domain mark, not evidence of a failed experiment, and re-processing it to chase RSC above 0.8 will just fragment real biology. Similarly, if a factor shows no peaks at a locus you expected, and the antibody has already been validated (positive control elsewhere, no cross-reactivity), that absence may be the correct biological answer for this condition, not a QC failure to correct away; talk to the wet lab about the experimental design before reprocessing the data to force a peak into existence.

Five things experienced analysts do here

  1. Request a matched input for every condition, not one pooled input reused across a whole project; chromatin accessibility changes with treatment, and a stale input misses that.
  2. Look at the raw bigWig track before you look at any p-value or peak score; your eyes catch copy-number-shaped signal that a summary statistic won't.
  3. Check the top 20 peaks by score in a browser on every run, regardless of what FRiP or NSC/RSC report, because both metrics can look fine while the top calls are repeat artifacts.
  4. Keep separate mental QC bars for narrow (TF) and broad (histone) data; applying TF-level RSC thresholds to a histone mark will make you distrust a perfectly good experiment.
  5. Always re-download the ENCODE blacklist matched to the exact genome build you aligned to; an hg19 blacklist filtered against hg38 coordinates silently does nothing.

Questions people ask

Do I really need an input control for ChIP-seq?

Yes, for any dataset you intend to interpret biologically. Without a matched input or IgG control, copy-number gains, open chromatin, and mappability artifacts get called as peaks, because the caller has nothing to subtract the background against. If a control genuinely cannot be generated, treat every resulting peak as a candidate that needs validation at a known positive-control locus before you trust it.

What is the ENCODE blacklist and do I need to match it to my genome build?

It's a curated list of genomic regions, satellite repeats, centromeres, rRNA genes, and NUMTs, that produce anomalous high signal in essentially every ChIP-seq or input library because they're collapsed or misassembled in the reference genome. Yes, you need the version matched to your exact genome build; filtering hg38 alignments with an hg19 blacklist removes nothing because the coordinates don't correspond to the same sequence.

What FRiP score is good enough for ChIP-seq?

For point-source data called with MACS2's default parameters, ENCODE expects FRiP at or above 1%. Below that, ENCODE flags the experiment for scrutiny, and you should check read depth, control quality, and blacklist contamination before trusting the peak set.

My RSC is only 0.5 for a histone ChIP-seq experiment, did the pull-down fail?

Not necessarily. RSC in the 0.4-0.8 range is normal for broad histone marks like H3K27me3 or H3K36me3, which produce a flatter cross-correlation profile than sharp transcription factor peaks even when the experiment worked. Apply the stricter RSC ≥0.8 bar only to transcription factor data.

Should I call peaks with -p or -q in MACS2?

The commonly used default is -p 0.01 with --nomodel --extsize set to your measured or default fragment length (147 bp), which is intentionally relaxed and meant to feed downstream comparison across replicates via IDR rather than serve as a final significance cutoff on its own. Treat any single-run peak list called this way as provisional until it's been checked against a control, the blacklist, and known biology.

Related pages

Related reading on the blog

Sources

  1. ENCODE ChIP-seq Transcription Factor Data Standards and Processing Pipeline — Read depth requirements, control specifications, library complexity metrics, and IDR analysis standards
  2. ChIP-seq Quality Control Documentation — NSC/RSC thresholds, FRiP standards, MAPQ filtering, blacklist filtering command
  3. MACS2 Peak Calling Details — Fragment length handling, p-value versus q-value, narrow versus broad peak parameters
  4. The ENCODE Blacklist: Identification of Problematic Regions of the Genome — Root causes of blacklisted regions and their impact on ChIP-seq false positives

Part of the Peak calling controls and blacklists series.