Written and maintained by CASRAI Editorial Board
Last updated
Depth of coverage and breadth of coverage answer different questions about the same alignment file, and conflating them is one of the most common blind spots in sequencing QC. Depth of coverage is a per-position count: how many aligned reads span this exact base. Breadth of coverage is a proportion: what fraction of the target region is captured at all, or captured at or above whatever minimum depth you have decided is usable. A run can report an excellent average depth and still leave real, callable positions uncovered — a gap that the average alone cannot reveal.
What depth of coverage actually measures
Depth at a given base is simply the count of aligned reads that overlap it in the BAM/CRAM pileup (see our guide to the BAM file format for how that alignment is stored). Averaged across a whole genome or a target region, it becomes mean depth — total aligned bases divided by region length. Standard tools compute this directly from the alignment: samtools depth and samtools coverage report per-base and per-region depth, and mosdepth (Pedersen & Quinlan) computes the same statistics an order of magnitude faster by working from the BAM index rather than a full pileup. Picard’s CollectWgsMetrics and CollectHsMetrics report it as MEAN_COVERAGE/MEAN_TARGET_COVERAGE. All of these describe the same thing: a single number summarizing how many independent observations, on average, support each position.
What breadth of coverage adds that depth doesn’t
Breadth of coverage asks a spatial question instead of a central-tendency one: what fraction of bases meet a depth floor? The simplest form — the fraction of target bases with at least one read — only tells you whether a position was sequenced at all. The more useful form fixes a minimum usable depth and reports the fraction of the target clearing it: “% of target covered at ≥10x,” “% at ≥20x,” and so on. Picard’s CollectHsMetrics exposes exactly this as a family of metrics — PCT_TARGET_BASES_1X, PCT_TARGET_BASES_10X, PCT_TARGET_BASES_20X, PCT_TARGET_BASES_30X, up through PCT_TARGET_BASES_100X — each defined as the fraction of target bases achieving that depth or greater. mosdepth’s --thresholds option computes the same breadth-at-threshold statistic directly from a BED of target regions. A capture panel or exome specification that lists coverage requirements is almost always expressing them this way, not as a bare average.
Why a high average can still leave gaps
An average erases distribution. A target region sitting at a reported 30x mean can be built from a fairly uniform stack of 25–35x reads across every base — or from a majority of bases at 45–50x and a meaningful minority sitting at 2–5x, which the mean will not surface. Both scenarios report the identical “30x average depth” headline number; only one of them supports confident calling everywhere in the target. Because sequencing coverage is not perfectly uniform even under ideal conditions — and gets considerably less uniform under real library-prep and capture conditions — a mean-depth-only QC report is, on its own, an incomplete signal. This is exactly what breadth of coverage at a threshold is designed to catch: it converts “how much sequencing did we generate” into “how much of the target can we actually trust,” which is the question that matters downstream.
What actually drives uneven coverage
Three mechanisms account for most of the depth unevenness seen in real sequencing runs:
- GC bias. PCR amplification during library preparation does not treat every fragment equally: extreme GC content (both very GC-rich and very AT-rich) fragments amplify less efficiently than fragments near typical genomic GC content, so they end up systematically under-represented in the final read pool regardless of how much total sequencing is generated. Benjamini and Speed formalized this dependence between GC content and observed read count and showed it holds across Illumina platforms and library preparations — it is a property of the PCR step, not a single instrument quirk.
- Repetitive and low-complexity regions. Reads originating from repetitive DNA often map to multiple genomic locations with roughly equal quality, which alignment software flags with a low mapping quality (MAPQ). Depth tools and downstream variant callers commonly filter on a MAPQ threshold, so a region can carry plenty of raw sequenced reads while contributing almost no usable, uniquely-mapped depth once that filter is applied — a gap that a MAPQ-blind depth count would miss entirely.
- Capture-efficiency variation in targeted and exome sequencing. Hybridization-capture panels rely on probes binding to target sequence, and probe binding efficiency is not uniform across a panel — probe GC content, local sequence context, and pooling ratios all affect how well a given target region is pulled down before sequencing even starts. This adds a second, capture-specific layer of unevenness on top of PCR-driven GC bias, which is why exome and panel data typically show more pronounced breadth-of-coverage gaps than PCR-free whole-genome sequencing at a comparable mean depth (see our NGS library prep kit buying guide and Illumina vs Nanopore comparison for how prep and platform choice feed into this).
A single-number way to see the unevenness: FOLD_80_BASE_PENALTY
Picard’s CollectHsMetrics also reports FOLD_80_BASE_PENALTY: the fold-over-sequencing needed to bring 80% of target bases with non-zero coverage up to the mean target depth. A value close to 1 means depth is distributed evenly — the mean is a fair description of most of the target. A value of, say, 2.5 means you would need roughly two-and-a-half times the sequencing to pull the worst-covered 80% of the target up to the reported mean — a direct, quantified statement that the mean is an optimistic summary of a genuinely lopsided distribution. It is one of the few widely used metrics that turns “coverage looks uneven” into a single comparable number across runs.
Why breadth at a threshold is the more decision-relevant metric
Confident genotype calling depends on independent read support at a position, not on whether a position was touched by sequencing at all. A heterozygous variant call needs enough independently sampled reads at that position to distinguish a true ~50% alternate-allele fraction from sequencing noise; the framework GATK and comparable callers use to assign genotype likelihoods scales directly with how much independent evidence sits behind each call. A position at 2x cannot support that distinction reliably even though it is, technically, “covered.” This is the practical reason breadth of coverage at a minimum-depth threshold is the more clinically and analytically relevant figure than mean depth alone: a genome or panel can hit its target mean while a meaningful fraction of positions — often concentrated in exactly the GC-extreme, repetitive, or poorly-captured regions described above — never crosses the depth floor a caller needs. The failure mode this produces is a false negative, not a false positive: a real variant sitting in a low-coverage pocket is simply never called, and nothing in a mean-depth-only report flags that it happened. Reduced depth also degrades confidence even where a call is made, by widening the uncertainty around the observed allele balance and making it harder to separate a genuine heterozygote from an artifact.
Reporting both metrics in practice
A QC report that states mean depth without a companion breadth-at-threshold figure is incomplete for any use case where missing a variant in an under-covered pocket matters. In practice: run samtools coverage or mosdepth for a fast per-region summary, or Picard’s CollectWgsMetrics/CollectHsMetrics for the full PCT_TARGET_BASES_Nx family plus FOLD_80_BASE_PENALTY; report mean depth alongside the percentage of target at your chosen calling threshold (commonly ≥10x cited as a floor for confident diploid heterozygous calling, with substantially higher thresholds — often 100x or more — used where low-allele-fraction somatic variants must be distinguished from noise). Deduplication matters here too: raw depth before removing PCR duplicates overstates independent evidence, which is why low-input or low-coverage protocols increasingly use unique molecular identifiers (UMIs) to separate genuinely independent molecules from PCR copies of the same original fragment before depth and breadth are calculated. Clinical and diagnostic laboratories don’t adopt a single universal number here — NGS validation standards require each lab to define and validate its own minimum depth and breadth thresholds against its specific assay, specimen type, and calling pipeline, precisely because the uniformity of coverage depends on the library prep, capture chemistry, and platform in use, not on a generic industry constant. If your organization is scoping a sequencing service or platform, coverage-uniformity behavior is worth asking about directly — see our NGS service buying guide.
When a clinically important position falls in a persistent low-breadth gap that repeated sequencing doesn’t close, orthogonal confirmation remains standard practice: targeted Sanger sequencing is still the conventional fallback for confirming a call NGS coverage can’t reliably reach on its own.
Frequently asked questions
Is 30x average depth enough for reliable variant calling?
Not by itself. A 30x mean is consistent with a well-covered target, but the mean cannot tell you whether that depth is distributed evenly or concentrated unevenly with real gaps underneath it. Always check breadth of coverage at your calling threshold (commonly ≥10x, higher for demanding applications) alongside the mean before treating a sample as adequately covered.
What breadth-of-coverage threshold should I report?
There is no single universal number. ≥10x is widely cited as a practical floor for confident germline heterozygous SNP calling; low-allele-fraction somatic variant detection typically requires much deeper thresholds. Assay-validated clinical pipelines set and document their own threshold rather than borrowing a generic figure, because the achievable uniformity depends on the specific library prep and capture chemistry used.
Does high breadth of coverage guarantee a low false-negative rate?
No. Breadth-at-threshold metrics like PCT_TARGET_BASES_10X count depth after whatever mapping-quality and duplicate filters were applied upstream. A region can show acceptable raw depth while contributing little usable, uniquely-mapped coverage if it sits in a repetitive stretch that gets filtered out downstream — check what filters were applied before the breadth number was calculated.
Why do exome and targeted panels show more uneven coverage than whole-genome sequencing?
Targeted and exome sequencing add a hybridization-capture step on top of PCR amplification, and probe-binding efficiency varies by region independently of GC bias. PCR-free whole-genome protocols skip the capture step entirely, which is one reason WGS coverage distributions are often more uniform at a comparable mean depth than exome or panel data.
Can two samples with identical mean depth be clinically very different?
Yes, and this is the central risk of relying on mean depth alone. One sample can have that depth spread evenly across the target; another can concentrate it in easy-to-sequence regions while leaving GC-extreme or poorly-captured exons well below a usable threshold. Both report the same average; only a breadth-of-coverage check at a defined depth threshold distinguishes them.
References
- Pedersen BS, Quinlan AR. mosdepth: quick coverage calculation for genomes and exomes. GitHub: brentp/mosdepth.
- Broad Institute. Picard metric definitions — HsMetrics (PCT_TARGET_BASES_Nx, MEAN_TARGET_COVERAGE, FOLD_80_BASE_PENALTY).
- Benjamini Y, Speed TP. Summarizing and correcting the GC content bias in high-throughput sequencing. Nucleic Acids Research 2012;40(10):e72.
- DePristo MA, et al. A framework for variation discovery and genotyping using next-generation DNA sequencing data. Nature Genetics 2011;43:491–8.
- The SAM/BAM Format Specification Working Group. Sequence Alignment/Map Format Specification. samtools/hts-specs.








