[Bioperl-l] true inserts into a SimpleAlign

Mark A. Jensen maj at fortinbras.us
Wed Feb 4 00:06:12 UTC 2009


Folks-

I was desiring to make a true insertion of a LocatableSeq into a SimpleAlign,
rather than just adding it to the end as
 $aln->add_seq($lseq)
would do. This:
 $aln->add_seq($lseq,$order)
currently stomps on whatever is stored at $order in the index. The patch at 
the bottom of the post allows a true insertion (if something exists at index 
location $order, the minimum number of entries from that point on are moved 
down to make room.)

Might be useful for others. All t/Align/SimpleAlign.t tests pass. Lemme know-

Mark

---

 Index: SimpleAlign.pm
 ===================================================================
 --- SimpleAlign.pm (revision 15496)
 +++ SimpleAlign.pm (working copy) 
 @@ -304,8 +304,22 @@
      else {
   $self->debug( "Assigning $name to $order\n");
  
 - $self->{'_order'}->{$order} = $name;
 + my $ordh = $self->{'_order'};
 + if ($ordh->{$order}) {
 +     # make space to insert
 +     # $c->() returns (in reverse order) the first subsequence 
 +     # of consecutive integers; i.e., $c->(1,2,3,5,6,7) returns
 +     # (3,2,1), and $c->(2,4,5) returns (2).
 +     my $c;
 +     $c = sub { return (($_[1]-$_[0] == 1) ? ($c->(@_[1..$#_]),$_[0]) : $_[0]); };
 +     map { 
 +  $ordh->{$_+1} = $ordh->{$_}
 +     } $c->(sort {$a <=> $b} grep {$_ >= $order} keys %{$ordh});
 
 + }
 + $ordh->{$order} = $name;
 +
 +
   unless( exists( $self->{'_start_end_lists'}->{$id})) {
       $self->{'_start_end_lists'}->{$id} = [];
   }
 



More information about the Bioperl-l mailing list