跳转至

NOME-seq 核小体占位分析


一句话说明

NOME-seq 是用 GpC 甲基转移酶给裸露的 DNA 打标记——核小体挡住的地方打不上标记,裸露的地方打上标记,这样就能同时看到核小体的位置和 CpG 天然甲基化的状态。


核心知识点

要点1:NOME-seq 技术原理

  • NOME-seq = Nucleosome Occupancy and Methylome Sequencing
  • 核心试剂:M.CviPI(GpC 甲基转移酶)
  • 处理活细胞/细胞核时,M.CviPI 只能甲基化可及的(裸露的)GpC 位点
  • 被核小体包裹的 GpC → 酶进不去 → 未甲基化
  • 白话类比:用喷漆往墙上喷——被家具挡住的地方喷不上(核小体占位),空白墙面喷上了(开放区域)

要点2:一石二鸟的设计

  • 人类基因组中 GpC 和 CpG 极少重叠(GCG 序列很稀少)
  • GpC 甲基化 → 反映染色质可及性(人工引入)
  • CpG 甲基化 → 反映内源性 DNA 甲基化(天然存在)
  • 所以一次实验同时得到两层信息!

要点3:分析要点

  • 比对后分开统计 GpC 和 CpG 位点的甲基化
  • GpC 甲基化高 → 该区域开放(核小体不在)
  • GpC 甲基化低 → 该区域被核小体占据
  • 排除 GCG 三核苷酸(GpC 和 CpG 重叠,无法区分)

要点4:应用场景

  • 研究启动子和增强子的核小体排列
  • 分析转录因子足迹(footprinting)
  • 单分子水平解析核小体定位与甲基化的关系
  • 单细胞 NOME-seq(scNOME-seq)

实战代码

# ===== NOME-seq 数据分析流程 =====

# 1. 质控和去接头
trim_galore --paired -o trimmed/ \
    nome_R1.fastq.gz nome_R2.fastq.gz

# 2. 用 Bismark 比对(与 BS-seq 相同的流程)
bismark --genome /ref/hg38/ --bowtie2 -p 4 \
    -1 trimmed/nome_R1_val_1.fq.gz \
    -2 trimmed/nome_R2_val_2.fq.gz \
    -o aligned/

# 3. 去重
deduplicate_bismark --paired aligned/nome_pe.bam

# 4. 提取甲基化信息(需要区分 GpC 和 CpG)
bismark_methylation_extractor --paired-end \
    --comprehensive --CX \
    --genome_folder /ref/hg38/ \
    -o methylation/ aligned/nome_pe.deduplicated.bam
# ===== Python: 分离 GpC 和 CpG 甲基化信号 =====
import pandas as pd
import numpy as np

# 读取 Bismark 的 CX 报告(包含所有胞嘧啶上下文)
cx_report = pd.read_csv("methylation/CX_report.txt", sep="\t",
    header=None,
    names=["chr", "pos", "strand", "meth", "unmeth", "context", "trinuc"])

# 分离 CpG 位点(内源性 DNA 甲基化)
# 排除 GCG 三核苷酸(GpC 和 CpG 重叠位点)
cpg = cx_report[
    (cx_report["context"] == "CG") &      # CpG 上下文
    (~cx_report["trinuc"].str.contains("GCG"))  # 排除 GCG
].copy()

# 分离 GpC 位点(反映染色质可及性)
# 同样排除 GCG
gpc = cx_report[
    (cx_report["trinuc"].str[0] == "G") &  # 上游是 G(即 GpC)
    (cx_report["context"] != "CG") &       # 不是 CpG 上下文
    (~cx_report["trinuc"].str.contains("GCG"))
].copy()

# 计算甲基化率
cpg["meth_rate"] = cpg["meth"] / (cpg["meth"] + cpg["unmeth"])
gpc["meth_rate"] = gpc["meth"] / (gpc["meth"] + gpc["unmeth"])

# GpC 甲基化率高 = 开放区域,低 = 核小体占位
# 定义核小体占位阈值
gpc["nucleosome"] = np.where(gpc["meth_rate"] < 0.3, "occupied", "accessible")

print(f"可及区域 GpC 位点数: {sum(gpc['nucleosome'] == 'accessible')}")
print(f"核小体占位 GpC 位点数: {sum(gpc['nucleosome'] == 'occupied')}")

# 计算基因组区域的平均可及性
# 例如 TSS ±1kb 区域
tss_regions = pd.read_csv("tss_regions.bed", sep="\t",
    header=None, names=["chr", "start", "end", "gene"])

# 对每个 TSS 区域计算平均 GpC 甲基化率(即可及性)
for _, region in tss_regions.iterrows():
    region_gpc = gpc[
        (gpc["chr"] == region["chr"]) &
        (gpc["pos"] >= region["start"]) &
        (gpc["pos"] <= region["end"])
    ]
    if len(region_gpc) > 0:
        accessibility = region_gpc["meth_rate"].mean()
        # 可及性高 = 核小体稀疏 = 转录活跃

面试常问点

★ NOME-seq 和 ATAC-seq 有什么区别?

参考答案:两者都能检测染色质可及性,但原理不同。ATAC-seq 用 Tn5 转座酶切割开放区域的 DNA,检测的是片段化后的 DNA。NOME-seq 用 GpC 甲基转移酶标记开放区域,不破坏 DNA,而且还能同时获得内源性 CpG 甲基化信息。NOME-seq 的独特优势是能在单分子水平看到核小体定位和甲基化的关系,ATAC-seq 做不到这一点。

★ 为什么要排除 GCG 序列?

参考答案:GCG 中的 C 既是 GpC 中的 C,也是 CpG 中的 C。如果这个 C 被甲基化了,我们无法判断是 M.CviPI 酶加上去的(反映可及性)还是内源性的 CpG 甲基化。为了避免混淆,分析时必须排除所有 GCG 位点。


速查卡片

问题一句话答案
NOME-seq 全称Nucleosome Occupancy and Methylome Sequencing
核心试剂M.CviPI(GpC 甲基转移酶)
GpC 甲基化含义高 = 开放(可及),低 = 核小体占位
CpG 甲基化含义内源性 DNA 甲基化
必须排除的序列GCG(GpC 和 CpG 重叠)
核心优势一次实验同时获得可及性 + 甲基化
与 ATAC-seq 区别不破坏 DNA,可做单分子分析