当前位置 : 主页 > 编程语言 > java >

pybedtools:对bedtools的封装和扩展

来源:互联网 收集:自由互联 发布时间:2022-06-23
bedtools是区间操作最常用的软件,pybedtools对其进行了封装,可以在python编程环境中灵活使用bedtools,而且进一步拓展出了很多有用的功能。 在pybedtools中,核心是以下两个对象 1. BedTool 2


bedtools是区间操作最常用的软件,pybedtools对其进行了封装,可以在python编程环境中灵活使用bedtools,而且进一步拓展出了很多有用的功能。

在pybedtools中, 核心是以下两个对象

1. BedTool

2. feature

BedTools表示一个区间文件,支持BED, GTF, GFF, BAM等多种格式以及对应的压缩文件,feature表示文件的每一行,包含了染色体,起始,终止位置等相关属性和信息。

1. BedTool

构建BedTool对象的代码如下

>>> import pybedtools
>>> a = pybedtools.BedTool('a.bed')

bedtools这个软件相关的子命令,都在pybedtools中进行了实现,以取交集为例,对应的用法如下

>>> a = pybedtools.BedTool('a.bed')
>>> b = pybedtools.BedTool('b.bed')
>>> a.head()
chr1 1 100 feature1 0 +
chr1 100 200 feature2 0 +
chr1 150 500 feature3 0 -
chr1 900 950 feature4 0 +
>>> b.head()
chr1 155 200 feature5 0 -
chr1 800 901 feature6 0 +
>>> a_and_b = a.intersect(b)
>>> a_and_b.head()
chr1 155 200 feature2 0 +
chr1 155 200 feature3 0 -
chr1 900 901 feature4 0 +

取交集对应的函数为intersect, 对于bedtools子命令的相关选项,则以函数参数的形式封装在对应的函数中。

进行运算之后,结果可以通过如下两种方式来保存

>>> a_and_b.saveas('intersect.bed', trackline='track name')
>>> a_and_b.moveto('intersect.bed')

saveas操作支持添加trackline, 在基因组浏览器中展示,而moveto方法只是简单的保存结果。本质上,pybedtools的运算结果,都以临时文件的形式存在,saveas相当于拷贝临时文件,生成新文件,moveto相当于重命名临时文件,速度更快。

在pybedtools中,大部分函数的返回结果都是BedTools对象,因此可以接受连缀写法,示例如下

>>> a.intersect(b, u=True).saveas('a-with-b.bed').merge().saveas('a-with-b-merged.bed')

与此同时,考虑到区间操作的特性,还进行了运算符重载,比如+号表示并集,-号表示差集,示例如下

>>> x1 = a.intersect(b, u=True).merge()
>>> x2 = (a + b).merge()
>>> x1 == x2
True

2. feature

feature对象是文件中的一行,可以通过下标来访问,示例如下

>>> a[0]
Interval(chr1:1-100)
>>> feature = a[0]
>>> print(feature)
chr1 1 100 feature1 0 +

对于feature中的每一列信息,可以通过数字下标,属性值,key这3种方式来访问,示例如下

>>> feature[0]
'chr1'
>>> feature[1]
'1'
>>> feature.start
1
>>> feature.stop
100
>>> feature['name']
'feature1
>>> feature['chrom']
chr1

feature还拥有fields属性,以列表的形式存储了对应的值,可以用于遍历操作,示例如下

>>> feature.fields
[u'chr1', u'1', u'100', u'feature1', u'0', u'+']

对于feature而言,pybedtools提供了each和filter操作,进一步扩展其功能。filter操作则用于过滤行操作,过滤掉长度小于100feature的代码,示例如下

>>> a.filter(lambda x:len(x)> 100)

each操作对每一行进行遍历,主要用于统计一些新的指标;统计每个区间长度的代码,示例如下

>>> a_and_b = a.intersect(b)
>>> print(a_and_b)
chr1 155 200 feature2 0 +
chr1 155 200 feature3 0 -
chr1 900 901 feature4 0 +

>>> def cal_len(feature):
... feature.score = len(feature)
... return feature
...
>>> print(a_and_b.each(cal_len))
chr1 155 200 feature2 45 +
chr1 155 200 feature3 45 -
chr1 900 901 feature4 1 +

以上只是pybedtools的基本用法,更多的用法可以查看官方的API文档。

·end·

pybedtools:对bedtools的封装和扩展_数据分析

一个只分享干货的

生信公众号




上一篇:conda之packages管理
下一篇:没有了
网友评论