Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/Ontology/Term.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/Ontology/Term.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,746 @@ +# $Id: Term.pm,v 1.8.2.3 2003/05/27 22:00:52 lapp Exp $ +# +# BioPerl module for Bio::Ontology::Term +# +# Cared for by Christian M. Zmasek <czmasek@gnf.org> or <cmzmasek@yahoo.com> +# +# (c) Christian M. Zmasek, czmasek@gnf.org, 2002. +# (c) GNF, Genomics Institute of the Novartis Research Foundation, 2002. +# +# You may distribute this module under the same terms as perl itself. +# Refer to the Perl Artistic License (see the license accompanying this +# software package, or see http://www.perl.com/language/misc/Artistic.html) +# for the terms under which you may use, modify, and redistribute this module. +# +# THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. +# +# You may distribute this module under the same terms as perl itself + +# POD documentation - main docs before the code + + +=head1 NAME + +Term - interface for ontology terms + +=head1 SYNOPSIS + +#get Bio::Ontology::TermI somehow. + + print $term->identifier(), "\n"; + print $term->name(), "\n"; + print $term->definition(), "\n"; + print $term->is_obsolete(), "\n"; + print $term->comment(), "\n"; + + foreach my $synonym ( $term->each_synonym() ) { + print $synonym, "\n"; + } + +=head1 DESCRIPTION + +This is "dumb" interface for ontology terms providing basic methods +(it provides no functionality related to graphs). It implements the +L<Bio::Ontology::TermI> interface. + +This class also implements L<Bio::IdentifiableI> and +L<Bio::DescribableI>. + +=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 one +of the Bioperl mailing lists. Your participation is much appreciated. + + bioperl-l@bioperl.org - General discussion + http://bio.perl.org/MailList.html - About the mailing lists + +=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 AUTHOR + +Christian M. Zmasek + +Email: czmasek@gnf.org or cmzmasek@yahoo.com + +WWW: http://www.genetics.wustl.edu/eddy/people/zmasek/ + +Address: + + Genomics Institute of the Novartis Research Foundation + 10675 John Jay Hopkins Drive + San Diego, CA 92121 + +=head1 APPENDIX + +The rest of the documentation details each of the object +methods. + +=cut + + +# Let the code begin... + +package Bio::Ontology::Term; +use vars qw( @ISA ); +use strict; +use Bio::Root::Object; +use Bio::Ontology::TermI; +use Bio::Ontology::Ontology; +use Bio::Ontology::OntologyStore; +use Bio::IdentifiableI; +use Bio::DescribableI; + +use constant TRUE => 1; +use constant FALSE => 0; + +@ISA = qw( Bio::Root::Root + Bio::Ontology::TermI + Bio::IdentifiableI + Bio::DescribableI + ); + + + +=head2 new + + Title : new + Usage : $term = Bio::Ontology::Term->new( -identifier => "16847", + -name => "1-aminocyclopropane-1-carboxylate synthase", + -definition => "Catalysis of ...", + -is_obsolete => 0, + -comment => "" ); + Function: Creates a new Bio::Ontology::Term. + Returns : A new Bio::Ontology::Term object. + Args : -identifier => the identifier of this term [scalar] + -name => the name of this term [scalar] + -definition => the definition of this term [scalar] + -ontology => the ontology this term lives in + (a L<Bio::Ontology::OntologyI> object) + -version => version information [scalar] + -is_obsolete => the obsoleteness of this term [0 or 1] + -comment => a comment [scalar] + +=cut + +sub new { + + my( $class,@args ) = @_; + + my $self = $class->SUPER::new( @args ); + + my ( $identifier, + $name, + $definition, + $category, + $ont, + $version, + $is_obsolete, + $comment, + $dblinks) + = $self->_rearrange( [ qw( IDENTIFIER + NAME + DEFINITION + CATEGORY + ONTOLOGY + VERSION + IS_OBSOLETE + COMMENT + DBLINKS + ) ], @args ); + + $self->init(); + + $identifier && $self->identifier( $identifier ); + $name && $self->name( $name ); + $definition && $self->definition( $definition ); + $category && $self->category( $category ); + $ont && $self->ontology( $ont ); + defined($version) && $self->version( $version ); + defined($is_obsolete) && $self->is_obsolete( $is_obsolete ); + $comment && $self->comment( $comment ); + ref($dblinks) && $self->add_dblink(@$dblinks); + + return $self; + +} # new + + + +sub init { + + my $self = shift; + + $self->identifier(undef); + $self->name(undef); + $self->comment(undef); + $self->definition(undef); + $self->ontology(undef); + $self->is_obsolete(0); + $self->remove_synonyms(); + $self->remove_dblinks(); + $self->remove_secondary_ids(); + +} # init + + + +=head2 identifier + + Title : identifier + Usage : $term->identifier( "0003947" ); + or + print $term->identifier(); + Function: Set/get for the identifier of this Term. + Returns : The identifier [scalar]. + Args : The identifier [scalar] (optional). + +=cut + +sub identifier { + my $self = shift; + + return $self->{'identifier'} = shift if @_; + return $self->{'identifier'}; +} # identifier + + + + +=head2 name + + Title : name + Usage : $term->name( "N-acetylgalactosaminyltransferase" ); + or + print $term->name(); + Function: Set/get for the name of this Term. + Returns : The name [scalar]. + Args : The name [scalar] (optional). + +=cut + +sub name { + my $self = shift; + + return $self->{'name'} = shift if @_; + return $self->{'name'}; +} # name + + + + + +=head2 definition + + Title : definition + Usage : $term->definition( "Catalysis of ..." ); + or + print $term->definition(); + Function: Set/get for the definition of this Term. + Returns : The definition [scalar]. + Args : The definition [scalar] (optional). + +=cut + +sub definition { + my $self = shift; + + return $self->{'definition'} = shift if @_; + return $self->{'definition'}; +} # definition + + +=head2 ontology + + Title : ontology + Usage : $ont = $term->ontology(); + or + $term->ontology( $ont ); + Function: Get the ontology this term is in. + + Note that with the ontology in hand you can query for all + related terms etc. See L<Bio::Ontology::OntologyI>. + + Returns : The ontology of this Term as a L<Bio::Ontology::OntologyI> + implementing object. + Args : On set, the ontology of this Term as a L<Bio::Ontology::OntologyI> + implementing object or a string representing its name. + +=cut + +sub ontology { + my $self = shift; + my $ont; + + if(@_) { + $ont = shift; + if($ont) { + $ont = Bio::Ontology::Ontology->new(-name => $ont) if ! ref($ont); + if(! $ont->isa("Bio::Ontology::OntologyI")) { + $self->throw(ref($ont)." does not implement ". + "Bio::Ontology::OntologyI. Bummer."); + } + } + return $self->{"_ontology"} = $ont; + } + return $self->{"_ontology"}; +} # ontology + + +=head2 version + + Title : version + Usage : $term->version( "1.00" ); + or + print $term->version(); + Function: Set/get for version information. + Returns : The version [scalar]. + Args : The version [scalar] (optional). + +=cut + +sub version { + my $self = shift; + + return $self->{'version'} = shift if @_; + return $self->{'version'}; +} # version + + + +=head2 is_obsolete + + Title : is_obsolete + Usage : $term->is_obsolete( 1 ); + or + if ( $term->is_obsolete() ) + Function: Set/get for the obsoleteness of this Term. + Returns : the obsoleteness [0 or 1]. + Args : the obsoleteness [0 or 1] (optional). + +=cut + +sub is_obsolete{ + my $self = shift; + + return $self->{'is_obsolete'} = shift if @_; + return $self->{'is_obsolete'}; +} # is_obsolete + + + + + +=head2 comment + + Title : comment + Usage : $term->comment( "Consider the term ..." ); + or + print $term->comment(); + Function: Set/get for an arbitrary comment about this Term. + Returns : A comment. + Args : A comment (optional). + +=cut + +sub comment{ + my $self = shift; + + return $self->{'comment'} = shift if @_; + return $self->{'comment'}; +} # comment + + + + +=head2 get_synonyms + + Title : get_synonyms + Usage : @aliases = $term->get_synonyms; + Function: Returns a list of aliases of this Term. + Returns : A list of aliases [array of [scalar]]. + Args : + +=cut + +sub get_synonyms { + my $self = shift; + + return @{ $self->{ "_synonyms" } } if exists($self->{ "_synonyms" }); + return (); +} # get_synonyms + + +=head2 add_synonym + + Title : add_synonym + Usage : $term->add_synonym( @asynonyms ); + or + $term->add_synonym( $synonym ); + Function: Pushes one or more synonyms into the list of synonyms. + Returns : + Args : One synonym [scalar] or a list of synonyms [array of [scalar]]. + +=cut + +sub add_synonym { + my ( $self, @values ) = @_; + + return unless( @values ); + + # avoid duplicates + foreach my $syn (@values) { + next if grep { $_ eq $syn; } @{$self->{ "_synonyms" }}; + push( @{ $self->{ "_synonyms" } }, $syn ); + } + +} # add_synonym + + +=head2 remove_synonyms + + Title : remove_synonyms() + Usage : $term->remove_synonyms(); + Function: Deletes (and returns) the synonyms of this Term. + Returns : A list of synonyms [array of [scalar]]. + Args : + +=cut + +sub remove_synonyms { + my ( $self ) = @_; + + my @a = $self->get_synonyms(); + $self->{ "_synonyms" } = []; + return @a; + +} # remove_synonyms + +=head2 get_dblinks + + Title : get_dblinks() + Usage : @ds = $term->get_dblinks(); + Function: Returns a list of each dblinks of this GO term. + Returns : A list of dblinks [array of [scalars]]. + Args : + +=cut + +sub get_dblinks { + my $self = shift; + + return @{$self->{ "_dblinks" }} if exists($self->{ "_dblinks" }); + return (); +} # get_dblinks + + +=head2 add_dblink + + Title : add_dblink + Usage : $term->add_dblink( @dbls ); + or + $term->add_dblink( $dbl ); + Function: Pushes one or more dblinks onto the list of dblinks. + Returns : + Args : One dblink [scalar] or a list of + dblinks [array of [scalars]]. + +=cut + +sub add_dblink { + my ( $self, @values ) = @_; + + return unless( @values ); + + # avoid duplicates + foreach my $dbl (@values) { + next if grep { $_ eq $dbl; } @{$self->{ "_dblinks" }}; + push( @{ $self->{ "_dblinks" } }, $dbl ); + } + +} # add_dblink + + +=head2 remove_dblinks + + Title : remove_dblinks() + Usage : $term->remove_dblinks(); + Function: Deletes (and returns) the definition references of this GO term. + Returns : A list of definition references [array of [scalars]]. + Args : + +=cut + +sub remove_dblinks { + my ( $self ) = @_; + + my @a = $self->get_dblinks(); + $self->{ "_dblinks" } = []; + return @a; + +} # remove_dblinks + +=head2 get_secondary_ids + + Title : get_secondary_ids + Usage : @ids = $term->get_secondary_ids(); + Function: Returns a list of secondary identifiers of this Term. + + Secondary identifiers mostly originate from merging terms, + or possibly also from splitting terms. + + Returns : A list of secondary identifiers [array of [scalar]] + Args : + +=cut + +sub get_secondary_ids { + my $self = shift; + + return @{$self->{"_secondary_ids"}} if exists($self->{"_secondary_ids"}); + return (); +} # get_secondary_ids + + +=head2 add_secondary_id + + Title : add_secondary_id + Usage : $term->add_secondary_id( @ids ); + or + $term->add_secondary_id( $id ); + Function: Adds one or more secondary identifiers to this term. + Returns : + Args : One or more secondary identifiers [scalars] + +=cut + +sub add_secondary_id { + my $self = shift; + + return unless @_; + + # avoid duplicates + foreach my $id (@_) { + next if grep { $_ eq $id; } @{$self->{ "_secondary_ids" }}; + push( @{ $self->{ "_secondary_ids" } }, $id ); + } + +} # add_secondary_id + + +=head2 remove_secondary_ids + + Title : remove_secondary_ids + Usage : $term->remove_secondary_ids(); + Function: Deletes (and returns) the secondary identifiers of this Term. + Returns : The previous list of secondary identifiers [array of [scalars]] + Args : + +=cut + +sub remove_secondary_ids { + my $self = shift; + + my @a = $self->get_secondary_ids(); + $self->{ "_secondary_ids" } = []; + return @a; + +} # remove_secondary_ids + + +# Title :_is_true_or_false +# Function: Checks whether the argument is TRUE or FALSE. +# Returns : +# Args : The value to be checked. +sub _is_true_or_false { + my ( $self, $value ) = @_; + unless ( $value !~ /\D/ && ( $value == TRUE || $value == FALSE ) ) { + $self->throw( "Found [" . $value + . "] where " . TRUE . " or " . FALSE . " expected" ); + } +} # _is_true_or_false + +=head1 Methods implementing L<Bio::IdentifiableI> and L<Bio::DescribableI> + +=cut + +=head2 object_id + + Title : object_id + Usage : $string = $obj->object_id() + Function: a string which represents the stable primary identifier + in this namespace of this object. + + This is a synonym for identifier(). + + Returns : A scalar + +=cut + +sub object_id { + return shift->identifier(@_); +} + +=head2 authority + + Title : authority + Usage : $authority = $obj->authority() + Function: a string which represents the organisation which + granted the namespace, written as the DNS name for + organisation (eg, wormbase.org) + + This forwards to ontology()->authority(). Note that you + cannot set the authority before having set the ontology or + the namespace (which will set the ontology). + + Returns : A scalar + Args : on set, the new value (a scalar) + +=cut + +sub authority { + my $self = shift; + my $ont = $self->ontology(); + + return $ont->authority(@_) if $ont; + $self->throw("cannot manipulate authority prior to ". + "setting the namespace or ontology") if @_; + return undef; +} + + +=head2 namespace + + Title : namespace + Usage : $string = $obj->namespace() + Function: A string representing the name space this identifier + is valid in, often the database name or the name + describing the collection. + + This forwards to ontology() (set mode) and + ontology()->name() (get mode). I.e., setting the namespace + will set the ontology to one matching that name in the + ontology store, or to one newly created. + + Returns : A scalar + Args : on set, the new value (a scalar) + +=cut + +sub namespace { + my $self = shift; + + $self->ontology(@_) if(@_); + my $ont = $self->ontology(); + return defined($ont) ? $ont->name() : undef; +} + +=head2 display_name + + Title : display_name + Usage : $string = $obj->display_name() + Function: A string which is what should be displayed to the user. + + The definition in L<Bio::DescribableI> states that the + string should not contain spaces. As this isn't very + sensible for ontology terms, we relax this here. The + implementation just forwards to name(). + + Returns : A scalar + Args : on set, the new value (a scalar) + +=cut + +sub display_name { + return shift->name(@_); +} + + +=head2 description + + Title : description + Usage : $string = $obj->description() + Function: A text string suitable for displaying to the user a + description. This string is likely to have spaces, but + should not have any newlines or formatting - just plain + text. + + This forwards to definition(). The caveat is that the text + will often be longer for ontology term definitions than the + 255 characters stated in the definition in + L<Bio::DescribableI>. + + Returns : A scalar + Args : on set, the new value (a scalar) + +=cut + +sub description { + return shift->definition(@_); +} + +################################################################# +# aliases or forwards to maintain backward compatibility +################################################################# + +=head1 Deprecated methods + +Used for looking up the methods that supercedes them. + +=cut + +=head2 category + + Title : category + Usage : + Function: This method is deprecated. Use ontology() instead. + Example : + Returns : + Args : + + +=cut + +sub category { + my $self = shift; + + $self->warn("TermI::category is deprecated and being phased out. ". + "Use TermI::ontology instead."); + + # called in set mode? + if(@_) { + # yes; what is incompatible with ontology() is if we were given + # a TermI object + my $arg = shift; + $arg = $arg->name() if ref($arg) && $arg->isa("Bio::Ontology::TermI"); + return $self->ontology($arg,@_); + } else { + # No, called in get mode. This is always incompatible with ontology() + # since category is supposed to return a TermI. + my $ont = $self->ontology(); + my $term; + if(defined($ont)) { + $term = Bio::Ontology::Term->new(-name => $ont->name(), + -identifier =>$ont->identifier()); + } + return $term; + } +} # category + +*each_synonym = \&get_synonyms; +*add_synonyms = \&add_synonym; +*each_dblink = \&get_dblinks; +*add_dblinks = \&add_dblink; + +1;