Página 1 de 1

Unir péptidos solapantes

NotaPublicado: 2012-06-18 08:25 @392
por millen
Hola a todos, tengo un problemilla:

Digamos que tengo esto en un array @array:

1. ACD => 0
2. CDE => 0
3. DEF => 1
4. EFG => 1
5. FGH => 1
6. GHI => 0
7. GHJ => 0
8. HJK => 1
9. JKL => 1
10. KLM => 1
11. LMN => 0

Yo lo que quiero es juntar los péptidos solapantes que lleven el 1.

Por ejemplo, el primer péptido sería DEFGH y el segundo: HJKLM.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach $line (@array) {
  2.     if ($line =~ /\d+\s([A-Z]+)\s(\d)/ {
  3.             $peptido  = $1;
  4.                 $pred = $2;
  5.         }
  6.         if ( $pred eq "1" ) {
  7.             $peptidos_unos = $peptido;
  8.         }
  9.     }
  10.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Llevo bastante rato intentándolo, pero no se me ocurre cómo hacerlo. Si alguien me puede echar una mano...

Muchas gracias.

Re: Unir péptidos solapantes

NotaPublicado: 2012-06-18 09:35 @441
por explorer
El problema se reduce a "unir" los péptidos que tienen un valor de '1', así que podemos sacarles antes a otro array.

Pero, ¿DEFGH es el resultado de la unión de 3, 4 y 5, o sólo de 3 y 5?

La solución no es sencilla...

En CPAN hay algunas implementaciones del Problema de la mayor subcadena común.

Re: Unir péptidos solapantes

NotaPublicado: 2012-06-18 09:45 @448
por millen
3,4 y 5

Re: Unir péptidos solapantes

NotaPublicado: 2012-06-18 17:19 @763
por explorer
¿Puedes poner un ejemplo real, aunque sea corto, de lo que quieres hacer?

Me temo que no es nada obvio resolver esto... ¿No estará solucionado en algún módulo de BioPerl?

Re: Unir péptidos solapantes

NotaPublicado: 2012-06-19 03:16 @178
por millen
A ver, un ejemplo seria el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
1. DIVLTQS => 0
2. IVLTQSP => 0
3. VLTQSPA => 0
4. LTQSPAS => 0
5. TQSPASL => 0
6. QSPASLS => 0
7. SPASLSA => 0
8. PASLSAS => 0
9. ASLSASV => 0
10. SLSASVG => 0
11. LSASVGE => 0
12. SASVGET => 0
13. ASVGETV => 0
14. SVGETVT => 0
15. VGETVTI => 0
16. GETVTIT => 0
17. ETVTITC => 0
18. TVTITCR => 0
19. VTITCRA => 0
20. TITCRAS => 0
21. ITCRASG => 0
22. TCRASGN => 0
23. CRASGNI => 0
24. RASGNIH => 0
25. ASGNIHN => 0
26. SGNIHNY => 0
27. GNIHNYL => 0
28. NIHNYLA => 0
29. IHNYLAW => 0
30. HNYLAWY => 0
31. NYLAWYQ => 0
32. YLAWYQQ => 0
33. LAWYQQK => 0
34. AWYQQKQ => 0
35. WYQQKQG => 1
36. YQQKQGK => 1
37. QQKQGKS => 1
38. QKQGKSP => 1
39. KQGKSPQ => 1
40. QGKSPQL => 1
41. GKSPQLL => 1
42. KSPQLLV => 1
43. SPQLLVY => 0
44. PQLLVYY => 0
45. QLLVYYT => 0
46. LLVYYTT => 0
47. LVYYTTT => 0
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Sería unir los péptidos del 35 al 42. Por lo tanto, sería sacar un epítopo como este: WYQQKQGKSPQLLV

Re: Unir péptidos solapantes

NotaPublicado: 2012-06-19 05:26 @268
por explorer
Bueno, parece entonces que el problema es muy sencillo, ya que de un péptido a otro solo varía una letra en una posición consecutiva...

Una cosa: la lista que estás sacando no coincide con la expresión regular que pusiste al principio.

Re: Unir péptidos solapantes

NotaPublicado: 2012-06-19 05:56 @289
por millen
¡Ah, no no! No coincide, es que no tenía el archivo a mano, y lo hice de memoria.

Re: Unir péptidos solapantes

NotaPublicado: 2012-06-19 11:06 @504
por millen
Hola de nuevo:

Esto debería estar bien, por lo menos para extraer el primer péptido de cada grupo de unos. Pero no me sale, ¿qué estoy haciendo mal?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub extend_gap {
  2.  
  3.     my @prediction = @_;
  4.     my ( $peptido, $pred );
  5.  
  6.     foreach my $i (@prediction) {
  7.         if ( $i =~ /\d+\.\s([A-Z]+)\s=>\s(\d)/ ) {
  8.             $peptido = $1;
  9.             $pred    = $2;
  10.         }
  11.         if ( $pred eq "0" ) {
  12.             next;
  13.             if ( $pred eq "0" ) {
  14.                 next;
  15.             }
  16.             elsif ( $pred eq "1" ) {
  17.                 print $peptido;
  18.             }
  19.         }
  20.     }
  21. }
  22.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Unir péptidos solapantes

NotaPublicado: 2012-06-19 15:18 @679
por explorer
El siguiente programa resuelve el problema... aunque habría que ver si funciona en todos los casos...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.10;
  3.  
  4. my @peptidos;
  5.  
  6. while (<DATA>) {                                        # Leemos los péptidos que tienen valor 1
  7.     chomp;
  8.     my($peptido, $valor) = split;
  9.     next if $valor != 1;
  10.     push @peptidos, $peptido;
  11. }
  12.  
  13. my $hay_cambios = 1;                                    # Recorremos el array mientras consigamos hacer cambios
  14.  
  15. while ($hay_cambios) {                                  # mientras haya cambios...
  16.  
  17.     $hay_cambios = 0;                                   # suponemos que no los habrá
  18.  
  19.     for my $i (0 .. $#peptidos) {                       # recorremos los @peptidos
  20.  
  21.         my $peptido_a_probar = $peptidos[$i];           # probamos cada uno
  22.         next if not $peptido_a_probar;
  23.  
  24.         for my $j (0 .. $#peptidos) {                   # que comparamos con todos los demás
  25.             next if $j == $i;                           # (salvo consigo mismo)
  26.  
  27.                                                         # del posible péptido le quitamos el último carácter
  28.             my $posible_peptido_a_agregar = substr $peptidos[$j], 0, -1;
  29.             next if not $posible_peptido_a_agregar;
  30.  
  31.                                                         # si el posible péptido está dentro del de prueba
  32.             if ($peptido_a_probar =~ m/$posible_peptido_a_agregar$/) {
  33.  
  34.                                                         # metemos el posible dentro del de prueba
  35.                 substr  $peptido_a_probar,
  36.                         pos($peptido_a_probar) - length($posible_peptido_a_agregar),
  37.                         length($peptidos[$j]),
  38.                         $peptidos[$j];
  39.  
  40.                 delete $peptidos[$j];                   # ya no necesitamos este péptido (está agregado)
  41.  
  42.                 $hay_cambios++;                         # contamos un cambio más
  43.             }
  44.         }
  45.  
  46.         if ($hay_cambios) {                             # si hubo cambios en la última pasada
  47.             $peptidos[$i] = $peptido_a_probar;          # guardamos el nuevo péptido
  48.             last;                                       # y reiniciamos la búsqueda
  49.         }
  50.     }
  51. }
  52.  
  53. @peptidos = grep { defined } @peptidos;                 # nos quedamos con las celdas que contengan algo
  54.  
  55. if (@peptidos) {                                        # pintamos el resultado
  56.     say "Péptidos encontrados:";
  57.     say "\t$_" for @peptidos;
  58. }
  59.  
  60. __DATA__
  61. DIVLTQS 0
  62. IVLTQSP 0
  63. VLTQSPA 0
  64. LTQSPAS 0
  65. TQSPASL 0
  66. QSPASLS 0
  67. SPASLSA 0
  68. PASLSAS 0
  69. ASLSASV 0
  70. SLSASVG 0
  71. LSASVGE 0
  72. SASVGET 0
  73. ASVGETV 0
  74. SVGETVT 0
  75. VGETVTI 0
  76. GETVTIT 0
  77. ETVTITC 0
  78. TVTITCR 0
  79. VTITCRA 0
  80. TITCRAS 0
  81. ITCRASG 0
  82. TCRASGN 1
  83. CRASGNI 1
  84. RASGNIH 1
  85. ASGNIHN 0
  86. SGNIHNY 0
  87. GNIHNYL 0
  88. NIHNYLA 0
  89. IHNYLAW 0
  90. HNYLAWY 0
  91. NYLAWYQ 0
  92. YLAWYQQ 0
  93. LAWYQQK 0
  94. AWYQQKQ 0
  95. WYQQKQG 1
  96. YQQKQGK 1
  97. QQKQGKS 1
  98. QKQGKSP 1
  99. KQGKSPQ 1
  100. QGKSPQL 1
  101. GKSPQLL 1
  102. KSPQLLV 1
  103. SPQLLVY 0
  104. PQLLVYY 0
  105. QLLVYYT 0
  106. LLVYYTT 0
  107. LVYYTTT 0
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Péptidos encontrados:
        TCRASGNIH
        WYQQKQGKSPQLLV
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4