Raw content of Bio::EnsEMBL::Compara::DBSQL::MethodLinkSpeciesSetAdaptor
# Copyright EnsEMBL 2004
#
# Ensembl module for Bio::EnsEMBL::DBSQL::MethodLinkSpeciesAdaptor
#
# POD documentation - main docs before the code
#
=head1 NAME
Bio::EnsEMBL::DBSQL::MethodLinkSpeciesSetAdaptor - Object to access data in the method_link_species_set
and method_link tables
=head1 SYNOPSIS
=head2 Connecting to the database using the old way:
use Bio::EnsEMBL::Compara::DBSQL::DBAdaptor;
my $db = new Bio::EnsEMBL::Compara::DBSQL::DBAdaptor (
-host => $host,
-user => $dbuser,
-pass => $dbpass,
-port => $port,
-dbname => $dbname,
-conf_file => $conf_file);
my $mlssa = $db->get_MethodLinkSpeciesSetAdaptor();
=head2 Connecting to the database using the new way (recommended):
use Bio::EnsEMBL::Registry;
Bio::EnsEMBL::Registry->load_all($conf_file); # $conf_file can be undef
use Bio::EnsEMBL::Registry;
Bio::EnsEMBL::Registry->load_all($conf_file); # $conf_file can be undef
Bio::EnsEMBL::Registry->load_all();
my $mlssa = Bio::EnsEMBL::Registry->get_adaptor(
$compara_db_name, "compara", "MethodLinkSpeciesSet");
=head2 Store/Delete data from the database
$mlssa->store($method_link_species_set);
=head2 Retrieve data from the database
my $method_link_species_sets = $mlssa->fetch_all;
my $method_link_species_set = $mlssa->fetch_by_dbID(1);
my $method_link_species_set = $mlssa->fetch_by_method_link_type_registry_aliases(
"BLASTZ_NET", ["human", "Mus musculus"]);
my $method_link_species_sets = $mlssa->fetch_all_by_method_link_type("BLASTZ_NET");
my $method_link_species_sets = $mlssa->fetch_all_by_GenomeDB($genome_db);
my $method_link_species_sets = $mlssa->fetch_all_by_method_link_type_GenomeDB(
"PECAN", $gdb1);
my $method_link_species_set = $mlssa->fetch_by_method_link_type_GenomeDBs(
"TRANSLATED_BLAT", [$gdb1, $gdb2]);
=head1 DESCRIPTION
This object is intended for accessing data in the method_link and method_link_species_set tables.
=head1 INHERITANCE
This class inherits all the methods and attributes from Bio::EnsEMBL::DBSQL::BaseAdaptor
=head1 SEE ALSO
- Bio::EnsEMBL::Registry
- Bio::EnsEMBL::DBSQL::BaseAdaptor
- Bio::EnsEMBL::BaseAdaptor
- Bio::EnsEMBL::Compara::MethodLinkSpeciesSet
- Bio::EnsEMBL::Compara::GenomeDB
- Bio::EnsEMBL::Compara::DBSQL::GenomeDBAdaptor
=head1 AUTHOR
Javier Herrero (jherrero@ebi.ac.uk)
This modules is part of the Ensembl project
=head1 COPYRIGHT
Copyright (c) 2004. EnsEMBL Team
This modules is part of the EnsEMBL project (). You may distribute
it under the same terms as EnsEMBL itself.
=head1 CONTACT
Questions can be posted to the ensembl-dev mailing list: ensembl-dev@ebi.ac.uk
=head1 APPENDIX
The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _
=cut
# Let the code begin...
package Bio::EnsEMBL::Compara::DBSQL::MethodLinkSpeciesSetAdaptor;
use vars qw(@ISA);
use strict;
use Bio::EnsEMBL::Registry;
use Bio::EnsEMBL::Compara::MethodLinkSpeciesSet;
use Bio::EnsEMBL::Utils::Exception;
@ISA = qw(Bio::EnsEMBL::DBSQL::BaseAdaptor);
my $DEFAULT_MAX_ALIGNMENT = 20000;
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
return $self;
}
=head2 store
Arg 1 : Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
Example : $mlssa->store($method_link_species_set)
Description: Stores a Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object into
the database if it does not exist yet. It also stores or updates
accordingly the meta table if this object has a
max_alignment_length attribute.
Returntype : Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
Exception : Thrown if the argument is not a
Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
Exception : Thrown if the corresponding method_link is not in the
database
Caller :
=cut
sub store {
my ($self, $method_link_species_set) = @_;
my $sth;
throw("method_link_species_set must be a Bio::EnsEMBL::Compara::MethodLinkSpeciesSet\n")
unless ($method_link_species_set && ref $method_link_species_set &&
$method_link_species_set->isa("Bio::EnsEMBL::Compara::MethodLinkSpeciesSet"));
$method_link_species_set->adaptor($self);
my $method_link_sql = qq{SELECT 1 FROM method_link WHERE method_link_id = ?};
my $method_link_type_sql = qq{SELECT method_link_id from method_link where type = ?};
my $method_link_insert_sql = qq{INSERT INTO method_link (type, class) VALUES(?, ?)};
my $method_link_species_set_sql = qq{
INSERT IGNORE INTO method_link_species_set (
method_link_species_set_id,
method_link_id,
species_set_id,
name,
source,
url)
VALUES (?, ?, ?, ?, ?, ?)
};
my $method_link_id = $method_link_species_set->method_link_id;
my $method_link_type = $method_link_species_set->method_link_type;
my $method_link_class = ($method_link_species_set->method_link_class or "");
my $species_set = $method_link_species_set->species_set;
## If we have method_link_type but no method_link_id
if( $method_link_type and ! $method_link_id ){
# Is the type in the DB?
my $sth = $self->prepare($method_link_type_sql);
$sth->execute( $method_link_type );
if( my $res = $sth->fetchrow_arrayref ){
# Found existing
$method_link_id = $res->[0];
} else {
# Insert new
my $sth = $self->prepare($method_link_insert_sql);
$sth->execute( $method_link_type, $method_link_class );
$method_link_id = $sth->{'mysql_insertid'};
}
# Update the object
$method_link_species_set->method_link_id($method_link_id);
}
## Checks if method_link_id already exists in the database
$sth = $self->prepare($method_link_sql);
$sth->execute($method_link_id);
if (!$sth->fetchrow_array) {
throw("method_link_id $method_link_id is not in the database!\n");
}
$sth->finish;
## Fetch genome_db_ids from Bio::EnsEMBL::Compara::GenomeDB objects
my @genome_db_ids;
foreach my $species (@$species_set) {
push(@genome_db_ids, $species->dbID);
}
my $dbID;
my $already_existing_method_link_species_set =
$self->fetch_by_method_link_type_GenomeDBs($method_link_type,$species_set, 1);
if ($already_existing_method_link_species_set) {
$dbID = $already_existing_method_link_species_set->dbID;
}
if (!$dbID) {
## Lock the table in order to avoid a concurrent process to store the same object with a different dbID
# from mysql documentation 13.4.5 :
# "If your queries refer to a table using an alias, then you must lock the table using that same alias.
# "It will not work to lock the table without specifying the alias"
#Thus we need to lock method_link_species_set as a, method_link_species_set as b, and method_link_species_set
$self->dbc->do(qq{ LOCK TABLES method_link WRITE,
method_link_species_set as mlss WRITE,
method_link_species_set as mlss1 WRITE,
method_link_species_set as mlss2 WRITE,
method_link as ml WRITE,
species_set WRITE,
species_set as ss WRITE,
species_set as ss1 WRITE,
species_set as ss2 WRITE,
method_link_species_set WRITE });
# Now, check if the object has not been stored before (tables are locked)
$already_existing_method_link_species_set =
$self->fetch_by_method_link_type_GenomeDBs($method_link_type,$species_set, 1);
if ($already_existing_method_link_species_set) {
$dbID = $already_existing_method_link_species_set->dbID;
}
# If the object still does not exist in the DB, store it
if (!$dbID) {
$dbID = $method_link_species_set->dbID();
if (!$dbID) {
## Use convetion rule for getting a new dbID. At the moment, we yse the following
## ranges:
##
## dna-dna alignments: method_link_id E [1-100], method_link_species_set_id E [1-10000]
## synteny: method_link_id E [101-100], method_link_species_set_id E [10001-20000]
## homology: method_link_id E [201-300], method_link_species_set_id E [20001-30000]
## families: method_link_id E [301-400], method_link_species_set_id E [30001-40000]
##
## => the method_link_species_set_id must be between 10000 times the hundreds in the
## method_link_id and the next hundred.
my $sth2 = $self->prepare("SELECT
MAX(mlss1.method_link_species_set_id + 1)
FROM method_link_species_set mlss1 LEFT JOIN method_link_species_set mlss2
ON (mlss2.method_link_species_set_id = mlss1.method_link_species_set_id + 1)
WHERE mlss2.method_link_species_set_id IS NULL
AND mlss1.method_link_species_set_id > 10000 * ($method_link_id DIV 100)
AND mlss1.method_link_species_set_id < 10000 * (1 + $method_link_id DIV 100)
");
$sth2->execute();
($dbID) = $sth2->fetchrow_array();
$dbID = 10000 * int($method_link_id / 100) + 1 if (!defined($dbID));
}
my $species_set_id;
if ($method_link_species_set->species_set_id) {
$species_set_id = $method_link_species_set->species_set_id;
my $sth2 = $self->prepare("INSERT IGNORE INTO species_set VALUES (?, ?)");
foreach my $genome_db_id (@genome_db_ids) {
$sth2->execute($species_set_id, $genome_db_id);
}
} else {
$species_set_id = $self->_get_species_set_id_from_species_set($species_set);
}
if (!$species_set_id) {
my $sth2 = $self->prepare("INSERT INTO species_set VALUES (?, ?)");
foreach my $genome_db_id (@genome_db_ids) {
$sth2->execute(($species_set_id or "NULL"), $genome_db_id);
$species_set_id = $sth2->{'mysql_insertid'};
}
}
$sth = $self->prepare($method_link_species_set_sql);
$sth->execute(($dbID or "NULL"), $method_link_id, $species_set_id,
($method_link_species_set->name or "NULL"), ($method_link_species_set->source or "NULL"),
($method_link_species_set->url or ""));
$dbID = $sth->{'mysql_insertid'};
}
## Unlock tables
$self->dbc->do("UNLOCK TABLES");
}
## If this MethodLinkSpeciesSet object has a max_alignment_length attribute.
## We have to use the attribute and not the method here as the method is used
## for lazy-loading data from the meta table and could use default values if
## none has been specified. As some method_link_species_sets do not have any
## max_alignment_length, using the method here would result in adding a default
## max_alignment_length to those method_link_species_sets!
if (defined($method_link_species_set->{max_alignment_length})) {
my $values = $self->db->get_MetaContainer->list_value_by_key("max_align_$dbID");
if (@$values) {
if ($values->[0] != $method_link_species_set->max_alignment_length){
#... update it if it was already defined and it is different from current one
$self->db->get_MetaContainer->update_key_value("max_align_$dbID",
$method_link_species_set->max_alignment_length);
}
} else {
#... store it if it was not defined yet
$self->db->get_MetaContainer->store_key_value("max_align_$dbID",
$method_link_species_set->max_alignment_length)
}
}
$sth->finish;
$method_link_species_set->dbID($dbID);
return $method_link_species_set;
}
=head2 delete
Arg 1 : integer $method_link_species_set_id
Example : $mlssa->delete(23)
Description: Deletes a Bio::EnsEMBL::Compara::MethodLinkSpeciesSet entry from
the database.
Returntype : none
Exception :
Caller :
=cut
sub delete {
my ($self, $method_link_species_set_id) = @_;
my $sth;
my $method_link_species_set_sql = qq{
DELETE FROM
method_link_species_set
WHERE
method_link_species_set_id = ?
};
$sth = $self->prepare($method_link_species_set_sql);
$sth->execute($method_link_species_set_id);
## Delete corresponding entry in meta table
$self->db->get_MetaContainer->delete_key("max_align_$method_link_species_set_id");
}
=head2 fetch_all
Arg 1 : none
Example : my $method_link_species_sets = $mlssa->fetch_all
Description: Retrieve all possible Bio::EnsEMBL::Compara::MethodLinkSpeciesSet
objects
Returntype : listref of Bio::EnsEMBL::Compara::MethodLinkSpeciesSet objects
Exceptions : none
Caller :
=cut
sub fetch_all {
my ($self) = @_;
my $method_link_species_sets = [];
my $sql = qq{
SELECT
method_link_species_set_id,
method_link_species_set.method_link_id,
name,
source,
url,
method_link_species_set.species_set_id,
genome_db_id,
type,
class
FROM
method_link_species_set
LEFT JOIN method_link USING (method_link_id),
species_set
WHERE
method_link_species_set.species_set_id = species_set.species_set_id
};
my $sth = $self->prepare($sql);
$sth->execute();
my $all_method_link_species_sets;
my $gdba = $self->db->get_GenomeDBAdaptor;
while (my ($method_link_species_set_id, $method_link_id, $name, $source, $url,
$species_set_id, $genome_db_id, $type, $class) = $sth->fetchrow_array()) {
$all_method_link_species_sets->{$method_link_species_set_id}->{'METHOD_LINK_ID'} = $method_link_id;
$all_method_link_species_sets->{$method_link_species_set_id}->{'NAME'} = $name;
$all_method_link_species_sets->{$method_link_species_set_id}->{'SOURCE'} = $source;
$all_method_link_species_sets->{$method_link_species_set_id}->{'URL'} = $url;
$all_method_link_species_sets->{$method_link_species_set_id}->{'SPECIES_SET_ID'} = $species_set_id;
$all_method_link_species_sets->{$method_link_species_set_id}->{'METHOD_LINK_TYPE'} = $type;
$all_method_link_species_sets->{$method_link_species_set_id}->{'METHOD_LINK_CLASS'} = $class;
push(@{$all_method_link_species_sets->{$method_link_species_set_id}->{'SPECIES_SET'}},
$gdba->fetch_by_dbID($genome_db_id));
}
foreach my $method_link_species_set_id (keys %$all_method_link_species_sets) {
my $this_method_link_species_set;
eval { $this_method_link_species_set = new Bio::EnsEMBL::Compara::MethodLinkSpeciesSet(
-adaptor => $self,
-dbID => $method_link_species_set_id,
-method_link_id =>
$all_method_link_species_sets->{$method_link_species_set_id}->{'METHOD_LINK_ID'},
-method_link_type =>
$all_method_link_species_sets->{$method_link_species_set_id}->{'METHOD_LINK_TYPE'},
-method_link_class =>
$all_method_link_species_sets->{$method_link_species_set_id}->{'METHOD_LINK_CLASS'},
-name =>
$all_method_link_species_sets->{$method_link_species_set_id}->{'NAME'},
-source =>
$all_method_link_species_sets->{$method_link_species_set_id}->{'SOURCE'},
-url =>
$all_method_link_species_sets->{$method_link_species_set_id}->{'URL'},
-species_set_id =>
$all_method_link_species_sets->{$method_link_species_set_id}->{'SPECIES_SET_ID'},
-species_set =>
$all_method_link_species_sets->{$method_link_species_set_id}->{'SPECIES_SET'},
);
};
push(@$method_link_species_sets, $this_method_link_species_set) if (defined($this_method_link_species_set));
}
return $method_link_species_sets;
}
=head2 fetch_by_dbID
Arg 1 : integer $method_link_species_set_id
Example : my $method_link_species_set_id = $mlssa->fetch_by_dbID(1)
Description: Retrieve the correspondig
Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
Returntype : Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
Exceptions : Returns undef if no matching
Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object can be retrieved
Caller : none
=cut
sub fetch_by_dbID {
my ($self, $dbID) = @_;
my $method_link_species_set; # returned object
my $gdba = $self->db->get_GenomeDBAdaptor;
my $sql = qq{
SELECT
method_link_species_set_id,
mlss.method_link_id,
name,
source,
url,
mlss.species_set_id,
genome_db_id,
type
FROM
method_link_species_set mlss
LEFT JOIN method_link ml USING (method_link_id),
species_set ss
WHERE
mlss.species_set_id = ss.species_set_id
AND method_link_species_set_id = ?
};
my $sth = $self->prepare($sql);
$sth->execute($dbID);
my $this_method_link_species_set;
## Get all rows corresponding to this method_link_species_set
while (my ($method_link_species_set_id, $method_link_id, $name, $source, $url,
$species_set_id, $genome_db_id, $type, $class) = $sth->fetchrow_array()) {
$this_method_link_species_set->{'METHOD_LINK_ID'} = $method_link_id;
$this_method_link_species_set->{'METHOD_LINK_TYPE'} = $type;
$this_method_link_species_set->{'METHOD_LINK_CLASS'} = $class;
$this_method_link_species_set->{'NAME'} = $name;
$this_method_link_species_set->{'SOURCE'} = $source;
$this_method_link_species_set->{'URL'} = $url;
push(@{$this_method_link_species_set->{'SPECIES_SET'}}, $gdba->fetch_by_dbID($genome_db_id));
}
return undef if (!defined($this_method_link_species_set));
## Create the object
$method_link_species_set = new Bio::EnsEMBL::Compara::MethodLinkSpeciesSet(
-adaptor => $self,
-dbID => $dbID,
-method_link_id => $this_method_link_species_set->{'METHOD_LINK_ID'},
-method_link_type => $this_method_link_species_set->{'METHOD_LINK_TYPE'},
-method_link_class => $this_method_link_species_set->{'METHOD_LINK_CLASS'},
-name => $this_method_link_species_set->{'NAME'},
-source => $this_method_link_species_set->{'SOURCE'},
-url => $this_method_link_species_set->{'URL'},
-species_set_id => $this_method_link_species_set->{'SPECIES_SET_ID'},
-species_set => $this_method_link_species_set->{'SPECIES_SET'}
);
if (!$method_link_species_set) {
warning("No Bio::EnsEMBL::Compara::MethodLinkSpeciesSet with id = $dbID found");
}
return $method_link_species_set;
}
=head2 fetch_all_by_method_link_type
Arg 1 : string method_link_type
Example : my $method_link_species_sets =
$mlssa->fetch_all_by_method_link_type("BLASTZ_NET")
Description: Retrieve all the Bio::EnsEMBL::Compara::MethodLinkSpeciesSet objects
corresponding to the given method_link_type
Returntype : listref of Bio::EnsEMBL::Compara::MethodLinkSpeciesSet objects
Exceptions : none
Caller :
=cut
sub fetch_all_by_method_link_type {
my ($self, $method_link_type) = @_;
my $method_link_species_sets = [];
return [] if (!defined($method_link_type));
my $all_method_link_species_sets = $self->fetch_all();
foreach my $this_method_link_species_set (@$all_method_link_species_sets) {
if ($this_method_link_species_set->method_link_type eq $method_link_type) {
push(@$method_link_species_sets, $this_method_link_species_set);
}
}
return $method_link_species_sets;
}
=head2 fetch_all_by_GenomeDB
Arg 1 : Bio::EnsEMBL::Compara::GenomeDB $genome_db
Example : my $method_link_species_sets = $mlssa->fetch_all_by_genome_db($genome_db)
Description: Retrieve all the Bio::EnsEMBL::Compara::MethodLinkSpeciesSet objects
which includes the genome defined by the Bio::EnsEMBL::Compara::GenomeDB
object or the genome_db_id in the species_set
Returntype : listref of Bio::EnsEMBL::Compara::MethodLinkSpeciesSet objects
Exceptions : wrong argument throws
Caller :
=cut
sub fetch_all_by_GenomeDB {
my ($self, $genome_db) = @_;
my $method_link_species_sets = [];
throw "[$genome_db] must be a Bio::EnsEMBL::Compara::GenomeDB object"
unless ($genome_db and $genome_db->isa("Bio::EnsEMBL::Compara::GenomeDB"));
my $genome_db_id = $genome_db->dbID;
throw "[$genome_db] must have a dbID" if (!$genome_db_id);
my $all_method_link_species_sets = $self->fetch_all;
foreach my $this_method_link_species_set (@$all_method_link_species_sets) {
foreach my $this_genome_db (@{$this_method_link_species_set->species_set}) {
if ($this_genome_db->dbID == $genome_db_id) {
push (@$method_link_species_sets, $this_method_link_species_set);
last;
}
}
}
return $method_link_species_sets;
}
=head2 fetch_all_by_method_link_type_GenomeDB
Arg 1 : string method_link_type
Arg 2 : Bio::EnsEMBL::Compara::GenomeDB $genome_db
Example : my $method_link_species_sets =
$mlssa->fetch_all_by_method_link_type_GenomeDB("BLASTZ_NET", $rat_genome_db)
Description: Retrieve all the Bio::EnsEMBL::Compara::MethodLinkSpeciesSet objects
corresponding to the given method_link_type and which include the
given Bio::EnsEBML::Compara::GenomeDB
Returntype : listref of Bio::EnsEMBL::Compara::MethodLinkSpeciesSet objects
Exceptions : none
Caller :
=cut
sub fetch_all_by_method_link_type_GenomeDB {
my ($self, $method_link_type, $genome_db) = @_;
my $method_link_species_sets = [];
throw "[$genome_db] must be a Bio::EnsEMBL::Compara::GenomeDB object or the corresponding dbID"
unless ($genome_db and $genome_db->isa("Bio::EnsEMBL::Compara::GenomeDB"));
my $genome_db_id = $genome_db->dbID;
throw "[$genome_db] must have a dbID" if (!$genome_db_id);
my $all_method_link_species_sets = $self->fetch_all();
foreach my $this_method_link_species_set (@$all_method_link_species_sets) {
if ($this_method_link_species_set->method_link_type eq $method_link_type and
grep (/^$genome_db_id$/, map {$_->dbID} @{$this_method_link_species_set->species_set})) {
push(@$method_link_species_sets, $this_method_link_species_set);
}
}
return $method_link_species_sets;
}
=head2 fetch_by_method_link_type_GenomeDBs
Arg 1 : string $method_link_type
Arg 2 : listref of Bio::EnsEMBL::Compara::GenomeDB objects [$gdb1, $gdb2, $gdb3]
Arg 3 : (optional) bool $no_warning
Example : my $method_link_species_set =
$mlssa->fetch_by_method_link_type_GenomeDBs("MULTIZ",
[$human_genome_db,
$rat_genome_db,
$mouse_genome_db])
Description: Retrieve the Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
corresponding to the given method_link and the given set of
Bio::EnsEMBL::Compara::GenomeDB objects
Returntype : Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
Exceptions : Returns undef if no Bio::EnsEMBL::Compara::MethodLinkSpeciesSet
object is found. It also send a warning message unless the
$no_warning option is on
Caller :
=cut
sub fetch_by_method_link_type_GenomeDBs {
my ($self, $method_link_type, $genome_dbs, $no_warning) = @_;
my $method_link_species_set;
my $genome_db_ids;
foreach my $genome_db (@$genome_dbs) {
throw "[$genome_db] must be a Bio::EnsEMBL::Compara::GenomeDB object or the corresponding dbID"
unless ($genome_db and $genome_db->isa("Bio::EnsEMBL::Compara::GenomeDB"));
my $genome_db_id = $genome_db->dbID;
throw "[$genome_db] must have a dbID" if (!$genome_db_id);
push (@$genome_db_ids, $genome_db_id);
}
my $method_link_id = ($self->get_method_link_id_from_method_link_type($method_link_type) || 0);
$method_link_species_set = $self->_run_query_from_method_link_id_genome_db_ids($method_link_id, $genome_db_ids);
if (!$method_link_species_set and !$no_warning) {
my $warning = "No Bio::EnsEMBL::Compara::MethodLinkSpeciesSet found for\n".
" <$method_link_type> and ".
join(", ", map {$_->name."(".$_->assembly.")"} @$genome_dbs);
warning($warning);
}
return $method_link_species_set;
}
=head2 fetch_by_method_link_type_genome_db_ids
Arg 1 : string $method_link_type
Arg 2 : listref of int [$gdbid1, $gdbid2, $gdbid3]
Example : my $method_link_species_set =
$mlssa->fetch_by_method_link_type_genome_db_id("MULTIZ",
[$human_genome_db->dbID,
$rat_genome_db->dbID,
$mouse_genome_db->dbID])
Description: Retrieve the Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
corresponding to the given method_link and the given set of
Bio::EnsEMBL::Compara::GenomeDB objects defined by the set of
$genome_db_ids
Returntype : Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
Exceptions : Returns undef if no Bio::EnsEMBL::Compara::MethodLinkSpeciesSet
object is found
Caller :
=cut
sub fetch_by_method_link_type_genome_db_ids {
my ($self, $method_link_type, $genome_db_ids) = @_;
my $method_link_species_set;
my $method_link_id = ($self->get_method_link_id_from_method_link_type($method_link_type) || 0);
return $self->_run_query_from_method_link_id_genome_db_ids($method_link_id, $genome_db_ids)
}
=head2 fetch_by_method_link_type_registry_aliases
Arg 1 : string $method_link_type
Arg 2 : listref of core database aliases [$human, $mouse, $rat]
Example : my $method_link_species_set =
$mlssa->fetch_by_method_link_type_registry_aliases("MULTIZ",
["human","mouse","rat"])
Description: Retrieve the Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
corresponding to the given method_link and the given set of
core database aliases defined in the Bio::EnsEMBL::Registry
Returntype : Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
Exceptions : Returns undef if no Bio::EnsEMBL::Compara::MethodLinkSpeciesSet
object is found
Caller :
=cut
sub fetch_by_method_link_type_registry_aliases {
my ($self,$method_link_type, $registry_aliases) = @_;
my $gdba = $self->db->get_GenomeDBAdaptor;
my @genome_dbs;
foreach my $alias (@{$registry_aliases}) {
if (Bio::EnsEMBL::Registry->alias_exists($alias)) {
my ($binomial, $gdb);
try {
$binomial = Bio::EnsEMBL::Registry->get_alias($alias);
$gdb = $gdba->fetch_by_name_assembly($binomial);
} catch {
my $meta_c = Bio::EnsEMBL::Registry->get_adaptor($alias, 'core', 'MetaContainer');
$binomial=$gdba->get_species_name_from_core_MetaContainer($meta_c);
$gdb = $gdba->fetch_by_name_assembly($binomial);
};
push @genome_dbs, $gdb;
} else {
throw("Database alias $alias is not known\n");
}
}
return $self->fetch_by_method_link_type_GenomeDBs($method_link_type,\@genome_dbs);
}
=head2 get_max_alignment_length
Arg 1 : Bio::EnsEMBL::Compara::MethodLinkSpeciesSet $mlss
Example :
Description: Retrieve the maximum length for this type of alignments.
This method is used for genomic (dna/dna) alignments only.
This method sets and returns this attribute for this object
Returntype : integer
Exceptions :
Caller : Bio::EnsEMBL::Compara::DBSQL::GenomicAlignBlockAdaptor
=cut
sub get_max_alignment_length {
my ($self, $method_link_species_set) = @_;
my $method_link_species_set_id = ($method_link_species_set->dbID or 0);
my $values = $self->db->get_MetaContainer->list_value_by_key(
"max_align_$method_link_species_set_id");
if ($values && @$values) {
return $method_link_species_set->max_alignment_length($values->[0]);
} else {
$values = $self->db->get_MetaContainer->list_value_by_key("max_alignment_length");
if($values && @$values) {
warning("Meta table key 'max_align_$method_link_species_set_id' not defined\n" .
" -> using old meta table key 'max_alignment_length' [".$values->[0]."]");
return $method_link_species_set->max_alignment_length($values->[0]);
} else {
warning("Meta table key 'max_align_$method_link_species_set_id' not defined and\n" .
"old meta table key 'max_alignment_length' not defined\n" .
" -> using default value [$DEFAULT_MAX_ALIGNMENT]");
return $method_link_species_set->max_alignment_length($DEFAULT_MAX_ALIGNMENT);
}
}
}
=head2 _run_query_from_method_link_id_genome_db_ids
Arg 1 : int $method_link_id
Arg 2 : listref of int [$gdbid1, $gdbid2, $gdbid3]
Example : my $method_link_species_set =
$mlssa->_run_query_from_method_link_id_genome_db_ids(1,
[$human_genome_db->dbID,
$mouse_genome_db->dbID])
Description: Retrieve the Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
corresponding to the given method_link_id and the given set of
Bio::EnsEMBL::Compara::GenomeDB objects defined by the set of
$genome_db_ids
Returntype : Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
Exceptions : Returns undef if no Bio::EnsEMBL::Compara::MethodLinkSpeciesSet
object is found
Caller :
=cut
sub _run_query_from_method_link_id_genome_db_ids {
my ($self, $method_link_id, $genome_db_ids) = @_;
my $method_link_species_set;
my $species_set_id = $self->_get_species_set_id_from_genome_db_ids($genome_db_ids);
if ($species_set_id) {
my $sql = qq{
SELECT
method_link_species_set_id
FROM
method_link_species_set mlss
WHERE
species_set_id = \"$species_set_id\"
AND method_link_id = \"$method_link_id\"
};
my $sth = $self->prepare($sql);
$sth->execute();
my ($dbID) = $sth->fetchrow_array();
$method_link_species_set = $self->fetch_by_dbID($dbID);
$sth->finish;
}
return $method_link_species_set;
}
=head2 _get_method_link_class_from_id
Arg 1 : none
Example : my $method_link_class = $mlssa->_get_method_link_class_from_id()
Description: Retrieve method_link_class corresponding to the method_link_id
Returntype : string $method_link_class
Exceptions : none
Caller :
=cut
sub _get_method_link_class_from_id {
my ($self, $method_link_id) = @_;
my $class; # returned string
my $sql = qq{
SELECT class
FROM method_link
WHERE method_link_id = ?
};
my $sth = $self->prepare($sql);
$sth->execute($method_link_id);
$class = $sth->fetchrow_array();
return $class;
}
=head2 get_method_link_type_from_method_link_id
Arg 1 : none
Example : my $method_link_type = $mlssa->get_method_link_type_from_method_link_id()
Description: Retrieve method_link_type corresponding to the method_link_id
Returntype : string $method_link_type
Exceptions : none
Caller :
=cut
sub get_method_link_type_from_method_link_id {
my ($self, $method_link_id) = @_;
my $type; # returned string
my $sql = qq{
SELECT type
FROM method_link
WHERE method_link_id = ?
};
my $sth = $self->prepare($sql);
$sth->execute($method_link_id);
$type = $sth->fetchrow_array();
return $type;
}
=head2 get_method_link_id_from_method_link_type
Arg 1 : string $method_link_type
Example : my $method_link_id = $mlssa->get_method_link_id_from_method_link_type("BLASTZ_NET")
Description: Retrieve method_link_id corresponding to the method_link_type
Returntype : integer $method_link_id
Exceptions : warns when no method_link matches the $method_link_type
Caller :
=cut
sub get_method_link_id_from_method_link_type {
my ($self, $method_link_type) = @_;
my $dbID; # returned integer
my $sql = qq{
SELECT method_link_id
FROM method_link
WHERE type = ?
};
my $sth = $self->prepare($sql);
$sth->execute($method_link_type);
$dbID = $sth->fetchrow_array();
$sth->finish;
if (!$dbID) {
warning("No method_link matches <$method_link_type>");
}
return $dbID;
}
=head2 _get_species_set_id_from_species_set
Arg 1 : listref of Bio::EnsEMBL::Compara::GenomeDB obejcts $species_set
Example : my $species_set_id = $mlssa->_get_species_set_id_from_species_set($mlss->species_set);
Description: Retrieve species_set_id corresponding to this set of species
Returntype : integer $species_set_id
Exceptions :
Caller :
=cut
sub _get_species_set_id_from_species_set {
my ($self, $species_set) = @_;
my $genome_db_ids = [];
foreach my $this_genome_db (@$species_set) {
if (UNIVERSAL::isa($this_genome_db, "Bio::EnsEMBL::Compara::GenomeDB") and $this_genome_db->dbID) {
push(@$genome_db_ids, $this_genome_db->dbID);
} else {
throw("[$this_genome_db] is not a Bio::EnsEMBL::Compara::GenomeDB or has no dbID");
}
}
return $self->_get_species_set_id_from_genome_db_ids([map {$_->dbID} @$species_set]);
}
=head2 _get_species_set_id_from_genome_db_ids
Arg 1 : listref of Bio::EnsEMBL::Compara::GenomeDB obejcts $species_set
Example : my $species_set_id = $mlssa->_get_species_set_id_from_species_set($mlss->species_set);
Description: Retrieve species_set_id corresponding to this set of species
Returntype : integer $species_set_id
Exceptions :
Caller :
=cut
sub _get_species_set_id_from_genome_db_ids {
my ($self, $genome_db_ids) = @_;
my $species_set_id;
## Fetch all the species_set which contain all these species_set_ids
my $sql = qq{
SELECT
species_set_id,
COUNT(*) as count
FROM
species_set
WHERE
genome_db_id in (}.join(",", @$genome_db_ids).qq{)
GROUP BY species_set_id
HAVING count = }.(scalar(@$genome_db_ids));
my $sth = $self->prepare($sql);
$sth->execute();
my $all_rows = $sth->fetchall_arrayref();
if (!@$all_rows) {
return undef;
}
my $species_set_ids = [map {$_->[0]} @$all_rows];
## Keep only the species_set which does not contain any other genome_db_id
$sql = qq{
SELECT
species_set_id,
COUNT(*) as count
FROM
species_set
WHERE
species_set_id in (}.join(",", @$species_set_ids).qq{)
GROUP BY species_set_id
HAVING count = }.(scalar(@$genome_db_ids));
$sth = $self->prepare($sql);
$sth->execute();
$all_rows = $sth->fetchall_arrayref();
if (!@$all_rows) {
return undef;
} elsif (@$all_rows > 1) {
warning("Several species_set_ids have been found for genome_db_ids (".
join(",", @$genome_db_ids)."): ".join(",", map {$_->[0]} @$all_rows));
}
$species_set_id = $all_rows->[0]->[0];
return $species_set_id;
}
=head2 fetch_all_by_method_link_id
DEPRECATED: Use the fetch_all_by_method_link_type method instead
=cut
sub fetch_all_by_method_link_id {
my ($self, $method_link_id) = @_;
deprecate("Use the fetch_all_by_method_link_type method instead");
my $method_link_type = $self->get_method_link_type_from_method_link_id($method_link_id);
return $self->fetch_all_by_method_link_type($method_link_type);
}
=head2 fetch_all_by_genome_db_id
DEPRECATED: Use the fetch_all_by_GenomeDB methodsinstead
=cut
sub fetch_all_by_genome_db_id {
my ($self, $genome_db_id) = @_;
my $method_link_species_sets = [];
deprecate("Use the fetch_all_by_GenomeDB method instead");
my $all_method_link_species_sets = $self->fetch_all;
foreach my $this_method_link_species_set (@$all_method_link_species_sets) {
foreach my $this_genome_db (@{$this_method_link_species_set->species_set}) {
if ($this_genome_db->dbID == $genome_db_id) {
push (@$method_link_species_sets, $this_method_link_species_set);
last;
}
}
}
return $method_link_species_sets;
}
=head2 fetch_all_by_method_link_id_GenomeDB
DEPRECATED: Use the fetch_all_by_method_link_type_GenomeDB method instead
=cut
sub fetch_all_by_method_link_id_GenomeDB {
my ($self, $method_link_id, $genome_db) = @_;
my $method_link_species_sets = [];
deprecate("Use the fetch_all_by_method_link_type_GenomeDB method instead");
my $method_link_type = $self->get_method_link_type_from_method_link_id($method_link_id);
return $self->fetch_all_by_method_link_type_GenomeDB ($method_link_type, $genome_db);
}
=head2 fetch_all_by_method_link_id_genome_db_id
DEPRECATED: Use the fetch_all_by_method_link_type_GenomeDB method instead
=cut
sub fetch_all_by_method_link_id_genome_db_id {
my ($self, $method_link_id, $genome_db_id) = @_;
deprecate("Use the fetch_all_by_method_link_type_GenomeDB method instead");
my $method_link_type = $self->get_method_link_type_from_method_link_id($method_link_id);
my $genome_db = $self->db->get_GenomeDBAdaptor->fetch_by_dbID($genome_db_id);
return $self->fetch_all_by_method_link_type_GenomeDB($method_link_type, $genome_db);
}
=head2 fetch_all_by_method_link_type_genome_db_id
DEPRECATED: Use the fetch_all_by_method_link_type_GenomeDB method instead
=cut
sub fetch_all_by_method_link_type_genome_db_id {
my ($self, $method_link_type, $genome_db_id) = @_;
deprecate("Use the fetch_all_by_method_link_type_GenomeDB method instead");
my $genome_db = $self->db->get_GenomeDBAdaptor->fetch_by_dbID($genome_db_id);
return $self->fetch_all_by_method_link_type_GenomeDB($method_link_type, $genome_db);
}
=head2 fetch_by_method_link_id_GenomeDBs
DEPRECATED: Use the fetch_by_method_link_type_GenomeDBs method instead!
=cut
sub fetch_by_method_link_id_GenomeDBs {
my ($self, $method_link_id, $genome_dbs) = @_;
deprecate("Use the fetch_by_method_link_type_GenomeDBs method instead");
my $method_link_type = $self->get_method_link_type_from_method_link_id($method_link_id);
return $self->fetch_by_method_link_type_GenomeDBs($method_link_type, $genome_dbs);
}
=head2 fetch_by_method_link_id_genome_db_ids
DEPRECATED: Use the fetch_by_method_link_type_GenomeDBs method instead
=cut
sub fetch_by_method_link_id_genome_db_ids {
my ($self, $method_link_id, $genome_db_ids) = @_;
my $method_link_species_set;
deprecate("Use the fetch_by_method_link_type_GenomeDBs method instead");
my $method_link_type = $self->get_method_link_type_from_method_link_id($method_link_id);
my $genome_db_adaptor = $self->db->get_GenomeDBAdaptor();
my $genome_dbs;
foreach my $this_genome_db_id (@$genome_db_ids) {
push(@$genome_dbs, $genome_db_adaptor->fetch_by_dbID($this_genome_db_id ));
}
return $self->fetch_by_method_link_type_GenomeDBs($method_link_type, $genome_dbs);
}
1;