1.CUT&Tag 数据分析实战(1)

跟着官网学习CUT&Tag数据分析,参考:protocol。用的自己的数据:A_rep1, A_rep2, WT_rep1, WT_rep2

1 前言

1.3 CUT&Tag 数据处理和分析大纲

Figure 2. CUT&Tag data processing and analysis.

2 数据预处理

2.1 质控【选做】

公司返回数据已经质检,这里就不做,也不做 trimming。

在任何情况下,我们不建议修剪,因为后面的 bowtie2 参数将提供准确的 mapping 信息而无需修剪。

3 比对

3.1 Bowtie2比对【必做】

3.1.1 比对到 mm10

本实验用的是小鼠细胞,所以参考基因组选 mm10。UCSC下载 latest/

使用 Bowtie2 进行双端比对,参数设置:--end-to-end --very-sensitive --no-mixed --no-discordant --phred33 -I 10 -X 700, mapping 长度为 10-700 bp 的插入片段。关键步骤:无需修剪标准 25x25 PE 测序的 reads,因为接头序列不会包含在插入片段 >25 bp 的reads。但是,对于执行较长测序的用户,需要通过 Cutadapt 修剪,比对时,参数设置为--local --very-sensitive --no-mixed --no-discordant --phred33 -I 10 -X 700,以忽略 3' 端的任何剩余接头序列。

3.1.2 比对到 spike-in【根据实验方案选做】个人感觉不用做,后面用CPM校准好像差不多

因为试剂盒提供的是三段 spike-in 序列,所以这里另外分别计算了 spike-in1&2&3 的 reads,用以验证理论占比。

projPath="~/0908_test"
config1=~/0908_test/config1 #用于后续批量处理。第一列是样本名,第二、三列分别是双端测序原始数据的名称——R1.fq.gz和R2.fq.gz
ref="~/INDEX/bowtie2Index/mouse/mm10"
spikeInRef="~/INDEX/bowtie2Index/ecoli3/ecoli"
spikeInRef1="~/INDEX/bowtie2Index/ecoli3/ecoli1"
spikeInRef2="~/INDEX/bowtie2Index/ecoli3/ecoli2"
spikeInRef3="~/INDEX/bowtie2Index/ecoli3/ecoli3"

mkdir -p ${projPath}/alignment/sam/bowtie2_summary
mkdir -p ${projPath}/alignment/bam/picard_summary
mkdir -p ${projPath}/alignment/bed

module load tools/bowtie2-2.3.5.1
## Build the bowtie2 reference genome index if needed:
bowtie2-build -c GTTCCACTCCTGAAGTGTCAAGTACATCGCAAAGTCTCCGCAATTACACGCAAGAAAAAACCGCCATCAGGCGGCTTGGTGTTCTTTCAGTTCTTCAATTCGAATATTGGTTACGTCTGCATGTGCTATCTGCGCCCATATCATCCAGTGGTCGTAGCAGTCGTTGATGTTCTCCGCTTCGATAACTCTGTTGAATGGCTCTCCATTCCATTCTCCTGTGACTCGGAAGT ~/INDEX/bowtie2Index/ecoli3/ecoli1
bowtie2-build -c AGTCGGTGTGAATCCCATCAGCGTTACCGTTTCGCGGTGCTTCTTCAGTACGCTACGGCAAATGTCATCGACGTTTTTATCCGGAAACTGCTGTCTGGCTTTTTTTGATTTCAGAATTAGCCTGACGGGCAATGCTGCGAAGGGCGTTTTCCTGCTGAGGTGTCATTGAACAAGTCCCATGTCGGCAAGCATAAGCACACAGAATATGAAGCCCGCTGCCAGAAAAATGCATTCCGTGGTTGTCATACCT ~/INDEX/bowtie2Index/ecoli3/ecoli2
bowtie2-build -c CCTTACTGGAATCGATGGTGTCTCCGGTGTGAAAGAACACCAACAGGGGTGTTACCACTACCGCAGGAAAAGGAGGACGTGTGGCGAGACAGCGACGAAGTATCACCGACATAATCTGCGAAAACTGCAAATACCTTCCAACGAAACGCACCAGAAATAAACCCAAGCCAATCCCAAAAGAATCTGACGTAAAAACCTTCAACTACACGGCTCACCTGTGGGATATCCGGTGGCTAAGACGTCGTGCGAGGAAAACAAGGTGATTGACCAAAATCGAAGTTACGAACAAGAAAGCGTCGA ~/INDEX/bowtie2Index/ecoli3/ecoli3
bowtie2-build ~/GENOME/ecoli3/ecoli3.fasta ~/INDEX/bowtie2Index/ecoli3/ecoli #ecoli3.fasta是三段序列的汇总
bowtie2-build ~/GENOME/mouse/mm10.fa ~/INDEX/bowtie2Index/mouse/mm10

