• Publicidad

Organizar información de ortólogos

Perl aplicado a la bioinformática

Organizar información de ortólogos

Notapor igarrom » 2014-01-28 05:37 @275

Buenos días,

Estoy intentando crear un programa en Perl para organizar los ortólogos que he identificado entre cuatro bacterias del mismo género.

Por un lado tengo cuatro archivos, cada uno de ellos con los identificadores de todos los genes de una bacteria, por otro lado, tengo seis archivos que contienen los identificadores de los ortólogos entre dos de las cuatro bacterias (separados por tabulador); son seis archivos porque he calculado los ortólogos por parejas y así se cumplen todas las combinaciones.

El resultado que quiero obtener es un fichero con cuatro columnas cuyas filas estén organizadas de tal manera que queden ahí solo los genes ortólogos; si un gen no tiene ortólogo también debería aparecer en su respectiva columna pero sin "compañeros" en las otras columnas. Pongo un ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
organismo A, B, C y D.

Resultado:

gen_A1    gen_B7
gen_A3              gen_C1
gen_A4
gen_A5    gen_B6    gen_C2    gen_D8
          gen_B3
                              gen_D1
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Espero haberlo explicado bien, muchas gracias de antemano.

Inma
igarrom
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2014-01-28 04:06 @212

Publicidad

Re: Organizar información de ortólogos

Notapor explorer » 2014-01-28 08:17 @387

Bienvenida a los foros de Perl en Español, Inma.

¿Puedes darnos más datos? En concreto, faltaría el dato de cómo quieres separar las columnas en el archivo resultado. ¿Son posiciones fijas, usando espacios en blanco para rellenar, o se usa un solo carácter de tabulador?

