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 => 'selex');
while( $entry = $self->_readline) {
$entry =~ /^\#=GS\s+(\S+)\s+AC\s+(\S+)/ && do {
$accession{ $1 } = $2;
next;
};
$entry !~ /^([^\#]\S+)\s+([A-Za-z\.\-]+)\s*/ && next;
$name = $1;
$seq = $2;
if( ! defined $align{$name} ) {
$count++;
$c2name{$count} = $name;
}
$align{$name} .= $seq;
}
$count = 0;
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);
$count++;
}
if ($end <= 0) { undef $aln;}
return $aln; } |
sub write_aln
{ my ($self,@aln) = @_;
my ($namestr,$seq,$add);
my ($maxn);
foreach my $aln (@aln) {
$maxn = $aln->maxdisplayname_length();
foreach $seq ( $aln->each_seq() ) {
$namestr = $aln->displayname($seq->get_nse());
$add = $maxn - length($namestr) + 2;
$namestr .= " " x $add;
$self->_print (sprintf("%s %s\n",$namestr,$seq->seq())) or return;
}
}
$self->flush if $self->_flush_on_write && defined $self->_fh;
return 1;
}
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/