用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定義。