#!/usr/bin/perl -w

use strict;


#### fingerprint.pl ####


#### Este programa permite convertir los datos de una base de datos tipo UCSC(tipo RefGene), en un ####
#### archivo que contenga el EXON FINGERPRINT de cada uno de los exones para cada gen.             ####
####  Cada linea correspondera a un gen, y presentara:                                             ####
  ## 1) El identificador de la secuencia                                                           ####
  ## 2) El numero de exones que contribuye a la CDS.                                               ####
  ## 3) Exon fingerprint.                                                                          ####   

#### El formato de Fingerprint describe unicamente el CDS, no tiene en cuenta los exones no codificantes.
#### Cada fingerprint indica:
  ## 1) Fase 5'
  ## 2) Fase 3'
  ## 3) Tamanyo del exon.

#######################################################################################################




my $id;       #variable con los identificadores
my $nex;      #variable con el numero de exones
my $i=0;      #contador de lineas
my @input;    #vector con todas las posiciones separadas por linea

print "Escribe el nombre del archivo para el que quieres obtener el exon-fingerprint:\n";
my $archivo=<STDIN>;
open (ARCHIVO,"< $archivo");

print "Escribe el archivo donde quieres que se guarde el exon-fingerprint:\n";
my $salida=<STDIN>;
chomp $salida;
open (STDOUT, "> $salida");



#####

while (<ARCHIVO>){
    
    @input= split (/\s+/, $_);
    
    $id=$input[0];
    
    print $id, "\t";       #imprimimos ID del gen que esta leyendo

    my $y;                 #contador de exones
    my @principio;         #vector que recoge las coordenadas de INICIO de los exones
    my @final;             #vector que recoge las coordenadas de FINAL de los exones
 
    
#### Almacenamos las posiciones de inicio y final de exon en dos vectores ####

    @principio= ($input[8]=~ m /(\d+)/g);
    @final= ($input[9]=~ m /(\d+)/g);    


#### Contamos el numero real de exones codificantes ####

    my $nex=$input[7];       #Numero real de exones.
    my $enc1=0;              #numero de exones no codificantes desde 5'.
    my $enc2=0;              #numero de exones no codificantes desde 3'.

    #extremo5'
    $y=0;
    while ($y<$input[7]){
	
	if (($principio[$y]<=$input[5])&&($input[5]<=$final[$y])){    #Si el principio del CDS está 
                                                                      #entre el principio y final de exon.
	    
	    $y=$input[7];                                             #para salir del  bucle.
	}
	else {
	    $enc1=$enc1+1;
	    $y=$y+1;
	}
    }


    #extremo3'
    $y=$input[7]-1;
    while ($y>$enc1){

	if (($principio[$y]<=$input[6])&&($input[6]<=$final[$y])){   #Si el principio del CDS está 
                                                                     #entre el principio y final de exon

	    $y=$enc1;                                                #para salir del bucle.
	}
	else {
	    
	    $enc2=$enc2+1;
	    $y=$y-1;
	}
    }
    

    $nex=$nex-$enc1-$enc2;                                          #Numero real de exones codificantes.
    
    print $nex, "\t";


    my $tamanyo;      #tamanyo del exon
    my $tammod;       #tamanyo real de cada exon al quitar lo que no codifica
    my $fase5=3;      #fase 5'
    my $fase3;        #fase 3'
    my $a=0;          #Es 3-fase3,lo que (nucleotidos que le faltan al ultimo codon del anterior exon)
                      # le restamos al tamanyo del siguiente exon antes de especificar su fase.

   
    $y=$enc1;               #Empezamos a calcular la fase a partir del primer exon que forma el CDS.
    while ($y<=($nex+$enc1-1)){
	$tamanyo=$final[$y]-$principio[$y];
	
	
	if ($nex==1){                          #si solo hay un exon CODIFICANTE.
	    $tammod=$input[6]-$input[5];
	}
	elsif ($y==$enc1){
	    $tammod=$final[$y]-$input[5];      #$input[5] especifica el primer nucleotido 
                                                #codificante.(donde empieza el CDS)
	}
	elsif ($y==($nex+$enc1-1)){
	    $tammod=$input[6]-$principio[$y];  #$input[6] especifica el ultimo nucleotido 
                                                #codificante.(donde acaba el CDS)
	}
	else {
	    $tammod=$tamanyo;
	}

	#modificamos el tamanyo para no tener en cuenta los nucleotidos del anterior exon.

	$tammod=$tammod-$a;

	#calculamos la fase.
	
	if ($tammod% 3==0){
	    
	    $fase3= 0;
	}
	elsif ($tammod% 3==1){
	    
	    $fase3= 1;
	}
	elsif ($tammod% 3==2){
	    
	    $fase3= 2;
	}
	if ($y==($nex+$enc1-1)){
	    $fase3= 3;
	}

	#print el fingerprint de cada exon;
	print $fase5, ":", $fase3, ":", ($tammod+$a), "\t";

	$fase5= $fase3;       # la fase 5' de un exon es la misma que la 3' del anterior.
	$y=$y+1;              # pasamos al exon siguiente.
	$a= 3-$fase3;         # preparamos el modificador de tamaño del exon $a.
		
    }
    
    print "\n";               #cambio de linea (porque cambiamos de gen);

}

close (ARCHIVO);
