Bio::EnsEMBL::Analysis RunnableDB
SummaryIncluded librariesPackage variablesSynopsisDescriptionGeneral documentationMethods
Toolbar
WebCvsRaw content
Summary
Bio::EnsEMBL::Analysis::RunnableDB
Package variables
No package variables defined.
Included modules
Bio::EnsEMBL::Analysis::Config::General qw ( CORE_VERBOSITY LOGGER_VERBOSITY )
Bio::EnsEMBL::Analysis::Tools::FeatureFactory
Bio::EnsEMBL::Analysis::Tools::Logger qw ( logger_info logger_verbosity )
Bio::EnsEMBL::Analysis::Tools::Utilities qw ( parse_config )
Bio::EnsEMBL::Utils::Argument qw ( rearrange )
Bio::EnsEMBL::Utils::Exception qw ( verbose throw warning info )
Inherit
Unavailable
Synopsis
  my $repeat_masker = Bio::EnsEMBL::Analysis::RunnableDB::RepeatMasker->
new(
-input_id => 'contig::AL805961.22.1.166258:1:166258:1',
-db => $db,
-analysis => $analysis,
);
$repeat_masker->fetch_input;
$repeat_masker->run;
$repeat_masker->write_output;
Description
This module acts as a base class for our RunnableDBs who act as an
interface between the core database and our Runnables both fetching
input data and writing data back to the databases
The module provides some base functionality some of which must be
used
The constructor fits the model the pipeline which runs most of
our analyses expects. If a child runnabledb expects more arguments
to the constructor than this one it wont be directly runnable by the
pipeline
Most of the other methods provided are containers of some description
but there are some methods with specific functionality
parameters_hash is there to parse a string from the parameters varible
in the analysis object. This string should have the format
key => value, key => value where the key would be the Runnables
constructor argument and the value the variable. This is to allow
some flexibility in the arguments expected by and the way we run
Runnables.
fetch_sequence fetched a sequence using the fetch_by_name method of
the slice adaptor from the given database. The name, database and an
array of logic_names to determine masking can be given. If no name
or database is provided the method defaults to input_id and db
validate, this is a method which does some basic validation of the
feature before storage. This checks if slice and analysis object are
defined and if start, end and strand are defined then that the start
is smaller than the end and both the start and end are > 0
All runnableDBs need to implement 3 methods to run within the pipeline
fetch_input, this always must be implemented by individual child
RunnableDBs as the input required for different analyses can vary so
widely that it is impossible to write a generic method
run, there is a run method implemented. To use this child runnabledbs
need to have added the runnables they want run to the runnable method
which holds an array of runnables which are each called and the output
stored in this method
write_output, there is also a generic implementation of this. To use this
method the child runnabledb must implement a get_adaptor method which
returns the appropriate adaptor to be used in storage.
Methods
analysisDescriptionCode
dbDescriptionCode
failing_job_status
No description
Code
feature_factoryDescriptionCode
fetch_inputDescriptionCode
fetch_sequenceDescriptionCode
input_id
No description
Code
input_is_void
No description
Code
newDescriptionCode
outputDescriptionCode
parameters_hashDescriptionCode
queryDescriptionCode
read_and_check_configDescriptionCode
require_moduleDescriptionCode
runDescriptionCode
runnableDescriptionCode
write_outputDescriptionCode
Methods description
analysiscode    nextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Arg [2] : Bio::EnsEMBL::Analysis
Function : container for analysis object
Returntype: Bio::EnsEMBL::Analysis
Exceptions: throws passed incorrect object type
Example :
dbcodeprevnextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Arg [2] : Bio::EnsEMBL::Pipeline::DBAdaptor
Function : container for dbadaptor
Returntype: Bio::EnsEMBL::Pipeline::DBSQL::DBAdaptor
Exceptions: throws if not passed a Bio::EnsEMBL::DBSQL::DBConnection
object
Example :
feature_factorycodeprevnextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Arg [2] : Bio::EnsEMBL::Analysis::Tools::FeatureFactory
Function : container for a feature factory object. If none is defined
when one is requested a new one is created.
Returntype: Bio::EnsEMBL::Analysis::Tools::FeatureFactory
Exceptions: none
Example :
fetch_inputcodeprevnextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Function : throw as it means child hasnt implement an essential method
Returntype: none
Exceptions: see function
Example :
fetch_sequencecodeprevnextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Arg [2] : string, name
Arg [3] : Bio::EnsEMBL::DBAdaptor
Arg [4] : arrayref of logic_name if sequence is to be masked
Arg [5] : Boolean for softmasking if sequence is to be softmasked
Function : gets sequence from specifed database
Returntype: Bio::EnsEMBL::Slice
Exceptions: none
Example :
newcodeprevnextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Arg [2] : Bio::EnsEMBL::Pipeline::DBSQL::DBAdaptor
Arg [3] : Bio::EnsEMBL::Analysis
Function : create a Bio::EnsEMBL::Analysis::RunnableDB object
Returntype: Bio::EnsEMBL::Analysis::RunnableDB
Exceptions: throws if not passed either a dbadaptor, input id or
an analysis object
Example : $rdb = $perl_path->new( -analysis => $self->analysis,
-input_id => $self->input_id,
-db => $self->adaptor->db );
outputcodeprevnextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Arg [2] : arrayref of output
Function : push array passed into onto output array
Returntype: arrayref
Exceptions: throws if not passed correct type
Example : $self->output(\@output);
parameters_hashcodeprevnextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Arg [2] : string, parameters string
Function : parses the parameters string into a hash
for the Runnables constructor. If neither of the delimiters
are found in the string the string is given the key of options
Returntype: hashref
Exceptions:
Example :
querycodeprevnextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Arg [2] : Bio::EnsEMBL::Slice
Function : container for slice object
Returntype: Bio::EnsEMBL::Slice
Exceptions: throws if passed the incorrect object type
Example :
read_and_check_configcodeprevnextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Arg [2] : hashref, should be the hashref from which ever config file
you are reading
Function : to on the basis of the entries of the hash in your specific
config file set up instance variables first for the default values then for
any values specific to you logic name
Returntype: none
Exceptions: none
Example :
require_modulecodeprevnextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB::Blast
Arg [2] : string, module path
Function : uses perls require to use the past in module
Returntype: returns module name with / replaced by ::
Exceptions: throws if require fails
Example : my $parser =
$self->require('Bio/EnsEMBL/Analysis/Tools/BPliteWrapper');
runcodeprevnextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Function : cycles through all the runnables, calls run and pushes
their output into the RunnableDBs output array
Returntype: array ref
Exceptions: none
Example :
runnablecodeprevnextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Arg [2] : Bio::EnsEMBL::Analysis::Runnable
Function : container for an array of runnables
Returntype: arrayref
Exceptions: throws if passed the wrong object type
Example :
write_outputcodeprevnextTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Function : set analysis and slice on each feature
Returntype: 1
Exceptions: none
Example :
Methods code
analysisdescriptionprevnextTop
sub analysis {
  my $self = shift;
  my $analysis = shift;
  if($analysis){
    throw("Must pass RunnableDB:analysis a Bio::EnsEMBL::Analysis".
          "not a ".$analysis) unless($analysis->isa
                                     ('Bio::EnsEMBL::Analysis'));
    $self->{'analysis'} = $analysis;
  }
  return $self->{'analysis'};
}
dbdescriptionprevnextTop
sub db {
  my $self = shift;
  my $db = shift;
  if($db){
    throw("Must pass RunnableDB:db a Bio::EnsEMBL::DBSQL::DBAdaptor ".
          "not a ".$db) 
      unless($db->isa('Bio::EnsEMBL::DBSQL::DBAdaptor'));
    $self->{'db'} = $db;
  }
  return $self->{'db'};
}
failing_job_statusdescriptionprevnextTop
sub failing_job_status {
  my $self = shift;
  $self->{'failing_status'} = shift if(@_);
  return $self->{'failing_status'};
}
feature_factorydescriptionprevnextTop
sub feature_factory {
  my ($self, $feature_factory) = @_;
  if($feature_factory){
    $self->{'feature_factory'} = $feature_factory;
  }
  if(!$self->{'feature_factory'}){
    $self->{'feature_factory'} = Bio::EnsEMBL::Analysis::Tools::FeatureFactory
      ->new();
  }
  return $self->{'feature_factory'};
}

