ChIP-seq分析全流程¶
一句话概述¶
ChIP-seq(染色质免疫沉淀测序)通过抗体富集特定蛋白结合的DNA片段来定位转录因子结合位点或组蛋白修饰区域,分析流程包括比对、peak calling(MACS2/MACS3)、差异binding分析(DiffBind)和motif发现(HOMER)。
核心知识点表格¶
| 知识点 | 说明 |
|---|---|
| ChIP-seq原理 | 交联→超声→免疫沉淀→测序,定位蛋白-DNA互作位点 |
| Input/IgG对照 | 背景对照样本,用于识别非特异性信号 |
| MACS2/MACS3 | Model-based Analysis of ChIP-Seq,最常用的peak caller(MACS3是活跃开发版本) |
| Narrow peak | TF结合位点(窄峰,~200bp),用于转录因子 |
| Broad peak | 组蛋白修饰区域(宽峰,数kb-Mb),用于H3K27me3等 |
| DiffBind | 差异binding分析(条件间peak差异) |
| HOMER | Motif发现和peak注释工具 |
| FRiP | Fraction of Reads in Peaks,质控核心指标 |
| IDR | Irreproducible Discovery Rate,评估重复间一致性 |
| BigWig | 归一化后的信号轨迹文件,用于可视化 |
各步骤详解¶
第一步:实验设计与数据质控¶
白话解释: ChIP-seq实验需要"处理组"(用目标抗体富集)和"对照组"(Input或IgG),必须有生物学重复(至少2个,ENCODE标准3个)。数据质控除了看测序质量,还要关注ChIP特有的指标如fragment size分布。
技术细节: - 实验设计:至少2个生物学重复 + Input对照 - 测序策略:通常single-end 50bp或paired-end 75bp - 测序深度:TF ChIP ~20M reads;Histone ~40M reads - Fragment size:200-500bp(通过超声控制) - Cross-contamination检查:确保reads比对到正确物种
代码示例:
# 质控
fastqc -t 8 -o qc/ *.fastq.gz
multiqc qc/ -o multiqc_report/
# 接头去除
fastp --in1 chip_R1.fastq.gz --in2 chip_R2.fastq.gz \
--out1 chip_clean_R1.fastq.gz --out2 chip_clean_R2.fastq.gz \
--json chip_fastp.json --thread 8
# 同样处理Input对照
fastp --in1 input_R1.fastq.gz --in2 input_R2.fastq.gz \
--out1 input_clean_R1.fastq.gz --out2 input_clean_R2.fastq.gz \
--json input_fastp.json --thread 8
第二步:序列比对与后处理¶
白话解释: 把reads比对到参考基因组,然后去重、过滤低质量比对和黑名单区域。这些步骤对ChIP-seq尤其重要,因为PCR重复和mapping artifacts会产生假peak。
技术细节: - 比对工具:Bowtie2(推荐)或BWA - 需要去除PCR duplicates(Picard/sambamba) - 过滤MAPQ<20的reads - 移除ENCODE blacklist regions(已知的artifact区域) - Paired-end需要正确处理mate对
代码示例:
# 建索引(只需一次)
bowtie2-build /ref/GRCh38.fa /ref/bt2_hg38
# 比对(single-end)
bowtie2 -x /ref/bt2_hg38 \
-U chip_clean.fastq.gz \
-S chip.sam \
-p 16 \
--very-sensitive \
--no-mixed \
--no-discordant
# 比对(paired-end)
bowtie2 -x /ref/bt2_hg38 \
-1 chip_clean_R1.fastq.gz \
-2 chip_clean_R2.fastq.gz \
-S chip.sam \
-p 16 \
--very-sensitive \
-X 1000 # 最大fragment长度
# 转BAM + 排序
samtools view -bS -q 20 -F 1804 chip.sam | \
samtools sort -@ 8 -o chip_sorted.bam -
samtools index chip_sorted.bam
# 去重
picard MarkDuplicates \
I=chip_sorted.bam \
O=chip_dedup.bam \
M=chip_dup_metrics.txt \
REMOVE_DUPLICATES=true
samtools index chip_dedup.bam
# 移除blacklist区域
bedtools intersect -v -abam chip_dedup.bam \
-b /ref/hg38-blacklist.v2.bed > chip_final.bam
samtools index chip_final.bam
# 同样处理Input对照
bowtie2 -x /ref/bt2_hg38 -U input_clean.fastq.gz -S input.sam -p 16 --very-sensitive
samtools view -bS -q 20 -F 1804 input.sam | samtools sort -@ 8 -o input_sorted.bam -
picard MarkDuplicates I=input_sorted.bam O=input_dedup.bam M=input_dup.txt REMOVE_DUPLICATES=true
bedtools intersect -v -abam input_dedup.bam -b /ref/hg38-blacklist.v2.bed > input_final.bam
samtools index input_final.bam
# 比对统计
samtools flagstat chip_final.bam
第三步:Peak Calling(MACS2/MACS3)¶
白话解释: MACS2/MACS3把基因组分成小窗口,统计每个窗口里ChIP样本的reads数和Input样本的reads数,通过泊松分布检验找出显著富集的区域——这就是"peak"(蛋白结合位点或修饰区域)。
技术细节: - MACS2/MACS3核心peak calling算法相同:基于泊松分布的富集检验 - 自动估计fragment size(通过正负链reads的shift distance) - Narrow peak模式:适合TF(尖锐的结合位点,<500bp) - Broad peak模式:适合组蛋白修饰(宽阔的修饰域,可达数十kb) - 输出:narrowPeak/broadPeak(BED6+4格式)、summit坐标、p/q值
代码示例:
# 注意:以下命令中macs2可替换为macs3(核心callpeak算法一致,结果几乎相同)
# MACS3新增功能:HMMRATAC(ATAC-seq专用)、cutoff-analysis、callvar(变异检测)
# 安装:pip install macs3
# === Narrow peak(转录因子)===
macs2 callpeak \
-t chip_final.bam \ # treatment(ChIP样本)
-c input_final.bam \ # control(Input对照)
-f BAM \ # 输入格式
-g hs \ # 基因组大小(hs=人,mm=鼠)
-n TF_sample1 \ # 输出前缀
--outdir peaks/ \
-q 0.05 \ # FDR阈值
--keep-dup all \ # 已去重,保留所有reads
--call-summits # 输出summit坐标
# === Broad peak(组蛋白修饰 H3K27me3/H3K36me3)===
macs2 callpeak \
-t chip_H3K27me3.bam \
-c input_final.bam \
-f BAM \
-g hs \
-n H3K27me3_sample1 \
--outdir peaks/ \
--broad \ # broad peak模式
--broad-cutoff 0.1 \ # broad peak FDR
-q 0.05 \
--keep-dup all
# === Paired-end数据 ===
macs2 callpeak \
-t chip_final.bam \
-c input_final.bam \
-f BAMPE \ # paired-end BAM
-g hs \
-n TF_PE_sample1 \
--outdir peaks/ \
-q 0.05
# === 生成BigWig信号轨迹(用于可视化)===
# 使用deeptools
bamCoverage -b chip_final.bam \
-o chip_signal.bw \
--binSize 10 \
--normalizeUsing RPGC \
--effectiveGenomeSize 2913022398 \
--extendReads 200 \
-p 16
# Input归一化的信号(log2ratio)
bamCompare -b1 chip_final.bam \
-b2 input_final.bam \
-o chip_vs_input.bw \
--binSize 50 \
--normalizeUsing RPGC \
--effectiveGenomeSize 2913022398 \
--scaleFactorsMethod readCount \
-p 16
# 统计peak数量和FRiP
echo "Peak count: $(wc -l < peaks/TF_sample1_peaks.narrowPeak)"
# 计算FRiP(Fraction of Reads in Peaks)
total_reads=$(samtools view -c chip_final.bam)
reads_in_peaks=$(bedtools intersect -a chip_final.bam -b peaks/TF_sample1_peaks.narrowPeak -u | samtools view -c)
echo "FRiP: $(echo "scale=4; $reads_in_peaks/$total_reads" | bc)"
第四步:质控与重复间一致性(IDR)¶
白话解释: ENCODE用IDR(不可重复发现率)来评估两个重复之间peak的一致性。核心思想:如果两个重复排名靠前的peak高度重叠,说明实验重复性好。
代码示例:
# === IDR分析 ===
# 需要每个重复独立call的peak(按p-value排序)
# 注意:IDR输入需要用-p (p-value cutoff较宽松,如0.01)以获得更多候选peak
macs2 callpeak -t rep1.bam -c input.bam -f BAM -g hs -n rep1 -p 0.01 --keep-dup all
macs2 callpeak -t rep2.bam -c input.bam -f BAM -g hs -n rep2 -p 0.01 --keep-dup all
# 按p-value排序
sort -k8,8nr rep1_peaks.narrowPeak > rep1_sorted.narrowPeak
sort -k8,8nr rep2_peaks.narrowPeak > rep2_sorted.narrowPeak
# 运行IDR
idr --samples rep1_sorted.narrowPeak rep2_sorted.narrowPeak \
--input-file-type narrowPeak \
--rank p.value \
--output-file idr_output.txt \
--plot \
--log-output-file idr.log
# IDR < 0.05的peak是高置信度peak
awk '$5 >= 540' idr_output.txt | wc -l # IDR 0.05对应-log10编码的540
# === deepTools质控可视化 ===
# 多样本相关性热图
multiBamSummary bins -b rep1.bam rep2.bam input.bam \
-o results.npz -p 16
plotCorrelation -in results.npz --corMethod spearman \
-o correlation_heatmap.pdf --plotFileFormat pdf
# 指纹图(Fingerprint plot)
plotFingerprint -b chip_rep1.bam chip_rep2.bam input.bam \
--labels "ChIP_rep1" "ChIP_rep2" "Input" \
-o fingerprint.pdf -p 16
# TSS处的信号富集
computeMatrix reference-point --referencePoint TSS \
-b 3000 -a 3000 \
-R /ref/genes.bed \
-S chip_signal.bw \
-o matrix.gz -p 16
plotHeatmap -m matrix.gz -o tss_heatmap.pdf
plotProfile -m matrix.gz -o tss_profile.pdf
第五步:差异Binding分析(DiffBind)¶
白话解释: 如果有多个条件/处理(如处理vs对照、不同时间点),DiffBind可以找出在不同条件间"结合强度"显著变化的peak——哪些基因组区域的蛋白结合在条件间发生了改变。
技术细节: - DiffBind整合了DESeq2/edgeR进行统计检验 - 输入:各样本的peak文件 + BAM文件 + 样本信息表 - 流程:建立consensus peak set → 对每个peak计数reads → 差异分析 - 输出:差异binding位点列表(log2FC, FDR)
代码示例:
library(DiffBind)
# 创建样本信息表
samples <- data.frame(
SampleID = c("Ctrl_rep1", "Ctrl_rep2", "Treat_rep1", "Treat_rep2"),
Condition = c("Control", "Control", "Treatment", "Treatment"),
Replicate = c(1, 2, 1, 2),
bamReads = c("ctrl_rep1.bam", "ctrl_rep2.bam", "treat_rep1.bam", "treat_rep2.bam"),
bamControl = c("input.bam", "input.bam", "input.bam", "input.bam"),
Peaks = c("ctrl_rep1_peaks.narrowPeak", "ctrl_rep2_peaks.narrowPeak",
"treat_rep1_peaks.narrowPeak", "treat_rep2_peaks.narrowPeak"),
PeakCaller = rep("narrow", 4)
)
# 创建DiffBind对象
dba_obj <- dba(sampleSheet = samples)
# 计算读数(在consensus peaks中计数)
# DiffBind 3.x默认使用summarizeOverlaps,无需显式设置bUseSummarizeOverlaps
dba_obj <- dba.count(dba_obj)
# 归一化
dba_obj <- dba.normalize(dba_obj)
# 建立对比(DiffBind 3.x API)
dba_obj <- dba.contrast(dba_obj, categories = DBA_CONDITION)
# 差异分析(使用DESeq2)
dba_obj <- dba.analyze(dba_obj, method = DBA_DESEQ2)
# 获取结果
db_results <- dba.report(dba_obj, th = 0.05)
print(db_results)
# 可视化
# MA plot
dba.plotMA(dba_obj)
# 火山图
dba.plotVolcano(dba_obj)
# PCA
dba.plotPCA(dba_obj, DBA_CONDITION)
# 热图
dba.plotHeatmap(dba_obj, contrast = 1, correlations = FALSE)
# 导出差异peak
export(db_results, "diff_binding_peaks.bed")
第六步:Motif分析(HOMER)¶
白话解释: 在peak区域中搜索过度出现的短序列模式(motif)——这些就是转录因子的"DNA识别密码"。如果你ChIP的蛋白是已知TF,应该能找到它的canonical motif;还可能发现共结合的其他TF的motif。
技术细节: - HOMER使用de novo motif发现 + 已知motif数据库比对 - 输入:peak区域的BED文件 - 背景:随机基因组区域(GC含量匹配)或自定义background - 输出:富集motif列表 + HTML报告
代码示例:
# === 安装HOMER ===
# conda install -c bioconda homer
# 或手动:
# perl /path/to/homer/configureHomer.pl -install homer
# perl /path/to/homer/configureHomer.pl -install hg38
# === Motif发现 ===
# 对peak summit区域(±100bp)做motif分析
findMotifsGenome.pl peaks/TF_sample1_summits.bed \
hg38 \
motif_results/ \
-size 200 \ # summit周围±100bp
-mask \ # 屏蔽重复序列
-p 16 \ # 线程数
-preparsedDir /tmp/homer_preparsed/
# 对narrowPeak全区域做motif
findMotifsGenome.pl peaks/TF_sample1_peaks.narrowPeak \
hg38 \
motif_full_results/ \
-size given \ # 使用peak的实际大小
-mask \
-p 16
# 自定义背景(如:所有开放染色质区域)
findMotifsGenome.pl diff_peaks.bed \
hg38 \
motif_custom_bg/ \
-size 200 \
-bg all_peaks.bed \ # 自定义背景
-mask -p 16
# === Peak注释(HOMER)===
annotatePeaks.pl peaks/TF_sample1_peaks.narrowPeak \
hg38 \
-annStats peak_annotation_stats.txt \
> peak_annotations.txt
# 注释统计包含:promoter/exon/intron/intergenic比例
# === 基因组分布可视化(R: ChIPseeker)===
# R: ChIPseeker peak注释
library(ChIPseeker)
library(TxDb.Hsapiens.UCSC.hg38.knownGene)
library(org.Hs.eg.db)
txdb <- TxDb.Hsapiens.UCSC.hg38.knownGene
# 读取peak文件
peaks <- readPeakFile("peaks/TF_sample1_peaks.narrowPeak")
# 注释
peakAnno <- annotatePeak(peaks, TxDb = txdb, annoDb = "org.Hs.eg.db",
tssRegion = c(-3000, 3000))
# 可视化
plotAnnoPie(peakAnno) # 饼图
plotAnnoBar(peakAnno) # 条形图
plotDistToTSS(peakAnno) # 到TSS距离分布
# 导出注释结果
anno_df <- as.data.frame(peakAnno)
write.csv(anno_df, "peak_annotation_table.csv")
# GO/KEGG富集分析(peak关联的基因)
library(clusterProfiler)
genes <- anno_df$geneId[!is.na(anno_df$geneId)]
ego <- enrichGO(gene = genes, OrgDb = org.Hs.eg.db, ont = "BP", readable = TRUE)
dotplot(ego, showCategory = 20)
实战命令(可复制)¶
# ===== 完整ChIP-seq流水线 =====
SAMPLE="TF_rep1"
INPUT="Input_rep1"
REF="/ref/GRCh38.fa"
BT2_IDX="/ref/bt2_hg38"
BLACKLIST="/ref/hg38-blacklist.v2.bed"
THREADS=16
# 1. 质控+trim
fastp --in1 ${SAMPLE}.fastq.gz --out1 ${SAMPLE}_clean.fastq.gz --thread 8 --json ${SAMPLE}.json
fastp --in1 ${INPUT}.fastq.gz --out1 ${INPUT}_clean.fastq.gz --thread 8 --json ${INPUT}.json
# 2. 比对
bowtie2 -x ${BT2_IDX} -U ${SAMPLE}_clean.fastq.gz -p ${THREADS} --very-sensitive | \
samtools view -bS -q 20 -F 1804 | samtools sort -@ 8 -o ${SAMPLE}_sorted.bam -
bowtie2 -x ${BT2_IDX} -U ${INPUT}_clean.fastq.gz -p ${THREADS} --very-sensitive | \
samtools view -bS -q 20 -F 1804 | samtools sort -@ 8 -o ${INPUT}_sorted.bam -
# 3. 去重
picard MarkDuplicates I=${SAMPLE}_sorted.bam O=${SAMPLE}_dedup.bam M=${SAMPLE}_dup.txt REMOVE_DUPLICATES=true
picard MarkDuplicates I=${INPUT}_sorted.bam O=${INPUT}_dedup.bam M=${INPUT}_dup.txt REMOVE_DUPLICATES=true
# 4. 去blacklist
bedtools intersect -v -abam ${SAMPLE}_dedup.bam -b ${BLACKLIST} > ${SAMPLE}_final.bam
bedtools intersect -v -abam ${INPUT}_dedup.bam -b ${BLACKLIST} > ${INPUT}_final.bam
samtools index ${SAMPLE}_final.bam; samtools index ${INPUT}_final.bam
# 5. Peak calling
macs2 callpeak -t ${SAMPLE}_final.bam -c ${INPUT}_final.bam \
-f BAM -g hs -n ${SAMPLE} --outdir peaks/ -q 0.05 --call-summits --keep-dup all
# 6. BigWig
bamCoverage -b ${SAMPLE}_final.bam -o ${SAMPLE}.bw --binSize 10 \
--normalizeUsing RPGC --effectiveGenomeSize 2913022398 --extendReads 200 -p ${THREADS}
# 7. Motif
findMotifsGenome.pl peaks/${SAMPLE}_summits.bed hg38 motifs/${SAMPLE}/ -size 200 -mask -p ${THREADS}
# 8. 质控统计
echo "Total reads: $(samtools view -c ${SAMPLE}_final.bam)"
echo "Peaks: $(wc -l < peaks/${SAMPLE}_peaks.narrowPeak)"
echo "FRiP: $(echo "scale=4; $(bedtools intersect -a ${SAMPLE}_final.bam -b peaks/${SAMPLE}_peaks.narrowPeak -u | samtools view -c) / $(samtools view -c ${SAMPLE}_final.bam)" | bc)"
面试常问点¶
Q1: ChIP-seq为什么需要Input对照?¶
A: Input对照反映基因组背景信号——某些区域(如开放染色质、高GC、重复区)即使没有抗体也容易被测到更多reads("mapability bias"和"open chromatin bias")。没有Input,MACS2无法区分真正的蛋白结合富集和这些背景偏差。IgG对照类似但还反映非特异性抗体结合。
Q2: Narrow peak和Broad peak的选择依据?¶
A: Narrow peak(默认):转录因子(点状结合,~200bp peak)、H3K4me3(启动子标记,尖锐peak)、H3K27ac(增强子标记)。Broad peak(--broad):H3K27me3(多梳体抑制,宽阔域)、H3K36me3(gene body标记)、H3K9me3(异染色质,超宽域)。判断依据是生物学上该标记的分布模式。
Q3: FRiP的合格标准是多少?¶
A: ENCODE标准:FRiP > 1%(最低要求),高质量数据通常>5%。不同抗体差异大:TF ChIP通常FRiP 1-5%(结合位点少),H3K4me3/H3K27ac可达20-40%。FRiP过低(<1%)通常表示ChIP效率差或抗体质量问题。
Q4: MACS2/MACS3的q-value和p-value有什么区别?该用哪个?¶
A: p-value是单个位点的统计显著性;q-value是BH(Benjamini-Hochberg)校正后的FDR。推荐使用q-value(-q 0.05或-q 0.01),因为全基因组检验涉及数百万次比较,需要多重校正。如果用p-value(-p),需要更严格的阈值(如1e-5)。IDR分析时用较宽松的p-value(0.01)以获得更多候选peak。注意:MACS3的callpeak核心算法与MACS2相同,参数也完全兼容。
Q5: DiffBind的统计原理?¶
A: DiffBind先定义consensus peak set(所有样本中至少N个样本有peak的区域),然后对每个consensus peak区域在所有样本中计数reads(类似RNA-seq对gene区域计数),归一化后用DESeq2或edgeR的负二项模型检验条件间差异。本质是把ChIP-seq差异分析转化为类似RNA-seq差异表达的框架。
Q6: HOMER findMotifsGenome的背景模型是什么?¶
A: 默认背景:从基因组中随机采样相同数量、相同大小的区域,并匹配GC含量分布。这确保发现的motif富集不是因为GC含量差异而是真正的序列特异性。可以用-bg指定自定义背景(如所有open chromatin peak,这样找到的是"在你的peak中比一般开放区域更富集"的motif)。
Q7: ChIP-seq需要多大的测序深度?¶
A: ENCODE推荐:TF ChIP每个重复至少20M uniquely mapped reads(10M绝对最低)。组蛋白修饰需要更多:H3K4me3约20M,broad marks如H3K27me3约40-60M。Input对照应与ChIP深度相当或更高。判断标准:peak数量随深度增加是否饱和(saturation analysis)。
Q8: spike-in normalization是什么,什么时候需要?¶
A: 在ChIP实验中加入已知量的外源染色质(如果蝇染色质做人样本ChIP),测序后用外源reads数归一化。用途:当怀疑全局组蛋白修饰水平变化时(如药物处理导致全基因组H3K27me3整体下降),传统归一化(如总reads数)无法检测这种全局变化,spike-in可以。
易错点¶
1. 没有Input对照就做peak calling¶
问题: 无对照时MACS2使用局部背景估计,在高比对性区域产生大量假peak。 正确做法: 每次ChIP实验必须做Input或IgG对照,且对照需要足够深度。
2. 未去除blacklist区域¶
问题: ENCODE blacklist区域(高度重复、难比对区域)会产生极高的假peak信号。 正确做法: 在peak calling前或后移除blacklist区域。hg38 blacklist文件:hg38-blacklist.v2.bed。
3. 对broad peak数据使用narrow模式¶
问题: H3K27me3等broad marks用narrow模式会把一个大域碎片化成很多小peak,丢失生物学意义。 正确做法: 使用--broad参数,且设置合适的--broad-cutoff(如0.05或0.1)。
4. PCR重复未去除导致假peak¶
问题: PCR过度扩增的片段在某个位置堆积,模拟出假的"富集"信号。 正确做法: 必须在peak calling前去除PCR duplicates。WES/ATAC/ChIP-seq中这一步都是必须的。
5. 不同样本比对参数不一致¶
问题: ChIP样本和Input样本用不同参数比对,导致系统偏差。 正确做法: 所有样本(ChIP和Input)使用完全相同的比对和过滤参数。
6. DiffBind中consensus peak set太严格或太宽松¶
问题: 要求所有样本都有peak(太严格,丢失条件特异peak)或只要1个样本有(太宽松,引入噪声)。 正确做法: 设置合理阈值:通常要求至少在一个条件的大多数重复中出现(如2/3)。
补充知识¶
ENCODE质控标准汇总¶
| 指标 | 合格标准 | 方法 |
|---|---|---|
| Uniquely mapped reads | >10M (TF), >20M (histone) | samtools flagstat |
| FRiP | >1% | bedtools intersect |
| NRF (Non-Redundant Fraction) | >0.8 | Picard metrics |
| PBC1 (PCR Bottleneck Coefficient) | >0.8 | 自定义计算 |
| NSC (Normalized Strand Coefficient) | >1.05 (TF), >1.02 (histone) | phantompeakqualtools |
| RSC (Relative Strand Correlation) | >0.8 | phantompeakqualtools |
| IDR (Reproducibility) | IDR<0.05 peaks > overlap with pooled | idr |
工具生态¶
| 步骤 | 推荐工具 | 替代选择 |
|---|---|---|
| 比对 | Bowtie2 | BWA-MEM, chromap |
| Peak calling | MACS2/MACS3 | HOMER, SEACR, SICER2(broad) |
| 差异binding | DiffBind (3.x) | MAnorm2, csaw |
| Motif | HOMER | MEME-ChIP, DREME |
| 注释 | ChIPseeker | HOMER annotatePeaks |
| 可视化 | deepTools, IGV | pyGenomeTracks |
| QC | deepTools, phantompeakqualtools | ChIPQC(R) |
CUT&RUN/CUT&Tag替代方案¶
- CUT&RUN和CUT&Tag是ChIP-seq的新一代替代技术
- 所需细胞数更少(可至单细胞水平)、背景更低
- 分析流程类似但peak calling推荐用SEACR(不需要Input)
- 正在逐步替代传统ChIP-seq
本教程覆盖ChIP-seq从原始数据到motif发现的完整分析流程,遵循ENCODE质控标准,适合转录因子和组蛋白修饰ChIP-seq分析。