use Bio::SimpleAlign; sub new { my $caller = shift; my $class = ref( $caller ) || $caller; my $self = $class -> SUPER::new(); return $self; } sub read_alignment { my $self = shift; my $in = shift; my( %align, %c2name, $count ); while( <$in> ) { /^([^\#]\S+)\s+([A-Za-z\.\-]+)\s*/ && do { my $name = $1; my $seq = $2; if( ! defined $align{$name} ) { $count++; $c2name{$count} = $name; } $align{$name} .= $seq; next; }; } $count = 0; foreach my $no ( sort { $a <=> $b } keys %c2name ) { my $name = $c2name{$no}; my( $seqname, $start, $end, $strand ); if( $name =~ /(\S+)\/(\d+)-(\d+)$/ ) { $seqname = $1; $start = $2; $end = $3; } elsif ( $name =~ /(\S+)\/(\d+)-(\d+):(\d+)-(\d+)/ ) { $seqname = $1; my $ns = $2; my $s = $3; my $e = $4; my $ne = $5; $start = "$ns-$s"; $end = "$e-$ne"; # surprise: this is legal $strand = 1; } my $seq = new Bio::LocatableSeq( '-seq'=>$align{$name}, '-id'=>$seqname, '-start'=>$start, '-end'=>$end, '-strand'=>$strand, '-type'=>'aligned' ); $self -> add_seq($seq); $count++; } return $count; }