Raw content of Bio::EnsEMBL::Analysis::RunnableDB::Blast # Ensembl module for Bio::EnsEMBL::Analysis::RunnableDB::Blast # # Copyright (c) 2004 Ensembl # =head1 NAME Bio::EnsEMBL::Analysis::RunnableDB::Blast =head1 SYNOPSIS my $blast = Bio::EnsEMBL::Analysis::RunnableDB::Blast-> new( -analysis => $analysis, -db => $db, -input_id => 'contig::AL1347153.1.3517:1:3571:1' ); $blast->fetch_input; $blast->run; my @output =@{$blast->output}; =head1 DESCRIPTION This module acts as an intermediate between the blast runnable and the core database. It reads configuration and uses information from the analysis object to setup the blast runnable and then write the results back to the database =head1 CONTACT Post questions to the Ensembl development list: ensembl-dev@ebi.ac.uk =cut package Bio::EnsEMBL::Analysis::RunnableDB::Blast; use strict; use warnings; use Bio::EnsEMBL::Analysis::RunnableDB; use Bio::EnsEMBL::Analysis::Runnable::Blast; use Bio::EnsEMBL::Utils::Exception qw(throw warning); use Bio::EnsEMBL::Analysis::Config::General; use Bio::EnsEMBL::Analysis::Config::Blast; use vars qw(@ISA); @ISA = qw(Bio::EnsEMBL::Analysis::RunnableDB); sub new { my ($class,@args) = @_; my $self = $class->SUPER::new(@args); $self->read_and_check_config($BLAST_CONFIG); return $self; } =head2 fetch_input Arg [1] : Bio::EnsEMBL::Analysis::RunnableDB::Blast Function : fetch sequence out of database, instantiate the filter, parser and finally the blast runnable Returntype: 1 Exceptions: none Example : =cut sub fetch_input{ my ($self) = @_; my $slice = $self->fetch_sequence($self->input_id, $self->db, $ANALYSIS_REPEAT_MASKING); $self->query($slice); my %blast = %{$self->BLAST_PARAMS}; my $parser = $self->make_parser; my $filter; if($self->BLAST_FILTER){ $filter = $self->make_filter; } my $runnable = Bio::EnsEMBL::Analysis::Runnable::Blast->new ( -query => $self->query, -program => $self->analysis->program_file, -parser => $parser, -filter => $filter, -database => $self->analysis->db_file, -analysis => $self->analysis, %blast, ); $self->runnable($runnable); return 1; } =head2 run Arg [1] : Bio::EnsEMBL::Analysis::RunnableDB::Blast Function : go through the runnables, run each one and check for errors and push the output on to the output array Returntype: 1; Exceptions: throws if blast run fails Example : =cut sub run { my ($self) = @_; my @runnables = @{$self->runnable}; foreach my $runnable(@runnables){ eval{ $runnable->run; }; if(my $err = $@){ chomp $err; # only match '"ABC_DEFGH"' and not all possible throws if ($err =~ /^\"([A-Z_]{1,40})\"$/i) { my $code = $1; # treat VOID errors in a special way; they are really just # BLASTs way of saying "won't bother searching because # won't find anything" if ($code ne 'VOID') { $self->failing_job_status($1); throw("Blast::run failed $@"); } } elsif ($err) { throw("Blast Runnable returned unrecognised error string: $err"); } } $self->output($runnable->output); } 1; } =head2 write_output Arg [1] : Bio::EnsEMBL::Analysis::RunnableDB::Blast Function : get appropriate adaptors and write output to database after validating and attaching sequence and analysis objects Returntype: undef Exceptions: throws if the store fails Example : =cut sub write_output{ my ($self) = @_; my $dna_a = $self->db->get_DnaAlignFeatureAdaptor; my $protein_a = $self->db->get_ProteinAlignFeatureAdaptor; my $ff = $self->feature_factory; foreach my $f(@{$self->output}){ $f->analysis($self->analysis); $f->slice($self->query) if(!$f->slice); $ff->validate($f); if($f->isa('Bio::EnsEMBL::DnaDnaAlignFeature')){ eval{ $dna_a->store($f); }; throw("Blast:store failed failed to write ".$f." to the database ". "$@") if($@); }elsif($f->isa('Bio::EnsEMBL::DnaPepAlignFeature')){ eval{ $protein_a->store($f); }; throw("Blast:store failed failed to write ".$f." to the database ". "$@") if($@); } } return ; } =head2 make_parser Arg [1] : Bio::EnsEMBL::Analysis::RunnableDB::Blast Arg [2] : hashref, parameters for parser constructor Function : create a parser object Returntype: a parser object Exceptions: Example : =cut sub make_parser{ my ($self, $hash) = @_; if(!$hash){ $hash = $self->PARSER_PARAMS; } my %parser = %$hash; my $parser = $self->BLAST_PARSER->new( %parser ); return $parser; } =head2 make_filter Arg [1] : Bio::EnsEMBL::Analysis::RunnableDB::Blast Arg [2] : hashref, parameters for filter constructor Function : create a filter object Returntype: a filter object Exceptions: Example : =cut sub make_filter{ my ($self, $hash) = @_; if(!$hash){ $hash = $self->FILTER_PARAMS; } my %filter = %$hash; my $filter = $self->BLAST_FILTER->new( %filter ); return $filter; } #config methods sub read_and_check_config{ my ($self, $var_hash) = @_; #call RunnableDBs method to fill in values first $self->SUPER::read_and_check_config($var_hash); #now for type checking and other sanity checks #must have a parser object and to pass to blast throw("BLAST_PARSER must be defined either in the DEFAULT entry or in ". "the hash keyed on ".$self->analysis->logic_name. " Blast::read_and_check_config") if(!$self->BLAST_PARSER); $self->require_module($self->BLAST_PARSER); #load the filter module if defined if($self->BLAST_FILTER){ $self->require_module($self->BLAST_FILTER); } #if any of the object params exist, all are optional they must be hash #refs throw("PARSER_PARAMS must be a hash ref not ".$self->PARSER_PARAMS. " Blast::read_and_check_config") if($self->PARSER_PARAMS && ref($self->PARSER_PARAMS) ne 'HASH'); throw("FILTER_PARAMS must be a hash ref not ".$self->FILTER_PARAMS. " Blast::read_and_check_config") if($self->FILTER_PARAMS && ref($self->FILTER_PARAMS) ne 'HASH'); throw("BLAST_PARAMS must be a hash ref not ".$self->BLAST_PARAMS. " Blast::read_and_check_config") if($self->BLAST_PARAMS && ref($self->BLAST_PARAMS) ne 'HASH'); my $blast_params; if($self->BLAST_PARAMS){ $blast_params = $self->BLAST_PARAMS; }else{ $blast_params = {}; } my %parameters; if($self->parameters_hash){ %parameters = %{$self->parameters_hash}; } foreach my $key(%parameters){ $blast_params->{$key} = $parameters{$key}; } $self->BLAST_PARAMS($blast_params); } sub BLAST_PARSER{ my ($self, $value) = @_; if(defined $value){ $self->{'_CONFIG_BLAST_PARSER'} = $value; } return $self->{'_CONFIG_BLAST_PARSER'}; } sub PARSER_PARAMS{ my ($self, $value) = @_; if(defined $value){ $self->{'_CONFIG_PARSER_PARAMS'} = $value; } return $self->{'_CONFIG_PARSER_PARAMS'}; } sub BLAST_FILTER{ my ($self, $value) = @_; if(defined $value){ $self->{'_CONFIG_BLAST_FILTER'} = $value; } return $self->{'_CONFIG_BLAST_FILTER'}; } sub FILTER_PARAMS{ my ($self, $value) = @_; if(defined $value){ $self->{'_CONFIG_FILTER_PARAMS'} = $value; } return $self->{'_CONFIG_FILTER_PARAMS'}; } sub BLAST_PARAMS{ my ($self, $value) = @_; if(defined $value){ $self->{'_CONFIG_BLAST_PARAMS'} = $value; } return $self->{'_CONFIG_BLAST_PARAMS'}; } 1;