Página 1 de 1

Problema con los ORF y expresiones regulares

NotaPublicado: 2011-12-08 11:07 @505
por Diego3D
Hola a todos

Soy alumno de la carrera de Bioinformática en Chile y soy nuevo en el foro :)

Resulta que me dieron una tarea de encontrar todos los ORF de la secuencia de un genoma, usando sólo expresiones regulares.Yo para eso ocupé la siguiente sentencia:

my @orfs = ( $sequence =~ m/(ATG(?:[ACTG]{3})+?(TAA|TAG|TGA))/g);

Esto me resulta bien, pero tiene un puro detalle. Cuando encuentra un codón de inicio junto a un codón de STOP, se salta ese codón y corta la secuencia en el STOP siguiente.

Ejemplo:

ATG-TAA-ATG-TGA-TGA

Si se fijan, hay un TAA al lado de ATG y no corta hasta que encuentra el próximo codón de STOP.

Salvo ese problema lo demás funciona muy bien.

De antemano, gracias por la ayuda :D

Re: Problema con los ORF y expresiones regulares

NotaPublicado: 2011-12-08 12:30 @562
por explorer
Bienvenido a los foros de Perl en español, Diego3D.

El problema está en el '+', que obliga a que exista al menos un codón intermedio.

Cámbialo por '*'.

En tiempos, yo usaba esta línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ($adn=~/(ATG(?:.{3})*?)(TAA|TAG|TGA|.{1,3}$)/g) {
  2.     ...;
  3. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Es igual que la tuya, pero contemplaba además el caso de capturar un ORF abierto, al final de la secuencia.

Con el .{1,3}$ estamos indicando que hemos llegado al final de la secuencia, y que puede haber entre una y tres bases (no importa cuáles), pero lo importante es que son el final ($).

Re: Problema con los ORF y expresiones regulares

NotaPublicado: 2011-12-08 13:29 @603
por Diego3D
¡Muchas gracias!

Me funcionó :)

Ahora se me presentó otro problema, eso sí :(

Estoy trabajando con el genoma de Nanoarchaeum equitans Kin4-M, y según NCBI esta proteína tiene 540 aa; sin embargo, mi código dice que tiene 244. No sé a qué se puede deber esta diferencia porque yo no le veo el error en la detección del marco de lectura.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. # Leer el fichero
  6. open SEQFILE, 'AE017199.fasta' or die "$!\n";
  7. my @lines = <SEQFILE>;
  8. close SEQFILE;
  9. my @protarr;
  10. my $sequence;
  11.  
  12. foreach (@lines) {
  13.     next if /^\s*$/;
  14.     next if /^\s*#/;
  15.     next if /^>/;
  16.     chomp($_);
  17.     $sequence .= $_;
  18. }
  19.  
  20. my $i = 0;
  21. my @orfs = ( $sequence =~ /(ATG(?:.{3})*?)(TAA|TAG|TGA|.{1,3}$)/g );
  22.  
  23. foreach my $orf (@orfs) {
  24.  
  25.     if ( ( length($orf) / 3 ) >= 80 ) {
  26.         my @tripletes = ( $orf =~ m/\w{3}/g );
  27.         my $nueva_secuencia = join "-", @tripletes;
  28.         print $orf. "\n\n";
  29.         $i++;
  30.     }
  31. }
  32. print $i. "\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Este es mi código.

P.D.:

Ya solucioné todos mis problemas. :)

Resulta que no había tomado en cuenta la hebra complementaria.

Muchas gracias por la ayuda :)

Re: Problema con los ORF y expresiones regulares

NotaPublicado: 2011-12-08 16:12 @717
por explorer
Creo que hay un error en el código...

my @orfs = ( $sequence =~ /(ATG(?:.{3})*?)(TAA|TAG|TGA|.{1,3}$)/g );

¿Seguro que estás sacando bien las secuencias ORF?

Bueno, creo que sí... lo que pasa es que está un poco liado con los paréntesis de captura.

Mejor así (no probado):

my @orfs = $sequence =~ /(ATG(?:.{3})*?(?:TAA|TAG|TGA|.{1,3}$))/g;

De esta manera, solo hay par de paréntesis de captura, que es lo que almacenamos en @orfs.

Y los paréntesis que rodeaban a la expresión regular, sobraba.