cat $config1 | while read line
do
arr=($line)
fq1=${arr[1]}
fq2=${arr[2]}
sample=${arr[0]}

bowtie2 --end-to-end --very-sensitive --no-mixed --no-discordant --phred33 -I 10 -X 700 \
-p 32 -x ${ref} -1 $fq1 -2 $fq2 \
-S ${projPath}/alignment/sam/$sample.sam 2> ${projPath}/alignment/sam/bowtie2_summary/$sample.txt

bowtie2 --end-to-end --very-sensitive --no-mixed --no-discordant --phred33 -I 10 -X 700 \
-p 32 -x ${spikeInRef} -1 $fq1 -2 $fq2 \
-S $projPath/alignment/sam/$sample.spikein.sam 2> $projPath/alignment/sam/bowtie2_summary/$sample.spikein.txt

bowtie2 --end-to-end --very-sensitive --no-mixed --no-discordant --phred33 -I 10 -X 700 \
-p 32 -x ${spikeInRef1} -1 $fq1 -2 $fq2 \
-S $projPath/alignment/sam/$sample.spikein1.sam 2> $projPath/alignment/sam/bowtie2_summary/$sample.spikein1.txt

bowtie2 --end-to-end --very-sensitive --no-mixed --no-discordant --phred33 -I 10 -X 700 \
-p 32 -x ${spikeInRef2} -1 $fq1 -2 $fq2 \
-S $projPath/alignment/sam/$sample.spikein2.sam 2> $projPath/alignment/sam/bowtie2_summary/$sample.spikein2.txt

bowtie2 --end-to-end --very-sensitive --no-mixed --no-discordant --phred33 -I 10 -X 700 \
-p 32 -x ${spikeInRef3} -1 $fq1 -2 $fq2 \
-S $projPath/alignment/sam/$sample.spikein3.sam 2> $projPath/alignment/sam/bowtie2_summary/$sample.spikein3.txt

done

为了进行 spike-in 标准化,可以增加两个参数:--no-overlap --no-dovetail,以避免实验基因组与用于校准的大肠杆菌DNA的交叉比对。

用这两个参数,虽然三段 spike-in 之和有 reads 数,但 spike-in1号 直接被筛归零,这里就不用了。

3.1.3 比对结果

有关更详细的参数说明,用户可以参考bowite2手册
${projPath}/alignment/sam/bowtie2_summary/$sample.txt

  • 30319290 reads; of these:
  • 30319290 (100.00%) were paired; of these:
  • 4850287 (16.00%) aligned concordantly 0 times
  • 20208420 (66.65%) aligned concordantly exactly 1 time
  • 5260583 (17.35%) aligned concordantly >1 times
  • 84.00% overall alignment rate
    ———
    30319290 是测序深度,即 paired reads 的总数。
    4850287 是没比对上的 read pairs 数。
    20208420 + 5260583 是成功比对上的 read paris 数。
    84.00% 是总体比对率。

