生物信息学:任选一种编程语言,设计一个双序列全局比对的程序
程序员文章站
2022-03-11 21:41:13
...
任选一种编程语言,设计一个双序列全局比对的程序。要求:
1) 输入两条蛋白质序列,输出比对结果例如:
Alignment Score: 12345
E E E E E K K K K K A A A A A F F F
E E E E E - - - - - B B B B B F F F
2) 使用BLOSUM62矩阵来对序列中氨基酸符号的match和mismatch打分。
3) 使用动态规划的方法(Needleman-Wunsch算法)。
4) 计算空位(gap)的罚分时,使用仿射空位罚分策略,gap opening的分数为-11,gap extension的分数为-1。
5) 测试程序时,使用Horse Hemoglobin subunit theta-1(马的theta-1亚基血红蛋白)序列和Bullfrog Hemoglobin subunit alpha-type(牛蛙的alpha型亚基血红蛋白)序列。
6) 将程序输出结果与BLAST软件的进行比较。
登录BLAST在线服务器http://blast.ncbi.nlm.nih.gov/Blast.cgi。
代码如下:
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 = [
[ 4, -1, -2, -2, 0, -1, -1, 0, -2, -1, -1, -1, -1, -2, -1, 1, 0, -3, -2, 0, -2, -1, 0, -4],
[-1, 5, 0, -2, -3, 1, 0, -2, 0, -3, -2, 2, -1, -3, -2, -1, -1, -3, -2, -3, -1, 0, -1, -4],
[-2, 0, 6, 1, -3, 0, 0, 0, 1, -3, -3, 0, -2, -3, -2, 1, 0, -4, -2, -3, 3, 0, -1, -4],
[-2, -2, 1, 6, -3, 0, 2, -1, -1, -3, -4, -1, -3, -3, -1, 0, -1, -4, -3, -3, 4, 1, -1, -4],
[ 0, -3, -3, -3, 9, -3, -4, -3, -3, -1, -1, -3, -1, -2, -3, -1, -1, -2, -2, -1, -3, -3, -2, -4],
[-1, 1, 0, 0, -3, 5, 2, -2, 0, -3, -2, 1, 0, -3, -1, 0, -1, -2, -1, -2, 0, 3, -1, -4],
[-1, 0, 0, 2, -4, 2, 5, -2, 0, -3, -3, 1, -2, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],
[ 0, -2, 0, -1, -3, -2, -2, 6, -2, -4, -4, -2, -3, -3, -2, 0, -2, -2, -3, -3, -1, -2, -1, -4],
[-2, 0, 1, -1, -3, 0, 0, -2, 8, -3, -3, -1, -2, -1, -2, -1, -2, -2, 2, -3, 0, 0, -1, -4],
[-1, -3, -3, -3, -1, -3, -3, -4, -3, 4, 2, -3, 1, 0, -3, -2, -1, -3, -1, 3, -3, -3, -1, -4],
[-1, -2, -3, -4, -1, -2, -3, -4, -3, 2, 4, -2, 2, 0, -3, -2, -1, -2, -1, 1, -4, -3, -1, -4],
[-1, 2, 0, -1, -3, 1, 1, -2, -1, -3, -2, 5, -1, -3, -1, 0, -1, -3, -2, -2, 0, 1, -1, -4],
[-1, -1, -2, -3, -1, 0, -2, -3, -2, 1, 2, -1, 5, 0, -2, -1, -1, -1, -1, 1, -3, -1, -1, -4],
[-2, -3, -3, -3, -2, -3, -3, -3, -1, 0, 0, -3, 0, 6, -4, -2, -2, 1, 3, -1, -3, -3, -1, -4],
[-1, -2, -2, -1, -3, -1, -1, -2, -2, -3, -3, -1, -2, -4, 7, -1, -1, -4, -3, -2, -2, -1, -2, -4],
[ 1, -1, 1, 0, -1, 0, 0, 0, -1, -2, -2, 0, -1, -2, -1, 4, 1, -3, -2, -2, 0, 0, 0, -4],
[ 0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -2, -1, 1, 5, -2, -2, 0, -1, -1, 0, -4],
[-3, -3, -4, -4, -2, -2, -3, -2, -2, -3, -2, -3, -1, 1, -4, -3, -2, 11, 2, -3, -4, -3, -2, -4],
[-2, -2, -2, -3, -2, -1, -2, -3, 2, -1, -1, -2, -1, 3, -3, -2, -2, 2, 7, -1, -3, -2, -1, -4],
[ 0, -3, -3, -3, -1, -2, -2, -3, -3, 3, 1, -2, 1, -1, -2, -2, 0, -3, -1, 4, -3, -2, -1, -4],
[-2, -1, 3, 4, -3, 0, 1, -1, 0, -3, -4, 0, -3, -3, -2, 0, -1, -4, -3, -3, 4, 1, -1, -4],
[-1, 0, 0, 1, -3, 3, 4, -2, 0, -3, -3, 1, -1, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],
[ 0, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 0, 0, -2, -1, -1, -1, -1, -1, -4],
[-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 1],
]
#return match or mismatch score
def _match(s, t, i, j):
index1=amino.index(t[i-1])
index2=amino.index(s[j-1])
return blosum[index1][index2]
#initializers for matrices
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
#abuse list comprehensions to create matrices
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)
上一篇: Tomcat7 中文名称图片显示不了