Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/LocationI.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/LocationI.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,415 @@ +# $Id: LocationI.pm,v 1.18 2002/12/01 00:05:19 jason Exp $ +# +# BioPerl module for Bio::LocationI +# Cared for by Jason Stajich <jason@bioperl.org> +# +# Copyright Jason Stajich +# +# You may distribute this module under the same terms as perl itself +# POD documentation - main docs before the code + +=head1 NAME + +Bio::LocationI - Abstract interface of a Location on a Sequence + +=head1 SYNOPSIS + + # get a LocationI somehow + printf( "start = %d, end = %d, strand = %s, seq_id = %s\n", + $location->start, $location->end, $location->strand, + $location->seq_id); + print "location str is ", $location->to_FTstring(), "\n"; + + +=head1 DESCRIPTION + +This Interface defines the methods for a Bio::LocationI, an object +which encapsulates a location on a biological sequence. Locations +need not be attached to actual sequences as they are stand alone +objects. LocationI objects are used by L<Bio::SeqFeatureI> objects to +manage and represent locations for a Sequence Feature. + +=head1 FEEDBACK + +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 - Jason Stajich + +Email jason@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::LocationI; +use vars qw(@ISA $coord_policy); +use strict; + +use Bio::RangeI; +use Bio::Location::WidestCoordPolicy; +use Carp; + +@ISA = qw(Bio::RangeI); + +BEGIN { + $coord_policy = Bio::Location::WidestCoordPolicy->new(); +} + +=head2 location_type + + Title : location_type + Usage : my $location_type = $location->location_type(); + Function: Get location type encoded as text + Returns : string ('EXACT', 'WITHIN', 'BETWEEN') + Args : none + +=cut + +sub location_type { + my ($self,@args) = @_; + $self->throw_not_implemented(); +} + +=head2 start + + Title : start + Usage : $start = $location->start(); + Function: Get the start coordinate of this location as defined by + the currently active coordinate computation policy. In + simple cases, this will return the same number as + min_start() and max_start(), in more ambiguous cases like + fuzzy locations the number may be equal to one or neither + of both. + + We override this here from RangeI in order to delegate + 'get' to a L<Bio::Location::CoordinatePolicy> implementing + object. Implementing classes may also wish to provide + 'set' functionality, in which case they *must* override + this method. The implementation provided here will throw + an exception if called with arguments. + + Returns : A positive integer value. + Args : none + +See L<Bio::Location::CoordinatePolicy> for more information + +=cut + +sub start { + my ($self,@args) = @_; + + # throw if @args means that we don't support updating information + # in the interface but will delegate to the coordinate policy object + # for interpreting the 'start' value + + $self->throw_not_implemented if @args; + return $self->coordinate_policy()->start($self); +} + +=head2 end + + Title : end + Usage : $end = $location->end(); + Function: Get the end coordinate of this location as defined by the + currently active coordinate computation policy. In simple + cases, this will return the same number as min_end() and + max_end(), in more ambiguous cases like fuzzy locations + the number may be equal to one or neither of both. + + We override this here from Bio::RangeI in order to delegate + 'get' to a L<Bio::Location::CoordinatePolicy> implementing + object. Implementing classes may also wish to provide + 'set' functionality, in which case they *must* override + this method. The implementation provided here will throw + an exception if called with arguments. + + Returns : A positive integer value. + Args : none + +See L<Bio::Location::CoordinatePolicy> and L<Bio::RangeI> for more +information + +=cut + +sub end { + my ($self,@args) = @_; + + # throw if @args means that we don't support updating information + # in the interface but will delegate to the coordinate policy object + # for interpreting the 'end' value + $self->throw_not_implemented if @args; + return $self->coordinate_policy()->end($self); +} + +=head2 min_start + + Title : min_start + Usage : my $minstart = $location->min_start(); + Function: Get minimum starting point of feature. + + Note that an implementation must not call start() in this method. + + Returns : integer or undef if no minimum starting point. + Args : none + +=cut + +sub min_start { + my($self) = @_; + $self->throw_not_implemented(); +} + +=head2 max_start + + Title : max_start + Usage : my $maxstart = $location->max_start(); + Function: Get maximum starting point of feature. + + Note that an implementation must not call start() in this method + unless start() is overridden such as not to delegate to the + coordinate computation policy object. + + Returns : integer or undef if no maximum starting point. + Args : none + +=cut + +sub max_start { + my($self) = @_; + $self->throw_not_implemented(); +} + +=head2 start_pos_type + + Title : start_pos_type + Usage : my $start_pos_type = $location->start_pos_type(); + Function: Get start position type encoded as text + + Known valid values are 'BEFORE' (<5..100), 'AFTER' (>5..100), + 'EXACT' (5..100), 'WITHIN' ((5.10)..100), 'BETWEEN', (5^6), with + their meaning best explained by their GenBank/EMBL location string + encoding in brackets. + + Returns : string ('BEFORE', 'AFTER', 'EXACT','WITHIN', 'BETWEEN') + Args : none + +=cut + +sub start_pos_type { + my($self) = @_; + $self->throw_not_implemented(); +} + +=head2 min_end + + Title : min_end + Usage : my $minend = $location->min_end(); + Function: Get minimum ending point of feature. + + Note that an implementation must not call end() in this method + unless end() is overridden such as not to delegate to the + coordinate computation policy object. + + Returns : integer or undef if no minimum ending point. + Args : none + +=cut + +sub min_end { + my($self) = @_; + $self->throw_not_implemented(); +} + +=head2 max_end + + Title : max_end + Usage : my $maxend = $location->max_end(); + Function: Get maximum ending point of feature. + + Note that an implementation must not call end() in this method + unless end() is overridden such as not to delegate to the + coordinate computation policy object. + + Returns : integer or undef if no maximum ending point. + Args : none + +=cut + +sub max_end { + my($self) = @_; + $self->throw_not_implemented(); +} + +=head2 end_pos_type + + Title : end_pos_type + Usage : my $end_pos_type = $location->end_pos_type(); + Function: Get end position encoded as text. + + Known valid values are 'BEFORE' (5..<100), 'AFTER' (5..>100), + 'EXACT' (5..100), 'WITHIN' (5..(90.100)), 'BETWEEN', (5^6), with + their meaning best explained by their GenBank/EMBL location string + encoding in brackets. + + Returns : string ('BEFORE', 'AFTER', 'EXACT','WITHIN', 'BETWEEN') + Args : none + +=cut + +sub end_pos_type { + my($self) = @_; + $self->throw_not_implemented(); +} + +=head2 seq_id + + Title : seq_id + Usage : my $seqid = $location->seq_id(); + Function: Get/Set seq_id that location refers to + Returns : seq_id (a string) + Args : [optional] seq_id value to set + +=cut + +sub seq_id { + my ($self, $seqid) = @_; + if( defined $seqid ) { + $self->{'_seqid'} = $seqid; + } + return $self->{'_seqid'}; +} + +=head2 is_remote + + Title : is_remote + Usage : $is_remote_loc = $loc->is_remote() + Function: Whether or not a location is a remote location. + + A location is said to be remote if it is on a different + 'object' than the object which 'has' this + location. Typically, features on a sequence will sometimes + have a remote location, which means that the location of + the feature is on a different sequence than the one that is + attached to the feature. In such a case, $loc->seq_id will + be different from $feat->seq_id (usually they will be the + same). + + While this may sound weird, it reflects the location of the + kind of AB18375:450-900 which can be found in GenBank/EMBL + feature tables. + + Example : + Returns : TRUE if the location is a remote location, and FALSE otherwise + Args : + + +=cut + +sub is_remote{ + shift->throw_not_implemented(); +} + +=head2 coordinate_policy + + Title : coordinate_policy + Usage : $policy = $location->coordinate_policy(); + $location->coordinate_policy($mypolicy); # set may not be possible + Function: Get the coordinate computing policy employed by this object. + + See L<Bio::Location::CoordinatePolicyI> for documentation + about the policy object and its use. + + The interface *does not* require implementing classes to + accept setting of a different policy. The implementation + provided here does, however, allow to do so. + + Implementors of this interface are expected to initialize + every new instance with a + L<Bio::Location::CoordinatePolicyI> object. The + implementation provided here will return a default policy + object if none has been set yet. To change this default + policy object call this method as a class method with an + appropriate argument. Note that in this case only + subsequently created Location objects will be affected. + + Returns : A L<Bio::Location::CoordinatePolicyI> implementing object. + Args : On set, a L<Bio::Location::CoordinatePolicyI> implementing object. + +See L<Bio::Location::CoordinatePolicyI> for more information + + +=cut + +sub coordinate_policy { + my ($self, $policy) = @_; + + if(defined($policy)) { + if(! $policy->isa('Bio::Location::CoordinatePolicyI')) { + $self->throw("Object of class ".ref($policy)." does not implement". + " Bio::Location::CoordinatePolicyI"); + } + if(ref($self)) { + $self->{'_coordpolicy'} = $policy; + } else { + # called as class method + $coord_policy = $policy; + } + } + return (ref($self) && exists($self->{'_coordpolicy'}) ? + $self->{'_coordpolicy'} : $coord_policy); +} + +=head2 to_FTstring + + Title : to_FTstring + Usage : my $locstr = $location->to_FTstring() + Function: returns the FeatureTable string of this location + Returns : string + Args : none + +=cut + +sub to_FTstring { + my($self) = @_; + $self->throw_not_implemented(); +} + +=head2 each_Location + + Title : each_Location + Usage : @locations = $locObject->each_Location($order); + Function: Conserved function call across Location:: modules - will + return an array containing the component Location(s) in + that object, regardless if the calling object is itself a + single location or one containing sublocations. + Returns : an array of Bio::LocationI implementing objects + Args : Optional sort order to be passed to sub_Location() for Splits + +=cut + +sub each_Location { + my ($self,@args) = @_; + $self->throw_not_implemented(); +} + +1; +