#!/usr/bin/perl -w

use strict;

my $fitxer = $ARGV[0]; #asignem el nom del fitxer escrit darrera del programa a una variable per posteriorment assignar-ho a un filehandle

if (!open (FITXER, "<$fitxer")) {
    print "No es pot obrir el fitxer de dades $fitxer. Assegureu-vos d'escriure el nom correctament: $ ./exal.pl <fitxerdedades>
(mouse.skipping.seqs.txt)\n";
    exit(1);

}


# Hash per anar incrementant cada codó cada cop que aparegui als exons 1 i 3

my %taula13;

# Hash per anar incrementant cada codó cada cop que aparegui a l'exó 2

my %taula2;

# Hash per anar incrementant cada codó cada cop que aparegui entre els exons 1-2 i 2-3

my %despenjats;

my $entrada;                              # variable que agafa el fitxer a tractar
my @dades;                               # vector que enregistra els diferents tipus de dades

my $identificador;
my $nom_cromosoma;
my $cadena;
my $fase1;
my $fase2;
my $fase3;
my $start1;
my $start2;
my $start3;
my $end1;
my $end2;
my $end3;
my $llargada1;
my $llargada2;
my $llargada3;
my $seq1;
my $seq2;
my $seq3;		# Aquestes son les variables que enregistren els diferents tipus de dades

my $exo1;		# Variable amb la seqüència codificant de cada exó
my $exo2;
my $exo3;
my @triplets1;		# Vector de la seqüència codificant amb els codons ja separats
my @triplets2;
my @triplets3;

while ($entrada = <FITXER>) {
	@dades = ($entrada =~ m/\w+/g);	#separem cada línia en trossos marcats per tabulacions

	$identificador = $dades[0];	# Assignem cada dada a una variable
	$nom_cromosoma = $dades[1];
	$cadena = $dades[2];
	$fase1 = $dades[3];
	$fase2 = $dades[4];
	$fase3 = $dades[5];
	$start1 = $dades[6];
	$start2 = $dades[7];
	$start3 = $dades[8];
	$end1 = $dades[9];
	$end2 = $dades[10];
	$end3 = $dades[11];
	$llargada1 = $dades[12];
	$llargada2 = $dades[13];
	$llargada3 = $dades[14];
	$seq1 = $dades[15];
	$seq2 = $dades[16];
	$seq3 = $dades[17];


#primer hem de calcular el començament real de cada exó segons les fases, i per tal fi utilitzarem una funció (startreal), descrita al final del programa

        my $startreal=0;



# ---------------#tallem exo 1 i el partim en triplets---------


        startreal($fase1,$start1);

	$exo1 = substr ($seq1,$startreal,$end1 - $startreal + 1);

	@triplets1 = ($exo1 =~ m/.../g);

	my $count;

	$count = 0;  #comptador per anar recorrent el vector de triplets, cada posició un triplet

	# Bucle que llegeix cada triplet i va sumant cada cop que apareix a la taula de hash

	while ($count < scalar (@triplets1)) {

		$taula13{$triplets1[$count]}++;

		$count++;

	}


#++++++++++++++++++++++++++++++++++++++++++++++++++++++el mateix per l'exó 3#


        startreal($fase3,$start3);

       	$exo3 = substr ($seq3,$startreal,$end3 - $startreal + 1);

	@triplets3 = ($exo3 =~ m/.../g);

	$count = 0;

	while ($count < scalar (@triplets3)) {

		$taula13{$triplets3[$count]}++;

		$count++;

	}


#+++++++++++++++++++++++++++++++++++++++++++++++++++++el mateix per exó 2#


        startreal($fase2,$start2);

	$exo2 = substr ($seq2,$startreal,$end2 - $startreal + 1);

	@triplets2 = ($exo2 =~ m/.../g);

	$count = 0;

	while ($count < scalar (@triplets2)) {

		$taula2{$triplets2[$count]}++;

		$count++;

	}


#++++++++++++++++++++++++++++++++++++++++++++++++++

#despenjats entre exons 1 i 2

	my $aux; #variable auxiliar per crear cada codó despenjat, resultat de la concatenació de nucleòtids


	if ( $fase2 == 1) {
	    $aux = substr ($seq1,$end1 - 2,1).substr ($seq2,$start2 - 1,2);
	    $despenjats{$aux}++;
	}

	elsif ( $fase2 == 2) {
	    $aux = substr ($seq1,$end1 - 3,2).substr ($seq2,$start2 - 1,1);
	    $despenjats{$aux}++;
	}


#despenjats entre exons 2 i 3

	if ( $fase3 == 1) {
	    $aux = substr ($seq2,$end2 - 2,1).substr ($seq3,$start3 - 1,2);
	    $despenjats{$aux}++;
	}

	elsif ( $fase3 == 2) {
	    $aux = substr ($seq2,$end2 - 3,2).substr ($exo3,$start3 - 1,1);
	    $despenjats{$aux}++;
	}

}


close(FITXER);


#hash per tindre la correspondencia entre aminoàcids i els codons que codifiquen per aquests

