#!/usr/bin/perl -w

use strict;


my $input_file;                                      #el fichero que leera el programa
my @seq;                                             #el vector que corresponde a cada fasta
my $seq;
my @aa =("A","R","N","D","C","E","Q","G","H","I","L","K","M","F","P","S","T","W","Y","V");
my $i;                                               #recorre el vector @seq
my $cont;	                                     #cuenta el numero de repeticiones para cada aa
my $f;						     #recorre el vector @aa 
my $contdesi;				             #contador que enumera el numero de repeticiones general, si es cero, secuencia sin repeticiones
my $id;
my $longitud;                                        #es el numero de aa del vector
my $detector;	                                     #para diferenciar lineas que siguen a un fasta valido de la primera linea vacia
 

if (scalar(@ARGV) < 1) {                             #si al ejecutar el programa no has dado el nombre del fichero,imprime error y cierra
	
	print STDERR "entrar: nom_del_programa fitxer\n";
	exit(1);
	}

$input_file=$ARGV[0];                                         #llama input file al fichero que esta en la posicion 0 del vector argv


print "input_file: $input_file\n";                            #imprime el fichero que se ha abierto para ejecutar el programa


 
  open(IN,"<$input_file") || die " cannot open input file\n"; #si el fichero no se puede abrir, imprime esto y cierra el programa
   
$detector = 0;

while() {                                                 #mientras haya lineas para leer
  
           
	if (($_ =~m/(ENSP[0-9]+)/)||($_ =~m/(SINFRUP[0-9]+)/)||($_ =~m/(ENSGALP[0-9]+)/)||($_ =~m/(GSTENP[0-9]+)/))  {
    
	
    $id = $1;
    $detector = 1;
            
    $seq = "";             #para cada bucle esta variable se vacia, para que cada primera linea de las seq se concatene con la siguiente  
     
    }
  
             #################################################################################################################
             #     Las lineas que no son fasta, las concatenamos unas con otras y cada aa lo ponemos en una posicion del     #
             #                                                    vector                                                     #
             #################################################################################################################
         	 

else {

  if ($detector == 1) {                                    #si es una sec fasta


   chomp $_;                                               #quitale el return 

   $seq = $seq.$_;                                         #concatena las lineas
   
   $seq = uc($seq);                                        #pasa todos los aa a mayusculas

   @seq = split(//,$seq);                                  #cada aa tendra una posicion en el vector seq


         $i=0;                                   
	 $f=0;
	 $cont=0;
	 $contdesi = 0;
         $longitud = scalar(@seq);
        
while ($f < scalar (@aa)) {                                #recorre el vector aa

               while ($i < scalar (@seq)) {                #recorre todo el vector seq
		       

		   if ($seq[$i] eq $aa[$f]) {              #si el aa que toca es igual al que estamos analizando, 
	
		       if ($i !=(scalar(@seq) - 1)) {      # y si no es el ultimo elemento del vector

			   $cont = $cont + 1;              #cuentalo
			   
			   $i = $i + 1;                    #y analiza el siguiente
		       }
	       
		       else {                              #si es el ultimo
	    
			   $cont = $cont + 1;              #cuentalo

			   if ($cont > 4) {                #si el contador es cinco o mas  imprime

			       print "$id\t $longitud\t SI\t $aa[$f]\t $cont\n";
			       $contdesi = $contdesi + 1;  #el contador de si, ya no es cero 
			       $cont = 0;                  #poner a cero el contador de cada aa
			   }
			   else {                          #si no es el ultimo
			       $cont = 0;                  #pon el contador a cero
			   }
			   $i = $i + 1;                    #analiza el siguiente aa del vector seq
		       }
		   }
	    
 
		   else {                                  #el aa es diferente
 
		       if ($i != (scalar(@seq) - 1)) {     #es diferente, pero no es el ultimo del vector
	
			   if ($cont > 4) {                #si el contador es mayor de 4, imprime  
			       print "$id\t $longitud\t SI\t $aa[$f]\t $cont\n";
			       $contdesi = $contdesi + 1;  #el contador de si,ya no es cero
			       $cont = 0;                  #ponemos el contador a cero para cambiar de aa
			       $i = $i + 1;                #cambiamos de aa en el vector seq
			   }
			   else {                          #es diferente, pero es el ultimo del vector   
			       $cont = 0;                  #el contador a 0
			       $i = $i + 1;                #cambiamos de aa en el vector seq 
			   }
	
		       }

		       else {                              #si es el ultimo elemento del vector#
	      
			   if ($cont < 5) {                #el contador lleva contados menos que cinco aa iguales,ponlo a cero
			       $cont = 0;			        
			   }   
			   else {                          # el contador es mayor que cinco, imprime el valor
			       print "$id\t $longitud\t SI\t $aa[$f]\t $cont\n";
			       $contdesi = $contdesi + 1;  #el contador de si ya no es ceroy pon el contador a cero
			       $cont = 0;                  #pon el contador de repeticiones para cada aa,  a 0
			   }
			   $i = $i + 1;                    #cambiamos de aa en el vector seq
		       }
		   }
	       } 

 	       $f= $f + 1;                                 #cambio de aa que analizamos
	       $i = 0;                                     #empezamos de la posicion 0 de la secuencia

	   }

	 if ($contdesi == 0) {                             #si despues de analizar la seq para los 20 aa, no hay ninguna repeticion
	     print "$id\t $longitud\t NO\n";
         }
	}
   
    }
  }
}

close (IN);