【ROSALIND】【练Python,学生信】70 用质谱结果匹配蛋白

2023-05-10 15:13:30 来源:哔哩哔哩

如果第一次阅读本系列文档请先移步阅读【ROSALIND】【练Python,学生信】00 写在前面  谢谢配合~

题目:


(相关资料图)

用谱图匹配蛋白(Matching a Spectrum to a Protein)

Given: A positive integer n followed by a collection of n protein strings s1, s2, ..., sn and a multiset R of positive numbers (corresponding to the complete spectrum of some unknown protein string).

所给:一个正整数n、一组蛋白序列(编号为s1、s2……sn),以及一个多重集R(集合中的元素均为正数,对应于某未知蛋白的全谱)。

Return: The maximum multiplicity of R⊖S[sk] taken over all strings sk, followed by the string sk for which this maximum multiplicity occurs (you may output any such value if multiple solutions exist).

需得:在所有蛋白序列sk⊖R能得到的最大重数,以及得到最大重数的序列sk(如果有多个结果,返回一个即可)。

测试数据

4

GSDMQS

VWICN

IASWMQS

PVSMGAD

445.17838

115.02694

186.07931

314.13789

317.1198

215.09061

测试输出

3

IASWMQS

生物学背景

在分析蛋白质组学数据时,我们有很多蛋白质数据库作为参考。在拿到谱图数据后,在这些数据库中搜索具有高度相似谱的已知蛋白质,利用这种方式,可以在不同物种中鉴定出相似的蛋白,帮助我们研究蛋白质的功能。

在54 谱卷积与质谱结果比较中,我们了解了谱卷积及其在衡量不同质谱结果相似性中的作用。本题中我们想用这种思路从数据库中比对出相似的蛋白,通过谱卷积,找到数据库中各蛋白在偏移后与待测蛋白最多重合的数量,从而选择出最相似的蛋白。

数学背景

多重集的背景知识参考54 谱卷积与质谱结果比较。

序列的完全谱(complete spectrum)是包含序列所有前缀和后缀的多重集。

思路

本题的代码来自https://github.com/fedeoliv/Rosalind-Problems/blob/master/prsm.py。代码写得非常简练,包含多个函数,我们来以函数调用顺序梳理一下思路。

首先,在main函数部分,大佬将蛋白序列和多重集R作为参数传入get_max_multiplicity函数中,可以看到,该函数返回的结果就是我们想要的最大重数和序列。

在get_max_multiplicity函数中,蛋白序列被挨个取出来输入get_substrings函数中,这个函数的作用是把序列所有的子串,其中含有yield,每次运行到yield,该函数就会返回一个子串到get_max_multiplicity函数的p上,p又被传入protein_weight函数。protein_weight函数的作用是计算每个子串的相对分子量,计算完成后,把结果又返回去,保存在列表pset中。然后继续向下运行,从get_substrings上次返回的yield下面继续运行,至又返回一个子串,如此实现循环。直到序列所有子串的相对分子质量都被算出来。

接下来,多重集R和子串的相对分子质量都作为参数传入get_largest_multiplicity函数中,这个函数的目的是将这两个集合中所有可能的值取出来相减,保存在diff中,为了实现这个功能,还需要调用一个函数get_values,此函数调用了operator模块中的方法,用两个循环将两个集合中所有的元素都做了相减运算。返回到get_largest_multiplicity函数中后,利用Counter函数统计每个元素出现的频率,以字典的形式储存。在返回结果时,只返回最大重数的结果和序列。

运行完这些,我们又回到了get_max_multiplicity函数中,将返回的结果与此时output中保存的结果相比较,若重数大于或等于已有结果,就用新的结果覆盖掉output中的内容。等所有序列都过一遍后,输出output中的结果,即为所求。

代码

关键词

最近更新