biyelunwen/99.scripts/trinity_utils/PerlLib/KmerGraphLib/KmerNode.pm

174 lines
3.2 KiB
Perl

package KmerNode;
use strict;
use warnings;
use Carp;
use ReadTracker;
use base qw (GenericNode);
sub new {
my $packagename = shift;
my ($kmer_seq, $accession) = @_;
my $self = $packagename->SUPER::new($kmer_seq);
$self->{_count} = 0;
$self->{_ReadTracker} = new ReadTracker();
$self->{depth} = undef;
## for DP scans:
$self->{_visited} = 0;
$self->{_base_score} = 0;
$self->{_sum_score} = 0;
$self->{_best_prev} = undef; # prev_node in highest scoring path.
$self->{_forward_scores} = []; # stores structs of { node => ref, score => $score}
bless ($self, $packagename);
return($self);
}
####
sub get_ReadTracker {
my $self = shift;
return($self->{_ReadTracker});
}
sub get_sequence {
my $self = shift;
return($self->get_value());
}
sub set_sequence {
my $self = shift;
my $sequence = shift;
unless ($sequence =~ /\w/) {
confess "Error, need sequence";
}
$self->set_value($sequence);
return;
}
sub track_reads {
my $self = shift;
my @accs = @_;
$self->{_ReadTracker}->track_reads(@accs);
return;
}
sub get_count {
my $self = shift;
return($self->{_count});
}
sub set_count {
my $self = shift;
my ($count) = @_;
$self->{_count} = $count;
return;
}
####
sub toString {
my $self = shift;
my @prev_nodes = $self->get_all_prev_nodes();
my @next_nodes = $self->get_all_next_nodes();
my $text = "";
foreach my $prev_node (@prev_nodes) {
$text .= "P " . $prev_node->get_value() . "(" . $prev_node->get_count() . ") $prev_node " . join(",", $prev_node->get_colors()) . "\n";
}
$text .= "X " . $self->get_value() . "(" . $self->get_count() . ") $self " . join(",", $self->get_colors()) . "\n";
foreach my $next_node (@next_nodes) {
$text .= "N " . $next_node->get_value() . "(" . $self->get_count() . ") $next_node " . join(",", $next_node->get_colors()) . "\n";
}
return($text);
}
####
sub get_reads_exiting_node {
my $self = shift;
my @next_nodes = $self->get_all_next_nodes();
unless (@next_nodes) {
return();
}
my $read_tracker = $self->get_ReadTracker();
my @reads_in_node = $read_tracker->get_tracked_read_indices();
my @reads_in_next_nodes;
foreach my $next_node (@next_nodes) {
push (@reads_in_next_nodes, $next_node->get_ReadTracker()->get_tracked_read_indices());
}
my %next_node_reads = map { + $_ => 1 } @reads_in_next_nodes;
my @exiting_reads;
foreach my $read (@reads_in_node) {
if ($next_node_reads{$read}) {
push (@exiting_reads, $read);
}
}
return(@exiting_reads);
}
####
sub get_reads_entering_node {
my $self = shift;
my @prev_nodes = $self->get_all_prev_nodes();
unless (@prev_nodes) {
return();
}
my $read_tracker = $self->get_ReadTracker();
my @reads_in_node = $read_tracker->get_tracked_read_indices();
my @reads_in_prev_nodes;
foreach my $prev_node (@prev_nodes) {
push (@reads_in_prev_nodes, $prev_node->get_ReadTracker()->get_tracked_read_indices());
}
my %prev_node_reads = map { + $_ => 1 } @reads_in_prev_nodes;
my @entering_reads;
foreach my $read (@reads_in_node) {
if ($prev_node_reads{$read}) {
push (@entering_reads, $read);
}
}
return(@entering_reads);
}
1; #EOM