Step 19: Structural Variant Calling with Delly¶
What This Does¶
Third structural variant caller — combines paired-end, split-read, and read-depth signals for comprehensive SV detection including deletions, duplications, inversions, translocations, and insertions.
Why¶
Using multiple SV callers and intersecting their results dramatically reduces false positives: - Manta (step 4): Fast, sensitive for smaller SVs and indels - CNVpytor (step 18): Best for large CNVs via read-depth only - Delly: Most balanced — uses all three signal types, especially strong for inversions and translocations
SVs called by 2+ callers have lower false-positive rates than single-caller calls. Multi-caller intersection is a common strategy in WGS pipelines, though dedicated tools like SURVIVOR or Jasmine provide more precise breakpoint-aware merging than simple position overlap.
Tool¶
- Delly (Rausch et al., Bioinformatics 2012)
Docker Image¶
DELLY_IMAGE
Pinned in versions.env; Image versions lists the current tag.
Command¶
export GENOME_DIR=/path/to/your/data
./scripts/19-delly.sh your_sample female # or male; leave it out if the sex is not known
The script passes Delly's GRCh38 exclude map (-x): telomeres, centromeres and every contig beyond chr1-22, X, Y and M (on the default no-ALT reference, the unplaced scaffolds and chrEBV; the map also names the ALT and decoy contigs of a full reference). setup.sh installs it from a pinned commit of the Delly repository as reference/delly_human.hg38.excl.tsv (see reference setup). Without it Delly spends hours in those regions and calls artefacts there; the script then runs without -x and says so.
What the script runs. Delly 2.3.0 renamed the short-read caller from delly call to delly sr; the pinned 2.7.0 answers Unrecognized command to delly call. Since 2.7.0 Delly genotypes chrX and chrY calls by sex (haploid in a male outside the pseudoautosomal regions) and takes the sex as --sex. The step hands it the declared sex: the second argument of the script, or the samplesheet's sex column in the Nextflow pipeline, the same sex DeepVariant gets. With no sex given it passes --sex auto, Delly's own default, and Delly infers the sex from coverage; compare that verdict with the sex check in step 16 when a chrX or chrY call matters. The step never passes --sex none, which turns the sex-aware genotyping off.
source versions.env # from the repository root
REF_FASTA=reference/GRCh38_no_alt_analysis_set.fasta # see 00-reference-setup.md#the-reference-path-on-every-page
SEX=female # or male; empty lets Delly infer it (--sex auto)
# SV calling (all SV types)
docker run --rm \
--cpus 4 --memory 8g \
-v ${GENOME_DIR}:/genome \
"${DELLY_IMAGE}" \
delly sr \
-g "/genome/${REF_FASTA}" \
--sex "${SEX:-auto}" \
-x /genome/reference/delly_human.hg38.excl.tsv \
-o /genome/${SAMPLE}/delly/${SAMPLE}_sv.bcf \
/genome/${SAMPLE}/aligned/${SAMPLE}_sorted.bam
# Convert BCF to VCF for downstream tools
docker run --rm \
-v ${GENOME_DIR}:/genome \
"${BCFTOOLS_IMAGE}" \
bcftools view \
/genome/${SAMPLE}/delly/${SAMPLE}_sv.bcf \
-Oz -o /genome/${SAMPLE}/delly/${SAMPLE}_sv.vcf.gz
# Index
docker run --rm \
-v ${GENOME_DIR}:/genome \
"${BCFTOOLS_IMAGE}" \
bcftools index -t \
/genome/${SAMPLE}/delly/${SAMPLE}_sv.vcf.gz
Optional: Dedicated CNV Calling¶
Delly also has a dedicated CNV mode using read-depth only (similar to CNVpytor):
source versions.env # from the repository root
REF_FASTA=reference/GRCh38_no_alt_analysis_set.fasta # see 00-reference-setup.md#the-reference-path-on-every-page
docker run --rm \
--cpus 4 --memory 8g \
-v ${GENOME_DIR}:/genome \
"${DELLY_IMAGE}" \
delly cnv \
-g "/genome/${REF_FASTA}" \
-o /genome/${SAMPLE}/delly/${SAMPLE}_cnv.bcf \
/genome/${SAMPLE}/aligned/${SAMPLE}_sorted.bam
Output¶
${SAMPLE}_sv.bcf/${SAMPLE}_sv.vcf.gz— SV calls in VCF format- Each SV has type (DEL, DUP, INV, BND, INS), quality, genotype, and supporting read counts
Each call carries Delly's read-depth copy number in FORMAT/RDCN. Short-read Delly can mark PASS a long deletion or duplication whose RDCN shows no change, so the steps that read these calls check it: a deletion or duplication longer than 1,000 bp joins AnnotSV's input (step 5) only when RDCN is below the normal copies for a deletion, or above them for a duplication. The couple screen (step 39) reads Delly deletions only, and keeps a long one only when RDCN is below the normal copies. A Delly VCF without the RDCN field (not written by Delly 2.x) is read as before, with no depth check. The normal copies on chrX and chrY come from the sex given to those steps (step 5's second argument, step 39's pedigree, or the samplesheet in the Nextflow pipeline).
Filtering¶
# Keep only PASS variants
bcftools view -f PASS ${SAMPLE}_sv.vcf.gz
# Filter by SV type
bcftools view -i 'INFO/SVTYPE="DEL"' ${SAMPLE}_sv.vcf.gz
bcftools view -i 'INFO/SVTYPE="INV"' ${SAMPLE}_sv.vcf.gz
Runtime¶
21 minutes to 3 h 19 min, peak memory 1.2-3.1 GB, in five runs on three 30-40x genomes (runtime). Delly used about one core of the four it was given. Two samples took 21 and 25 minutes; the third took 1 h 35 min to 3 h 19 min in its three runs.
Notes¶
- Delly outputs BCF by default (not VCF). Convert with
bcftools viewfor compatibility. - For consensus SV calling, use SURVIVOR or bcftools to merge calls from Manta + Delly + CNVpytor.
- Delly is the most accurate caller for inversions and balanced translocations.
- The
delly cnvmode is optional if you already run CNVpytor — it provides similar depth-based CNV calls. - Can be run in parallel with Manta and CNVpytor (all independent after alignment).