- name
- bio-clinical-databases-variant-prioritization
- description
- Prioritizes rare-disease variants from trio/quad WES/WGS with de novo (DeNovoGear, Triodenovo), compound-heterozygous phasing (WhatsHap), mosaic VAF tiering, phenotype-driven ranking (Exomiser, Phen2Gene, AMELIE), ClinGen gene-disease validity gating, and ACMG SF v3.2 secondary findings reporting. Use when running diagnostic exome / genome pipelines, identifying candidate Mendelian disease genes, screening for incidental findings, or auditing VUS reclassification cycles. The ACMG/AMP classification framework (PVS1 decision tree, Pejaver PP3/BP4 calibration, Tavtigian point system) is in clinical-databases/acmg-classification.
- tool_type
- python
- primary_tool
- pandas
## Version Compatibility
Reference examples tested with: pandas 2.2+, cyvcf2 0.30+, pyhgvs 0.12+, Exomiser 14.0+ (Smedley 2015), Phen2Gene 1.2+ (Zhao 2020), DeNovoGear 1.1.1+ (Ramu 2013), WhatsHap 2.0+ (Patterson 2015), HPO 2024+ (Human Phenotype Ontology). ACMG Secondary Findings list is v3.2 (Miller 2023): 81 genes.
Before using code patterns, verify installed versions match. If versions differ:
- Python: `pip show <package>` then `help(module.function)` to check signatures
- CLI: `<tool> --version`
If code throws ImportError, AttributeError, or TypeError, introspect the installed package and adapt the example to match the actual API rather than retrying. Phenotype-driven prioritization REQUIRES high-quality HPO terms; without rich phenotypic input Exomiser/AMELIE degrade significantly.
# Rare-Disease Variant Prioritization Pipeline
**'Prioritize candidate disease-causing variants from this trio exome'** -> Filter to rare + functional + inheritance-consistent variants; rank by phenotype concordance; flag ACMG SF v3.2 incidental findings; report tiers with classification logic deferred to `acmg-classification`.
- Python (filtering pipeline): pandas + cyvcf2 + myvariant.info aggregation
- CLI (phenotype-driven ranking): `exomiser --analysis hiPHIVE-prioritised.yml`
- Python (de novo calling): DeNovoGear / Triodenovo / PossibleDeNovo
- CLI (compound het phasing): `whatshap phase --indels` for singletons; trio-based for families
- Python (HPO concordance): Phen2Gene / AMELIE / Phenolyzer
- VCEP curations: `https://cspec.genome.network/cspec/ui/svi/all`
## Pipeline Architecture: The Standard Rare-Disease Funnel
Typical trio exome enters as 40,000-100,000 variants per individual; reaches diagnostic candidate list of 1-10 variants through cascading filters:
| Stage | Filter | Variant count (typical trio) |
|-------|--------|------------------------------|
| Raw joint-called | -- | 100k-150k |
| QC filter (PASS, depth, GQ, missingness) | GATK best practices + Hail QC | 80k-120k |
| Population frequency | gnomAD grpmax_faf95 < 0.0001 (or disease-specific Whiffin max-credible-AF) | 5k-15k |
| Functional consequence | Coding / splice / regulatory | 1k-3k |
| Inheritance pattern | de novo / AR-hom / AR-compoundhet / X-linked / mosaic | 50-500 |
| Phenotype concordance | Exomiser hiPHIVE / Phen2Gene / AMELIE score | 5-50 |
| ACMG classification | Defer to `acmg-classification` | 1-10 |
| ACMG SF v3.2 cross-check | Miller 2023 (81 genes) | Separate output |
## Inheritance-Based Filtering
| Pattern | Filter |
|---------|--------|
| **De novo (DNV)** | Variant in proband, absent in both parents; needs trio | Apply DeNovoGear / Triodenovo / GATK PossibleDeNovo; visual IGV inspection (~10-30% false-positive rate without) |
| **Autosomal recessive; homozygous** | Hom-alt in proband; het in both parents | gnomAD grpmax_faf95 < 0.005 recessive threshold (Whiffin formula) |
| **Autosomal recessive; compound het** | Two het variants in same gene on opposite alleles | Trio-phased OR read-based phasing via WhatsHap (works within ~500 bp; longer needs parents or long-read) |
| **X-linked recessive** | Male proband hemizygous; carrier mother het | chrX coords; check Klinefelter / mosaic XXY |
| **X-linked dominant** | Het in affected; consider XCI skewing in females | Report XCI status if relevant |
| **Mitochondrial heteroplasmy** | mtDNA variant present at varying heteroplasmy across tissues | Use MITOMAP + HmtVar; ACMG criteria do not apply directly |
| **Mosaic** | Sub-clonal VAF in proband; absent in inherited transmissions | VAF 5-30% suggestive; tissue-dependent (blood vs buccal vs affected tissue) |
## De Novo Calling: Trio Analysis
**Goal:** Identify variants present in proband but absent in both parents with high specificity.
**Approach:** Use specialized DNV callers; supplement with manual IGV inspection.
| Tool | Approach | Use case |
|------|----------|----------|
| **DeNovoGear** (Ramu 2013 *Nat Methods*) | Bayesian, considers parent-of-origin | Standard for trio WES |
| **Triodenovo** (Wei 2015) | Bayesian + family-aware | Alternative |
| **GATK PossibleDeNovo annotation** | Hard filter | Quick prefilter; not standalone |
| **DeNovoCNN** (2022) | Deep learning trio caller | Most accurate as of 2022-2026 |
**False-DNV rate:** ~10-30% without manual IGV inspection; concentrated in:
- Tandem repeat regions (DNM rate inflated)
- Heterozygous parent with low coverage
- Mosaic parents (parental mosaicism transmitted to >1 offspring)
- Mapping errors in segmental duplications
## Phenotype-Driven Prioritization
| Tool | Approach | Performance (typical benchmark) | Fails when |
|------|----------|--------------------------------|-----------|
| **Exomiser** (Smedley 2015 *Nat Protoc*) | hiPHIVE: phenotype + interactome + sequence damage | 74% top-1; 94% top-5 (Cipriani 2020) | Sparse HPO (< 5 specific terms); novel-disease gene |
| **Phen2Gene** (Zhao 2020 *NARGAB*) | HPO-to-gene mapping; faster than Exomiser | Similar top-5 | Phenotype-only filtering insufficient |
| **AMELIE** (Birgmeier 2020 *Sci Transl Med*) | Literature-mining + phenotype | Best when literature is rich | New / rare disease without literature; specific patient HPO unmatched |
| **Phenolyzer** (Yang 2015 *Nat Methods*) | Phenotype-based gene scoring | Legacy | Modern multi-feature tools (Exomiser, AMELIE) preferred |
| **GADO** (Deelen 2019 *Nat Commun*) | Gene Network-based; HPO-free option | When HPO is sparse | Phenotype-rich cases where Exomiser hiPHIVE wins |
| **CADA** (Peng 2021) | Cross-species gene prioritization | Animal model integration | Genes without orthologs; rare-disease without animal model |
**Critical requirement:** all phenotype-driven tools degrade significantly with sparse HPO terms. Capture 5-10 specific HPO terms; avoid generic "intellectual disability" alone.
## ClinGen Gene-Disease Validity: Mandatory Gating
Strande et al. 2017 *AJHG* + ClinGen ongoing curation: **Limited / Moderate / Strong / Definitive** evidence per gene-disease pair.
| Category | When to apply |
|----------|---------------|
| **Definitive** | Strong literature evidence + functional / population genetic evidence | Apply full ACMG framework |
| **Strong** | -- | Apply full framework |
| **Moderate** | -- | Apply framework but flag |
| **Limited** | Single case report or weak segregation | Treat candidate cautiously; PP2 / BP1 should not apply |
| **Disputed** | Contradicting evidence | Do not call pathogenic without VCEP curation |
| **No Known Disease Relationship** | Gene not associated with the queried disease | Do not call |
**Many commercial panels include genes with only Limited validity.** ClinGen-curated `https://search.clinicalgenome.org/kb/gene-validity` is the authoritative directory.
## ACMG Secondary Findings v3.2 (Miller 2023 *Genet Med* 25:100866)
81 genes for opt-in/opt-out reporting on clinical exome/genome. Growth: 56 -> 59 -> 73 -> 78 -> 81. **v3.2 additions: CALM1, CALM2, CALM3** (calmodulinopathy; long QT / CPVT; high actionability via beta-blockade + ICD).
Inclusion criteria: ClinGen Strong or Definitive gene-disease validity + ClinGen ADWG actionability scoring.
```python
ACMG_SF_V3_2_GENES = [
# Cardiomyopathies
'ACTA2', 'ACTC1', 'BAG3', 'COL3A1', 'DES', 'FBN1', 'FLNC', 'GLA', 'LMNA', 'MYBPC3',
'MYH11', 'MYH7', 'MYL2', 'MYL3', 'PRKAG2', 'PKP2', 'RBM20', 'SCN5A', 'SMAD3',
'TGFBR1', 'TGFBR2', 'TMEM43', 'TNNC1', 'TNNI3', 'TNNT2', 'TPM1', 'TTN',
# CALM v3.2 additions (calmodulinopathies)
'CALM1', 'CALM2', 'CALM3',
# Arrhythmias and channelopathies
'CACNA1S', 'KCNH2', 'KCNQ1', 'RYR1', 'RYR2',
# Vascular
'ACVRL1', 'ENG',
# Cancer predisposition
'APC', 'ATM', 'BAP1', 'BMPR1A', 'BRCA1', 'BRCA2', 'BRIP1', 'CDH1', 'CDKN2A',
'CHEK2', 'GREM1', 'HOXB13', 'MAX', 'MEN1', 'MLH1', 'MSH2', 'MSH6', 'MUTYH',
'NF2', 'PALB2', 'PMS2', 'PTEN', 'RAD51C', 'RAD51D', 'RB1', 'RET', 'SDHAF2',
'SDHB', 'SDHC', 'SDHD', 'SMAD4', 'STK11', 'TMEM127', 'TP53', 'TSC1', 'TSC2',
'VHL', 'WT1',
# Other
'FH', 'GAA', 'HFE', 'HNF1A', 'LDLR', 'OTC', 'PCSK9', 'TTR'
]
# Note: above list is illustrative; pin to Miller 2023 supplement for exact set.
```
## Decision Tree by Scenario
| Scenario | Recommended path | Why |
|----------|------------------|-----|
| Trio WES, suspected Mendelian | Full pipeline with DeNovoGear + Exomiser + HPO | Standard rare-disease workflow |
| Singleton WES | WhatsHap read-based phasing + AR-hom + AR-compoundhet candidates | Compound het hard without trio |
| Suspected mosaic | Lower VAF threshold (2-30%); deep coverage (>200x) | Standard tools miss mosaic |
| Long-read genome | Add SV calling + STR repeat expansion | SVs miss in short-read |
| Newborn screening (BabyScreen+) | 605-gene Mendelian panel with current ACMG SF v3.2 | Lunke 2025 *Nat Med* 31:4236 |
| Cancer predisposition | ClinGen Hereditary Cancer VCEPs + ACMG SF cancer subset | Use VCEP CSpec |
| Cardiomyopathy / arrhythmia | ClinGen HCM / DCM / LQT VCEPs | Strict gene-disease validity |
| Population screening | ACMG SF v3.2 (81 genes) opt-in/opt-out | Miller 2023 |
## Standard Pipeline Workflow
**Goal:** From a trio joint-called VCF, output ranked candidate variants with inheritance pattern, phenotype concordance, and ACMG SF flags.
**Approach:** Cascading filters with QC, population frequency, functional consequence, inheritance, phenotype.
```python
from cyvcf2 import VCF
import pandas as pd
from pathlib import Path
# Quality + population frequency filter (apply first)
def filter_qc_and_frequency(vcf_path, max_grpmax_faf95=0.0001, min_dp=10, min_gq=20):
'''Stage 1: QC + frequency filter. Reduces 100k -> ~5-15k variants.'''
vcf = VCF(vcf_path)
samples = vcf.samples # e.g., [proband, mother, father]
rows = []
for v in vcf:
if v.FILTER is not None:
continue
if min(v.gt_depths) < min_dp:
continue
if v.QUAL is not None and v.QUAL < min_gq:
continue
gnomad = (v.INFO.get('grpmax_faf95') or v.INFO.get('AF_grpmax') or
v.INFO.get('AF_popmax') or 0)
if gnomad > max_grpmax_faf95:
continue
rows.append({
'chrom': v.CHROM, 'pos': v.POS, 'ref': v.REF, 'alt': v.ALT[0],
'genotypes': dict(zip(samples, v.gt_types.tolist())),
'depth': dict(zip(samples, v.gt_depths.tolist())),
'gnomad_faf95': gnomad,
'consequence': v.INFO.get('CSQ', '').split('|')[1] if v.INFO.get('CSQ') else None
})
return pd.DataFrame(rows)
def call_de_novo(df, proband, mother, father):
'''Stage 2: identify DNV candidates: hom-ref both parents, het/hom-alt proband.
Implements Mendelian-violation logic; supplement with DeNovoGear or DeNovoCNN
for production (this implementation has 10-30% false-positive rate without IGV).
'''
is_dnv = []
for _, row in df.iterrows():
gts = row['genotypes']
if gts[mother] == 0 and gts[father] == 0 and gts[proband] in (1, 3):
# Mother hom-ref AND father hom-ref AND proband het OR hom-alt
# Confidence boost: depth at parent sites should be >= 10 to trust hom-ref
if row['depth'][mother] >= 10 and row['depth'][father] >= 10:
is_dnv.append(True)
continue
is_dnv.append(False)
df['is_de_novo_candidate'] = is_dnv
return df
def call_compound_het(df, proband, mother, father, gene_col='gene'):
'''Stage 3: identify compound het: two het variants in same gene, one from each parent.
Trio phasing is gold standard; singletons require WhatsHap read-based phasing.
'''
het_in_proband = df[df['genotypes'].apply(lambda gts: gts[proband] == 1)]
candidate_genes = []
for gene in het_in_proband[gene_col].unique():
if pd.isna(gene):
continue
gene_variants = het_in_proband[het_in_proband[gene_col] == gene]
# Need >= 2 variants; one inherited from each parent
maternal_het = gene_variants[gene_variants['genotypes'].apply(
lambda gts: gts[mother] == 1 and gts[father] == 0)]
paternal_het = gene_variants[gene_variants['genotypes'].apply(
lambda gts: gts[father] == 1 and gts[mother] == 0)]
if len(maternal_het) >= 1 and len(paternal_het) >= 1:
candidate_genes.append(gene)
df['is_compound_het_candidate'] = df[gene_col].isin(candidate_genes)
return df
def flag_acmg_sf(df, acmg_sf_genes, gene_col='gene', clnsig_col='clinvar_sig'):
'''Stage: flag ACMG Secondary Findings (Miller 2023 v3.2; 81 genes).
Only P/LP variants in SF genes are reportable as secondary findings.
'''
在 GitHub 查看