sub next_aln
{ my $self = shift;
my $entry;
my ($start,$end,%align,$name,$seqname,$seq,$count,
%hash,%c2name, %accession, $no);
my $aln = Bio::SimpleAlign->new(-source => 'stockholm');
while( defined($entry = $self->_readline) ) {
$entry !~ /\w+/ && next;
if ($entry =~ /^#\s*STOCKHOLM\s+/) {
last;
}
else {
$self->throw("Not Stockholm format: Expecting\" # STOCKHOLM 1.0\"; Found\" $_\"");
}
}
while( defined($entry = $self->_readline) ) {
last if $entry =~ /^\/\//;
if ($entry =~ /^#=GF\s+AC\s+(\S+)/) {
$aln->id($1);
next;
}
$entry =~ /^#=GS\s+(\S+)\s+AC\s+(\S+)/ && do {
$accession{ $1 } = $2;
next;
};
$entry =~ /^([A-Za-z.-]+)$/ && ( $align{$name} .= $1 ) && next;
$entry !~ /^([^#]\S+)\s+([A-Za-z.-]+)\s*/ && next;
$name = $1;
$seq = $2;
if( ! defined $align{$name} ) {
$count++;
$c2name{$count} = $name;
}
$align{$name} .= $seq;
}
foreach $no ( sort { $a <=> $b } keys %c2name ) {
$name = $c2name{$no};
if( $name =~ /(\S+)\/(\d+)-(\d+)/ ) {
$seqname = $1;
$start = $2;
$end = $3;
} else {
$seqname=$name;
$start = 1;
$end = length($align{$name});
}
$seq = new Bio::LocatableSeq('-seq'=>$align{$name},
'-id'=>$seqname,
'-start'=>$start,
'-end'=>$end,
'-type'=>'aligned',
'-accession_number' => $accession{$name},
);
$aln->add_seq($seq);
}
if ($end <= 0) { undef $aln;}
return $aln; } |
sub write_aln
{ my ($self,@aln) = @_;
$self->throw("Sorry: stockholm-format output, not yet implemented! /n");
}
1; } |
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/