Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/Biblio.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/Biblio.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,372 @@ +# $Id: Biblio.pm,v 1.7 2002/10/22 07:45:09 lapp Exp $ +# +# BioPerl module Bio::Biblio +# +# Cared for by Martin Senger <senger@ebi.ac.uk> +# For copyright and disclaimer see below. +# + +# POD documentation - main docs before the code + +=head1 NAME + +Bio::Biblio - A Bibliographic Query Service module + +=head1 SYNOPSIS + + use Bio::Biblio; + my $biblio = new Bio::Biblio; + + print $biblio->find ('perl')->get_count . "\n"; + + my $collection = $biblio->find ('brazma', 'authors'); + while ( $collection->has_next ) { + print $collection->get_next; + } + +Here are some one-liners: + + perl -MBio::Biblio -e 'print new Bio::Biblio->get_by_id ("94033980")' + perl -MBio::Biblio \ + -e 'print join ("\n", @{ new Bio::Biblio->find ("brazma")->get_all_ids })' + perl -MBio::Biblio \ + -e 'print new Bio::Biblio->find ("Java")->find ("perl")->get_count' + +The C<new> method can get parameters, for example: + + my $biblio = Bio::Biblio + (-access => 'soap', + -location => 'http://industry.ebi.ac.uk/soap/openBQS', + -destroy_on_exit => '0'); + +=head1 DESCRIPTION + +This is a class whose instances can access bibliographic +repositories. It allows to query a bibliographic database (such as +MEDLINE) and then to retrieve resulting citations from it. The +citations are returned in an XML format which is native to the +repository but there are also supporting modules for converting them +into Perl objects. + +The detailed descriptions of all query and retrieval methods are in +L<Bio::DB::BiblioI> (an interface). All those methods should be +called on instances of this (Bio::Biblio) module. + +The module complies (with some simplifications) with the specification +described in the B<OpenBQS> project. Its home page is at +I<http://industry.ebi.ac.uk/openBQS>. There are also links to +available servers providing access to the bibliographic repositories +(namely to I<MEDLINE>). + +The module also gives an access to a set of controlled vocabularies +and their values. It allows to introspect bibliographic repositories +and to find what citation resource types (such as journal and book +articles, patents or technical reports) are provided, and what +attributes they have, eventually what attribute values are allowed. + +=head1 OVERVIEW OF CLASSES AND PACKAGES + +=over + +=item B<Bio::Biblio> + +This is the main class to be used by the end users. It +loads a real implementation for a particular access protocol according +to the argument I<-access>. At the time of writing this documentation +there is only one available access module implementing all query and +retrieval methods: + + -access => soap + +This module implements all methods defined in the interface +I<Bio::DB::BiblioI> (see L<Bio::DB::BiblioI>) by delegating +calls to a loaded low-level module (e.g. see +L<Bio::DB::Biblio::soap>). + +Note that there is also another module (and perhaps more) which does +not use SOAP protocol and do not implement all query methods - +nevertheless it has retrieval methods and it can be used in the same +way: + + -access => biofetch + + +=item Bio::DB::BiblioI + +This is an interface defining all methods that can be called on +I<Bio::Biblio> instances. + +=item Bio::DB::Biblio::soap + +This is a real implementation of all methods defined in +Bio::DB::BiblioI using SOAP protocol (calling a WebService +based on SOAP). This class should not be instantiated directly (use +I<Bio::Biblio> instead). See L<Bio::DB::BiblioI> for details. + +=item Bio::Biblio::IO + +This module instantiates and uses a converter of the citations read by +any of the access methods mentioned above. See L<Bio::Biblio::IO> for +details. + +=item Bio::Biblio::IO::medlinexml and Bio::Biblio::IO::medline2ref + +A converter of MEDLINE citations in XML into Perl objects. + +=item Bio::Biblio::IO::pubmedxml and Bio::Biblio::IO::pubmed2ref + +A converter of PUBMED citations in XML into Perl objects. + +=back + +=head1 FEEDBACK + +=head2 Mailing Lists + +User feedback is an integral part of the evolution of this and other +Bioperl modules. Send your comments and suggestions preferably to +the Bioperl mailing list. Your participation is much appreciated. + + bioperl-l@bioperl.org - General discussion + http://bioperl.org/MailList.shtml - About the mailing lists + +=head2 Reporting Bugs + +Report bugs to the Bioperl bug tracking system to help us keep track +of the bugs and their resolution. Bug reports can be submitted via +email or the web: + + bioperl-bugs@bioperl.org + http://bugzilla.bioperl.org/ + +=head1 AUTHOR + +Martin Senger (senger@ebi.ac.uk) + +=head1 COPYRIGHT + +Copyright (c) 2002 European Bioinformatics Institute. All Rights Reserved. + +This module is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 DISCLAIMER + +This software is provided "as is" without warranty of any kind. + +=head1 SEE ALSO + +=over + +=item * + +OpenBQS home page: http://industry.ebi.ac.uk/openBQS + +=item * + +Comments to the Perl client: http://industry.ebi.ac.uk/openBQS/Client_perl.html + +=back + +=head1 APPENDIX + +The main documentation details are to be found in +L<Bio::DB::BiblioI>. + +Here is the rest of the object methods. Internal methods are preceded +with an underscore _. + +=cut + + +# Let the code begin... + + +package Bio::Biblio; +use vars qw(@ISA $VERSION $Revision); +use strict; + +use Bio::Root::Root; +use Bio::DB::BiblioI; + +@ISA = qw(Bio::Root::Root Bio::DB::BiblioI); + + +BEGIN { + $VERSION = do { my @r = (q$Revision: 1.7 $ =~ /\d+/g); sprintf "%d.%-02d", @r }; + $Revision = q$Id: Biblio.pm,v 1.7 2002/10/22 07:45:09 lapp Exp $; +} + +# ----------------------------------------------------------------------------- + +=head2 new + + Usage : my $obj = new Bio::Biblio (@args); + Returns : Bio::Biblio object on success, or undef on failure + Args : This module recognizes and uses: + + -access => 'soap' + It indicates what lower-level module to load. + Default is 'soap'. + + -location => 'http://...' + It says where to find a bibliographic query service. + The format and contents of this argument is dependent + on the '-access' argument. + + For 'soap' access it is a URL of a WebService. + Default is http://industry.ebi.ac.uk/soap/openBQS + + Other arguments can be given here but they are + recognized by the lower-level module + (e.g. see Bio::DB::Biblio::soap). + +It builds, populates and returns a new I<Bio::Biblio> object. This is +how it is seen from the outside. But in fact, it builds, populates and +returns a more specific lower-level object, for example +I<Bio::DB::Biblio::soap> object - which one it is depends on the +parameter I<-access>. + +The real initialization is done in the method I<_initialize> of the +lower-level object. + +This method can also be used for I<cloning> an existing object and +changing or adding new attributes to it in the same time. This is, +however, not particulary useful for the casual users of this module, +because the query methods (see L<Bio::DB::BiblioI>) themselves +already return cloned objects with more refined query +collections. Anyway this is how the cloning can be done: + + use Bio::Biblio; + my $biblio = new Bio::Biblio; + + # this will create a new object which will NOT send a 'destroy' + # message to the remote server when its life ends + my $clone = $biblio->new (-destroy-on-exit => '0'); + +=cut + +sub new { + my ($caller,@args) = @_; + my $class = ref($caller) || $caller; + + # if $caller is an object, or if it is an underlying + # 'real-work-doing' class (e.g. Bio::DB::Biblio::soap) then + # we want to call SUPER to create and bless an object + + if ($class =~ /Bio::DB::Biblio::(\S+)/) { + my ($self) = $class->SUPER::new (@args); + + # now the $self is an empty object - we will populate it from + # the $caller - if $caller is an object + + if (ref ($caller)) { + %{ $self } = %{ $caller }; + } + + # and finally add values from '@args' into the newly created + # object (the values will overwrite the values copied above) + + $self->_initialize (@args); + return $self; + + # this is called only the first time when somebody calls: 'new + # Bio::Biblio (...)', and it actually loads a 'real-work-doing' + # module and call this new() method again (unless the loaded + # module has its own new() method) + + } else { + my %param = @args; + @param { map { lc $_ } keys %param } = values %param; # lowercase keys + my $access = + $param {'-access'} || + $class->_guess_access ( $param {'-location'} ) || + 'soap'; + $access = "\L$access"; # normalize capitalization to lower case + + # load module with the real implementation - as defined in $access + return undef unless (&_load_access_module ($access)); + + # this will call this same method new() - but rather its the + # upper (object) branche + return "Bio::DB::Biblio::$access"->new (@args); + } +} + +# ----------------------------------------------------------------------------- + +=head2 _load_access_module + + Usage : $class->_load_access_module ($access) + Returns : 1 on success, undef on failure + Args : 'access' should contain the last part of the + name of a module who does the real implementation + +It does (in run-time) a similar thing as + + require Bio::DB::Biblio::$access + +It prints an error on STDERR if it fails to find and load the module +(for example, because of the compilation errors in the module). + +=cut + +sub _load_access_module { + my ($access) = @_; + my ($module, $load, $m); + + $module = "_<Bio/DB/Biblio/$access.pm"; + $load = "Bio/DB/Biblio/$access.pm"; + + return 1 if $main::{$module}; + eval { + require $load; + }; + + if ( $@ ) { + Bio::Root::Root->throw (<<END); +$load: $access cannot be found or loaded +Exception $@ +For more information about the Biblio system please see the Bio::Biblio docs. +END + ; + return; + } + return 1; +} + +# ----------------------------------------------------------------------------- + +=head2 _guess_access + + Usage : $class->_guess_access ($location) + Returns : string with a guessed access protocol (e.g. 'soap') + Args : 'location' defines where to find a bibliographic service + in a protocol-dependent manner (e.g. for SOAP it is + a URL of a bibliographic WebService) + +It makes an expert guess what kind of access/transport protocol should +be used based on the I<location> of the service (e.g. if the +I<location> looks like an IOR then the access protocol is probably +CORBA). + +=cut + +# this is kept here for the future when more access protocols +# (e.g. CORBA) may be available for accessing bibliographic query +# services + +sub _guess_access { +# my ($class, $location) = @_; + return 'soap'; +} + +=head2 VERSION and Revision + + Usage : print $Bio::Biblio::VERSION; + print $Bio::Biblio::Revision; + +=cut + +1; +__END__