运行BLAST(bl2seq)而不创建序列文件

时间:2010-02-11 21:55:57

标签: python perl unix shell bioinformatics

我有一个执行BLAST查询的脚本(bl2seq)

脚本的工作原理如下:

  
      
  1. 获取序列a,序列b
  2.   
  3. 将序列a写入filea
  4.   
  5. 将序列b写入fileb
  6.   
  7. 运行命令'bl2seq -i filea -j fileb -n blastn'
  8.   
  9. 从STDOUT获取输出,解析
  10.   
  11. 重复2000万次
  12.   

程序bl2seq不支持管道。 有没有办法做到这一点,避免写入/读取硬盘?

我正在使用Python BTW。

5 个答案:

答案 0 :(得分:4)

根据您运行的操作系统,您可以使用bash's process substitution之类的内容。我不确定你是如何在Python中设置的,但你基本上使用的是命名管道(或命名文件描述符)。如果bl2seq尝试在文件中搜索,那将无效,但如果它只是按顺序读取它们就应该有效。

答案 1 :(得分:1)

这是来自BioPerlbl2seq计划吗?如果是这样,它看起来不像你可以管道。但是,您可以使用Bio::Tools::Run::AnalysisFactory::Pise编写自己的hack代码,这是推荐的方法。不过,你必须在Perl中这样做。

如果这是不同的bl2seq,则忽略该消息。无论如何,您可能应该提供更多细节。

答案 2 :(得分:1)

你怎么知道bl2seq不支持管道。顺便说一句,管道是一个操作系统功能,而不是程序。如果您的bl2seq程序输出某些内容,无论是STDOUT还是文件,您应该能够解析输出。检查bl2seq的帮助文件以获取输出到文件的选项,例如-o选项。然后你可以解析文件。

此外,由于您使用的是Python,因此您可以使用BioPython模块。

答案 3 :(得分:1)

哇。我弄明白了。

答案是使用python的子进程模块和管道!

编辑:忘了提到我正在使用 支持管道的blast2。

(这是课程的一部分)

def _query(self):
    from subprocess import Popen, PIPE, STDOUT
    pipe = Popen([BLAST,
    '-p', 'blastn',
    '-d', self.database,
    '-m', '8'],
    stdin=PIPE,
    stdout=PIPE)
    pipe.stdin.write('%s\n' % self.sequence)
    print pipe.communicate()[0]

其中self.database是包含数据库文件名的字符串,即'nt.fa' self.sequence是一个包含查询序列的字符串

这会将输出打印到屏幕,但您可以轻松解析它。没有慢速磁盘I / O.没有慢速的XML解析。我将为此编写一个模块并将其放在github上。

另外,我还没有这么远,但我认为你可以做多个查询,这样就不需要为每个查询读取和加载blast数据库。

答案 4 :(得分:1)

我使用R脚本调用blast2:

....
system("mkfifo seq1")
system("mkfifo seq2")
system("echo  sequence1 > seq1"), wait = FALSE)
system("echo  sequence2 > seq2"), wait = FALSE)
system("blast2 -p blastp -i seq1 -j seq2 -m 8", intern = TRUE)
....

这比写入和读取硬盘慢2倍(!)!