• Publicidad

Iniciar Clustaw desde Perl (llamada al sistema)

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Iniciar Clustaw desde Perl (llamada al sistema)

Notapor Ponciano » 2009-04-14 03:26 @185

Hola a todos.

Deseo saber si alguien de uds. ha usado algún script en Perl para ejecutar Clustalw y realizar algunas tareas como: cambiar formato de archivos (.pir a msf), realizar alineamientos, etc.

¿Saben dónde puedo encontrar algunos ejemplos?

Les agradeceré mucho cualquier información relacionada.

Gracias.


P.
Ponciano
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-03-31 10:08 @463

Publicidad

Notapor explorer » 2009-04-14 04:47 @241

Si ese programa se puede ejecutar desde la línea de comandos, entonces puedes ejecutarlo desde Perl usando las comillas invertidas (``), las funciones qx(), system() y exec().

Depende un poco de qué resultado quieres obtener. Si solo es ejecutarlo y terminar, pues exec(). Si quieres ejecutarlo y seguir con el programa Perl, pues system(). Y si quieres además obtener la salida devuelta por Clustaw, pues entonces las comillas invertidas o la función qx().

¿Puedes poner un ejemplo?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Ponciano » 2009-04-14 05:53 @287

Me explico:

Tengo instalado clustalw en el sistema, el cual puedo invocar desde la linea de comandos con un solo $ clustalw y que he utilizado para cambiar el tipo formato de un archivo, de fichero.pir crear fichero.msf.

Deseo tener un script en Perl para automatizar este mismo cambio de formato de una carpeta con miles de archivos .pir. El problema es que no sé como abordarlo: dentro de clustalw, para generar un fichero .msf tengo que ir seleccionando de manera interactiva con clustalw las opciones que realizan la tarea de cambio de formato.

Por ejemplo, clustalw me pide:
Código: Seleccionar todo
your choice:

y tecleo el número 1 y un enter, pues en el menú que se despliega también éste corresponde a la opción que permite acceder a cambio de formato. En seguida me aparece
Código: Seleccionar todo
name of file:

y tecleo el nombre del archivo que deseo formatear más un enter. En otro punto me aparece
Código: Seleccionar todo
your choice

y tecleo 4 más un enter, pues éste corresponde dentro del menú desplegado a la opción de formato .msf.

En otro punto
Código: Seleccionar todo
enter name of new file:

y tecleo el nombre que deseo ponerle al archivo que generará en formatdo .msf, que por cierto será el mismo que el original, es decir, fichero.msf.

En otros puntos del proceso tengo que dar unos enter o teclear números que representan, nuevamente, opciones.

No sé si me dí a entender, pero esa es la tarea básicamente.

Gracias.

P.
Ponciano
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-03-31 10:08 @463

Notapor explorer » 2009-04-14 06:14 @301

Leyendo la documentación de clustalw, al final de ella, aparecen los parámetros que puedes indicar en la línea de comandos, por lo que no es necesario que te pregunte.

Intenta ejecutarlo de esa manera, a través de parámetros puestos en la línea de comandos, al lado del ejecutable clustalw, algo así:
Código: Seleccionar todo
clustalw -OUTPUT=GCG -INFILE=fichero.pir (resto de opciones)

Luego, desde Perl, es fácil hacer un bucle recorriendo los ficheros a transformar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for my $fichero_pir (<*.pir>) {
    my ($fichero_msf) = $fichero_pir =~ s/pir$/msf/;

    system("clustalw -INFILE=$fichero_pir -OUTPUT=GCG -OUTFILE=$fichero_msf");
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Ponciano » 2009-04-14 09:56 @456

¡Hola!

He averiguado que los siguientes parámetros hacen lo que deseo en clustalw y lo refiero a un archivo en particular:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
$ clustalw -INFILE=P30126.pir -CONVERT -OUTPUT=GCG
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El comando anterior crea el archivo P0126.msf en el mismo directorio y con el contenido que deseo.

Desearía usar comillas en lugar de system() ya que quiero tener la salida devuelta por clustalw pues a cada uno de los archivos .msf les eliminaré la primera línea.

Los archivos .pir están en una carpeta (llamada PIR_master) y desearía que los que se generen se vayan a la carpeta MSF_master que ya he creado en el mismo directorio.

Gracias
Ponciano
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-03-31 10:08 @463

Notapor explorer » 2009-04-14 10:15 @469

A ver... que no me aclaro... dices que con ese comando te crea un fichero en el mismo directorio. Y al mismo tiempo quieres modificarlo quitándole una línea del principio, que te devuelve la misma ejecución del comando.

Me parece que me he perdido. ¿El comando hace las dos cosas a la vez, crear el fichero y devolverlo por la salida estándar?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Ponciano » 2009-04-14 10:29 @478

Sí, el comando hace esas dos cosas pero ahora a cada archivo .msf que vaya generando a partir de cada uno de los archivos .pir, deseo abrir cada uno para quitarle la primera línea de texto ya que interfiere con lo que deseo hacer con cada uno de ellos.

He estado leyendo y estoy pensando en algo así como
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(CLUS, "clustalw -INFILE=P30126.PI -CONVERT -OUTPUT=GCG);
WHILE (  )
{
#procesar cada archivo
}
close ()
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Me he querido referir a un archivo en particular, pero ¿cómo lo hago extensivo a los miles de archivos?
Ponciano
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-03-31 10:08 @463

Notapor explorer » 2009-04-14 11:04 @503

Si quieres editar el fichero que se ha grabado en disco, entonces no necesitas leer nada de la salida estándar devuelta por clustalw.

Una forma de hacerlo sería hacer el bucle, transformar cada uno, y leer el resultado, modificarlo, y escribirlo en el directorio destino.

Algo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use File::Basename;

for my $fichero_pir (<PIR_master/*.pir>) {

    my ($fichero_msf = $fichero_pir) =~ s/pir$/msf/;

    system("clustalw -INFILE=$fichero_pir -CONVERT -OUTPUT=GCG");

    open  MSF, '<', $fichero_msf;
    my @msf = <MSF>;
    close MSF;

    my $fichero_msf_salida = 'MSF_master/' . basename($fichero_msf);

    open  MSF, '>', $fichero_msf_salida;
    print MSF @msf[1 .. $#msf];
    close MSF;
}

 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Habría un desajuste en el programa si el clustalw crea el fichero en el directorio actual y no en el de trabajo. Yo probaría usando el parámetro OUTFILE de clustalw para indicar dónde tiene que guardar el resultado.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron