| name | genomics-cnv-calling |
| description | Copy number variant detection from exome/WGS data using CNVkit, Control-FREEC, or GATK gCNV. Supports tumor-normal pairs, tumor-only, and germline modes. |
| version | 0.2.0 |
| author | OmicsClaw |
| license | MIT |
| tags | ["genomics","CNV","copy-number","CNVkit","GATK"] |
| metadata | {"omicsclaw":{"domain":"genomics","emoji":"📊","trigger_keywords":["CNV","copy number","amplification","deletion","CNVkit"],"allowed_extra_flags":["--method"],"legacy_aliases":["cnv-calling"],"saves_h5ad":false}} |
📊 Copy Number Variant Calling
Detect copy number variants from targeted/exome/WGS sequencing data.
Core Capabilities
- CNVkit: Read-depth-based CNV detection for exome/targeted/WGS data
- GATK gCNV: GATK's germline CNV discovery tool
- Control-FREEC: Control-free copy number and LOH caller
CLI Reference
python omicsclaw.py run cnv-calling --demo
python omicsclaw.py run cnv-calling --input <tumor.bam> --output <dir>
Algorithm / Methodology
CNVkit Basic Workflow
Goal: Run the complete CNVkit pipeline on a tumor-normal pair.
cnvkit.py batch tumor.bam \
--normal normal.bam \
--targets targets.bed \
--fasta reference.fa \
--output-reference my_reference.cnn \
--output-dir results/
Build Reference from Panel of Normals
cnvkit.py batch \
--normal normal1.bam normal2.bam normal3.bam \
--targets targets.bed \
--fasta reference.fa \
--output-reference pooled_reference.cnn
cnvkit.py batch tumor1.bam tumor2.bam \
--reference pooled_reference.cnn \
--output-dir results/
Flat Reference (No Matched Normal)
cnvkit.py batch tumor.bam \
--targets targets.bed \
--fasta reference.fa \
--output-reference flat_reference.cnn \
--output-dir results/
WGS Mode
cnvkit.py batch tumor.bam \
--normal normal.bam \
--fasta reference.fa \
--method wgs \
--output-dir results/
Step-by-Step Pipeline
cnvkit.py target targets.bed --annotate refFlat.txt -o targets.target.bed
cnvkit.py antitarget targets.bed -o targets.antitarget.bed
cnvkit.py coverage tumor.bam targets.target.bed -o tumor.targetcoverage.cnn
cnvkit.py coverage tumor.bam targets.antitarget.bed -o tumor.antitargetcoverage.cnn
cnvkit.py coverage normal.bam targets.target.bed -o normal.targetcoverage.cnn
cnvkit.py coverage normal.bam targets.antitarget.bed -o normal.antitargetcoverage.cnn
cnvkit.py reference normal.targetcoverage.cnn normal.antitargetcoverage.cnn \
--fasta reference.fa -o reference.cnn
cnvkit.py fix tumor.targetcoverage.cnn tumor.antitargetcoverage.cnn reference.cnn -o tumor.cnr
cnvkit.py segment tumor.cnr -o tumor.cns
cnvkit.py call tumor.cns -o tumor.call.cns
Segmentation Options
cnvkit.py segment sample.cnr -o sample.cns
cnvkit.py segment sample.cnr --method hmm-tumor -o sample.cns
cnvkit.py segment sample.cnr --method hmm-germline -o sample.cns
CNV Calling with Ploidy/Purity
cnvkit.py call sample.cns --purity 0.7 --ploidy 2 -o sample.call.cns
cnvkit.py call sample.cns --vcf sample.vcf --purity 0.7 -o sample.call.cns
Visualization
cnvkit.py scatter sample.cnr -s sample.cns -o sample_scatter.png
cnvkit.py scatter sample.cnr -s sample.cns -c chr17 -o sample_chr17.png
cnvkit.py diagram sample.cnr -s sample.cns -o sample_diagram.pdf
cnvkit.py heatmap *.cns -o heatmap.pdf
Export Results
cnvkit.py export bed sample.call.cns -o sample.cnv.bed
cnvkit.py export vcf sample.call.cns -o sample.cnv.vcf
cnvkit.py export seg *.cns -o samples.seg
Python API
import cnvlib
cnr = cnvlib.read('sample.cnr')
cns = cnvlib.read('sample.cns')
chr17 = cnr[cnr.chromosome == 'chr17']
amps = cns[cns['log2'] > 0.5]
dels = cns[cns['log2'] < -0.5]
Quality Control
cnvkit.py metrics *.cnr -s *.cns
cnvkit.py sex *.cnr *.cnn
cnvkit.py segmetrics sample.cnr -s sample.cns --ci --pi -o sample.segmetrics.cns
cnvkit.py genemetrics sample.cnr -s sample.cns --threshold 0.2 --ci -o sample.genemetrics.tsv
Key Output Files
| Extension | Description |
|---|
.cnn | Reference or coverage file |
.cnr | Copy ratios (log2) per bin |
.cns | Segmented copy ratios |
.call.cns | Called copy number states |
Key Parameters
| Parameter | Default | Description |
|---|
--method | hybrid | hybrid, wgs, amplicon |
--segment-method | cbs | cbs, hmm, hmm-tumor, hmm-germline |
--purity | 1.0 | Tumor purity (0-1) |
--ploidy | 2 | Sample ploidy |
Why This Exists
- Without it: Raw coverage depth is noisy due to GC-bias causing false structural variants
- With it: Strict background normalization and segmentation reveals true CNV events
- Why OmicsClaw: Wraps complex tools like CNVkit into reproducible one-shot commands
Workflow
- Calculate: Map out local depth coverage and background noise.
- Execute: Evaluate log-ratio changes over target intervals.
- Assess: Perform segmentation algorithms (e.g., CBS).
- Generate: Output structural segments and variation boundaries.
- Report: Tabulate key amplification/deletion events.
Example Queries
- "Call copy number variants on this bam using CNVkit"
- "Detect amplifications in the tumor matched normal pair"
Output Structure
output_directory/
├── report.md
├── result.json
├── segments.cns
├── figures/
│ └── scatter_diagram.png
├── tables/
│ └── cnv_calls.csv
└── reproducibility/
├── commands.sh
├── requirements.txt
└── checksums.sha256
Safety
- Local-first: Strict offline processing without external upload.
- Disclaimer: Requires OmicsClaw reporting structures and disclaimers.
- Audit trail: Hyperparameters and operational flow states are logged fully.
Integration with Orchestrator
Trigger conditions:
- Automatically invoked dynamically based on tool metadata and user intent matching.
Chaining partners:
align — Upstream BAM processing
annotation — Downstream gene mapping of duplications
Version Compatibility
Reference examples tested with: CNVkit 0.9+, GATK 4.5+
Dependencies
Required: CNVkit (cnvkit.py)
Optional: GATK (for gCNV), Control-FREEC
Citations
Related Skills
variant-call — SNV/Indel calling in same samples
sv-detect — Structural variant detection
variant-annotate — Annotate CNV regions