He empezado con Perl hace relativamente poco, y estoy tratando de hacer el primer script de algo que sea útil y que no sea solo un ejemplo chorra.
Lo que intento conseguir con esto, es que este programa ejecute él solo varios BLAST a partir de un archivo de secuencias en FASTA, compruebe que resultados son comunes entre varias secuencias y te digas cuáles son, número de acceso, descripción y con qué longitud aparean cada una de las secuencias.
Para ello he usado BioPerl y he canibalizado un par de programas que nos pasó un profesor que nos estaba explicando esto (de hecho aún están los comentarios originales por ahí xD) para que lea las secuencias de FASTA y lance los BLAST, ya que no me llevo muy bien aún con BioPerl y con los objetos; y luego la parte de las comparaciones ya las he hecho yo.
Pues bien, cuando lo ejecuto me da el error:
Not a GLOB reference at comparacion.pl line 37.
He buscado por qué puede ser y no acabo de entender lo de los GLOB, y como es una parte de las que no he hecho yo, puede que, o bien la esté cagando y me falte algo, o me haya colado o lo que sea, por lo que si me podéis echar una mano en cómo solucionarlo os lo agradecería infinitamente. Aquí va el código, no seáis muy duros con él
Using perl Syntax Highlighting
- use strict;
- use Bio::Tools::Run::RemoteBlast;
- # use strict;
- my $ficherosalida = "loquesea.txt";
- my $prog = 'blastp';
- my $db = 'swissprot';
- my $e_val = '1e-10';
- my @secuencia_name;
- my @secuencia_length;
- my @secuencia_accesion;
- my @secuencia_description;
- my @params = (
- '-prog' => $prog,
- '-data' => $db,
- '-expect' => $e_val,
- '-readmethod' => 'SearchIO'
- );
- my $factory = Bio::Tools::Run::RemoteBlast->new(@params);
- #change a paramter
- # $Bio::Tools::Run::RemoteBlast::HEADER{'ENTREZ_QUERY'} = 'Homo sapiens [ORGN]';
- #remove a parameter
- # delete $Bio::Tools::Run::RemoteBlast::HEADER{'FILTER'};
- my $v = 1;
- my %hits_name;
- my %hits_length;
- my %hits_accesion;
- my %hits_description;
- #$v is just to turn on and off the messages
- my $str = Bio::SeqIO->new( -file => 'sequences.fasta', '-format' => 'fasta' );
- my @seq_array_name = <$str>;
- for ( my $i = 0; $i < int(@seq_array_name); $i++ ) {
- my @array_name;
- my @array_length;
- my @array_accesion;
- my @array_description;
- while ( my $input = $str->next_seq() ) {
- #Blast a sequence against a database:
- #Alternatively, you could pass in a file with many
- #sequences rather than loop through sequence one at a time
- #Remove the loop starting 'while (my $input = $str->next_seq())'
- #and swap the two lines below for an example of that.
- my $r = $factory->submit_blast($input);
- #my $r = $factory->submit_blast('amino.fa');
- print STDERR "waiting..." if ( $v > 0 );
- while ( my @rids = $factory->each_rid ) {
- foreach my $rid (@rids) {
- my $rc = $factory->retrieve_blast($rid);
- if ( !ref($rc) ) {
- if ( $rc < 0 ) {
- $factory->remove_rid($rid);
- }
- print STDERR "." if ( $v > 0 );
- sleep 5;
- }
- else {
- my $result = $rc->next_result();
- #save the output
- my $filename = $result->query_name() . "\.out";
- $factory->save_output($filename);
- $factory->remove_rid($rid);
- $secuencia_name[$i] = $result->query_name();
- $secuencia_accesion[$i] = $result->query_accesion();
- $secuencia_length[$i] = $result->query_length;
- $secuencia_description[$i] = $result->query_description();
- while ( my $hit = $result->next_hit ) {
- next unless ( $v > 0 );
- push( @array_name, $hit->name );
- push( @array_length, $hit->length );
- push( @array_accesion, $hit->accesion );
- push( @array_description, $hit->description );
- print "\nhit name is ", $hit->name, "\n";
- }
- }
- }
- }
- }
- $hits_name{$i} = join( ";", @array_name );
- $hits_length{$i} = join( ";", @array_length );
- $hits_accesion{$i} = join( ";", @array_accesion );
- $hits_description{$i} = join( ";", @array_description );
- }
- my $tamano = scalar( keys %hits_name );
- my @final;
- for ( my $i = 0; $i < $tamano; $i++ ) {
- my @comparar = [];
- my @resultados1 = split /;/ => $hits_name{$i};
- for ( my $j = $i++; $j = $tamano; $j++ ) {
- my @resultados2 = split /;/ => $hits_name{$j};
- @comparar = comparar( $i, $j, @resultados1, @resultados2 );
- if ( $j == $tamano - 1 ) {
- my @igualados = igualdades(@comparar);
- @final = ( @final, redaccion(@igualados) );
- }
- }
- }
- guardar_datos( $ficherosalida, @final );
- #################################
- ###########FUNCIONES#############
- #################################
- #Compara si los hits son el mismo y guarda la posición de los mismos dentro de la línea de datos del hash de guardado
- sub comparar {
- my ( $cadena1, $cadena2, @result1, @result2 ) = shift;
- my @comparacion = [];
- my $tamres1 = int @result1;
- my $tamres2 = int @result2;
- for ( my $i = 0; $i < $tamres1; $i++ ) {
- for ( my $j = 0; $j < $tamres2; $j++ ) {
- if ( $result1[$i] eq $result2[$j] ) {
- my $a = int @comparacion;
- $comparacion[$a] = "$cadena1" . ";" . "$i" . ";" . "$cadena2" . ";" . "$j";
- }
- }
- }
- return @comparacion;
- }
- #Ve si hay más de un hit igual para algún gen y los ordena en un único resultado
- sub igualdades {
- my (@resultados) = shift;
- my $tam = ( int @resultados ) - 1;
- for ( my $i = 0; $i < $tam; $i++ ) {
- my @res1 = split /;/ => $resultados[$i];
- for ( my $j = $i + 1; $j < $tam; $j++ ) {
- if ( $resultados[$j] != 0 ) {
- my @res2 = split /;/ => $resultados[$j];
- if ( $res1[1] == $res2[1] ) {
- $resultados[$i] = $resultados[$i] . ";" . "$res2[2]" . ";" . "$res2[3]";
- $resultados[$j] = 0;
- }
- }
- }
- }
- return @resultados;
- }
- #Con los datos de los hits comunes redacta una salida de datos para cada hit
- sub redaccion {
- my @datos = shift;
- my @redaccion = [];
- my $h = 0;
- foreach my $resultado (@datos) {
- my @informacion = split /;/ => $resultado;
- my $tam = int @informacion;
- my @queries;
- my $hit;
- my $acceso;
- my $descripcion;
- my @longitudes;
- my $j = 0;
- for ( my $i = 0; $i < $tam; $i = $i + 2 ) {
- my $secuencia = $informacion[$i];
- my $tama = $informacion[ $i + 1 ];
- my $longitud = $hits_length{$secuencia};
- my @todas_long = split /;/ => $longitud;
- $queries[$j] = $secuencia_description[$secuencia];
- $longitudes[$j] = $todas_long[$tama];
- $j++;
- }
- my $sec1 = $informacion[0];
- my $pos1 = $informacion[1];
- my $hit_comun = $hits_name{$sec1};
- my $hit_acceso = $hits_accesion{$sec1};
- my $hit_descripcion = $hits_description{$sec1};
- my @hitcom = split /;/ => $hit_comun;
- my @hitacc = split /;/ => $hit_acceso;
- my @hitdes = split /;/ => $hit_descripcion;
- my $nombrehit = $hitcom[$pos1];
- my $nombreacc = $hitacc[$pos1];
- my $nombredes = $hitdes[$pos1];
- my $numerosecu = int @queries;
- my $secredactado = "";
- my $lonredactado = "";
- for ( my $k = 0; $k < $numerosecu; $k++ ) {
- $secredactado = $secredactado . " y " . $queries[$k];
- $lonredactado = $lonredactado . " y " . $longitudes[$k];
- }
- $redaccion[$h]
- = "Las secuencias $secredactado tienen en comun el gen $nombrehit\n"
- . "cuya descripcion es $nombredes , su numero de acceso $nombreacc \n;"
- . "y cada uno de ellos aparea las siguientes longitudes respectivamente: $lonredactado ";
- $h++;
- }
- return @redaccion;
- }
- #Guarda los datos en un fichero de salida
- sub guardar_datos {
- my ( $b, @salida ) = shift;
- ( open Fichero, ">$b" );
- my $N = int @salida;
- for ( my $i = 0; $i < $N; $i++ ) {
- print Fichero $salida[$i] . "\n";
- }
- close Fichero;
- }
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4