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

################################################ CANVI U PER X #################################

my $selenozf="/home/u93280/Escriptori/treballbioinfo/selenozf"; #assignem a la variable selenozf els fitxers que es troben dins el directori selenozf
my $file_protzf;
				
opendir my $dh, $selenozf or die "Could not open '$selenozf' for reading: $!\n";		#obrim el directori on es troben els fitxers que contenen les selenoproteines de zebrafish. Si no es pot obrir, el programa mor.
my @filtered_files;							 

    while ($file_protzf = readdir $dh) { #Assignes un fitxer del directori a la variable file_protzf per treballar sobre aquest. Aixo ho faras per tots els fitxers del directori
       
 	if ($file_protzf =~ /.fasta$/){ #si el fitxer acaba amb l'extensio .fasta, entra a l'if. Aixo ens permet descartar fitxers extranys, ocults...
system ("mkdir -p ./selenozf_mod"); #creem un directori on aniran tots els fitxers modificats, que ja tinguin la U reemplaçada per la X

open (FASTA, "./selenozf/$file_protzf") or die "can't open '$file_protzf'\n"; #Obrim el fitxer original
my $new_filename = "./selenozf_mod/$file_protzf.m";		# Nom amb el que anomenare el fitxer de sortida
open(OUTPUT, ">", $new_filename);						# Obro l'output per escriure-hi
while(<FASTA>) {								# Llegeixo linia per linia
										
										# l'identificador no el canvio pero tambe l'imprimeixo al fitxer de sortida
	
	if (/^>/) {
		print OUTPUT $_;
	}

	elsif ($_ !~/^>/){								# Si no comenca amb el simbol ">"
		s/U/X/g;
		s/@//g;
		s/#//g;
		s/%//g;							# La variable "$_" és cada linia per defecte. El que faig es mirar si hi ha U i substuir-les per X, i si hi ha un @,# o % ho elimina.
		print OUTPUT $_;	
	}
}
close(OUTPUT);
}
}
########################################### BLAST ##############################################

my $selenozf_mod="./selenozf_mod"; #assignem a la variable selenozf_mod els fitxers que es troben en el directori selenozf_mod
				
