#!/usr/bin/perl -w

use strict;

#################################################################################################
########### comprovem que el nombre de parametres escrits des del shell son correctes ###########
#################################################################################################


if (scalar(@ARGV) < 1) {
print STDERR "programa.pl <fitxer que volem llegir>\n";
exit(1);
}

#################################################################################################
################################# declaracio de variables #######################################
#################################################################################################

my $selquery;              # enregistra la referencia de la query: selenoproteina amb la que hem fet el blast
my $posquery;              # per emmagatzemar la posicio on es troba la X o * (que son la Sec) a la sequencia query
my $ref;                   # enregistra la referencia de la sequencia subject
my $expect = 0;            # per emmagatzemar l'e-value de l'aliniament
my $query;                 # conte la sequencia query sense format vector
my @query;                 # conte la sequencia query en format de vector
my $posicio;               # per recorrer el vector @query
my $subject;               # conte la sequencia subject sense format vector
my @subject;               # conte la sequencia subject en format de vector
my $d;                     # enregistra el valor de l'e-value que comença per "e"
my $frame;                 # enregistra el valor del frame
my $aaalineats;            # conte la linia amb els aminoacids alineats entre la sequencia query i la subject
my $query_trobat = 0;      # variable binaria que informa sobre si s'ha trobat $query anteriorment ($query_trobat = 1) o no ($query_trobat = 0)


my $fitxer = $ARGV[0];     
open(FILE,"$fitxer");      # anomenem $fitxer al primer element del vector @ARGV, que sera el FILEHANDLE FILE


#################################################################################################
#####################################   cos del programa   ######################################
#################################################################################################

while (<FILE>) {      # per llegir cada linia del filehandle FILE
chomp;


    if (/\A\s+\Z/){next;} # per saltar les linies buides, fent el programa mes eficient


    if ($_=~ m/Query=/g){ 
        $selquery= $_;        # quan la linia del filehandle es correspongui amb l'expressio regular, ens l'enregistrara a $selquery


    }


    if ($_ =~ m/^>/g){ 
        $posquery = 0; # perque $posquery no retingui l'ultim valor de la posicio on hi havia una X o una * a @query, i aixi no podra comparar aquest valor amb la seguent sequencia subject que trobi
        $ref= $_;      # quan la linia del filehandle es correspongui amb l'expressio regular, ens l'enregistrara a $ref

}


    if ($_ =~ m/Expect.*?=.*?([^\s^,]+)/){
        $expect=$1;   # quan la linia del filehandle es correspongui amb l'expressio regular, ens l'enregistrara el valor del e-value a $expect

        if ($expect=~ m/^\s*(e.*)/g){ # quan el valor d'e-value comenci amb una "e", el concatenarem amb un 1 al davant per evitar problemes numerics vistos empiricament
            $d= $1;
 	    $d= "1".$d; 
	    $expect = $d;
        }

    }


    if($_ =~ m/Frame\s*=\s*(..)/){
        $frame = $1;   # quan la linia del filehandle es correspongui amb l'expressio regular, ens enregistra el frame a $frame
    }


    if($_=~ m/Query[^=].*\s*\d+\s*([^\d]+)\s*/g){
        $query=$_;       # quan la linia del filehandle es correspongui amb l'expressio regular, ens l'enregistrara a $query
        $query_trobat=1; # quan hem enregistrat una $query assignem el valor de 1 a $query_trobat, per una condicio que vindra despres
        @query= split(//,$1); # posem cada aminoacid en una posicio del vector @query
        $posicio=0; # assignem el valor de 0 a $posicio per començar a recorrer el vector per la primera posicio

        while ($posicio<scalar(@query)){   # per recorren cada element de @query fins que es trobi una X o un *

            if ($query[$posicio] eq "X" || $query[$posicio] eq "*"){ 
                   $posquery= $posicio;  #per enregistrar a $posquery la posicio de @query que contigui una X o un *
                   $posicio=scalar(@query)+1; # perque un cop haguem trobat la posicio (nomes hi ha una X o un * per sequencia) ens surti del bucle
            }
            else {
                   $posicio=$posicio+1; # per llegir la seguent posicio del vector @query
            }
        }

    }


    if(($query_trobat==1) && ($_ !~ m/^Query/)){
        $aaalineats=$_;  # quan la linia del filehandle es correspongui amb l'expressio regular, ens l'enregistrara a $aaalineats, sempre i quan haguem trobat una $query (implica que $query_trobat==1)
        $query_trobat=0; # tornem a inicialitzar la variable a 0 
    }


    if (($_=~ m/Sbjct:*\s*\d*\s*([^\d]+)\s*/g) && $posquery > 0 ){
        $subject=$_; # quan la linia del filehandle es correspongui amb aquesta expressio regular i la sequencia query contingui una X o un *, ens l'enregistrara a $subject
        @subject=split(//,$1); # posem cada aminoacid en una posicio del vector @query
        $posicio=0; # assignem el valor de 0 a $posicio per començar a recorrer el vector per la primera posicio

        if (( $subject[$posquery]eq"U" || $subject[$posquery]eq"C" || $subject[$posquery]eq"*") && ($expect < 0.1)){ #quan trobem una X o un * a la sequencia query, i una U, una C o un * a la sequencia subject, volem que ens imprimeixi $selquery, $ref, $frame, $expect, $query i $subject

            print "$selquery\n";

            print "$ref" ."xxxx$frame\n";

            print "Expect = $expect\n";

            print "$query\n";

            print "$aaalineats\n";

            print "$subject \n\n============================================\n\n";


         }
     $posquery =0;  # perque $posquery no retingui l'ultim valor de la posicio on hi havia una X o una * a @query
    
     }

}
