mcpField
G
gnomad-database

gnomad-database

github.com/leonchaox数据与数据库99470 次安装15 周前更新
代码仓库

关于 gnomad-database

gnomAD 数据库技能面向遗传学与临床变异解读工作,提供人群变异频率、变异后果注释和基因约束指标的查询方法。内容涵盖浏览器、GraphQL API 和数据下载,可用于变异评估与基因优先级分析。

主要功能

  1. 01按基因或位点查询变异
  2. 02比较不同人群的等位基因频率
  3. 03检索基因约束评分
  4. 04查询结构变异
  5. 05通过浏览器、API 或下载访问数据

适用场景

  1. 01筛查候选致病变异的人群频率
  2. 02结合 pLI 或 LOEUF 排序罕见病候选基因
  3. 03比较不同祖源中的变异频率
  4. 04分析基因附近的结构变异

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/leonchaox/qinyan-academic-skills --skill gnomad-database

安装后在 Claude Code 中输入/gnomad-database确认已加载。

附带文件references/graphql_queries.mdreferences/variant_interpretation.md

详细介绍

gnomAD 数据库

概述

基因组聚合数据库(gnomAD)是目前公开可用的最大人类遗传变异集合,汇总了大型测序项目的数据。gnomAD v4 包含来自 730,947 名个体的外显子序列,以及来自 76,215 名不同祖源个体的基因组序列。它提供群体等位基因频率、变异后果注释和基因层面的约束指标,这些数据对于解读遗传变异的临床意义至关重要。

核心资源:

何时使用此技能

在以下情况使用 gnomAD:

  • 查询变异频率:检查某个变异在人群中是罕见、常见还是不存在
  • 评估致病性:罕见变异(MAF < 1%)可能导致疾病;gnomAD 可帮助筛除常见的良性变异
  • 评估功能缺失不耐受性:使用 pLI 和 LOEUF 分数评估基因对蛋白质截短变异的耐受程度
  • 按群体分层查询频率:比较不同祖源人群中的等位基因频率(非洲/非裔美国人、混合美洲人、阿什肯纳兹犹太人、东亚人、芬兰人、中东人、非芬兰欧洲人、南亚人)
  • ClinVar/ACMG 变异分类:gnomAD 频率数据可用于变异分类的 BA1/BS1 证据代码
  • 约束分析:识别错义变异或功能缺失变异较少的基因(z 分数、pLI、LOEUF)

核心功能

1. gnomAD GraphQL API

gnomAD 使用 GraphQL API,可通过 https://gnomad.broadinstitute.org/api 访问。大多数查询按基因或特定基因组位置获取变异。

可用数据集:

  • gnomad_r4 — gnomAD v4 外显子组(推荐默认使用,GRCh38)
  • gnomad_r4_genomes — gnomAD v4 基因组(GRCh38)
  • gnomad_r3 — gnomAD v3 基因组(GRCh38)
  • gnomad_r2_1 — gnomAD v2 外显子组(GRCh37)

参考基因组:

  • GRCh38 — v3/v4 的默认版本
  • GRCh37 — 用于 v2
2. 按基因查询变异
import requests

def query_gnomad_gene(gene_symbol, dataset="gnomad_r4", reference_genome="GRCh38"):
    """Fetch variants in a gene from gnomAD."""
    url = "https://gnomad.broadinstitute.org/api"

    query = """
    query GeneVariants($gene_symbol: String!, $dataset: DatasetId!, $reference_genome: ReferenceGenomeId!) {
      gene(gene_symbol: $gene_symbol, reference_genome: $reference_genome) {
        gene_id
        gene_symbol
        variants(dataset: $dataset) {
          variant_id
          pos
          ref
          alt
          consequence
          genome {
            af
            ac
            an
            ac_hom
            populations {
              id
              ac
              an
              af
            }
          }
          exome {
            af
            ac
            an
            ac_hom
          }
          lof
          lof_flags
          lof_filter
        }
      }
    }
    """

    variables = {
        "gene_symbol": gene_symbol,
        "dataset": dataset,
        "reference_genome": reference_genome
    }

    response = requests.post(url, json={"query": query, "variables": variables})
    return response.json()

