#!/usr/bin/perl -w

use strict;

#Lobjectiu daquest programa es utilitzar la informacio de la conservacio de nucleotids en les 13 sequencies, i la informacio propocionada per Promo i Transfac per decidir queins son els resulatts que considerem mes fiables. Per tant, es tracta de filtrar els lloca amb mes probabilitat de ser regions on s'hi uneixen factors de transcripcio.

my $inicipromo;  #En aquesta variable hi colloquem el lloc dinici que ens dona Promo per la unio dels factors de transcripcio.

my $finalpromo; #En aquesta variable hi colloquem el lloc final que ens dona Promo per la unio dels factors de transcripcio.

my $factrans = (); #En aquesta variable hi colloquem el nom del factor de transcripcio que ens dona Promo o Transfac, segons el fitxer que estiguem llegint. 	
my $inicifiltrat; #En aquesta variable hi colloquem el lloc dinici de les regions conservades que ens dona el segon programa del treball. 

my $finalfiltrat;#En aquesta variable hi colloquem el lloc final de les regions conservades que ens dona el segon programa del treball. 

my $inicitransfac;#En aquesta variable hi colloquem el lloc dinici que ens dona Transfac per la unio dels factors de transcripcio.

my $finaltransfac; #En aquesta variable hi colloquem el lloc dinici que ens dona Transfac per la unio dels factors de transcripcio.

my $final; #Aquesta variable la fem servir per a calcular la posicio final dunio al factor de transcripcio que ens dona Transfac, ja que el programa no ens dona la posicio final. La calculem utilitzant la posicio inicial i la llargada de la sequencia que el mateix programa ens propociona. 

my $seq; #Es la variable que utiitzem per a registrar la sequencia que ens dona Transfac. Aquesta sequencia la dividirem per a posar cada nucleotid en un lloc del vector @sequencies.

my @sequencies=(); #Es el vector que utiltizem per emmagatzemar la regio dunio al factor de transcripcio que ens dona Transfac. Llavors obtindrem lescalar daquest vector i sabrem quina es la posicio final de la regio.

my $longitud; #Aquesta variable sutilitza per registrar la longitud dels possibles llocs dunio a factors de transcripcio que ens donen  Promo i Transfac. Aixi podem restringir la mida i  no utilitzar resultats de molt poca longitud, ja que podrien ser poc especifics i per tant erronis.

my $especies; #Aquesta variable la utilitzem per registrar el nombre despecies en que cada nucleotid esta conservat.

my @resultats; #Aquest es el vector en que registrem els resultats. En cada posicio hi haura la informacio sobre una regio conservada obtinguda amb SMM Castillo-Davis o amb una regio predida per Promo o Transfac. El format es gff per a poder obtenir posteriorment el grafic.  

my $i = 0; #Aquesta variable ens permet recorrer @resultats per tal danarlo omplint o per imprimirlo.

my $homo =''; #En aqueta varible hi concatenem la sequencia dhomo sapiens per tal de poderla posar al fitxer gff.

my $gffFile = "final.gff";

open (PROMO,"<promo.txt");
open (FILTRAT,"<filtrat.gff");
open (TRANSFAC,"<transfac.txt");

#En els seguents while i if el que fem es llegir els tres fitxers dentrada (filtrat, promo i transfac) i enregistrar en varibles les dades que ens interessen per al posterior print en format gff.  

