• Publicidad

Acumulación de texto

Perl aplicado a la bioinformática

Re: Acumulación de texto

Notapor gallinaclueca » 2012-05-14 13:08 @589

El formato del result1 (y el del resto de archivos result$contador) debería ser tripletes separados por espacios (en realidad lo de los ":" era para separarlos con la función split() y crear espacios entre cada triplete). Hemos conseguido que salga con este formato (con tripletes separados por espacios), pero ahora salen los tripletes distintos o descolocados respecto a como están en el archivo espermatozoide$contador.

El código es que hemos utilizado es el siguiente (reiniciando el @codones fuera del while):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $contador = 0;
  2. @codon    = ();
  3. while ( $contador < 20 ) {
  4.     $contador += 1;
  5.     $espermatozoide = "espermatozoide$contador.txt";
  6.     open( FH, "$espermatozoide" ) or die "No se puede abrir";
  7.     open( FH2, " > result$contador.txt" );
  8.     while ( $linea = <FH> ) {
  9.         $codon = substr( $linea, 0, 3 );
  10.         push( @codones, $codon );
  11.         print FH2 "@codones ";
  12.  
  13.     }
  14.     @codones = ();
  15. }
  16. print "hecho";
  17. close(FH);
  18. close(FH2);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-05-14 13:10 @590, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
gallinaclueca
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-11 12:50 @576

Publicidad

Re: Acumulación de texto

Notapor explorer » 2012-05-14 13:17 @595

A ver...

Si se trata de ir archivo por archivo...
Por cada línea del archivo...
Sacar el primer codón de cada línea...
Almacenar (push) en @codones...
Una vez terminado de leer el archivo, sacar todos los codones unidos (join) con un espacio en blanco...
Repetir para el siguiente archivo...

entonces, el programa que publiqué antes, sirve, con solo cambiar el ':' por un ' ' en la línea 13.

En cuanto al programa tuyo...
Inicializas @codon, pero no @codones.
Por cada línea de cada archivo, sacas el $codon, lo agregas a @codones, y sacas todos los @codones.
En la línea 14, sí inicializas @codones (mejor dicho, lo pones a vacío).

¿Es a eso a lo que te refieres con "acumulación", lo de ir sacando las lista de codones encontrados por cada línea del archivo de entrada?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Acumulación de texto

Notapor gallinaclueca » 2012-05-14 13:40 @611

Mi último programa funciona separando los tripletes con espacios y ya sin acumular (con acumular me refería a que los archivos 2 contenían lo del 1 y lo del 2, el 3 contenía lo que tenía el espermatozoide 1, el 2 y el 3, y así....), lo que pasa es que los tripletes salen desordenados respecto a como estaban en espermatozoide$contador.

De todos modos, ese problema ya lo tenemos solucionado (ese programa nos funciona).

Ahora lo que nos urge es saber cómo identificar secuencias determinadas de tripletes para adjudicarles un nuevo nombre de aminoácido (según sea la secuencia de tripletes, será un aminoácido u otro). El problema es que no sabemos cómo poner los espacios entre triplete y triplete a la hora de identificar si contiene el archivo esa secuencia determinada.

Lo que hemos hecho es: if ($i =~ /CAG TTA/) {print RE2 "contiene alanina"}
gallinaclueca
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-11 12:50 @576

Re: Acumulación de texto

Notapor gallinaclueca » 2012-05-14 20:38 @901

Hola de nuevo.

