Raw content of Bio::EnsEMBL::Analysis::RunnableDB::BestTargetted # Cared for by Ensembl # # Copyright GRL & EBI # # You may distribute this module under the same terms as perl itself # # POD documentation - main docs before the code =head1 NAME Bio::EnsEMBL::Analysis::RunnableDB::BestTargetted =head1 SYNOPSIS my $db = Bio::EnsEMBL::DBAdaptor->new($locator); my $cond = Bio::EnsEMBL::Analysis::RunnableDB::BestTargetted ->new (-db => $pipelinedb, -input_id => $input_id -analysis => $analysis ); $cond->fetch_input(); $cond->run(); $cond->write_output(); =head1 DESCRIPTION This module acts as an intermediate between the runnable and the core database. It reads configuration and uses information from the analysis object to setup the runnable and then write the results back to the database specified in the config file. =head1 CONTACT Post questions to the Ensembl development list: ensembl-dev@ebi.ac.uk =cut package Bio::EnsEMBL::Analysis::RunnableDB::BestTargetted; use strict; use warnings; use Bio::EnsEMBL::Analysis::RunnableDB::BaseGeneBuild; use Bio::EnsEMBL::Analysis::Config::GeneBuild::BestTargetted; use Bio::EnsEMBL::Analysis::Runnable::BestTargetted; use Bio::EnsEMBL::Utils::Exception qw(verbose throw warning info stack_trace_dump ); use vars qw(@ISA); @ISA = qw(Bio::EnsEMBL::Analysis::RunnableDB::BaseGeneBuild); sub new { my ($class,@args) = @_; my $self = $class->SUPER::new(@args); $self->read_and_check_config($BEST_TARGETTED_CONFIG); my $seqfetcher = $self->make_seqfetcher($self->SEQFETCHER_DIR, $self->SEQFETCHER_OBJECT); $self->seqfetcher($seqfetcher); return $self; } sub fetch_input{ my ($self) = @_; $self->throw("No input id") unless defined($self->input_id); my $dnadb = $self->get_dbadaptor('REFERENCE_DB'); my $db = $self->get_dbadaptor($self->DB_NAME); $db->dnadb($dnadb); my $slice = $self->fetch_sequence($self->input_id, $db); $self->query($slice); my @genes; my @all_bt_for_clustering; # fetch genes from different databases foreach my $db_alias ( keys %{ $self->INPUT_DATA_FROM_DBS } ) { print "fetching out of DB : " . $db_alias ." : " ; my @biotypes_to_fetch = @{${$self->INPUT_DATA_FROM_DBS }{$db_alias}}; for ( @biotypes_to_fetch ) { print $_ . " " ; } print "\n"; # get db adaptor for db my $input_db = $self->get_dbadaptor($db_alias) ; # get slice my $input_slice = $self->fetch_sequence($self->input_id, $input_db); # get biotypes # for my $bt ( @biotypes_to_fetch ) { my @genes_fetched = @{ $input_slice->get_all_Genes_by_type($bt) } ; print "-> $bt ".scalar(@genes_fetched) . " genes fetched \n" ; push @genes, @genes_fetched; push @all_bt_for_clustering , $bt ; } } $self->BIOTYPES(\@all_bt_for_clustering) ; print "\nGot ".scalar(@genes)." genes\n"; $self->genes(\@genes); # my @genes = @{ $slice->get_all_Genes($self->PRIMARY_LOGICNAME) } ; # print "\nGot ".scalar(@genes)." genes from primary logic_name\n"; # push @genes, @{ $slice->get_all_Genes($self->SECONDARY_LOGICNAME) } ; # print "Now have ".scalar(@genes)." genes in total"; # $self->genes(\@genes); return 1; } sub run { my ($self) = @_; my $runnable = Bio::EnsEMBL::Analysis::Runnable::BestTargetted->new ( -query => $self->query, -analysis => $self->analysis, -seqfetcher => $self->seqfetcher, -biotypes => $self->BIOTYPES, -program => $self->EXONERATE_PROGRAM, -verbose => $self->VERBOSE, -keep_single_analysis => $self->KEEP_SINGLE_ANALYSIS, -genes => $self->genes, ); eval{ $runnable->run; }; # # checking errors from Runnable # if(my $err = $@){ chomp $err; print $err ; # only match '"ABC_DEFGH"' and not all possible throws if ($err =~ /^\"([A-Z_]{1,40})\"$/i) { my $code = $1; if ($code ne 'VOID') { $self->failing_job_status($1); throw("BestTargetted::run failed $@"); } } } else { print $@; } $self->output($runnable->output); 1; } sub write_output{ my ($self) = @_; my $out_dba = $self->get_dbadaptor($self->OUT_DB_NAME); my $gene_a = $out_dba->get_GeneAdaptor() ; info ("trying to write output") ; foreach my $gene (@{$self->output}){ info("storing $gene" ); $gene_a->store($gene) ; } return ; } =head2 make_seqfetcher Title : make_seqfetcher Usage : Function: if $index exists, returns a Bio::EnsEMBL::Pipeline::SeqFetcher::Getseqs, otherwise throws Example : Returns : Bio::DB::RandomAccessI Args : $indexname - string =cut sub make_seqfetcher { my ( $self, $index, $seqfetcher_class ) = @_; my $seqfetcher; (my $class = $seqfetcher_class) =~ s/::/\//g; throw ("Configuration-error !! There's no entry for SEQFETCHER_OBJECT in Targetted.pm\n") if (length($class)==0) ; require "$class.pm"; if(defined $index && $index ne ''){ my @db = ( $index ); # make sure that your class is compatible with the index type $seqfetcher = "$seqfetcher_class"->new('-db' => \@db, ); } else{ $self->throw("can't make seqfetcher\n"); } return $seqfetcher; } #################################### # config variable holders #################################### sub read_and_check_config { my ($self, $hash) = @_; $self->SUPER::read_and_check_config($hash); my $logic = $self->analysis->logic_name; foreach my $var (qw(BIOTYPES DB_NAME SEQFETCHER_DIR SEQFETCHER_OBJECT)) { throw("You must define $var in config for logic '$logic'" . " or in the DEFAULT entry") if not $self->$var; } if (not $self->OUT_DB_NAME) { warn ("\n\tOUT_DB_NAME has not been provided in config-file Analysis/Config/GeneBuild/BestTargetted.pm\n ". "\toutput will be written to " . $self->DB_NAME . "\n"); $self->OUT_DB_NAME($self->DB_NAME); } } ############## # containers ############## sub seqfetcher { my ($self,$value) = @_; if (defined $value) { $self->{_seq_fetcher} = $value; } return $self->{_seq_fetcher}; } sub genes { my ($self,$value) = @_; if (defined $value) { $self->{_genes} = $value; } return $self->{_genes}; } ################ # CONFIG VARS ################ sub BIOTYPES { my ($self,$value) = @_; if (defined $value) { $self->{_biotypes} = $value; } return $self->{_biotypes}; } sub INPUT_DATA_FROM_DBS { my ($self,$value) = @_; if (defined $value) { $self->{_input_data_from_dbs} = $value; } return $self->{_input_data_from_dbs}; } sub SEQFETCHER_DIR { my ($self,$value) = @_; if (defined $value) { $self->{_seqfetcher_dir} = $value; } return $self->{_seqfetcher_dir}; } sub SEQFETCHER_OBJECT { my ($self,$value) = @_; if (defined $value) { $self->{_seqfetcher_object} = $value; } return $self->{_seqfetcher_object}; } sub DB_NAME { my ($self,$value) = @_; if (defined $value) { $self->{_dbname} = $value; } return $self->{_dbname}; } sub OUT_DB_NAME { my ($self,$value) = @_; if (defined $value) { $self->{_outdb_name} = $value; } return $self->{_outdb_name}; } sub EXONERATE_PROGRAM { my ($self,$value) = @_; if (defined $value) { $self->{_exon_prog} = $value; } return $self->{_exon_prog}; } sub VERBOSE { my ($self,$value) = @_; if (defined $value) { $self->{_verbose} = $value; } return $self->{_verbose}; } sub KEEP_SINGLE_ANALYSIS { my ($self,$value) = @_; if (defined $value) { $self->{_keep_single_analysis} = $value; } return $self->{_keep_single_analysis}; } 1;