Página 1 de 1

Encontrar secuencia y contar de tres en tres

NotaPublicado: 2015-06-15 07:16 @344
por perl biología
Buenas tardes. He conseguido que mi programa lea de tres en tres una secuencia y otro programa que me encuentre la secuencia ATG y me diga dónde está.

Ahora estoy tratando de que dada una secuencia, me encuentre la secuencia ATG y cuente de tres en tres a partir de ATG.

#!/usr/bin/perl
$secuencia = 'AAAATGCGGTTATGCCCATGGGTAAGTG';
$indica_orf = 0; #Indicada cuando encuentra un orf
$orf = "";
my @var = (); #La usamos para guardar los orfn
my $count = 0; #Contador de orf
my $posi = 0; #Posición inicial
my $posf = 0; #Posición final
for (my $i = 0; $i < length $secuencia; $i=$i+3) {
my $str ="";
$a = substr ($secuencia, $i, 3); #Para que me vaya leyendo las letras de 3 en 3.
if (($a eq 'ATG') and ($indica_orf == 0)) { #Si $a es igual a ATG y el indicador esta a 0
$indica_orf = 1;
$posi = $i+1;
}
if ($indica_orf == 1) { #Si estamos dentro de un orf
$str = ($a);
$orf = $orf.$str; #Sustituye las 3 letras de a por su valor y va concatenando
}
if ( $a =~ /TA[AG]|TGA/i ) { #Cuando a sea igual a TAA TAG o TGA
if ($indica_orf == 1) {
$indica_orf = 0; #Sal del orf
}
}

$orf = "";

Llegado aquí me he liado un poco y me da error. ¿Me podríais ayudar?
¡¡¡Gracias!!!

Re: Encontrar secuencia y contar de tres en tres

NotaPublicado: 2015-06-15 09:12 @425
por explorer
En el código pones que la captura debe pararse por la detección del final de un ORF. Pero eso no coincide con lo que dices en el comienzo de tu comentario, que pides buscar desde el primer ATG hasta el final.

Re: Encontrar secuencia y contar de tres en tres

NotaPublicado: 2015-06-15 10:11 @466
por perl biología
No sé a qué te refieres, yo quiero que me lea la secuencia a partir de ATG para ver si está en fase hasta que encuentre la secuencia de parada.

Es que dada la secuencia, intento que me cuente de tres en tres a partir de ATG hasta la secuencia de parada.

Pero me da error, y ya no sé qué más cambiarle ya que lo estoy intentando de varias formas.

Lo que quiero es que me muestre si está en fase o no.

Disculpe por las molestias y ante todo muchas gracias.

ORF

NotaPublicado: 2015-06-15 14:41 @653
por perl biología
He diseñado un programa que dada un secuencia, encuentra el triplete de inicio ATG y el de parada.

#!/usr/bin/perl
use strict;
use warnings;

# Leer el fichero

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

foreach my $orf (@orfs) {

{
my @tripletes = ( $orf =~ m/\w{3}/g );
my $nueva_secuencia = join "-", @tripletes;
print $orf. "\n\n";
$i++;
}
}
print $i. "\n";

En este caso me sale por el terminal:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
i@usuario ~
$ ./prueba.pl
ATGCCCTTTATGGGGTTT

TAG

2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

que sería la secuencia empezando por ATG hasta llegar al codón de parada TAG. Me muestra también el codón de parada TAG.

Pero tengo un problema que no entiendo: ¿Qué significa el 2 que sale por el terminal?

Cuando cambio la secuencia y pongo 'AAATTTTTTATGCGCCTTTATGGGGTTTTAGTGACCCGGGTG y no está en fase me saldría esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
i@usuario ~
$ ./prueba.pl
ATGCGCCTTTATGGGGTTTTAGTGACCCGG

GTG

2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


por lo que ahora me sale GTG que no es el codón de parada, y me muestra la secuencia desde ATG hasta el codón final.

Yo quería que sólo me muestre la secuencia de tres en tres a partir de ATG hasta el codón de parada. ¿Qué me está fallando?

Muchas gracias.

Re: Encontrar secuencia y contar de tres en tres

NotaPublicado: 2015-06-15 17:11 @758
por explorer
A ver... dices que has diseñado un programa, pero que no sabes de dónde sale el último '2'... ¿no es extraño? Más bien suena a que has cogido retales de programas y los estás intentando casar :)

El '2' sale del último print(), indicando que son dos ORF los encontrados.

Por otra parte, la secuencia de tripletas (codones) está almacenada en la variable $nueva_secuencia, que ni siquiera llegas a mostrar en pantalla.

Yo creo que lo que quieres es esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4.  
  5. #my $sequence = 'AAATTTTTTATGCCCTTTATGGGGTTTTAGTGACCCGGGTG';
  6. my $sequence = 'AAATTTTTTATGCGCCTTTATGGGGTTTTAGTGACCCGGGTG';
  7.  
  8. my @orfs = $sequence =~ /\G(?:.{3})*?(ATG(?:.{3})*?(?:TAA|TAG|TGA|.{1,3}$))/g;
  9.  
  10. foreach my $orf (@orfs) {
  11.  
  12.     my @tripletes = $orf =~ m/(\w{3})/g;
  13.  
  14.     my $nueva_secuencia = join "-", @tripletes;
  15.  
  16.     print "$nueva_secuencia\n\n";
  17. }
  18.  
  19. print "Encontradas ", scalar(@orfs), " secuencias\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Ahí estoy utilizando la expresión regular de este otro comentario, que sirve para localizar secuencias siempre en múltiplo de 3 posiciones. Si no fuera por el ancla '\G', podríamos encontrar secuencias fuera de ese orden.

Y el segundo caso, en el que no se encuentra codón de parada, pues por defecto se devuelve desde ATG hasta el final. Si no es lo que quieres, pues entonces habrá que tener un caso especial y modificar el programa.

Re: Encontrar secuencia y contar de tres en tres

NotaPublicado: 2015-06-16 06:38 @318
por perl biología
El dos sé que sale del último print, solo que lo que yo quería que me mostrase no me lo mostraba y no entendía bien por qué me salía el dos, y cuando no, me daba 0 al modificar la secuencia.

Pero ante la duda lo quité ya que no llegaba a mi fin.

Gracias por la corrección.