Algorithm-NeedlemanWunsch
view release on metacpan or search on metacpan
lib/Algorithm/NeedlemanWunsch.pm view on Meta::CPAN
# like $score_left
my @delta_left = ( $self->{gap_open_penalty}, $self->{gap_open_penalty},
$self->{gap_extend_penalty} );
my @no_delta = (0, 0, 0);
my @score = map { $_->[$m]->[$n]; } @D;
my $res = max(@score);
my $arrow = 0;
my $flag = 1;
my $idx = 0;
while ($idx < 3) { # scalar(@score)
if ($score[$idx] == $res) {
$arrow |= $flag;
}
$flag *= 2;
++$idx;
}
$i = $m;
$j = $n;
while (($i > 0) || ($j > 0)) {
my @alt;
if ($arrow & $from_diag) {
die "internal error" unless ($i > 0) && ($j > 0);
push @alt, [ $i - 1, $j - 1 ];
lib/Algorithm/NeedlemanWunsch.pm view on Meta::CPAN
--$j;
@score = map { $_->[$i]->[$j]; } @D;
if ($i == 0) {
$arrow = $from_left;
} elsif ($j == 0) {
$arrow = $from_up;
} else {
my $d = max(@score);
$arrow = 0;
$flag = 1;
$idx = 0;
while ($idx < 3) { # scalar(@score)
if ($score[$idx] == $d) {
$arrow |= $flag;
}
$flag *= 2;
++$idx;
}
}
} elsif ($move eq 'shift_a') {
--$j;
my @base = map { $_->[$i]->[$j] } @D;
my $delta;
if ($self->{local} && ($i == $m)) {
$delta = \@no_delta;
lib/Algorithm/NeedlemanWunsch.pm view on Meta::CPAN
sub _retread {
my ($self, $to_score, $i, $j, $base, $delta) = @_;
if ($i == 0) {
return $from_left;
} elsif ($j == 0) {
return $from_up;
}
my $a = 0;
my $flag = 1;
my $idx = 0;
while ($idx < 3) {
if ($base->[$idx] + $delta->[$idx] == $to_score) {
$a |= $flag;
}
$flag *= 2;
++$idx;
}
return $a;
}
sub _trace_back {
my ($self, $cur, $sources) = @_;
my $arg = { };
lib/Algorithm/NeedlemanWunsch.pm view on Meta::CPAN
=head2 Extensions
In addition to the standard Needleman-Wunsch algorithm, this module
also implements two popular extensions: local alignment and affine
block gap penalties. Use of both extensions is controlled by setting
the properties of C<Algorithm::NeedlemanWunsch> object described
below.
=head3 local
When this flag is set before calling
C<Algorithm::NeedlemanWunsch::align>, the alignment scoring doesn't
charge the gap penalty for gaps at the beginning (i.e. before the
first item) and end (after the last item) of the second sequence
passed to C<align>, so that for example the optimal (with identity
matrix as similarity matrix and a negative gap penalty) alignment of
C<a b c d e f g h> and C<b c h> becomes
sequence A: a b c d e f g h
| |
sequence B: b c h
( run in 1.646 second using v1.01-cache-2.11-cpan-94b05bcf43c )