Newer
Older
=head1 LICENSE
Copyright (c) 1999-2012 The European Bioinformatics Institute and
Genome Research Limited. All rights reserved.
This software is distributed under a modified Apache license.
For license details, please see
http://www.ensembl.org/info/about/code_licence.html
=head1 CONTACT
Please email comments or questions to the public Ensembl
Andreas Kusalananda Kähäri
committed
developers list at <dev@ensembl.org>.
Questions may also be sent to the Ensembl help desk at
<helpdesk@ensembl.org>.
=cut
=head1 NAME
Bio::EnsEMBL::Registry
=head1 SYNOPSIS
use Bio::EnsEMBL::Registry;
Ian Longden
committed
my $registry = 'Bio::EnsEMBL::Registry';
$registry->load_all("configuration_file");
$gene_adaptor = $registry->get_adaptor( 'Human', 'Core', 'Gene' );
Andreas Kusalananda Kähäri
committed
All Adaptors are stored/registered using this module. This module should
then be used to get the adaptors needed.
Andreas Kusalananda Kähäri
committed
The registry can be loaded from a configuration file using the load_all
method.
Andreas Kusalananda Kähäri
committed
If a filename is passed to load_all then this is used. Else if the
environment variable ENSEMBL_REGISTRY is set to the name on an existing
Andreas Kusalananda Kähäri
committed
configuration file, then this is used. Else if the file .ensembl_init
in your home directory exist, it is used.
Andreas Kusalananda Kähäri
committed
For the Web server ENSEMBL_REGISTRY should be set in SiteDefs.pm. This
will then be passed on to load_all.
Andreas Kusalananda Kähäri
committed
The registry can also be loaded via the method load_registry_from_db
which given a database host will load the latest versions of the Ensembl
databases from it.
The four types of registries are for db adaptors, dba adaptors, dna
adaptors and the standard type.
These are registries for backwards compatibility and enable the
subroutines to add other adaptors to connections.
e.g. get_all_db_adaptors, get_db_adaptor, add_db_adaptor,
remove_db_adaptor are the old DBAdaptor subroutines which are now
redirected to the Registry.
Andreas Kusalananda Kähäri
committed
my $sfa = $self->adaptor()->db()->get_db_adaptor('blast');
Andreas Kusalananda Kähäri
committed
my $sfa =
Bio::EnsEMBL::Registry->get_adaptor( "human", "core", "blast" );
=head2 DBA
These are the stores for the DBAdaptors
The Registry will create all the DBConnections needed now if you set up
the configuration correctly. So instead of the old commands like
my $db = Bio::EnsEMBL::DBSQL::DBAdaptor->new(...);
my $exon_adaptor = $db->get_ExonAdaptor;
my $exon_adaptor =
Bio::EnsEMBL::Registry->get_adaptor( "human", "core", "exon" );
This is an internal Registry and allows the configuration of a dnadb.
An example here is to set the est database to get its dna data from the
core database.
## set the est db to use the core for getting dna data.
# Bio::EnsEMBL::Utils::ConfigRegistry->dnadb_add( "Homo Sapiens",
# "core", "Homo Sapiens", "est" );
This is the registry for all the general types of adaptors like
GeneAdaptor, ExonAdaptor, Slice Adaptor etc.
These are accessed by the get_adaptor subroutine i.e.
my $exon_adaptor =
Bio::EnsEMBL::Registry->get_adaptor( "human", "core", "exon" );
Ian Longden
committed
package Bio::EnsEMBL::Registry;
Ian Longden
committed
use warnings;
use Bio::EnsEMBL::DBSQL::DBAdaptor;
use Bio::EnsEMBL::DBSQL::BaseFeatureAdaptor;
use Bio::EnsEMBL::Utils::Exception qw( deprecate throw warning );
use Bio::EnsEMBL::Utils::Argument qw(rearrange);
Ian Longden
committed
use Bio::EnsEMBL::Utils::ConfigRegistry;
use Bio::EnsEMBL::ApiVersion;
use Bio::EnsEMBL::Utils::URI qw/parse_uri/;
use DBI qw(:sql_types);
# This is a map from group names to Ensembl DB adaptors. Used by
# load_all() and reset_DBAdaptor().
my %group2adaptor = (
Andreas Kusalananda Kähäri
committed
'blast' => 'Bio::EnsEMBL::External::BlastAdaptor',
'compara' => 'Bio::EnsEMBL::Compara::DBSQL::DBAdaptor',
'core' => 'Bio::EnsEMBL::DBSQL::DBAdaptor',
'estgene' => 'Bio::EnsEMBL::DBSQL::DBAdaptor',
'funcgen' => 'Bio::EnsEMBL::Funcgen::DBSQL::DBAdaptor',
'regulation' => 'Bio::EnsEMBL::Funcgen::DBSQL::DBAdaptor',
'haplotype' => 'Bio::EnsEMBL::ExternalData::Haplotype::DBAdaptor',
'hive' => 'Bio::EnsEMBL::Hive::DBSQL::DBAdaptor',
'ontology' => 'Bio::EnsEMBL::DBSQL::OntologyDBAdaptor',
'otherfeatures' => 'Bio::EnsEMBL::DBSQL::DBAdaptor',
'pipeline' => 'Bio::EnsEMBL::Pipeline::DBSQL::DBAdaptor',
'snp' => 'Bio::EnsEMBL::ExternalData::SNPSQL::DBAdaptor',
'variation' => 'Bio::EnsEMBL::Variation::DBSQL::DBAdaptor',
'vega' => 'Bio::EnsEMBL::DBSQL::DBAdaptor',
'vega_update' => 'Bio::EnsEMBL::DBSQL::DBAdaptor',
Ian Longden
committed
Will load the registry with the configuration file which is
obtained from the first in the following and in that order.
Andreas Kusalananda Kähäri
committed
1) If an argument is passed to this method, this is used as the
name of the configuration file to read.
Andreas Kusalananda Kähäri
committed
2) If the environment variable ENSEMBL_REGISTRY is set, this is
used as the name of the configuration file to read.
3) If the file .ensembl_init exist in the home directory, it is
used as the configuration file.
Andreas Kusalananda Kähäri
committed
Arg [1] : (optional) string
Name of file to load the registry from.
Andreas Kusalananda Kähäri
committed
Arg [2] : (optional) integer
If not 0, will print out all information.
Andreas Kusalananda Kähäri
committed
Arg [3] : (optional) integer
If not 0, the database connection will not be
cleared, if 0 or if not set the database connections
will be cleared (this is the default).
Arg [4]: (optional) boolean
This option will turn off caching for slice features,
so, every time a set of features is retrieved,
they will come from the database instead of the
cache. This option is only recommended for advanced
users, specially if you need to store and retrieve
features. It might reduce performance when querying
the database if not used properly. If in doubt, do
not use it or ask in the developer mailing list.
Andy Yates
committed
Returntype : Int count of the DBAdaptor instances which can be found in the
registry
Ian Longden
committed
Ian Longden
committed
my ($class, $config_file, $verbose, $no_clear, $no_cache ) = @_;
if ( !defined($config_file) ) {
if ( defined( $ENV{ENSEMBL_REGISTRY} ) ) {
$config_file = $ENV{ENSEMBL_REGISTRY};
} elsif ( defined( $ENV{HOME} ) ) {
$config_file = $ENV{HOME} . "/.ensembl_init";
}
}
$verbose ||= 0;
$no_clear ||= 0;
$no_cache ||= 0;
Andy Yates
committed
my $original_count = $class->get_DBAdaptor_count();
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
if ( !defined($config_file) ) {
if ($verbose) {
print( STDERR
"No default registry configuration to load.\n" );
}
} elsif ( !-e $config_file ) {
if ($verbose) {
printf( STDERR "Configuration file '%s' does not exist. "
. "Registry configuration not loaded.\n",
$config_file );
}
} else {
if ( defined( $registry_register{'seen'} ) ) {
if ( !$no_clear ) {
if ($verbose) {
print( STDERR "Clearing previously loaded "
. "registry configuration\n" );
}
$class->clear();
}
}
$registry_register{'seen'} = 1;
if ($verbose) {
printf( STDERR
"Loading registry configuration from '%s'.\n",
$config_file );
}
Ian Longden
committed
my $test_eval = eval { require Config::IniFiles };
if ($@ or (!$test_eval)) {
# The user does not have the 'Config::IniFiles' module.
if ($verbose) {
print( STDERR "No Config::IniFiles module found, "
. "assuming this is not an ini-file\n" );
}
# If the configuration file *is* an ini-file, we can expect a
# load of compilation errors from the next eval...
} else {
# The user has the 'Config::IniFiles' module installed. See
# if this is an ini-file or not...
$cfg = Config::IniFiles->new( -file => $config_file );
}
if ( defined $cfg ) {
my %default_adaptor_args = ();
if ( $cfg->SectionExists('default') ) {
# The 'default' section is special. It contain default
# values that should be implicit to all other section in
# this configuration file. Aliases are added if there
# is also a 'species' setting.
my $alias = $cfg->val( 'default', 'alias' );
$cfg->delval( 'default', 'alias' );
my $species = $cfg->val( 'default', 'species' );
if ( defined($alias) && defined($species) ) {
Bio::EnsEMBL::Utils::ConfigRegistry->add_alias(
-species => $species,
-alias => [ split( /\n/, $alias ) ]
);
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
%default_adaptor_args =
map { '-' . $_ => $cfg->val( 'default', $_ ) }
$cfg->Parameters('default');
}
foreach my $section ( $cfg->Sections() ) {
if ( $section eq 'default' )
{ # We have already done the 'default' section.
next;
}
my $group = $cfg->val( $section, 'group' )
|| $cfg->val( 'default', 'group' );
if ( !defined($group) ) {
printf( STDERR "Key 'group' is undefined "
. "for configuration section '%s', "
. "skipping this section.\n",
$section );
next;
}
my $adaptor = $group2adaptor{ lc($group) };
if ( !defined($adaptor) ) {
printf( STDERR "Unknown group '%s' "
. "for configuration section '%s', "
. "skipping this section.\n",
$group, $section );
next;
}
# Handle aliases. A section must have both an 'alias'
# setting and a 'species' setting for aliases to be
# added. The 'species' setting might be inherited from
# the 'default' section.
my $alias = $cfg->val( $section, 'alias' );
$cfg->delval( $section, 'alias' );
my $species = $cfg->val( $section, 'species' )
|| $cfg->val( 'default', 'species' );
if ( defined($alias) && defined($species) ) {
Bio::EnsEMBL::Utils::ConfigRegistry->add_alias(
-species => $species,
-alias => [ split( /\n/, $alias ) ]
);
}
# Fill in the adaptor initialization arguments.
# We trust the user to provide sensible key-value pairs.
my %adaptor_args = %default_adaptor_args;
foreach my $parameter ( $cfg->Parameters($section) ) {
$adaptor_args{ '-' . $parameter } =
$cfg->val( $section, $parameter );
# when set, do not use the feature cache in the
# different adaptors
if ($no_cache) {
$adaptor_args{'-no_cache'} = 1;
}
}
if ($verbose) {
printf( "Configuring adaptor '%s' "
. "for configuration section '%s'...\n",
$adaptor, $section );
}
Ian Longden
committed
my $test_eval = eval "require $adaptor";
if ($@ or (!$test_eval)) { die($@) }
$adaptor->new(%adaptor_args);
} ## end foreach my $section ( $cfg->Sections...
} else {
# This is probably no ini-file but an old style piece
# of configuration written in Perl. We need to try to
# require() it.
Ian Longden
committed
my $test_eval = eval { require($config_file) };
if ($@ or (!$test_eval)) { die($@) }
# To make the web code avoid doing this again:
delete $INC{$config_file};
}
} ## end else [ if ( !defined($config_file...
Andy Yates
committed
return $class->get_DBAdaptor_count() - $original_count;
Ian Longden
committed
=head2 clear
Ian Longden
committed
Ian Longden
committed
Will clear the registry and disconnect from all databases.
Example : Bio::EnsEMBL::Registry->clear();
Returntype : none
Exceptions : none
Ian Longden
committed
=cut
sub clear{
my ($self);
foreach my $dba (@{$registry_register{'_DBA'}}){
if($dba->dbc->connected){
$dba->dbc->db_handle->disconnect();
}
}
Ian Longden
committed
return;
Andreas Kusalananda Kähäri
committed
# db adaptors. (for backwards compatibility)
Arg [1] : db (DBAdaptor) to add adaptor to.
Arg [2] : name of the name to add the adaptor to in the registry.
Arg [3] : The adaptor to be added to the registry.
Example : Bio::EnsEMBL::Registry->add_db($db, "lite", $dba);
Returntype : none
Exceptions : none
: This is here for backwards compatibility only and may
: be removed eventually. Solution is to make sure the
: db and the adaptor have the same species and the call
: is then no longer needed.
sub add_db {
my ( $class, $db, $name, $adap ) = @_;
if ( lc( $db->species() ) ne lc( $adap->species ) ) {
Andreas Kusalananda Kähäri
committed
$registry_register{_SPECIES}{ lc( $db->species() ) }
{ lc( $db->group() ) }{'_special'}{ lc($name) } = $adap;
Ian Longden
committed
return;
Arg [1] : db (DBAdaptor) to remove adaptor from.
Arg [2] : name to remove the adaptor from in the registry.
Example : my $db = Bio::EnsEMBL::Registry->remove_db($db, "lite");
Returntype : adaptor
Exceptions : none
: This is here for backwards compatibility only and may
: be removed eventually. Solution is to make sure the
: db and the adaptor have the same species and the call
: is then no longer needed.
sub remove_db {
my ( $class, $db, $name ) = @_;
my $ret =
Andreas Kusalananda Kähäri
committed
$registry_register{_SPECIES}{ lc( $db->species() ) }
{ lc( $db->group() ) }{'_special'}{ lc($name) };
Andreas Kusalananda Kähäri
committed
$registry_register{_SPECIES}{ lc( $db->species() ) }
{ lc( $db->group() ) }{'_special'}{ lc($name) } = undef;
Arg [1] : db (DBAdaptor) to get adaptor from.
Arg [2] : name to get the adaptor for in the registry.
Example : my $db = Bio::EnsEMBL::Registry->get_db("Human", "core", "lite");
Returntype : adaptor
Exceptions : See get_DBAdaptor()
: This is here for backwards compatibility only and may
: be removed eventually. Solution is to make sure the
: db and the adaptor have the same species then call
: get_DBAdaptor instead.
sub get_db {
my ( $class, $db, $name ) = @_;
my $ret = Bio::EnsEMBL::Registry->get_DBAdaptor( lc( $db->species ),
lc($name) );
if ( defined($ret) ) { return $ret }
Andreas Kusalananda Kähäri
committed
return $registry_register{_SPECIES}{ lc( $db->species() ) }
{ lc( $db->group() ) }{'_special'}{ lc($name) };
Arg [1] : db (DBAdaptor) to get all the adaptors from.
Example : my $db = Bio::EnsEMBL::Registry->get_all_db_adaptors($db);
Returntype : adaptor
Exceptions : none
: This is here for backwards compatibility only and
: may be removed eventually. Solution is to make
: sure the dbs all have the same species then call
: get_all_DBAdaptors(-species => "human");
sub get_all_db_adaptors {
my ( $class, $db ) = @_;
my %ret = ();
# we now also want to add all the DBAdaptors for the same species.
# as add_db_adaptor does not add if it is from the same species.
foreach my $dba ( @{ $registry_register{'_DBA'} } ) {
if ( lc( $dba->species() ) eq lc( $db->species() ) ) {
$ret{ $dba->group() } = $dba;
}
Andreas Kusalananda Kähäri
committed
$registry_register{_SPECIES}
{ $class->get_alias( $db->species() ) }{ lc( $db->group() ) }
{'_special'} } )
Andreas Kusalananda Kähäri
committed
$registry_register{_SPECIES}
{ $class->get_alias( $db->species() ) }{ lc( $db->group() ) }
{'_special'}{$key};
#
# DBAdaptors
#
=head2 add_DBAdaptor
Arg [1] : name of the species to add the adaptor to in the registry.
Arg [2] : name of the group to add the adaptor to in the registry.
Arg [3] : The DBAaptor to be added to the registry.
Example : Bio::EnsEMBL::Registry->add_DBAdaptor("Human", "core", $dba);
Returntype : none
Exceptions : none
caller : internal
Status : Stable
sub add_DBAdaptor {
my ( $class, $species, $group, $adap ) = @_;
if ( !( $class->alias_exists($species) ) ) {
$class->add_alias( $species, $species );
Andreas Kusalananda Kähäri
committed
$registry_register{_SPECIES}{$species}{ lc($group) }{'_DB'} = $adap;
if ( !defined( $registry_register{'_DBA'} ) ) {
Andy Yates
committed
$registry_register{'_DBA'} = [$adap];
} else {
push( @{ $registry_register{'_DBA'} }, $adap );
Ian Longden
committed
return;
}
=head2 get_DBAdaptor
Arg [1] : name of the species to get the adaptor for in the registry.
Arg [2] : name of the group to get the adaptor for in the registry.
Arg [3] : if set will not give warnings when looking for alias.
Example : $dba = Bio::EnsEMBL::Registry->get_DBAdaptor("Human", "core");
Returntype : DBAdaptor
Exceptions : If $species is not defined and if no valid internal name
could be found for $species. If thrown check your API and DB
version
Andreas Kusalananda Kähäri
committed
my ( $class, $species, $group, $no_alias_check ) = @_;
Andreas Kusalananda Kähäri
committed
if ( !defined($species) ) {
throw('Species not defined.');
}
my $ispecies = $class->get_alias( $species, $no_alias_check );
if ( !defined($ispecies) ) {
if(! $no_alias_check) {
throw("Can not find internal name for species '$species'");
}
Andreas Kusalananda Kähäri
committed
}
else { $species = $ispecies }
Andreas Kusalananda Kähäri
committed
return $registry_register{_SPECIES}{$species}{ lc($group) }{'_DB'};
Ian Longden
committed
Arg [SPECIES]: (optional) string
species name to get adaptors for
Arg [GROUP] : (optional) string
group name to get adaptors for
Example :
@dba =
@{ Bio::EnsEMBL::Registry->get_all_DBAdaptors() };
@human_dbas =
@{ Bio::EnsEMBL::Registry->get_all_DBAdaptors(
-species => 'human'
) };
Ian Longden
committed
Returntype : list of DBAdaptors
Exceptions : none
Andreas Kusalananda Kähäri
committed
sub get_all_DBAdaptors {
my ( $class, @args ) = @_;
my ( $species, $group ) = rearrange( [qw(SPECIES GROUP)], @args );
if ( defined($species) ) { $species = $class->get_alias($species) }
Andreas Kusalananda Kähäri
committed
Andreas Kusalananda Kähäri
committed
foreach my $dba ( @{ $registry_register{'_DBA'} } ) {
if ( ( !defined($species) || lc($species) eq lc( $dba->species() ) )
&& ( !defined($group) || lc($group) eq lc( $dba->group() ) ) )
{
push( @ret, $dba );
Ian Longden
committed
}
}
return \@ret;
=head2 get_all_DBAdaptors_by_connection
Andreas Kusalananda Kähäri
committed
Arg [1] : DBConnection used to find DBAdaptors
Returntype : reference to list of DBAdaptors
Andreas Kusalananda Kähäri
committed
Exceptions : none
Example : @dba = @{ Bio::EnsEMBL::Registry
->get_all_DBAdaptors_by_connection($dbc) };
=cut
Andreas Kusalananda Kähäri
committed
sub get_all_DBAdaptors_by_connection {
my ( $self, $dbc_orig ) = @_;
my @return;
Andreas Kusalananda Kähäri
committed
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
foreach my $dba ( @{ $registry_register{'_DBA'} } ) {
my $dbc = $dba->dbc();
if ( defined($dbc)
&& $dbc->can('equals')
&& $dbc->equals($dbc_orig) )
{
push( @return, $dba );
}
}
return \@return;
}
=head2 get_all_DBAdaptors_by_dbname
Arg [1] : string, name of database
Returntype : reference to list of DBAdaptors
Exceptions : none
Example : @dba = @{ Bio::EnsEMBL::Registry
->get_all_DBAdaptors_by_dbname($dbname) };
Status : Stable
=cut
sub get_all_DBAdaptors_by_dbname {
my ( $self, $dbname ) = @_;
my @return;
foreach my $dba ( @{ $registry_register{'_DBA'} } ) {
my $dbc = $dba->dbc();
if ( defined($dbc) && $dbc->dbname() eq $dbname ) {
push( @return, $dba );
}
}
Andreas Kusalananda Kähäri
committed
return \@return;
}
=head2 remove_DBAdaptor
Arg [1] : name of the species to get the adaptor for in the registry.
Arg [2] : name of the group to get the adaptor for in the registry.
Example : $dba = Bio::EnsEMBL::Registry->remove_DBAdaptor("Human", "core");
Returntype : none
Exceptions : none
Status : At risk
=cut
Andreas Kusalananda Kähäri
committed
sub remove_DBAdaptor {
my ( $class, $species, $group ) = @_;
$species = $class->get_alias($species);
Andreas Kusalananda Kähäri
committed
delete $registry_register{_SPECIES}{$species}{$group};
# This will remove the DBAdaptor and all the other adaptors
# Now remove if from the _DBA array
Andreas Kusalananda Kähäri
committed
foreach my $i ( 0 .. $#{ $registry_register{'_DBA'} } ) {
my $dba = $registry_register{'_DBA'}->[$i];
Andreas Kusalananda Kähäri
committed
if ( ( $dba->species eq $species )
&& $dba->group eq $group )
{
$index = $i;
last;
}
}
Andreas Kusalananda Kähäri
committed
# Now remove from _DBA cache
Andreas Kusalananda Kähäri
committed
if ( defined($index) ) {
splice( @{ $registry_register{'_DBA'} }, $index, 1 );
}
Ian Longden
committed
return;
Andreas Kusalananda Kähäri
committed
} ## end sub remove_DBAdaptor
=head2 reset_DBAdaptor
Arg [1]: string - species e.g. homo_sapiens
Arg [2]: string - DB group e.g. core
Arg [3]: string - new dbname
Args [4-7]: string - optional DB parameters, defaults to current db params if omitted
Arg [8]: hashref - Hash ref of additional parameters e.g. eFG dnadb params for auto selecting dnadb
Usage : $reg->reset_registry_db( 'homo_sapiens', 'core',
'homo_sapiens_core_37_35j' );
Description: Resets a DB within the registry.
Exceptions: Throws if mandatory params not supplied
Throws if species name is not already seen by the registry
Throws if no current DB for species/group available
Status : At risk
=cut
sub reset_DBAdaptor {
my (
$self, $species, $group, $dbname, $host,
$port, $user, $pass, $params
) = @_;
# Check mandatory params
if ( !( defined $species && defined $group && defined $dbname ) ) {
throw(
'Must provide at least a species, group, and dbname parameter '
. 'to redefine a DB in the registry' );
# Validate species here
throw("Could not find registry alias for species:\t$species")
if ( !defined $alias );
# Get all current defaults if not defined
my $db = $self->get_DBAdaptor( $alias, $group );
if ($db) {
$class = ref($db);
$host ||= $db->dbc->host;
$port ||= $db->dbc->port;
$user ||= $db->dbc->username;
$pass ||= $db->dbc->password;
} else {
#Now we need to test mandatory params
$class = $group2adaptor{ lc($group) };
if ( !( $host && $user ) ) {
throw("No comparable $alias $group DB present in Registry. "
. "You must pass at least a dbhost and dbuser" );
}
$self->remove_DBAdaptor( $alias, $group );
# ConfigRegistry should automatically add this to the Registry
-user => $user,
-host => $host,
-port => $port,
-pass => $pass,
-dbname => $dbname,
-species => $alias,
-group => $group,
%{$params} );
#
# DNA Adaptors
#
=head2 add_DNAAdaptor
Arg [1] : name of the species to add the adaptor to in the registry.
Arg [2] : name of the group to add the adaptor to in the registry.
Arg [3] : name of the species to get the dna from
Arg [4] : name of the group to get the dna from
Example : Bio::EnsEMBL::Registry->add_DNAAdaptor("Human", "estgene", "Human", "core");
sub add_DNAAdaptor {
my ( $class, $species, $group, $dnadb_species, $dnadb_group ) = @_;
$species = $class->get_alias($species);
$dnadb_species = $class->get_alias($dnadb_species);
if ( $dnadb_group->isa('Bio::EnsEMBL::DBSQL::DBAdaptor') ) {
Andreas Kusalananda Kähäri
committed
$registry_register{_SPECIES}{$species}{ lc($group) }{'_DNA'} =
$dnadb_group;
$registry_register{_SPECIES}{$species}{ lc($group) }{'_DNA2'} =
Ian Longden
committed
}
Ian Longden
committed
return;
}
=head2 get_DNAAdaptor
Arg [1] : name of the species to get the adaptor for in the registry.
Arg [2] : name of the group to get the adaptor for in the registry.
Example : $dnaAdap = Bio::EnsEMBL::Registry->get_DNAAdaptor("Human", "core");
Returntype : adaptor
Exceptions : none
sub get_DNAAdaptor {
my ( $class, $species, $group ) = @_;
Andreas Kusalananda Kähäri
committed
my $new_group =
$registry_register{_SPECIES}{$species}{ lc($group) }{'_DNA'};
my $new_species =
$registry_register{_SPECIES}{$species}{ lc($group) }{'_DNA2'};
if ( defined $new_group ) {
return $class->get_DBAdaptor( $new_species, $new_group );
Ian Longden
committed
}
Ian Longden
committed
return;
}
#
# General Adaptors
#
=head2 add_adaptor
Arg [1] : name of the species to add the adaptor to in the registry.
Arg [2] : name of the group to add the adaptor to in the registry.
Arg [3] : name of the type to add the adaptor to in the registry.
Arg [4] : The DBAaptor to be added to the registry.
Arg [5] : (optional) if set okay to overwrite.
Example : Bio::EnsEMBL::Registry->add_adaptor("Human", "core", "Gene", $adap);
Returntype : none
Exceptions : none
Caller : internal
Status : Stable
sub add_adaptor {
my ( $class, $species, $group, $type, $adap, $reset ) = @_;
# Since the adaptors are not stored initially, only their class paths
# when the adaptors are obtained, we need to store these instead. It
# is not necessarily an error if the registry is overwritten without
# the reset set but it is an indication that we are overwriting a
# database which should be a warning for now
if ( defined($reset) )
{ # JUST REST THE HASH VALUE NO MORE PROCESSING NEEDED
Andreas Kusalananda Kähäri
committed
$registry_register{_SPECIES}{$species}{ lc($group) }{ lc($type) } =
$adap;
Andreas Kusalananda Kähäri
committed
if (
Andreas Kusalananda Kähäri
committed
defined(
$registry_register{_SPECIES}{$species}{ lc($group) }{ lc($type) }
) )
{
# print STDERR (
# "Overwriting Adaptor in Registry for $species $group $type\n");
Andreas Kusalananda Kähäri
committed
$registry_register{_SPECIES}{$species}{ lc($group) }{ lc($type) } =
$adap;
return;
Andreas Kusalananda Kähäri
committed
$registry_register{_SPECIES}{$species}{ lc($group) }{ lc($type) } =
$adap;
Andreas Kusalananda Kähäri
committed
if ( !defined( $registry_register{_SPECIES}{$species}{'list'} ) ) {
$registry_register{_SPECIES}{$species}{'list'} = [$type];
} else {
Andreas Kusalananda Kähäri
committed
push( @{ $registry_register{_SPECIES}{$species}{'list'} }, $type );
Andreas Kusalananda Kähäri
committed
if ( !defined( $registry_register{_TYPE}{ lc($type) }{$species} ) ) {
$registry_register{_TYPE}{ lc($type) }{$species} = [$type];
} else {
Andreas Kusalananda Kähäri
committed
push( @{ $registry_register{_TYPE}{ lc($type) }{$species} },
$adap );
Ian Longden
committed
return;
} ## end sub add_adaptor
=head2 get_adaptor
Arg [1] : name of the species to add the adaptor to in the registry.
Arg [2] : name of the group to add the adaptor to in the registry.
Arg [3] : name of the type to add the adaptor to in the registry.
Example : $adap = Bio::EnsEMBL::Registry->get_adaptor("Human", "core", "Gene");
Returntype : adaptor
Exceptions : Thrown if a valid internal name cannot be found for the given
name. If thrown check your API and DB version. Also thrown if
no type or group was given
sub get_adaptor {
my ( $class, $species, $group, $type ) = @_;
Andreas Kusalananda Kähäri
committed
my $ispecies = $class->get_alias($species);
if ( !defined($ispecies) ) {
Andreas Kusalananda Kähäri
committed
throw("Can not find internal name for species '$species'");
}
else { $species = $ispecies }
throw 'No adaptor group given' if ! defined $group;
throw 'No adaptor type given' if ! defined $type;
if($type =~ /Adaptor$/i) {
warning("Detected additional Adaptor string in given the type '$type'. Removing it to avoid possible issues. Alter your type to stop this message");
$type =~ s/Adaptor$//i;
}
my %dnadb_adaptors = (
'sequence' => 1,
'assemblymapper' => 1,
'karyotypeband' => 1,
'repeatfeature' => 1,
'coordsystem' => 1,
'assemblyexceptionfeature' => 1
);
Andreas Kusalananda Kähäri
committed
# warn "$species, $group, $type";
$type = lc($type);
Andreas Kusalananda Kähäri
committed
# For historical reasons, allow use of group 'regulation' to refer to
# group 'funcgen'.
if ( lc($group) eq 'regulation' ) { $group = 'funcgen' }
Andreas Kusalananda Kähäri
committed
my $dnadb_group =
$registry_register{_SPECIES}{$species}{ lc($group) }{'_DNA'};
Ian Longden
committed
if ( defined($dnadb_group)
&& defined( $dnadb_adaptors{ lc($type) } ) )
{
Andreas Kusalananda Kähäri
committed
$species =
$registry_register{_SPECIES}{$species}{ lc($group) }{'_DNA2'};
$group = $dnadb_group;