This object can transform
Bio::SimpleAlign objects to and from
fasta flat file databases. This is for the fasta alignment format, not
for the FastA sequence analysis program. To process the alignments from
FastA (FastX, FastN, FastP, tFastA, etc) use the Bio::SearchIO module.
sub next_aln
{ my $self = shift;
my ($width) = $self->_rearrange([qw(WIDTH)],@_);
$self->width($width || $WIDTH);
my ($start, $end, $name, $seqname, $seq, $seqchar, $entry,
$tempname, $tempdesc, %align, $desc, $maxlen);
my $aln = Bio::SimpleAlign->new();
while (defined ($entry = $self->_readline) ) {
chomp $entry;
if ( $entry =~ s/^>\s*(\S+)\s*// ) {
$tempname = $1;
chomp($entry);
$tempdesc = $entry;
if ( defined $name ) {
$seqchar =~ s/\s//g;
if ( $name =~ /(\S+)\/(\d+)-(\d+)/ ) {
$seqname = $1;
$start = $2;
$end = $3;
} else {
$seqname = $name;
$start = 1;
$end = $self->_get_len($seqchar);
}
$seq = Bio::LocatableSeq->new
(
'-seq' => $seqchar,
'-display_id' => $seqname,
'-description' => $desc,
'-start' => $start,
'-end' => $end,
'-alphabet' => $self->alphabet,
);
$aln->add_seq($seq);
$self->debug("Reading $seqname\n");
}
$desc = $tempdesc;
$name = $tempname;
$desc = $entry;
$seqchar = "";
next;
}
$seqchar .= $entry;
}
$name = "" if (!defined $name);
$seqchar="" if (!defined $seqchar);
$seqchar =~ s/\s//g;
if ( $name =~ /(\S+)\/(\d+)-(\d+)/ ) {
$seqname = $1;
$start = $2;
$end = $3;
} else {
$seqname = $name;
$start = 1;
$end = $self->_get_len($seqchar);
}
unless ( length($seqchar) == 0 && length($seqname) == 0 ) {
$seq = Bio::LocatableSeq->new
('-seq' => $seqchar,
'-display_id' => $seqname,
'-description' => $desc,
'-start' => $start,
'-end' => $end,
'-alphabet' => $self->alphabet,
);
$aln->add_seq($seq);
$self->debug("Reading $seqname\n");
}
my $alnlen = $aln->length;
foreach my $seq ( $aln->each_seq ) {
if ( $seq->length < $alnlen ) {
my ($diff) = ($alnlen - $seq->length);
$seq->seq( $seq->seq() . "-" x $diff);
}
}
return $aln if $aln->num_sequences;} |
sub write_aln
{ my ($self,@aln) = @_;
my $width = $self->width;
my ($seq,$desc,$rseq,$name,$count,$length,$seqsub);
foreach my $aln (@aln) {
if( ! $aln || ! $aln->isa('Bio::Align::AlignI') ) {
$self->warn("Must provide a Bio::Align::AlignI object when calling write_aln");
next;
}
if( $self->force_displayname_flat ) {
$aln->set_displayname_flat(1);
}
foreach $rseq ( $aln->each_seq() ) {
$name = $aln->displayname($rseq->get_nse());
$seq = $rseq->seq();
$desc = $rseq->description || '';
$desc = ' '.$desc if $desc;
$self->_print (">$name$desc\n") or return;
$count = 0;
$length = length($seq);
if(defined $seq && $length > 0) {
$seq =~ s/(.{1,$width})/$1\n/g;
} else {
$seq = "\n";
}
$self->_print($seq);
}
}
$self->flush if $self->_flush_on_write && defined $self->_fh;
return 1;} |
sub _get_len
{ my ($self,$seq) = @_;
my $chars = $Bio::LocatableSeq::GAP_SYMBOLS.$Bio::LocatableSeq::FRAMESHIFT_SYMBOLS;
$seq =~ s{[$chars]+}{}gi;
return CORE::length($seq);} |
Report bugs to the Bioperl bug tracking system to help us keep track
the bugs and their resolution. Bug reports can be submitted via the
web:
https://redmine.open-bio.org/projects/bioperl/