蛋白质合成过程中,核糖体蛋白和密码子与反密码子对在核糖体的 P 位和 A 位上形成的空间结构影响了翻译的精确性和速率,而这种空间结构的稳定性是影响密码对使用偏好性的主要原因。详细内容具体可以参考下西北农林科技大学2011赵胜博士毕业论文《478种生物的密码对使用偏好性及其与翻译效率的相关性研究》。
本文旨在通过大肠杆菌的CDS获取其codon pair并进行频次以及编码氨基酸的归类,然后通过循环算法查找可替换的高频codon pair。本文算法可批量获得多条序列的多个codon pair的修改。根据本文的数据来源和结果整理,其密码子频率和文献中报道的数据基本一致,这说明了本文采用的数据具有高度的可靠性。该codon pair的替换使用有了坚实的理论基础。
规模化发酵,想要提高蛋白的表达量,需要从筛选高表达的菌株和表达载体、目标基因在质粒上的转录效率、mRNA二级结构稳定性(发卡结构、GC含量、吉布斯自由能)、核糖体与mRNA的结合和起始效率、重复序列,密码子偏好性,串联稀有密码子等等所有影响蛋白翻译过程考虑,其中串联稀有密码子跟codon pair理念有点类似,但不完全相同。condon pair应该说是影响蛋白表达的最后一个环节,如何快速的找到低频codon pair以及完成替换对生产和研究是非常有意义的工作。
一、从大肠杆菌的CDS获取code pair,并根据所编码的氨基酸对其核苷酸序列进行频次统计和归类
import pandas as pd
import numpy as np
from itertools import combinations
from tqdm import tqdm
from collections import Counter
features = pd.read_csv('/home/lxh/Documents/Lysin/mimazi.csv')
sum2_mat = np.array(features.iloc[0:32,:])
list = sum2_mat.tolist()
list1 = {}
for a in list:
list1.update({a[0]:a[1]})
list1.update({a[5]:a[6]})
f = open(r"/home/lxh/Documents/Lysin/大肠杆菌蛋白/Escherichia coli _gene_result.txt","r")
seq = [(a.replace("\n","").split("(")[0].split()[1],a.replace("\n","").split("(")[1].split(",")[0].split("..")) for a in f.readlines() if "Annotation:" in a]
f.close()
NC = []
for a in seq:
if a[0] not in NC:
NC.append(a[0])
DNA = []
protein = []
for aa in tqdm(NC):
bb = ""
f1 = open(f"/home/lxh/Documents/Lysin/大肠杆菌蛋白/{aa}_DNA.txt","r")
for a in f1.readlines():
if a[0] != ">":
bb += a.replace("\n","")
else:
DNA.append(bb)
protein1 = ''.join([list1[bb[r:r + 3]] for r in range(0,(len(bb) -2),3)])
protein.append(protein1)
bb = ""
f1.close()
num2 = []
num3 = []
for a in DNA:
num = [a[r:r + 6] for r in range(0,len(a) - 5,3)]
num3 += num
len(num3)
for a in protein:
num1 = [a[r:r + 2] for r in range(len(a) - 1)]
num2 += num1
num4 = []
for a in num2:
if a not in num4:
num4.append(a)
PP = {}
for a in tqdm(num4):
seq2 = []
for b in range(len(num2)):
if a == num2[b]:
seq2.append(num3[b])
PP.update({a:dict(sorted(dict(Counter(seq2)).items(),reverse = True,key=lambda item: item[1]))})
f = open("/home/lxh/Documents/Lysin/序列优化/密码子对codon-pair统计.txt","w")
for a in PP:
f.write(str(a) + " " + str(PP[a]) + "\n")
f.close()
二、计算每条优化序列中codon pair的频次并找到序列中低频的codon pair
f = open("/home/lxh/Documents/Lysin/序列优化/密码子对codon-pair统计.txt","r")
PP = {}
for a in f.readlines():
aa = a.replace("{","")
bb = aa.replace("}\n","")
cc = bb.replace(":","")
dd = cc.replace(",","")
ee = dd.replace("'","").split()
redict = {}
for b in range(int(len(ee[1:]) / 2)):
redict.update({ee[1:][2 * b]:int(ee[1:][2 * b + 1])})
PP.update({ee[0]:redict})
f.close()
seq1 = []
f = open(r"/home/lxh/Documents/Lysin/优化序列.txt","r")
seq1name = []
for a in f.readlines():
if (a[0] not in ['\n']) & (a[0] == ">"):
seq1name.append(a.replace("\n",""))
elif (a[0] not in ['\n']):
seq1.append(a.replace("\n",""))
f.close()
countnum = 200
f = open("/home/lxh/Documents/Lysin/序列优化/密码子对codon-pair统计_GS4_W99Y.txt","w")
i = -1
recorrect = {}
for a in seq1:
recorrect1 = []
i += 1
num = [a[r:r + 6] for r in range(0,len(a) - 5,3)]
print(seq1name[i])
f.write(seq1name[i] + "\n")
j = -1
for b in num:
j += 1
for x in PP.values():
if b in x.keys():
#print(3 * j + 1,"-",3 * j + 6,b,":",x[b],(max(x.values()),min(x.values())))
f.write(str(3 * j + 1) + "-" + str(3 * j + 6) + " " + b + " " + str(x[b]) + " " + str(max(x.values())) + " " + str(min(x.values())) + "\n")
if x[b] < countnum:
recorrect1.append((num[j -1],str(3 * j + 1) + "-" + str(3 * j + 6) + ": " + b,num[j + 1]))
recorrect.update({seq1name[i]:recorrect1})
f.close()
三、将低频的code pair进行替换
val = []
for x in list1.values():
if x not in val:
val.append(x)
sum = {}
for a in val:
sum1 = []
for b in list1:
if list1[b] == a:
sum1.append(b)
sum.update({a:sum1})
sum3 = []
for a in recorrect:
sum2 = []
for b in recorrect[a]:
c = b[1].split(": ")
for x in PP.values():
if c[1] in x.keys():
d = sum[list1[c[1][0:3]]]
sum1 = []
for e in d:
if (e + c[1][3:] in x.keys()):
if (x[e + c[1][3:]] > countnum):
for y in PP.values():
if (b[0][0:3] + e in y.keys()):
if (y[b[0][0:3] + e] > countnum):
sum1.append(({b[0][0:3] + e:y[b[0][0:3] + e],c[0] + f"({c[1]}:{x[c[1]]})" + ":" + e + c[1][3:]:x[e + c[1][3:]]}))
if sum1 == []:
for e in d:
if (c[1][0:3] + e in x.keys()):
if (x[c[1][0:3] + e] > countnum):
for y in PP.values():
if (e + b[0][3:] in y.keys()):
if (y[e + b[0][3:]] > countnum):
sum1.append(({c[0] + f"({c[1]}:{x[c[1]]})" + ":" + c[1][0:3] + e:x[c[1][0:3] + e],e + b[0][3:]:y[e + b[0][3:]]}))
if sum1 == []:
for f in x.keys():
if (f[0:3] != c[1][0:3]):
if (f[3:] != c[1][3:]):
if x[f] > countnum:
for y in PP.values():
if (b[0][0:3] + f[3:] in y.keys()):
if (y[b[0][0:3] + f[3:]] > countnum):
for z in PP.values():
if (f[0:3] + c[1][3:] in z.keys()):
if (z[f[0:3] + c[1][3:]] > countnum):
sum1.append(({b[0][0:3] + f[3:]:y[b[0][0:3] + f[3:]],c[0] + f"({c[1]}:{x[c[1]]})" + ":" + f:x[f],f[0:3] + c[1][3:]:z[f[0:3] + c[1][3:]]}))
sum2.append(sum1)
else:
sum2.append(sum1)
else:
sum2.append(sum1)
sum3.append(sum2)
四、统计结果
1.大肠杆菌codon pair频次的部分统计结果如下:
MK {'ATGAAA': 2957, 'ATGAAG': 1237}
KR {'AAACGC': 2160, 'AAACGT': 1709, 'AAGCGT': 903, 'AAGCGC': 899, 'AAACGG': 547, 'AAACGA': 335, 'AAAAGA': 318, 'AAGCGG': 315, 'AAGCGA': 269, 'AAAAGG': 135, 'AAGAGA': 96, 'AAGAGG': 39}
2.所要优化序列的codon pair频次部分结果呈现如下:
>E.coil
1-6 ATGTCC 622 1531 622
4-9 TCCCGT 594 1184 8
7-12 CGTTTT 2061 2061 26
10-15 TTTGTC 1734 1734 231
上述1-6表示核苷酸的位置,后面紧跟该位置的核苷酸序列、该位置核苷酸序列的频次、1-6核苷酸所编码氨基酸的所有密码子频率最高值、1-6核苷酸所编码氨基酸的所有密码子频率最低值。
3.序列中低频次codon pair统计
[('GTTGAT', '46-51: GATTGG(185)', 'TGGGCA'),
('GCAGTT', '256-261: GTTTGG(156)', 'TGGACC'),
('TATAAT', '277-282: AATTGG(93)', 'TGGAAT')]
列表中第一串字母表示46-51位低频次codon pair的前一个codon pair,列表中最后一串字母表示46-51位低频次codon pair的后一个codon pair,中间的codon pair想必不用解释了吧,其中括号中的数值表明了该位置codon pair的频次数值。该值越大表明其使用效率或者说频率较高。越低说明其codon pair序列使用频次较低。
4.替换高频使用的codon pair序列
[[{'GTTGAC': 1185, '46-51(GATTGG:185):GACTGG': 2307}],
[{'GCAGTC': 526, '256-261(GTTTGG:156):GTCTGG': 1601},
{'GCAGTA': 797, '256-261(GTTTGG:156):GTATGG': 460},
{'GCAGTG': 1167, '256-261(GTTTGG:156):GTGTGG': 690}],
[{'TATAAC': 1221, '277-282(AATTGG:93):AACTGG': 1717}]]
46-51位序列位GATTGG,其codon pair值为185,可以替换为GACTGG,只改变了前三位密码子GAC,因此前一个codon pair需要将后三位密码子更换为GAC,更换后相邻的两个氨基酸的codon pair值都不低于我们设定值200,符合我们的要求。
如果有需要的做类似相关工作的伙伴,可以关注我,相互交流心得。