• Publicidad

Buscar secuencias en ficheros

Perl aplicado a la bioinformática

Buscar secuencias en ficheros

Notapor Marielago » 2011-01-21 09:35 @441

¡Hola! ¡Nuevamente necesito ayuda! Bueno, lo que ocurre es que tengo un archivo de esta manera (mucho más largo, de unas 22200 líneas)

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
gn0058461_int_gn0085512
\ACAAACACAATTCACTCATCGGACCCGCTGGTTCCGGCTAC/
gn0020660_int_gn0260994
\TTAAAAATAAATAAAAATAAAGAAAATATATAAATCTATGAC/
gn0260994_int_gn0046706
\GACAACTTGGAGGAGACACCCGGCGGACCCGGAATCCAAGTC/
_int_gn0031208
\CGACAATGCACGACAGAGGAAGCAGAACAGATATTTAGATTG/
gn0031208_int_gn0002121
\AAAAACAATGCGAATAGGGACGTATTAATTGCCGAATCTCT/
gn0002121_int_gn0031209
\GTGCCCGTGTATCTCTATCGAAAAAATCATATATTTTTTAGA/
gn0031209_int_gn0051973
\ATCGAGCGCAAGTTTGGAGTTCGATGTGTTTTCAGCTGTGAGC/
gn0051973_int_gn0067779
\GTGCGGACGAGTGTCTTGAGACTCTGGGCAAGCGCAGCCAGCCA/
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y un archivo similar pero contiene solo nombres, no las secuencias. Hice un código que lee nombres en archivo que contiene los nombres y los busca en el segundo archivo (el que muestro) y si lo encuentra, copia nombre y la secuencia, pero en ese caso lo hice separando en el archivo que contiene nombres y secuencias (nombre y la secuencia separados por un tabulador no por un salto de línea), pero es muy largo el archivo para modificarlo, por lo que quisiera saber si puedo modificar mi código para que busque en un archivo de la forma que muestro más arriba, es decir que si encuentra el nombre copie esa línea del nombre y la línea siguiente que contiene la secuencia.

¿Cómo se podría hacer eso?

¡Ah!, olvidé adjuntar el código que llevaba

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %nombre;
  2.  
  3.  
  4. open my $ARCHIVO_1, q[<], 'salidan5.sence';
  5.  
  6.  
  7. while (my $linea = <$ARCHIVO_1>) {
  8.         chomp $linea;
  9.     $nombre {$linea} = 1;
  10.  
  11. }
  12.  
  13. open my $OUT, q[>], 'salida';
  14.  
  15. open my $ARCHIVO_2, q[<], 'dmel.interg.nuc';
  16.  
  17. while (<$ARCHIVO_2>) {
  18.  
  19.   my $columna_nombre = (split q[ ])[0];
  20.  
  21.  
  22.   if( $nombre  {$columna_nombre }) {  
  23.  
  24.         print $OUT $_;                  
  25.  
  26.     }
  27.  
  28. }
  29.  
  30. close $ARCHIVO_1;
  31. close $ARCHIVO_2;
  32.  
  33. ##################
  34. close $OUT;
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4
Marielago
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-01-14 08:26 @393

Publicidad

Re: Buscar secuencias en ficheros

Notapor explorer » 2011-01-21 10:15 @468

Te vale con leer la línea siguiente en el caso de que encuentres el nombre que buscas. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3.  
  4. # Leemos los nombres de las secuencias a leer
  5. my @nombres_a_buscar = qw(
  6.     gn0260994_int_gn0046706
  7.     _int_gn0031208
  8.     gn0002121_int_gn0031209
  9.     gn0031209_int_gn0051973
  10. );
  11.  
  12. # Leemos el fichero con las secuencias
  13. while (my $nombre = <DATA>) {                   # por cada línea del fichero
  14.     chomp $nombre;
  15.    
  16.     if ($nombre ~~ @nombres_a_buscar) {         # si el $nombre de la secuencia está dentro de las que buscamos
  17.         my $secuencia = <DATA>;                 # leemos la $secuencia (es la línea siguiente)
  18.         print "$nombre => $secuencia";          # y la sacamos fuera
  19.     }
  20. }
  21.  
  22. __DATA__
  23. gn0058461_int_gn0085512
  24. \ACAAACACAATTCACTCATCGGACCCGCTGGTTCCGGCTAC/
  25. gn0020660_int_gn0260994
  26. \TTAAAAATAAATAAAAATAAAGAAAATATATAAATCTATGAC/
  27. gn0260994_int_gn0046706
  28. \GACAACTTGGAGGAGACACCCGGCGGACCCGGAATCCAAGTC/
  29. _int_gn0031208
  30. \CGACAATGCACGACAGAGGAAGCAGAACAGATATTTAGATTG/
  31. gn0031208_int_gn0002121
  32. \AAAAACAATGCGAATAGGGACGTATTAATTGCCGAATCTCT/
  33. gn0002121_int_gn0031209
  34. \GTGCCCGTGTATCTCTATCGAAAAAATCATATATTTTTTAGA/
  35. gn0031209_int_gn0051973
  36. \ATCGAGCGCAAGTTTGGAGTTCGATGTGTTTTCAGCTGTGAGC/
  37. gn0051973_int_gn0067779
  38. \GTGCGGACGAGTGTCTTGAGACTCTGGGCAAGCGCAGCCAGCCA/
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
gn0260994_int_gn0046706 => \GACAACTTGGAGGAGACACCCGGCGGACCCGGAATCCAAGTC/
_int_gn0031208 => \CGACAATGCACGACAGAGGAAGCAGAACAGATATTTAGATTG/
gn0002121_int_gn0031209 => \GTGCCCGTGTATCTCTATCGAAAAAATCATATATTTTTTAGA/
gn0031209_int_gn0051973 => \ATCGAGCGCAAGTTTGGAGTTCGATGTGTTTTCAGCTGTGAGC/
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


