跳转至

染色质可及性分析ATAC-seq进阶

一句话概述:ATAC-seq通过转座酶Tn5"打碎"开放的染色质区域来检测基因组哪些地方是"打开的"——那些调控基因表达的开关(启动子、增强子)就藏在这些开放区域里。

核心知识点表

知识点白话解释重要程度
染色质可及性DNA是"打开"还是"关闭"的状态⭐⭐⭐⭐⭐
ATAC-seq用Tn5转座酶检测开放染色质的技术⭐⭐⭐⭐⭐
Peak calling找出信号显著富集的区域(开放区域)⭐⭐⭐⭐⭐
核小体定位ATAC-seq片段大小反映核小体位置⭐⭐⭐⭐
转录因子足迹开放区域中转录因子结合留下的"脚印"⭐⭐⭐⭐
差异可及性分析比较不同条件下哪些区域开放程度改变⭐⭐⭐⭐

一、ATAC-seq原理

ATAC-seq = "测试DNA哪里是打开的"

原理类比:
  想象DNA缠绕在蛋白质上,像毛线缠在线轴上
  - 缠紧的地方 = 关闭的染色质 → Tn5进不去 → 没信号
  - 松开的地方 = 开放的染色质 → Tn5能插入 → 有信号

Tn5转座酶的作用:
  1. 带着测序接头,只能插入"松开"的DNA
  2. 插入后把DNA剪断
  3. 测序这些碎片,就知道哪里是"松开"的

片段大小的信息(进阶知识):
  < 100bp    → 无核小体区域(NFR),转录因子结合位点
  ~200bp     → 1个核小体
  ~400bp     → 2个核小体
  ~600bp     → 3个核小体

  所以ATAC-seq不仅能看开放性,还能看核小体定位!

二、ATAC-seq分析流程

2.1 环境准备

# 创建ATAC-seq分析环境
conda create -n atacseq python=3.10  # 创建环境
conda activate atacseq  # 激活

# 安装所有需要的工具
conda install -c bioconda \
    fastqc trim-galore \    # 质控
    bowtie2 samtools \      # 比对
    picard \                # 去重
    macs2 \                 # Peak calling
    deeptools \             # 信号可视化
    bedtools \              # 区间操作
    homer                   # motif分析

# Python包
pip install pysam pyBigWig pybedtools  # Python分析包

2.2 数据预处理

# ========== 质控与Trim ==========
trim_galore \
    --paired \
    --quality 20 \
    --length 20 \           # ATAC-seq片段可能很短
    --fastqc \
    --cores 4 \
    -o trimmed/ \
    sample_R1.fq.gz sample_R2.fq.gz

# ========== 比对 ==========
# ATAC-seq推荐用Bowtie2
bowtie2 \
    -x ~/genomes/hg38/bt2_index \  # Bowtie2索引
    -1 trimmed/sample_R1_val_1.fq.gz \
    -2 trimmed/sample_R2_val_2.fq.gz \
    --very-sensitive \       # 高灵敏度模式
    --no-mixed \             # 不允许单端比对
    --no-discordant \        # 不允许不一致比对
    -X 2000 \                # 最大片段长度2000bp
    --threads 8 \            # 8线程
    -S sample.sam 2> sample_bowtie2.log  # 输出SAM + 日志

# SAM转BAM并排序
samtools view -bS -q 30 sample.sam | \  # 过滤低质量比对(MAPQ≥30)
    samtools sort -@ 8 -o sample_sorted.bam  # 排序
samtools index sample_sorted.bam  # 建索引

# ========== 去除线粒体reads ==========
# ATAC-seq中线粒体reads很多(正常现象)
samtools idxstats sample_sorted.bam | grep "chrM"  # 查看线粒体reads比例

# 去除线粒体reads
samtools view -b sample_sorted.bam \
    $(samtools idxstats sample_sorted.bam | grep -v "chrM" | cut -f1 | tr '\n' ' ') \
    > sample_noMT.bam  # 只保留非线粒体reads
