174 lines
3.2 KiB
Perl
174 lines
3.2 KiB
Perl
package StringNode;
|
|
|
|
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
|
|
|