Merge branch 'JABAWS_Release_2_5' into develop
[jabaws.git] / binaries / src / jpred / lib / Profile.pm
diff --git a/binaries/src/jpred/lib/Profile.pm b/binaries/src/jpred/lib/Profile.pm
new file mode 100644 (file)
index 0000000..6990921
--- /dev/null
@@ -0,0 +1,110 @@
+package Profile;
+
+use strict;
+use warnings;
+use Carp;
+
+use base qw(Root Read Write);
+
+=head1 NAME
+
+Profile - Base object for various types of profile
+
+=head1 SYNOPSIS
+
+  use Profile;
+
+  my $prof = Profile->new;
+
+=head1 DESCRIPTION
+
+Basic methods for storing information sequence profiles. The model of this object is for each sequence position to have an array of data associated with it.
+
+=head1 METHODS
+
+Inherits from Root, Read and Write.
+
+=head2 $prof->add_pos(@data)
+
+Add data to the end position of the profile.
+
+=cut
+
+sub add_pos {
+       my $self = shift;
+       @_ or croak "No data passed to ".__PACKAGE__."\n";
+       push @{ $self->{__PACKAGE__."lines"} }, pack "d*", @_;
+}
+
+sub get_aoa {
+       my ($self) = @_;
+       map { [ $self->get_pos ] } 0.. $self->get_size - 1;
+}
+
+=head2 $prof->add_line(@data)
+
+Alias for add_pos().
+
+=cut
+
+*add_line = *add_pos;
+
+=head2 @data $prof->get_pos
+
+Itterator for getting all the positions in a profile. Returns the same information as get_num_pos, or undef when it reaches the end of the profile. When this happens, a new call starts at the begining of the profile.
+
+=cut
+
+sub get_pos {
+       my ($self) = @_;
+       $self->{__PACKAGE__."counter"} ||= 0;
+
+       if ((my @foo = $self->get_num_pos( $self->{__PACKAGE__."counter"}++ )) > 0) {
+               return @foo;
+       }
+       else {
+               $self->{__PACKAGE__."counter"} = 0;
+               return undef;
+       }
+}
+
+=head2 @data = $prof->get_num_pos($position)
+
+Access the profile information for a particular position in the profile.
+
+=cut
+
+sub get_num_pos {
+       my ($self, $pos) = @_;
+
+       confess "get_num_pos didn't receive position" unless defined $pos;
+
+       #use Data::Dumper;
+       #print $pos, "\n";
+       #print Dumper unpack "d*", @{ $self->{__PACKAGE__."lines"}->[$pos]};
+
+       confess "No positions present" unless exists $self->{__PACKAGE__."lines"};
+       return undef unless defined $self->{__PACKAGE__."lines"}->[$pos];
+       return unpack "d*", $self->{__PACKAGE__."lines"}->[$pos];
+}
+
+=head2 $prof->get_size
+
+Returns the number of positions in the profile.
+
+=cut
+
+sub get_size {
+       my ($self) = @_;
+       return @{ $self->{__PACKAGE__."lines"} };
+}
+
+=head2 $prof->get_line($position)
+
+Alias for get_num_pos().
+
+=cut
+
+*get_line = *get_num_pos;
+
+1;