From ce90f95874ac2e0eb2d032b5639ad26d2a0bbb72 Mon Sep 17 00:00:00 2001
From: Eugene Kulesha <ek@ebi.ac.uk>
Date: Fri, 1 Oct 2010 16:27:27 +0000
Subject: [PATCH] exons of the genes overlapping chromosome origin are attached
 to the normal slice, but with negative coordinates

---
 modules/Bio/EnsEMBL/Exon.pm | 41 +++++++++++++++++++------------------
 1 file changed, 21 insertions(+), 20 deletions(-)

diff --git a/modules/Bio/EnsEMBL/Exon.pm b/modules/Bio/EnsEMBL/Exon.pm
index 2181223b15..df5494ac0d 100755
--- a/modules/Bio/EnsEMBL/Exon.pm
+++ b/modules/Bio/EnsEMBL/Exon.pm
@@ -1441,27 +1441,28 @@ sub seq {
       return undef;
     }
 
-    if (    $self->slice->start() > $self->slice->end()
-         && $self->slice->is_circular() )
-    {
-      my $mid_point =
-        $self->slice()->seq_region_length() -
-        $self->slice()->start() + 1;
-
-      my $seq1 =
-        $self->slice()
-        ->subseq( $self->start(), $mid_point, $self->strand() );
-
-      my $seq2 =
-        $self->slice()
-        ->subseq( $mid_point + 1, $self->end(), $self->strand() );
-
-      $seq = $self->strand() > 0 ? "$seq1$seq2" : "$seq2$seq1";
-
+    if ($self->slice->is_circular() ) {
+	if (    $self->slice->start > $self->slice->end) {
+# Normally exons overlapping chromosome origin will have negative feature start, but slice will be from 1 .. length 
+# But in case you got an exon attached to  a sub slice try this
+	    my $mid_point = $self->slice()->seq_region_length() - $self->slice()->start() + 1;
+	    my $seq1 =	$self->slice()->subseq( $self->start(), $mid_point, $self->strand() );
+
+	    my $seq2 = $self->slice()->subseq( $mid_point + 1, $self->end(), $self->strand() );
+
+	    $seq = $self->strand() > 0 ? "$seq1$seq2" : "$seq2$seq1";
+	} elsif ( $self->start < 0) {
+# Normally exons overlapping chromosome origin will have negative start
+	    my $start_point = $self->slice->seq_region_length + $self->slice->start;
+	    my $mid_point = $self->slice->seq_region_length;
+	    my $seq1 =	$self->slice->subseq( $self->start, $mid_point, $self->strand);
+	    my $seq2 = $self->slice->subseq(1, $self->end, $self->strand );
+	    $seq = $self->strand > 0 ? "$seq1$seq2" : "$seq2$seq1";
+	} else {
+	    $seq = $self->slice()->subseq( $self->start(), $self->end(), $self->strand() );
+	}
     } else {
-      $seq =
-        $self->slice()
-        ->subseq( $self->start(), $self->end(), $self->strand() );
+	$seq = $self->slice()->subseq( $self->start(), $self->end(), $self->strand() );
     }
 
     $self->{'_seq_cache'} = $seq;
-- 
GitLab