while (<PROMO>){ 
chomp;

     if($_ =~ /^12\|ENSG00000111199|protein_coding;\s+([A-Za-z0-9\/\-\.\:]+)\s+\[[0-9A-Za-z]+\];\s+([0-9]+);\s+([0-9]+);\s+(.*)/){
       
	$factrans = $1;
	$inicipromo = $2;
	$finalpromo = $3;
	$longitud = $finalpromo - $inicipromo;
       print "$factrans";
       print "$finalpromo";
       print "$longitud";

	     
	 while (<FILTRAT>){
	     chomp;

	     if($_ =~ /ENSG00000111199\s+alig_[0-9]+_esp\s+alig_[a-zA-Z0-9]\s+([0-9]+)\s+([0-9]+)\s+([6-8])\s+.\s+./){

# En aquest if restringim les regions que estan conservades, i tan sols ens quedem amb les que es troben conservades en 6 o mes especies. 

		 $inicifiltrat = $1;
		 $finalfiltrat = $2;
		 $especies = $3;

	      }	

	     if ($longitud>=4 && $inicifiltrat<=$inicipromo && $finalfiltrat>=$finalpromo){

#En aquest if restringim els resultats de Promo.Demanem que es compleixin dues condicions: que la longitud de la regio predida per a la unio de factors de transcripcio sigui major de 5 (per aixo posem el 4, pq la resta entre la posicio dinici i la de final te una diferencia una unitat menor de la longitud real) i que aquesta regio predida es trobin dins duna de les regions conservades a mes de 6 especies.  

		 $resultats [$i] = "ENSG00000111199\tSMM\talig_$especies_esp\t$inicifiltrat\t$finalfiltrat\t$especies\t.\t.";
		 
		 $i = $i + 1;

		 $resultats[$i]= "ENSG00000111199\tPROMO\tPROMO\t$inicipromo\t$finalpromo\t.\t.\t.\t$factrans\t$longitud";

                 $i = $i + 1;
      	     }
    
	 }
     }
}

#En la seguent part del programa repetim el proces fet per a Promo amb els resultats de Transfac. 

while (<TRANSFAC>){ 
chomp;

    if($_ =~ /^V$[a-zA-Z0-9]+_[a-zA-Z0-9]\s+([0-9]+)\s+\((\+\-)\)\s+[0-9]+\s+([0-9]+)\s+([a-zA-Z]+)\s+(.*)/){#_\w+\s+(\d+)\s+\(\+\-\)\s+\d+\s+(\w+)\s+(.+)/){
 
print "$_";	 
	 $inicitransfac = $1;
	 $seq = $2;
	 $factrans = $3;
	 @sequencies=split(//,$seq);
	 
	 
	 $longitud = scalar(@sequencies);
	    

	 $final = $inicitransfac + $longitud;
	 $finaltransfac = $final - 1;

	 while (<FILTRAT>){
	     chomp;

	     if($_ =~ /ENSG00000111199\s+alig_[a-zA-Z0-9]\s+alig_[a-zA-Z0-9]\s+([0-9]+)\s+([0-9]+)\s+([6-8])\s+.\s+./){

		 $inicifiltrat = $1;
		 $finalfiltrat = $2;
		 $especies = $3;

	      }	

	     if ($longitud>=4 && $inicifiltrat<=$inicipromo && $finalfiltrat>=$finalpromo){

		 $resultats [$i] = "ENSG00000111199\tSMM\tconservacio\t$inicifiltrat\t$finalfiltrat\t$especies\t.\t.";
		 
		 $i = $i + 1;

		 $resultats[$i]= "ENSG00000111199\tTRANSFAC\tTRANSFAC\t$inicitransfac\t$finaltransfac\t.\t.\t.\t$factrans\t$longitud";

                 $i = $i + 1;
      	     }
    
	 }
     }
}


close PROMO;
close FILTRAT;
close TRANSFAC;


open(OUT,">$gffFile");
open (HOMOS,"<homosapiens.fst");

while (<HOMOS>) {
	chomp;
	if($_=~ /^[actgACTG]+/){
	    $homo = $homo."##$_\n";
	} 
   }	

close HOMOS;

    print OUT "##gff-version 2\n";
    print OUT "##programa3\n";
    print OUT "##date Tue March 14 14:51:20 2006\n";
    print OUT "##DNA ENSG00000111199\n";
    print OUT "$homo\n";

$i = 0;

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

$i++;

}

close OUT;
    











