Python 在使用生物密码子的翻译功能后,如何跟踪起始密码子(ATG)在核苷酸序列中的位置?

Python 在使用生物密码子的翻译功能后,如何跟踪起始密码子(ATG)在核苷酸序列中的位置?,python,sequence,biopython,dna-sequence,Python,Sequence,Biopython,Dna Sequence,我有一个FASTA文件,其中包含一系列序列,格式如下: BMRat | XM_008846946.1 ATGAAGACATCACAGAAGCACACCTCATCAAGGACTCACAAGCAATGATGGAATCAGCAGGTCA TCCTCTTTTTCTCTCTAGCTTTTTTTTCTCTCTCTCTCTCATAGAATTAGAGATTTAGATTTAGATTTAGATTTAGATTTAGATTTAGATTTAGT TATTGGGATTCAAAACTCCACACCCATGTTACTGTTTT

我有一个FASTA文件,其中包含一系列序列,格式如下:

BMRat | XM_008846946.1 ATGAAGACATCACAGAAGCACACCTCATCAAGGACTCACAAGCAATGATGGAATCAGCAGGTCA TCCTCTTTTTCTCTCTAGCTTTTTTTTCTCTCTCTCTCTCATAGAATTAGAGATTTAGATTTAGATTTAGATTTAGATTTAGATTTAGATTTAGT TATTGGGATTCAAAACTCCACACCCATGTTACTGTTTTCTGGTATTTTCTGTAGTGCCTGC TATTCCTCGACATCACCCGAATAGTTAGGCCTTCCTGTCAAAAACAAGGATTCTCCATG GATGTGCACACAGCAGTTTTTTCTCGCTGTTACTTTTGGAACACAGAATGCTTTTTCTGTGCGGCAATGGC TTATGACCGCATGTAGCCATGACCATCTCTATGCATGTCAAGATCTAGTG CCGCTCATTCATGCTTCCATGCTGGTGGAATTCTGCATGCATGCGATTATCCACACCGTGGCCTTCAGCC TGTCCTCTGTGGATCTATGAATCAGTCATATCTCTGTGACATCCCTCCTCTGCTGGCTATTCTTG TTCTGACACTCATCAATGAGCTCGTGTTCTTCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGTGAGCTCTAGAATAGAAATAGTCTATCTCTC ATCATCCTGGTCTCTTATTGCATTCTCTTATGCATTCTGCTGAATGATTCAGCTGAGAGAGAA AAGTCTTCTCTGCATGTGGGTCTCACTACTGGAGTGTCATTTCTAGGGACAGCTTTCTCTCATGTA TGTGAGACAGTCCACTATTCCCTTGGCATCATGACATGGTAGGTGTCGACATTTATACATGTGATT CCCATGCTGAACCCTCATCTACAGTCTGAGAACAAGAGATGTGAGAGAGAGATTTTGA 阿加阿塔卡加阿塔塔

使用biopython实现的代码允许我在FASTA文件中找到每个序列中以蛋氨酸开始,以终止密码子结束的最长氨基酸序列

功能是在DNA中找到最大的多肽。基本上,它使用3个不同的前向阅读框将DNA序列转换为氨基酸序列,并在变量
AllProbabilities
中保存以M(一种特定氨基酸)开头并以终止密码子结尾的片段。然后比较可能的长度并选择最长的可能性,返回该片段的蛋白质序列

def find_largest_polypeptide_in_DNA(seq, translationTable=1):
    allPossibilities = []
    for frame in range(3):
        trans = str(seq[frame:].translate(translationTable))
        framePossibilitiesF = [i[i.find("M"):] for i in trans.split("*") if "M" in i]
        allPossibilities += framePossibilitiesF
    allPossibilitiesLengths = [len(i) for i in allPossibilities]

    if len(allPossibilitiesLengths) == 0:
        raise Exception("no candidate ORFs")

    proteinAsString = allPossibilities[allPossibilitiesLengths.index(max(allPossibilitiesLengths))]

    return Seq(proteinAsString, alphabet=ProteinAlphabet)
它工作得很完美,但现在我想得到与该函数返回的蛋白质序列相对应的DNA序列。我需要在函数中添加一些行,以便获得两个序列,但我不知道如何进行。 我不知道是否有可能跟踪I.find(“M”)中每个蛋氨酸的位置,然后使用该位置在核苷酸序列中跟踪它


谢谢

我认为按照类似的原则编写一个新函数是最容易的。你的想法“跟踪i.find('M')中每个蛋氨酸的位置”基本上就是下面所做的。对你开始使用的代码执行此操作的困难在于,序列会被
拆分('*')
切碎,因此DNA起始位置是读取帧偏移量加上相关序列之前片段的所有密码子之和。根据您的说明,我添加了一个封闭循环,以在前进和后退方向上进行迭代

def find_largest_polypeptide_in_DNA(seq, translationTable=1):
    # Set the record to start with, then try to beat it
    longest_DNA = ''
    longest_amino_acid_sequence = 0

    for direction in [-1, 1]:
        forward_DNA = seq[::direction]
        # Check all three reading frames in this direction.
        for frame in range(3):
            trans = str(forward_DNA[frame:].translate(translationTable))
            cut_codons = 0
            while 'M' in trans:
                codons_before_Met = trans.find('M')
                cut_codons += codons_before_Met
                trans = trans[codons_before_Met:]
                if '*' in trans:
                    length = trans.find('*') + 1 
                    if length > longest_amino_acid_sequence:
                        longest_amino_acid_sequence = length
                        first_bp = frame + 3*cut_codons
                        last_bp = frame + 3*cut_codons + 3*(length)
                        longest_DNA = str(forward_DNA[first_bp:last_bp+1])
                    trans = trans[length:]
                else:
                    # Ignore sequence M... if ORF extends beyond FASTA?
                    trans = ''
    return longest_DNA

您想修改函数,使其返回DNA序列,而不是从Met开始到ends STOP结束的最长序列的氨基酸序列?是否有理由要忽略相反方向的3个读取帧?你知道你的基因是从哪条链转录而来的吗?你的问题表明你想要的序列必须包含一个终止密码子。您提供的代码包括FASTA文件中每个序列末尾的段,该段以M开头,未终止。您想在FASTA序列的末尾包含或排除起始相接但未终止的段吗?是的,我也应该以相反的方式阅读,谢谢@BennettBrownI想要一个最长的片段,该片段以M开头,以终止密码子@BennettBrown结尾