【ROSALIND】【練Python,學(xué)生信】70 用質(zhì)譜結(jié)果匹配蛋白

如果第一次閱讀本系列文檔請先移步閱讀【ROSALIND】【練Python,學(xué)生信】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).
所給:一個正整數(shù)n、一組蛋白序列(編號為s1、s2……sn),以及一個多重集R(集合中的元素均為正數(shù),對應(yīng)于某未知蛋白的全譜)。
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能得到的最大重數(shù),以及得到最大重數(shù)的序列sk(如果有多個結(jié)果,返回一個即可)。
?
測試數(shù)據(jù)
4
GSDMQS
VWICN
IASWMQS
PVSMGAD
445.17838
115.02694
186.07931
314.13789
317.1198
215.09061
測試輸出
3
IASWMQS
?
生物學(xué)背景
? ? ? ? 在分析蛋白質(zhì)組學(xué)數(shù)據(jù)時,我們有很多蛋白質(zhì)數(shù)據(jù)庫作為參考。在拿到譜圖數(shù)據(jù)后,在這些數(shù)據(jù)庫中搜索具有高度相似譜的已知蛋白質(zhì),利用這種方式,可以在不同物種中鑒定出相似的蛋白,幫助我們研究蛋白質(zhì)的功能。
? ? ? ??在54?譜卷積與質(zhì)譜結(jié)果比較中,我們了解了譜卷積及其在衡量不同質(zhì)譜結(jié)果相似性中的作用。本題中我們想用這種思路從數(shù)據(jù)庫中比對出相似的蛋白,通過譜卷積,找到數(shù)據(jù)庫中各蛋白在偏移后與待測蛋白最多重合的數(shù)量,從而選擇出最相似的蛋白。
?
數(shù)學(xué)背景
? ? ? ??多重集的背景知識參考54?譜卷積與質(zhì)譜結(jié)果比較。
? ? ? ??序列的完全譜(complete spectrum)是包含序列所有前綴和后綴的多重集。
?
思路
? ? ? ??本題的代碼來自https://github.com/fedeoliv/Rosalind-Problems/blob/master/prsm.py。代碼寫得非常簡練,包含多個函數(shù),我們來以函數(shù)調(diào)用順序梳理一下思路。
? ? ? ??首先,在main函數(shù)部分,大佬將蛋白序列和多重集R作為參數(shù)傳入get_max_multiplicity函數(shù)中,可以看到,該函數(shù)返回的結(jié)果就是我們想要的最大重數(shù)和序列。
? ? ? ??在get_max_multiplicity函數(shù)中,蛋白序列被挨個取出來輸入get_substrings函數(shù)中,這個函數(shù)的作用是把序列所有的子串,其中含有yield,每次運行到y(tǒng)ield,該函數(shù)就會返回一個子串到get_max_multiplicity函數(shù)的p上,p又被傳入protein_weight函數(shù)。protein_weight函數(shù)的作用是計算每個子串的相對分子量,計算完成后,把結(jié)果又返回去,保存在列表pset中。然后繼續(xù)向下運行,從get_substrings上次返回的yield下面繼續(xù)運行,至又返回一個子串,如此實現(xiàn)循環(huán)。直到序列所有子串的相對分子質(zhì)量都被算出來。
? ? ? ??接下來,多重集R和子串的相對分子質(zhì)量都作為參數(shù)傳入get_largest_multiplicity函數(shù)中,這個函數(shù)的目的是將這兩個集合中所有可能的值取出來相減,保存在diff中,為了實現(xiàn)這個功能,還需要調(diào)用一個函數(shù)get_values,此函數(shù)調(diào)用了operator模塊中的方法,用兩個循環(huán)將兩個集合中所有的元素都做了相減運算。返回到get_largest_multiplicity函數(shù)中后,利用Counter函數(shù)統(tǒng)計每個元素出現(xiàn)的頻率,以字典的形式儲存。在返回結(jié)果時,只返回最大重數(shù)的結(jié)果和序列。
? ? ? ??運行完這些,我們又回到了get_max_multiplicity函數(shù)中,將返回的結(jié)果與此時output中保存的結(jié)果相比較,若重數(shù)大于或等于已有結(jié)果,就用新的結(jié)果覆蓋掉output中的內(nèi)容。等所有序列都過一遍后,輸出output中的結(jié)果,即為所求。
?
代碼