запуск BLAST (bl2seq) без создания файлов последовательности - PullRequest
5 голосов
/ 12 февраля 2010

У меня есть скрипт, который выполняет запросы BLAST (bl2seq)

Сценарий работает так:

  1. Получить последовательность а, последовательность b
  2. записать последовательность a в filea
  3. записать последовательность b в файлb
  4. выполнить команду 'bl2seq -i filea -j fileb -n blastn'
  5. получить вывод из STDOUT, разобрать
  6. повторить 20 миллионов раз

Программа bl2seq не поддерживает трубопровод. Есть ли способ сделать это и избежать записи / чтения на жесткий диск?

Я использую Python BTW.

Ответы [ 5 ]

4 голосов
/ 12 февраля 2010

В зависимости от того, на какой ОС вы работаете, вы можете использовать что-то вроде подстановка процесса bash . Я не уверен, как бы вы настроили это в Python, но вы в основном используете именованный канал (или дескриптор именованного файла). Это не сработает, если bl2seq попытается выполнить поиск в файлах, но должно сработать, если будет просто читать их последовательно.

1 голос
/ 01 июля 2010

Я вызываю blast2, используя скрипт R:

....
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 раза медленнее (!) По сравнению с записью и чтением с жесткого диска!

1 голос
/ 06 мая 2010

Ничего себе. Я понял это.

Ответ - использовать модуль подпроцесса 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 - строка, содержащая последовательность запроса

Это выводит вывод на экран, но вы можете легко его проанализировать. Нет медленного дискового ввода-вывода. Нет медленного разбора XML. Я собираюсь написать модуль для этого и поместить его на github.

Кроме того, я еще не дошел до этого, но я думаю, что вы можете сделать несколько запросов, чтобы не нужно было считывать и загружать базу данных Blast в RAM для каждого запроса.

1 голос
/ 12 февраля 2010

Откуда вы знаете, что bl2seq не поддерживает трубопроводы? Кстати, pipe - это функция ОС, а не программы. Если ваша программа bl2seq что-то выводит, будь то STDOUT или файл, вы сможете проанализировать вывод. В файле справки bl2seq также есть параметры для вывода в файл, например, опция -o. Затем вы можете разобрать файл.

Кроме того, поскольку вы используете Python, вы можете использовать альтернативу BioPython module.

1 голос
/ 12 февраля 2010

Это программа bl2seq от BioPerl ? Если так, это не похоже, что вы можете сделать трубопровод к нему. Вы можете, однако, написать свой собственный хак, используя Bio::Tools::Run::AnalysisFactory::Pise, который является рекомендуемым способом решения этой проблемы Вы должны сделать это за Perl, однако.

Если это другое bl2seq, игнорировать сообщение. В любом случае, вам, вероятно, следует предоставить более подробную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...