Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/Coordinate/ExtrapolatingPair.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/Coordinate/ExtrapolatingPair.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,240 @@ +# $Id: ExtrapolatingPair.pm,v 1.6.2.1 2003/02/20 05:11:45 heikki Exp $ +# +# bioperl module for Bio::Coordinate::ExtrapolatingPair +# +# Cared for by Heikki Lehvaslaiho <heikki@ebi.ac.uk> +# +# Copyright Heikki Lehvaslaiho +# +# You may distribute this module under the same terms as perl itself + +# POD documentation - main docs before the code + +=head1 NAME + +Bio::Coordinate::ExtrapolatingPair - Continuous match between two coordinate sets + +=head1 SYNOPSIS + + + use Bio::Location::Simple; + use Bio::Coordinate::ExtrapolatingPair; + + + $match1 = Bio::Location::Simple->new + (-seq_id => 'propeptide', -start => 21, -end => 40, -strand=>1 ); + $match2 = Bio::Location::Simple->new + (-seq_id => 'peptide', -start => 1, -end => 20, -strand=>1 ); + + $pair = Bio::Coordinate::ExtrapolatingPair-> + new(-in => $match1, + -out => $match2, + -strict => 1 + ); + + $pos = Bio::Location::Simple->new + (-start => 40, -end => 60, -strand=> 1 ); + $res = $pair->map($pos); + $res->start eq 20; + $res->end eq 20; + +=head1 DESCRIPTION + +This class represents a one continuous match between two coordinate +systems represented by Bio::Location::Simple objects. The relationship +is directed and reversible. It implements methods to ensure internal +consistency, and map continuous and split locations from one +coordinate system to another. + +This class is an elaboration of Bio::Coordoinate::Pair. The map +function returns only matches which is the mode needed most of +tehtime. By default the matching regions between coordinate systems +are boundless, so that you can say e.g. that gene starts from here in +the chromosomal coordinate system and extends indefinetely in both +directions. If you want to define the matching regions exactly, you +can do that and set strict() to true. + + +=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 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 - Heikki Lehvaslaiho + +Email: heikki@ebi.ac.uk +Address: + + EMBL Outstation, European Bioinformatics Institute + Wellcome Trust Genome Campus, Hinxton + Cambs. CB10 1SD, United Kingdom + +=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::Coordinate::ExtrapolatingPair; +use vars qw(@ISA ); +use strict; + +# Object preamble - inherits from Bio::Root::Root +use Bio::Root::Root; +use Bio::LocationI; +use Bio::Coordinate::Pair; + +@ISA = qw(Bio::Coordinate::Pair); + + +sub new { + my($class,@args) = @_; + my $self = $class->SUPER::new(@args); + + my($strict) = + $self->_rearrange([qw(STRICT + )], + @args); + + $strict && $self->strict($strict); + return $self; +} + + +=head2 strict + + Title : strict + Usage : $obj->strict(1); + Function: Set and read the strictness of the coordinate system. + Example : + Returns : value of input system + Args : boolean + +=cut + +sub strict { + my ($self,$value) = @_; + if( defined $value) { + $self->{'_strict'} = 1 if $value; + } + return $self->{'_strict'}; +} + + +=head2 map + + Title : map + Usage : $newpos = $obj->map($loc); + Function: Map the location from the input coordinate system + to a new value in the output coordinate system. + + In extrapolating coodinate system there is no location zero. + Locations are... + Example : + Returns : new location in the output coordinate system or undef + Args : Bio::Location::Simple + +=cut + +sub map { + my ($self,$value) = @_; + + $self->throw("Need to pass me a value.") + unless defined $value; + $self->throw("I need a Bio::Location, not [$value]") + unless $value->isa('Bio::LocationI'); + $self->throw("Input coordinate system not set") + unless $self->in; + $self->throw("Output coordinate system not set") + unless $self->out; + + my $match; + + if ($value->isa("Bio::Location::SplitLocationI")) { + + my $split = Bio::Coordinate::Result->new(-seq_id=>$self->out->seq_id); + foreach my $loc ( sort { $a->start <=> $b->start } + $value->sub_Location ) { + + $match = $self->_map($loc); + $split->add_sub_Location($match) if $match; + + } + $split->each_Location ? (return $split) : (return undef) ; + + } else { + return $self->_map($value); + } +} + + +=head2 _map + + Title : _map + Usage : $newpos = $obj->_map($simpleloc); + Function: Internal method that does the actual mapping. Called + multiple times by map() if the location to be mapped is a + split location + + Example : + Returns : new location in the output coordinate system or undef + Args : Bio::Location::Simple + +=cut + +sub _map { + my ($self,$value) = @_; + + my ($offset, $start, $end); + + if ($self->strand == -1) { + $offset = $self->in->end + $self->out->start; + $start = $offset - $value->end; + $end = $offset - $value->start ; + } else { # undef, 0 or 1 + $offset = $self->in->start - $self->out->start; + $start = $value->start - $offset; + $end = $value->end - $offset; + } + + # strict prevents matches outside stated range + if ($self->strict) { + return undef if $start < 0 and $end < 0; + return undef if $start > $self->out->end; + $start = 1 if $start < 0; + $end = $self->out->end if $end > $self->out->end; + } + + my $match = Bio::Location::Simple-> + new(-start => $start, + -end => $end, + -strand => $self->strand, + -seq_id => $self->out->seq_id, + -location_type => $value->location_type + ); + $match->strand($match->strand * $value->strand) if $value->strand; + bless $match, 'Bio::Coordinate::Result::Match'; + + return $match; +} + +1;