# Example
result = query_gnomad_gene("BRCA1")
gene_data = result["data"]["gene"]
variants = gene_data["variants"]

# Filter to rare PTVs
rare_ptvs = [
    v for v in variants
    if v.get("lof") == "LC" or v.get("consequence") in ["stop_gained", "frameshift_variant"]
    and v.get("genome", {}).get("af", 1) < 0.001
]
print(f"Found {len(rare_ptvs)} rare PTVs in {gene_data['gene_symbol']}")
3. 查询特定变异
import requests

def query_gnomad_variant(variant_id, dataset="gnomad_r4"):
    """Fetch details for a specific variant (e.g., '1-55516888-G-GA')."""
    url = "https://gnomad.broadinstitute.org/api"

    query = """
    query VariantDetails($variantId: String!, $dataset: DatasetId!) {
      variant(variantId: $variantId, dataset: $dataset) {
        variant_id
        chrom
        pos
        ref
        alt
        genome {
          af
          ac
          an
          ac_hom
          populations {
            id
            ac
            an
            af
          }
        }
        exome {
          af
          ac
          an
          ac_hom
          populations {
            id
            ac
            an
            af
          }
        }
        consequence
        lof
        rsids
        in_silico_predictors {
          id
          value
          flags
        }
        clinvar_variation_id
      }
    }
    """

    response = requests.post(
        url,
        json={"query": query, "variables": {"variantId": variant_id, "dataset": dataset}}
    )
    return response.json()

# Example: query a specific variant
result = query_gnomad_variant("17-43094692-G-A")  # BRCA1 missense
variant = result["data"]["variant"]

if variant:
    genome_af = variant.get("genome", {}).get("af", "N/A")
    exome_af = variant.get("exome", {}).get("af", "N/A")
    print(f"Variant: {variant['variant_id']}")
    print(f"  Consequence: {variant['consequence']}")
    print(f"  Genome AF: {genome_af}")
    print(f"  Exome AF: {exome_af}")
    print(f"  LoF: {variant.get('lof')}")
4. 基因约束分数

gnomAD 约束分数用于评估基因相对于预期值对变异的耐受程度:

import requests

def query_gnomad_constraint(gene_symbol, reference_genome="GRCh38"):
    """Fetch constraint scores for a gene."""
    url = "https://gnomad.broadinstitute.org/api"

    query = """
    query GeneConstraint($gene_symbol: String!, $reference_genome: ReferenceGenomeId!) {
      gene(gene_symbol: $gene_symbol, reference_genome: $reference_genome) {
        gene_id
        gene_symbol
        gnomad_constraint {
          exp_lof
          exp_mis
          exp_syn
          obs_lof
          obs_mis
          obs_syn
          oe_lof
          oe_mis
          oe_syn
          oe_lof_lower
          oe_lof_upper
          lof_z
          mis_z
          syn_z
          pLI
        }
      }
    }
    """

    response = requests.post(
        url,
        json={"query": query, "variables": {"gene_symbol": gene_symbol, "reference_genome": reference_genome}}
    )
    return response.json()

# Example
result = query_gnomad_constraint("KCNQ2")
gene = result["data"]["gene"]
constraint = gene["gnomad_constraint"]

print(f"Gene: {gene['gene_symbol']}")
print(f"  pLI:   {constraint['pLI']:.3f}  (>0.9 = LoF intolerant)")
print(f"  LOEUF: {constraint['oe_lof_upper']:.3f}  (<0.35 = highly constrained)")
print(f"  Obs/Exp LoF: {constraint['oe_lof']:.3f}")
print(f"  Missense Z:  {constraint['mis_z']:.3f}")

约束分数解读:

分数范围含义
pLI0–1对 LoF 不耐受的概率;>0.9 = 高度不耐受
LOEUF0–∞LoF 观察值/预期值的上限;<0.35 = 受约束
oe_lof0–∞LoF 变异的观察值/预期值比率
mis_z−∞ 到 ∞错义变异约束 z 分数;>3.09 = 受约束
syn_z−∞ 到 ∞同义变异 z 分数(对照值;应接近 0)
5. 群体频率分析
import requests
import pandas as pd

