【问题标题】:Is there a way to translate a list of dna sequences into amino acids if the dna sequence is not divisible by three?如果 dna 序列不能被三整除,有没有办法将 dna 序列列表翻译成氨基酸?
【发布时间】:2021-12-07 02:36:45
【问题描述】:

我一直在努力将 DNA 序列列表转换为氨基酸序列。我写的函数应该读取三个核苷酸的 DNA 列表。它应该遍历列表中的序列并使用目录中的密码子翻译每个序列。现在我知道这个问题并不完全是新问题,而且 Biopython 有一个为这类东西制作的翻译模块。困难在于我后来想使用简并密码子目录,带有 NNK 密码子代码(K 是 G 或 T),就我的研究而言,不可能使用 Biopython 制作自定义密码子 dics。我使用的 DNA 序列的长度也不统一。

现在我认为是时候更深入地解释一下我的数据在哪里了。 DNA序列列表来自。这些序列(从一对夫妇 1000 到超过 100 万个)是介于标记之间的随机核苷酸,这些标记是我通过使用正则表达式搜索写入文本文件的函数分离出来的。该文件的结构如下所示:

CACCAGAGTGAGAATAGAAA CCAAAAAAAAAGGCTCCAAAAGGAGCCTTTAATTGTATC TAAACAGCTTGATACCGATAGTTGCGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTC CCAAAAAAAAAGGCTCCAAAAGGAGCCTTTAATTGTATC TAAACAGCTTGATACCGATAGTTGCGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTC CCAAAAAAAAGGCTCCAAAAGGAGTCTTTAATTGTATC TAAACAGCTTGATACCGATAGTTGCGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTC CCAAAAAAAGGCTCCAAAAGGAGCCTTTAATTGTATC TAAACAGCTTGATACCGATAGTTGCGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTC CCAAAAAAAAAGGCTCCAAAAGGAGCCTTTAATTGTATC TAAACAGCTTGATACCGATAGTTGCGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTC CCAAAAAAAAAGGCTCCAAAAGGAGCCTTTAATTGTATC TAAACAGCTTGATACCGATAGATGCGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTC CAGCATTAGGAGCCGGCTGATGAGAGTGAGAATAGAAA CCAAAAAAAAAGGCTCCAAAAGGAGCCTTTAATTGTATC TAAACAGCTTGATACCGATAGTTGTGCCGACAATGACAACAACCATCGCCCACGCATAACCGATATATTC

我尝试的是读取文件并获取所有序列的列表作为字符串,去掉空格和换行符之类的东西。启动一个定义了密码子使用的函数,并以三个字母的方式遍历每个序列的序列列表,将它们翻译成字典中密码子定义的氨基酸。

到目前为止我得到的代码:

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 序列的每个氨基酸序列的列表。

我得到的“输出”是这样的:

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*

我对这个问题的猜测是某些序列不能被三整除。对于这些序列,我认为最好移除突出部分或将其替换为占位符。大家觉得呢?

编辑:

好吧,我忘了实际打印结果,这看起来不像我想象的那样。它是一个不可区分的氨基酸系,而不是每个 DNA 序列的氨基酸序列列表。无论如何我的问题仍然存在。欢迎帮助和任何批评!

【问题讨论】:

  • 这个我完全不熟悉,但是exit code 0通常表示程序终止成功?
  • 如果在末尾添加print(translate_nnn)会怎样?
  • 对了,忘记了,我编辑了帖子。

标签: python translation bioinformatics


【解决方案1】:

你在做

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)

【讨论】:

  • 好的,感谢@Daweo 的快速回答!我想通常可以将len(dna) % 3 != 0 的序列“删除”。但我认为最好用占位符交换或移除突出部分。这保持了顺序,我仍然可以使用它。我帖子中提到的氨基酸线也很重要。有趣的是它的组成改为:*TA*YR*LRRQ*QQPSPTHN*YIRSLRLAGS*RPLLPIVTGFTRGR**AE*E*KPKKKAPKGAFNCIPKKKAPKGAFNCIPKKKAPKGAFNCIVT*TCTRSYPERSEE*E*KSDLQSVSAEPPLA*TYPGSVSGI*KE*E*KSDLNSFRPNLHPERDRLAGGTFRVE*E*KPKKKAPKGAFNC
【解决方案2】:

如果你想区分结果中的序列,你不应该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.

【讨论】:

  • 嗨@Arne,感谢您的回答!那么它们应该是蛋白质编码序列,或者更好的是它们是随机插入来自phd 12噬菌体文库的M13噬菌体的pIII基因位点(12是随机插入中的氨基酸数)并且起始密码子在信号序列中更上游。即使我使用的是模糊正则表达式搜索,我认为公平地说它并不总是能找到确切的插入。我想我会添加一个选项来指定标记之间的核苷酸数量。即使您的回答不能满足我的问题,它仍然很有帮助。
猜你喜欢
  • 2013-11-23
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 2014-02-27
  • 2018-04-12
  • 1970-01-01
相关资源
最近更新 更多