如果第一次阅读本系列文档请先移步阅读【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中的结果,即为所求。
代码
Copyright @ 2008-2015 www.7015.cn All Rights Reserved 理财日报 版权所有
联系网站:licairibao@sina1.com.cn 违法信息举报邮箱:3 392 950@qq.com
备案号: 豫ICP备2020035879号-14