#utility methods
}
fetch_inputdescriptionprevnextTop
sub fetch_input {
  my ($self) = @_;
  throw("Must implement fetch input in ".$self." RunnableDB will ".
        "not provide this");
}
fetch_sequencedescriptionprevnextTop
sub fetch_sequence {
  my ($self, $name, $db, $repeat_masking, $soft_masking) = @_;
  if(!$db){
    $db = $self->db;
  }
  if(!$name){
    $name = $self->input_id;
  }
  my $sa = $db->get_SliceAdaptor;
  my $slice = $sa->fetch_by_name($name);
  $repeat_masking = [] unless($repeat_masking);
  if(!$slice){
    throw("Failed to fetch slice ".$name);
  }
  if(@$repeat_masking){
    my $sequence = $slice->get_repeatmasked_seq($repeat_masking, $soft_masking);
    $slice = $sequence
  }
  return $slice;
}
input_iddescriptionprevnextTop
sub input_id {
  my $self = shift;
  $self->{'input_id'} = shift if(@_);
  return $self->{'input_id'};
}
input_is_voiddescriptionprevnextTop
sub input_is_void {
  my $self = shift;
  $self->{'input_is_void'} = shift if(@_);
  return $self->{'input_is_void'};
}
newdescriptionprevnextTop
sub new {
  my ($class,@args) = @_;
  my $self = bless {},$class;
  my ($db, $input_id, $analysis) = rearrange
    (['DB', 'INPUT_ID', 'ANALYSIS'], @args);
  if(!$db || !$analysis || !$input_id){
    throw("Can't create a RunnableDB without a dbadaptor ".
          $db." an analysis object ".$analysis.
          " or an input_id ".$input_id);
  }
 

  #Clone analysis to prevent analysis reference problem when
#using separate pipeline and output DBs
#Do not use adaptor here as caching returns same reference
my $cloned_analysis; %{$cloned_analysis} = %{$analysis}; $analysis = bless $cloned_analysis, ref ($analysis); $self->db($db); $self->analysis($analysis); $self->input_id($input_id); verbose($CORE_VERBOSITY); logger_verbosity($LOGGER_VERBOSITY); return $self;
}
outputdescriptionprevnextTop
sub output {
  my ($self, $output) = @_;
  if(!$self->{'output'}){
    $self->{'output'} = [];
  }
  if($output){
    if(ref($output) ne 'ARRAY'){
      throw('Must pass RunnableDB:output an array ref not a '.$output);
    }
    push(@{$self->{'output'}}, @$output);
  }
  return $self->{'output'};
}
parameters_hashdescriptionprevnextTop
sub parameters_hash {
  my ($self, $string) = @_;

  if(!$string){
    $string = $self->analysis->parameters;
  }
  my %parameters_hash;

  if ($string) {
    if($string =~  /,/ || $string =~ /=>/){
      my @pairs = split (/,/, $string);
      foreach my $pair(@pairs){
        my ($key, $value) = split (/=>/, $pair);
        if ($key && ($value || $value == 0)) {
          $key   =~ s/^\s+//g;
          $key   =~ s/\s+$//g;
          $value =~ s/^\s+//g;
          $value =~ s/\s+$//g;
          $parameters_hash{$key} = $value;
        } else {
          $parameters_hash{$key} = 1;
        }
      }
    }else{
      $parameters_hash{'-options'} = $string;
    }
  }
  return\% parameters_hash;
}
querydescriptionprevnextTop
sub query {
  my $self = shift;
  my $slice = shift;
  if($slice){
    throw("Must pass RunnableDB:query a Bio::EnsEMBL::Slice".
          "not a ".$slice) unless($slice->isa
                                     ('Bio::EnsEMBL::Slice'));
    $self->{'slice'} = $slice;
  }
  return $self->{'slice'};
}
read_and_check_configdescriptionprevnextTop
sub read_and_check_config {
  my ($self, $var_hash) = @_;
  parse_config($self, $var_hash, $self->analysis->logic_name);
}
require_moduledescriptionprevnextTop
sub require_module {
  my ($self, $module) = @_;
  my $class;
  ($class = $module) =~ s/::/\//g;
  eval{
    require "$class.pm";
  };
  throw("Couldn't require ".$class." Blast:require_module $@") if($@);
  return $module;
}

