#!/usr/bin/perl -w

use strict;

#Lobjectiu daquest programa es filtrar els resultats del programa 3.Molts dels factors de transcripcio obtinguts en Promo i Transfac es troben repetits varies vegades ja que es poden unir en diferents llocs duna mateixa regio. El que volem obtenir es la regio en que es poden unir. Per aixo filtrem amb aquest programa perque ens doni una sola sortida per a cada regio. Aixo ho fem eliminant les entrades que es solapen.   

my $programa; #En aquesta variable registrem el nom del programa del que ve el factor de transcripcio.

my $programadef = ""; #En aquesta variable tambe registrem el nom del programa, en aquest cas quan volem que simprimieixi. 

my $inici; #En aquesta variable registrem l'inici de la sequencia dunio a cada factor de transcripcio.

my $final;#En aquesta variable registrem el final de la sequencia dunio a cada factor de transcripcio.

my $factrans = "";#En aquesta variable registrem el nom del facto de transcripcio

my $factransdef = "";#En aquesta variable registrem el nom del factor de transcripcio en els casos que volem imprimirho (per tant, quan ja tenim linici i el final de cada regio).


my $inicidef = 0;#Aquesta variable la utilitzem per registrar linici de la regio. El valor es el mateix que linici de la primera linia que colloca el factor de transcripcio en la regio que estem definint.

my $finaldef = 0;#Aquesta variable la utilitzem per registrar el final de la regio. El valor es el mateix que el final de la ultima linia que colloca el factor de transcripcio en la regio que estem definint.


my $i = 0; #Ens serveix per recorrer @resultats.

my @resultats;#Es el vector on hi registrem les linies finals amb la informacio de cada regio en format gff.

my $gffFile = "definitiu.gff";#Es el nom del fitxer de sortida del programa.

my $homo = ''; #Utiltizem aqueta variable per concatenar la sequancia de DNA humana en format gff.

my $homo2 = '';#Utiltizem aqueta variable per concatenar la sequancia de DNA humana i poder imprimir en cada linia la regio dunio al factor de transcripcio.

my @nucleotids=();#En aquest vector hi registrem els nucleotids que formen cada una de les regions dunio al factor de transcripcio.

my @hsapiens = (); #En aquest vector hi registrem la sequncia de DNA humana collocant cada nucleotid en una posicio del vector. 

my $c=0;#Aquesta variable serveix per recorrer @hsapiens.

my $inicifiltrat; #Aquesta variable la necessitem per poder imprimir les regions mes conservades en les especies.

my $finalfiltrat;#Aquesta variable la necessitem per poder imprimir les regions mes conservades en les especies.

my $especies;#Aquesta varibale la necessitem per registrar el nombre despecies en que una regio es troba conservada.

#En aquest while el que fem es concatenar tota la sequencia dhomo sapiens en dos vectors. 

open (HOMOS,"<homosapiens.fst");
while (<HOMOS>) {
chomp;

    if($_=~ /^[actgACTG]+/){
	$homo = $homo."##$_\n";
	$homo2 = $homo2."$_";
    }
}

close HOMOS;

#Ara ens disposem a recorrer el FILTRAT i imprimir les regions que es trobin conservades en mes de 6 especies. 

open (FILTRAT,"<filtrat.gff");

while (<FILTRAT>){
 chomp;
    if($_ =~ /^ENSG00000111199\s+alig_[0-9]+_esp\s+alig_[0-9]+_esp\s+([0-9]+)\s+([0-9]+)\s+([6-8])\s+.\s+.(.*)/){
	$inicifiltrat = $1;
	$finalfiltrat = $2;
	$especies = $3;
	$resultats [$i] = "ENSG00000111199\talig_".$especies."_esp\talig_".$especies."_esp\t$inicifiltrat\t$finalfiltrat\t.\t.\t.";
	$i=$i+1;
   }
}
close FILTRAT;

#Recorrem el FINAL per a poder obtenir les regions dunio a factors de transcripcio a partir dels resultats que es solapen.

open (FINAL, "<final.gff");

    while (<FINAL>){ 
	if ($_=~ /^ENSG00000111199\s+([A-Za-z]+)\s+[A-Za-z]+\s+([0-9]+)\s+([0-9]+)\s+\.\s+\.\s+\.\s+([A-Za-z0-9\-\.\/]+)(.*)/){
            
	    $programa = $1;
	    $inici = $2;
	    $final = $3;
	    $factrans = $4;
	       
	    if ($factransdef eq $factrans && $inici <= $finaldef) {
		
       		$finaldef = $final;
	    

	    }	
	    
	    else {
		if($factransdef ne "") {
		    $resultats[$i] = "ENSG00000111199\t$programadef\t$programadef\t$inicidef\t$finaldef\t.\t.\t.\t$factransdef";
		    $i++;
		}
		    $factransdef = $factrans;
		    $finaldef = $final;
		    $inicidef = $inici;
		    $programadef = $programa;
	    }
	}
     }

$resultats[$i] = "ENSG00000111199\t$programa\t$programa\t$inicidef\t$finaldef\t.\t.\t.\t$factransdef";


close FINAL;

open(OUT,">$gffFile");

print OUT "##gff-version 2\n";
print OUT "##programa4\n";
print OUT "##date Wed March 15 20:51:20 2006\n";
print OUT "##DNA ENSG00000111199\n";
print OUT "$homo\n";

$i = 0;

while($i<scalar@resultats) {
    
    print OUT "$resultats[$i]\n"; 
#No imprimim tot el vector de cop perque ens surtia un espai a dalt de tot que no ens interessava.

    $i++;
}

close OUT;