samtools index sample_noMT.bam  # 重建索引

# ========== PCR去重 ==========
picard MarkDuplicates \
    I=sample_noMT.bam \
    O=sample_dedup.bam \
    M=dup_metrics.txt \
    REMOVE_DUPLICATES=true  # 直接删除重复reads
samtools index sample_dedup.bam  # 建索引

# ========== 黑名单区域过滤 ==========
# 下载ENCODE黑名单
wget https://github.com/Boyle-Lab/Blacklist/raw/master/lists/hg38-blacklist.v2.bed.gz
gunzip hg38-blacklist.v2.bed.gz

# 去除黑名单区域
bedtools intersect -v \
    -a sample_dedup.bam \     # 输入BAM
    -b hg38-blacklist.v2.bed \ # 黑名单BED
    > sample_final.bam         # 最终BAM
samtools index sample_final.bam

2.3 Peak Calling

# ========== MACS2 Peak Calling ==========
macs2 callpeak \
    -t sample_final.bam \       # 输入BAM
    -f BAMPE \                   # 双端BAM格式
    -g hs \                      # 基因组大小:hs=人类
    -n sample \                  # 输出文件前缀
    --outdir peaks/ \            # 输出目录
    -q 0.05 \                    # FDR阈值
    --nomodel \                  # 不建模(ATAC-seq推荐)
    --shift -100 \               # 移位-100bp
    --extsize 200 \              # 延伸200bp
    --keep-dup all \             # 保留所有reads(已去重)
    --broad                      # 宽peak模式(可选)

# MACS2输出文件:
# peaks/sample_peaks.narrowPeak  ← 窄peak结果(默认)
# peaks/sample_peaks.broadPeak   ← 宽peak结果(用--broad时)
# peaks/sample_summits.bed       ← peak峰顶位置
# peaks/sample_treat_pileup.bdg  ← 信号堆叠文件

# 统计peak数量
wc -l peaks/sample_peaks.narrowPeak  # 查看peak数量
# 正常范围:20,000 - 150,000 个peaks

2.4 信号可视化

# ========== 生成BigWig信号文件 ==========
bamCoverage \
    -b sample_final.bam \
    -o sample.bw \              # 输出BigWig文件
    --binSize 10 \              # 10bp窗口
    --normalizeUsing RPKM \     # RPKM标准化
    --extendReads \             # 延伸reads
    -p 8                        # 8线程

# ========== TSS富集分析(质量评估) ==========
# 计算TSS附近的信号富集
computeMatrix reference-point \
    -S sample.bw \              # BigWig信号文件
    -R hg38_tss.bed \           # TSS位置BED文件
    --referencePoint TSS \      # 参考点:TSS
    -b 2000 \                   # TSS上游2000bp
    -a 2000 \                   # TSS下游2000bp
    --skipZeros \               # 跳过零值
    -o tss_matrix.gz            # 输出矩阵

plotProfile \
    -m tss_matrix.gz \          # 输入矩阵
    -o tss_enrichment.png \     # 输出图片
    --plotTitle "TSS Enrichment" \
    --perGroup                  # 按组画线

# TSS富集分数(TSS enrichment score):
# >7 = 高质量数据
# 5-7 = 可接受
# <5 = 质量差

三、差异可及性分析

#!/usr/bin/env Rscript
# ATAC-seq差异可及性分析(使用DiffBind)

BiocManager::install("DiffBind")
library(DiffBind)  # 加载DiffBind

# ========== 创建样品表 ==========
samples <- data.frame(
    SampleID = c("C1", "C2", "C3", "T1", "T2", "T3"),
    Condition = c("Control", "Control", "Control", "Treatment", "Treatment", "Treatment"),
    bamReads = c("C1.bam", "C2.bam", "C3.bam", "T1.bam", "T2.bam", "T3.bam"),
    Peaks = c("C1_peaks.narrowPeak", "C2_peaks.narrowPeak", "C3_peaks.narrowPeak",
              "T1_peaks.narrowPeak", "T2_peaks.narrowPeak", "T3_peaks.narrowPeak"),
    PeakCaller = rep("narrow", 6)
)