1;
}
rundescriptionprevnextTop
sub run {
  my ($self) = @_;
  foreach my $runnable(@{$self->runnable}){
    $runnable->run;
    $self->output($runnable->output);
  }
  return $self->{'output'};
}
runnabledescriptionprevnextTop
sub runnable {
  my ($self, $runnable) = @_;
  if(!$self->{'runnable'}){
    $self->{'runnable'} = [];
  }
  if($runnable){
    throw("Must pass RunnableDB:runnable a ".
          "Bio::EnsEMBL::Analysis::Runnable not a ".$runnable) 
      unless($runnable->isa('Bio::EnsEMBL::Analysis::Runnable'));
    push(@{$self->{'runnable'}}, $runnable);
  }
  return $self->{'runnable'};
}
write_outputdescriptionprevnextTop
sub write_output {
  my ($self) = @_;
  my $adaptor = $self->get_adaptor;

  foreach my $feature(@{$self->output}){
    $feature->analysis($self->analysis);
    $feature->slice($self->query) if(!$feature->slice);
    $self->feature_factory->validate($feature);

    eval{
      $adaptor->store($feature);
    };
    if($@){
      throw("RunnableDB:store failed, failed to write ".$feature." to ".
            "the database ".$adaptor->dbc->dbname." $@");
    }
  }
  return 1;
}
General documentation
CONTACTTop
Post questions to the Ensembl development list: ensembl-dev@ebi.ac.uk
containersTop
  Arg [1]   : Bio::EnsEMBL::Analysis::RunnableDB
Arg [2] : string/int
Function : container for specified variable. This pod refers to the
three methods below, input_id, input_is_void, failing_job_status. This
are simple containers which dont do more than hold and return an given
value
Returntype: string/int
Exceptions: none
Example :