Al intentar imprimir en un archivo resultadofinal$contador (correspondiente a los respectivos archivos result$contador) los aminoácidos que contiene cada result$contador según los tripletes que tenga, he desarrollado el siguiente código, pero sólo se me ejecuta la primera parte (imprime "hecho" en el terminal y ni siquiera se crea otro archivo resultadofinal$contador.txt, y en otro de mis múltiples intentos, una vez se creó el archivo pero sin imprimir nada dentro, cuando deberían estar los aminoácidos.

Gracias.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $contador = 0;
  2. @codon    = ();
  3. while ( $contador < 20 ) {
  4.     $contador += 1;
  5.     $espermatozoide = "espermatozoide$contador.txt";
  6.     open( FH, "$espermatozoide" ) or die "No se puede abrir";
  7.     open( FH2, " > result$contador.txt" );
  8.     while ( $linea = <FH> ) {
  9.         $codon = substr( $linea, 0, 3 );
  10.         push( @codones, $codon );
  11.         print FH2 "@codones ";
  12.     }
  13.     @codones = ();
  14. }
  15. print "hecho";
  16. close(FH);
  17. close(FH2);
  18. while ( $contador < 20 ) {
  19.     $contador += 1;
  20.     open( RE,  "result$contador.txt" )           or die "No se puede abrir\n";
  21.     open( RE2, ">+resultadofinal$contador.txt" ) or die "No se puede abrir\n";
  22.     chomp( @lineas = <RE> );
  23.     my ($line);
  24.     foreach $line (@lineas) {
  25.         if ( $line =~ "CAG TTA" ) { print RE2 "CONTIENE ALANINA" }
  26.     }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-05-14 21:37 @942, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
gallinaclueca
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-11 12:50 @576

Re: Acumulación de texto

Notapor explorer » 2012-05-14 21:39 @944

¿Qué valor tiene $contador cuando Perl llega a la línea 18? :wink:
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Acumulación de texto

Notapor gallinaclueca » 2012-05-15 13:12 @592

Perdón, me confundí de código. El código que tengo para este problema es este. La duda que tengo es como representar el "espacio en blanco" en if ($linea2 =~ "CTA TGA") pues si pongo solo CTA me devuelve el resultado positivo, pero si hay espacio en medio no, y sí que hay en el archivo de texto.

$contador = 0;
@codones = ();
while ($contador < 20){
$contador += 1;
$espermatozoide = "espermatozoide$contador.txt";
open (FH, "$espermatozoide") or die "No se puede abrir";
open (FH2, " > result$contador.txt");
while ( $linea = <FH> ){
$codon = substr ($linea, 0, 3);
push (@codones, $codon);
print FH2 "@codones ";
}
@codones = ();
}
print "Hecho\n";
close (FH);
close (FH2);
$contador2 = 0;
while ($contador2 < 20) {
$contador2 += 1;
$result = "result$contador.txt";
open (FH2, "$result") or die "No se pudo abrir el archivo";
open (FH3, " > aminoacidos$contador2.txt");
while ($linea2 = <FH2>) {
if ($linea2 =~ "CTT TGA") {
print FH3 "Tenemos Alanina\n";
}
}
}
close (FH2);
close (FH3);
gallinaclueca
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-11 12:50 @576

Re: Acumulación de texto

Notapor explorer » 2012-05-15 13:26 @601

Es que no estás haciendo una expresión regular. Aunque estés usando el operador =~, en la parte derecha no hay un operador que contenga un patrón. Tienes puesto una simple cadena de caracteres.

Entonces, debes hacerlo de una de estas dos formas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ( $linea2 = <FH2> ) {
  2.     if ( $linea2 =~ /CTT TGA/ ) {
  3.         print FH3 "Tenemos Alanina\n";
  4.     }
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ( $linea2 = <FH2> ) {
  2.     if ( index($linea2, 'CTT TGA') > -1 ) {
  3.         print FH3 "Tenemos Alanina\n";
  4.     }
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La más rápida y eficiente es la segunda, ya que solo realiza una búsqueda lineal, sin tener que recrear un patrón de expresión regular.

P.D. Acostúmbrate, por favor, en marcar tu código Perl. Hay un botón llamado así, mientras estás editando los mensajes. Así, el código sale en fuente monoespaciada y con colorines. ¿No te gustan los colorines :?:
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Acumulación de texto

Notapor gallinaclueca » 2012-05-15 13:36 @608

He probado de ambas formas y sigue sin funcionarme. En los archivos aminoacido$contador2 correspondientes al filehandle FH3 no se me guarda nada en ninguno de los 20 y al menos en el 1, hay una secuencia 'CTT TGA'.
gallinaclueca
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-11 12:50 @576

Re: Acumulación de texto

Notapor gallinaclueca » 2012-05-18 10:04 @461

Si ninguna de tus formas funciona, ¿cómo hago para que me reconozca el if() una porción de texto separada por espacios?
gallinaclueca
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-11 12:50 @576

Re: Acumulación de texto

Notapor explorer » 2012-05-18 10:23 @474

m/texto1\s+texto2/

El '\s+' quiere decir "uno o más de caracteres catalogados como 'espacio en blanco'".

Si no te funcionan mis soluciones, es porque Perl no ha encontrado esos patrones en las líneas que has leído.

A mí, desde luego, sí que funcionan... pero es porque en las pruebas tengo alguna línea que coincide con ese patrón.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

AnteriorSiguiente

Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado