#!/usr/bin/perl -w

use strict;
use warnings;

my $blast = '/home/u9XXXXX/blast';
my $fasta_fetch = '/home/uXXXXX/fasta_fetch';
my $fh;
my $fs;
my $max;
my $min;
my %contig;
my $fila;
my @leng;
my $max50;
my @v;
my $genome = '/cursos/BI/genomes/2015/Scleropages_formosus/genome.fa';
my $index = '/cursos/BI/genomes/2015/Scleropages_formosus/genome.index';
my $fetch = '/home/u9XXXXX/fasta_fetch/sf$numprot.fetch.fa';
my $fasta_subseq ='/home/uXXXXX/fasta_subseq';
my $exonerate = '/home/uXXXXX/exonerate';
my $exonerate_gff= '/home/uXXXXX/exonerate_gff';
my $translate = '/home/uXXXXX/translate';
my $genewise = '/home/uXXXXX/genewise';
my $numprot;


mkdir $fasta_fetch unless -d $fasta_fetch; #crea directori fast fetch
mkdir $fasta_subseq unless -d $fasta_subseq; #crea directori fasta subseq
mkdir $exonerate unless -d $exonerate; #crea directori exonerate
mkdir $exonerate_gff unless -d $exonerate_gff; #crea directori exonerate from gff
mkdir $genewise unless -d $genewise; #crea directori genewise
mkdir $translate unless -d $translate; #crea directori translate

opendir(DIR, $blast) or die "no es pot obrir el directori\n"; #obrim el directori o morim en l'intent
my @files = readdir(DIR); #creem un vector que conte els fitxers (prot i punts) que llegeix dins del directori

foreach my $fitxer (@files){ #per cadascun dels fitxers dins del conjunt del directori entrem en les seguents comandes (ES UN LOOP)
    open($fh, '<:encoding(UTF-8)',"/home/uXXXXX/blast/$fitxer") or die "No es pot obrir el fitxer $fitxer\n"; #obrir o morir si no es pot obrir el fitxer
    my @np = split (//, $fitxer); #creem un vector que contingui el nom del fitxer
    $numprot = $np[2].$np[3].$np[4]; #agafem les posicions del vector que contenen el num de la proteina
    while (my $row = <$fh>) { #mentres que la linia existeixi al fitxer
	chomp $row; #sempre
	@v = split(/\t/,$row); #convertir linia a vector on cada posicio estigui separada per una tabulacio
	    if ($v[9] > $v[8]){ #assignar minim i maxim tenint en compte que pot ser la cadena invertida (per aixo fem l'if i l'else)
		$max = $v[9];
		$min = $v[8];
	    }
	    else{
	        $max = $v[8];
		$min = $v[9];
	    }
       	if (exists($contig{$v[1]})){ #crear un hash. Si el hash te el mateix nom que el contig, assignar a inici i a final al contig. Mentres s'estigui llegint un matei contig, s'allarguen els extrems.
	    if($contig{$v[1]}{"inici"} > $min) {
		$contig{$v[1]}{"inici"} = $min;
	    }
	    if($contig{$v[1]}{"final"} < $max) {
		$contig{$v[1]}{"final"} = $max;	    
	    } 
	}
	else {$contig{$v[1]}{"inici"} = $min; #aixo es perque a la primera volta s'assigni algo, si no peta perque no entra res dins del hash
	     $contig{$v[1]}{"final"} = $max;
	}
	 my $distancia = $max - $min; #calculem quina es la llargada de la sequencia i fem que si es massa llarga - valor arbitrari de 100.000 - ens generi un avis 
	    if ($distancia > 100000){
	       print "epa! la sequencia es molt llarga! al fitxer $fitxer. A veure si ho pots resoldre! ;)\n";
	    }
	    else { #si la llargada de la sequencia es bien, que ens allargui els extrems 50.000 bases per banda (tenint en compte que si l'interval es mes llarg que els extrems, s'ha d'assignar el valor de l'extrem)
		if ($min - 50000 >= 1){
		    $min = $min - 50000;
		}
		else {
		    $min = 1;
	       	    }
		open($fs, '<:encoding(UTF-8)', "/cursos/BI/genomes/2015/Scleropages_formosus/genome.lengths") or die "no es pot obrir el fitxer genome.lengths\n"; #obrir el fitxer que conte la llargada de cada contig. Es mira que el maxim del contig quan li sumem les 50000 bases no  sobreassi la llargada del contig.
		while ($fila = <$fs>) { 
		    chomp $fila;
		    @leng = split(' ', $fila);
		    if ($leng[1] eq $v[1]){ 
			$max50 = $max + 50000;
			if ($leng[0] < $max50){
			    $max = $leng[0];
			}
			else{
			    $max = $max + 50000;
			}
		    }
		    $distancia = $max - $min;
		}
	    }
	system (`fastafetch $genome $index $v[1] > /home/uXXXXX/fasta_fetch/sf$numprot$v[1].fetch.fa`);
	system (`fastasubseq /home/uXXXXX/fasta_fetch/sf$numprot$v[1].fetch.fa $min $distancia > /home/uXXXXX/fasta_subseq/sf$numprot$v[1].subseq.fa`);
	system (`exonerate -m p2g --showtargetgff -q  /home/uXXXXX/prots_senseu/zf$numprot.prot -t /home/uXXXXX/fasta_subseq/sf$numprot$v[1].subseq.fa | egrep -w exon > /home/uXXXXX/exonerate/sf$numprot$v[1].exonerate.gff`); 
	system (`genewise -pep -pretty -cdna -gff /home/uXXXXX/prots_senseu/zf$numprot.prot /home/uXXXXX/fasta_subseq/sf$numprot$v[1].subseq.fa > /home/uXXXXX/genewise/sf$numprot$v[1].genewise`);
	system (`fastaseqfromGFF.pl /home/uXXXXX/fasta_subseq/sf$numprot$v[1].subseq.fa /home/uXXXXX/exonerate/sf$numprot$v[1].exonerate.gff > /home/uXXXXX/exonerate_gff/sf$numprot$v[1].exonerate.cds`); 
	system (`fastatranslate -f /home/uXXXXX/exonerate_gff/sf$numprot$v[1].exonerate.cds -F 1 > /home/uXXXXX/translate/sf$numprot$v[1].prot`); 
    }
}

