#!/usr/bin/perl -w
# Aquest programa ha estat optimitzat per la Paula de Prado, Judit Faus, Patricia Jiménez i Anna Palomar.

use strict;

print "Benvingut al programa d'anotació de selenoproteines per Odobenus_rosmarus_divergens. Per continuar, premi enter\n";
<>;


# INTRODUCCIÓ DE LA QUERY
my $query;
print "Introdueixi el nom de la query (sense extensió.fa):";
$query = <STDIN>;
chomp $query;

#Canviar U per X

my $s;
my @v;
my $l;
my $ent;
my $sor;

open ($ent, "<$query/$query.fa");
open ($sor, ">$query/${query}_U.fa");

while (<$ent>){
	@v = split ("",$_);
	$s = 0;
	$l = scalar(@v);
	while ($l > 0){
		if ($v[$s] eq 'U'){
			$v[$s] = 'X';			
		}
		$s = $s + 1;
		$l = $l - 1;
	}
	print $sor @v;

}

close ($ent);
close ($sor);

print "S'han canviat les U's per X en la query\n";
print "Prem enter per realitzar el blast\n";
<>;

# REALITZACIÓ DEL BLAST

if (-e "$query/BLAST/$query.blast") {
	print "Ja hi ha un blast per aquesta proteïna,so sorry\n";
} 
else {

	system ("mkdir $query/BLAST");

	print "Fes un cafetó mentre es crea el blast, estarà tot correcte, don't worry be happy\n"; 

	system ("blastall -p tblastn -i $query/${query}_U.fa -d /cursos/BI/genomes/2015/Odobenus_rosmarus_divergens/genome.fa -o $query/BLAST/$query.blast -m8 -e 0.0001");
 
	print "Campió tens el teu Blast! Prem enter per continuar amb el FASTAFETCH\n";
	<>;

}

#REALITZACIÓ FASTAFETCH


if (-e "$query/FETCH"){
	print "Ja hi ha un fetch per aquesta query, so sorry\n";
} 
else {
	system ("mkdir $query/FETCH"); 
    	system ("cut $query/BLAST/$query.blast -s -f 2 > $query/FETCH/regions.txt");
    	open ('regions', "<$query/FETCH/regions.txt");
	my @v = <regions>;
	close ('regions');
	my $f = 0;	
	for (@v){
		chomp;
       		system ("fastafetch /cursos/BI/genomes/2015/Odobenus_rosmarus_divergens/genome.fa /cursos/BI/genomes/2015/Odobenus_rosmarus_divergens/genome.index '$_' > '$query/FETCH/$_.txt'");		
		$f = $f + 1;
	}
	
	print "Ets molt crack i tens els Fetch on hi ha els hits,en són $f\n";

}
print "Prem enter per fer els fastasubseq\n";
<>;


#REALITZACIÓ FASTASUBSEQ

my $pos_start;
my $pos_stop;
my $start;
my $length;
my $numcaracter;
my $numregiocar;
my $longdef;
my $i;
my %hits;
$i = 0;

if ( -e "$query/SUBSEQ") {
	print "Ja tens els teus hits YO!\n";
}

