• Publicidad

Extraer regiones al azar de un genoma (genbank)

Perl aplicado a la bioinformática

Extraer regiones al azar de un genoma (genbank)

Notapor alexander2714 » 2011-08-23 11:19 @513

Hola.
Necesito hacer un script que extraiga regiones al azar de un archivo genbank. La región debe tener 500 nt de longitud.

Mi código es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Bio::SeqIO;
  2.  
  3. sub extract_intergenic_from_genbank {
  4.     my ( $infile, $out_intergenic_file, $min_intergenic_size, $max_intergenic_size ) = @_;
  5.  
  6.     my ( $n_of_intergenic, $gi, $start, $end, $length, $strand, $taxon ) = (0);
  7.     my $in = new Bio::SeqIO( -file => "NC_002755.gb", -format => 'genbank' );
  8.  
  9.     open( FNA, ">$salida.FASTA" )
  10.         || die "# extract_intergenic_from_genbank : cannot create $out_intergenic_file\n";
  11.  
  12.     while ( my $seq = $in->next_seq )  # scan all sequences found in $input
  13.     {
  14.         my ( $gbaccession, $sequence, $gen, @genes ) = ( $seq->accession() );
  15.         $sequence = $seq->primary_seq()->seq()
  16.             || 'no encuentro la secuencia primaria, necesito un fichero GenBank completo!';
  17.         $taxon = '';
  18.  
  19.         for my $f ( $seq->get_SeqFeatures ) {
  20.             if ( $f->primary_tag =~ /CDS|rRNA|tRNA/ )    # campos de 'genes'
  21.             {
  22.                 $gi = '';
  23.                 if ( $f->has_tag('db_xref') ) {
  24.                     my $crossrefs = join( ',', sort $f->each_tag_value('db_xref') );
  25.                     if ( $crossrefs =~ /(GI\:\d+)/ ) { $gi = $1 }
  26.                 }
  27.                 elsif ( $f->has_tag('locus_tag') ) {
  28.                     if ( $gi eq '' && $f->has_tag('locus_tag') ) {
  29.                         $gi = "ID:" . join( ',', sort $f->each_tag_value('locus_tag') );
  30.                     }
  31.                 }
  32.  
  33.                 next if ( $gi eq '' );
  34.  
  35.                 $start  = $f->start();
  36.                 $end    = $f->end();
  37.                 $strand = $f->location()->strand();
  38.                 push( @genes, [ $start, $end, $gi, $strand ] );
  39.             }
  40.             elsif ( $f->primary_tag() =~ /source/ ) {
  41.                 if ( $f->has_tag('organism') ) {
  42.                     foreach my $element ( $f->each_tag_value('organism') ) {
  43.                         $taxon .= "[$element],";
  44.                     }
  45.                     chop $taxon;
  46.                 }
  47.             }
  48.         }
  49.  
  50.         for ( $gen = 1; $gen < scalar(@genes); $gen++ ) {
  51.             $n_of_intergenic++;
  52.  
  53.             $start  = int( rand(4403249) );
  54.             $end    = $start + 500;
  55.             $length = $end - $start;
  56.  
  57.             print FNA ">intergenic$n_of_intergenic|$gbaccession|coords:$start..$end|"
  58.                 . "length:$length|neighbours:$genes[$gen-1][2]($genes[$gen-1][3]),"
  59.                 . "$genes[$gen][2]($genes[$gen][3])|$taxon\n";
  60.  
  61.             print FNA substr( $sequence, $start, $length ) . "\n";
  62.  
  63.         }
  64.     }
  65.  
  66.     close(FNA);
  67.  
  68.     return $n_of_intergenic;
  69. }
  70.  
  71. &extract_intergenic_from_genbank;
  72.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


En esta parte del código $start = int(rand(4403249));, 4403249 es igual a la última coordenada del genbank pero eso yo lo elaboré solo para este archivo genbank. Necesito que en vez de ese número esté en una variable que contenga la última coordenada del genbank. ¿Cómo podría hacer eso?

Gracias
alexander2714
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2011-07-25 11:22 @515

Publicidad

Re: Extraer regiones al azar de un genoma (genbank)

Notapor explorer » 2011-08-23 11:31 @521

Se lo puedes pasar como un argumento más, a la subrutina. Solo tienes que recibir el valor en una nueva variable que pondrás en la línea 4.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Extraer regiones al azar de un genoma (genbank)

Notapor alexander2714 » 2011-08-23 11:42 @529

Sí, pero lo que necesito en sí es poder hacer este script para cualquier archivo genbank donde la última coordenada nunca va a ser igual.

En está posición del arreglo, $genes[$gen][1], ahí hay una lista de coordenadas. ¿Cómo extraigo la última de ellas en una variable?
Última edición por explorer el 2011-08-23 11:45 @531, editado 1 vez en total
Razón: Ortografía
alexander2714
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2011-07-25 11:22 @515

Re: Extraer regiones al azar de un genoma (genbank)

Notapor explorer » 2011-08-23 11:53 @536

En $genes[$gen][1] solo hay una coordenada: la posición final del gen número $gen.

Si quieres extraer la posición final del último gen, sería:

my $ultimo = $genes[-1][1];
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Extraer regiones al azar de un genoma (genbank)

Notapor alexander2714 » 2011-08-23 11:59 @541

Muchísimas gracias: ¡esa es la última coordenada!
alexander2714
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2011-07-25 11:22 @515


Volver a Bioinformática

¿Quién está conectado?

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