我一直在努力将DNA序列列表转换为氨基酸序列。我写的函数应该读取三个核苷酸的DNA列表。它应该循环遍历列表中的序列,并使用目录中的密码子翻译每个序列。现在我知道这个问题并不新鲜,而且Biopython有一个专门为这种东西制作的翻译模块。难点在于我后来想使用简并密码子目录,使用nnk密码子代码(K为G或T),并且就我的研究而言,无法使用bioppython制作自定义密码子目录。此外,我使用的DNA序列在长度上也不均匀。
现在我认为是时候更深入地解释一下我的数据在哪里了。DNA序列列表的来源这些序列(范围从1000到100多万个)是随机核苷酸和标记之间的序列,我通过使用写入文本文件的正则表达式搜索的函数将它们分离出来。该文件的结构如下所示:
CACCAGAGTGAGAATAGAAA CCAAAAAAAAGGCTCCAAAAGGAGCCTTTAATTGTATCTAAACAGCTTGATACCGATAGTTGCGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTCCCAAAAAAAAGGCTCCAAAAGGAGCCTTTAATTGTATCTAAACAGCTTGATACCGATAGTTGCGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTCCCAAAAAAAAGGCTCCAAAAGGAGTCTTTAATTGTATCTAAACAGCTTGATACCGATAGTTGCGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTCCCAAAAAAAGGCTCCAAAAGGAGCCTTTAATTGTATCTAAACAGCTTGATACCGATAGTTGCGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTCCCAAAAAAAAGGCTCCAAAAGGAGCCTTTAATTGTATCTAAACAGCTTGATACCGATAGTTGCGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTCCCAAAAAAAAGGCTCCAAAAGGAGCCTTTAATTGTATCTAAACAGCTTGATACCGATAGATGCGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTCCAGCATTAGGAGCCGGCTGATGAGAGTGAGAATAGAAACCAAAAAAAAGGCTCCAAAAGGAGCCTTTAATTGTATCTAAACAGCTTGATACCGATAGTTGTGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTC
我尝试的是在文件中读取并获得所有序列作为字符串的列表,摆脱空白和换行符以及那种东西。启动一个定义密码子用法的函数,并以三个字母的方式循环遍历每个序列的序列列表,将它们翻译成字典中密码子定义的氨基酸。
Code I got so far:
input_file = 'inserts.txt'
with open(input_file, 'r') as f:
seq = f.readlines()
seq = [s.replace(" ", "").replace(",", "").replace("'", "").replace("n", "") for s in seq]
print("n".join(seq[:99]))
print("nType lookup", type(seq))
# translation function and NNN codon table as a dict object
def translate(seq):
nnn_table = {'TTT': 'F', 'TCT': 'S', 'TAT': 'Y', 'TGT': 'C', 'TTC': 'F', 'TCC': 'S', 'TAC': 'Y', 'TGC': 'C',
'TTA': 'L',
'TCA': 'S', 'TAA': '*', 'TGA': '*', 'TTG': 'L', 'TCG': 'S', 'TAG': '*', 'TGG': 'W', 'CTT': 'L',
'CCT': 'P',
'CAT': 'H', 'CGT': 'R', 'CTC': 'L', 'CCC': 'P', 'CAC': 'H', 'CGC': 'R', 'CTA': 'L', 'CCA': 'P',
'CAA': 'Q',
'CGA': 'R', 'CTG': 'L', 'CCG': 'P', 'CAG': 'Q', 'CGG': 'R', 'ATT': 'I', 'ACT': 'T', 'AAT': 'N',
'AGT': 'S',
'ATC': 'I', 'ACC': 'T', 'AAC': 'N', 'AGC': 'S', 'ATA': 'I', 'ACA': 'T', 'AAA': 'K', 'AGA': 'R',
'ATG': 'M',
'ACG': 'T', 'AAG': 'K', 'AGG': 'R', 'GTT': 'V', 'GCT': 'A', 'GAT': 'D', 'GGT': 'G', 'GTC': 'V',
'GCC': 'A',
'GAC': 'D', 'GGC': 'G', 'GTA': 'V', 'GCA': 'A', 'GAA': 'E', 'GGA': 'G', 'GTG': 'V', 'GCG': 'A',
'GAG': 'E',
'GGG': 'G'}
# two loops, outer one to loop over the list of string sequences
# inner one loops over each sequence
nnn_aa_seq = []
# generate amino acid sequence
# add option for sequence or codon not divisible by three
print("nStarting to translate:")
for dna in seq:
protein_seq = ""
for i in range(0, len(dna), 3):
if len(dna) % 3 == 0:
nnn_codon = nnn_table[dna[i:i + 3]]
protein_seq += nnn_codon
nnn_aa_seq.append(protein_seq)
return "".join(nnn_aa_seq)
translate_nnn = translate(seq)
print(tranlate_nnn)
# do other stuff
现在我想要的输出将是原始文本文件中每个DNA序列的每个氨基酸序列的列表。
我得到的"output"是这样的:
Starting to translate
**T*TA*TA**TA*Y*TA*YR*TA*YR**TA*YR*L*TA*YR*LR*TA*YR*LRR*TA*YR*LRRQ*TA*YR*LRRQ**TA*YR*LRRQ*Q*TA*YR*LRRQ*QQ*TA*YR*LRRQ*QQP*TA*YR*LRRQ*QQPS*TA*YR*LRRQ*QQPSP*TA*YR*LRRQ*QQPSPT*TA*YR*LRRQ*QQPSPTH*TA*YR*LRRQ*QQPSPTHN*TA*YR*
我对这个问题的猜测是,一些序列不能被3整除。对于这些序列,我认为最好去掉悬垂或用占位器代替。你们怎么看?
编辑:
好吧,我忘记打印结果了,这看起来一点也不像我想象的那样。它是一条不可区分的氨基酸线,而不是每个DNA序列的氨基酸序列列表。无论如何,我的问题仍然存在。帮助和任何批评是受欢迎的!
你在做
for dna in seq:
protein_seq = ""
for i in range(0, len(dna), 3):
if len(dna) % 3 == 0:
nnn_codon = nnn_table[dna[i:i + 3]]
protein_seq += nnn_codon
nnn_aa_seq.append(protein_seq)
这意味着您正在检查len(dna)
是否可以被3整除多次而不需要这样做。dna
的长度在每次外部for循环中都是恒定的,因此你可以在开始内部for循环之前检查一下,并提供明确的信息,例如
for dna in seq:
protein_seq = ""
if len(dna) % 3 != 0:
print('DNA length not divisible by 3')
continue # go to next element of seq
for i in range(0, len(dna), 3):
nnn_codon = nnn_table[dna[i:i + 3]]
protein_seq += nnn_codon
nnn_aa_seq.append(protein_seq)
如果要区分结果中的序列,不应该使用return "".join(nnn_aa_seq)
,而应该使用return "n".join(nnn_aa_seq)
,或者最好使用return nnn_aa_seq
返回整个列表。
对于不能被3整除的序列,你为什么认为它们是蛋白质编码序列呢?如果是的话,期望你的标记匹配模式准确地捕捉到一个基因的开始是现实的吗?我没有看到很多起始密码子。
如果你认为这些是基因片段,那么每个序列有三种可能的翻译,这取决于你如何排列密码子框架。所以你可以尝试这样做:
for dna in seq:
protein_seq_candidates = []
for start in (0, 1, 2):
protein_seq = []
for i in range(start, len(dna), 3):
nnn_codon = nnn_table[dna[i:i + 3]]
protein_seq.append(nnn_codon)
protein_seq_candidates.append(protein_seq)
# Compare the three aa sequences in terms of biological plausibility,
# e.g. check for stop codons within the sequences, aa distribution, etc.
# Pick the best one (or none) and append it to nnn_aa_seq.