También lo puedes hacer con hash, que es lo normal, y lo más eficiente y como lo estabas haciendo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3.  
  4. # Leemos los nombres de las secuencias a leer
  5. my @nombres = qw(
  6.     gn0260994_int_gn0046706
  7.     _int_gn0031208
  8.     gn0002121_int_gn0031209
  9.     gn0031209_int_gn0051973
  10. );
  11.  
  12. # Lo pasamos a hash, para ser más efectivo
  13. my %nombres_a_buscar;
  14. @nombres_a_buscar{@nombres} = (1) x @nombres;
  15.  
  16. # Leemos el fichero con las secuencias
  17. while (my $nombre = <DATA>) {                   # por cada línea del fichero
  18.     chomp $nombre;
  19.    
  20.     if ($nombres_a_buscar{$nombre}) {           # si el $nombre de la secuencia está dentro de las que buscamos
  21.         my $secuencia = <DATA>;                 # leemos la $secuencia (es la línea siguiente)
  22.         print "$nombre => $secuencia";          # y la sacamos fuera
  23.     }
  24. }
  25.  
  26. __DATA__
  27. gn0058461_int_gn0085512
  28. \ACAAACACAATTCACTCATCGGACCCGCTGGTTCCGGCTAC/
  29. gn0020660_int_gn0260994
  30. \TTAAAAATAAATAAAAATAAAGAAAATATATAAATCTATGAC/
  31. gn0260994_int_gn0046706
  32. \GACAACTTGGAGGAGACACCCGGCGGACCCGGAATCCAAGTC/
  33. _int_gn0031208
  34. \CGACAATGCACGACAGAGGAAGCAGAACAGATATTTAGATTG/
  35. gn0031208_int_gn0002121
  36. \AAAAACAATGCGAATAGGGACGTATTAATTGCCGAATCTCT/
  37. gn0002121_int_gn0031209
  38. \GTGCCCGTGTATCTCTATCGAAAAAATCATATATTTTTTAGA/
  39. gn0031209_int_gn0051973
  40. \ATCGAGCGCAAGTTTGGAGTTCGATGTGTTTTCAGCTGTGAGC/
  41. gn0051973_int_gn0067779
  42. \GTGCGGACGAGTGTCTTGAGACTCTGGGCAAGCGCAGCCAGCCA/
Coloreado en 0.001 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

Re: Buscar secuencias en ficheros

Notapor Marielago » 2011-01-21 10:38 @485

¡Genial! Ahí veré la mejor opción. Aún me cuesta un poco la magia de Perl :D
Marielago
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-01-14 08:26 @393

Re: Buscar secuencias en ficheros

Notapor cibercop666 » 2011-10-11 15:52 @703

¡¡Hola!! ¡¡Tengo algo similar!!

Tengo 2 archivos, en uno viene solo una secuencia de aminoácidos y en el segundo hay muchas secuencias de aminoácidos en formatos FASTA.

Necesito hacer un script que haga lo mismo que un BLAST, pero sin usar módulos de BLAST, solo un script sencillo.
cibercop666
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-09-22 11:45 @531

Re: Buscar secuencias en ficheros

Notapor explorer » 2011-10-11 17:33 @773

Bienvenido a los foros de Perl en español, cibercop666.

¿Puedes poner un ejemplo de lo que quieres hacer, como ha hecho Marielago?
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

Re: Buscar secuencias en ficheros

Notapor cibercop666 » 2011-10-11 22:30 @979

Sí, claro... Hummm... ¿cómo lo explico?

