Te falta un
Using perl Syntax Highlighting
close MIFICH;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Pero creo que el problema es otro...
Supongamos que tenemos esta secuencia (tomada de la página
Marco abierto de lectura, de la Wikipedia): aactgcagtacgtaacgtca
Generamos las 6 combinaciones de secuencias posibles:
Using text Syntax Highlighting
aactgcagtacgtaacgtca
aactgcagtacgtaacgtca
aactgcagtacgtaacgtca
ttgacgtcatgcattgcagt
ttgacgtcatgcattgcagt
ttgacgtcatgcattgcagt
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Estas secuencias, si los dividimos en codones, darían lugar a secuencias proteicas diferentes, ya que los codones serían distintos (cada secuencia es diferente, por estar desplazada una posición, luego se generan codones distintos).
Bueno... a cada uno de estos marcos le aplicas la expresión regular:
/(ATG(?:.{3})*?(?:TAA|TAG|TGA|.{1,3}$))/gi .
Y aquí está el problema: el patrón que tienes NO tiene en cuenta la posición desplazada de cada secuencia, sino que busca, de forma lineal, dentro de la secuencia, por lo que, es muy, muy posible, que estés encontrando los mismos marcos de lectura abierta.
Ejemplo: tenemos esta secuencia, con un ORF dentro de ella:
aactgcatgacgtaacgtcaEse ORF es encontrado sin problemas por la expresión regular:
Using bash Syntax Highlighting
> perl -E '$seq = "aactgcatgacgtaacgtca"; say $1 while $seq =~ /(ATG(?:.{3})*?(?:TAA|TAG|TGA|.{1,3}$))/gi;'
atgacgtaa
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Ahora, desplazamos la secuencia una posición más a la derecha, y vemos qué ocurre:
_aactgcatgacgtaacgtcaUsing bash Syntax Highlighting
> perl -E '$seq = " aactgcatgacgtaacgtca"; say $1 while $seq =~ /(ATG(?:.{3})*?(?:TAA|TAG|TGA|.{1,3}$))/gi;'
atgacgtaa
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Sale lo mismo... porque a la expresión regular le ha dado lo mismo encontrar la secuencia en la posición seis que en la siete.
Ese es el problema: la expresión regular
sí sabe de codones y sus posiciones múltiples -el subpatrón
(?:.{3})*?-, pero
no tiene en cuenta la
posición inicial del codón de arranque 'ATG'.
Entonces... si el problema es encontrar los ORF en secuencias desplazadas (y sus inversas), lo que hay que hacer es, después del desplazamiento (y reversión) de las secuencias, pasar la secuencia a codones, y a partir de ellos, localizar los ORF.
Aquí tienes un ejemplo sencillo de cómo se podría resolver (sin BioPerl, que ahora mismo no lo tengo instalado):
Using perl Syntax Highlighting
#!/usr/bin/perl
use v5.14;
my $seq = "aactgcatgacgtaacgtccatgacgtagaactcgatcgatcgatcgactgactagcttatagcattacacg";
my $regex_orf_mala = qr/ (ATG(?:.{3})*?(?:TAA|TAG|TGA|.{1,3}$))/xi;
my $regex_orf_buena = qr/\G(?:.{3})*?(ATG(?:.{3})*?(?:TAA|TAG|TGA|.{1,3}$))/i;
(my $seqrev = $seq) =~ tr/atcg/tagc/;
$seqrev = reverse $seqrev;
say "Directa (mala):";
find_orf($seq, $regex_orf_mala);
say "Inversa (mala):";
find_orf($seqrev, $regex_orf_mala);
say;
say "Directa (buena):";
find_orf($seq, $regex_orf_buena);
say "Inversa (buena):";
find_orf($seqrev, $regex_orf_buena);
sub find_orf {
my($seq, $regex) = @_;
#say "Analizando [$seq] con [$regex]";
for my $d (0..2) {
my $s = ' ' x $d . $seq;
say "$d : [$1]" while $s =~ /$regex/g;
}
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
La salida es:
Using text Syntax Highlighting
Directa (mala):
0 : [atgacgtaa]
0 : [atgacgtag]
1 : [atgacgtaa]
1 : [atgacgtag]
2 : [atgacgtaa]
2 : [atgacgtag]
Inversa (mala):
0 : [atgctataa]
0 : [atggacgttacgtcatgcagtt]
1 : [atgctataa]
1 : [atggacgttacgtcatgcagtt]
2 : [atgctataa]
2 : [atggacgttacgtcatgcagtt]
Directa (buena):
0 : [atgacgtaa]
1 : [atgacgtag]
Inversa (buena):
0 : [atgctataa]
1 : [atggacgttacgtcatgcagtt]
2 : [atgcagtt]
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Observa cómo la primera regex localiza la misma secuencia, tres veces.
Un detalle importante, también: esta solución no tiene en cuenta el caso de que quieras buscar los ORF que están incluidos unos dentro de otros (el caso de encontrarse varios codones de arranque que terminan en el mismo codón de terminación). Si ese fuera también el caso... habría que hacer un ajuste más fino para la búsqueda de codones.