也可以用 samtools flagstat ${projPath}/alignment/bam/$sample.mapped.bam 计算 reads 数:

  • 50938006 + 0 in total (QC-passed reads + QC-failed reads)
  • 0 + 0 secondary
  • 0 + 0 supplementary
  • 0 + 0 duplicates
  • 50938006 + 0 mapped (100.00% : N/A)
  • 50938006 + 0 paired in sequencing
  • 25469003 + 0 read1
  • 25469003 + 0 read2
  • 50938006 + 0 properly paired (100.00% : N/A)
  • 50938006 + 0 with itself and mate mapped
  • 0 + 0 singletons (0.00% : N/A)
  • 0 + 0 with mate mapped to a different chr
  • 0 + 0 with mate mapped to a different chr (mapQ>=5)
    ——
    25469003 才是跟上面一样,成功比对上的 read paris 数:20208420 + 5260583。

3.4 评估比对上的片段大小分布【必做】

mkdir -p $projPath/alignment/sam/fragmentLen

cat $config1 | while read line
do
arr=($line)
sample=${arr[0]}
## Extract the 9th column from the alignment sam file which is the fragment length
samtools view -F 0x04 $projPath/alignment/sam/$sample.sam | awk -F'\t' 'function abs(x){return ((x < 0.0) ? -x : x)} {print abs($9)}' | sort | uniq -c | awk -v OFS="\t" '{print $2, $1/2}' >$projPath/alignment/sam/fragmentLen/$sample.fragmentLen.txt
done

4 比对结果筛选和文件格式转换

4.1 通过 mapping 质量筛选 mapped reads [可选]

某些项目可能需要对比对质量分数进行更严格的筛选。这篇博客详细讨论了 bowtie 如何计算质量分数的。
MAPQ(x) = -10 * log10(P(x is mapped wrongly)) = -10 * log10(p),MAPQ范围从 0 到 37、40 或 42。
samtools view -q minQualityScore 将过滤低于用户定义的 minQualityScore 的所有比对结果。

4.2 文件格式转换【必做】

3.3 去除重复【选做/必做】

CUT&Tag 将接头整合到 antibody-tethered pA-Tn5 附近的 DNA 中,整合的确切位点受到周围 DNA 可及性的影响。出于这个原因,具有相同的起始和结束位置的片段应该是常见的,并且这种“重复”可能不是 PCR 过程中产生的重复。在实践中,我们发现高质量的 CUT&Tag 数据集的 apparent 重复率很低,即使是 apparent “重复”片段也可能是真正的片段。因此,我们不建议删除重复 reads。在使用非常少材料或者怀疑是PCR重复的时候,可以去除重复。以下命令显示如何使用 Picard 检查重复率。

官网不建议 rmdup,但这里因为样本原因是跑了15个循环,而且我们很明确是pcr重复,直接用 mapped 数据跑出来的图后面有很多“杂质”。这里转化成 bam 文件后再做的去重,方便。一定要记得两种排序的转化!不然就会一直报错,得不到 PE 形式的结果(那还做什么 fragment!我猜的)。还有之前傻子似的把spike-in做了去重,千万不要!本来就是pcr产物,去了就没了!!

picardCMD="java -jar ~/.conda/envs/cuttagg/share/picard-2.18.29-0/picard.jar"

cat $config1 | while read line
do
arr=($line)
sample=${arr[0]}

## Filter and keep the mapped read pairs
samtools view -bS -F 0x04 $projPath/alignment/sam/$sample.sam >$projPath/alignment/bam/$sample.mapped.bam #这里加-q参数,完成步骤4.1

## 坐标排序为 rmDup 做准备
samtools sort -o $projPath/alignment/bam/$sample.sorted.bam $projPath/alignment/bam/$sample.mapped.bam
## remove duplicates
$picardCMD MarkDuplicates \
REMOVE_DUPLICATES=true \
I=$projPath/alignment/bam/$sample.sorted.bam \
O=$projPath/alignment/bam/$sample.sorted.rmDup.bam \
M=$projPath/alignment/bam/picard_summary/$sample.sorted.rmDup.txt