my %amincodo = ("Phe" => ["TTT","TTC"],
		"Leu" => ["TTA","TTG","CTT","CTC","CTA","CTG"],
		"Ile" => ["ATT","ATC","ATA"],
		"Met" => ["ATG"],
		"Val" => ["GTT","GTC","GTA","GTG"],
		"Ser" => ["TCT","TCC","TCA","TCG","AGT","AGC"],
		"Pro" => ["CCT","CCC","CCA","CCG"],
		"Thr" => ["ACT","ACC","ACA","ACG"],
		"Ala" => ["GCT","GCC","GCA","GCG"],
		"Tyr" => ["TAT","TAC"],
		"STOP" => ["TAA","TAG","TGA"],
		"His" => ["CAT","CAC"],
		"Gln" => ["CAA","CAG"],
		"Asn" => ["AAT","AAC"],
		"Lis" => ["AAA","AAG"],
		"Asp" => ["GAT","GAC"],
		"Glu" => ["GAA","GAG"],
		"Cys" => ["TGT","TGC"],
		"Trp" => ["TGG"],
		"Arg" => ["CGT","CGC","CGA","CGG","AGA","AGG"],
		"Gly" => ["GGT","GGC","GGA","GGG"]);


#---- Taula final de les proporcions dels codons-----------

my @aas = keys(%amincodo);      #Vector que compta les claus del hash amincodo (tots els aa)

my $i = 0;    #Comptador per recorrer el vector @aas (tots els aminoàcids)

open (FREQRELATIVES,"> freqrelatives.txt");

print FREQRELATIVES "\n";

print FREQRELATIVES "FREQÜÈNCIES RELATIVES DE CODONS SEGONS L'EXÓ EN QUÈ ES TROBEN\n";

print FREQRELATIVES "\n";

print FREQRELATIVES "\n";

print FREQRELATIVES "Aa\t\tCodó\t\tConstitutius\tAlternatius\tDespenjats\n";

print FREQRELATIVES "\n";

while ($i < scalar(@aas)) {

    my $j = 0; #Comptador per recorrer codons d'un aa

    #variables per anar sumant el total de codons que codifiquen per un aminoàcid

    my $total13 = 0;  #per comptar els constitutius

    my $total2 = 0;   #per comptar els alternatius

    my $totaldes = 0; #per comptar els despenjats


    while ($j < scalar(@{$amincodo{$aas[$i]}})) {

	$total13 = $taula13{$amincodo{$aas[$i]}[$j]} + $total13;

        $total2 = $taula2{$amincodo{$aas[$i]}[$j]} + $total2;

        $totaldes = $despenjats{$amincodo{$aas[$i]}[$j]} + $totaldes;

	$j++;

    }


    #ara per a cada codó comptem el seu percentatge, i per això declarem 3 noves variables

    $j = 0;

    my $parcial13 = 0;

    my $parcial2 = 0;

    my $parcialdes = 0;

    while ($j < scalar(@{$amincodo{$aas[$i]}})) {

	$parcial13 = sprintf ("%.2f %%", $taula13{$amincodo{$aas[$i]}[$j]} / $total13 * 100);

	$parcial2 = sprintf ("%.2f %%", $taula2{$amincodo{$aas[$i]}[$j]} / $total2 * 100);

        $parcialdes = sprintf ("%.2f %%", $despenjats{$amincodo{$aas[$i]}[$j]} / $totaldes * 100);


        print FREQRELATIVES "$aas[$i]\t\t$amincodo{$aas[$i]}[$j]\t\t$parcial13\t\t$parcial2\t\t$parcialdes\n";

	$j++;

    }

    $i++;

}


close(FREQRELATIVES);



#-----------------------------TRACTAMENT ESTADISTIC#

#per al tractament estadístic posterior necessitem imprimir la taula de freqüències absolutes de cada codó, agrupats per aminoàcids, i segons si són exons constitutius, alternatius o despenjats

$i = 0;    #Comptador per recorrer el vector @aas (tots els aminoàcids)

open (FREQABSOLUTES,"> freqabsolutes.txt");


while ($i < scalar(@aas)) {

    my $j = 0; #Comptador per recorrer codons d'un aa

    while ($j < scalar(@{$amincodo{$aas[$i]}})) {

        print FREQABSOLUTES "$aas[$i]\t$amincodo{$aas[$i]}[$j]\t$taula13{$amincodo{$aas[$i]}[$j]}\t$taula2{$amincodo{$aas[$i]}[$j]}\t$despenjats{$amincodo{$aas[$i]}[$j]}\n";

	$j++;

    }

    $i++;

}

close (FREQABSOLUTES);




########################################################
############# FUNCIONS #################################


sub startreal {

    if ($_[0] == 1) {

    my $startreal = $_[1] - 1 + 2;

    }

    elsif ($_[0] == 2) {

    my $startreal = $_[1] - 1 + 1;

    }

    else {

    my $startreal = $_[1] - 1;

    }

    return my $startreal;

}

