2010-02-11 8 views
5

Tengo un script que realiza consultas BLAST (bl2seq)correr BLAST (bl2seq) sin crear secuencia de archivos

El script funciona así:

  1. Get secuencia de una secuencia b
  2. escribir secuencia a a archivo
  3. escribir secuencia b al archivob
  4. ejecutar comando 'bl2seq -i archivoa -j archivob -n blastn'
  5. obtener una salida desde la salida estándar, análisis sintáctico
  6. repetición de 20 millones de veces

El bl2seq programa no admite la tubería. ¿Hay alguna manera de hacer esto y evitar escribir/leer en el disco duro?

Estoy usando Python BTW.

+0

+1 @Austin, esta es una buena pregunta. Estaba buscando algo similar (15 millones de consultas a 'balstall', un comando de Blast2 también) y lo conseguí haciendo Google'ing. Por favor, considere volver a preguntar en http://biostars.org –

Respuesta

1

¿Cómo sabe que bl2seq no es compatible con tuberías? Por cierto, las tuberías son una característica del sistema operativo, no el programa. Si su programa bl2seq produce algo, ya sea en STDOUT o en un archivo, debería poder analizar el resultado. Revise también el archivo de ayuda de bl2seq para que las opciones salgan al archivo, por ejemplo, la opción -o. Entonces puedes analizar el archivo.

Además, como está utilizando Python, una alternativa que puede utilizar es el módulo BioPython.

+0

Definitivamente depende del programa si lee algo de la entrada estándar. El hecho de que pueda canalizar algo a STDIN no significa que el programa haga algo con él. – cjm

+0

que dice algo sobre STDIN. Estoy preguntando a OP sobre STDOUT. – ghostdog74

+0

Puedo analizar correctamente la salida, ya que va a STDOUT. @cjn - ¿Cómo conectaría dos argumentos? bl2seq -i -j

1

¿Es este el programa bl2seq de BioPerl? Si es así, no parece que puedas conectarlo. Sin embargo, puede codificar su propio truco usando Bio::Tools::Run::AnalysisFactory::Pise, que es la forma recomendada de hacerlo. Sin embargo, tendrías que hacerlo en Perl.

Si este es un bl2seq diferente, entonces omita el mensaje. En cualquier caso, probablemente debas proporcionar más detalles.

+0

Es el programa bl2seq que viene con Blast + de NCBI. El BioPerl bl2seq es un envoltorio de algún tipo. –

4

Según el sistema operativo en el que se ejecute, es posible que pueda usar algo como bash's process substitution. No estoy seguro de cómo lo configuraste en Python, pero básicamente estás usando un conducto con nombre (o un descriptor de archivo con nombre). Eso no funcionará si bl2seq intenta buscar dentro de los archivos, pero debería funcionar si solo los lee secuencialmente.

+0

¡Oye, eso funcionó! Estás rad bl2seq -i <(echo sequence1) -j (echo sequence2) -p blastn –

1

Wow. Lo tengo resuelto.

¡La respuesta es usar el módulo de subproceso y las tuberías de python!

EDITAR: se olvidó de mencionar que estoy usando blast2 que hace tubería de soporte.

(esto es parte de una clase)

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] 

donde self.database es una cadena que contiene el nombre de archivo de base de datos, es decir, 'nt.fa' self.sequence es una cadena que contiene la secuencia de consulta

Esto imprime la salida a la pantalla, pero puede simplemente analizarla. Sin E/S de disco lento. Sin análisis lento de XML. Voy a escribir un módulo para esto y lo pondré en github.

Además, no he llegado tan lejos todavía, pero creo que puede hacer varias consultas para que la base de datos de detones no necesite ser leída y cargada en la RAM para cada consulta.

1

me llaman BLAST2 usar la escritura 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) 
.... 

Ésta es 2 veces más lento frente a la escritura y la lectura desde el disco duro (!)!

+0

¡Ja! Aprecio tu respuesta anti. –

Cuestiones relacionadas