是否可以将字符串变量传递给BLAST搜索而不是文件?

时间:2016-11-03 14:43:09

标签: bioinformatics biopython fasta blast

我正在编写一个python脚本,并希望将查询序列信息作为字符串变量传递给blastn而不是FASTA格式文件(如果可能的话)。

我使用Biopython的SeqIO将几个转录本名称作为关键字及其序列存储为相关值。

所以它看起来像这样

transcripts = dict()
for record in SeqIO.parse("transcript_sequences.fasta", "fasta"):
transcripts[record.name] = record.seq

print transcripts

所以字典看起来像这样

{'var_F': Seq('CTTCATTCTCGTTTAGCGGCTGCTCGTGGAAATTTCGAAAAAATCTGAAACTAG...TGC', SingleLetterAlphabet())}

现在我想将字典中的序列信息解析为blast查询和主题。

subprocess.call("blastn -query " + transcript['var_F'] + ".txt" + " -subject " + transcript['var_B'] + " -outfmt 6 > tmp_blast.txt", shell=True)  

我知道blast只接受文件位置的文件名或字符串,但我只想知道是否有解决方法。

提前感谢您阅读我的第一个问题:P

2 个答案:

答案 0 :(得分:3)

来自BLAST的BioPython模块:

http://biopython.org/DIST/docs/tutorial/Tutorial.html#htoc90

看来你是正确的,因为biopython BLAST不支持SeqIO对象或生物序列作为BLAST函数调用的参数,或者当您使用BLAST二进制文件的subprocess.call()执行时。接受的唯一输入序列参数是文件名。从教程:

>>> from Bio.Blast.Applications import NcbiblastxCommandline
>>> help(NcbiblastxCommandline)
...
>>> blastx_cline = NcbiblastxCommandline(query="opuntia.fasta", db="nr", evalue=0.001,
...                                      outfmt=5, out="opuntia.xml")
>>> blastx_cline
NcbiblastxCommandline(cmd='blastx', out='opuntia.xml', outfmt=5, query='opuntia.fasta',
db='nr', evalue=0.001)
>>> print(blastx_cline)
blastx -out opuntia.xml -outfmt 5 -query opuntia.fasta -db nr -evalue 0.001
>>> stdout, stderr = blastx_cline()

因此,您唯一的选择是使用实际的FASTA文件作为输入。如果要一次查询一个序列,则需要将每个序列保存到文件中。但是,我建议不要这样做,除非你有理由这样做。我认为如果所有查询序列都在同一个文件中,BLAST 可能执行得更快。您还可以使用BioPython读取生成的BLAST输出,以迭代每个查询的结果,请参阅:

http://biopython.org/DIST/docs/tutorial/Tutorial.html#htoc92

从以上链接中获取的示例:

如果您以其他方式运行BLAST,并在my_blast.xml文件中使用BLAST输出(XML格式),您只需打开文件进行阅读:

>>> 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)

就像Bio.SeqIO和Bio.AlignIO(参见第5章和第6章)一样,我们有一对输入函数,read和parse,其中只有一个对象时读取,而parse是for的迭代器你可以有很多对象 - 但是我们得到了BLAST记录对象,而不是获得SeqRecord或MultipleSeqAlignment对象。

为了能够处理包含数千个结果的BLAST文件可能很大的情况,NCBIXML.parse()返回一个迭代器。用简单的英语,迭代器允许您逐步浏览BLAST输出,逐个检索每个BLAST搜索结果的BLAST记录:

>>> from Bio.Blast import NCBIXML
>>> blast_records = NCBIXML.parse(result_handle)
>>> blast_record = next(blast_records)
# ... do something with blast_record
>>> blast_record = next(blast_records)
# ... do something with blast_record
>>> blast_record = next(blast_records)
# ... do something with blast_record
>>> blast_record = next(blast_records)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
# No further records

答案 1 :(得分:0)

运行blast命令时,可以将序列作为字符串以fasta格式传递给标准输入。

query_string = '>' + record.description + '\n' + str(record.seq)
blast_command = Bio.Blast.Applications.NcbiblastnCommandline(cmd='blastn', out=record.id + '.xml', outfmt=5, db=database_name, evalue=0.001)
stdout, stderr = blast_command(stdin=query_string)