#!/usr/bin/perl

use strict;

##CALCUL DE FREQ. DE NT.##

my $dna="";
my $x;
my $long;
#vectors per emmagatzemar totes les ocurrencies de cada nt al llarg de la seq#
my @A;
my @C;
my @G;
my @T;
#Variables per calcular la proporcio de cadascun dels nt al llarg de la sequencia promotora#
my $pA;
my $pC;
my $pG;
my $pT;

open (FITXERMEUDOS, "<$ARGV[1]"); #Pq treballi amb el 2n fitxer#

while (<FITXERMEUDOS>) {    
  
  chomp($_);
  
  if (!(m/(\>)/ )){
    $dna .= $_;
  
  }

}

$long = length($dna);#longitud de la sequencia promotora#

@A = ($dna =~ m/[Aa]/g);
@C = ($dna =~ m/[Cc]/g);
@G = ($dna =~ m/[Gg]/g);
@T = ($dna =~ m/[Tt]/g);

$pA = (scalar(@A) / $long);
$pC = (scalar(@C) / $long);
$pG = (scalar(@G) / $long);
$pT = (scalar(@T) / $long);


##CALCUL MATRIU DE PESOS##

my %motiu = ("A" => [0, 0, 0, 0, 0, 0, 0, 0, 0],
             "C" => [0, 0, 0, 0, 0, 0, 0, 0, 0],
             "G" => [0, 0, 0, 0, 0, 0, 0, 0, 0],
	     "T" => [0, 0, 0, 0, 0, 0, 0, 0, 0]);

my $lloc=0;
my $linies=0;

open (FITXERMEU,"<$ARGV[0]");#Pq treballi amb el primer fitxer#

