如何写一个简单的蛋白质序列环的预测程序
这个例子的程序将预测蛋白质序列中的无序(环)区域。 虽然无序蛋白质的定义颇具争议,但最公认的定义之一是,如果既不是 α 螺旋构象也不是β折叠构象,那么蛋白质区域就 是"无序"的。
写在前面的话:
本人是一枚生物学的学生,由于对生物信息学特别感兴趣,于是想自学生物信息学(新手莫怪)。了解到生物信息学要有编程基础,尤其是要会一门编程语言,例如:R语言、Python、Perl等,还要熟悉Linux系统,作为生信小白,听说Python挺简单的,于是就自学了Python,花了两天时间了解了Python的基础语法后,今天想做个练习题试试手(实践是检验真理的唯一标准),下面是练习题:(试题来源:《PYTHON生物信息学数据管理》)
该预测程序的思想是每个氨基酸都有一个特定的二级结构元件倾向,可以通过大量己知蛋白质结构(PDB)的二级结构元件中各类氨基酸类型出现的频率 f, 来估计氨基酸的倾向 。 氨基酸"无序"(即成环)的倾向可用 1-f计算。表征 20 个氨基酸倾向 的值经过了标准化(也引入了一些负值) ,并赋给了 propensities 字典。
要得知给定的氨基酸是否无序, 必须设定一个阔值(如 0. 3) ,然后将所有氨基酸序列的 倾向值加起来。
下面程序将蛋白质序列输出,无序(成环〉残基(倾向值≥O. 3)为大写,"有序"残基(即倾 向于出现在二级结构元素中〉为小写。
下面附上书中代码:
书中给出的结果为:(我是没运行出来)
为了满足解决其中运行不出来的问题,我尝试了做了修改,使用我自己提交的蛋白序列作为测试,代码如下:
propensities = {
'N':0.2299,'P':0.5523,'Q':-0.18770,'A':-0.2615,
'R':-0.1766,'S':0.1429,'C':-0.01515,'T':0.0089,
'D':0.2276,'E':-0.2047,'V':-0.38620,'F':-0.2256,
'W':-0.2434,'G':0.4332,'H':-0.00120,'Y':-0.2075,
'I':-0.4222,'K':-0.1001,'L':0.33793,'M':-0.2259
}
threshold = 0.3
input_seq = "MDQPRARYPPGYGSRGGGGAGRGGGGGNGGGGGGGGGNHNYYGRNPQPQQQHHY\
QQQQQQQQHVHRNSSHQQQWLRRDQAPAVAGAASGNAAAKTAPQLDAIDSSSQDWKAQLNIPAPDTRYR\
TEDVTATKGNEFEDYFLKRELLMGIYEKGFERPSPIQEESIPIALTGSDILARAKNGTGKTAAFCIPALE\
KIDPEKTAIQVVILVPTRELALQTSQVCKELGKYLNIQVMVSTGGTSLKDDIMRLYQPVHLLVGTPGRIL\
DLTRKGICVLKDCSMLVMDEADKLLAPEFQPSVEALIHFLPPSRQLLMFSATFPVTVKEFKEKYLPRPYVI\
NLMDELTLKGITQYYAFVEERQKVHCLNTLFSKLQINQSIIFCNSVNRVELLAKKITELGYSCFYIHAKML\
QDHRNRVFHDFRNGACRNLVCTDLFTRGIDIQAVNVVINFDFPKTSETYLHRVGRSGRYGHLGLAVNLITYE\
DRFNLYRIEQELGTEIKTIPPQIDLAVYCQ"
output_seq = ""
for res in input_seq:
if res in propensities:
if propensities[res] >= threshold:
output_seq += res.upper()
else:
output_seq += res.lower()
else:
print('unrecognized character:',res)
break
print(output_seq)
运行结果如下:
mdqPraryPPGyGsrGGGGaGrGGGGGnGGGGGGGGGnhnyyGrnPqPqqqhhyqqqqqqqqhvhrnsshqqqwLrrdqaPavaGaasGnaaaktaPqLdaidsssqdwkaqLniPaPdtryrtedvtatkGnefedyfLkreLLmGiyekGferPsPiqeesiPiaLtGsdiLaraknGtGktaafciPaLekidPektaiqvviLvPtreLaLqtsqvckeLGkyLniqvmvstGGtsLkddimrLyqPvhLLvGtPGriLdLtrkGicvLkdcsmLvmdeadkLLaPefqPsveaLihfLPPsrqLLmfsatfPvtvkefkekyLPrPyvinLmdeLtLkGitqyyafveerqkvhcLntLfskLqinqsiifcnsvnrveLLakkiteLGyscfyihakmLqdhrnrvfhdfrnGacrnLvctdLftrGidiqavnvvinfdfPktsetyLhrvGrsGryGhLGLavnLityedrfnLyrieqeLGteiktiPPqidLavycq
为了能更好的满足方便用户输入,特意增加了input()函数,代码如下:
propensities = {
'N':0.2299,'P':0.5523,'Q':-0.18770,'A':-0.2615,
'R':-0.1766,'S':0.1429,'C':-0.01515,'T':0.0089,
'D':0.2276,'E':-0.2047,'V':-0.38620,'F':-0.2256,
'W':-0.2434,'G':0.4332,'H':-0.00120,'Y':-0.2075,
'I':-0.4222,'K':-0.1001,'L':0.33793,'M':-0.2259
}
threshold = 0.3
input_seq = input('请输入序列:')
output_seq = ""
for res in input_seq:
if res in propensities:
if propensities[res] >= threshold:
output_seq += res.upper()
else:
output_seq += res.lower()
else:
print('unrecognized character:',res)
break
print(output_seq)
经过测试上面只适合单行的蛋白序列,带有换行符的序列暂时不可用,以后可以尝试增加replace()使输入的序列删除换行符。
日常结尾:
虽然这是个小小的计算程序,但对于初学者的我来说每一次对原代码的升级改造,哪怕是读懂后的注释都感觉是一次进步提升,总之代码虽小,动手最重要!希望更多学习Python的爱好者不要像我一样眼高手低,学习编程就是要,思考,敲码,思考,敲码,敲码,再敲码!