else {

	system ("mkdir $query/SUBSEQ");
	open ('BLAST', "<$query/BLAST/$query.blast");
	while (<BLAST>){

		#Tall de cada línia del blast

		chomp; 
		next if ($_ =~ m/^#/);
		my @blast = split ("\t", $_); 

		# Establiment de les posicions d'inici i final. Es té en compte si el sentit és positiu o negatiu.
  		if ($blast[8] < $blast[9]) {
			$pos_start = $blast[8];
			$pos_stop = $blast[9];
    		}
    		else {
			$pos_start = $blast[9];
			$pos_stop = $blast[8];
    		}

		if (exists($hits{$blast[1]})){
   
		# Actualització de les posicions start i stop.
   		if ($hits{$blast[1]}{"START"} > $pos_start){
		    $hits{$blast[1]}{"START"} = $pos_start;
			}
    		if ($hits{$blast[1]}{"STOP"} < $pos_stop){
		    $hits{$blast[1]}{"STOP"} = $pos_stop;
			}
  		}
  		else{
   		
		# Inicialització de les posicions d'inici i final.
   		$hits{$blast[1]}{"START"} = $pos_start;
    		$hits{$blast[1]}{"STOP"} = $pos_stop;
  		}

		# Guardem el nombre de caràcters total de cada fitxer fetch a l'arxiu caracterseq.txt
		system ("wc '$query/FETCH/${blast[1]}.txt' -m > '$query/SUBSEQ/caracterseq.txt' ");
		system ("cut -d ' ' -f1 '$query/SUBSEQ/caracterseq.txt' > '$query/SUBSEQ/numcaracter.txt' ");

		#Guardem el nombre caràcters del nom de la regió a l'arxiu numregiocar.txt
		system ("grep '>' './$query/FETCH/${blast[1]}.txt' > '$query/SUBSEQ/nomregio.txt' ");
		system ("wc '$query/SUBSEQ/nomregio.txt' -m > '$query/SUBSEQ/caracternom.txt' ");
		system ("cut -d ' ' -f1 '$query/SUBSEQ/caracternom.txt' > '$query/SUBSEQ/numregiocar.txt' ");

		#Posem la longitud del scaffold amb el nom a la variable $numcaracter

		open ('caracter', "<$query/SUBSEQ/numcaracter.txt");
		my $numcaracter = <caracter>;
		close ('caracter');
		$numcaracter = $numcaracter - 1;

		#Posem la longitud del nom de la regió a la variable $numregiocar
	
		open ('regcaracter', "<$query/SUBSEQ/numregiocar.txt");
		my $numregiocar = <regcaracter>;
		close ('regcaracter');
		$numregiocar = $numregiocar - 1;

		#Posem la longitud definitiva del scaffold en la variable $longdef

		$longdef = $numcaracter - $numregiocar;

		# Es procedeix a esborrar tots els arxius intermitjos generats
		system ("rm '$query/SUBSEQ/caracterseq.txt' "); 
		system ("rm '$query/SUBSEQ/numcaracter.txt' ");
		system ("rm '$query/SUBSEQ/nomregio.txt' "); 
		system ("rm '$query/SUBSEQ/caracternom.txt' "); 
		system ("rm '$query/SUBSEQ/numregiocar.txt' ");

		#Establim el marge de 25000 i Es comparar $start + $length amb la longitud del scaffold sense el nom, i si és més gran farem que $length adquireixi el valor de (longitud de l'scaffold menys $stop).

		$start = $pos_start - 25000;
		if ($start < 0) {
			$start = 0;
		}
		$length = $pos_stop - $pos_start + 25000;
		if ($length > $longdef) {
			$length = $longdef - $pos_start; 
		}
		
		# Crida de la comanda Fastasubseq
		system ("fastasubseq '$query/FETCH/${blast[1]}.txt' $start $length > '$query/SUBSEQ/${blast[1]}_${i}_subseq.txt' ");

		$i = $i + 1;
	}

close (BLAST);
}

print "Ara sí que ho has petat,els teus hits estan a la carpeta SUBSEQ\n";

print "Prem enter si ets un valent i vols descobrir si els teus hits codifiquen per una proteïna\n";
<>;

#REALITZACIÓ DE L'EXONERATE

my $file;
my $subseq_file;

if (-e "$query/EXONERATE"){
		print "Ja s'ha fet exonerate per aquesta query\n";
}
else {

	system ("mkdir $query/EXONERATE");
	system ("mkdir $query/EXONERATE/GFF");
	system ("mkdir $query/EXONERATE/cDNAGFF");
	system ("mkdir $query/EXONERATE/cDNAFA");
	system ("mkdir $query/EXONERATE/TRANSLATED");

	opendir (SUBSEQ, "$query/SUBSEQ/");
	while ($file = readdir (SUBSEQ)){
		next if ($file =~ m/^\./);
		chomp $file;
		$subseq_file = $file;
		$subseq_file =~ s/\_subseq.txt//g;
		chomp $subseq_file;
		system ("exonerate -m p2g --showtargetgff -q '$query/${query}_U.fa' -t '$query/SUBSEQ/$file' --exhaustive yes > '$query/EXONERATE/GFF/$subseq_file.gff'");
		system ("egrep -w exon '$query/EXONERATE/GFF/$subseq_file.gff' > '$query/EXONERATE/cDNAGFF/${subseq_file}_cDNA.gff'");
		system (" fastaseqfromGFF.pl '$query/SUBSEQ/$file' '$query/EXONERATE/cDNAGFF/${subseq_file}_cDNA.gff' > '$query/EXONERATE/cDNAFA/${subseq_file}_cDNA.fa' ");
		system (" fastatranslate '$query/EXONERATE/cDNAFA/${subseq_file}_cDNA.fa' > '$query/EXONERATE/TRANSLATED/${subseq_file}_aa.fa'");

	}
}

print "Ja tens els teus cDNA's done i la seva traducció, sensi\n";

print "Prem enter per continuar amb T-coffee\n";
<>;



#REALITZACIÓ T-COFFEE

my $y = 1;
my $arxiu;
my $tcoffee_file;

if (-e "$query/TCOFFEE/RESULTS"){
	print "Ja has fet el teu coffee, ara ves a pel cafetó\n";
}

else {
	system ("mkdir $query/TCOFFEE");
	system ("mkdir $query/TCOFFEE/TRANSLATED");
	system ("mkdir $query/TCOFFEE/RESULTS");
	opendir (TRADUITS, "$query/EXONERATE/TRANSLATED/");
	while ($arxiu = readdir(TRADUITS)){
		next if ($arxiu =~ m/^\./);
		chomp $arxiu;
		$tcoffee_file = $arxiu;
		$tcoffee_file =~ s/\_aa.fa//g;
		chomp $tcoffee_file;
		system ("fastatranslate -F 1 '$query/EXONERATE/cDNAFA/${tcoffee_file}_cDNA.fa' > '$query/TCOFFEE/TRANSLATED/${query}_${y}.fa' ");
		
		#Canviar "*" per X

		my $p;
		my @f;
		my $r;
		my $entrada;
		my $sortida;

		open ($entrada, "<$query/TCOFFEE/TRANSLATED/${query}_${y}.fa");
		open ($sortida, ">$query/TCOFFEE/TRANSLATED/${query}_${y}_X.fa");

		while (<$entrada>){
			@f = split ("",$_);
			$p = 0;
			$r = scalar(@f);
		while ($r > 0){
			if ($f[$p] eq '*'){
			$f[$p] = 'X';			
			}
		$p = $p + 1;
		$r = $r - 1;
		}
		print $sortida @f;

		}

		close ($entrada);
		close ($sortida);

		print "S'han canviat els * per X en la query\n";
		
		system ("t_coffee $query/${query}_U.fa '$query/TCOFFEE/TRANSLATED/${query}_${y}_X.fa' > $query/TCOFFEE/RESULTS/${query}_${y}_tcoffee.txt "); 

	$y = $y + 1;
	}
}

print "Ja tens els resultats del T-coffee!!!!!!¡¡¡¡¡¡¡ Ja pots començar a interpretar els resultats\n";