while (<FITXERMEU>) {
    chomp($_);

	if (m/(FA)/) {
		print; 
		print "\n";
	}
	
    elsif ($_=~m/(\d+)\t(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/) {
	    
      $motiu{"A"}[$lloc]=$2;
      $motiu{"C"}[$lloc]=$3;
      $motiu{"G"}[$lloc]=$4;
      $motiu{"T"}[$lloc]=$5;
    
      
      if ($2==0) {  
	$motiu{"A"}[$lloc] = -999;   
      }
      
      else {
	$motiu{"A"}[$lloc] = sprintf("%.4f", (log ($motiu{"A"}[$lloc]/($2+$3+$4+$5))/(log 10) - (log ($pA)/(log 10))));

      }
      
      
      if ($3 == 0) {  
	$motiu{"C"}[$lloc] = -999;    
      }
      
      else {
	$motiu{"C"}[$lloc] = sprintf("%.4f", (log ($motiu{"C"}[$lloc]/($2+$3+$4+$5))/(log 10) - (log ($pC)/(log 10))));
      }
      
      if ($4 == 0) {  
	$motiu{"G"}[$lloc] = -999;    
      }
      
      else {
	$motiu{"G"}[$lloc] = sprintf("%.4f", (log ($motiu{"G"}[$lloc]/($2+$3+$4+$5))/(log 10) - (log ($pG)/(log 10))));
      }
      
      if ($5 == 0) {  
	$motiu{"T"}[$lloc] = -999;    
      }
      
      else {
	$motiu{"T"}[$lloc] = sprintf("%.4f", (log ($motiu{"T"}[$lloc]/($2+$3+$4+$5))/(log 10) - (log ($pT)/(log 10))));
      }
      
      $lloc = $lloc+1;
      $linies = $linies+1;
    }
    
    if ( ($_=~m/(\/\/)/) && ($lloc > 1 )) {
      
      my @k= ("A","C","G","T");
      my $i = 0;
      
      while ($i < scalar(@k)) {
	
	my $j=0;		
	print $k[$i];
	
	
	while ($j < $linies) {
	  
	  print "\t$motiu{$k[$i]}[$j]";
	  $j = $j + 1;
	}
	print "\n";	
	$i = $i +1;
      }
      
      
      
      
      #punt3#
      
      my @lletra = split(//,$dna);
      my $compt = 0; #per recorrer la sequencia del promotor#
      my $finestra = 0; #posicio de la finestra#
      my $xibatu = 0; #variable per recorrer la finestra#
      my $puntuacio = 0; 
      my $puntuacio_final = -999; #variable que enregistrara la puntuacio final pero la inicialitzem amb el valor mes baix#
      my $posicio_inicial = 0; #variable per enregistrar la posició en el promotoron comença el motiu amb puntuacio max.#
      my $posicio_final = 0;
      
      while ($compt < (scalar (@lletra) - $lloc +1)) {
	
	$finestra = $compt;
	$xibatu = 0;
	$puntuacio = 0;
	
	while ($xibatu < $lloc ) {
	  
	  if ($lletra[$finestra] eq 'A' || $lletra[$finestra] eq 'a'){
	    $puntuacio = $puntuacio + $motiu{"A"}[$xibatu];
	  }
	  if ($lletra[$finestra] eq 'C' || $lletra[$finestra] eq 'c'){
	    $puntuacio = $puntuacio + $motiu{"C"}[$xibatu];
	  }
	  if ($lletra[$finestra] eq 'G' || $lletra[$finestra] eq 'g'){
	    $puntuacio = $puntuacio + $motiu{"G"}[$xibatu];
	  }
	  if ($lletra[$finestra] eq 'T' || $lletra[$finestra] eq 't'){
	    $puntuacio = $puntuacio + $motiu{"T"}[$xibatu];
	}
	  
	  
	  $xibatu = $xibatu + 1;
	  $finestra = $finestra + 1;
 #print "FA $puntuacio $posicio_inicial $posicio_final\n"   ;	  
	}
	

  	
	if ($puntuacio > $puntuacio_final) {
	  
	  $puntuacio_final = $puntuacio;
	  $posicio_inicial = $compt + 1;
	  $posicio_final = $finestra ;
	  
	}
	$compt = $compt + 1;
      }
     
 my $por  =  $posicio_inicial - 1;

while ($por < $posicio_final) { 
      print ($lletra[$por]);
      $por = $por +1;
      
}
print"\n";
      print "la puntuacio final de la matriu no aleatoria es: $puntuacio_final a la posicio inicial $posicio_inicial i a la posicio final $posicio_final";
      print "\n";


##PART 4## 

      ##Tornem a declarar les variables per a la última part del programa ##
    
      my $z = 0;
      my $compt2 = 0; #per recorrer la sequencia del promotor#
      my $finestra2 = 0; #posicio de la finestra#
      my $xibatu2 = 0; #variable per recorrer la finestra#
      my $puntuacio2 = 0; 
      my $puntuacio_final2 = 0;
      my $posicio_inicial2 = 0; #variable per enregistrar la posició en el promotoron comença el motiu amb puntuacio max.#
      my $posicio_final2 = 0;
      my @lletra2 = @lletra;     
      my $c = 0;## Compta el número de cops que la punruació de la promotora variada es més gran que la original.	
      my $p_value = 0;
      my $n = 0;
      my $m = 0;



      while ($z < 100) {
	  
	  
	  
	  $compt2 = 0; #per recorrer la sequencia del promotor#
	  $finestra2 = 0; #posicio de la finestra#
	  $xibatu2 = 0; #variable per recorrer la finestra#
	  $puntuacio2 = 0; 
	  $puntuacio_final2= -999;
	  $posicio_inicial2 = 0; #variable per enregistrar la posició en el promotoron comença el motiu amb puntuacio max.#
	  $posicio_final2 = 0;
	  @lletra2 = @lletra;
	  $p_value = 0;
	  my $n = scalar(@lletra2);
	  my $m = $n - 1;
	  
	  

	  while($m >= 0) {
	      
	      my $j = int(rand($m + 1));
	      
	      if ($m != $j) {
		
		  my $tmp = $lletra2[$m];
		  
		  $lletra2[$m] = $lletra2[$j];
		  $lletra2[$j] = $tmp;
		  
		}
	      
	      $m = $m -1;
	      
	    }
	  
	  
	  while ($compt2 < (scalar (@lletra2) - $lloc +1)) {
	    
	    $finestra2 = $compt2;
	    $xibatu2 = 0;
	    $puntuacio2 = 0;
	    
	    while ($xibatu2 < $lloc ) {
	      
	      if ($lletra2[$finestra2] eq 'A' || $lletra2[$finestra2] eq 'a'){
		$puntuacio2 = $puntuacio2 + $motiu{"A"}[$xibatu2];
	      }
	      if ($lletra2[$finestra2] eq 'C' || $lletra2[$finestra2] eq 'c'){
		$puntuacio2 = $puntuacio2 + $motiu{"C"}[$xibatu2];
	      }
	      if ($lletra2[$finestra2] eq 'G' || $lletra2[$finestra2] eq 'g'){
		$puntuacio2 = $puntuacio2 + $motiu{"G"}[$xibatu2];
	      }
	      if ($lletra2[$finestra2] eq 'T' || $lletra2[$finestra2] eq 't'){
		$puntuacio2 = $puntuacio2 + $motiu{"T"}[$xibatu2];
	      }
	      
	      
	      $xibatu2 = $xibatu2 + 1;
	      $finestra2 = $finestra2 + 1;
	      
	    }
	    
	   
	    if ($puntuacio2 > $puntuacio_final2) {
	      
	      $puntuacio_final2 = $puntuacio2;
	      $posicio_inicial2 = $compt2 + 1;
	      $posicio_final2 = $finestra2 ;
	      
	    }
	    
	    $compt2 = $compt2 + 1;
	  }
	  
	  ##print "la puntuacio final de la seqüencia permutada es: $puntuacio_final2 a la posicio inicial $posicio_inicial2 i a la posicio final $posicio_final2";
	  ##print "\n";

	  if ($puntuacio_final2 >= $puntuacio_final) {

	      $c = $c + 1;

	    }

	  
	  $z= $z+1;
	  
	}
      
      $p_value = $c/100;
      print "el p-value associat al FT és $p_value";
      print "\n";

      
      %motiu = ("A" => [0, 0, 0, 0, 0, 0, 0, 0, 0],
		"C" => [0, 0, 0, 0, 0, 0, 0, 0, 0],
		"G" => [0, 0, 0, 0, 0, 0, 0, 0, 0],
		"T" => [0, 0, 0, 0, 0, 0, 0, 0, 0]);
      
      $lloc = 0;
      $linies = 0;
      
      
    }

  }




close (FITXERMEU);

close (FITXERMEUDOS);
