diff variant_effect_predictor/Bio/DB/Registry.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/variant_effect_predictor/Bio/DB/Registry.pm	Thu Apr 11 02:01:53 2013 -0400
@@ -0,0 +1,256 @@
+# POD documentation - main docs before the code
+
+# $Id: Registry.pm,v 1.12.2.2 2003/06/26 11:07:10 heikki Exp $
+
+
+=head1 NAME
+
+Bio::DB::Registry - Access to the Open Bio Database Access registry scheme
+
+=head1 SYNOPSIS
+
+    use Bio::DB::Registry();
+
+    $registry = new Bio::DB::Registry();
+
+    @available_services = $registry->services;
+
+    $db = $registry->get_database('embl');
+    # $db is a Bio::DB::SeqI implementing class
+
+    $seq = $db->get_Seq_by_acc("J02231");
+
+=head1 DESCRIPTION
+
+This module provides access to the Open Bio Database Access scheme,
+which provides a cross language and cross platform specification of how
+to get to databases.
+
+If the user or system administrator has not installed the default init 
+file, seqdatabase.ini, in /etc/bioinformatics or ${HOME}/.bioinformatics 
+then creating the first Registry object copies the default settings from 
+the net. The Registry object will attempt to store these settings in
+${HOME}/.bioinformatics/seqdatabase.ini.
+
+Users can specify one or more custom locations for the init file by 
+setting $OBDA_SEARCH_PATH to those directories, where multiple 
+directories should be separated by ';'.
+
+=head1 CONTACT
+
+Ewan Birney originally wrote this class.
+
+=head2 Reporting Bugs
+
+Report bugs to the Bioperl bug tracking system to help us keep track
+the bugs and their resolution. Bug reports can be submitted via email
+or the web:
+
+    bioperl-bugs@bio.perl.org
+    http://bugzilla.bioperl.org/
+
+=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::DB::Registry;
+
+use vars qw(@ISA $VERSION $OBDA_SPEC_VERSION $OBDA_SEARCH_PATH);
+use strict;
+
+use Bio::Root::Root;
+@ISA = qw(Bio::Root::Root);
+use Bio::DB::Failover;
+use Bio::Root::HTTPget;
+
+$VERSION = '1.2';
+BEGIN {
+    $OBDA_SPEC_VERSION = 1.0;
+    if (defined $ENV{OBDA_SEARCH_PATH}) {
+        $OBDA_SEARCH_PATH = $ENV{OBDA_SEARCH_PATH} || '';
+
+    }
+}
+
+my %implement = (
+		 'biocorba'         => 'Bio::CorbaClient::SeqDB',
+		 'flat'             => 'Bio::DB::Flat',
+		 'biosql'           => 'Bio::DB::BioSQL::BioDatabaseAdaptor',
+		 'biofetch'         => 'Bio::DB::BioFetch'
+		 );
+
+my $fallbackRegistryURL = 'http://www.open-bio.org/registry/seqdatabase.ini';
+
+
+sub new {
+    my ($class,@args) = shift;
+    my $self = $class->SUPER::new(@args);
+
+    # open files in order
+    $self->{'_dbs'} = {};
+    $self->_load_registry();
+    return $self;
+}
+
+
+sub _load_registry {
+    my ($self) = @_;
+
+    my $home = (getpwuid($>))[7];
+    my $f;
+
+    if ( $OBDA_SEARCH_PATH ) {
+        foreach ( split /;/,$OBDA_SEARCH_PATH ) {
+            next unless -e $_;
+            open(F,"$OBDA_SEARCH_PATH/seqdatabase.ini");
+            $f = \*F;
+            last;
+        }
+    }
+    elsif( -e "$home/.bioinformatics/seqdatabase.ini" ) {
+	open(F,"$home/.bioinformatics/seqdatabase.ini");
+	$f = \*F;
+    } elsif ( -e "/etc/bioinformatics/seqdatabase.ini" ) {
+	open(F,"/etc/bioinformatics/seqdatabase.ini");
+	$f = \*F;
+    } else {
+	# waiting for information
+	$self->warn("No seqdatabase.ini file found in ~/.bioinformatics/ \nor in /etc/bioinformatics/.\nor in directory specified by $OBDA_SEARCH_PATH".
+                    "Using web to get database registry from \n$fallbackRegistryURL");
+
+	# Last gasp. Try to use HTTPget module to retrieve the registry from
+        # the web...
+
+	$f = Bio::Root::HTTPget::getFH($fallbackRegistryURL);
+
+        # store the default registry file
+        mkdir "$home/.bioinformatics" unless -e "$home/.bioinformatics";
+	open(F,">$home/.bioinformatics/seqdatabase.ini");
+        print F while (<$f>);
+        close F;
+
+	$self->warn("Stored the default registry configuration into:\n".
+                    "  $home/.bioinformatics/seqdatabase.ini");
+
+	open(F,"$home/.bioinformatics/seqdatabase.ini");
+	$f = \*F;
+
+    }
+
+    while( <$f> ) {
+	/^VERSION=([\d\.]+)/;
+        $self->throw("Do not know about this version [$1] > $OBDA_SPEC_VERSION")
+            if $1 > $OBDA_SPEC_VERSION or !$1;
+        last;
+    }
+
+    while( <$f> ) {
+      if( /^#/ ) {
+	  next;
+       }
+	if( /^\s/ ) {
+	  next;
+	}
+
+      if( /\[(\w+)\]/ )  {
+	my $db = $1;
+	my $hash = {};
+	while( <$f> ) {
+	  chomp();
+	  /^#/ && next;
+	    /^$/ && last;
+	  my ($tag,$value) = split('=',$_);
+	  $value =~ s/\s//g;
+	  $tag =~ s/\s//g;
+	  $hash->{"\L$tag"} = lc $value;
+	}
+
+	if( !exists $self->{'_dbs'}->{$db} ) {
+	  my $failover = Bio::DB::Failover->new();
+	  $self->{'_dbs'}->{$db}=$failover;
+	}
+	my $class;
+	if (defined $implement{$hash->{'protocol'}}) {
+	  $class = $implement{$hash->{'protocol'}};
+	}
+	else {
+	  $self->warn("Registry does not support protocol ".$hash->{'protocol'});
+	  next;
+	}
+	eval "require $class";
+
+	if ($@) {
+	  $self->verbose && $self->warn("Couldn't load $class");
+	  next;
+	}
+
+	else {
+	  eval {
+	    my $randi = $class->new_from_registry(%$hash);
+	    $self->{'_dbs'}->{$db}->add_database($randi); };
+	  if ($@) {
+	    $self->warn("Couldn't call new_from_registry on [$class]\n$@");
+	  }
+	}
+	next; # back to main loop
+      }
+      $self->warn("Uninterpretable line in registry, $_");
+    }
+}
+
+=head2 get_database
+
+ Title   : get_database
+ Usage   : my $db = $registry->get_database($dbname);
+ Function: Retrieve a Database object which implements Bio::DB::SeqI interface
+ Returns : Bio::DB::SeqI object
+ Args    : string describing the name of the database
+
+=cut
+
+sub get_database {
+    my ($self,$dbname) = @_;
+
+    $dbname = lc $dbname;
+    if( !defined $dbname ) {
+	$self->warn("must get_database with a database name");
+	return undef;
+    }
+    if( !exists $self->{'_dbs'}->{$dbname} ) {
+	$self->warn("No database in with $dbname in registry");
+	return undef;
+    }
+    return $self->{'_dbs'}->{$dbname};
+}
+
+=head2 services
+
+ Title   : services
+ Usage   : my @available = $registry->services();
+ Function: returns list of possible services 
+ Returns : list of strings
+ Args    : none
+
+
+=cut
+
+sub services{ 
+    my ($self) = @_;
+    return () unless ( defined $self->{'_dbs'} &&
+		       ref( $self->{'_dbs'} ) =~ /HASH/i);
+    return keys %{$self->{'_dbs'}};
+}
+
+
+## End of Package
+
+1;
+
+__END__
+