diff variant_effect_predictor/Bio/Location/Simple.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/Location/Simple.pm	Thu Apr 11 02:01:53 2013 -0400
@@ -0,0 +1,361 @@
+# $Id: Simple.pm,v 1.31 2002/10/22 07:38:35 lapp Exp $
+#
+# BioPerl module for Bio::Location::Simple
+# 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::Location::Simple - Implementation of a Simple Location on a Sequence
+
+=head1 SYNOPSIS
+
+    use Bio::Location::Simple;
+
+    my $location = new Bio::Location::Simple(-start => 1, -end => 100,
+					     -strand => 1 );
+
+    if( $location->strand == -1 ) {
+	printf "complement(%d..%d)\n", $location->start, $location->end;
+    } else {
+	printf "%d..%d\n", $location->start, $location->end;
+    }
+
+=head1 DESCRIPTION
+
+This is an implementation of Bio::LocationI to manage exact location
+information on a Sequence: '22' or '12..15' or '16^17'.
+
+You can test the type of the location using lenght() function () or
+directly location_type() which can one of two values: 'EXACT' or
+'IN-BETWEEN'.
+
+
+=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 - Heikki Lehvaslaiho
+
+Email heikki@ebi.ac.uk
+
+=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::Location::Simple;
+use vars qw(@ISA);
+use strict;
+
+use Bio::Root::Root;
+use Bio::Location::Atomic;
+
+
+@ISA = qw( Bio::Location::Atomic );
+
+BEGIN {
+    use vars qw(  %RANGEENCODE  %RANGEDECODE  );
+
+    %RANGEENCODE  = ('\.\.' => 'EXACT',
+		     '\^' => 'IN-BETWEEN' );
+
+    %RANGEDECODE  = ('EXACT' => '..',
+		     'IN-BETWEEN' => '^' );
+
+}
+
+sub new { 
+    my ($class, @args) = @_;
+    my $self = $class->SUPER::new(@args);
+
+    my ($locationtype) = $self->_rearrange([qw(LOCATION_TYPE)],@args);
+
+    $locationtype && $self->location_type($locationtype);
+
+    return $self;
+}
+
+=head2 start
+
+  Title   : start
+  Usage   : $start = $loc->start();
+  Function: get/set the start of this range
+  Returns : the start of this range
+  Args    : optionaly allows the start to be set
+          : using $loc->start($start)
+
+=cut
+
+sub start {
+  my ($self, $value) = @_;
+
+  $self->{'_start'} = $value if defined $value ;
+
+  $self->throw("Only adjacent residues when location type ".
+	       "is IN-BETWEEN. Not [". $self->{'_start'}. "] and [".
+	       $self->{'_end'}. "]" )
+      if defined $self->{'_start'} && defined $self->{'_end'} && 
+	  $self->location_type eq 'IN-BETWEEN' &&
+	  ($self->{'_end'} - 1 != $self->{'_start'});
+  return $self->{'_start'};
+}
+
+
+=head2 end
+
+  Title   : end
+  Usage   : $end = $loc->end();
+  Function: get/set the end of this range
+  Returns : the end of this range
+  Args    : optionaly allows the end to be set
+          : using $loc->end($start)
+
+=cut
+
+sub end {
+  my ($self, $value) = @_;
+
+  $self->{'_end'} = $value if defined $value ;
+  $self->throw("Only adjacent residues when location type ".
+	      "is IN-BETWEEN. Not [". $self->{'_start'}. "] and [".
+	       $self->{'_end'}. "]" )
+      if defined $self->{'_start'} && defined $self->{'_end'} && 
+	  $self->location_type eq 'IN-BETWEEN' &&
+	  ($self->{'_end'} - 1 != $self->{'_start'});
+
+  return $self->{'_end'};
+}
+
+=head2 strand
+
+  Title   : strand
+  Usage   : $strand = $loc->strand();
+  Function: get/set the strand of this range
+  Returns : the strandidness (-1, 0, +1)
+  Args    : optionaly allows the strand to be set
+          : using $loc->strand($strand)
+
+=cut
+
+=head2 length
+
+ Title   : length
+ Usage   : $len = $loc->length();
+ Function: get the length in the coordinate space this location spans
+ Example :
+ Returns : an integer
+ Args    : none
+
+
+=cut
+
+sub length {
+   my ($self) = @_;
+   if ($self->location_type eq 'IN-BETWEEN' ) {
+       return 0;
+   } else {
+       return abs($self->end - $self->start) + 1;
+   }
+
+}
+
+=head2 min_start
+
+  Title   : min_start
+  Usage   : my $minstart = $location->min_start();
+  Function: Get minimum starting location of feature startpoint
+  Returns : integer or undef if no minimum starting point.
+  Args    : none
+
+=cut
+
+=head2 max_start
+
+  Title   : max_start
+  Usage   : my $maxstart = $location->max_start();
+  Function: Get maximum starting location of feature startpoint.
+
+            In this implementation this is exactly the same as min_start().
+
+  Returns : integer or undef if no maximum starting point.
+  Args    : none
+
+=cut
+
+=head2 start_pos_type
+
+  Title   : start_pos_type
+  Usage   : my $start_pos_type = $location->start_pos_type();
+  Function: Get start position type (ie <,>, ^).
+
+  Returns : type of position coded as text 
+            ('BEFORE', 'AFTER', 'EXACT','WITHIN', 'BETWEEN', 'IN-BETWEEN')
+  Args    : none
+
+=cut
+
+=head2 min_end
+
+  Title   : min_end
+  Usage   : my $minend = $location->min_end();
+  Function: Get minimum ending location of feature endpoint 
+  Returns : integer or undef if no minimum ending point.
+  Args    : none
+
+=cut
+
+
+=head2 max_end
+
+  Title   : max_end
+  Usage   : my $maxend = $location->max_end();
+  Function: Get maximum ending location of feature endpoint 
+
+            In this implementation this is exactly the same as min_end().
+
+  Returns : integer or undef if no maximum ending point.
+  Args    : none
+
+=cut
+
+=head2 end_pos_type
+
+  Title   : end_pos_type
+  Usage   : my $end_pos_type = $location->end_pos_type();
+  Function: Get end position type (ie <,>, ^) 
+
+  Returns : type of position coded as text 
+            ('BEFORE', 'AFTER', 'EXACT','WITHIN', 'BETWEEN', 'IN-BETWEEN')
+  Args    : none
+
+=cut
+
+=head2 location_type
+
+  Title   : location_type
+  Usage   : my $location_type = $location->location_type();
+  Function: Get location type encoded as text
+  Returns : string ('EXACT' or 'IN-BETWEEN')
+  Args    : 'EXACT' or '..' or 'IN-BETWEEN' or '^'
+
+=cut
+
+sub location_type {
+    my ($self, $value) = @_;
+
+    if( defined $value || ! defined $self->{'_location_type'} ) {
+	$value = 'EXACT' unless defined $value;
+	$value = uc $value;
+	if (! defined $RANGEDECODE{$value}) {
+	    $value = '\^' if $value eq '^';
+	    $value = '\.\.' if $value eq '..';
+	    $value = $RANGEENCODE{$value};
+	}
+	$self->throw("Did not specify a valid location type. [$value] is no good")
+	    unless defined $value;
+	$self->{'_location_type'} = $value;
+    }
+    $self->throw("Only adjacent residues when location type ".
+		 "is IN-BETWEEN. Not [". $self->{'_start'}. "] and [".
+		 $self->{'_end'}. "]" )
+	if $self->{'_location_type'} eq 'IN-BETWEEN' &&
+	    defined $self->{'_start'} &&
+		defined $self->{'_end'} &&
+		    ($self->{'_end'} - 1 != $self->{'_start'});
+
+    return $self->{'_location_type'};
+}
+
+=head2 is_remote
+
+ Title   : is_remote
+ Usage   : $self->is_remote($newval)
+ Function: Getset for is_remote value
+ Returns : value of is_remote
+ Args    : newvalue (optional)
+
+
+=cut
+
+=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) = @_;
+
+    my $str;
+    if( $self->start == $self->end ) {
+	return $self->start;
+    }
+    $str = $self->start . $RANGEDECODE{$self->location_type} . $self->end;
+    if($self->is_remote() && $self->seq_id()) {
+	$str = $self->seq_id() . ":" . $str;
+    }
+    if( $self->strand == -1 ) {
+	$str = "complement(".$str.")";
+    }
+    return $str;
+}
+
+#
+# not tested
+#
+sub trunc {
+  my ($self,$start,$end,$relative_ori) = @_;
+
+  my $newstart  = $self->start - $start+1;
+  my $newend    = $self->end   - $start+1;
+  my $newstrand = $relative_ori * $self->strand;
+
+  my $out;
+  if( $newstart < 1 || $newend > ($end-$start+1) ) {
+    $out = Bio::Location::Simple->new();
+    $out->start($self->start);
+    $out->end($self->end);
+    $out->strand($self->strand);
+    $out->seq_id($self->seqid);
+    $out->is_remote(1);
+  } else {
+    $out = Bio::Location::Simple->new();
+    $out->start($newstart);
+    $out->end($newend);
+    $out->strand($newstrand);
+    $out->seq_id();
+  }
+
+  return $out;
+}
+
+1;
+