## 这里一定一定要再按名称排序一次,不然会报错几个G!因为后面 -bedpe 参数只能识别这种排序!!!
samtools sort -n -o $projPath/alignment/bam/$sample.name.rmDup.bam $projPath/alignment/bam/$sample.sorted.rmDup.bam
## Convert into bed file format
bedtools bamtobed -i $projPath/alignment/bam/$sample.name.rmDup.bam -bedpe >$projPath/alignment/bed/$sample.bed
## Keep the read pairs that are on the same chromosome and fragment length less than 1000bp.
awk '$1==$4 && $6-$2 < 1000 {print $0}' $projPath/alignment/bed/$sample.bed >$projPath/alignment/bed/$sample.clean.bed
## Only extract the fragment related columns
cut -f 1,2,6 $projPath/alignment/bed/$sample.clean.bed | sort -k1,1 -k2,2n -k3,3n  >$projPath/alignment/bed/$sample.fragments.bed

done

4.3 评估重复性

为了研究重复之间和不同条件下的可重复性,将基因组分成 500 个 bp 的 bin【取中点,再算上前后250bp】,计算每个 bin reads计数的 log2 转换值的 (在重复数据集之间)Pearson 相关性。

binLen=500

mkdir -p $projPath/alignment/bed/binLen

cat $config1 | while read line
do
arr=($line)
sample=${arr[0]}
## We use the mid point of each fragment to infer which 500bp bins does this fragment belong to.
awk -v w=$binLen '{print $1, int(($2 + $3)/(2*w))*w + w/2}' $projPath/alignment/bed/$sample.fragments.bed | sort -k1,1V -k2,2n | uniq -c | awk -v OFS="\t" '{print $2, $3, $1}' | sort -k1,1V -k2,2n >$projPath/alignment/bed/binLen/$sample.fragmentsCount.bin$binLen.bed
done

5 Spike-in 校正

使用常量 C 来避免归一化数据中出现小分数,我们将标准化系数 scaling factor: S 定义为
S = C / (fragments mapped to E. coli genome) 这个常数是一个任意乘数,通常为 10,000。
归一化覆盖率的计算公式为:Normalized coverage = (primary_genome_coverage) * S

chromSize="/lustre/home/yfxie/GENOME/mouse/mm10.chrom.sizes.txt" # UCSC latest/下载

mkdir -p ${projPath}/alignment/bedgraph
mkdir -p $projPath/alignment/bigwig

cat $config1 | while read line
do
arr=($line)
sample=${arr[0]}

samtools sort -o $projPath/alignment/bam/$sample.sortedbw.rmDup.bam $projPath/alignment/bam/$sample.sorted.rmDup.bam
samtools index $projPath/alignment/bam/$sample.sortedbw.rmDup.bam

seqDepthDouble=`samtools view -F 0x04 $projPath/alignment/sam/$sample.spikein.sam | wc -l`
seqDepth=$((seqDepthDouble/2))
echo $seqDepth >$projPath/alignment/sam/bowtie2_summary/$sample.spikein.seqDepth

if [[ "$seqDepth" -gt "1" ]]; then
    scale_factor=`echo "10000 / $seqDepth" | bc -l`
    echo "Scaling factor for $sample is: $scale_factor!"
    bedtools genomecov -bg -scale $scale_factor -i $projPath/alignment/bed/$sample.fragments.bed -g $chromSize > $projPath/alignment/bedgraph/$sample.fragments.normalized.bedgraph 
    bamCoverage --scaleFactor $scale_factor -b $projPath/alignment/bam/$sample.sortedbw.rmDup.bam -o $projPath/alignment/bigwig/$sample.normalized.bw
fi
done

这里直接通过 spike-in 校正因子转换成 bw 文件(--bamCoverage)也 ok!
得到 bedgraph 文件(--genomecov)了,下回见!Peak calling。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容