• Publicidad

Contador de cisteínas en una secuencia Fasta de aminoácidos

Perl aplicado a la bioinformática

Contador de cisteínas en una secuencia Fasta de aminoácidos

Notapor alemanmd » 2011-11-28 20:24 @892

Hola a todos.

Voy empezando con Perl. Tengo que hacer un contador de cisteínas (el número de veces que aparece la letra C en la secuencia de aminoácidos) en un archivo múltiple en formato fasta. Tengo varios días y no puedo. ¿Podría alguien darme una idea de cómo puedo hacer esto?

El input sería algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>217618
MHHPILLSAFISIASSLRLNAPTVNKRGSTIAQPGSIKDVIVTSFNTLNSTHHYRIPKAKPHSWNDTIST
HNLSLKLYNNYNGGPINAYIQGLDSNGAIVFITSNGTLIHPRSNNSSSPIEIKDKLAIPLPPKGQSLTLN
ITTSLTSGRVYFSEGNLKFFTINLGAGDGLVQPSVNNLHDPSASLNWGFIELTFLRNGALYANISYVDFV
GLILSMMLSTKDGGTPQITRGLRANAVYDLCEGLFKQTANDGYLWLAMCVVGKTGDPVRVLSPNYYQRVY
AADFEDYWQDYVDTVWEYYSSHTLAIDTQTPLGQVECQVTNDTLYCAEDNRGYAKPTASDIWGCNSGPFG
LQEGDNPVHVAVIPRLCAAFVRSTLLIRGGDVQPRLNSSYHYSVSPTNHYSRIVHELQVDGRGYAFSYDD
VNPNGHEDVSGLVSSGNPDTLTVYVGGPPN*


>161114
MAPSGTLPLAAAILALAGIVTAQQPGTSTPEVHPKLTTYQCTTSGGCVAQDTSVVLDWNYRWMHDANYNS
CTVNGGVNTTICPDEATCGTNCFIEGVNYTASGVTTSGSSLTMNQYMPATTGGYSSVSPRLYLLGADGNY
VLLQLNGKELSFDVDLSALPCGENGSLYLSQMADNGGANQYNTAGANYGSGYCDAQCPVQTWKNGTLNTN
HSGYCCNEMDILEGNSEANALTPHSCTATACDSSGCGLNPYASGFHSYYGPGLTVDTSKPFTITTQFNTD
NGSPSGNLVSITRKYIQNGVSIPSAQSGGDIISSCPSASAYGGLTTMGKALTSGMVLIFSIWNDSGGYMN
WLDSGSSGPCSSTEGNPSTILANNPGTHVTFSNIKWGDIGSTTSGGSSPPPPPASSTTLRTSTTTSKTST
APPSCTQTHWGQCGGNGYTGCKTCASGTTCQYSNDCEYSMNISKRRFRILIM*


>86295
MVLFRSLVFFSATACAATAPPSQSQGGIMAEQGLPDGIYQAAAVQGPTFEAPSAVPSSHLSLRGWKHPPG
EGDFHEKPGPHTEDEYSVPIHATRHSCHKDRHILLNSTEYRRAIDNLWDYCQNFKVPYHGAHLSIVGDVM
VYVCAYGRERPCHRHEWNEAEQIMDKKCGQGKGSHVQMRKKLKEYGRAHVGKKVCASSSLGMDLEWKTKP
LPVLVNGQTLGHWKAGPPRYKAGDPQYKAEEDGKKEDKAEEDGKKEDKVEDDGKKKDKAG*
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y la idea del output es algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ID                 Cisteinas
217618                 6
161114                 9
86295                  12
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Gracias de antemano,
Iván Alemán
Última edición por explorer el 2011-11-29 05:07 @255, editado 2 veces en total
Razón: Marcas de texto
alemanmd
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-11-28 20:16 @886

Publicidad

Re: Contador de cisteínas en una secuencia Fasta de aminoácidos

Notapor explorer » 2011-11-28 20:39 @902

Bienvenido a los foros de Perl en español, alemanmd.

Bueno, el problema parece muy sencillo, si solo hay que contar las letras 'C'...

¿No tienes nada de código hecho?
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

