13  Structural Variation and Copy Number: Implementations

Implementationstooling reviewed 2026-08

Everything on this page is generated from tools/sv.json. If something here is wrong or out of date, the fix belongs in that file, not in this prose.

For why a rearrangement is harder to call than a substitution, see Section 12.1.

13.1 Calling from short reads

Short reads see a rearrangement only through the ways alignment fails around it — Section 12.3 — so a caller’s design is mostly a decision about which failures it trusts. The two below take opposite routes to the same difficulty. One weighs several evidence types inside a single caller. The other accepts that any single caller’s output is mostly artifact and spends its effort on filtering a cohort.

DellyrecommendedC++

Weighs paired-end, split-read and read-depth evidence together rather than specializing in one of them, which matters because each signal is blind to a different class of event — depth sees unbalanced changes with no clean junction, split reads give base-pair breakpoints, read pairs bridge what neither resolves alone. The same binary also has long-read, assembly-based and copy-number modes, so a project that starts here rarely has to leave. (Rausch et al. 2012)

Cohort work is a call, merge, re-genotype sequence rather than one command, and the merge step is where the decisions are. Read its documentation before going past a handful of samples.
activelast release 2026-08BSD-3-Clausev2.6.0reviewed 2026-08
GATK-SVrecommendedWDLpyR

An ensemble pipeline rather than a caller: it runs several discovery tools per sample, then spends most of its length on batch-level genotyping, filtering and complex-event resolution. That is the right shape for short-read structural variation, where any single caller’s raw output is mostly artifact and a cohort is the only thing that separates recurrent error from recurrent biology. It is the pipeline the gnomAD-SV reference was built with. (Collins et al. 2020)

A WDL pipeline written for Cromwell and cloud batch execution, and its filtering models assume a cohort large enough to estimate from. For a handful of samples the setup cost is out of proportion to what it buys. Its per-sample discovery layer still includes Manta, which is archived upstream.
activelast release 2026-07BSD-3-Clausev1.1.1reviewed 2026-08

13.1.1 The ones you will meet

Three tools that are still in production pipelines and still turn up in methods sections. None of them has released in over three years, which is why none of them is above. Their situations differ, though, and the records say so: one is archived and relicensed, one is a wrapper keeping an older caller usable, and one has a method nothing else offers and a stalled release history.

Tool Upstream Languages Why / why not
GRIDSS2 dormantlast release 2022-02 javaR

Assembles the reads supporting each junction before calling it, which is what lets it report a single breakend — one side of a junction whose partner cannot be placed — as a call in its own right instead of dropping it. Genomes rearranged into chains rather than isolated events are where that representation earns its keep. Viable rather than recommended on release history, not on method. (Cameron et al. 2021)

smoove dormantlast release 2021-08 go

Drives LUMPY, svtyper and duphold as one command and performs the noise filtering those tools need but do not do for themselves — removing high-coverage regions and orphaned discordant reads before calling. That preprocessing is most of the distance between raw LUMPY output and a callset worth looking at, which makes this the only sensible way to run LUMPY now. (Pedersen et al. 2020; Layer et al. 2014)

Manta deprecatedlast release 2019-07 C++py

Fast, accurate for its generation, and embedded in so many production short-read pipelines that you will meet it whether or not you choose it. It is listed as history rather than as an option: Illumina archived the repository in October 2025 and relicensed it in the same week from GPLv3 to PolyForm Strict, which permits noncommercial use and forbids distributing modified versions. (Chen et al. 2016)

WarningThe Manta relicensing reaches further than Manta

Relicensing is not retroactive — copies obtained under GPLv3 keep those terms — but anything that fetches Manta from upstream now gets PolyForm Strict instead, and anything that redistributes it is making a claim it may no longer be entitled to. That includes containers, conda recipes and pipelines that vendor it, most of which document the old license. GATK-SV, recommended above, still runs Manta in its per-sample discovery step.

13.2 Calling from long reads

A long read spanning a rearrangement carries the event inside a single alignment, which is a categorically easier inference than reassembling it from the failures of many short ones — Section 12.5. The consequence for this section is that the tools disagree less about whether an event is real and more about how to describe it.

sawfishrecommendedrs

Assembles junctions into local haplotypes and segments coverage in the same run, so a large deletion is described once with both its breakpoints and its depth support instead of arriving as two calls in two files that someone has to reconcile. It also demotes breakpoint calls whose depth does not agree to plain breakends, which is a principled way to remove a class of duplication false positive rather than a threshold. (Saunders et al. 2025)

HiFi only, and not open source: PacBio's license permits use on data generated on a PacBio instrument and does not allow distributing modified versions. Free to run for its intended purpose, but it cannot be forked, and that is a different kind of dependency from the rest of this page.
activelast release 2025-11PacBio Software License Agreementv2.2.1reviewed 2026-08
Sniffles2recommendedpy

The long-read default, and the output format most downstream long-read tooling already expects. Version 2 separated per-sample work from cohort work through an intermediate file per sample, which is the same escape from the N+1 problem that joint small-variant calling uses, and added a mode for mosaic variants sitting below germline allele fractions. (Smolka et al. 2024; Sedlazeck et al. 2018)

Population calling consumes the per-sample .snf intermediates, not the per-sample VCFs; a pipeline that only kept the VCFs has to re-run the discovery step.
activelast release 2026-05MITv2.8.0reviewed 2026-08
Tool Upstream Languages Why / why not
cuteSV activelast release 2026-07 py