En el archivo 1 (proteinX.txt) hay algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>proteinX
MARNTLPSITAGEAGLNRYLDEIRKFPMLEPQQEYMLAKRYAEHGDRDAAHKLVTSHLRLVAKIAMGYRG
YGLPIGEV...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


y en archivo 2 (Sigmas_fastaAA.txt) hay algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>gi|1045628|gb|AAC45314.1| RpoE [Escherichia coli]
MSEQ......
>gi|77389093|gb|ABA80278.1| sigma24, RpoE [Rhodobacter sphaeroides 2.4.1]
MTDK.....
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
etc, etc, etc.

Y entre alguna de esas secuencias está una que se asimila mucho a la del archivo 1.

Entonces, lo que quiero hacer es buscar en base a la secuencia de la proteinaX
si está presente y todos los datos (%de homología, % de GC, tamaño).

Lo que llevo es esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Este script encontrará y analizará una secuencia específica\n\n ";
  2. print "¿Cuáles son los nombres de los Archivos a analizar?: \n";
  3.  
  4.  
  5. ########----1er Archivo----#####################
  6.  
  7. print "\tNombre del archivo con la secuencia específica:";
  8.  
  9. chomp($nom_archivo_1 = <STDIN>);          # Nombre de proteína por el usuario
  10.  
  11. open(TEXTO_A, $nom_archivo_1);            # Abrir archivo
  12.   unless (open(TEXTO_A, $nom_archivo_1))  {
  13.          print "No puedo abrir el archivo \"$nom_archivo_1\"!\n\n";
  14.          exit;
  15.         }              
  16.  
  17. @datos_1 = <TEXTO_A>;                     # Leer archivo
  18.  close TEXTO_A;                           # Cerrar archivo
  19. $secuencia_1 = &limp_fasta_1(@datos_1);
  20.  
  21. print "Esta es la secuencia de la secuencia a analizar\n";
  22. print "$secuencia_1\n";
  23.  
  24. #################################################
  25.  
  26. ########----2do Archivo----######################
  27.  
  28. print "\tNombre del archivo con las secuencias donde buscar:";
  29.  
  30. chomp($nom_archivo_2 = <STDIN>);          # Nombre de proteína por el usuario
  31.  
  32. open(TEXTO_B, $nom_archivo_2);            # Abrir archivo
  33.    unless (open(TEXTO_B, $nom_archivo_2))  {
  34.          print "No puedo abrir el archivo \"$nom_archivo_2\"!\n\n";
  35.          exit;
  36.         }
  37.              
  38. @datos_2 = <TEXTO_B>;                     # Leer archivo
  39.  close TEXTO_B;                           # Cerrar archivo
  40.  
  41. $secuencias_2 = &limp_fasta_2(@datos_2);
  42.  
  43.  
  44.  
  45. #################################################
  46. #                                               #
  47. #                 Subrutinas                    #              
  48. #                                               #
  49. #################################################
  50.  
  51. #############################################
  52.  
  53. sub limp_fasta_1 {
  54.     (@datos_1) = @_;
  55.     $secuencia_1 = '';
  56.     foreach my $linea (@datos_1) {
  57.    
  58.       if ($linea =~ /^\s*$/) {       # Descartar líneas en blanco
  59.       next;
  60.      } elsif($linea =~ /^\s*#/) {    # Descartar comentarios de línea
  61.       next;
  62.      } elsif($linea =~ /^>/) {       # Descartar manejadores de línea
  63.       next;
  64.      } else {                       # Mantener la línea y añadirla una cadena
  65.       $secuencia_1 .= $linea;
  66.     }
  67.   }
  68.  
  69.    $secuencia_1 =~ s/\s//g;             # Comenzar  a trabajar
  70.    return $secuencia_1;
  71.  }
  72.  
  73.    
  74. #############################################
  75.  
  76. sub limp_fasta_2 {
  77.     (@datos_2) = @_;
  78.     $secuencia_2 = '';
  79.     foreach my $linea (@datos_2) {
  80.    
  81.       if ($linea =~ /^\s*$/) {       # Descartar líneas en blanco
  82.       next;
  83.      } else {                       # Mantener la línea y añadirla una cadena
  84.       $secuencia_2 .= $linea;
  85.     }
  86.   }
  87.    return $secuencia_2;
  88.  }
  89.  
  90.  
  91. ################################################
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



¡¡Pero no tengo idea de cómo seguirlo!! Sé que podría ser metiendo todo en hash, pero no sé cómo hacerlo.

Te agradezco tu atención y sé que podrás ayudarme.
cibercop666
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-09-22 11:45 @531

Re: Buscar secuencias en ficheros

Notapor explorer » 2011-10-12 16:50 @743

Yo veo un problema en limp_fasta_1()... está despreciando las separaciones de las distintas secuencias, y uniéndolas todas en una sola...
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

Re: Buscar secuencias en ficheros

