Я создал инструмент выравнивания последовательностей для сравнения двух цепочек ДНК (X и Y), чтобы найти наилучшее выравнивание подстрок из X и Y. Алгоритм кратко изложен здесь (https://en.wikipedia.org)./wiki/Smith%E2%80%93Waterman_algorithm). Я смог создать списки списков, заполнив их нулями, чтобы представить мою матрицу. Я создал алгоритм подсчета очков, чтобы возвращать числовой балл для каждого типа выравнивания между базами (например, плюс 4 для совпадения). Затем я создал алгоритм выравнивания, который должен ставить оценку каждой координате моей матрицы. Однако, когда я иду печатать матрицу, она возвращает только оригинал со всеми нулями (а не фактические баллы).
Я знаю, что есть другие методы реализации этого метода (например, с помощью numpy), поэтому не могли бы вы сказать мне, почему этот конкретный код (ниже) не работает? Есть ли способ изменить его, чтобы он работал?
код:
def zeros(X: int, Y: int):
lenX = len(X) + 1
lenY = len(Y) + 1
matrix = []
for i in range(lenX):
matrix.append([0] * lenY)
def score(X, Y):
if X[n] == Y[m]: return 4
if X[n] == '-' or Y[m] == '-': return -4
else: return -2
def SmithWaterman(X, Y, score):
for n in range(1, len(X) + 1):
for m in range(1, len(Y) + 1):
align = matrix[n-1, m-1] + (score(X[n-1], Y[m-1]))
indelX = matrix[n-1, m] + (score(X[n-1], Y[m]))
indelY = matrix[n, m-1] + (score(X[n], Y[m-1]))
matrix[n, m] = max(align, indelX, indelY, 0)
print(matrix)
zeros("ACGT", "ACGT")
выход:
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]