[Linux]bedtools学习
The BED format is a concise and flexible way to represent genomic features and annotations. bedtools是处理相关格式文件很方便的toolkits。简单学习下最常用的几个功能。
参考链接:https://bedtools.readthedocs.io/en/latest/index.html
http://quinlanlab.org/tutorials/bedtools/bedtools.html
关于生信分析常用的文件格式,UCSC网站整理的很全,详见http://genome.ucsc.edu/FAQ/FAQformat#format1,也算是一个意外收获。
1、About BED format
- BED (Browser Extensible Data) format provides a flexible way to define the data lines that are displayed in an annotation track.
-
简单来说,完整情况下,它是由12列数据组成。
其中前3列数据是必须要有的required,后面9列为可选列optional。对于bedtools,大部分功能也仅需要前3列即可。
bed format
如上图
- 第一列为track所在的染色体chromosome;
- 第二列为 track starting position,注意是0-based,即染色体第一个碱基为0,第二个碱基为1;
- 第三列为 track ending posion,与第二列不同,其为1-based计数,即染色体第一个碱基为1。
因为第二、三列不同的计数方法,所以计算track width时直接第三列减第二列即可。 - 第四列为track name名字;
- 第五列为score;在UCSC的定义里为0-1000的BED score;在bedtools里更加灵活,可以储存为任何字符string。
- 第六列一般描述正负链信息strand
其余六列不做介绍了,具体可参考开头的链接。
2、bedtools下载(linux)
#在自己合适的文件夹路径里下载安装
mkdir bedtools
ls
cd bedtools/
ls
wget https://github.com/arq5x/bedtools2/releases/download/v2.29.1/bedtools-2.29.1.tar.gz
ls
tar -zxvf bedtools-2.29.1.tar.gz
cd bedtools2
pwd
make
自己尝试发现,make编译完成后会将bedtools的bins命令自动添加到环境变量里,即在linux的任何路径下都可以使用bedtools的相关命令了。
3、bedtools常用工具
3.0 下载示例文件
mkdir bedtools-test
cd bedtools-test
curl -O https://s3.amazonaws.com/bedtools-tutorials/web/cpg.bed
curl -O https://s3.amazonaws.com/bedtools-tutorials/web/exons.bed
curl -O https://s3.amazonaws.com/bedtools-tutorials/web/gwas.bed
curl -O https://s3.amazonaws.com/bedtools-tutorials/web/genome.txt
curl -O https://s3.amazonaws.com/bedtools-tutorials/web/hesc.chromHmm.bed
ls -lh
head exons.bed
3.1 intersect
常见的就是比较两个bed文件的track记录是否有重叠,返回的结果根据不同的参数有不同的形式。要注意的两点是顺序性(a比b);局部/整体
intersect
(1)默认设置
只返回A track里的,与B track有重叠的区域。
bedtools intersect -a cpg.bed -b exons.bed | head -5
head cpg.bed
3.1-1
(2) -wa; -wb
上述只返回重叠区域,设置-wa; -wb可分别设置返回有重叠的、原始的A、B的track记录
bedtools intersect -a cpg.bed -b exons.bed -wa | head -5
head -5 cpg.bed
3.1-2
bedtools intersect -a cpg.bed -b exons.bed -wa -wb| head -5
- -wo参数是在设置 -wa -wb的基础上再统计重复的序列长度。即分别返回有重复的、原始的A track与B track,以及重复的长度。
bedtools intersect -a cpg.bed -b exons.bed -wo | head -5
3.1-3
(3) -f 设定重叠标准
- 上述情况默认只有两条track存在至少一个碱基以上的重复就认为是存在intersect。也可以设置进一步、严格的筛选标准
-f num :设置重复长度占原始A track长度的多少才算是intersect
#设定标准为50%
bedtools intersect -a cpg.bed -b exons.bed -wo -f 0.50 | head
(4) -c 统计重叠数目
a文件的某条track可能与b文件的多条track存在重叠可能,-c参数可以统计计算
bedtools intersect -a cpg.bed -b exons.bed -c | head
bedtools intersect -a cpg.bed -b exons.bed -wa -c -f 1| head
awk '$1 == "chr1" && $2 <=788863 && $3 >=789211 {print}' exons.bed
(5) -v 反选未发生重叠事件的A track
bedtools intersect -a cpg.bed -b exons.bed -v | head
(6) -sorted 排序后更高效
- 当提供的a、b文件是排序好的话,那么intersect功能的处理效率会提升很多,尤其对于大文件来说。
- 这里的排序sorted.bed是指先按第一列染色体顺序从小到大排,再按第二列track的位点排序。简单的实现方式就是直接加加
-sorted
参数
#观察下述两种执行所消耗的时间
time bedtools intersect -a gwas.bed -b hesc.chromHmm.bed > /dev/null
time bedtools intersect -a gwas.bed -b hesc.chromHmm.bed -sorted > /dev/null
#当然也可以对input文件进行预先的sort处理
sort -k1,1 -k2,2n foo.bed > foo.sort.bed
(7) -b 一比多的情况
观察一个A bed文件与多个B bed文件的重叠情况,返回的一个结果里
bedtools intersect -a exons.bed -b cpg.bed gwas.bed hesc.chromHmm.bed -sorted | head
#第6列表示a track与哪一个 b track的重叠情况
bedtools intersect -a exons.bed -b cpg.bed gwas.bed hesc.chromHmm.bed -sorted -wa -wb \
| head -10000 \
| tail -10
#把第六列的序号ID换成文件名,更容易观察
bedtools intersect -a exons.bed -b cpg.bed gwas.bed hesc.chromHmm.bed -sorted -wa -wb -names cpg gwas chromhmm \
| head -10000 \
| tail -10
3.2 merge
- merge与intersect最明显的不同是merge只需要一个input bed文件
- merge主要实现的是track的拼接,一般指的是有重叠的。可以理解为把存在交集的多个序列合并为一个最长的全集序列。
- 结合其功能,merge的input文件必须要是排序好的
sort -k1,1 -k2,2n foo.bed > foo.sort.bed
merge
(1)基础用法 -i 指明input
head -10 exons.bed
bedtools merge -i exons.bed | head
3.2-1
(2) -c -o参数统计merge数
-
-c 1 -o count
返回结果(第四列)表示track是由多少条原始track合并而成的
bedtools merge -i exons.bed -c 1 -o count | head -6
3.2-2
-
-c 1,4 -o count,collapse
则返回到具体的名字(第四列)
bedtools merge -i exons.bed -d 90 -c 1,4 -o count,collapse | head -6
3.2-3
(3) -d 放宽合并标准
- merge合并默认的条件是track间有重叠;
- 可以通过设置 -d num,指定相隔距离少于num的track也可以合并
bedtools merge -i exons.bed -d 1000 -c 1 -o count | head -20
bedtools merge -i exons.bed -c 1 -o count | head -20
3.2-4
3.3 complement
- 如下图,可以简单理解为,某个bed文件相对于基因组的补集区域;
-
不仅需要提供bed文件,还需要提供基因组染色体长度信息,可以脑补下为什么。
complement
head genome.txt
bedtools complement -i exons.bed -g genome.txt > non-exonic.bed
head exons.bed
head non-exonic.bed
3.4 genomecov
- 统计bed文件对于基因组的覆盖情况
- 例如没有比对track到基因组的碱基有哪些;深度为1的有哪些...以此类推
-
第四列为比例信息;此外也需要提供染色体长度信息
genomecov
bedtools genomecov -i exons.bed -g genome.txt
#以染色体为单位计算的
- 加上
-bg
参数,返回的称之为BEDGRAPH 文件格式,即本质还是bed;第四列为测序深度
bedtools genomecov -i exons.bed -g genome.txt -bg | head -10
3.4
bedtools还有很多其它工具,就不一一整理了。在此次的学习基础上,遇到再看官网的介绍文档吧。