# ========== DiffBind分析流程 ==========
dba <- dba(sampleSheet = samples)  # 创建DiffBind对象
dba <- dba.count(dba)  # 计算reads计数
dba <- dba.contrast(dba, categories = DBA_CONDITION)  # 设置对比
dba <- dba.analyze(dba, method = DBA_DESEQ2)  # DESeq2差异分析

# 提取结果
results <- dba.report(dba)  # 获取差异结果

# 查看差异peaks数量
cat("差异可及性区域:", length(results), "\n")
cat("更开放:", sum(results$Fold > 0), "\n")
cat("更关闭:", sum(results$Fold < 0), "\n")

# 可视化
dba.plotMA(dba)  # MA图
dba.plotVolcano(dba)  # 火山图
dba.plotHeatmap(dba, contrast = 1)  # 热图

四、转录因子足迹分析

# ========== HINT-ATAC足迹分析 ==========
# 安装RGT (Regulatory Genomics Toolbox)
pip install rgt  # 安装RGT

# 运行足迹分析
rgt-hint footprinting \
    --atac-seq \                # ATAC-seq模式
    --paired-end \              # 双端数据
    --organism hg38 \           # 基因组版本
    --output-location footprints/ \
    sample_final.bam \          # 输入BAM
    peaks/sample_peaks.narrowPeak  # Peak文件

# 差异足迹分析
rgt-hint differential \
    --organism hg38 \
    --bc \                      # 偏差校正
    --nc 8 \                    # 8线程
    --output-location diff_footprints/ \
    control.bam treatment.bam \
    control_peaks.bed treatment_peaks.bed

常见报错与解决

报错信息原因解决方法
Very high mitochondrial rate线粒体reads>50%正常现象,过滤后继续分析
Too few peaks called数据量不够或参数不对降低q值阈值,检查文库质量
Fragment size wrong不是双端数据-f BAM代替-f BAMPE
TSS enrichment <5数据质量差检查建库质量,可能需要重做实验
DiffBind count errorBAM文件路径错误使用绝对路径

速查表

========================================
ATAC-seq进阶分析 速查表
========================================

【完整流程】
1. 质控+Trim         → trim_galore
2. 比对              → bowtie2 --very-sensitive -X 2000
3. 过滤              → 去线粒体+去重+去黑名单
4. Peak calling      → macs2 callpeak -f BAMPE --nomodel
5. 信号可视化        → deeptools (bamCoverage, computeMatrix)
6. 差异分析          → DiffBind / DESeq2
7. 足迹分析          → HINT-ATAC / TOBIAS

【质量标准】
线粒体reads          → <50%(过滤后)
唯一比对率           → >70%
重复率               → <30%
Peak数               → 20,000-150,000
TSS enrichment       → >7为高质量
FRiP                 → >20%(Fraction of Reads in Peaks)

【MACS2参数(ATAC-seq专用)】
-f BAMPE             → 双端BAM格式
--nomodel            → 不建模(ATAC-seq必须)
--shift -100         → 移位-100bp
--extsize 200        → 延伸200bp
--keep-dup all       → 保留所有(已去重时用)

【片段大小含义】
<100bp               → 无核小体区域(NFR)
~200bp               → 单核小体
~400bp               → 双核小体

【面试考点】
Q: ATAC-seq和DNase-seq的区别?
A: ATAC-seq用Tn5转座酶,需要细胞少,操作简单;DNase-seq用DNase I酶

Q: 为什么ATAC-seq要去除线粒体reads?
A: 线粒体DNA无组蛋白包装,全部开放,Tn5大量插入造成干扰

Q: TSS enrichment score是什么?
A: TSS处信号vs背景的比值,反映数据质量,>7为高质量
========================================

参考资料:Buenrostro et al. Nature Methods 2013 | ENCODE ATAC-seq Pipeline | DiffBind | MACS2