2013-08-07 6 views
8

Ich versuche, den Smith-Waterman-Algorithmus für die lokale Sequenzausrichtung mit der affinen Gap Penalty-Funktion zu implementieren. Ich denke, ich verstehe, wie man die Matrizen einleitet und berechnet, die für die Berechnung der Ausrichtungswerte benötigt werden, aber ich weiß nicht, wie ich dann zurückverfolgen soll, um die Ausrichtung zu finden. Zur Erzeugung der drei Matrizen erforderlich Ich habe den folgenden CodeTraceback im Smith-Wateman-Algorithmus mit affiner Gap-Strafe

for j in range(1, len2): 
    for i in range(1, len1): 
     fxOpen = F[i][j-1] + gap 
     xExtend = Ix[i][j-1] + extend 
     Ix[i][j] = max(fxOpen, xExtend) 

     fyOpen = F[i-1][j] + gap 
     yExtend = Iy[i-1][j] + extend 
     Iy[i][j] = max(fyOpen, yExtend) 

     matchScore = (F[i-1][j-1] + simMatrixDict[seq1[i-1]+seq2[j-1]]) 
     xScore = Ix[i-1][j-1] + simMatrixDict[seq1[i-1]+seq2[j-1]] 
     yScore = Iy[i-1][j-1] + simMatrixDict[seq1[i-1]+seq2[j-1]] 
     F[i][j] = max(0, matchScore, xScore, yScore) 

Ich bin nicht sicher, ob ich eine einzelne Matrix für Zurückverfolgungs benötigen oder nur 1? Jede Klärung darüber, wie man von der Höchstpunktzahl in F zurückgeht, würde sehr geschätzt werden.

+0

Versuchen Sie, den Algorithmus nur als Übung zu implementieren? Sie können Python-Implementierungen online finden. Beispiele: [1] (https://github.com/alevchuk/pairwise-alignment-in-python), [two] (https://pypi.python.org/pypi/swalign/0.2), [three] (https://github.com/kevinakwok/bioinfo/tree/master/Smith-Waterman), [vier] (http://forrestbao.blogspot.com/2007/09/smith-waterman-algorithm-in-process.html). –

+1

danke für die Antwort, aber nur einer von diesen (zwei) enthält die affine Gap Penalty-Funktion, die ich wirklich bin. Leider liegt der Code darin ein wenig über mir, erst seit ein paar Monaten. – jonwells

Antwort

4

Die wichtige Sache, die man sich bei Traceback in Smith-Waterman merken sollte, ist, dass die Matrix, in der sich ein Wert befindet, die Richtung bestimmt, in die man sich bewegt. Also, wenn Sie in F sind Sie diagonal bewegen, wenn Sie in Ix sind, bewegen Sie sich horizontal, und wenn Sie in Iy sind, bewegen Sie sich vertikal. Das bedeutet, dass Sie in der Zeigermatrix nur die Matrix speichern müssen, von der Sie ein Quadrat erreicht haben. Die Matrix, aus der du kommst, nicht die, zu der du gehst, bestimmt die Richtung, die du gehen sollst.

Zum Beispiel:

Sagen Sie sind bei F[5][5]:

  • Wenn Zeiger Matrix Ix zu gehen, sagt, gehen Sie zu Ix[4][4]
  • Wenn Zeiger Matrix Iy zu gehen, sagt, gehen zu Iy[4][4]
  • Wenn Zeiger Matrix sagt zu F gehen, gehen Sie zu F[4][4]

Während, wenn Sie bei Ix[5][5] sind:

  • Wenn Zeiger Matrix sagt Ix zu gehen, gehen Sie zu Ix[4][5]
  • Wenn Zeiger Matrix F zu gehen, sagt, gehen Sie zu F[4][5]

Oder wenn Sie unter Iy[5][5] sind:

  • Wenn pointer Matrix Iy gehen sagt, gehen Iy[5][4]
  • Wenn Zeiger Matrix sagt F zu gehen, gehen zu F[5][4]

Unter der Annahme, dass der erste Index ist die x-Koordinate und die zweite ist, die y-Koordinate.

Tracing weiter zurück, bis Sie eine Zelle mit einem Maximalwert von 0.

Aufbau der Zeiger Matrix erreichen: Sie benötigen einen Zeiger Matrix jeweils für F, Ix und Iy. Diese Matrizen müssen nur angeben, aus welcher Matrix ein Wert stammt, da dies Ihnen anzeigt, in welche Richtung Sie sich bewegten.Wenn Sie also die dynamische Programmierungsphase des Algorithmus durchlaufen, sollten Sie auch die Zeigermatrizen aufbauen. Jedes Mal, wenn Sie einen neuen Maximalwert in einer Zelle in F, Ix oder Iy speichern, sollten Sie die entsprechende Matrix aktualisieren, um anzugeben, wo sie herkommt. Wenn zum Beispiel der höchste Wert, den Sie in F[5][5] haben können, durch das Ausrichten der beiden nächsten Basen kommt, wenn Sie sich in F[4][4] befinden, sollte der Fpointer [5] [5] auf F eingestellt werden, da Sie von der F Matrix dorthin gekommen sind.

+0

vielen Dank für die schnelle Antwort, aber ich kämpfe mit dem Erstellen der Zeigermatrix. Es scheint, dass die drei Score-Matrizen unabhängig voneinander aufgebaut sind, also kann ich nicht sehen, wie Sie entscheiden würden, wann Sie von einem zum anderen wechseln sollen. Vermutlich müßten Sie nach links, oben, diagonal und dann auf zusätzliche Zeiger zeigen, auf welche Matrix Sie zu gehen haben? – jonwells

+1

Okay, ich habe meine Antwort bearbeitet, um weitere Informationen dazu zu erhalten. Grundsätzlich benötigen Sie für jede Ihrer drei Matrizen eine andere Zeigermatrix, aber Sie müssen nur die Matrix aufzeichnen, von der Sie gekommen sind, als Sie den höchsten Wert in dieser Zelle erhalten haben, da Sie damit alles über die Bewegungsrichtung wissen müssen . Da Sie nach Traceback fragen, gehe ich davon aus, dass Sie bereits mit dynamischer Programmierung arbeiten, damit Sie in jeder Zelle den bestmöglichen Wert finden. Das Einrichten der Zeigermatrix ist nur eine Frage des Verfolgens, wie Sie diesen Wert erhalten haben. – seaotternerd

+0

Ich bin hier immer noch im Zweifel. Wenn Sie Zeit haben, können Sie bitte, wenn auch im Pseudocode, zeigen, warum drei Matrizen notwendig sind? Die Art und Weise, wie ich das dachte, war so: Der Traceback würde einfach Anweisungen speichern. Ich verstehe nicht wirklich, warum wir beim Zurückverfolgen zu anderen Matrizen springen müssen. In DP speichern wir die Richtung, aus der dieser Wert stammt, also folgen wir ihm (DIAG, LEFT oder UP). Wenn der Maximalwert von x, y von F kommt, ist es DIAG, wenn von Ix, LINKS, und so weiter. Ich sage nicht, dass das richtig ist - ich bin nur verwirrt :) Wie kann ich retten, woher ich kam und wo ich bin? – francisaugusto

Verwandte Themen