El trabajo consiste en, dado un fichero FASTA identificar todos los ORF tanto en sentido normal como inverso ("reverse"). El problema está en que no me encuentra todos los ORF que debería. Sin embargo, los que encuentra coinciden con la solución. Por ejemplo, mi ORF nº 1 equivale al ORF nº 7 del resultado.
Gracias de antemano; necesito ayuda.
Pego aquí el bucle que me lee el programa:
Using perl Syntax Highlighting
- $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; #Posicion inicial
- my $posf = 0; #Posicion final
- for (my $i = 0; $i < length $fasta; $i=$i+3) {
- my $str ="";
- $a = substr ($fasta, $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; #Pon el indicador a uno ----->Ahora estamos dentro de un orf
- $posi = $i+1;
- }
- if ($indica_orf == 1) { #Si estamos dentro de un orf
- $str = modulo::codon($a); #modulo::codon -> llamamos a la funcion codon del paquete.
- $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 (codones de terminacion)
- #Y estemos dentro de un orf
- if ($indica_orf == 1) {
- $indica_orf = 0; #Sal del orf
- $orf=$orf."\n"; #Pon un salto de linea
- if ((length $orf)*3 >= $n) { #$n = $ARGV[2] -> numero que se introduce como parametro.
- push (@var, $orf); #Si la longitud del orf por 3 (porque un aminoacido vale tres codones) es mayor que n, guarda el orf
- $count++; #Va contando los orf mayores q n
- $posf = $i;
- print SALIDA "$cabecera_numerica"."_"."$count [$posi - $posf]$cabecera_infor"; #Cabecera (con su contador y sus cosas)
- print SALIDA modulo::linea ($orf); #Llamada a una funcion para que me imprima un salto de linea cada 60 nucleotido (imprimi bonito)que no funciona
- }
- }
- $orf = "";
- }
- }
- #############REVERSE##############
- #Exactamente lo mismo, pero al revés (mismo problema)
- my $indica_reverse = 0;
- my $inicio = 0;
- my $fin =0;
- my $str_rvs = "";
- my $orf_rvs = "";
- $fasta_reverse = reverse $fasta;
- for (my $i = 0; $i < length $fasta_reverse; $i = $i+3) {
- my $a = substr ($fasta_reverse, $i, 3);
- if (($a eq 'ATG')and($indica_reverse == 0)) {
- $indica_reverse = 1;
- $inicio = $i +1;
- }
- if ($indica_reverse ==1) {
- $str_rvs = modulo::codon($a);
- $orf_rvs = $orf_rvs.$str_rvs;
- }
- if ($a =~ /TA[AG]|TGA/) {
- if ($indica_reverse ==1) {
- $indica_reverse = 0;
- $orf_rvs = $orf_rvs."\n";
- if ((length $orf_rvs)*3 > $n) {
- push ($orf_rvs, @var);
- $fin = $i;
- $count++;
- print SALIDA "$cabecera_numerica"."_"."$count [$inicio - $fin]"."(REVERSE SENSE)"."$cabecera";
- print SALIDA linea::modulo($orf_rvs);
- }
- }
- $orf_rvs = "";
- }
- }
- close FASTA;
- close SALIDA;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4