• Publicidad

Acumulación de texto

Perl aplicado a la bioinformática

Re: Acumulación de texto

Notapor gallinaclueca » 2012-05-18 10:53 @495

No sé en qué consiste esto del '\s+' :S ¿cómo lo utilizo? Me refiero a que yo quiero que si el archivo tiene la secuencia de texto 'CTT TGA' me haga la condición del if(). ¿Cómo aplico la expresión '\s+' para hacer esto?
gallinaclueca
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-11 12:50 @576

Publicidad

Re: Acumulación de texto

Notapor explorer » 2012-05-18 11:44 @531

El patrón '\s+' solo tiene significado dentro de una expresión regular, así que tienes que aplicarlo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ( $linea2 = <FH2> ) {
  2.     if ( $linea2 =~ /CTT\s+TGA/ ) {
  3.         print FH3 "Tenemos Alanina\n";
  4.     }
  5. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Dices que con un solo carácter espacio no te ha funcionado, así que con '\s+' esperamos detectar más de un carácter en blanco (tabuladores y retornos de carro incluidos).

Quizás sería más fácil si nos mandarás un adjunto con unas pocas líneas de cómo es la entrada que quieres procesar. Así veríamos si hay espacios en blanco u otra cosa.

P.D. ¿seguro que lo que buscas está en mayúsculas? A ver si va a ser eso...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Acumulación de texto

Notapor gallinaclueca » 2012-05-18 12:00 @541

Sigue sin funcionarme lo que me dices :S pero he conseguido resolverlo mediante concatenación.

He hecho esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($linea2 =~ "GAC"." "."GAT") {
  2.     print FH3 "Asp\n";
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De este modo sí me imprime Asp en el archivo aminoácidos.

(Aquí te pongo Asp del mismo modo que antes te ponía tenemos Alanina).

El problema no era cuestión de mayúsculas, ¡je,je! Malo fuera que no me hubiese dado cuenta de eso siendo una secuencia de bases nitrogenadas.

Pues va a ser que no funciona lo que acabo de poner pues aunque ponga letras que sé que no aparecen sigue imprimiéndome el resultado :shock: me estoy desesperando.

Te subo uno de los archivos de los que recogemos las bases para que lo veas a ver si el problema está ahí:
Adjuntos
result1.txt
(350.3 KiB) 108 veces
gallinaclueca
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-11 12:50 @576

Re: Acumulación de texto

Notapor gallinaclueca » 2012-05-18 12:26 @560

Me he dado cuenta de que poniendo entre paréntesis la condición if ($linea2 =~ (....)) solo nos reconoce un triplete (ej: reconoce CGA, pero no CGA ATT).

En cambio si no ponemos paréntesis, siempre nos imprime el resultado, se cumpla o no la condición (ej.: if ($linea2 =~ "CTA"." "."gato" Obviamente gato no está en el archivo pero aún así nos imprime el resultado) No entiendo nada :S
gallinaclueca
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-11 12:50 @576

Re: Acumulación de texto

Notapor explorer » 2012-05-18 13:07 @588

El problema es el siguiente: el archivo no tiene varias líneas, sino que solo tiene una línea.

Hay que hacer unos cambios...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. # Detector de tripletes de aminoácidos
  3. # Joaquín Ferrero, 20120518
  4. use strict;
  5. use warnings;
  6. use diagnostics;
  7. use autodie;                    # «Es mejor morir que regresar con deshonor» --proverbio Klingon
  8.  
  9. my %tripletes = (
  10.     'CAG TTA' => 'Alanina',
  11.     'CTT TGA' => 'Alanina',
  12.     'GAC GAT' => 'Asp',
  13. );
  14.  
  15. open my $SEQS, '<', 'result1.txt';
  16.  
  17. while (my $linea = readline $SEQS) {                    # para todas las líneas del archivo (si hubieran)
  18.     chomp $linea;
  19.  
  20.     for my $triplete (keys %tripletes) {                # para todos los tripletes que buscamos
  21.  
  22.         my $pos = index $linea, $triplete;
  23.  
  24.         if ($pos != -1) {                               # ¿hay alguno?
  25.  
  26.             print "contiene $tripletes{$triplete} en posición $pos\n";
  27.         }
  28.     }
  29. }
  30.  
  31. close $SEQS;
  32.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Con este programa, sale el siguiente resultado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
contiene Asp en posición 7072
contiene Alanina en posición 52
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Usamos un hash para relacionar los tripletes que buscamos con el nombre que queremos imprimir.
Leemos cada línea del archivo de entrada (aunque sabemos que solo hay una), y por cada triplete a buscar, lo hacemos con index(), que nos localiza rápidamente lo que queremos.

Y en cuanto a que te sale una cosa distinta cada vez que pruebas... pues porque Perl es muy liberal en cuanto a lo que admite como sintaxis correcta, pero no siempre lo que escribimos es lo que queremos que Perl haga. Hay que escribir siempre la sintaxis correcta. Y las expresiones regulares tienen sus reglas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Acumulación de texto

Notapor gallinaclueca » 2012-05-20 15:18 @679

La verdad que no consigo entender bien el código que me has puesto. Está por encima del nivel que tengo en Perl que es bastante básico, la verdad. ¿No hay alguna forma más simple de reconocer porciones de texto?
gallinaclueca
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-11 12:50 @576

Re: Acumulación de texto

Notapor explorer » 2012-05-20 16:50 @743

Solo estaba utilizando un hash para almacenar los tripletes que iba a buscar.

La clave está en el index() de la línea 22. Lo he probado y funciona: sí que localiza los tripletes separados por un espacio. E incluso nos dice en qué posición está.

Usar index() es lo más básico para hacer búsquedas.

Prueba:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open my $SEQS, '<', 'result1.txt';
  2. my $sq=<$SEQS>;
  3. close   $SEQS;
  4.  
  5. $pos = index($sq, 'GAC GAT');
  6.  
  7. if ($pos != -1) {
  8.     print "Encontrada Asp en la secuencia, en posición $pos\n";
  9. }
  10. else {
  11.     print "No se encontró Asp\n";
  12. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Más información sobre los hash en perldoc perldata (traducido)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Acumulación de texto

Notapor gallinaclueca » 2012-05-21 10:20 @472

Los hash si que los controlo medianamente bien, y la función index no la conocía pero es sencilla de entender, lo que no entiendo es para que sirve if ($pos != -1)
gallinaclueca
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-11 12:50 @576

Re: Acumulación de texto

Notapor gallinaclueca » 2012-05-21 10:44 @488

Los hash sí que los controlo medianamente bien, y la función index() no la conocía pero es sencilla de entender. Lo que no entiendo es para qué sirve if ($pos != -1).

Independientemente de que lo entienda o no, he probado con tu código de dos formas distintas, de una me funciona y de otra no, pero hay matices. ¡je,je!

Primera forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $contador = 0;
  2. while ( $contador < 20 ) {
  3.     $contador += 1;
  4.     $espermatozoide = "espermatozoide$contador.txt";
  5.     open( FH, "$espermatozoide" ) or die "No se puede abrir";
  6.     open( FH2, " > result$contador.txt" );
  7.     while ( $linea = <FH> ) {
  8.         $codon = substr( $linea, 0, 3 );
  9.         push( @codones, $codon );
  10.         print FH2 "@codones ";
  11.     }
  12.     @codones = ();
  13. }
  14. print "Hecho\n";
  15. close(FH);
  16. close(FH2);
  17. $contador2 = 0;
  18. while ( $contador2 < 20 ) {
  19.     $contador2 += 1;
  20.     $result = "result$contador.txt";
  21.     open( FH2, "$result" ) or die "No se pudo abrir el archivo";
  22.     open( FH3, " > aminoacidos$contador2.txt" );
  23.  
  24.     while ( $linea2 = <FH2> ) {
  25.  
  26.         $ala = index( $linea2, 'TGA GAA TAG TAA' );
  27.         if ( $ala != -1 ) {
  28.             print FH3 "Hay Alanina en la posición $ala\n";
  29.         }
  30.     }
  31. }
  32.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De esta forma no me funciona, es decir, la secuencia 'TGA GAA', etc. está al menos en el archivo result1.txt (hay desde result1 a result20.txt) y no me imprime nada. Con mi siguiente intento creo haber localizado el problema pero solucionándolo creo otros dos.

Segunda forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $contador = 0;
  2. while ( $contador < 20 ) {
  3.     $contador += 1;
  4.     $espermatozoide = "espermatozoide$contador.txt";
  5.     open( FH, "$espermatozoide" ) or die "No se puede abrir";
  6.     open( FH2, " > result$contador.txt" );
  7.     while ( $linea = <FH> ) {
  8.         $codon = substr( $linea, 0, 3 );
  9.         push( @codones, $codon );
  10.         print FH2 "@codones ";
  11.     }
  12.     @codones = ();
  13. }
  14. print "Hecho\n";
  15. close(FH);
  16. close(FH2);
  17. $contador2 = 0;
  18.  
  19. while ( $contador2 < 20 ) {
  20.     $contador2 += 1;
  21.     $result = "result1.txt";
  22.     open( FH2, "$result" ) or die "No se pudo abrir el archivo";
  23.     open( FH3, " > aminoacidos$contador2.txt" );
  24.  
  25.     while ( $linea2 = <FH2> ) {
  26.  
  27.         $ala = index( $linea2, 'TGA GAA TAG TAA' );
  28.         if ( $ala != -1 ) {
  29.             print FH3 "Hay Alanina en la posición $ala\n";
  30.         }
  31.     }
  32. }
  33.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


De este modo sí que me funciona. El problema es que me limito a un solo archivo result y no solo a los 20. El otro problema es que me lo imprime en todos los archivos aminoácido cuando debería hacerlo solo en el 1. ¿Cómo puedo solucionar esto?
gallinaclueca
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-11 12:50 @576

Re: Acumulación de texto

Notapor explorer » 2012-05-21 11:58 @540

El valor que devuelve index() es la posición en donde localiza la subcadena, desde el valor 0 hasta la última posición de la cadena. Si no lo encuentra, devuelve -1.

El problema que tienes en el segundo código es que $result siempre vale lo mismo (línea 21).

Y no estás buscando por 'TGA GAA', sino por 'TGA GAA TAG TAA' (los cuatro codones al mismo tiempo y en esas posiciones).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Anterior

Volver a Bioinformática

¿Quién está conectado?

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

cron