實(shí)用生信小技巧:利用pysam高效處理bam文件

由于bam文件是二進(jìn)制的壓縮文件皆看,正常情況下我們無法用普通編輯器打開查看仓坞,一般情況下我們借助samtools軟件來對文件進(jìn)行處理。但很多小伙伴一定遇到過這樣的問題:如果我想對bam文件進(jìn)行個性化的處理腰吟,需要怎么做呢无埃?常規(guī)的做法是利用samtools將bam文件先轉(zhuǎn)化成可讀寫的sam文件,再進(jìn)行后續(xù)的處理蝎困。這樣做一方面犧牲了大量的時間和存儲,另一方面在編程時需要調(diào)用shell命令十分繁瑣倍啥,今天介紹的pysam可以說是一條龍服務(wù)完美解決問題禾乘。

01 安裝pysam

pysam是python的一個庫,安裝好python以后可以利用python自帶的pip安裝pysam虽缕。在后續(xù)使用中請注意始藕,samtools軟件的坐標(biāo)是1-base,而pysam對于基因組坐標(biāo)的處理是0-base:

pip install pysam

02 讀入bam文件

pysam可讀入的文件格式有bam氮趋、sam伍派、cram,以test前綴的文件作為示例剩胁,讀入方法如下诉植,讀入后生成對象bf,后續(xù)對文件的操作都基于對bf的訪問:

import pysam

bf = pysam.AlignmentFile("test.bam", "rb") #對bam文件的讀入

bf = pysam.AlignmentFile("test.sam", "r") #對sam文件的讀入

bf = pysam.AlignmentFile("test.cram", "rc") #對cram文件的讀入

03

檢查bam文件是否存在index:

bf.check_index()  #返回True則存在索引昵观,返回False則索引不存在

04

pysam封裝了samtools晾腔,因此可以避開命令行調(diào)用直接對bam文件進(jìn)行sort:

pysam.sort("-o", "output.bam", "test.bam")

05

想要提取bam文件的頭文件,可以這樣操作:

head=bf.header  #返回一個迭代器啊犬,可以利用循環(huán)來訪問

06

想要提取bam文件的前10行比對結(jié)果灼擂,可以這樣操作:

out=bf.head(10)  #該命令會以迭代器的形式返回bam文件的前10行

07

如果想提取基因組某個區(qū)域的比對結(jié)果,比如現(xiàn)在我想提取bam文件中比對到血紅蛋白基因上的結(jié)果觉至,可以這樣操作:

hemoglobin_region=bf.fetch(contig="chr11",start=5246694,stop=5250625)  #結(jié)果同樣是以迭代器的形式返回

08

想要計(jì)算落在某個區(qū)間的reads數(shù)目剔应,可以這樣操作:

readsNumber=bf.count(contig="chr1",start=1,stop=1000000) #返回reads數(shù)目值

09

想要計(jì)算某個區(qū)間的每個堿基上的覆蓋深度,可以這樣操作:

baseCov=bf.count_coverage(contig="chr1",start=1,stop=1000000) #返回一個數(shù)組,數(shù)組的長度和區(qū)間長度一致峻贮,表示每個堿基的覆蓋深度

10

對參考基因組的信息進(jìn)行統(tǒng)計(jì)席怪,可以這樣操作:

bf.get_index_statistics() #返回一個元組,每個元素記錄一條染色體比對上的reads數(shù)目和未比對上的reads數(shù)目

bf.lengths      #返回一個元組月洛,每個元素記錄一條染色體長度

bf.references     #以元組的形式返回參考基因組每條染色體的名稱

bf.nreferences    #返回參考基因組的染色體條數(shù)

11

對比對信息進(jìn)行統(tǒng)計(jì)何恶,可以這樣操作:

bf.mapped      #返回比對上的reads數(shù)目
bf.unmapped     #返回未比對上的reads數(shù)目

12

對于bf對象可以利用for循環(huán)進(jìn)行訪問,每個循環(huán)是一個read嚼黔,對于read的各種處理操作匯總?cè)缦拢?/p>

for read1 in bf:
    read2=bf.mate(read1) #獲取與read1配對的read2的比對信息
    read1.cigarstring  #字符串形式返回read1的cigar值
    read1.is_duplicate #返回布爾型變量细层,判斷read1是否為PCR重復(fù)
    read1.is_paired  #返回布爾型變量,判斷read1是否為成對reads
    read1.is_read1  #返回布爾型變量唬涧,判斷read1是否為左端reads
    read1.is_read2  #返回布爾型變量疫赎,判斷read1是否為右端reads
    read1.is_reverse  #返回布爾型變量,判斷read1是否為反向比對
    read1.is_secondary #返回布爾型變量碎节,判斷read1是否為次級比對
    read1.is_unmapped  #返回布爾型變量捧搞,判斷read1是否比對上參考基因組
    read1.is_qcfail  #返回布爾型變量,判斷read1是否qc質(zhì)控失敗
    read1.mapping_quality #返回?cái)?shù)值型變量狮荔,代表read1的比對質(zhì)量
    read1.mate_is_reverse #返回布爾型變量胎撇,判斷read1的配對read2是否為反向比對
    read1.get_blocks() #返回?cái)?shù)值型元組,表示read1在參考基因組比對的起始坐標(biāo)和終止坐標(biāo)
    read1.get_overlap(5246694,5250625)  #返回?cái)?shù)值殖氏,表示read1在基因組上的坐標(biāo)和輸入?yún)?shù)坐標(biāo)的重疊區(qū)間長度
    read1.get_reference_sequence() #字符串形式返回read1所在參考基因組位置的參考序列

小結(jié):

pysam庫的使用可以大大減少在腳本中對bash命令行的調(diào)用晚树,一方面美化代碼便于后期維護(hù)更新,另一方面可以個性化調(diào)取reads信息雅采。本篇代碼涵蓋了pysam的常用方法爵憎,其他參數(shù)詳解可見官網(wǎng)https://pysam.readthedocs.io/en/latest/usage.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婚瓜,一起剝皮案震驚了整個濱河市宝鼓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巴刻,老刑警劉巖愚铡,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胡陪,居然都是意外死亡茂附,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門督弓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來营曼,“玉大人,你說我怎么就攤上這事愚隧〉仝澹” “怎么了锻全?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長录煤。 經(jīng)常有香客問我鳄厌,道長,這世上最難降的妖魔是什么妈踊? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任了嚎,我火速辦了婚禮,結(jié)果婚禮上廊营,老公的妹妹穿的比我還像新娘歪泳。我一直安慰自己,他們只是感情好露筒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布呐伞。 她就那樣靜靜地躺著,像睡著了一般慎式。 火紅的嫁衣襯著肌膚如雪伶氢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天瘪吏,我揣著相機(jī)與錄音癣防,去河邊找鬼。 笑死掌眠,一個胖子當(dāng)著我的面吹牛蕾盯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扇救,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼刑枝,長吁一口氣:“原來是場噩夢啊……” “哼香嗓!你這毒婦竟也來了迅腔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤靠娱,失蹤者是張志新(化名)和其女友劉穎沧烈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體像云,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锌雀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迅诬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腋逆。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖侈贷,靈堂內(nèi)的尸體忽然破棺而出惩歉,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布撑蚌,位于F島的核電站上遥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏争涌。R本人自食惡果不足惜粉楚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亮垫。 院中可真熱鬧模软,春花似錦、人聲如沸包警。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽害晦。三九已至特铝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壹瘟,已是汗流浹背鲫剿。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稻轨,地道東北人灵莲。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像殴俱,于是被迫代替她去往敵國和親政冻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容