Página 1 de 1

Extraer regiones al azar de un genoma (genbank)

NotaPublicado: 2011-08-23 11:19 @513
por alexander2714
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

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

NotaPublicado: 2011-08-23 11:31 @521
por explorer
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.

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

NotaPublicado: 2011-08-23 11:42 @529
por alexander2714
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?

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

NotaPublicado: 2011-08-23 11:53 @536
por explorer
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];

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

NotaPublicado: 2011-08-23 11:59 @541
por alexander2714
Muchísimas gracias: ¡esa es la última coordenada!