Biopython学习步步高生信

Biopython学习笔记(三)Blast

2020-04-05  本文已影响0人  生信start_site

使用BLAST通常可以分成2个步。这两步都可以用上Biopython。第一步,提交你的查询 序列,运行BLAST,并得到输出数据。第二步,用Python解析BLAST的输出,并作进一步 分析。

通过Internet运行BLAST

使用 Bio.Blast.NCBIWWW 模块的里qblast() 来调用在线版本的BLAST。有三个参数:
(1)用来搜索blast程序。目前只支持:blastn, blastp, blastx, tblast 和 tblastx.(用过NCBI里blast的同学一定不会对这些程序陌生的)
(2)指定要搜索的数据库
(3)你要查询序列的字符串。这个字符串可以是序列的本身 ,后者fasta格式的的文件,或者是一个类似GI的id。

qblast 函数可以返回多种格式的BLAST结果。你可以用format_type 来指定 "HTML", "Text", "ASN.1", 或者"XML"格式。默认是"XML"。

举个例子,如果你有一个fasta文件(你可以随便下载一个你感兴趣的基因序列,关于如何得到基因的fasta文件请参照:https://zhuanlan.zhihu.com/p/31618808),你想用BLASTN数据库进行比对,你可以这样:

>>> from Bio.Blast import NCBIWWW
>>> from Bio import SeqIO
#这里我下载的是人类的snai1基因序列
>>> record = SeqIO.read("human_snai1.fasta", format="fasta")
>>> result_handle = NCBIWWW.qblast("blastn", "nt", record.seq)

上面最重要的代码就是最后一行的比对代码。括号里是前面提到的最重要的三个参数,你也可以加其他的过滤条件。都有哪些可以加的过滤条件,可以通过看帮助文档:

>>> from Bio.Blast import NCBIWWW
>>> help(NCBIWWW.qblast)

另外,括号里中间的搜索数据库,也是非常重要的。而有哪些数据库可以给你搜索,可以看一下NCBI里的blast,我截了张图:

上面我用的数据库就是stardard database(nr)里的,其中nr里有14个小的分类,可以用上图下拉菜单里寻找。旁边的问号可以告诉你选择的数据库都是什么。选好了数据库,就可以替换上面的代码里的第二个参数了。

上面的方法只提供序列,意味着BLAST会自动分配给你一个ID。或者你还可以用 SeqRecord 对象的format方法来包装一个fasta字符串,这个对象会包含fasta文件中已有的ID:

>>> from Bio.Blast import NCBIWWW
>>> from Bio import SeqIO
>>> record = SeqIO.read("human_snai1.fasta", format="fasta")
>>> result_handle = NCBIWWW.qblast("blastn", "nt", record.format("fasta"))

然后电脑会运行一小会儿,比如我这个破电脑就差不多得两三分钟的样子。运行后它不会弹出来任何结果,这个运行的结果是需要你手动保存的:

>>> with open("my_blast.xml", "w") as out_handle:
...     out_handle.write(result_handle.read())
... 
4184652
>>> result_handle.close()
>>> result_handle = open("my_blast.xml")
#这些做好后,结果已经存储在 `my_blast.xml` 文件中,并且原先的handle中的数据 已经被全部提取出来了(所以我们把它关闭了)。但是,BLAST解析器的 `parse` 函数 采用一个文件句柄类的对象,所以我们只需打开已经保存的文件作为输入。

在本地运行

在本地运行BLAST有2个主要优点:
(1)本地运行BLAST可能比通过internet运行更快;
(2)本地运行可以让你用自己的数据库来对序列进行blast。
但是本地运行也有些缺点 :
(1)本地运行BLAST需要你安装相关命令行工具。
(2)本地运行BLAST需要安装一个很大的BLAST的数据库(并且需要保持数据更新)。
这里我就不展开了,对于我来说还不太需要。有兴趣的朋友可以具体看一下这一部分。

怎么看BLAST结果的输出

刚才在上面做了一个blast试了试,结果输出一个xml文件,打开以后是这样的,还没仔细看我就已经晕菜了:

需要注意的是:上面你保存完你的xml文件,一定要有最后一行的代码,才可以分析你的blast结果:

>>> result_handle = open("my_blast.xml")

如果你的比对只有一个,用下面的代码进行解析:

>>> from Bio.Blast import NCBIXML
>>> blast_record = NCBIXML.read(result_handle)

如果你的比对多个,则用:

>>> from Bio.Blast import NCBIXML
>>> blast_records = NCBIXML.parse(result_handle)

但是当你的比对成百上千条的时候怎么办呢?用循环吧:

>>> for blast_record in blast_records:
... # Do something with blast_record

因为我只比对了一条序列,所以我用的上面第一种方法进行解析。
那么解析以后怎么能看到数据库里哪些序列和我的序列比对上了呢?看下面:

BLAST 记录类

教材里给的代码是:

>>> E_VALUE_THRESH = 0.04
>>> for alignment in blast_record.alignments:
...    for hsp in alignment.hsps:
...       if hsp.expect < E_VALUE_THRESH:
...         print("****Alignment****")
...         print("sequence:", alignment.title)
...         print("length:", alignment.length)
...         print("e value:", hsp.expect)
...         print(hsp.query[0:75] + "...")
...         print(hsp.match[0:75] + "...")
...         print(hsp.sbjct[0:75] + "...")

但是我用了这个代码运行后,顿时后悔了。弹出了不知道多少条的比对结果。因为这个比对不仅仅是把高匹配的序列列出来,就连不怎么相似的序列也列出来了。而且,是所有物种里和你的序列相似的基因!自己可以感受一下,我就不贴运行之后的结果图了。

那么你也许会说,怎么看那些匹配度特别高的呢?你可以通过改变 E_VALUE_THRESH这个值来筛选。一般如果匹配度很高,基本上这个值会是:××e-**这种形式的。也就是说0.000000几(省略好多个0)。比如我第二次尝试,试了9e-100。这次终于可以看到最前面几条的记录了:

****Alignment****
sequence: gi|1548994295|gb|CP034499.1| Eukaryotic synthetic construct chromosome 20 >gi|1549098600|gb|CP034524.1| Eukaryotic synthetic construct chromosome 20
length: 68480253
e value: 0.0
ATTGCGCCGCGGCACGGCCTAGCGAGTGGTTCTTCTGCGCTACTGCTGCGCGAATCGGCGACCCCAGTGCCTCGA...
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||...
ATTGCGCCGCGGCACGGCCTAGCGAGTGGTTCTTCTGCGCTACTGCTGCGCGAATCGGCGACCCCAGTGCCTCGA...
****Alignment****
sequence: gi|9650757|emb|AL121712.27| Human DNA sequence from clone RP4-710H13 on chromosome 20, complete sequence
length: 79779
e value: 0.0
ATTGCGCCGCGGCACGGCCTAGCGAGTGGTTCTTCTGCGCTACTGCTGCGCGAATCGGCGACCCCAGTGCCTCGA...
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||...
ATTGCGCCGCGGCACGGCCTAGCGAGTGGTTCTTCTGCGCTACTGCTGCGCGAATCGGCGACCCCAGTGCCTCGA...
****Alignment****
sequence: gi|5821735|gb|AF155233.1|AF155233 Homo sapiens snail zinc finger protein (SNAI1) gene, complete cds
length: 6258
e value: 0.0
ATTGCGCCGCGGCACGGCCTAGCGAGTGGTTCTTCTGCGCTACTGCTGCGCGAATCGGCGACCCCAGTGCCTCGA...
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||...
ATTGCGCCGCGGCACGGCCTAGCGAGTGGTTCTTCTGCGCTACTGCTGCGCGAATCGGCGACCCCAGTGCCTCGA...
****Alignment****
sequence: gi|5725247|emb|AJ245659.1| Homo sapiens partial SNAI1 gene, exon 3
length: 1060
e value: 0.0
CCAGCCGTTGTCCCACGGCTCACTCGGCCTTTCTGGCGTTCTCTCCCCAGGCGAGAAGCCCTTCTCCTGTCCCCA...
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||...
CCAGCCGTTGTCCCACGGCTCACTCGGCCTTTCTGGCGTTCTCTCCCCAGGCGAGAAGCCCTTCTCCTGTCCCCA...

这里我专门查了一下fasta格式的具体说明,如果熟悉这部分的可以直接略过了。参考:https://blog.csdn.net/u011262253/article/details/51164756

BLAST和其他序列搜索工具

随着序列 数量的增加(匹配数也会随之增加),将会有成百上千的可能匹配,解析这些结果 无疑变得越来越困难。理所当然,人工解析搜索结果就非常的困难了Biopython里有个模块叫Bio.SearchIO。Bio.SearchIO 模块使从搜索结果中提取信息变得简单,并且可以处理不同工具的不同标准和规则。

(一)SearchIO对象模块

SearchIO模块里包含很多个对象,这些对象是嵌套分级的。怎么理解呢?知道俄罗斯套娃么?最外面的是一个大盒子,盒子的名字叫searchIO,里面有一个小一点的盒子,叫QueryResult。这个小一点的盒子里又有一个更小的盒子,叫Hit。Hit盒子里是HSP。不过一个Hit盒子里可以有好多个HSP。HSP盒子里的是HSPFragment盒子。(所以有四个对象)
Bio.SearchIO有四个方法,分别是:read, parse, index, 和 index_db。read 用于单query对输出文件进行搜索并且返回一个 QueryResult 对象。parse 用于多query对输出文件进行搜索并且返回一个可以产出 QueryResult 对象的输出器。

下面来具体的看一下每一个对象:

(1)QueryResult

QueryResult,代表单query搜索,每个 QueryResult 中有0个或多个 Hit 对象。现在看看上面我们得到的BLAST文件是什么样的:

>>> from Bio import SearchIO
>>> blast_qresult = SearchIO.read("my_blast2.xml", "blast-xml")
>>> print(blast_qresult)
Program: blastn (2.10.0+) #程序的名称和版本
  Query: gi|568815578|ref|NC_000020.11|:49982980-49988886 (5907)
         Homo sapiens chromosome 20, GRCh38.p13 Primary Assembly #query的ID,描述和序列长度
 Target: nt #搜索的目标数据库
   Hits: ----  -----  ----------------------------------------------------------
            #  # HSP  ID + description          #hit结果的快速预览。
         ----  -----  ----------------------------------------------------------
            0    976  gi|1548994295|gb|CP034499.1|  Eukaryotic synthetic cons...
            1     63  gi|9650757|emb|AL121712.27|  Human DNA sequence from cl...
            2      1  gi|5821735|gb|AF155233.1|AF155233  Homo sapiens snail z...
            3      1  gi|5725247|emb|AJ245659.1|  Homo sapiens partial SNAI1 ...
            4      3  gi|1519243938|ref|NM_005985.4|  Homo sapiens snail fami...
            5      3  gi|15277716|gb|BC012910.1|  Homo sapiens snail homolog ...
            6      3  gi|1753017152|ref|XM_004062349.3|  PREDICTED: Gorilla g...
            7      3  gi|1367236023|ref|XM_016938127.2|  PREDICTED: Pan trogl...
            8      3  gi|1367236020|ref|XM_016938125.2|  PREDICTED: Pan trogl...
            9      3  gi|1367236018|ref|XM_009437412.3|  PREDICTED: Pan trogl...
           10      3  gi|675701575|ref|XM_003809255.2|  PREDICTED: Pan panisc...
           11      3  gi|4325321|gb|AF125377.1|AF125377  Homo sapiens zinc fi...
           12      3  gi|1800046440|ref|XM_032142166.1|  PREDICTED: Hylobates...
           13      3  gi|1743154268|ref|XM_003252924.4|  PREDICTED: Nomascus ...
           14      3  gi|1351479674|ref|XM_002830412.3|  PREDICTED: Pongo abe...
           15      3  gi|1777284280|ref|XM_003904624.3|  PREDICTED: Papio anu...
           16      3  gi|1381483496|ref|XM_011722884.2|  PREDICTED: Macaca ne...
           17      3  gi|1059174534|ref|XM_017888131.1|  PREDICTED: Rhinopith...
           18      3  gi|795592937|ref|XM_012059057.1|  PREDICTED: Cercocebus...
           19      3  gi|1751209046|ref|XM_010383846.2|  PREDICTED: Rhinopith...
           20      3  gi|1622840906|ref|XM_001097698.4|  PREDICTED: Macaca mu...
           21      3  gi|1411087738|ref|XM_025399385.1|  PREDICTED: Theropith...
           22      3  gi|795350384|ref|XM_011928821.1|  PREDICTED: Colobus an...
           23      3  gi|635020274|ref|XM_008014341.1|  PREDICTED: Chlorocebu...
           24      3  gi|544466412|ref|XM_005569331.1|  PREDICTED: Macaca fas...
           25      3  gi|795204465|ref|XM_011993195.1|  PREDICTED: Mandrillus...
           26      3  gi|1788687212|ref|XM_023184155.2|  PREDICTED: Piliocolo...
           27      3  gi|817304701|ref|XM_012467438.1|  PREDICTED: Aotus nanc...
           28      3  gi|1044359970|ref|XM_017529925.1|  PREDICTED: Cebus cap...
           29      3  gi|1804439919|ref|XM_032256019.1|  PREDICTED: Sapajus a...
           ~~~
           47      1  gi|929047344|gb|KT583904.1|  Homo sapiens clone HsUT006...
           48      3  gi|1126231900|ref|XM_002912981.3|  PREDICTED: Ailuropod...
           49     99  gi|1353793171|gb|CP027081.1|  Bos mutus isolate yakQH1 ...

NOTE:注意, Bio.SearchIO 截断了表格,只显示0-29,然后是最后3个。

那么QueryResult 到底是什么?QueryResult是混合了列表和字典的特性。就是我上面说的一个容器,一个盒子。QueryResult对象是可迭代的(iterable)。每一次迭代返回一个Hit对象:

>>> for hit in blast_qresult:
... hit
... 
Hit(id='gi|1548994295|gb|CP034499.1|', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 976 hsps)
Hit(id='gi|9650757|emb|AL121712.27|', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 63 hsps)
Hit(id='gi|5821735|gb|AF155233.1|AF155233', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 1 hsps)
Hit(id='gi|5725247|emb|AJ245659.1|', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 1 hsps)
Hit(id='gi|1519243938|ref|NM_005985.4|', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 3 hsps)
Hit(id='gi|15277716|gb|BC012910.1|', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 3 hsps)
Hit(id='gi|1753017152|ref|XM_004062349.3|', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 3 hsps)
Hit(id='gi|1367236023|ref|XM_016938127.2|', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 3 hsps)
......#(此处省略n行)

要得到 QueryResult 对象有多少hit:

>>> len(blast_qresult)
50

可以用切片来获得 QueryResult 对象的hit:(只看部分hit)

#查看最高的hit。索引为0,这是之前提到的,python里的索引从0开始。
>>> blast_qresult[0]  
Hit(id='gi|1548994295|gb|CP034499.1|', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 976 hsps)
#查看最后一个hit,索引为-1。
>>> blast_qresult[-1]
Hit(id='gi|1353793171|gb|CP027081.1|', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 99 hsps)

想要一次看几个hit怎么办?

>>> blast_slice = blast_qresult[:3]
>>> print(blast_slice)
Program: blastn (2.10.0+)
  Query: gi|568815578|ref|NC_000020.11|:49982980-49988886 (5907)
         Homo sapiens chromosome 20, GRCh38.p13 Primary Assembly
 Target: nt
   Hits: ----  -----  ----------------------------------------------------------
            #  # HSP  ID + description
         ----  -----  ----------------------------------------------------------
            0    976  gi|1548994295|gb|CP034499.1|  Eukaryotic synthetic cons...
            1     63  gi|9650757|emb|AL121712.27|  Human DNA sequence from cl...
            2      1  gi|5821735|gb|AF155233.1|AF155233  Homo sapiens snail z...

如果你知道一个特定的hit ID存在于一个搜索结果中时,特别有用:

>>> blast_qresult["gi|**********|ref|***********|"]

你可以用hits方法获得完整的Hit对象,也可以用hit_keys方法获得完整的Hit ID:

>>> blast_qresult.hits
[Hit(id='gi|1548994295|gb|CP034499.1|', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 976 hsps), Hit(id='gi|9650757|emb|AL121712.27|', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 63 hsps), Hit(id='gi|5821735|gb|AF155233.1|AF155233', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 1 hsps), Hit(id='gi|5725247|emb|AJ245659.1|', ......

>>> blast_qresult.hit_keys
['gi|1548994295|gb|CP034499.1|', 'gi|9650757|emb|AL121712.27|', 'gi|5821735|gb|AF155233.1|AF155233', 'gi|5725247|emb|AJ245659.1|', 'gi|1519243938|ref|NM_005985.4|', 'gi|15277716|gb|BC012910.1|', 'gi|1753017152|ref|XM_004062349.3|', ......

想确定一个特定的hit是否存在于查询结果中该怎么做?

>>> "gi|262205317|ref|NR_030195.1|" in blast_qresult
False

有时候你会想知道某一个hit的排名(请注意这个排名是python的索引数字):

>>> blast_qresult.index("gi|**********|ref|***********|")
22

如果原本的hit排序不合你意,可以用 QueryResult 对象的sort方法。这个方法基于每个hit 的完整序列长度。对于这个排序,设置in_place参数为False ,这样排序之后会返回一个新的QueryResult 对象,而原来的对象是未排序的。同样可以设置 reverse 参数为True以递减排序:

>>> for hit in blast_qresult[:5]:
...     print("%s %i" % (hit.id, hit.seq_len))
... 
gi|1548994295|gb|CP034499.1| 68480253
gi|9650757|emb|AL121712.27| 79779
gi|5821735|gb|AF155233.1|AF155233 6258
gi|5725247|emb|AJ245659.1| 1060
gi|1519243938|ref|NM_005985.4| 1705
>>> sort_key = lambda hit: hit.seq_len
>>> sorted_qresult = blast_qresult.sort(key=sort_key, reverse=True, in_place=False)
>>> for hit in sorted_qresult[:5]:
...     print("%s %i" % (hit.id, hit.seq_len))
... 
gi|1353793171|gb|CP027081.1| 75983851
gi|1548994295|gb|CP034499.1| 68480253
gi|1051792985|ref|NG_051361.1| 234376
gi|4753226|gb|AC006385.3| 173508
gi|9650757|emb|AL121712.27| 79779

对于QueryResult对象有两种更方便的方法:filter 和 map 方法。filter方法有两种:hit_filter 和 hsp_filter,分别过滤 QueryResult 对象的Hit对象或者HSP对象。同样对于 map 也有两种方法:hit_map 和 hsp_map。下面看一下具体的使用:

从hit_filter开始。用 hit_filter筛选出多于10个HSP的Hit 对象:

>>> filter_func = lambda hit: len(hit.hsps) > 10
>>> len(blast_qresult) #过滤前的hit数量
50
>>> filtered_qresult = blast_qresult.hit_filter(filter_func)
>>> len(filtered_qresult) #过滤后的hit数量
5

hsp_filter和hit_filter功能一样,只不过它过滤每一个hit中的HSP对象,而不是Hit 。

对于map方法,返回的是修改过的Hit或HSP对象(取决于你是否使用 hit_map 或 hsp_map 方法)。

>>> def map_func(hit):
...     hit.id = hit.id.split("|")[3] # 把'gi|@@@@@@|ref|×××××|' 格式改为ref后面的 '×××××'
...     return hit
... 
>>> mapped_qresult = blast_qresult.hit_map(map_func)
>>> for hit in mapped_qresult[:5]:
...     print(hit.id)
... 
CP034499.1
AL121712.27
AF155233.1
AJ245659.1
NM_005985.4

hsp_map和hit_map作用相似, 但是作用于HSP对象而不是Hit对象。

(2) Hit对象

Hit对象代表从单个数据库获得所有查询结果。在Bio.SearchIO模块等级中是二级容器。被包含在 QueryResult 对象中。

>>> from Bio import SearchIO
>>> blast_qresult = SearchIO.read("my_blast2.xml", "blast-xml")
>>> blast_hit = blast_qresult[3] #查看索引为3的 hit
>>> print(blast_hit)
Query: gi|568815578|ref|NC_000020.11|:49982980-49988886
       Homo sapiens chromosome 20, GRCh38.p13 Primary Assembly
  Hit: gi|5725247|emb|AJ245659.1| (1060)
       Homo sapiens partial SNAI1 gene, exon 3
 HSPs: ----  --------  ---------  ------  ---------------  ---------------------
          #   E-value  Bit score    Span      Query range              Hit range
       ----  --------  ---------  ------  ---------------  ---------------------
          0         0    1912.86    1060      [4842:5902]               [0:1060]

Hit 对象也是可迭代的,每次迭代返回一个HSP对象:

>>> for hsp in blast_hit:
...     hsp
... 
HSP(hit_id='gi|5725247|emb|AJ245659.1|', query_id='gi|568815578|ref|NC_000020.11|:49982980-49988886', 1 fragments)

你可以对Hit对象调用 len 方法查看它含有多少个HSP对象:

>>> len(blast_hit)
1

你可以对Hit对象作切片取得单个或多个HSP对象,和QueryResult一样,如果切取多个 HSP,会返回包含被切片 HSP的一个新Hit对象。因为我这里的hit只有一个HSP对象,所以len里才会显示0:

>>> blast_hit[0]
>>> sliced_hit = blast_hit[4:9]
>>> len(sliced_hit)
0
>>> print(sliced_hit)
Query: None
       Homo sapiens chromosome 20, GRCh38.p13 Primary Assembly
  Hit: None (1060)
       Homo sapiens partial SNAI1 gene, exon 3
 HSPs: ?
(3)HSP对象

HSP (高分片段)代表hit序列中的一个区域,该区域包含对于查询序列有意义的比对。它包含了你的查询序列和一个数据库条目之间精确的匹配。由于匹配取决于序列搜索工具的算法, HSP含有大部分统计信息,这些统计是由搜索工具计算得到的。这使得不同搜索工具的HSP对象之间的差异和你在QueryResult以及Hit对象看到的差异尤其明显。

>>> from Bio import SearchIO
>>> blast_qresult = SearchIO.read('my_blast2.xml', 'blast-xml')
>>> blast_hsp = blast_qresult[0][0] #查看第一个 hit,第一个HSP
>>> print(blast_hsp)
      Query: gi|568815578|ref|NC_000020.11|:49982980-49988886 Homo sapiens ch...
        Hit: gi|1548994295|gb|CP034499.1| Eukaryotic synthetic construct chro...
Query range: [0:5907] (1)
  Hit range: [48539516:48545423] (1)
Quick stats: evalue 0; bitscore 10653.80
  Fragments: 1 (5907 columns)
     Query - ATTGCGCCGCGGCACGGCCTAGCGAGTGGTTCTTCTGCGCTACTGCTGCGCGAATCGGC~~~AAAAA
             |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||~~~|||||
       Hit - ATTGCGCCGCGGCACGGCCTAGCGAGTGGTTCTTCTGCGCTACTGCTGCGCGAATCGGC~~~AAAAA
#查看比对的区间
>>> blast_hsp.query_range
(0, 5907)
#查看e值,因为我比对的序列本来就是一个基因序列,所以hsp的e值是0,是完全比对上的
>>> blast_hsp.evalue
0.0

当然,你还可以查看的属性有:

#这段hsp在hit上的起始位置在哪里
>>> blast_hsp.hit_start
48539516
#这段hsp的跨度(长度、多少个碱基)
>>> blast_hsp.query_span
5907
#这段hsp比对上的跨度
>>> blast_hsp.aln_span 
5907

你会发现,HSP里的query属性和hit属性不只是规律字符串:

>>> blast_hsp.query
SeqRecord(seq=Seq('ATTGCGCCGCGGCACGGCCTAGCGAGTGGTTCTTCTGCGCTACTGCTGCGCGAA...AAA', DNAAlphabet()), id='gi|568815578|ref|NC_000020.11|:49982980-49988886', name='aligned query sequence', description='Homo sapiens chromosome 20, GRCh38.p13 Primary Assembly', dbxrefs=[])
>>> blast_hsp.hit
SeqRecord(seq=Seq('ATTGCGCCGCGGCACGGCCTAGCGAGTGGTTCTTCTGCGCTACTGCTGCGCGAA...AAA', DNAAlphabet()), id='gi|1548994295|gb|CP034499.1|', name='aligned hit sequence', description='Eukaryotic synthetic construct chromosome 20', dbxrefs=[])
(4) HSP片段

HSPFragment代表query和hit之间单个连续匹配。其实我们应该把它当作搜索结果的核心,因为它决定你的搜索是否有结果。在多数情况下,它们仅仅包含直接与序列有关的属性:正负链, 阅读框,字母表,位置坐标,序列本身以及它们的ID和描述。

>>> from Bio import SearchIO
>>> blast_qresult = SearchIO.read('my_blast2.xml', 'blast-xml')
>>> blast_frag = blast_qresult[0][0][0] #第一个hit里的第一个hsp,第一个hsp里的第一个fragment
>>> print(blast_frag)
      Query: gi|568815578|ref|NC_000020.11|:49982980-49988886 Homo sapiens ch...
        Hit: gi|1548994295|gb|CP034499.1| Eukaryotic synthetic construct chro...
Query range: [0:5907] (1)
  Hit range: [48539516:48545423] (1)
  Fragments: 1 (5907 columns)
     Query - ATTGCGCCGCGGCACGGCCTAGCGAGTGGTTCTTCTGCGCTACTGCTGCGCGAATCGGC~~~AAAAA
             |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||~~~|||||
       Hit - ATTGCGCCGCGGCACGGCCTAGCGAGTGGTTCTTCTGCGCTACTGCTGCGCGAATCGGC~~~AAAAA
#查询这个frag比对的起始位置
>>> blast_frag.query_start 
0
#这个frag在hit上哪一条链
>>> blast_frag.hit_strand 
1
#所在的hit序列,是一个SeqRecord对象
>>> blast_frag.hit 
SeqRecord(seq=Seq('ATTGCGCCGCGGCACGGCCTAGCGAGTGGTTCTTCTGCGCTACTGCTGCGCGAA...AAA', DNAAlphabet()), id='gi|1548994295|gb|CP034499.1|', name='aligned hit sequence', description='Eukaryotic synthetic construct chromosome 20', dbxrefs=[])
Bio.SearchIO的惯例

(1)所有序列坐标遵循Python 的坐标风格: 从0开始
(2)对于链值,只有四个可选值:1 (正链),-1 (负链),0 (蛋白序列),和 None (无链)。对于阅读框, 可选值是从-3~3的整型以及 None 。

写入和转换搜索输出文件

最后要说的是:你可以把xml文件转换成其他文件。目前只支持如下文件格式:"blast-tab', 'blast-xml', 'blat-psl', 'hmmer3-tab', 'hmmscan3-domtab', 'hmmsearch3-domtab', 'phmmer3-domtab"

>>> from Bio import SearchIO
>>> qresults = SearchIO.read('my_blast.xml', 'blast-xml') 
#tab是表格文件
>>> SearchIO.write(qresults, 'results.tab', 'blast-tab')
(1, 50, 4050, 4050)
上一篇下一篇

猜你喜欢

热点阅读