我有一个带有一系列序列的FASTA文件,格式如下:
BMRat | XM_008846946.1 ATGAAGAACATCACAGAAGCCACCACCTTCATTCTCAAGGGACTCACAGACAATGTGGAACTACAGGTCA TCCTCTTTTTTCTCTTTCTAGCGATTTATCTCTTCACTCTCATAGGAAATTTAGGACTTATTATTTTAGT TATTGGGGATTCAAAACTCCACAACCCTATGTACTGTTTTCTGAGTGTATTGTCTTCTGTAGATGCCTGC TATTCCTCAGACATCACCCCGAATATGTTAGTAGGCTTCCTGTCAAAAAACAAAGGCATTTCTCTCCATG GATGTGCAACACAGTTGTTTCTCGCTGTTACTTTTGGAACCACAGAATGCTTTCTGTTGGCGGCAATGGC TTATGACCGCTATGTAGCCATCCATGACCCACTTCTCTATGCAGTGAGCATGTCACCAAGGATCTATGTG CCGCTCATCATTGCTTCCTATGCTGGTGGAATTCTGCATGCGATTATCCACACCGTGGCCACCTTCAGCC TGTCCTTCTGTGGATCTAATGAAATCAGTCATATATTCTGTGACATCCCTCCTCTGCTGGCTATTTCTTG TTCTGACACTTACATCAATGAGCTCCTGTTGTTCTTCTTTGTGAGCTCCATAGAAATAGTCACTATCCTC ATCATCCTGGTCTCTTATGGTTTCATCCTTATGGCCATTCTGAAGATGAATTCAGCTGAAGGGAGGAGAA AAGTCTTCTCTGCATGTGGGTCTCACCTAACTGGAGTGTCCATTTTCTATGGGACAAGCCTTTTCATGTA TGTGAGACCAAGCTCCAACTATTCCTTGGCACATGACATGGTAGTGTCGACATTTTATACCATTGTGATT CCCATGCTGAACCCTGTCATCTACAGTCTGAGGAACAAAGATGTGAAAGAGGCAATGAGAAGATTTTTGA AGAAAAATTTTCAGAAACTTTAA
使用biopython http://biopython.org/wiki/Seq实现的代码允许我找到最长的氨基酸序列,以氨基酸开始,以FASTA文件中每个序列的终止密码子结束。
该功能为find_largest_polypeptide_in_DNA
。基本上它使用3个不同的正向阅读框将DNA序列翻译成氨基酸序列,并且在变量allPossibilities
中它保存以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")的每个蛋氨酸的位置,然后使用该位置在核苷酸序列中跟踪它。
感谢。
答案 0 :(得分:0)
我认为按照类似原则编写新函数是最容易的。你的想法“跟踪i.find('M')的每个蛋氨酸的位置”基本上是在下面做的。使用您开始使用的代码执行此操作的难度在于,序列会被split('*')
切断,因此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