El siguiente programa genera la salida que pides:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use feature 'say';
  3.  
  4. ## Contenido de los archivos
  5. my @archivo1 = ('gen_A1', 'gen_A3', 'gen_A4', 'gen_A5', '',       '');
  6. my @archivo2 = ('gen_B7', '',       '',       'gen_B6', 'gen_B3', '');
  7. my @archivo3 = ('',       'gen_C1', '',       'gen_C2', '',       '');
  8. my @archivo4 = ('',       '',       '',       'gen_D8', '',       'gen_D1');
  9.  
  10. ## Salida
  11. say 'organismo A, B, C y D';
  12. say '';
  13. say 'Resultado:';
  14. say '';
  15.  
  16. for my $i (0 .. 5) { # para todas las filas
  17.     my $fila = join "\t", $archivo1[$i], $archivo2[$i], $archivo3[$i], $archivo4[$i];
  18.     say $fila;
  19. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Organizar información de ortólogos

Notapor igarrom » 2014-01-28 08:33 @398

Hola, explorer.

Muchas gracias por la respuesta. Quiero que los datos de salida estén separados por un tabulador y voy a tener 10 archivos de entrada. En los cuatro en los que tengo todos los genes para una bacteria la organización sería la siguiente (un gen detrás de otro separados por un salto de línea):

Ejemplo archivo A:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
gen_A1
gen_A2
gen_A3
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Y en los seis archivos de comparación, tendré dos columnas en la que aparecerán solo los ortólogos entre esos dos organismos. Si tengo en cuenta mi fichero con la información de ortólogos entre A y B, este sería el formato (donde cada par de ortólogos están separados por un tabulador):

Ejemplo ortólogos entre A y B:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
gen_A4    gen_B1
gen_A5    gen_B8
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

(Puede que en este fichero no aparezca, por ejemplo, el gen "gen_A2" porque no tenga ningún ortólogo en el organismo B y tal vez tampoco tenga ortólogos con C y D, sin embargo, quiero que aparezca en el archivo de resultados en su columna correspondiente, sin ningún ortólogo asociado).

Muchas gracias de nuevo.

Voy a subir un código (está incompleto, probablemente con muchos errores y no funciona) de mi intento por conseguir el programa, a ver si así aclaro más lo que quiero conseguir):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4.  
  5. my $F = "./data";
  6.  
  7. my %O;
  8. my %O2;
  9. my @o = `ls $F/*.comp`;
  10. foreach my $o (@o) {
  11.   open in, $o;
  12.   while (<in>) {
  13.     chomp;
  14.     my ($o1, $o2) = split /\t/;
  15.     push @{$O{$o1\_$org}}, "$o2\_$org";
  16.     push @{$O{$o2}}, $o1;
  17.     $O2{$o1} = 1;
  18.     $O2{$o2} = 1;
  19.   }
  20.   close in;
  21. }
  22.  
  23.  
  24. foreach my $i (keys %O) {
  25.   print "$i\t";
  26.   for my $i2 (@{$O{$i2}}) {
  27.     next unless (@{$O{$i}});
  28.     $O{$i2} = gene_order ($O{$i2});
  29.     undef @{@{$O{$i}};
  30.   }
  31.   print "\n";
  32. }
  33.  
  34. my @name = `ls $F/*.id`;
  35. foreach my $name (@name) {
  36.    open in1, $name:
  37.    while (<in1>) {
  38.      chomp;
  39.      for my $i3 (@{$O{$i}}) {
  40.        next unless (@{$O{$i}} =~ $_)
  41.        push @{$O{$i}}, "\n$_";
  42.      }
  43.                      
  44. }
  45.  
  46. my %saw; @saw{@{$O{$i}}} = (); @{$O{$i}} = keys %saw; # remove redundant
  47.  
  48.  
  49. #my @fff = `ls $F/*.id`;
  50. #foreach my $f (@fff) {
  51. #  chomp $f;
  52.  
  53. #  open in, $f;
  54. #  while (<in>) {
  55. #    chomp;
  56. #    my $id = $_;
  57. #    next if $O{$id};
  58. #    print "$id\n";
  59. #  }
  60. #  close in;
  61. #}
  62.  
  63.  
  64. #subrutine
  65.  
  66. sub gene_order
  67. {
  68.     my ($var1, $var2) = split /\t/;
  69.     my ($var3, $var4, $var5) = split /,/;
  70.     my @organism = (TFA, sala, sbae, sMC1);
  71.     foreach my $i (@org) {
  72.         if ($var1 eq $org[$i]) {
  73.                 $org[$i] = $var1;
  74.         }
  75.     }
  76.     return $resultado;
  77. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
igarrom
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2014-01-28 04:06 @212

Re: Organizar información de ortólogos

Notapor explorer » 2014-01-28 16:34 @731

Sería interesante ver ejemplos de los archivos de entrada, si es posible, abreviados, para poder publicarlos aquí.

Y un breve explicación de lo que quieres hacer. Viendo el código, es un poco complicado saber qué hay que hacer... con tantas arrobas, yo me pierdo un poco ;)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Organizar información de ortólogos

Notapor igarrom » 2014-01-29 05:35 @274

Hola, explorer,

Subo los 10 ficheros (simplificados) con los que necesito trabajar. Los que tienen de extensión .id son los 4 que contienen "todos" los genes de un mismo organismo (A, B, C o D) y los que tienen la extensión .comp son los 6 que contienen los ortólogos entre dos organismos (separados por tabulador).

Muchas gracias de nuevo.
Adjuntos
input_files.tar.gz
Archivos ejemplo
(515 Bytes) 122 veces
igarrom
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2014-01-28 04:06 @212

Re: Organizar información de ortólogos

Notapor explorer » 2014-01-29 18:57 @831

Lo siento, no lo veo. Se me hace complicado, ya que no sé qué tratamiento de datos hay que hacer con los archivos. He intentado leer tu código, pero lo sigo viendo confuso.

Por ejemplo, en la línea 15 haces referencia a la variable $org, pero no la veo definida por ninguna parte.

¿Qué procesamiento hay que hacer con estos diez archivos?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Organizar información de ortólogos

Notapor igarrom » 2014-01-30 03:33 @190

Hola, explorer.

Lo que quiero es recorrer todos los genes de un organismo. Por ejemplo, con el organismo A, abriríamos el fichero A.id y lo iríamos recorriendo tomando los identificadores de genes uno por uno (los cuales están separados por un salto de línea). Ese identificador lo buscaríamos en los archivos de comparación (.comp, donde se disponen separados por un tabulador los pares de ortólogos), pero solo sería necesario buscarlo en aquellos donde se ha comparado el organismo A con algún otro (en el resto no), entonces, se le irían añadiendo a ese gen todos sus ortólogos, quedando el resultado así:

gen_A1(tabulador)gen_B4(tabulador)gen_C5(tabulador)gen_D3

También cabe la posibilidad de que con alguno de esos organismos no tenga ortólogos y entonces esa posición quedaría vacía

gen_A1(tabulador)POSICIÓN_VACÍA(tabulador)gen_C5(tabulador)gen_D3

Así habría que proceder con los cuatro archivos .id y tener en cuenta que hay que eliminar la redundancia, si gen_B4 ya tiene asignados los ortólogos, no habría que volverlo a hacer.

Espero haberme explicado mejor,

Muchas gracias,

Inma
igarrom
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2014-01-28 04:06 @212

Re: Organizar información de ortólogos

Notapor explorer » 2014-01-31 16:59 @749

Inma: te has explicado muy bien, pero no soy capaz de verlo.

¿Puedes ponerme un ejemplo, partiendo de los archivos que has puesto? Es decir, ¿qué reglas hay que seguir para crear el nombre 'gen_A1'?

Sí que entiendo lo de abrir A.id, leer la primera línea (Gene_1), y buscar ese cadena en los archivos comp, pero solo en aquellos que aparezca la letra 'A' en su nombre. Pero a partir de ahí, no sé qué hay que hacer.

¿El resultado que pusiste en el primer mensaje de este hilo es el resultado de procesar los diez archivos que pusiste más tarde?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Organizar información de ortólogos

Notapor igarrom » 2014-02-03 11:07 @505

Hola, explorer,

El resultado que puse en el primer mensaje es un ejemplo que no corresponde con el procesamiento de los 10 archivos posteriores, pero sí que muestra el formato que deseo obtener en mi resultado de salida. Como el ejemplo que puse es pequeñito, voy a poner el resultado que debería salir al procesar los diez archivos.

Aquí ocurre que el Gene_8 (además de otros ejemplos) es ortólogo de 103485502 y de 489128857. Sin embargo, 103485502 y 489128857 no lo son entre sí, por eso se repite la asignación por separado (creo que estos casos no aparecen en mis ficheros reales pero no estoy segura).

Este es el resultado esperado según los 10 ficheros de ejemplo que subí:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Gene_1  103485500              
Gene_5  103485501              
Gene_8  103485502              
Gene_2  103485503       489128844      
        103485504               550923138
        103485506       489128842      
        103485507       489128838      
        103485508               550923139
        103485507       489128838      
        103485506       489128842      
        103485503       489128844      
                489128849       550923140
Gene_4          489128852      
Gene_10         489128854      
Gene_8          489128857      
Gene_3          489128860      
Gene_10                 550923135
Gene_1                  550923136
Gene_8                  550923137
        103485504               550923138
        103485508               550923139
                489128849       550923140
Gene_1  103485500               550923136
Gene_10         489128854       550923135
Gene_2  103485503              
Gene_3          489128860      
Gene_4          489128852      
Gene_5  103485501              
        103485502       489128857       550923137
Gene_6                 
Gene_7                 
Gene_9                 
        103485499              
        103485505              
                        550923130
                        550923131
                        550923133
                        550923134
                489128835      
                489128847
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

He creado un código que creo que realiza bien la primera parte (asignar todos los ortólogos de forma ordenada). Quedaría incorporar los genes de los ficheros .id que no tienen asignado ningún ortólogo.

Pego el código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4.  
  5. my $F = "./files";                     # variable que me dice la ruta de la carpeta donde están los ficheros
  6. my %O;
  7. my @a = `ls $F/*.comp`;                # guardo la ruta de cada archivo .comp para luego ir abriendo uno por uno
  8. foreach my $a (@a) {                   # abro cada fichero uno por uno
  9.     my ( $path, $path2 ) = split( "files/", $a );       # me quedo con el nombre de cada organismo del par que comparo
  10.     my ( $a1,   $a2 )    = split( "_vs_",   $path2 );
  11.     $a2 =~ s/.comp//g;
  12.     $a2 =~ s/\n//g;
  13.     $a2 =~ s/\s//g;
  14.     $a1 =~ s/\n//g;
  15.     $a1 =~ s/\s//g;
  16.     open in, $a;
  17.  
  18.     while (<in>) {
  19.         chomp $_;
  20.         my ( $ai1, $ai2 ) = split /\t/;    # elimino los posibles caracteres "extras" que tengan los identificadores
  21.         $ai1 =~ s/\n//g;
  22.         $ai1 =~ s/\s//g;
  23.         $ai2 =~ s/\n//g;
  24.         $ai2 =~ s/\s//g;
  25.  
  26.         # guardo cada identificador en el array correspondiente para generar la asociación
  27.         push @{ $O{$ai1} }, "$ai1";
  28.         push @{ $O{$ai1} }, "$ai2";
  29.         push @{ $O{$ai2} }, "$ai2";
  30.         push @{ $O{$ai2} }, "$ai1";
  31.     }
  32.     close in;
  33. }
  34.  
  35. foreach my $llave ( sort keys %O ) {                    # recorro el array con las asociaciones
  36.     my %saw;
  37.     @saw{ @{ $O{$llave} } } = ();
  38.     @{ $O{$llave} } = sort keys %saw;                   # elimino redundancia
  39.     @{ $O{$llave} } = gene_order( @{ $O{$llave} } );    # envío a subrutina para ordenar los identificadores
  40.     print "@{$O{$llave}}\n";                            # imprimo el resultado por pantalla
  41. }
  42.  
  43. ###########
  44. #subrutina#
  45. ###########
  46.  
  47. sub gene_order ()                      # ordeno los identificadores según el organismo al que pertenecen
  48. {
  49.     my ( $var1, $var2, $var3, $var4 ) = @_;
  50.     my @var = ( $var1, $var2, $var3, $var4 );
  51.  
  52.     #   print "$var1\n$var2\n$var3\n$var4\n";
  53.     my @org;
  54.     my $i;
  55.     for ( $i = 0; $i < 3; $i++ ) {
  56.         if ( $var[$i] =~ /^G/ ) {
  57.             $org[0] = "$var[$i]";
  58.         }
  59.         if ( $var[$i] =~ /^1/ ) {
  60.             $org[1] = "$var[$i]";
  61.         }
  62.         if ( $var[$i] =~ /^4/ ) {
  63.             $org[2] = "$var[$i]";
  64.         }
  65.         if ( $var[$i] =~ /^5/ ) {
  66.             $org[3] = "$var[$i]";
  67.         }
  68.     }
  69.     return "$org[0]\t$org[1]\t$org[2]\t$org[3]";
  70. }
  71.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Muchas gracias de nuevo :-)

Inma
igarrom
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2014-01-28 04:06 @212

Re: Organizar información de ortólogos

Notapor explorer » 2014-02-03 12:56 @580

¿Por qué hay dos líneas así?
Sintáxis: [ Descargar ] [ Ocultar ]
  1. Gene_1 103485500        
  2. Gene_1 103485500        550923136 

Y ¿por qué hay una línea así?
Sintáxis: [ Descargar ] [ Ocultar ]
  1.     103485502    489128857    550923137 

Todos están relacionados con Gene_8, pero no entre sí.

Entonces... en cada línea, debería aparecer los códigos que apareen coincidentes entre sí, pero en esa línea, no lo son.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron