用C编写的Python扩展名,用于快速访问Bimbed文件并访问和创建Bigwig文件。该扩展名使用libbigwig进行本地和远程文件访问。
您可以通过以下方式直接从GitHub安装此扩展程序
pip install pyBigWig
或与Conda
conda install pybigwig -c conda-forge -c bioconda
必须安装以下非透明要求:
curl-config
配置)需要这些标题和库。
基本用法如下:
>>> import pyBigWig
如果您的工作目录是Pybigwig源代码目录,则可以使用。
>>> bw = pyBigWig.open("test/test.bw")
请注意,如果文件不存在,您会看到错误消息,而None
返回。默认情况下,所有文件均打开用于阅读而不是写作。您可以通过传递包含w
的模式来更改此问题:
>>> bw = pyBigWig.open("test/output.bw", "w")
请注意,打开的供书写的文件无法查询其间隔或统计信息,只能写入。如果您打开一个用于编写的文件,则接下来需要添加标头(请参阅下面的部分)。
还支持本地和遥远的Bimbed读取访问:
>>> bb = pyBigWig.open("https://www.encodeproject.org/files/ENCFF001JBR/@@download/ENCFF001JBR.bigBed")
虽然您可以指定一个大型文件模式,但它被忽略了。 pyBigWig.open()
返回的对象是相同的,无论您是打开大wig还是大床文件。
由于可以打开Bigwig和Bimbed文件,因此可能有必要确定给定的bigWigFile
对象是否指向Bigwig或Bigbed File。为此,可以使用isBigWig()
和isBigBed()
函数:
>>> bw = pyBigWig.open("test/test.bw")
>>> bw.isBigWig()
True
>>> bw.isBigBed()
False
bigWigFile
对象包含一个载有染色体长度的字典,可以使用chroms()
登录器访问。
>>> bw.chroms()
dict_proxy({'1': 195471971L, '10': 130694993L})
您也可以直接查询特定的染色体。
>>> bw.chroms("1")
195471971L
长度存储为“长”整数类型,这就是为什么有L
后缀的原因。如果指定不存在的染色体,则什么都不会输出。
>>> bw.chroms("c")
>>>
有时可以打印大wig的标题很有用。这里以python字典形式介绍:版本(通常为4
),缩放级别的数量( nLevels
),所描述的碱数( nBasesCovered
),最小值( minVal
),最大值(maxval),最大值( maxVal
),所有值( sumData
)的总和和所有平方值的总和( sumSquared
)。其中的最后两个是确定平均值和标准偏差所需的。
>>> bw.header()
{'maxVal': 2L, 'sumData': 272L, 'minVal': 0L, 'version': 4L, 'sumSquared': 500L, 'nLevels': 1L, 'nBasesCovered': 154L}
请注意,大型文件也可以使用相同的字典键。然后,诸如maxVal
, sumData
, minVal
和sumSquared
之类的条目在很大程度上没有意义。
Bigwig文件用于存储与位置和范围关联的值。通常,我们希望快速访问一个范围内的平均值,这很简单:
>>> bw.stats("1", 0, 3)
[0.2000000054637591]
假设而不是平均值,我们希望最大值:
>>> bw.stats("1", 0, 3, type="max")
[0.30000001192092896]
其他选项是“最小值”(最小值),“覆盖范围”(覆盖的基数的比例)和“ std”(值的标准偏差)。
通常,我们想在给定间隔中计算某些均匀间隔箱的值,这也很简单:
>>> bw.stats("1",99, 200, type="max", nBins=2)
[1.399999976158142, 1.5]
nBins
默认为1,就像type
默认值为mean
一样。
如果省略了开始和终端位置,则使用整个染色体:
>>> bw.stats("1")
[1.3351851569281683]
向外行阅读器的注释:本节相当技术,仅出于完整性而包含。摘要是,如果您的需求需要确切的均值/最大/等。间隔或间隔的摘要值,并且可以接受小速度的较小权衡,您应该在
stats()
函数中使用exact=True
选项。
默认情况下,大翼件文件中范围的计算统计信息有一些不直觉的方面。 Bigwig格式最初是在基因组浏览器的背景下创建的。在那里,计算给定间隔的精确摘要统计信息不如快速计算近似统计数据(毕竟,浏览器需要能够快速显示许多连续的间隔并支持滚动/缩放)。因此,Bigwig文件不仅包含间隔值关联,还包含sum of values
/ sum of squared values
/ minimum value
/ maximum value
/ number of bases covered
量相同尺寸的各种尺寸的垃圾箱。这些不同的尺寸称为“变焦级别”。最小的缩放水平的垃圾箱是文件中平均间隔大小的16倍,并且每个随后的缩放水平的垃圾箱的垃圾箱比上一个大4倍。该方法在肯特的工具中使用,因此,几乎所有当前现有的Bigwig文件都可能使用。
当查询摘要统计数据时,将大wig文件的大小用于确定是否使用缩放级别,如果是,则使用缩放级别。最佳缩放水平是最大的垃圾箱不超过所需间隔宽度的一半。如果不存在这样的缩放水平,则将原始间隔用于计算。
为了与其他工具保持一致,Pybigwig采用了相同的方法。但是,由于这是(a)不直觉的,并且(b)在某些应用中不受欢迎,因此Pybigwig可以计算精确的摘要统计信息,而不管间隔大小如何(即,它允许忽略缩放级别)。这最初是在这里提出的,下面是一个例子:
>>> import pyBigWig
>>> from numpy import mean
>>> bw = pyBigWig.open("http://hgdownload.cse.ucsc.edu/goldenPath/hg19/encodeDCC/wgEncodeMapability/wgEncodeCrgMapabilityAlign75mer.bigWig")
>>> bw.stats('chr1', 89294, 91629)
[0.20120902053804418]
>>> mean(bw.values('chr1', 89294, 91629))
0.22213841940688142
>>> bw.stats('chr1', 89294, 91629, exact=True)
[0.22213841940688142]
虽然stats()
方法可用于检索每个基数的原始值(例如,通过将nBins
设置为碱数),但最好使用values()
访问者。
>>> bw.values("1", 0, 3)
[0.10000000149011612, 0.20000000298023224, 0.30000001192092896]
所产生的列表将始终包含指定范围内每个基数的一个值。如果特定基数在Bigwig文件中没有关联的值,则返回的值将为nan
。
>>> bw.values("1", 0, 4)
[0.10000000149011612, 0.20000000298023224, 0.30000001192092896, nan]
有时,检索与某些范围重叠的所有条目是方便的。这可以通过intervals()
函数来完成:
>>> bw.intervals("1", 0, 3)
((0, 1, 0.10000000149011612), (1, 2, 0.20000000298023224), (2, 3, 0.30000001192092896))
返回的是包含的元素列表:开始位置,终端位置和值。因此,上面的示例在位置0
和2
位置分别具有0.1
和0.3
0.2
值1
如果省略了开始和结束位置,则返回指定的染色体上的所有间隔:
>>> bw.intervals("1")
((0, 1, 0.10000000149011612), (1, 2, 0.20000000298023224), (2, 3, 0.30000001192092896), (100, 150, 1.399999976158142), (150, 151, 1.5))
与Bigwig文件相反,Bimbed文件包含条目,该条目是带有关联字符串的间隔。您可以使用entries()
函数访问这些条目:
>>> bb = pyBigWig.open("https://www.encodeproject.org/files/ENCFF001JBR/@@download/ENCFF001JBR.bigBed")
>>> bb.entries('chr1', 10000000, 10020000)
[(10009333, 10009640, '61035t130t-t0.026t0.42t404'), (10014007, 10014289, '61047t136t-t0.029t0.42t404'), (10014373, 10024307, '61048t630t-t5.420t0.00t2672399')]
输出是进入元组的列表。元组元素是每个条目的start
和end
位置,然后是其关联的string
。该字符串的返回与Bimbed文件中的保存完全一样,因此解析其留给您。要确定这些字符串中的各个字段,请咨询SQL字符串:
>>> bb.SQL()
table RnaElements
"BED6 + 3 scores for RNA Elements data"
(
string chrom; "Reference sequence chromosome or scaffold"
uint chromStart; "Start position in chromosome"
uint chromEnd; "End position in chromosome"
string name; "Name of item"
uint score; "Normalized score from 0-1000"
char[1] strand; "+ or - or . for unknown"
float level; "Expression level such as RPKM or FPKM. Set to -1 for no data."
float signif; "Statistical significance such as IDR. Set to -1 for no data."
uint score2; "Additional measurement/count e.g. number of reads. Set to 0 for no data."
)
请注意,SQL字符串中的前三个条目不是字符串的一部分。
如果您只需要知道条目的位置而不是其关联的值,则可以通过在entries()
中的withString=False
指定= false来保存内存():
>>> bb.entries('chr1', 10000000, 10020000, withString=False)
[(10009333, 10009640), (10014007, 10014289), (10014373, 10024307)]
如果您打开了一个用于写作的文件,则需要在添加任何条目之前将其提供给标题。标头按顺序包含所有染色体及其大小。如果您的基因组有两个长度为1和150万个碱的染色体ChR1和Chr2,则以下将添加适当的标头:
>>> bw.addHeader([("chr1", 1000000), ("chr2", 1500000)])
Bigwig标头对病例敏感,因此chr1
和Chr1
不同。同样, 1
和chr1
也不相同,因此您不能混合Ensembl和UCSC染色体名称。添加标头后,您可以添加条目。
默认情况下,为Bigwig文件构建了高达10个“缩放级别”。您可以使用maxZooms
可选参数更改此默认号码。这样的常见用途是创建一个仅容纳间隔而没有Zoom级别的大wig文件:
>>> bw.addHeader([("chr1", 1000000), ("chr2", 1500000)], maxZooms=0)
如果设置maxTooms=0
,请注意,IGV和许多其他工具将无法使用,因为他们认为至少会有一个变焦级别。建议您使用默认设置,除非您不要指望其他软件包使用大翼件文件。
假设您已经打开了一个用于编写的文件并添加了标头,则可以添加条目。请注意,必须按顺序添加条目,因为Bigwig文件始终包含有序间隔。 Bigwig文件可以内部使用三种格式来存储条目。最常观察到的格式与床上图文件相同:
chr1 0 100 0.0
chr1 100 120 1.0
chr1 125 126 200.0
这些条目将添加如下:
>>> bw.addEntries(["chr1", "chr1", "chr1"], [0, 100, 125], ends=[5, 120, 126], values=[0.0, 1.0, 200.0])
每个条目在压缩前占据12个字节。
第二种格式使用固定的跨度,但条目之间使用了变量步长。这些可以在Wiggle文件中表示为:
variableStep chrom=chr1 span=20
500 -2.0
600 150.0
635 25.0
上面的条目描述了(基于1)位置501-520、601-620和636-655。这些将添加如下:
>>> bw.addEntries("chr1", [500, 600, 635], values=[-2.0, 150.0, 25.0], span=20)
这种类型的每个条目在压缩前占据8个字节。
最终格式对每个条目使用固定步骤和跨度,对应于FixeStep Wiggle格式:
fixedStep chrom=chr1 step=30 span=20
-5.0
-20.0
25.0
上面的条目描述了(基于1)基础901-920、931-950和961-980,将添加如下:
>>> bw.addEntries("chr1", 900, values=[-5.0, -20.0, 25.0], span=20, step=30)
这种类型的每个条目均占4个字节。
请注意,Pybigwig将试图防止您以不正确的顺序添加条目。但是,这需要额外的头。如果这是不可接受的,则可以在添加条目时简单地指定validate=False
:
>>> bw.addEntries(["chr1", "chr1", "chr1"], [100, 0, 125], ends=[120, 5, 126], values=[0.0, 1.0, 200.0], validate=False)
显然,您显然有责任确保您不会添加订单中的条目。否则,最终的文件将不可用。
可以使用简单的bw.close()
关闭文件,就像其他文件类型所做的那样。对于打开供书写的文件,关闭文件将写入磁盘的任何缓冲条目,构造和写入文件索引,并构建缩放级别。因此,这可能需要一些时间。
从0.3.0版本开始,如果在安装pybigwig之前安装了numpy,则PYBIGWIG在某些功能中使用Numpy整数和向量支持坐标的输入。通过检查numpy
访问者,确定是否安装了pybigwig并支持Numpy支持:
>>> import pyBigWig
>>> pyBigWig.numpy
1
如果pyBigWig.numpy
是1
,则pybigwig被编译为Numpy支持。这意味着addEntries()
可以接受Numpy坐标:
>>> import pyBigWig
>>> import numpy
>>> bw = pyBigWig.open("/tmp/delete.bw", "w")
>>> bw.addHeader([("1", 1000)], maxZooms=0)
>>> chroms = np.array(["1"] * 10)
>>> starts = np.array([0, 10, 20, 30, 40, 50, 60, 70, 80, 90], dtype=np.int64)
>>> ends = np.array([5, 15, 25, 35, 45, 55, 65, 75, 85, 95], dtype=np.int64)
>>> values0 = np.array(np.random.random_sample(10), dtype=np.float64)
>>> bw.addEntries(chroms, starts, ends=ends, values=values0)
>>> bw.close()
另外, values()
可以直接输出numpy向量:
>>> bw = bw.open("/tmp/delete.bw")
>>> bw.values('1', 0, 10, numpy=True)
[ 0.74336642 0.74336642 0.74336642 0.74336642 0.74336642 nan
nan nan nan nan]
>>> type(bw.values('1', 0, 10, numpy=True))
<type 'numpy.ndarray'>
如果您没有安装卷发,则将安装Pybigwig,而无需访问远程文件。您可以确定是否能够使用pyBigWig.remote
访问远程文件。如果返回1,则可以访问远程文件。如果返回0,则不能。
从0.3.5版本开始,Pybigwig能够读取和编写缺少条目的Bigwig文件。请注意,此类文件通常与其他程序不兼容,因为对没有条目的大wig文件没有定义。对于这样的文件, intervals()
访问者将None
返回, stats()
函数将返回None
长度的列表,并且values()
将返回[]
(一个空列表)。这通常应该允许使用Pybigwig的程序继续前进。
对于那些希望在这方面模仿Pybigwig/libbigwig的功能的人,请注意,它查看所涵盖的基础数(如文件标头中报道)以检查“空”文件。
Wiggle,Bigwig和Bimbed Files使用0个基于半开的坐标,此扩展也可以使用。因此,要访问chr1
上的第一碱基的值,将开始位置指定为0
,最终位置为1
。同样,基地100至115的开始为99
,结束115
。这仅仅是为了与基础大翼型文件的一致性,将来可能会发生变化。
Pybigwig也可以作为银河系包装。您可以在工具设置中找到它,并且IUC当前在GitHub上托管了此的XML定义。