sub next_aln
{ my $self = shift;
my $entry;
my (%hash,$name,$str,@names,$seqname,$start,$end,$count,$seq);
my $aln = Bio::SimpleAlign->new(-source => 'gcg' );
while( $entry = $self->_readline) {
$entry =~ /\/\// && last; $entry =~ /Name:\s+(\S+)/ && do { $name = $1;
$hash{$name} = ""; push(@names,$name); };
}
while( $entry = $self->_readline) {
next if ( $entry =~ /^\s+(\d+)/ ) ;
$entry =~ /^\s*(\S+)\s+(.*)$/ && do {
$name = $1;
$str = $2;
if( ! exists $hash{$name} ) {
$self->throw("$name exists as an alignment line but not in the header. Not confident of what is going on!");
}
$str =~ s/\s//g;
$hash{$name} .= $str;
};
}
return 0 if scalar @names < 1;
foreach $name ( @names ) {
if( $name =~ /(\S+)\/(\d+)-(\d+)/ ) {
$seqname = $1;
$start = $2;
$end = $3;
} else {
$seqname=$name;
$start = 1;
$str = $hash{$name};
$str =~ s/[^A-Za-z]//g;
$end = length($str);
}
$seq = new Bio::LocatableSeq('-seq'=>$hash{$name},
'-id'=>$seqname,
'-start'=>$start,
'-end'=>$end,
);
$aln->add_seq($seq);
}
return $aln; } |
sub write_aln
{ my ($self,@aln) = @_;
my $msftag;
my $type;
my $count = 0;
my $maxname;
my ($length,$date,$name,$seq,$miss,$pad,%hash,@arr,$tempcount,$index);
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;
}
$date = localtime(time);
$msftag = "MSF";
$type = $valid_type{$aln->get_seq_by_pos(1)->alphabet};
$maxname = $aln->maxdisplayname_length();
$length = $aln->length();
$name = $aln->id();
if( !defined $name ) {
$name = "Align";
}
$self->_print (sprintf("\n%s MSF: %d Type: %s %s Check: 00 ..\n\n",
$name, $aln->no_sequences, $type, $date));
foreach $seq ( $aln->each_seq() ) {
$name = $aln->displayname($seq->get_nse());
$miss = $maxname - length ($name);
$miss += 2;
$pad = " " x $miss;
$self->_print (sprintf(" Name: %s%sLen: %d Check: %d Weight: 1.00\n",$name,$pad,length $seq->seq(), Bio::SeqIO::gcg->GCG_checksum($seq)));
$hash{$name} = $seq->seq();
push(@arr,$name);
}
$self->_print ("\n//\n\n\n");
while( $count < $length ) {
foreach $name ( @arr ) {
$self->_print (sprintf("%-20s ",$name));
$tempcount = $count;
$index = 0;
while( ($tempcount + 10 < $length) && ($index < 5) ) {
$self->_print (sprintf("%s ",substr($hash{$name},$tempcount,10)));
$tempcount += 10;
$index++;
} if( $index < 5) {
$self->_print (sprintf("%s ",substr($hash{$name},$tempcount)));
$tempcount += 10;
}
$self->_print ("\n");
}
$self->_print ("\n\n");
$count = $tempcount;
}
}
$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/