天天看點

初嘗BioPython小記

NCBI官網:https://www.ncbi.nlm.nih.gov/

BioPython官方文檔:https://biopython-cn.readthedocs.io/zh_CN/latest/

bioPython是生物資訊領域用于基因序列比對的一個工具,在搭建本地化blast的時候很實用。

以下筆記内容是在開發過程中參考官方文檔 第七章:BLAST 後的相關問題及解決記錄。

首先,使用NCBIApplications編寫blast指令行

blastx_cline = NcbiblastnCommandline(cmd='blastn',query='file.txt',db='nt',evalue=0.01,outfmt=5,out='output.xml')
blastx_cline.set_parameter("task",'megablast')
blastx_cline.set_parameter("num_threads",100)
blastx_cline.set_parameter("num_alignments",100)
           

其中有個小問題,

-task

參數我一直加不進去,這個參數用于不同的查詢方式,即

-task megablast/dc-megablast/blastn

,運作後根據報錯資訊,我進了源碼檢視,結果發現它與衆不同……相關的set方法沒找到正确的将其置空的位置,于是我心一橫,直接改源碼(。

改完後正常了,由于目前應用有限,暫時沒有bug,這個等待後續更新了。

blast跑一次大概20s,我掐着計時器算的,同一個序列檔案不論是

megablast

還是

dc-megablast

或者是

blastn

都是差不多時間,這塊大概也需要後續更多的測試。

在跑完blast資料後,下一步就是解析了。從生成的xml檔案提取資料,其實一開始沒啥頭緒,看着那HTML标簽我甚至以為要搞爬蟲。。不過并不用,事實上,bioPython已經提供了相應的解析工具,而這裡我用到了兩個:

SearchIO

NCBIXML

results_io = SearchIO.parse('output.xml',"blast-xml")
for result in results_io:
    seq_map_id = "".join([result.id ,";"])
    for hsp in result.hits:
        hsp_id = hsp.id
        hsp_description = hsp.description
           

之是以使用兩個解析器,是因為

NCBIXML

解析出來的

list

并沒有按照

query id

羅列。在使用

blast

比對序列的時候使用的

fastq

檔案内其實很經常會有多個序列,如果沒有

query id

幫忙區分,會造成很大的困擾。相當于一排沒有标簽的書架,我知道我要的書就在裡面,但我沒有指引,隻能一排排書架去找,這很浪費時間。是以我先用

SearchIO

取出

query id

description

。其實可以的話,我應該也能夠在

SearchIO

裡找到我需要的屬性元素,然鵝大腦當機沒看源碼。。也沒找到詳細的UML圖給我取用他的元素。這個後面再研究下。

然後再用NCBIXML解析,前面說到的UML圖,其實BioPython官方文檔裡的也有點小坑,不過不妨礙事,源碼一看即得x(是以說上面的

SearchIO

也完全可以看源碼取屬性的。。大意了。。

result_handle = open('output.xml')
blast_records = NCBIXML.parse(result_handle)
for blast_record in blast_records:
    for alignment in blast_record.alignments:
        title = alignment.title.split(" ")[0]
        length = alignment.length
        accession = alignment.accession
        hit_def = alignment.hit_def
        hit_id = alignment.hit_id
        for hsp in alignment.hsps:
            bits = str('%.1f' % hsp.bits)
            score = str('%.1f' % hsp.score)
            identities = hsp.identities
            positives = str(hsp.positives)
            gaps = str(hsp.gaps)
            strand = str(hsp.strand)
            frame = str(hsp.frame)
            query = str(hsp.query)
            query_start = str(hsp.query_start)
            query_end = str(hsp.query_end)
            match = hsp.match
            sbjct = str(hsp.sbjct)
            sbjct_start = str(hsp.sbjct_start)
            sbjct_end = str(hsp.sbjct_end)
            num_alignment = str(hsp.num_alignments)
            align_len = hsp.align_length
            # 這個percentage對應NCBI上的identities百分比
            percentage = '%.2f' % (float(identities)/align_len*100)