• Publicidad

Problema con los ORF y expresiones regulares

Perl aplicado a la bioinformática

Problema con los ORF y expresiones regulares

Notapor Diego3D » 2011-12-08 11:07 @505

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
Diego3D
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2011-12-08 10:58 @498

Publicidad

Re: Problema con los ORF y expresiones regulares

Notapor explorer » 2011-12-08 12:30 @562

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.002 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 ($).
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: Problema con los ORF y expresiones regulares

Notapor Diego3D » 2011-12-08 13:29 @603

¡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.001 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 :)
Última edición por explorer el 2011-12-08 16:01 @709, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
Diego3D
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2011-12-08 10:58 @498

Re: Problema con los ORF y expresiones regulares

Notapor explorer » 2011-12-08 16:12 @717

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.
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


Volver a Bioinformática

¿Quién está conectado?

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