最適ではないローカル シーケンス アラインメントを見つけるための Waterman-Eggert アルゴリズムを実装しようとしていますが、個々のグループのアラインメントを「デクランプ」する方法を理解するのに苦労しています。基本的な Smith-Waterman アルゴリズムが正常に動作しています。
次のシーケンスをそれ自体に対してアラインする簡単なテスト:
'HEAGHEAGHEAG'
'HEAGHEAGHEAG'
次のように fMatrix を生成します。
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 8. 0. 0. 0. 8. 0. 0. 0. 8. 0. 0. 0.]
[ 0. 0. 13. 0. 0. 0. 13. 0. 0. 0. 13. 0. 0.]
[ 0. 0. 0. 17. 0. 0. 0. 17. 0. 0. 0. 17. 0.]
[ 0. 0. 0. 0. 23. 0. 0. 0. 23. 0. 0. 0. 23.]
[ 0. 8. 0. 0. 0. 31. 0. 0. 0. 31. 0. 0. 0.]
[ 0. 0. 13. 0. 0. 0. 36. 0. 0. 0. 36. 0. 0.]
[ 0. 0. 0. 17. 0. 0. 0. 40. 0. 0. 0. 40. 0.]
[ 0. 0. 0. 0. 23. 0. 0. 0. 46. 0. 0. 0. 46.]
[ 0. 8. 0. 0. 0. 31. 0. 0. 0. 54. 4. 0. 0.]
[ 0. 0. 13. 0. 0. 0. 36. 0. 0. 4. 59. 9. 0.]
[ 0. 0. 0. 17. 0. 0. 0. 40. 0. 0. 9. 63. 13.]
[ 0. 0. 0. 0. 23. 0. 0. 0. 46. 0. 0. 13. 69.]]
次善のアラインメントを見つけるために、例えば
'HEAGHEAGHEAG '
' HEAGHEAGHEAG'
最初に最適な配置を削除し (つまり、主対角線に沿って)、fMatrix を再計算する必要があります。これは「デクランプ」として知られており、アラインメントの「クランプ」は、アラインメントされた残基の 1 つまたは複数のペアと交差/共有するパスを持つアラインメントとして定義されます。fMatrix に加えて、fMatrix が構築された方向に関する情報を含む二次マトリックスがあります。
fMatrix とバックトラッキング マトリックスを作成するコードのスニペットは次のとおりです。
# Generates fMatrix.
for i in range(1, length):
for j in range(1, length):
matchScore = fMatrix[i-1][j-1] + simMatrixDict[seq[i-1]+seq[j-1]]
insScore = fMatrix[i][j-1] + gap
delScore = fMatrix[i-1][j] + gap
fMatrix[i][j] = max(0, matchScore, insScore, delScore)
# Generates matrix for backtracking.
if fMatrix[i][j] == matchScore:
backMatrix[i][j] = 2
elif fMatrix[i][j] == insScore:
backMatrix[i][j] = 3 # INSERTION in seq - Horizontal
elif fMatrix[i][j] == delScore:
backMatrix[i][j] = 1 # DELETION in seq - Vertical
if fMatrix[i][j] >= backtrackStart:
backtrackStart = fMatrix[i][j]
endCoords = i, j
return fMatrix, backMatrix, endCoords
この最適な配置を削除するために、この backMatrix を使用して fMatrix をバックトラックし (元の Smith-Waterman アルゴリズムに従って)、設定fMatrix[i][j] = 0
を行ってみましたが、これは塊全体を削除するのではなく、その塊の正確な配置のみを削除します.
いくつかの背景情報については、Smith-Waterman アルゴリズムのウィキペディアのページで fMatrix の構築方法が説明されており、バックトラッキングのしくみについての説明がここにあります。Waterman-Eggert アルゴリズムについては、こちらで大まかに説明しています。
ありがとう。