通过python脚本运行本地blastn对nt db

时间:2017-07-10 14:09:28

标签: python-2.7 bioinformatics biopython

我有一个带有序列的fasta文件,我希望从ncbi网站下载到我的计算机上的'nt'数据库

我下载了爆炸2.6.0。

为了从任何地方进入爆炸,我做了:

gedit ~/.bashrc 

export PATH=/usr/local/ncbi-blast-2.6.0+/bin:$PATH
然后我做了:

source ~/.bashrc

然后我下载'nt'数据库(155.6GB)并将其存储在/ usr / local / blastdb

我想在python脚本中运行这个命令:

from Bio.Blast.Applications import NcbiblastnCommandline

cline = NcbiblastnCommandline(query="/home/proprietaire/Desktop/JADE/stage_scripts/seq_error_fasta.fasta", db="/usr/local/blastdb/nt", evalue=0.001, out="blast_result_local.xml", outfmt=5)

但这不是有原因的。请帮我弄清楚我做错了什么。谢谢你的帮助。

编辑:

'seq_error_fasta.fasta':是我的fasta文件,包含64个序列,我想把它们炸成'nt'数据库。

我的'seq_error_fasta.fasta'包含加载了S,J,X等错误的序列,所以我想将它们爆炸到'nt'db以获得最接近的更好的序列

我发现我需要格式化从ncbi下载的nt数据库,所以我这样做了:

makeblastdb -dbtype nucl -in nt

然后我在我的python脚本中的cline变量之后添加了这个:

stdout,stderr = cline()

脚本正在运行但不幸的是我现在收到此错误:

总线错误(核心转储)

我认为这是一个内存问题所以我认为我需要通过仅采用细菌序列来缩短'nt'db。我在NCBI上寻找了一个完整的细菌数据库但是有多个不同物种的数据库,比如一千多个。

我还尝试使用此脚本在线爆炸:

f = open('output_blast.xml','w')

for rec in SeqIO.parse(open("seq_error_fasta.fasta"), 'fasta):

       result_handle = NCBIWWW.qblast("blastn", "nt", rec.format("fasta"), format_type="XML", alignments=1, perc_ident=95, expect= 0.001)

       f.write(result_handle.read())

f.close()

但这仅执行一个查询序列并返回所有命中,尽管我指定了1个命中和95%的身份。

这让我疯狂lollll请帮忙

1 个答案:

答案 0 :(得分:0)

下载NCBI nr数据库:

$ mkdir db 
$ cd db
$ wget ftp://ftp.ncbi.nlm.nih.gov/blast/db/nr*

运行爆炸:

import io
import shlex
import subprocess

BLAST_OUTFMT6 = """\
    '6 qacc sacc pident length mismatch gapopen qstart qend sstart send evalue bitscore qseq sseq'\
"""

BLAST_OUTFMT6_COLUMN_NAMES = [
    'query_id', 'subject_id', 'pc_identity', 'alignment_length', 'mismatches', 'gap_opens',
    'q_start', 'q_end', 's_start', 's_end', 'evalue', 'bitscore', 'qseq', 'sseq',
]

def blastp(sequence, db, evalue=0.001, max_target_seqs=100000):
    system_command = (
        'blastp -db {db} -outfmt {outfmt} -evalue {evalue} -max_target_seqs {max_target_seqs}'
        .format(db=db, outfmt=BLAST_OUTFMT6, evalue=evalue, max_target_seqs=max_target_seqs)
    )
    cp = subprocess.Popen(
        shlex.split(system_command),
        stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
        universal_newlines=True)
    result, error_message = cp.communicate(sequence)
    if error_message.strip():
        print("Error: {}".format(error_message))
    return result


if __name__ == '__main__':
    result = blastp('AAAAAAAAAAAAAA', db='/path/to/db/nr')
    print(result)