Мне нужна помощь с оценкой моей матрицы Смита-Уотермана. Локальное выравнивание, которое оно производит, начинается и заканчивается в нужных точках, но промежутки смещаются на единицу в нижней последовательности. Максимальная оценка также неверна, но всегда очень близка к правильной.
def calcScore(self, row, col):
seqA_letter = self.seqA[col-1]
seqA_sm_index = self.sm.indexOfProtein(seqA_letter)
seqB_letter = self.seqB[row-1]
seqB_sm_index = self.sm.indexOfProtein(seqB_letter)
scoreObjects = [Score(0, -1, -1, -1, -1)]
matchMismatchScore = self.allignment_matrix[row-1][col-1].value + self.sm.matrix[seqA_sm_index][seqB_sm_index]
scoreObjects.append(Score(matchMismatchScore, row, col, row-1, col-1))
counter = 1
gap = 0
for back in range(col, 1, -1):
#gaps in vertical sequence
s = self.allignment_matrix[row][col-counter].value - (self.gap_penalty_opening + gap * self.gap_penalty_extension)
scoreObjects.append(Score(s, row, col, row, col-counter))
counter += 1
gap += 1
counter = 1
gap = 0
for back in range(row, 1, -1):
s = self.allignment_matrix[row-counter][col].value - (self.gap_penalty_opening + gap * self.gap_penalty_extension)
scoreObjects.append(Score(s, row, col, row-counter, col))
counter += 1
gap += 1
return max(scoreObjects, key=operator.attrgetter('value'))
Я использую объекты Оценка, чтобы заполнить матрицу, так как я могу запомнить источник каждой оценки. Я знаю, что вы не можете проходить источники линейно, так как там, где есть большие разрывы, источники оценки также будут иметь разрывы, но я учел это. Я подозреваю, что ошибка в циклах for для нахождения / вычисления того, сколько пробелов дает наивысший результат, но не могу понять, что. Заранее спасибо.