opendir my $dir, $selenozf_mod or die "Could not open '$selenozf_mod' for reading: $!\n";#obrim el directori. Si no es pot, el programa mor.
my @filtered_fitxers;									 

    while (my $file = readdir $dir) { #Assignes un fitxer del directori a la variable file per treballar sobre aquest. Aixo ho faras per tots els fitxers del directori
	next if ($file =~ m/^\./); #saltes els fitxers que comencin per punt. Així evites incloure en el porcés fitxers extranys, ocults...
	system("mkdir -p ./$file"); #creem un directori amb el nom de la proteina amb la que estem treballant. Dins aquest directori es guardaran tots els documents que es generin a partir d'ara.
	system("blastall -p tblastn -i $selenozf_mod/$file -d /cursos/BI/genomes/2015/Periophthalmodon_schlosseri/genome.fa -m8 -e 0.01 > ./$file/${file}_blast.fa");	#Fem el blast per a la proteina. 

print "Blast has succeeded for $file zebra fish selenoprotein\n"; #Un cop acabat, printem el missatge informatiu.

########################################fastafetch######################################
system ("cut ./$file/${file}_blast.fa -s -f 2 > ./$file/cromosomes.txt"); #tallem la segona columna del fitxer resultant del blast, que conté els noms dels cromosomes dels hits per a aquella proteina, i els posem en un fitxer de text.
open (CROMOSOMA,"<./$file/cromosomes.txt"); #obrim el fitxer de text amb els noms dels cromosomes.
my @cromosomes = <CROMOSOMA>; #passem els noms dels cromosomes del fitxer de text a un array.
close (CROMOSOMA); #tanquem el fitxer de text amb els noms.
for (@cromosomes) { #per cada posicio de l'array, es a dir, per cada cromosoma:
chomp;
system ("mkdir -p ./$file/fastafetch"); #creem un directori on guardarem el resultat del fastafetch.
system ("fastafetch /cursos/BI/genomes/2015/Periophthalmodon_schlosseri/genome.fa PS.index $_ > ./$file/fastafetch/${_}_seq.fa"); #fem el fastafetch. El fitxer resultant es guardara dins la carpeta fastafetch amb el nom del cromosoma.
}
print "fastafetch has succeeded\n"; #Un cop acabat, printem el missatge informatiu.


##################Definicio de la strand##############################

open (BLAST, "<./$file/${file}_blast.fa"); #obrim el blast.
my %strand;
my $a;
my @blast;

while (<BLAST>) { #Llegim cada lina del blast:
chomp;
next if ($_ =~ m/^#/); #expressio regular que permet evitar fitxers extranys del directori que comencin pel signe #
@blast = split("\t",$_); #Posem en un array els diferents camps de la linia del blast. Cada camp, separat en el blast per una tabulacio, quedara en una posicio diferent de l'array.
if ($blast[8] < $blast[9]){ 
	$strand{$blast[1]} = 1;
} #En cas que la posicio 8 del blast sigui mes petita que la posicio 9, considerem que es tracta d'una sequencia de strand positiva (1).

else {
	$strand{$blast[1]} = 2;
} #En cas que la posicio 8 del blast sigui mes gran que la posicio 9, considerem que es tracta d'una sequencia de strand negativa (2). 
}

close (BLAST);

#En aquesta espècie en concret, els cromosomes son molt curts (tenen una extensio entre 200 i 111000 nucleotids). Es per aixo que no tindria sentit realitzar el fastasubseq despres del fastafetch: el resultat del fastasubseq seria identic al del fastafetch en la majoria de casos, i descartariem una quantitat molt petita de nucleotids en els cromosomes mes llargs. 

#Creem les carpetes que necessitarem a partir d'ara.

system ("mkdir -p ./$file/exonerate");
system ("mkdir -p ./$file/exonerate/GFF");
system ("mkdir -p ./$file/exonerate/fastaseqfromGFF");
system ("mkdir -p ./$file/exonerate/fastatranslate");
system ("mkdir -p ./$file/genewise");
system ("mkdir -p ./$file/tcoffee");

#####################EXONERATE###########################  

my $fastafetch="./$file/fastafetch"; #assignem a la variable fastafetch els fitxers que es troben dins el directori fastafetch
				
opendir my $fss, $fastafetch or die "Could not open '$fastafetch' for reading: $!\n";		#obrim el directori. Si no es pot obrir, el programa mor.
my @filtered_fastafetch;									 

    while (my $file_fss = readdir $fss) { #Assignes un fitxer del directori a la variable file_fss per treballar sobre aquest. Aixo ho faras per tots els fitxers del directori
	next if ($file_fss =~ m/^\./); #Destartem els fitxers extranys, ocults...
	chomp $file_fss;	
	my $prot = $file_fss; #assignem a la variable prot el nom del fitxer. La variable prot nomes servira per donar nom al fitxer de sortida.
	$prot =~ s/\_seq.fa//g; #eliminem l'extensio del fitxer d'origen.
	chomp $prot;

system ("exonerate -m p2g --showtargetgff -q $selenozf_mod/$file -t './$file/fastafetch/$file_fss' --exhaustive > './$file/exonerate/GFF/$prot.fullexonerate.gff'"); 
system ("egrep -w exon './$file/exonerate/GFF/$prot.fullexonerate.gff' > './$file/exonerate/GFF/$prot.exonerate.gff'"); #Fem l'exonerate.

system ("fastaseqfromGFF.pl './$file/fastafetch/$file_fss' './$file/exonerate/GFF/$prot.exonerate.gff' > './$file/exonerate/fastaseqfromGFF/${prot}_ps.nt.cds'");

system ("fastatranslate -F 1 './$file/exonerate/fastaseqfromGFF/${prot}_ps.nt.cds' > './$file/exonerate/fastatranslate/${prot}_ps.aa.fa'");

}
print "Exonerate has been created\n"; #Un cop acabat, printem el missatge informatiu.

################################# CANVI * PER X #########################################

my $fastatranslate="./$file/exonerate/fastatranslate"; #assignem a la variable fastatranslate els fitxers que es troben dins el directori fastatranslate
				
opendir my $ft, $fastatranslate or die "Could not open '$fastatranslate' for reading: $!\n";		#obrim el directori.  Si no es pot obrir, el programa mor.
my @filtered_doc;									 

    while (my $file_fastatranslate = readdir $ft) { #Assignes un fitxer del directori a la variable file_fastatranslate per treballar sobre aquest. Aixo ho faras per tots els fitxers del directori
	next if ($file_fastatranslate =~ m/^\./); #evites els fitxers extranys, ocults...
	system("mkdir -p ./$file/exonerate/fastatranslate_mod"); #creem un directori on aniran els fitxers que ja tinguin el * canviat per una X.
open (TRANS, "./$file/exonerate/fastatranslate/$file_fastatranslate") or die "can't open '$file_fastatranslate'\n";
my $new_nom = "./$file/exonerate/fastatranslate_mod/$file_fastatranslate.m";		# Nom amb el que anomenare el fitxer de sortida
open(OUTPUT, ">", $new_nom);						# Obro l'output per escriure-hi
while(<TRANS>) {								# Llegeixo linia per linia
										
										# l'identificador no el canvio pero tambe l'imprimeixo al fitxer de sortida
	
	if (/^>/) {
		print OUTPUT $_;
	}

	elsif ($_ !~/^>/){								# Si no comença amb el simbol ">"
		s/\*/X/g;							# La variable "$_" es cada linia per defecte. El que faig es mirar si hi ha * i substuir per X	
		print OUTPUT $_;	
	}
}
close(OUTPUT);
}

######################## T-COFFEE ###########################

my $fastatranslate_mod="./$file/exonerate/fastatranslate_mod"; #assignem a la variable fastatranslate_mod els fitxers que es troben dins el directori fastatranslate_mod
				
opendir my $fm, $fastatranslate_mod or die "Could not open '$fastatranslate_mod' for reading: $!\n";		#obrim el directori. Si no es pot obrir, el programa mor.
my @filtered_arxius;									 

    while (my $file_fastatranslate_mod = readdir $fm) { #Assignes un fitxer del directori a la variable file per treballa sobre aquest. Aixo ho faras per tots els fitxers del directori
	next if ($file_fastatranslate_mod =~ m/^\./);

system ("t_coffee $selenozf_mod/$file './$file/exonerate/fastatranslate_mod/$file_fastatranslate_mod' > './$file/tcoffee/$file_fastatranslate_mod.tcoffee' ");
}
print "t-coffee has succeeded\n"; #Un cop acabat, printem el missatge informatiu.

###########################genewise##########################

my $fastafetch1="./$file/fastafetch"; #assignem a la variable fastasubseq els fitxers que es troben dins el directori fastasubseq
				
opendir my $fss1, $fastafetch1 or die "Could not open '$fastafetch1' for reading: $!\n";		#obrim el directori on es troben els fitxers que contenen les selenoproteines de zebrafish. Si no es pot obrir, el programa mor.
my @filtered_fastafetch1;									 

    while (my $file_fss1 = readdir $fss1) { #Assignes un fitxer del directori a la variable file per treballa sobre aquest. Aixo ho faras per tots els fitxers del directori
	next if ($file_fss1 =~ m/^\./); #evitem els fitxers extranys, ocults...
	chomp $file_fss1;	
	my $prot1 = $file_fss1; #assignem a la variable prot1 el nom del fitxer. La variable prot1 nomes servira per donar nom al fitxer de sortida.
	$prot1 =~ s/\_seq.fa//g; #eliminem l'extensio del fitxer d'origen.
	chomp $prot1;

	if ($strand{$blast[1]} == 1) {
		system("genewise -pretty -cdna -gff $selenozf_mod/$file './$file/fastafetch/$file_fss1' > './$file/genewise/$prot1.genwise'");
		}
#Si la strand es positiva, fem el genewise sense la opcio -trev.

	else {
		system("genewise -pretty -cdna -gff $selenozf_mod/$file './$file/fastafetch/$file_fss1' -trev > './$file/genewise/$prot1.genwise'");
		}
	}
#Si la strand es negativa, fem el genewise amb la opcio -trev.

print "Genewise has succeeded\n"; #Un cop acabat, printem el missatge informatiu.


#Creem els directoris html i aln dins del directori de cada proteina. Posteriorment, movem els arxius html i aln que s'han creat amb el t-coffee dins aquests directoris.
system ("mkdir -p ./$file/html");
system ("mkdir -p ./$file/aln");

my $nom = $file;
	$nom =~ s/\.m//g;

system ("mv $nom.html $file/html");
system ("mv $nom.aln $file/aln");

} # tanca while inicial
