BioPerl

 view release on metacpan or  search on metacpan

Bio/SeqIO/pir.pm  view on Meta::CPAN


The rest of the documentation details each of the object
methods. Internal methods are usually preceded with a _

=cut

# Let the code begin...

package Bio::SeqIO::pir;
use strict;

use Bio::Seq::SeqFactory;

use base qw(Bio::SeqIO);

our %VALID_TYPE = map {$_ => 1} qw(P1 F1 DL DC RL RC XX);

sub _initialize {
  my($self,@args) = @_;
  $self->SUPER::_initialize(@args);
  if( ! defined $self->sequence_factory ) {
      $self->sequence_factory(Bio::Seq::SeqFactory->new
			      (-verbose => $self->verbose(),
			       -type => 'Bio::Seq'));
  }
}

=head2 next_seq

 Title   : next_seq
 Usage   : $seq = $stream->next_seq()
 Function: returns the next sequence in the stream
 Returns : Bio::Seq object
 Args    : NONE

=cut

sub next_seq {
    my ($self) = @_;
    local $/ = "\n>";
    return unless my $line = $self->_readline;
    if ( $line eq '>' ) {    # handle the very first one having no comment
        return unless $line = $self->_readline;
    }
    my ( $top, $desc, $seq ) = ( $line =~ /^(.+?)\n(.*?)\n([^>]*)/s )
        or $self->throw("Cannot parse entry PIR entry [$line]");

    my ( $type, $id );
    if ( $top =~ /^>?(\S{2});(\S+)\s*$/ ) {
        ( $type, $id ) = ( $1, $2 );
        if ( ! exists $VALID_TYPE{$type} ) {
            $self->throw(
                "PIR stream read attempted without proper two-letter sequence code [ $type ]"
            );
        }
    } else {
        $self->throw("Line does not match PIR format [ $line ]");
    }

    # P - indicates complete protein
    # F - indicates protein fragment
    # not sure how to stuff these into a Bio object
    # suitable for writing out.
    $seq =~ s/\*//g;
    $seq =~ s/[\(\)\.\/\=\,]//g;
    $seq =~ s/\s+//g;    # get rid of whitespace

    my ($alphabet) = ('protein');

    # TODO - not processing SFS data
    return $self->sequence_factory->create(
        -seq        => $seq,
        -primary_id => $id,
        -id         => $id,
        -desc       => $desc,
        -alphabet   => $alphabet
    );
}

=head2 write_seq

 Title   : write_seq
 Usage   : $stream->write_seq(@seq)
 Function: writes the $seq object into the stream
 Returns : 1 for success and 0 for error
 Args    : Array of Bio::PrimarySeqI objects


=cut

sub write_seq {
    my ($self, @seq) = @_;
    for my $seq (@seq) {
	$self->throw("Did not provide a valid Bio::PrimarySeqI object")
	    unless defined $seq && ref($seq) && $seq->isa('Bio::PrimarySeqI');

        $self->warn("No whitespace allowed in PIR ID [". $seq->display_id. "]")
            if $seq->display_id =~ /\s/;

	my $str = $seq->seq();
	return unless $self->_print(">P1;".$seq->id(),
				    "\n", $seq->desc(), "\n",
				    $str, "*\n");
    }

    $self->flush if $self->_flush_on_write && defined $self->_fh;
    return 1;
}

1;



( run in 1.220 second using v1.01-cache-2.11-cpan-364913b4093 )