Notapor cibercop666 » 2011-10-14 09:27 @435

¡je, je, je, je! Intenté resolverlo de otra manera, pero la neta creo que están de más muchas cosas. Por favor ¿podrías ayudarme a corregirlas?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. $indexa=0;
  3. $indexb=0;
  4. $indexc=0;
  5.  
  6. ########----1er Archivo----#####################
  7.  
  8. open(TEXTO_A, $ARGV[0]);                 # Abriri archivo
  9.                
  10.  
  11. @datos_1 = <TEXTO_A>;                     # Leer archivo
  12.  close TEXTO_A;                           # Cerrar archivo
  13.  
  14. foreach $linea_A (@datos_1){
  15.   ($a_1, $a_2, $a_3, $a_4, $a_5, $a_6, $a_7, $a_8) = split (" ",$linea_A);
  16.  
  17.   @a_11[$indexa]=$a_1;
  18.   $indexa=$indexa+1;
  19.  
  20.                            }
  21.                            
  22. ########----2do Archivo----######################
  23.  
  24.  
  25. open(TEXTO_B, $ARGV[1]);                 # Abrir archivo
  26.    
  27.              
  28. @datos_2 = <TEXTO_B>;                    # Leer archivo
  29.  close TEXTO_B;                          # Cerrar archivo
  30.  
  31. foreach $linea_B (@datos_2){
  32.  
  33.   ($b_1, $b_2, $b_3, $b_4, $b_5, $b_6, $b_7, $b_8) = split (" ",$linea_B);
  34.  
  35.   @b_11[$indexb]=$b_1;
  36.  
  37.   $indexb=$indexb+1;  
  38.  
  39.                           }
  40.  
  41. ##################################################
  42.  
  43. open(TEXTO_C, $ARGV[1]);                 # Abrir archivo
  44.    
  45.              
  46. @datos_3 = <TEXTO_C>;                    # Leer archivo
  47.  close TEXTO_C;                          # Cerrar archivo
  48.  
  49. foreach $linea_C (@datos_3){
  50.  
  51.   $indexc=$indexc+1;  
  52.  
  53.                           }
  54.                                                                            
  55. ############  Comparacion ##########################
  56.  
  57. $iblanco=$indexa-1;
  58. $ifuncion=$indexb-1;
  59.  
  60. for ($i = 0;  $i <= $iblanco; $i++) {
  61.        
  62.         for ($j = 0;  $j <= $ifuncion; $j++) {
  63.  
  64.         print "dentro for2\t";
  65.         print $i."\t".$j;
  66.  
  67.                 if (@a_11[$i] =~ @b_11[$j]) {
  68.  
  69.                         print "SOMOS IGUALES!!!\t";
  70.  
  71.                                 open (OUTPUT,">>salida.txt")or die "ERROR: Unable to open salida.txt File!";
  72.                                 select OUTPUT; 
  73. #                               print @a_11[$i].@b_11[$j]."\n";
  74.                                 print @datos_3[$j];
  75.                                 close (OUTPUT);
  76.                                 select STDOUT;
  77.  
  78. #                       print @a_11[$i].@b_11[$j];
  79.                
  80.                 }
  81.  
  82.                 else {print "\tno iguales\t".@a_11[$i]."\t".@b_11[$j]."\n"}
  83.  
  84.  
  85.         }
  86.                                
  87. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
cibercop666
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-09-22 11:45 @531

Re: Buscar secuencias en ficheros

Notapor explorer » 2011-10-14 10:17 @470

Estos son los errores que he encontrado:

  • 17. Es un error escribir

    @a_11[$indexa]=$a_1;

    lo correcto es

    $a_11[$indexa]=$a_1;
  • 35. Tiene el mismo fallo que en la 17
  • 49. Para saber el número de elementos de un array, no es necesario hacer ese bucle. Puedes sustituir las líneas 49 a 53 por

    $indexc = @datos_3;
  • 67. Lo mismo que antes. Lo correcto es

    if ($a_11[$i] eq $b_11[$j]) {
  • 74. Ídem:

    print $datos_3[$j];

    (aquí creo que te falta poner un "\n")
  • 72 y 76. Este jaleo de select() lo puedes obviar. Solo tienes que tener claro qué quieres que se guarde en el fichero y qué quieres que salga por la pantalla.
  • 82. Lo mismo... cambiar '@' por '$'
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

Re: Buscar secuencias en ficheros

Notapor cibercop666 » 2011-10-14 22:25 @976

¡¡¡¡Muchísisisisisimas gracias!!!! ¡¡¡¡Voy a hacer los cambios y te informo!!!!

Pero otra vez: gracias.
cibercop666
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-09-22 11:45 @531

Siguiente

Volver a Bioinformática

¿Quién está conectado?

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