A production-ready Nextflow DSL2 pipeline for calling structural variants (SVs), copy number variants (CNVs), and SMN1/SMN2 copy numbers from Illumina paired-end WGS data (PE150, ≥30×).
Accepts FASTQ or pre-aligned BAM input. Produces a per-sample HTML report with an embedded Circos plot, annotated SV/CNV tables, SMN1/SMN2 classification, and optional GIAB benchmark metrics.
Self-contained per-sample report (SMAPB, an anonymised standardized reference sample): alignment QC, genome-wide Circos plot, structural-variant and copy-number summaries, and SMN1/SMN2 classification (here a homozygous SMN1 deletion consistent with SMA). Bootstrap CSS is inlined for air-gapped clinical distribution.
- Ensemble SV calling — 5-caller ensemble: Manta + DELLY + GRIDSS (core, all three must succeed) plus Scramble and MELT, each added only when it has calls. Merged with JASMINE. SvABA is not part of the ensemble — it is skipped by default and its VCF never reaches the merge; GRIDSS BND pairs auto-converted to typed DEL/DUP/INV
- STR genotyping — ExpansionHunter (32 disease loci) + STRling genome-wide scanning
- Dual CNV calling — CNVpytor + GATK gCNV with consensus merging
- SMN1/SMN2 copy number — SMNCopyNumberCaller with 2+0 haplotype detection
- Copy-number / blood-group traits — targeted normalized read depth for Rh factor (RHD), AMY1, GSTM1/GSTT1 null, and LPA KIV-2, emitted as stable per-sample contract files
- Alpha-globin (HBA1/HBA2) — M8 measures alpha-thalassemia via per-segment depth, alpha-cluster junction search, and a pinned pathogenic-site pileup; emitted as a per-sample contract and a measurement-only report card (dosage 0–4, deletion reported as a group when depth cannot separate alleles, panel-named site hits). No clinical interpretation
- Clinical annotation — AnnotSV 3.4.6 with SV PON (GIAB 7-sample), gnomAD-SV AF, SegDup, and ENCODE blacklist badges
- Genome-wide visualization — pycirclize Circos plot (SVs, CNV gains/losses, STR expansions, SMN locus)
- 3-tier clinical HTML report — ACMG SF v3.2 Tier 1, OMIM morbid Tier 2, Tier 3 with full XLS export; Bootstrap 5, embedded SVG, optional truvari GIAB benchmark
- Reproducible — every tool pinned in a Docker container; no conda required
┌───────────────────────────────────────────────────────────────────────────────────┐
│ M1 · Pre-processing │
│ BWA-MEM2 → sort → MarkDup → mosdepth QC │
└─────────────────────────────────────────┬─────────────────────────────────────────┘
│ BAM
┌─────────────────────┬──────────┴─────────┬─────────────────────┐
▼ ▼ ▼ ▼
┌──────────────────┐ ┌───────────────────┐ ┌──────────────────┐ ┌───────────────────┐
│ M2 · SV Calling │ │ M3 · CNV + traits │ │ M4 · SMN Calling │ │ M8 · Alpha-globin │
│ Manta DELLY │ │ CNVpytor │ │ SMNCopyNumber │ │ HBA1/HBA2 depth │
│ GRIDSS Scramble │ │ GATK gCNV → BED │ │ Caller v1.1 │ │ + junction search │
│ MELT → JASMINE │ │ RHD/AMY1/GSTM1 │ │ │ │ + targeted site │
│ (5-caller merge) │ │ GSTT1/LPA KIV-2 │ │ │ │ pileup │
└────────┬─────────┘ └─────────┬─────────┘ └────────┬─────────┘ └─────────┬─────────┘
│ │ │ │
▼ │ │ │
┌───────────────┐
│ M5 · Annotate │ │ │ │
│ AnnotSV 3.4 │ │ │ │
│ gnomAD-SV AF │ │ │ │
│ filter <1% │ │ │ │
└───────┬───────┘ │ │ │
└─────────────────────┴──────────┬─────────┴─────────────────────┘
▼
┌───────────────────────────────────────────────────────────────────────────────────┐
│ M6/M7 · Visualization & Reporting │
│ pycirclize Circos + Jinja2 HTML report + (optional) Truvari benchmark │
└───────────────────────────────────────────────────────────────────────────────────┘
| Dependency | Version | Notes |
|---|---|---|
| Nextflow | ≥ 25.10.4 | curl -s get.nextflow.io | bash |
| Docker | ≥ 24 | All tools run in containers |
| Python | ≥ 3.11 | For local test/report scripts |
| Java | ≥ 17 | Required by Nextflow |
System: 16+ CPU cores, 64+ GB RAM, 500 GB disk recommended for 30× WGS.
# 1. Clone
git clone https://github.com/alvin8-git/SVcaller.git
cd SVcaller
# 2. Install Nextflow (if not already installed)
curl -s https://get.nextflow.io | bash
sudo mv nextflow /usr/local/bin/
# 3. Download reference data (~60 min first time)
bash validation/download_refs.sh
# 4. Run on a sample
nextflow run main.nf \
-profile docker \
--input /path/to/samplesheet.csv \
--ref_fasta /path/to/ref/GRCh38/GRCh38.fasta \
--outdir resultsA CSV file with one row per sample. Provide either fastq_1/fastq_2 or bam — not both.
sample,fastq_1,fastq_2,bam
HG002,/data/HG002_R1.fastq.gz,/data/HG002_R2.fastq.gz,
HG003,,,/data/HG003.GRCh38.bam| Column | Required | Description |
|---|---|---|
sample |
Yes | Unique sample ID (no spaces) |
fastq_1 |
FASTQ mode | Absolute path to R1 FASTQ.gz |
fastq_2 |
FASTQ mode | Absolute path to R2 FASTQ.gz |
bam |
BAM mode | Absolute path to sorted BAM |
| Parameter | Default | Description |
|---|---|---|
--input |
required | Path to samplesheet CSV |
--ref_fasta |
required | GRCh38 reference FASTA |
--outdir |
results |
Output directory |
--min_depth |
25 |
Minimum mean coverage (fails pipeline if below) |
--pon |
null | GATK gCNV Panel of Normals HDF5 (see PoN Build) |
--intervals |
null | Preprocessed intervals BED for GATK gCNV |
--annotsv_db |
null | AnnotSV annotation directory |
--eh_catalog |
assets/eh_catalog.json |
ExpansionHunter variant catalog |
--sv_pon |
null | GIAB 7-sample SV Panel of Normals BED for artifact flagging (see pon/sv_pon/) |
--giab_truth |
null | GIAB T2TQ100-V1.0 truth VCF.gz for truvari benchmarking |
--giab_truth_v5q |
null | GIAB v5.0q truth VCF.gz (second benchmark pass) |
--skip_gridss |
false |
Skip GRIDSS (saves 4–6 h; leaves Manta+DELLY+Scramble+MELT) |
--skip_melt |
false |
Skip MELT MEI calling (saves ~2 h when container unavailable) |
--auto_cleanup |
false |
Delete the -work-dir automatically on successful completion (removes the -resume cache) |
--max_cpus |
64 |
Max CPUs any process may request (caps task.attempt scaling) |
--max_memory |
120.GB |
Max memory any process may request |
--max_time |
240.h |
Max wall-clock time any process may request |
NXF_ANSI_LOG=false nohup nextflow run main.nf \
-profile docker \
--input samplesheet.csv \
--ref_fasta /path/to/hg38.canonical.fa \
--pon /path/to/SVcaller/pon/pon/giab_cnv_pon.hdf5 \
--annotsv_db /path/to/annotsv/Annotations_Human \
--sv_pon /path/to/SVcaller/pon/sv_pon/giab_sv_pon.bed \
--outdir results_SAMPLEID \
-work-dir work_SAMPLEID \
> /tmp/SAMPLEID_run1.log 2>&1 &Note: Use
hg38.canonical.fa(chr1-22+X+Y+M only) for FASTQ inputs — this skips FILTER_CHROMS (~70 min/sample on a ~30× BAM). UseNXF_ANSI_LOG=falsefor all background runs; without it, Nextflow's ANSI renderer deadlocks the JVM when there's no TTY.
NXF_ANSI_LOG=false nohup nextflow run main.nf \
-profile docker \
--input bam_samplesheet.csv \
--ref_fasta /path/to/hg38.fa \
--pon /path/to/SVcaller/pon/pon/giab_cnv_pon.hdf5 \
--sv_pon /path/to/SVcaller/pon/sv_pon/giab_sv_pon.bed \
--outdir results_SAMPLEID \
-work-dir work_SAMPLEID \
> /tmp/SAMPLEID_run1.log 2>&1 &Note: BAM inputs always run FILTER_CHROMS to strip non-canonical @SQ headers. See How to run BAM inputs for details.
NXF_ANSI_LOG=false nohup nextflow run main.nf \
-profile docker \
--input samplesheet.csv \
--ref_fasta /path/to/hg38.canonical.fa \
--giab_truth /path/to/GIAB/HG002_T2TQ100-V1.0_stvar.vcf.gz \
--giab_truth_v5q /path/to/GIAB/HG002_v5.0q_stvar.vcf.gz \
--outdir results \
-work-dir work \
> HG002_run1.log 2>&1 &All samples share a single unified --outdir results (Nextflow writes each sample
to its own results/<sample_id>/ subdir) and a single -work-dir work scratch
directory. See Output for the consolidated layout.
NXF_ANSI_LOG=false nohup nextflow run main.nf \
-profile docker \
--input samplesheet.csv \
--ref_fasta /path/to/hg38.canonical.fa \
-work-dir work_SAMPLEID \
-resume \
> /tmp/SAMPLEID_run2.log 2>&1 &A 30× WGS run can leave several hundred GB of intermediates in its work directory. Three hardening rules keep disk usage bounded:
- One
-work-dirper sample/batch —work_<sampleId>for single samples,work_<batchName>for batches. Never share awork/across runs: it causes Nextflow session-lock conflicts and blocks targeted cleanup. - Clean up after results are published —
bash bin/nf-cleanup.sh <sampleId>verifies outputs exist under--outdir, removes that sample's work dir, and prunes orphaned.nextflow/cachesessions. After several runs have shared one work dir,bash bin/nf-cleanup.sh --reclaimreclaims every superseded run's intermediates in one command (dry-run by default; add--forceto delete) while keeping the latest successful run for-resume; it refuses to run while a pipeline is active.--auto_cleanup truedeletes the work dir automatically on success (drops the-resumecache; one-shot runs only). - Keep the
storeDircaches —${outdir}/cache/and${outdir}/.cache/persist GRIDSS reference setup, GATK interval binning, and chrom-filtered BAMs across runs against the same reference. They survivenextflow clean; don't delete them between samples. - Mosdepth writes regions only —
--no-per-baseis set, so the ~4.5 GB/sample per-base BED is never generated (the report consumes the 50 kb regions windows). Saves disk and mosdepth runtime.
Environment variables for background and multi-user runs:
| Variable | Purpose |
|---|---|
NXF_ANSI_LOG=false |
Required for nohup/background runs — without it Nextflow's ANSI renderer deadlocks the JVM when there is no TTY. |
TMPDIR |
Redirect temp files off a small root partition (pipeline sets /path/to/tmp in nextflow.config; override per site). |
NXF_HOME |
Per-user Nextflow home on shared machines — avoids plugin-cache contention. |
NXF_SINGULARITY_CACHEDIR |
Per-user image cache for Singularity/Apptainer — stops concurrent runs colliding while pulling the same image. |
Per-process CPU/memory/time are capped by --max_cpus (64), --max_memory (120.GB), --max_time (240.h). Lower them on small machines (e.g. --max_cpus 8 --max_memory 32.GB) so no process over-subscribes. Tiers and per-caller overrides live in conf/base.config.
Scatter-gather is applied only where it is safe for SV/CNV calling:
| Stage | Parallelization |
|---|---|
| DELLY | internal per-chromosome scatter-gather (built in) |
| GATK CollectReadCounts / CNVpytor | per-bin / per-chromosome — shardable |
| ExpansionHunter | per-locus |
| Manta / GRIDSS / SvABA | not chunked — breakend assembly needs whole-genome context; per-chromosome splitting drops inter-chromosomal events. Bound cost with --tiered_gridss or --skip_gridss instead. |
scratch (node-local staging) is off by default. On a single-node local executor it doubles I/O on the ~130 GB filtered BAM for no benefit; enable it only on a shared-filesystem cluster via a site config (-c site.config setting process.scratch = true).
For per-process resource tiers, the local (conda) vs docker profiles, and the full storage/cache reference, see Parameter reference.
GATK gCNV requires a Panel of Normals (PoN) built from ≥10 normal samples. Build once from GIAB HG001–HG007:
# 1. Edit validation/giab_samplesheet.csv with your BAM paths
# 2. Build PoN
NXF_ANSI_LOG=false nohup nextflow run workflows/pon_build.nf \
-profile docker \
--input validation/giab_samplesheet.csv \
--ref_fasta /path/to/ref/GRCh38/GRCh38.fasta \
--outdir /path/to/SVcaller/pon \
-work-dir /path/to/SVcaller/work_pon \
> /path/to/tmp/pon_run.log 2>&1 &
# PoN output: /path/to/SVcaller/pon/pon/giab_cnv_pon.hdf5Pass it to the main pipeline with --pon /path/to/SVcaller/pon/pon/giab_cnv_pon.hdf5.
All runs share one consolidated results/ tree, one subdirectory per sample.
Current occupants (see ORGANIZATION.md for the reorg history):
results/
├── HG002/ # GIAB reference (SV/CNV/STR/SMN + blood-group traits)
├── HG001/ # GIAB NA12878 (30X GRCh38 + blood-group traits)
├── COLO829/ # tumor SV/CNV (depth traits omitted — no BAM)
├── SMN/{SMAD,SMAM,SMAPB}/ # SMA trio
├── _experiments/{HG002_wedge,svpon}/ # retained experimental runs
├── pon/ # shared Panel of Normals (single copy)
└── cache/ # shared reference-derived pipeline cache (gitignored)
Each sample subdirectory contains:
results/
└── <sample_id>/
├── <sample_id>.report.html # Self-contained HTML report
├── <sample_id>.variants.xlsx # Excel workbook (SVs / CNVs / STRs / SMN sheets)
├── <sample_id>.sv_merged.vcf.gz # Ensemble SV calls (Manta+DELLY+GRIDSS+Scramble+MELT)
├── <sample_id>.sv_merged.vcf.gz.tbi
├── <sample_id>.str.vcf.gz # STR calls (ExpansionHunter)
├── <sample_id>.cnv_consensus.bed # Consensus CNV calls
├── <sample_id>.smn.tsv # SMN1/SMN2 copy numbers
├── <sample_id>.filtered.tsv # AnnotSV-annotated, gnomAD-SV-filtered SVs
├── <sample_id>.circos.svg # Genome-wide Circos plot (embedded inline in HTML)
├── <sample_id>.circos.png
├── bloodgroup/
│ └── <sample_id>.rh_status.tsv # Rh factor: RHD copy number → Rh+/- (CNV trait)
├── cnv_traits/
│ ├── <sample_id>.amy1.tsv # AMY1 (salivary amylase) copy number
│ ├── <sample_id>.gst_null.tsv # GSTM1 / GSTT1 null (homozygous deletion) status
│ └── <sample_id>.lpa_kiv2.tsv # LPA KIV-2 tandem-repeat copy number (Lp(a))
├── alpha_globin/ # M8 · alpha-globin (HBA1/HBA2)
│ ├── <sample_id>.alpha_globin.tsv # contract: dosage, deletion group, site genotypes
│ ├── <sample_id>.alpha_depth.tsv # per-segment normalized depth
│ ├── <sample_id>.alpha_junction.tsv # alpha-cluster breakpoint search
│ └── <sample_id>.alpha_sites.tsv # pinned pathogenic-site pileup
├── qc/ # published alignment QC (survives work-dir cleanup)
│ ├── <sample_id>.flagstat.txt # mapping rate (true, measured pre-FILTER_CHROMS)
│ ├── <sample_id>.mosdepth.summary.txt
│ └── <sample_id>.insert_size_metrics.txt
└── <sample_id>.truvari/ # GIAB benchmark (if --giab_truth set)
└── summary.json
Small, stable per-sample TSVs emitted by the CNV_TRAITS subworkflow for
downstream interpretation (e.g. OmniGen). Each is a targeted, normalized
read-depth estimate from the aligned BAM (mosdepth over assets/cnv_trait_regions.bed,
--mapq 0, normalized to copy-number-stable CTRL_* control regions); the CNV
consensus BED corroborates called deletions but does not drive the call.
| File | Columns |
|---|---|
bloodgroup/<S>.rh_status.tsv |
sample, RHD_copies, Rh_status (pos/neg), confidence |
cnv_traits/<S>.amy1.tsv |
sample, AMY1_copies, method |
cnv_traits/<S>.gst_null.tsv |
sample, GSTM1 (null/present), GSTT1 (null/present) |
cnv_traits/<S>.lpa_kiv2.tsv |
sample, KIV2_copies, method |
See docs/omnigen-additions-plan.md for design, coordinates, thresholds, and calibration notes.
The HTML report includes:
- Alignment QC (coverage, duplication rate, insert size)
- SV summary table by type and caller
- Embedded Circos plot (SVs, CNV gains/losses, STR expansions, SMN locus, and a labelled CNV-trait ring — RHD/AMY1/GSTM1/GSTT1/LPA KIV-2 — when trait TSVs are present)
- SMN1/SMN2 copy number with SMA carrier/affected classification
- Tier 1 — ACMG SF v3.2 actionable SVs (≥2 callers, no PON hit)
- Tier 2 — OMIM morbid gene candidates, top 10 shown; full list in XLS download
- Tier 3 — all remaining SVs, top 10 shown; full list in XLS download
- STR expansion loci with INREPEAT / NORMAL / INTERMEDIATE status
- Blood Group & Copy-Number Traits card — Rh(D) factor (RHD copy number), AMY1 copies, GSTM1/GSTT1 null status, LPA KIV-2 copies
- Alpha-globin (HBA1/HBA2) card — alpha-gene dosage (0–4), genotype, deletion group (e.g.
--SEA|--MEDwhen depth cannot separate the alleles), and panel-named pathogenic-site findings. Measurement only, no clinical call - GIAB benchmark precision/recall/F1 with per-size-bin breakdown (optional)
Validate SV calls against GIAB truth sets:
bash validation/giab_benchmark.sh \
HG002 \
results/HG002/HG002.sv_merged.vcf.gzCurrent benchmark on HG002 (run16, 2026-06-08; GRIDSS BND→SV fix). These numbers predate two caller fixes and are effectively a 4-caller result. SvABA was never merged (vcfs[5] is unwired in modules/jasmine/merge.nf), and MELT was silently failing on an invalid -reads flag from 2026-06-05 until the -sr fix on 2026-07-23, so only Manta + DELLY + GRIDSS + Scramble contributed. Keep this in mind before quoting it as a 5-caller F1; a re-benchmark with MELT contributing is pending:
| Benchmark | Precision | Recall | F1 | TP-base | FP |
|---|---|---|---|---|---|
| GIAB T2TQ100-V1.0 | 0.733 | 0.255 | 0.378 | 7571 | 2604 |
| GIAB v5.0q | 0.738 | 0.259 | 0.383 | 7286 | 2449 |
Main gap is recall (~25%) — the callset covers ~9,700 of ~30,000 truth SVs. Precision is solid. Next target: low-QUAL Manta/Delly rescue or soft GRIDSS QUAL floor.
A complete, self-contained per-sample report is committed at
docs/demo/HG002_report.html — open it in any
browser (Bootstrap CSS and Circos SVG are inlined; no network needed).
It is rendered by bin/html_report.py from HG002's real existing outputs
(SV tiers from HG002.filtered.tsv, HG002.cnv_consensus.bed, HG002.smn.tsv,
embedded Circos plot). The Blood Group & Copy-Number Traits card
(Rh(D) factor, AMY1 copies, GSTM1/GSTT1 null, LPA KIV-2) now shows real,
validated values computed from targeted normalized read depth on the 30X HG002
BAM (2026-07-12): Rh(D) positive (RHD CN 2), GSTM1/GSTT1 present, AMY1 2,
LPA KIV-2 5. The Rh(D)-positive call agrees with the CNV consensus (no RHD
deletion) and the GSTM1 het-deletion call agrees with GIAB v5.0q truth — see the
validation table in docs/omnigen-additions-plan.md.
AMY1 and LPA KIV-2 absolute copies remain proportional-only pending calibration.
As of 2026-07-13 the demo again carries every section, including the two whose
inputs were lost when the work_HG002 scratch dir was reclaimed (both stages were
re-run, not reconstructed):
- Short Tandem Repeat (STR) Findings — ExpansionHunter 5.0.0 over the 32-locus
assets/eh_catalog.json. - Validation Benchmark — Truvari 4.3.1 against both GIAB HG002 SV truth sets.
On this Manta+DELLY call set (
--skip_gridss): T2TQ100-V1.0 precision 0.733 / recall 0.255 / F1 0.378 (TP 7,135 · FP 2,605 · FN 22,120); v5.0q precision 0.738 / recall 0.259 / F1 0.383 (TP 6,884 · FP 2,450 · FN 20,837). Recall is bounded by short reads against an INS-heavy assembly truth set, with per-size-bin metrics in the report.
Two more full reports are committed alongside it:
docs/demo/HG001_report.html— GIAB NA12878, regenerated from real 30X outputs with the trait card computed from the HG001 BAM (Rh(D) positive, GSTM1/GSTT1 present, AMY1 2, KIV-2 6). Note: NA12878 is often cited as a "GSTM1-null" anchor, but this BAM reads ~1 copy at GSTM1 (het deletion), not a homozygous null — see the validation table in docs/omnigen-additions-plan.md.docs/demo/COLO829_report.html— COLO829 tumor, SV/CNV focus. The Blood Group & Copy-Number Traits card carries an explicit note that depth traits were not computed (no aligned BAM was available).
| Document | What it covers |
|---|---|
| Getting started tutorial | First run from scratch to open report |
| How to run a clinical sample | End-to-end guide for a new patient sample (samplesheet → results → cleanup) |
| How to run BAM inputs | Pre-aligned BAM guidance including FILTER_CHROMS verification and parallel runs |
| How to run the GIAB validation | Benchmarking against GIAB HG002 truth set |
| How to build a Panel of Normals | GATK gCNV PON construction |
| How to interpret the HTML report | Clinical interpretation of all report sections and Circos rings |
| Parameter reference | All CLI flags, samplesheet format, output files, resource labels |
| Architecture reference | Module-by-module technical description with I/O and design notes |
| Design decisions | Why the pipeline is built the way it is (channel patterns, sentinel files, PON choices, FILTER_CHROMS @SQ fix, no-empty-placeholder rule) |
| Changes | Notable behavioural changes and the incidents that motivated them |
A failed caller never publishes an output file. If a stage cannot produce a real
result, it exits non-zero and the run stops (errorStrategy = 'finish', see
conf/base.config). SVcaller will not write a zero-byte or fabricated-empty artifact
to results/.
This matters because a downstream consumer cannot distinguish the two on disk. An
earlier version of this pipeline used || touch <output> fallbacks, so a crashed SMN
caller published an empty smn.tsv, exited 0, and a consumer report rendered it as
"0 Carrier findings — Clear" for a real person. See docs/CHANGES.md
for the full incident write-up.
The distinction the pipeline maintains:
- A legitimate empty result is still published. A VCF with a proper header and zero variant rows means "we looked and found nothing" — that is a real, valid answer.
- An intentionally skipped stage is explicit. Use
--skip_melt,--skip_scramble,--skip_svabaor--skip_gridss. These route to a dedicated*_STUBprocess that emits a well-formed header-only VCF. This is the only sanctioned way to run without a caller. - A crashed or missing caller is a hard failure. It is never silently downgraded to an empty result.
Practical consequence: if MELT is not installed, MELT_CALL now fails with an error
telling you to install it or pass --skip_melt — it no longer emits an empty VCF that
reads as "no mobile element insertions found".
# Install test dependencies
pip install pytest pycirclize matplotlib jinja2 openpyxl pandas
# Run all unit tests
pytest tests/ -vTests cover: samplesheet validation, CNV consensus merging, SMN classification, Circos plot parsing, HTML report rendering, and CNV/blood-group trait interpreters (Rh/RHD, AMY1, GSTM1/GSTT1 null, LPA KIV-2 — arithmetic on synthetic depth fixtures, consensus cross-check against the real HG002 consensus BED, and contract-schema round-trips).
tests/test_no_empty_placeholders.py is a regression guard for the empty-placeholder
incident described above: it statically asserts that no module reintroduces an
|| touch <output> fallback, an echo '{}' > placeholder, or a || true that swallows
a caller's exit code.
All tools run in pinned Docker containers. No local tool installation required beyond Docker itself.
| Module | Container |
|---|---|
| BWA-MEM2 | quay.io/biocontainers/bwa-mem2:2.2.1--he70b90d_8 |
| samtools | quay.io/biocontainers/samtools:1.23.1--ha83d96e_0 |
| Picard MarkDup | quay.io/biocontainers/picard:3.2.0--hdfd78af_0 |
| mosdepth | quay.io/biocontainers/mosdepth:0.3.14--h05c3d44_0 |
| FastQC | quay.io/biocontainers/fastqc:0.12.1--hdfd78af_0 |
| Manta | quay.io/biocontainers/manta:1.6.0--py27h9948957_6 |
| DELLY | quay.io/biocontainers/delly:1.2.6--hdcf5f25_4 |
| GRIDSS | gridss/gridss:2.13.2 |
| Scramble | quay.io/biocontainers/scramble:1.0.2--h031d066_1 |
| MELT | svcaller/melt:2.2.2 (local build — requires registration) |
| SvABA | quay.io/biocontainers/svaba:1.2.0--h69ac913_1 |
| ExpansionHunter | quay.io/biocontainers/expansionhunter:5.0.0--hc26b3af_5 |
| STRling | quay.io/biocontainers/strling:0.5.2--hbbffb53_1 |
| JASMINE | quay.io/biocontainers/jasminesv:1.1.5--hdfd78af_0 |
| CNVpytor | quay.io/biocontainers/cnvpytor:1.3.1--pyhdfd78af_1 |
| GATK | broadinstitute/gatk:4.5.0.0 |
| SMNCopyNumberCaller | svcaller/smncopynum:1.1 |
| AnnotSV | quay.io/biocontainers/annotsv:3.4.6--py313hdfd78af_0 |
| truvari | quay.io/biocontainers/truvari:4.3.1--pyhdfd78af_0 |
| Python utils / report | svcaller/utils:1.3 (local build) |
GRCh38 / hg38 only. chr-prefixed chromosome names required.
MIT — see LICENSE.
If you use SVcaller in your research, please cite the individual tools (Manta, DELLY, GRIDSS, CNVpytor, GATK, SMNCopyNumberCaller, AnnotSV, ExpansionHunter) as appropriate for your analysis.
