题目背景:
-
蛋白质质谱分析:这是一种用来确定蛋白质或多肽序列的方法。简化地说,它通过测量蛋白质分子在特定切割点被切割后产生的小片段(离子)的质量来工作。
-
b离子和y离子:当蛋白质被切割时,会产生两种类型的离子:b离子和y离子。b离子包含蛋白质的起始部分,而y离子包含末尾部分。这两种离子的质量之和等于原始蛋白质的质量。
-
问题的核心:给定一串由b离子和y离子的质量组成的列表,需要推断出蛋白质P内部的一段序列(记作t)。这里的关键是找到t的前缀(t-prefix)和后缀(t-suffix),这些前缀和后缀的质量加上某个常数(分别是w1和w2)会出现在给定的列表中。
分析:
第一行是总质量,下面的每行是离子们的数量,每两个离子可以组合成一个蛋白质。但是组合的离子我们并不知道谁是b离子和y离子。然后每个b离子之间的质量差距就是一个氨基酸,直接遍历。
代码:
# 直接使用字典存储蛋白质质量数据
mass_table = {
'A': 71.03711,
'C': 103.00919,
'D': 115.02694,
'E': 129.04259,
'F': 147.06841,
'G': 57.02146,
'H': 137.05891,
'I': 113.08406,
'K': 128.09496,
'L': 113.08406,
'M': 131.04049,
'N': 114.04293,
'P': 97.05276,
'Q': 128.05858,
'R': 156.10111,
'S': 87.03203,
'T': 101.04768,
'V': 99.06841,
'W': 186.07931,
'Y': 163.06333
}
# 读取质谱数据
spectrum_data = 'D:/pycharm/Rosalind/Data/such.txt'
with open(spectrum_data) as spectrum_file:
total_mass = float(spectrum_file.readline().strip())
ions = [float(line.strip()) for line in spectrum_file]
# 推断蛋白质序列长度
n = (len(ions) - 2) // 2
sequence = ''
current_mass = ions[0]
for _ in range(n):
found = False
for ion_mass in ions[1:]:
diff = ion_mass - current_mass
for amino_acid, amino_acid_mass in mass_table.items():
if abs(diff - amino_acid_mass) < 0.001:
sequence += amino_acid
current_mass += amino_acid_mass
found = True
break
if found:
break
if not found:
sequence += '?'
break
print(sequence)