Thread needelman wunsch/smith waterman (34 answers)
Opened by Gast at 2006-03-09 15:01

lichtkind
 2006-03-14 15:32
#63712 #63712
User since
2004-03-22
5708 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
nochmal komplette Lösung mit berechnugnaller möglichen pfade.
daraus könnte man shcon fast ein modul machen (wenn nicht schon eins gäbe)
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
use strict;
use warnings;

my $xLength = my @xSeq = qw (A A G G C C T T);
my $yLength = my @ySeq = qw (A C G T A C T T);

my @LM;               
;          #### Längenmatrix
$LM[$_][0] = 0 for 0..$xLength; #### x-Achse mit 0 füllen ####
$LM[0][$_] = 0 for 0..$yLength; #### y-Achse mit 0 füllen ####


#### Längenmatrix berechnen ####
my $tauscher = 0;
for my $x (1..$xLength) {
    for my $y (1..$yLength) {
        if ($xSeq[$x-1] eq $ySeq[$y-1]) { $tauscher = $LM[$x-1][$y-1] + 2 }
        else               
             { $tauscher = $LM[$x-1][$y-1] - 1 }
        for ($LM[$x-1][$y]-1, $LM[$x][$y-1]-1, 0) {
            $tauscher = $_ if $_ > $tauscher
        }
        $LM[$x][$y] = $tauscher;
    }
}

#### höchsten Wert finden ####
my ($Hochw, $Hochx, $Hochy) = (0, 0, 0);
for my $x (0..$xLength) {
    for my $y (0..$yLength) {
        if ($Hochw < $LM[$x][$y]) {
            $Hochw = $LM[$x][$y];
            $Hochx = $x;
            $Hochy = $y;
        }
    }
}

#### Wegematrix berechnen ####
my @WM;               
;          #### Wegematrix
my @WStack = ([$Hochx, $Hochy]);#### Wegestack
my ($w, $x, $y, $z);
while (@WStack) {
    ($x, $y) = @{pop @WStack};
    next if $WM[$x][$y];
    $z = $LM[$x][$y];
    $w = 0;
    if  (    (( $z == $LM[$x-1][$y-1] + 2 ) or ( $z == $LM[$x-1][$y-1] - 1 ))
         and ($x > 1 and $y > 1)              &nbs

p;              &nbs

p;            ) {
        $w |= 1;
        push @WStack, [$x-1, $y-1];
    }
    if ( $z == $LM[$x-1][$y] - 1 ) {
        $w |= 2;
        push @WStack, [$x-1, $y];
    }
    if ( $z == $LM[$x][$y-1] - 1 ) {
        $w |= 4;
        push @WStack, [$x, $y-1];
    }
    $WM[$x][$y] = $w;
}

#### Optimalen Pfad (align) ####
($x, $y) = ($Hochx, $Hochy);
my @oPfad = ($xSeq[$x-1].$ySeq[$y-1]) ; 
while ($WM[$x][$y]) {
    $w = $WM[$x][$y];
    if    ($w & 0b001) { unshift @oPfad, $xSeq[--$x-1].$ySeq[--$y-1] }
    elsif ($w & 0b010) { unshift @oPfad, $xSeq[--$x-1]."-"           }
    elsif ($w & 0b100) { unshift @oPfad,           "-".$ySeq[--$y-1] }
}

#### allePfade ####
my (@allePfade, @CPfad, @abzw);    #### Pfade, aktueller Pfad(cursor), Abzweigungen
my @PQueue = ([$Hochx, $Hochy, $xSeq[$Hochx-1].$ySeq[$Hochy-1]]);
while (@PQueue) {
    ($x, $y, @CPfad) = @{shift @PQueue};
    while ($WM[$x][$y]){
        $w = $WM[$x][$y];
             @abzw = ();
        push @abzw, [$x-1, $y-1, $xSeq[$x-2].$ySeq[$y-2]] if $w & 0b001;
        push @abzw, [$x-1, $y  , $xSeq[$x-2]."-"        ] if $w & 0b010;
        push @abzw, [$x  , $y-1,         "-".$ySeq[$y-2]] if $w & 0b100;
        push @PQueue, [@{$abzw[$_]}, @CPfad ] for 1 .. $#abzw;
        unshift @CPfad, $abzw[0][2];
        ($x, $y) = @{$abzw[0]};
    }
    push @allePfade, [@CPfad];
}

# Ausgabe :
print <<EOP;

Zugrunde liegende Aehnlichkeitsmatrix:

  | A  C  G  T | -
------------------
A | 2 -1 -1 -1 |-1
C |-1  2 -1 -1 |-1
G |-1 -1  2 -1 |-1
T |-1 -1 -1  2 |-1
------------------
- |-1 -1 -1 -1 |-1
EOP

$" = "";
print "\n  @ySeq\n @{$LM[0]}\n";
print "$xSeq[$_-1]@{$LM[$_]}\n" for 1..$xLength;
print "\nHochwert: $Hochw\n\n";
$" = "|";
print "1 opt. Pfad: @oPfad\n\nAlle Pfade:\n\n";
print "@{@allePfade[$_]}\n" for 0..$#allePfade;
\n\n

<!--EDIT|lichtkind|1142343319-->
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.

View full thread needelman wunsch/smith waterman