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,可做单分子分析 |