Raw content of Bio::EnsEMBL::Compara::RunnableDB::Threshold_on_dS
#
# You may distribute this module under the same terms as perl itself
#
# POD documentation - main docs before the code
=pod
=head1 NAME
Bio::EnsEMBL::Compara::RunnableDB::Threshold_on_dS
=cut
=head1 SYNOPSIS
my $aa = $sdba->get_AnalysisAdaptor;
my $analysis = $aa->fetch_by_logic_name('Threshold_on_dS');
my $rdb = new Bio::EnsEMBL::Compara::RunnableDB::Threshold_on_dS(
-input_id => [[1,2,3,14],[4,13],[11,16]]
-analysis => $analysis);
$rdb->fetch_input
$rdb->run;
=cut
=head1 DESCRIPTION
This is a homology compara specific runnableDB, that based on an input
of arrayrefs of genome_db_ids, calculates the median dS for each paired species
where dS values are available, and stores 2*median in the threshold_on_ds column
in the homology table.
=cut
=head1 CONTACT
abel@ebi.ac.uk, jessica@ebi.ac.uk
=cut
=head1 APPENDIX
The rest of the documentation details each of the object methods.
Internal methods are usually preceded with a _
=cut
package Bio::EnsEMBL::Compara::RunnableDB::Threshold_on_dS;
use strict;
use Bio::EnsEMBL::Compara::DBSQL::DBAdaptor;
use Bio::EnsEMBL::Hive;
use Statistics::Descriptive;
use vars qw(@ISA);
@ISA = qw(Bio::EnsEMBL::Hive::Process);
sub fetch_input {
my( $self) = @_;
$self->{'species_sets_aref'} = undef;
$self->throw("No input_id") unless defined($self->input_id);
#create a Compara::DBAdaptor which shares the same DBI handle
#with the pipeline DBAdaptor that is based into this runnable
$self->{'comparaDBA'} = Bio::EnsEMBL::Compara::DBSQL::DBAdaptor->new(-DBCONN=>$self->db->dbc);
$self->get_params($self->input_id);
return 1;
}
sub get_params {
my $self = shift;
my $param_string = shift;
return unless($param_string);
print("parsing parameter string : ",$param_string,"\n");
my $params = eval($param_string);
return unless($params);
foreach my $key (keys %$params) {
print(" $key : ", $params->{$key}, "\n");
}
if (defined $params->{'species_sets'}) {
$self->{'species_sets_aref'} = $params->{'species_sets'};
}
if (!defined $params->{'method_link_types'}){
# Default will be orthologues
$params->{method_link_types} = ['ENSEMBL_ORTHOLOGUES'];
}
$self->{'method_link_types'} = [@{$params->{'method_link_types'}}];
elsif (defined $params->{'method_link_type'}) {
warn( 'The method_link_type paramerter is deprecated. '.
'Please use method_link_types with an arrayref value instead' );
$self->{'method_link_types'} = [$params->{'method_link_type'}];
}
return;
}
sub run
{
my $self = shift;
return 1 unless($self->{'species_sets_aref'});
$self->calc_threshold_on_dS($self->{'species_sets_aref'});
return 1;
}
sub write_output {
my $self = shift;
return 1;
}
##########################################
#
# internal methods
#
##########################################
sub calc_threshold_on_dS {
my $self = shift;
my $species_sets_aref = shift;
my $aa = $self->db->get_AnalysisAdaptor;
my $Threshold_on_dS_analysis = $aa->fetch_by_logic_name('Threshold_on_dS');
my $compara_dbc = $self->{'comparaDBA'}->dbc;
my $sql = "select ds from homology where method_link_species_set_id = ? and ds is not NULL";
my $sth = $compara_dbc->prepare($sql);
$sql = "update homology set threshold_on_ds = ? where method_link_species_set_id = ?";
my $sth2 = $compara_dbc->prepare($sql);
my $mlssa = $self->{'comparaDBA'}->get_MethodLinkSpeciesSetAdaptor;
foreach my $species_set (@{$species_sets_aref}) {
while (my $genome_db_id1 = shift @{$species_set}) {
foreach my $genome_db_id2 (@{$species_set}) {
foreach my $method_link_type(@{$self->{'method_link_types'}}){
my $mlss = $mlssa->fetch_by_method_link_type_genome_db_ids
($method_link_type,[$genome_db_id1,$genome_db_id2]);
$sth->execute($mlss->dbID);
my $stats = new Statistics::Descriptive::Full;
my $dS;
$sth->bind_columns(\$dS);
my $count = 0;
while ($sth->fetch) {
$stats->add_data($dS);
$count++;
}
if ($count) {
my $median = $stats->median;
print STDERR "method_link_species_set_id: ",$mlss->dbID,"; median: ",$median,"; 2\*median: ",2*$median;
if($median >1.0) {
print STDERR " threshold exceeds 2.0 - to distant -> clear values\n";
$median = 0.0;
}
$sth2->execute(2*$median, $mlss->dbID);
print STDERR " stored\n";
}
}
}
}
}
$sth->finish;
}
1;