codigo de programa para contar citsinas ("C"

Notapor alemanmd » 2011-11-29 01:10 @090

Hola explorer, gracias por editar mi mensaje,

Hola de nuevo.
Sobre el contador de "C"...
Sí tengo algo escrito, aunque la verdad me de un poco de vergüenza subirlo.
Pero aquí va, es este.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2.  
  3. my $file = $ARGV[0];
  4.  
  5. if ( !opendir( DIR, "" ) ) {
  6.     mkdir("Cisteinas");
  7. }
  8. else {
  9.     close(DIR);
  10. }
  11.  
  12. open( MIA, "$file" ) or die("No puedo abrir $file\n");
  13. open( ROB, ">Cisteinas/Ta_cisteinas.txt" ) or die("No puedo abrir Ta_cisteinas.txt\n");
  14.  
  15. my $nombre;
  16. my $secuencia;
  17. my $linea;
  18. my $r = 0;
  19. my $i = 0;
  20. my @a;
  21.  
  22. while ( $linea = <MIA> ) {
  23.     chomp($linea);
  24.     if ( $linea =~ /([\d]+)/ ) {
  25.         $nombre = $1;
  26.         $r++;
  27.     }
  28.     unless ( $linea =~ /\d/ ) {
  29.         $secuencia = $linea;
  30.         my @a = split( //, $secuencia );
  31.         if ( $secuencia =~ /C/ ) {
  32.             $i++;
  33.  
  34.             #print  "$secuencia\n";
  35.             print "$nombre\t$i\n";
  36.         }
  37.     }
  38. }
  39. print "hay [$r] secuencias en tu archivo";
  40.  
  41. close(MIA);
  42. close(ROB);
  43.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2011-11-29 05:10 @257, editado 1 vez en total
Razón: Formateado de código con Perltidy
alemanmd
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-11-28 20:16 @886

Re: Contador de cisteínas en una secuencia Fasta de aminoácidos

Notapor explorer » 2011-11-29 06:37 @317

Casi lo tenías hecho...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my $file = $ARGV[0] or die "Uso: $0 <fichero fasta>\n";
  6.  
  7. my $DIR = 'Cisteinas';
  8.  
  9. if ( !-d $DIR ) {                    # si no existe ese directorio
  10.     mkdir($DIR);                     # lo creamos
  11. }
  12.  
  13. open( MIA, "<$file" )                 or die("ERROR: No puedo abrir $file: $!\n");
  14. open( ROB, ">$DIR/Ta_cisteinas.txt" ) or die("ERROR: No puedo abrir Ta_cisteinas.txt: $!\n");
  15.  
  16. my $nombre;
  17. my $r = 0;
  18. my $i = 0;
  19.  
  20. print ROB "ID\t\tCisteinas\n";
  21.  
  22. while (my $linea = <MIA> ) {
  23.     chomp($linea);
  24.  
  25.     if ( $linea =~ /^>([\d]+)/ ) {
  26.         if ($nombre) {                 # si tenemos leída una secuencia anterior,
  27.             print ROB "$nombre\t\t$i\n";  # la sacamos
  28.         }
  29.         $nombre = $1;
  30.         $r++;
  31.         $i = 0;                        # Iniciamos el contador
  32.     }
  33.     else {
  34.         my @a = split( //, $linea );
  35.         for my $letra (@a) {
  36.             if ( $letra eq 'C' ) {     # Si la letra es 'C'
  37.                 $i++;                  # la contamos
  38.             }
  39.         }
  40.     }
  41. }
  42.  
  43. # Última secuencia
  44. if ($nombre) {
  45.     print "$nombre\t\t$i\n";
  46. }
  47.  
  48. print "Hay [$r] secuencias en tu archivo\n";
  49.  
  50. close(MIA);
  51. close(ROB);
  52.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Esta es otra versión, un poco más corta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my $file = $ARGV[0] or die "Uso: $0 <fichero fasta>\n";
  6.  
  7. open MIA, "$file"   or die "ERROR: No puedo abrir $file: $!\n";
  8. $/ = "\n\n";                        # Separador entre secuencias
  9. my @secuencias = <MIA>;             # Leemos todas las secuencias
  10. close MIA;
  11.  
  12. print "ID\t\tCisteinas\n";
  13.  
  14. for (@secuencias) {
  15.     if (my($nombre, $secuencia) = /^>(\d+)(.+)/sm) {
  16.         my $i = $secuencia =~ tr/C/C/;
  17.         print "$nombre\t\t$i\n";
  18.     }
  19. }
  20.  
  21. print "Hay ", scalar(@secuencias), " secuencias en tu archivo\n";
  22.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

  • Línea 8: aquí modificamos el delimitador de lectura, para que, en vez de leer del fichero línea a línea, leemos una secuencia entera
  • Línea 9: las leemos todas, metiendo cada una en un elemento del array
  • Línea 15: con una expresión regular sacamos la información que nos interesa
  • Línea 16: contamos las 'C'
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: Contador de cisteínas en una secuencia Fasta de aminoácidos

Notapor manuel3180 » 2011-11-29 10:12 @467

Yo tengo una consulta algo similar: ¿cómo conseguir el porcentaje de G+C en una cadena de nucleótidos?. Recordemos que dicho porcentaje es un indicador de la presencia de un exon o exones en una cadena nucleotídica, es decir, un gen. ¡¡¡¡Saludos!!!!
manuel3180
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-11-27 23:43 @030

Re: Contador de cisteínas en una secuencia Fasta de aminoácidos

Notapor explorer » 2011-11-29 10:58 @498

Bueno, solo habría que contar las apariciones de 'C' y 'G':

my $i = $secuencia =~ tr/CG/CG/;

Y para sacar el porcentaje habría que dividir $i por la longitud de la $secuencia. Pero antes de usar length($secuencia), hay que limpiarla de espacios en blanco (los caracteres de fin de línea):

$secuencia =~ s/\s//g;

Y ya podemos calcular el porcentaje:

$porcentaje = $i / length $secuencia;
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: Contador de cisteínas en una secuencia Fasta de aminoácidos

Notapor alemanmd » 2011-11-29 12:44 @572

Gracias, explorer, el programa funciona muy bien.

Por si a alguien más le sirve, la última secuencia no la escribe en el archivo de salida. Solo hay que agregar lo siguiente:

Modificar esta línea agregando ROB para escribirla también
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Última secuencia
  2. if ($nombre) {
  3.     print "$nombre\t\t$i\n";
  4. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


quedaría entonces

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Última secuencia
  2. if ($nombre) {
  3.     print ROB "$nombre\t\t$i\n";
  4. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Saludos perleros
Iván Alemán
alemanmd
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-11-28 20:16 @886

Re: Contador de cisteínas en una secuencia Fasta de aminoácidos

Notapor manuel3180 » 2011-11-29 12:45 @572

¡¡¡¡¡ Muchas Gracias por la respuesta !!!!!
manuel3180
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-11-27 23:43 @030

Re: Contador de cisteínas en una secuencia Fasta de aminoácidos

Notapor explorer » 2011-11-29 17:11 @757

alemanmd escribiste:la última secuencia no la escribe en el archivo de salida
¿Dónde no sale? ¿En la segunda versión?

Pues a mí me sale... ¿estás seguro?
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: Contador de cisteínas en una secuencia Fasta de aminoáci

Notapor cocodrila » 2012-05-08 10:38 @484

¡Hola!

Muy útil la información, ¡gracias!

Yo tengo un problema similar, pero en vez de buscar la "C" me gustaría que recorriera un array en el que están los 20 residuos (ej. @aminoacidos), de manera que contara cuántas veces aparece cada residuo en el total de secuencias (no necesito reiniciar el contador) pero no tengo claro cómo decirle que para cada $letra mire si equivalen a los elementos de @aminoacidos.

for $letra (@seq)
for ($i = 0; $i < @aminoacidos; $1++) # esto no cogerá el valor (A, R, ...), solo correrá 20 veces...
en cambio:
for $aa (@aminoacios)
if $aa eq $letra... # aquí no sé como indicar los distintos contadores, que tienen que ser contadores asociados a $aa[0], $aa[1], ...$aa[19]

¿Alguna sugerencia de hacia dónde tirar?

Y una cosa más. Si en vez de guardar las secuencias como elementos del array, lo leemos de la siguiente manera:

while ($line=<MSA>) {
chomp $line;
if ($line=~/^>/) {
@line=split(/\|/, $line);
$refseqid=$line[3]; # nombre proteína
} else {
$msa{$refseqid}.=$line; # secuencia proteína
}
}

¿Cómo puedo buscar el patrón en los values del hash? ¿Tengo que meter todos los values en un mismo array para luego recorrer elemento por elemento o con algo tipo "for (values %hash)", tendría que splitarlo y guardarlo en array?

Muchas gracias.
cocodrila
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-11-04 04:48 @242

Siguiente

Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados

cron