diff --git a/modules/Bio/EnsEMBL/Transcript.pm b/modules/Bio/EnsEMBL/Transcript.pm index 838bb1145e30b6be19b7a54585581f457dd13623..d4d6f2cee74508218799f693cbee905154b26211 100755 --- a/modules/Bio/EnsEMBL/Transcript.pm +++ b/modules/Bio/EnsEMBL/Transcript.pm @@ -647,16 +647,20 @@ sub add_Exon{ $self->{'_trans_exon_array'} ||= []; + my $was_added = 0; + my $ea = $self->{'_trans_exon_array'}; if( @$ea ) { if( $exon->strand() == 1 ) { if( $exon->start() > $ea->[$#$ea]->end() ) { push(@{$self->{'_trans_exon_array'}},$exon); + $was_added = 1; } else { # insert it at correct place for( my $i=0; $i <= $#$ea; $i++ ) { if( $exon->end() < $ea->[$i]->start() ) { splice( @$ea, $i, 0, $exon ); + $was_added = 1; last; } } @@ -664,11 +668,13 @@ sub add_Exon{ } else { if( $exon->end() < $ea->[$#$ea]->start() ) { push(@{$self->{'_trans_exon_array'}},$exon); + $was_added = 1; } else { # insert it at correct place for( my $i=0; $i <= $#$ea; $i++ ) { if( $exon->start() > $ea->[$i]->end() ) { splice( @$ea, $i, 0, $exon ); + $was_added = 1; last; } } @@ -676,7 +682,26 @@ sub add_Exon{ } } else { push( @$ea, $exon ); + $was_added = 1; } + + # sanity check: + if(!$was_added) { + # exon was not added because it has same end coord as start + # of another exon + my $all_str = ''; + foreach my $e (@$ea) { + $all_str .= ' '.$e->start .'-'.$e->end.' ('.$e->strand.') ' . + ($e->stable_id || '') . "\n"; + } + my $cur_str = ' '.$exon->start.'-'.$exon->end. ' ('.$exon->strand.') '. + ($exon->stable_id || '')."\n"; + throw("Exon overlaps with other exon in same transcript.\n" . + "Transcript Exons:\n$all_str\n" . + "This Exon:\n$cur_str"); + throw("Exon overlaps with other exon in same transcript."); + } + # recalculate start, end, slice, strand $self->recalculate_coordinates(); }