Biopython BLAST概述


爆炸代表 基本的局部比对搜索工具 .它发现生物序列之间的相似区域。 Biopython 提供 Bio.Blast 模块来处理 NCBI BLAST 操作。你可以在本地连接或 Internet 连接中运行 BLAST。

让我们在下面的部分中简要了解这两个连接:

在互联网上运行


Biopython 提供了 Bio.Blast.NCBIWWW 模块来调用在线版的 BLAST。为此,我们需要导入以下模块:

>>> from Bio.Blast import NCBIWWW

NCBIWW模块提供qblast功能查询BLAST在线版本, https://blast.ncbi.nlm.nih.gov/Blast.cgi . qblast 支持在线版本支持的所有参数。

要获得有关此模块的任何帮助,请使用以下命令并了解其功能:

>>> help(NCBIWWW.qblast) 
Help on function qblast in module Bio.Blast.NCBIWWW: 
qblast(
    program, database, sequence,
    url_base = 'https://blast.ncbi.nlm.nih.gov/Blast.cgi',
    auto_format = None,
    composition_based_statistics = None,
    db_genetic_code =  None,
    endpoints = None,
    entrez_query = '(none)',
    expect = 10.0,
    filter = None,
    gapcosts = None,
    genetic_code = None,
    hitlist_size = 50,
    i_thresh = None,
    layout = None,
    lcase_mask = None,
    matrix_name = None,
    nucl_penalty = None,
    nucl_reward = None,
    other_advanced = None,
    perc_ident = None,
    phi_pattern = None,
    query_file = None,
    query_believe_defline = None,
    query_from = None,
    query_to = None,
    searchsp_eff = None,
    service = None,
    threshold = None,
    ungapped_alignment = None,
    word_size = None,
    alignments = 500,
    alignment_view = None,
    descriptions = 500,
    entrez_links_new_window = None,
    expect_low = None,
    expect_high = None,
    format_entrez_query = None,
    format_object = None,
    format_type = 'XML',
    ncbi_gi = None,
    results_file = None,
    show_overview = None,
    megablast = None,
    template_type = None,
    template_length = None
) 
   
    BLAST search using NCBI's QBLAST server or a cloud service provider.
   
    Supports all parameters of the qblast API for Put and Get.
   
    Please note that BLAST on the cloud supports the NCBI-BLAST Common
    URL API (http:// ncbi.github.io/blast-cloud/dev/api.html)。
    To use this feature, please set url_base to 'http:// host.my.cloud.service.provider.com/cgi-bin/blast.cgi' 和
    format_object = 'Alignment'. For more details, please see 8. Biopython – Overview of BLAST
   
https://blast.ncbi.nlm.nih.gov/Blast.cgi?PAGE_TYPE = BlastDocs&DOC_TYPE = CloudBlast
   
    Some useful parameters:
   
    - program blastn, blastp, blastx, tblastn, or tblastx (lower case)
    - database Which database to search against (e.g. "nr").
    - sequence The sequence to search.
    - ncbi_gi TRUE/FALSE whether to give 'gi' identifier.
    - descriptions Number of descriptions to show. Def 500.
    - alignments Number of alignments to show. Def 500.
    - expect An expect value cutoff. Def 10.0.
    - matrix_name Specify an alt. matrix (PAM30, PAM70, BLOSUM80, BLOSUM45).
    - filter "none" turns off filtering. Default no filtering
    - format_type "HTML", "Text", "ASN.1", or "XML". Def. "XML".
    - entrez_query Entrez query to limit Blast search
    - hitlist_size Number of hits to return. Default 50
    - megablast TRUE/FALSE whether to use MEga BLAST algorithm (blastn only)
    - service plain, psi, phi, rpsblast, megablast (lower case)
   
    This function does no checking of the validity of the parameters
    and passes the values to the server as is. More help is available at:
    https:// ncbi.github.io/blast-cloud/dev/api.html

通常,qblast 函数的参数基本上类似于你可以在 BLAST 网页上设置的不同参数。这使得 qblast 函数易于理解,并减少了使用它的学习曲线。

连接和搜索


要了解连接和搜索 BLAST 在线版本的过程,让我们通过 Biopython 对在线 BLAST 服务器进行简单的序列搜索(在我们的本地序列文件中可用)。

步骤 1 : 创建一个名为 blast_example.fasta 在 Biopython 目录中,并提供以下序列信息作为输入

例子 of a single sequence in FASTA/Pearson format: 
>sequence A ggtaagtcctctagtacaaacacccccaatattgtgatataattaaaattatattcatat
tctgttgccagaaaaaacacttttaggctatattagagccatcttctttgaagcgttgtc 

>sequence B ggtaagtcctctagtacaaacacccccaatattgtgatataattaaaattatattca
tattctgttgccagaaaaaacacttttaggctatattagagccatcttctttgaagcgttgtc

步骤 2 : 导入NCBIWWW模块。

>>> from Bio.Blast import NCBIWWW

步骤 3 : 打开序列文件, blast_example.fasta 使用 python IO 模块。

>>> sequence_data = open("blast_example.fasta").read() 
>>> sequence_data 
'例子 of a single sequence in FASTA/Pearson format:\n\n\n> sequence 
A\nggtaagtcctctagtacaaacacccccaatattgtgatataattaaaatt 
atattcatat\ntctgttgccagaaaaaacacttttaggctatattagagccatcttctttg aagcgttgtc\n\n'

步骤 4 : 现在,调用 qblast 函数传递序列数据作为主参数。另一个参数代表数据库(nt)和内部程序(blastn)。

>>> result_handle = NCBIWWW.qblast("blastn", "nt", sequence_data) 
>>> result_handle 
<_io.StringIO object at 0x000001EC9FAA4558>

爆炸结果 保存我们搜索的结果。它可以保存到文件中供以后使用,也可以解析以获取详细信息。我们将在接下来的部分中学习如何做到这一点。

步骤 5 : 使用 Seq 对象也可以完成相同的功能,而不是使用整个 fasta 文件,如下所示:

>>> from Bio import SeqIO 
>>> seq_record = next(SeqIO.parse(open('blast_example.fasta'),'fasta')) 
>>> seq_record.id 
'sequence' 
>>> seq_record.seq 
Seq('ggtaagtcctctagtacaaacacccccaatattgtgatataattaaaattatat...gtc', 
SingleLetterAlphabet())

现在,调用传递 Seq 对象 record.seq 作为主要参数的 qblast 函数。

>>> result_handle = NCBIWWW.qblast("blastn", "nt", seq_record.seq) 
>>> print(result_handle) 
<_io.StringIO object at 0x000001EC9FAA4558>

BLAST 将自动为你的序列分配一个标识符。

步骤 6 : result_handle 对象将拥有整个结果,可以保存到文件中以备后用。

>>> with open('results.xml', 'w') as save_file: 
>>>   blast_results = result_handle.read() 
>>>   save_file.write(blast_results)

我们将在后面的部分中看到如何解析结果文件。

运行独立 BLAST


本节介绍如何在本地系统中运行 BLAST。如果你在本地系统中运行 BLAST,它可能会更快,并且还允许你创建自己的数据库来搜索序列。

连接 BLAST

一般来说,不建议在本地运行 BLAST,因为它体积大、运行软件需要额外的工作量以及所涉及的成本。 Online BLAST 足以满足基本和高级目的。当然,有时你可能需要在本地安装它。

考虑到你经常在线进行搜索,这可能需要大量时间和大量网络,如果你有专有序列数据或 IP 相关问题,则建议在本地安装。

为此,我们需要遵循以下步骤:

步骤 1 :使用给定的链接下载并安装最新的blast二进制文件: ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/

步骤 2 : 使用以下链接下载并解压最新且必要的数据库: ftp://ftp.ncbi.nlm.nih.gov/blast/db/

BLAST 软件在其站点中提供了许多数据库。让我们下载 alu.n.gz 从blast数据库站点中提取文件并将其解压缩到alu文件夹中。此文件为 FASTA 格式。要在我们的 blast 应用程序中使用这个文件,我们需要首先将文件从 FASTA 格式转换为 blast 数据库格式。 BLAST 提供 makeblastdb 应用程序来执行此转换。

使用下面的代码片段:

cd /path/to/alu 
makeblastdb -in alu.n -parse_seqids -dbtype nucl -out alun

运行上述代码将解析输入文件 alu.n 并将 BLAST 数据库创建为多个文件 alun.nsq、alun.nsi 等。现在,我们可以查询该数据库以查找序列。

我们已经在我们的本地服务器上安装了 BLAST 并且还有示例 BLAST 数据库, alun 对其进行查询。

步骤 3 :让我们创建一个示例序列文件来查询数据库。创建一个文件 search.fsa 并将以下数据放入其中。

>gnl|alu|Z15030_HSAL001056 (Alu-J) 
AGGCTGGCACTGTGGCTCATGCTGAAATCCCAGCACGGCGGAGGACGGCGGAAGATTGCT 
TGAGCCTAGGAGTTTGCGACCAGCCTGGGTGACATAGGGAGATGCCTGTCTCTACGCAAA 
AGAAAAAAAAAATAGCTCTGCTGGTGGTGCATGCCTATAGTCTCAGCTATCAGGAGGCTG 
GGACAGGAGGATCACTTGGGCCCGGGAGTTGAGGCTGTGGTGAGCCACGATCACACCACT 
GCACTCCAGCCTGGGTGACAGAGCAAGACCCTGTCTCAAAACAAACAAATAA 
>gnl|alu|D00596_HSAL003180 (Alu-Sx) 
AGCCAGGTGTGGTGGCTCACGCCTGTAATCCCACCGCTTTGGGAGGCTGAGTCAGATCAC 
CTGAGGTTAGGAATTTGGGACCAGCCTGGCCAACATGGCGACACCCCAGTCTCTACTAAT 
AACACAAAAAATTAGCCAGGTGTGCTGGTGCATGTCTGTAATCCCAGCTACTCAGGAGGC 
TGAGGCATGAGAATTGCTCACGAGGCGGAGGTTGTAGTGAGCTGAGATCGTGGCACTGTA
CTCCAGCCTGGCGACAGAGGGAGAACCCATGTCAAAAACAAAAAAAGACACCACCAAAGG 
TCAAAGCATA 
>gnl|alu|X55502_HSAL000745 (Alu-J) 
TGCCTTCCCCATCTGTAATTCTGGCACTTGGGGAGTCCAAGGCAGGATGATCACTTATGC 
CCAAGGAATTTGAGTACCAAGCCTGGGCAATATAACAAGGCCCTGTTTCTACAAAAACTT 
TAAACAATTAGCCAGGTGTGGTGGTGCGTGCCTGTGTCCAGCTACTCAGGAAGCTGAGGC 
AAGAGCTTGAGGCTACAGTGAGCTGTGTTCCACCATGGTGCTCCAGCCTGGGTGACAGGG 
CAAGACCCTGTCAAAAGAAAGGAAGAAAGAACGGAAGGAAAGAAGGAAAGAAACAAGGAG 
AG

序列数据是从 alu.n 文件中收集的;因此,它与我们的数据库匹配。

步骤 4 : BLAST软件提供了很多应用程序来搜索数据库,我们使用blastn。 blastn 应用程序至少需要三个参数,db、query 和 out。 D b 参照数据库进行检索; query 是要匹配的序列,并且 out 是存储结果的文件。现在,运行以下命令来执行这个简单的查询:

blastn -db alun -query search.fsa -out results.xml -outfmt 5

运行上述命令将在 结果.xml 文件如下(部分数据):

<?xml version = "1.0"?> 
<!DOCTYPE Blast输出 PUBLIC "-// NCBI
    "http:// www.ncbi.nlm.nih.gov/dtd/NCBI_Blast输出.dtd">
<Blast输出> 
    <Blast输出_program>blastn</Blast输出_program>
    <Blast输出_version>BLASTN 2.7.1+</Blast输出_version>
    <Blast输出_reference>Zheng Zhang, Scott Schwartz, Lukas Wagner, and Webb
        Miller (2000), "A greedy algorithm for aligning DNA sequences", J
        Comput Biol 2000; 7(1-2):203-14.
    </Blast输出_reference>
   
    <Blast输出_db>alun</Blast输出_db>
    <Blast输出_query-ID>Query_1</Blast输出_query-ID>
    <Blast输出_query-def>gnl|alu|Z15030_HSAL001056 (Alu-J)</Blast输出_query-def>
    <Blast输出_query-len>292</Blast输出_query-len>
    <Blast输出_param>
        <Parameters>
            <Parameters_expect>10</Parameters_expect>
            <Parameters_sc-match>1</Parameters_sc-match>
            <Parameters_sc-mismatch>-2</Parameters_sc-mismatch>
            <Parameters_gap-open>0</Parameters_gap-open>
            <Parameters_gap-extend>0</Parameters_gap-extend>
            <Parameters_filter>L;m;</Parameters_filter>
        </Parameters>
    </Blast输出_param>
    <Blast输出_iterations>
        <Iteration>
            <Iteration_iter-num>1</Iteration_iter-num><Iteration_query-ID>Query_1</Iteration_query-ID>
            <Iteration_query-def>gnl|alu|Z15030_HSAL001056 (Alu-J)</Iteration_query-def>
            <Iteration_query-len>292</Iteration_query-len>
            <Iteration_hits>
            <Hit>
                <Hit_num>1</Hit_num>
                <Hit_id>gnl|alu|Z15030_HSAL001056</Hit_id>
                <Hit_def>(Alu-J)</Hit_def>
                <Hit_accession>Z15030_HSAL001056</Hit_accession>
                <Hit_len>292</Hit_len>
                <Hit_hsps>
                    <Hsp>
                 <Hsp_num>1</Hsp_num> 
                        <Hsp_bit-score>540.342</Hsp_bit-score>
                        <Hsp_score>292</Hsp_score>
                        <Hsp_evalue>4.55414e-156</Hsp_evalue>
                        <Hsp_query-from>1</Hsp_query-from>
                        <Hsp_query-to>292</Hsp_query-to>
                        <Hsp_hit-from>1</Hsp_hit-from>
                        <Hsp_hit-to>292</Hsp_hit-to>
                        <Hsp_query-frame>1</Hsp_query-frame>
                        <Hsp_hit-frame>1</Hsp_hit-frame>
                        <Hsp_identity>292</Hsp_identity>
                        <Hsp_positive>292</Hsp_positive>
                        <Hsp_gaps>0</Hsp_gaps>
                        <Hsp_align-len>292</Hsp_align-len>
                  
                        <Hsp_qseq>
                            AGGCTGGCACTGTGGCTCATGCTGAAATCCCAGCACGGCGGAGGACGGCGGAAGATTGCTTGAGCCTAGGAGTTTG
                            CGACCAGCCTGGGTGACATAGGGAGATGCCTGTCTCTACGCAAAAGAAAAAAAAAATAGCTCTGCTGGTGGTGCATG
                            CCTATAGTCTCAGCTATCAGGAGGCTGGGACAGGAGGATCACTTGGGCCCGGGAGTTGAGGCTGTGGTGAGCC
                            ACGATCACACCACTGCACTCCAGCCTGGGTGACAGAGCAAGACCCTGTCTCAAAACAAACAAATAA
                        </Hsp_qseq>

                        <Hsp_hseq>
                            AGGCTGGCACTGTGGCTCATGCTGAAATCCCAGCACGGCGGAGGACGGCGGAAGATTGCTTGAGCCTAGGA
                            GTTTGCGACCAGCCTGGGTGACATAGGGAGATGCCTGTCTCTACGCAAAAGAAAAAAAAAATAGCTCTGCT
                            GGTGGTGCATGCCTATAGTCTCAGCTATCAGGAGGCTGGGACAGGAGGATCACTTGGGCCCGGGAGTTGAGG
                            CTGTGGTGAGCCACGATCACACCACTGCACTCCAGCCTGGGTGACAGAGCAAGACCCTGTCTCAAAACAAAC
                            AAATAA
                        </Hsp_hseq>

                        <Hsp_midline>
                            |||||||||||||||||||||||||||||||||||||||||||||||||||||
                            |||||||||||||||||||||||||||||||||||||||||||||||||||||
                            |||||||||||||||||||||||||||||||||||||||||||||||||||||
                            |||||||||||||||||||||||||||||||||||||||||||||||||||||
                            |||||||||||||||||||||||||||||||||||||||||||||||||||||
                            |||||||||||||||||||||||||||
                        </Hsp_midline>
                    </Hsp>
                </Hit_hsps>
            </Hit>
            .........................
            .........................
            .........................
            </Iteration_hits>
            <Iteration_stat>
                <Statistics>
                    <Statistics_db-num>327</Statistics_db-num>
                    <Statistics_db-len>80506</Statistics_db-len>
                    <Statistics_hsp-lenv16</Statistics_hsp-len>
                    <Statistics_eff-space>21528364</Statistics_eff-space>
                    <Statistics_kappa>0.46</Statistics_kappa>
                    <Statistics_lambda>1.28</Statistics_lambda>
                    <Statistics_entropy>0.85</Statistics_entropy>
                </Statistics>
            </Iteration_stat>
        </Iteration>
    </Blast输出_iterations>
</Blast输出>

上面的命令可以使用下面的代码在python里面运行:

>>> from Bio.Blast.Applications import NcbiblastnCommandline 
>>> blastn_cline = NcbiblastnCommandline(query = "search.fasta", db = "alun", 
outfmt = 5, out = "results.xml") 
>>> stdout, stderr = blastn_cline()

这里,第一个是blast 输出的句柄,第二个是blast 命令产生的可能的错误输出。

由于我们提供了输出文件作为命令行参数 (out = “results.xml”) 并将输出格式设置为 XML (outfmt = 5),因此输出文件将保存在当前工作目录中。

解析 BLAST 结果


通常,使用 NCBIXML 模块将 BLAST 输出解析为 XML 格式。为此,我们需要导入以下模块:

>>> from Bio.Blast import NCBIXML

Now, 直接使用python open方法打开文件 and 使用 NCBIXML 解析方法 如下所示:

>>> E_VALUE_THRESH = 1e-20 
>>> for record in NCBIXML.parse(open("results.xml")): 
>>>     if record.alignments: 
>>>        print("\n") 
>>>        print("query: %s" % record.query[:100]) 
>>>        for align in record.alignments: 
>>>           for hsp in align.hsps: 
>>>              if hsp.expect < E_VALUE_THRESH: 
>>>                 print("match: %s " % align.title[:100])

这将产生如下输出:

query: gnl|alu|Z15030_HSAL001056 (Alu-J) 
match: gnl|alu|Z15030_HSAL001056 (Alu-J) 
match: gnl|alu|L12964_HSAL003860 (Alu-J) 
match: gnl|alu|L13042_HSAL003863 (Alu-FLA?) 
match: gnl|alu|M86249_HSAL001462 (Alu-FLA?) 
match: gnl|alu|M29484_HSAL002265 (Alu-J) 

query: gnl|alu|D00596_HSAL003180 (Alu-Sx) 
match: gnl|alu|D00596_HSAL003180 (Alu-Sx) 
match: gnl|alu|J03071_HSAL001860 (Alu-J) 
match: gnl|alu|X72409_HSAL005025 (Alu-Sx) 

query: gnl|alu|X55502_HSAL000745 (Alu-J) 
match: gnl|alu|X55502_HSAL000745 (Alu-J)