def get_population_frequencies(variant_id, dataset="gnomad_r4"):
    """Extract per-population allele frequencies for a variant."""
    url = "https://gnomad.broadinstitute.org/api"

    query = """
    query PopFreqs($variantId: String!, $dataset: DatasetId!) {
      variant(variantId: $variantId, dataset: $dataset) {
        variant_id
        genome {
          populations {
            id
            ac
            an
            af
            ac_hom
          }
        }
      }
    }
    """

    response = requests.post(
        url,
        json={"query": query, "variables": {"variantId": variant_id, "dataset": dataset}}
    )
    data = response.json()
    populations = data["data"]["variant"]["genome"]["populations"]

    df = pd.DataFrame(populations)
    df = df[df["an"] > 0].copy()
    df["af"] = df["ac"] / df["an"]
    df = df.sort_values("af", ascending=False)
    return df

# Population IDs in gnomAD v4:
# afr = African/African American
# ami = Amish
# amr = Admixed American
# asj = Ashkenazi Jewish
# eas = East Asian
# fin = Finnish
# mid = Middle Eastern
# nfe = Non-Finnish European
# sas = South Asian
# remaining = Other
6. 结构变异(gnomAD-SV)

gnomAD 还包含结构变异数据集:

import requests

def query_gnomad_sv(gene_symbol):
    """Query structural variants overlapping a gene."""
    url = "https://gnomad.broadinstitute.org/api"

    query = """
    query SVsByGene($gene_symbol: String!) {
      gene(gene_symbol: $gene_symbol, reference_genome: GRCh38) {
        structural_variants {
          variant_id
          type
          chrom
          pos
          end
          af
          ac
          an
        }
      }
    }
    """

    response = requests.post(url, json={"query": query, "variables": {"gene_symbol": gene_symbol}})
    return response.json()

查询工作流

工作流 1:评估变异致病性
  1. 检查群体频率 — 该变异是否足够罕见,可能具有致病性?

    • 隐性疾病使用 gnomAD AF < 1%,显性疾病使用 < 0.1%
    • 检查祖源特异性频率(某变异总体上较罕见,但在某个人群中可能很常见)
  2. 评估功能影响 — LoF 变异的先验概率最高

    • 检查 lof 字段:HC = 高置信度 LoF,LC = 低置信度
    • 检查 lof_flags,查看是否存在 "NAGNAG_SITE"、"PHYLOCSF_WEAK" 等问题
  3. 应用 ACMG 标准:

    • BA1:AF > 5% → 良性独立证据
    • BS1:AF > 疾病患病率阈值 → 良性支持证据
    • PM2:在 gnomAD 中不存在或极罕见 → 中等致病证据
工作流 2:罕见病基因优先级排序
  1. 查询候选基因的约束分数
  2. 筛选 pLI > 0.9(单倍剂量不足)或 LOEUF < 0.35 的基因
  3. 与基因中观察到的 LoF 变异交叉比对
  4. 综合参考 ClinVar 和疾病数据库
工作流 3:群体遗传学研究
  1. 从 GWAS 或临床数据中确定感兴趣的变异
  2. 查询各群体的频率
  3. 比较不同祖源群体之间的频率差异
  4. 检验特定创始人群体中是否存在富集

最佳实践

  • 使用 gnomAD v4 (gnomad_r4) 获取最新数据;仅在需要兼容 GRCh37 时使用 v2 (gnomad_r2_1)
  • 处理空响应:gnomAD 中未观察到某个变异,并不一定意味着它具有致病性——缺失本身也具有参考价值
  • 区分外显子组与全基因组数据:全基因组数据的覆盖度更均匀;外显子组数据量更大,但可能存在覆盖缺口
  • 限制 GraphQL 查询速率:在请求之间加入延迟;尽可能批量查询
  • 纯合子计数 (ac_hom) 与隐性遗传病分析相关
  • 对基因约束分析,优先使用 LOEUF 而非 pLI(对样本量的敏感度较低)

数据访问

更多资源

评论

支持 Markdown