diff interpro/paso4.pl @ 0:c342ebb50f0b draft default tip

Uploaded
author fernando
date Thu, 22 May 2014 05:09:07 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interpro/paso4.pl	Thu May 22 05:09:07 2014 -0400
@@ -0,0 +1,132 @@
+#!/usr/bin/perl -w
+$| = 1;
+
+# Dado un fichero en formato GFF3 que incluye el análisis de varias secuencias,
+# el programa devuelve un fichero de texto que incluye los valores comunes a todas las secuencias dadas
+# para los atributos:
+    # Name -> Entrada de la base de datos de donde se ha obtenido una característica determinada;
+    # Ontology_term -> Entradas de Gene Ontology para una característica dada;
+    # Dbxref -> Entra de Interpro para una característica dada.
+
+use strict;
+
+
+# Declaración e inicialización de variables
+
+my $fichero_ent = "";                               #Nombre de fichero en formato GFF3 a analizar tomado de líneas de comandos
+my $output="";                                      #Fichero de salida pasado como parámetro
+my (@id_1, @id_2) = ();                             #Almacenan temporalmente las líneas directivas e ID de las secuencias
+my @ids = ();                                       #Todos los ID-seq del archivo
+my @temp = ();                                      #Todas las líneas de características del archivo
+my $lin = "";                                       #Recupera cada ID del @ids
+my @lin_id = ();                                    #Todas las líneas de características para un ID determinado
+my (@t1, @t3) = ();                                 #Almacenan temporalmente las características y atributos de una línea dada
+my $atributo = "";                                  #Únicamente la característica "Atributos" de cada línea de características
+my @etiquetas = ("Name","Ontology_term","Dbxref");  #Son los tres tipos de atributos comunes que se van a extraer del fichero
+my @sel_atrib = ();                                 #Los atributos correspondientes a una etiqueta dada en cada fila 
+my ($etiq, $atrib) = "";                            #La etiqueta y el valor respectivamente, de un atributo en una línea
+my @val_atrib = ();                                 #Los diferentes posibles valores de un atributo en una línea
+my (@valores, @valores_rep) = ([],[],[]);           #Valores de cada atributo para cada ID-seq y los valores repetidos para todos los ID-seq
+my @repetidos = ();                                 #Almacena temporalmente los valores comunes para cada atributo, entre los ID-seq analizados
+
+
+######## Abrir fichero y seleccionar lineas #########
+
+($fichero_ent,$output) = @ARGV;
+
+open(ARCHGFF3, $fichero_ent) || die "Failure to open the file \"$fichero_ent\"\n\n";      #Abre el fichero
+        
+while (<ARCHGFF3>)  {                                   #Lee el archivo
+    chomp $_;
+    if ($_ =~ /^##FASTA/) {                             #Elimina la parte de secuencias fasta
+        last;
+    }elsif ($_ =~ /^##sequence-region./) {      
+        push (@id_1, $_)                                #Las líneas directivas de sequence-region, para obtener su ID correspondiente
+    }elsif ($_ =~ /^#+/) {                              #Elimina líneas de comentarios y directivas, excepto el tipo anterior
+        next;   
+    }else { push (@temp, $_)};                          #Almacena las líneas con los atributos de todos los ID
+}; 
+close ARCHGFF3;                                    
+
+###########  Seleccionar ID de la línea directiva  ##################
+
+foreach (@id_1) {
+    @id_2 = split(/\s/,$_,3); 
+    push (@ids, $id_2[1]);                              #Almacena todos los ID-seq que hay en el archivo
+}
+
+###########  Seleccionar un ID-seq determinado y todas sus filas de características  ##################
+
+my $i = 0;                                              #Para distinguir entre la primera secuencia y el resto
+foreach $lin (@ids) {
+    @lin_id = grep (/^$lin/, @temp);                    #Todas las líneas de características correspondientes al ID seleccionado 
+
+###########  Seleccionar, para cada línea de características, la columna novena de atributos  ##################
+
+    foreach (@lin_id) {
+        @t1 = split(/\t/,$_);                           #Cada elemento es una característica de la línea dada
+        $atributo = $t1[8];                             #Únicamente la característica "atributos" de la línea dada
+            
+    #Seleccionar los atributos "Name", "Ontology_term" y "Dbxref" de la columna 9
+    
+        @t3 = split(/;/, $atributo);                    #Cada elemento es un atributo de la característica "Atributos" de una línea dada 
+        
+###########  Almacenar los diferentes valores de cada atributo (Name, Ontology_term y Dbxref) #############
+###########  de un ID_seq determinado en un @rray diferente                                   #############
+    
+        for my $cont (0..2){ 
+            if (@sel_atrib = grep (/^$etiquetas[$cont]./, @t3)) {      #Evitar valores no definidos para un atributo concreto
+                ($etiq, $atrib) = split (/=/, $sel_atrib[0], 2); 
+                @val_atrib = split (/,/, $atrib); 
+                foreach my $valor (@val_atrib) {                              
+                    if (!grep (/$valor/, @{$valores[$cont]})) {        #Evitar valores repetidos de un mismo atributo para un ID-seq determinado
+                            push (@{$valores[$cont]}, $valor);         #Todos los valores diferentes de cada atributo para un ID-seq determinado    
+                    }
+                }    
+            }
+        }    
+    }
+    
+###########  Comprobar los atributos comunes a todos los ID-seq y guardarlos  #################
+
+    if ($i == 0) {                                                     #Para el primer ID-seq se guardan todos sus atributos
+        for my $cont (0..2) {                                          #no repetidos. Como mucho, serán todos estos la solución.
+            $valores_rep[$cont] = [@{$valores[$cont]}];                
+            $valores[$cont] = [];
+        }
+        $i++;
+    } else {                                                                        
+        for my $cont (0..2) {
+            foreach my $valor (@{$valores[$cont]}) {
+                if (grep (/$valor/, @{$valores_rep[$cont]})) {         #Búsqueda valores comunes para cada tipo atributo entre los
+                    push (@repetidos, $valor);                         #ID-seq analizados.
+                }
+            }
+            $valores_rep[$cont] = [@repetidos];                        #Todos los valores comunes de los tres tipos de atributos para
+            $valores[$cont] = [];                                      #todas las secuencias del fichero.
+            @repetidos = ();
+        }
+    }
+    
+}
+
+
+############ Impresión de resultados ######################
+
+if (!open(FICHEROUT, ">$output")) { 
+    print "The file \"$output\" can not be opened";
+} else {
+    print FICHEROUT "The common atributes of the sequences ","@ids"," are:\n";
+    for my $cont (0..2) {
+        print FICHEROUT "For atribute ","$etiquetas[$cont]" ," : ";
+        if (scalar @{$valores_rep[$cont]} == 0) {
+            print FICHEROUT "No common atributes \n";
+        }else { print FICHEROUT "@{$valores_rep[$cont]}", "\n"}
+    }
+    close (FICHEROUT);
+}
+exit;
+  
+
+    
+