#!/usr/bin/perl -w

use strict;
  

#### ortofingerprint.pl ####

#### Este programa permite aparear los exon fingerprint de dos genes ortologos, a partir de la  ####
#### lectura de los archivos donde se hayan almacenado los exon fingerprint de las dos especies ####
#### y el archivo con la relacion de ortologia entre estas dos especies.                        ####

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

## 1.leer fingerprint de la 1a especie y meterlo en un hash, la clave sera el identificador del gen    ##
## 2.leer fingerprint de la 2a especie y meterlo en otro hash, la clave sera  el identificador del gen ##
## 3.recorrer los pares ortologos seleccionados accediendo a los hash para recuperar los fingerprint   ## 
##    correspondientes                                                                                 ##
## 4.crear un archivo donde cada linea corresponda a los exon fingerprint de dos genes ortologos       ##
##    separados por  |

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


######################### Relacion de especies y sus respectivos codigos numericos#######################

my %especies=("Arabidopsis thaliana"=>"3702",
	      "Bos taurus"=>"9913",
	      "Caenorhabditis elegans"=>"6239",
	      "Danio rerio"=>"7955",
	      "Drosophila melanogaster"=>"7227",
	      "Homo sapiens"=>"9606",
	      "Hordeum vulgare"=>"4513",
	      "Lycopersicon esculentum"=>"4081",
	      "Medicago truncatula"=>"3880",
	      "Mus musculus"=>"10090",
	      "Oryza sativa"=>"4530",
	      "Rattus norvegicus"=>"10116",
	      "Sus scrofa"=>"9823",
	      "Triticum aestivum"=>"4565",
	      "Xenopus laevis"=>"8355",
	      "Zea mays"=>"4577");
#########################################################################################################




#hash q guarde los fingerprint de la primera especie.

print "Escribe el nombre del archivo donde estan los fingerprint de la primera especie:\n";
my $finger_esp1=<STDIN>;
print "e indica a que especie pertenece(en latin)\n";
my $introducir=<STDIN>;               #variable que guardara temporalmente el nombre de la 1a especie
chomp $introducir;
my $especie1=$especies{$introducir};  #variable que almacena el nombre de la especie


my %fesp1;                            #hash con los fingerprint de la primera especie

%fesp1=hash($finger_esp1);


#hash q guarde el fingerprint de la segunda especie

print "Escribe el nombre del archivo donde estan los fingerprint de la otra especie:\n";
my $finger_esp2=<STDIN>;

my %fesp2;                            #hash con los fingerprint de la segunda especie

%fesp2=hash($finger_esp2);




#intruducir la lista de genes ortologos 
print "Escribe el nombre del archivo con la lista de genes ortologos de esta especie:\n";
my $ortologos=<STDIN>;



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


## Aparear los genes ortologos.

open (ARCHIVO, "<$ortologos");     ##abre el archivo donde NOSOTROS hemos guardado la con la lista de ortologos

while (<ARCHIVO>){
    chomp $_;
    my @par= split (/\|/,$_);                         #cada gen sera un elemento del vector

    my $ID1;                                          #almacena el identificador del gen de la primera especie
    my $ID2;                                          #almacena el identificador del gen de la segunda especie
            

        #hay que tener en cuenta el orden de los genes en el archivo de ortologos

    if ($par[0] eq $especie1){                     
	$par[5]=~ m/(NM_\d+)\./;                           #busca mediante un expresión regular el identificador
	$ID1 = $1;                                          
    }
    else{
	$par[5]=~ m/(NM_\d+)\./;                           #busca mediante un expresión regular el identificador
	$ID2 = $1;
    }


    if ($par[1]==$especie1){
	$par[8]=~ m/(NM_\d+)\./;                           #busca mediante un expresión regular el identificador
	$ID1 = $1;                                          
    }
    else{
	$par[8]=~ m/(NM_\d+)\./;                           #busca mediante un expresión regular el identificador
        $ID2 = $1;
    }


    if (($fesp1{$ID1})&&($fesp2{$ID2})){                #solo mostrara los fingerprint si se conoce el de los 
	                                                     #dos genes ortologos
	print "$ID1\t$fesp1{$ID1}\t|\t$ID2\t$fesp2{$ID2}\n";
    }
}


close (ARCHIVO);




############################################################################################################
############################################### FUNCIONES ##################################################
############################################################################################################


######
#NOMBRE: hash
#OBJETIVO: introducir en un hash la lista de exon fingerprint de genes de una especie
#RETORNA: hash que contiene el identificador de cada gen (clave) y el numero de exones 
        # codificantes junto al exon fingerprint(%hash_finger)


sub hash{
    my $finger=$_[0];           ##variable donde ira el nobre del archivo q contiene el fingerprint.

    my %hash_finger;            ##hash que contiene los exonfingerprint, usando el identificador como clave.

    open(FINGER,"<$finger");

    while (<FINGER>){
	
	m/(\w+)\s+([^\n]+)/;   ##expresion regular que captura en primera posicion el identificador 
	                        # y en segunda el numero de exones con el fingerprint

	$hash_finger{$1}=$2;
    }

    close (FINGER);

    return %hash_finger;

}

######