Collects signatures for each variant type and clusters them type by type, instead of pushing every event through one generic breakpoint model. That is a genuinely different set of assumptions applied to the same reads, which is what makes it useful as a second caller alongside Sniffles rather than as a replacement for it. (Jiang et al. 2020)

dysgu activelast release 2026-07 pyC++

One caller for paired-end and long reads, scoring candidate events with a trained model rather than a hand-tuned filter, and shipping alternative models for samples where the diploid assumption does not hold. A project carrying both read types can apply one set of assumptions to both, which is otherwise awkward to arrange. It also exposes a Python API, so the calls can be filtered and merged without leaving the process. (Cleal and Baird 2022)

13.3 Comparing and merging callsets

Section 12.7 is the reason this is a section rather than a footnote. Two callers can describe the same 300-base insertion at positions eleven bases apart, with lengths that differ by five, and no set operation on coordinates will call that agreement. Every merged callset, every benchmark and every “concordance between callers” figure depends on the tool that made this decision, and that tool is usually unstated.

Truvarirecommendedpy

Asks whether two records describe the same allele — comparing position, size and, where the sequence is present, the inserted or deleted bases — instead of asking whether two intervals overlap. That is the structural-variant form of the problem normalization solves for small variants, and its refine step goes further by realigning the region so two spellings of one event can be recognized as one. The same comparison engine collapses redundant calls, so benchmarking and merging are one tool. (English et al. 2022)

Its matching thresholds are parameters and the numbers move with them. Report the settings next to the result, or the result means very little.
activelast release 2025-10MITv5.4.0reviewed 2026-08
Tool Upstream Languages Why / why not
SURVIVOR dormantlast release 2019-02 C++

The merging tool behind a great many multi-caller and multi-sample structural-variant papers, so its conventions are what you will meet in other people’s pipelines and supplementary files. It merges on breakpoint distance, which is the position-based comparison Truvari was written to replace — that makes it useful for reading existing work and a poor choice for producing new work. (Jeffares et al. 2017)

13.4 Copy number

Copy number is a depth question rather than a breakpoint question (Section 12.6), and the tools split by what is corrupting the depth signal. In targeted sequencing the dominant term is capture efficiency, and correcting for it is the whole method. In whole-genome data the dominant terms are GC content and mappability, and the modern long-read callers segment coverage themselves rather than leaving it to a separate tool — sawfish above is one, and Delly carries a copy-number mode.

CNVkitrecommendedpy

Built for targeted sequencing, where depth is dominated by capture efficiency rather than by copy number and a generic depth caller is therefore reading the library preparation. Its answer is to use the off-target reads as a second, coarse depth track covering the gaps between baits, and to learn the correction from a pool of normal samples. That is what makes exome and panel data usable for copy number at all. (Talevich et al. 2016)

The reference pool is the method, not a configuration detail: build it from samples prepared and sequenced like the ones being called, or it will produce confident artifacts. It segments and calls; absolute copy number and tumor purity still rest on assumptions you supply.
activelast release 2026-07Apache-2.0v0.9.14reviewed 2026-08
Tool Upstream Languages Why / why not
Control-FREEC dormantlast release 2023-07 C++

Long-established for tumor copy number from whole-genome and exome data, and still cited because it treats normal contamination, subclonal changes and B-allele frequency as one problem rather than three post-processing steps. It is legacy on upstream grounds rather than methodological ones. (Boeva et al. 2012)

13.5 What is not here

Somatic structural variation. Excluded for the same reason somatic small variants are: a tumor is a mixture of clones at unknown proportions and unknown ploidy, so the question stops being “which genotype” and becomes “which subclones, at what fractions”. Several tools above have somatic modes and GRIDSS2 was designed around cancer genomes, but surveying somatic calling properly means surveying purity and ploidy estimation with it, and that is a different chapter.

Mobile element insertions. A retrotransposon insertion is a structural variant whose inserted sequence is a known repeat family, which turns discovery into a classification problem against a library rather than an assembly problem. The general callers find the breakpoints and mostly cannot say what went in.

Annotation and interpretation. Deciding what a called rearrangement means — which transcripts it disrupts, whether the population has seen it before, whether it is reportable — is a separate stage with its own tools, and it is the subject of a part not yet written.

Depth utilities. Coverage calculation, bias correction and visualization are inputs to several tools here rather than tools of this chapter, and the useful ones are general-purpose enough to belong with the file-format toolkits in Section 3.1.

13.6 Language coverage

The split here is sharper than in most parts of this book, and it maps onto the two eras. The short-read callers are compiled — C++, Java, Go — because their work is several streaming passes over every alignment in a genome to accumulate evidence that is individually weak. The long-read callers are Python, apart from sawfish, because a long read carries the event inside one record and the work per event is small; the loop that would have to be fast is not there. GATK-SV is the exception to both, and its language row says why: it is a pipeline description rather than a program, which is what the workflow part (Section 16.1) is about.

Two entries — dysgu and CNVkit — ship a documented in-process API alongside the command. That is worth knowing, because filtering and merging structural-variant calls is exactly the work that otherwise accumulates as a directory of one-off scripts. For everything else the pattern is the usual one: an SV caller is a batch job whose product is a VCF, and the language coverage that matters comes afterwards, on the file-format side, in Section 3.4.