请将文档中的代码整合成可运行的形式
时间: 2024-10-07 19:01:46 浏览: 10
以下是文档中的代码整理:
```python
global S
global E
global MIN
global amino
global blosum
S = -11
E = -1
MIN = -float("inf")
amino = ['A', 'R', 'N', 'D', 'C', 'Q', 'E', 'G', 'H', 'I', 'L', 'K', 'M', 'F', 'P', 'S', 'T', 'W', 'Y', 'V', 'B', 'Z', 'X', '*']
blosum = [
# blosum 表数据省略,按照原文初始化...
]
def _match(s, t, i, j):
index1 = amino.index(t[i-1])
index2 = amino.index(s[j-1])
return blosum[index1][index2]
def _init_x(i, j):
if i > 0 and j == 0:
return MIN
else:
if j > 0:
return S + E * j
else:
return 0
def _init_y(i, j):
if j > 0 and i == 0:
return MIN
else:
if i > 0:
return S + E * i
else:
return 0
def _init_m(i, j):
if j == 0 and i == 0:
return 0
else:
if j == 0 or i == 0:
return MIN
else:
return 0
def distance_matrix(s, t):
dim_i = len(t) + 1
dim_j = len(s) + 1
X = [[_init_x(i, j) for j in range(0, dim_j)] for i in range(0, dim_i)]
Y = [[_init_y(i, j) for j in range(0, dim_j)] for i in range(0, dim_i)]
M = [[_init_m(i, j) for j in range(0, dim_j)] for i in range(0, dim_i)]
for j in range(1, dim_j):
for i in range(1, dim_i):
X[i][j] = max(S + E + M[i][j-1], E + X[i][j-1])
Y[i][j] = max(S + E + M[i-1][j], E + Y[i-1][j])
M[i][j] = max(_match(s, t, i, j) + M[i-1][j-1], X[i][j], Y[i][j])
return [X, Y, M]
def backtrace(s, t, X, Y, M):
sequ1 = ''
sequ2 = ''
i = len(t)
j = len(s)
while (i > 0 or j > 0):
if (i > 0 and j > 0 and M[i][j] == M[i-1][j-1] + _match(s, t, i, j)):
sequ1 += s[j-1]
sequ2 += t[i-1]
i -= 1
j -= 1
elif (i > 0 and M[i][j] == Y[i][j]):
sequ1 += '_'
sequ2 += t[i-1]
i -= 1
elif (j > 0 and M[i][j] == X[i][j]):
sequ1 += s[j-1]
sequ2 += '_'
j -= 1
sequ1r = ''.join([sequ1[j] for j in range(-1, -(len(sequ1)+1), -1)])
sequ2r = ''.join([sequ2[j] for j in range(-1, -(len(sequ2)+1), -1)])
return [sequ1r, sequ2r]
seq1 = input("Please input long sequence:")
seq2 = input("Please input short sequence:")
[X, Y, M] = distance_matrix(seq1, seq2)
[str1, str2] = backtrace(seq1, seq2, X, Y, M)
score = M[len(seq2)][len(seq1)]
print("Alignment Score:", str(score))
print(str1)
print(str2)
```
注意:上述代码中的`blosum`变量需要完整的赋值,请参照原始文档中的具体数值填充进来。这段代码实现了基于Needleman-Wunsch算法的全局比对,并且考虑了空位(gap)的罚分策略,使用的是仿射空位罚分。