Structural variants (SVs, typically >=50 bp: deletions, insertions, inversions, duplications, translocations) are never observed directly by a read - they are reconstructed from four orthogonal signals (discordant read pairs, split reads, read depth, local assembly). Each caller fuses a subset of those signals, and its blind spots follow directly from which it omits. The practical consequences: the real short-read tradeoff is sensitivity versus breakpoint resolution (not specificity), insertions are a physics limit rather than a tuning failure, genotyping is a different problem from discovery, and every benchmark F1 is meaningless without its matching parameters.
conda install -c bioconda manta delly smoove svaba gridss survivor truvari annotsv bcftools samtools pysam
# Long-read callers
conda install -c bioconda sniffles cutesv pbsv
Tell your AI agent what you want to do: - "Call structural variants from my BAM with multiple callers and keep the 2/4 consensus" - "Run somatic SV calling on my tumor-normal pair with Manta and GRIDSS2" - "Build a genotyped cohort SV matrix, not just a union of discovery calls" - "Merge my population SV callsets in a sequence-aware way so allele frequencies are not inflated" - "Benchmark my SV calls against GIAB with explicit Truvari parameters" - "Decide whether my insertion-heavy analysis needs long reads"
| Signal | Detects | Breakpoint resolution | Blind to |
|---|---|---|---|
| Discordant read pairs (RP) | DEL, INS, INV, DUP, BND | ~+/-300-500 bp (IMPRECISE) | nothing, but never base-precise |
| Split reads (SR, SA tag) | all types | ~+/-0-10 bp (PRECISE) | junctions inside repeats > read length |
| Read depth (RD) | DEL, DUP (dosage) | bin-size limited (100 bp-1 kb) | balanced events (INV, balanced BND) |
| Local assembly (AS) | all types incl. novel INS | base-precise + inserted sequence | large INS/repeats beyond short-read assembly |
| Scenario | Recommended |
|---|---|
| General germline | Manta |
| Somatic SVs (cancer) | Manta tumor-normal, or GRIDSS2 -> GRIPSS -> PURPLE -> LINX |
| Highest precision / single breakends | GRIDSS2 |
| 20-300 bp indel/SV "twilight zone" | SvABA |
| WES/panel | Manta --exome |
| Large cohort | DELLY site-list-then-regenotype, or force-genotype with Paragraph/GraphTyper2 |
| Simple germline pipeline | smoove (LUMPY + svtyper + duphold) |
| Insertion-heavy / repeat-mediated / phased | long reads (Sniffles2, cuteSV, pbsv) |
"Call structural variants from my WGS BAM using Manta, DELLY, GRIDSS, and SvABA, then keep only calls supported by at least two callers"
"Run Manta on my exome BAM - make sure the depth filter does not drop true SVs at high-depth targeted loci"
"Run somatic SV calling on my tumor-normal pair and interpret complex rearrangements with the GRIDSS2 to GRIPSS to PURPLE to LINX chain"
"I have per-sample SV discovery VCFs for 200 samples - build a properly genotyped population matrix instead of taking their union"
"Merge my population SV callsets so allele frequencies are not inflated by position-only collapsing"
"Benchmark my short-read SV calls against the GIAB HG002 truth set, report every Truvari parameter, and stratify by Tier 1 versus CMRG regions"
"My short-read insertion recall is only 40% against a long-read truth set - is that a caller problem or a physics limit?"
--exome for panels, tumor-normal for somatic), and for GRIDSS route the raw breakpoint graph through GRIPSS/PURPLE/LINX rather than treating it as a callset.ABS(SVLEN) (the DEL sign convention) and annotate with AnnotSV.SVLEN >= 50 silently drops every DEL - always use ABS(SVLEN).<INV> in Manta and as 2+ paired BND records in GRIDSS - a naive merger triple-counts or drops it.