我需要用biopython翻译比对的DNA序列
from Bio.Seq import Seq
from Bio.Alphabet import generic_dna
seq = Seq("tt-aaaatg")
seq.translate()
运行此脚本将得到错误:
Bio.Data.CodonTable.TranslationError: Codon 'TT-' is invalid.
有没有办法将“ tt-”翻译为X,因此整个翻译后的序列将是“ XKM”?
这在翻译比对序列中非常有用。例如,对齐的序列集以名为“ df”的pandas DataFrame的形式存储为:
import pandas as pd
df = pd.DataFrame([['A',Seq("tt-aaaatg")],['B',Seq("tttaaaatg")],['C',Seq("tttaaaatg")]],columns=['seqName','seq'])
print(df)
df将显示为:
seqName seq
A Seq("tt-aaaatg")
B Seq("tttaaaatg")
C Seq("tt-aaaatg")
如果“ tt-”可以翻译为“ x”,则使用以下代码:
df['prot'] = pd.Seris([x.translate() for x in df.seq])
我们可以获得:
seqName seq prot
0 A (t, t, g, a, a, a, a, t, g) (X, K, M)
1 B (t, t, t, a, a, a, a, t, g) (F, K, M)
2 C (t, t, t, a, a, a, a, t, g) (F, K, M)
但是,当前的biopython无法将“ tt-”转换为“ X”,并且会抛出错误。在我看来,我必须去除比对序列中的所有缺口,然后进行翻译,之后我必须重新比对翻译后的蛋白质序列。
您如何处理此类问题?预先谢谢你。
答案 0 :(得分:0)
注意:假设这些是框内(框1)氨基酸编码比对中真正的1bp缺失。
为此,您可以使用以下自定义翻译功能:
def translate_dna(sequence):
"""
:param sequence: (str) a DNA sequence string
:return: (str) a protein string from the forward reading frame 1
"""
codontable = {'ATA': 'I', 'ATC': 'I', 'ATT': 'I', 'ATG': 'M',
'ACA': 'T', 'ACC': 'T', 'ACG': 'T', 'ACT': 'T',
'AAC': 'N', 'AAT': 'N', 'AAA': 'K', 'AAG': 'K',
'AGC': 'S', 'AGT': 'S', 'AGA': 'R', 'AGG': 'R',
'CTA': 'L', 'CTC': 'L', 'CTG': 'L', 'CTT': 'L',
'CCA': 'P', 'CCC': 'P', 'CCG': 'P', 'CCT': 'P',
'CAC': 'H', 'CAT': 'H', 'CAA': 'Q', 'CAG': 'Q',
'CGA': 'R', 'CGC': 'R', 'CGG': 'R', 'CGT': 'R',
'GTA': 'V', 'GTC': 'V', 'GTG': 'V', 'GTT': 'V',
'GCA': 'A', 'GCC': 'A', 'GCG': 'A', 'GCT': 'A',
'GAC': 'D', 'GAT': 'D', 'GAA': 'E', 'GAG': 'E',
'GGA': 'G', 'GGC': 'G', 'GGG': 'G', 'GGT': 'G',
'TCA': 'S', 'TCC': 'S', 'TCG': 'S', 'TCT': 'S',
'TTC': 'F', 'TTT': 'F', 'TTA': 'L', 'TTG': 'L',
'TAC': 'Y', 'TAT': 'Y', 'TAA': '*', 'TAG': '*',
'TGC': 'C', 'TGT': 'C', 'TGA': '*', 'TGG': 'W',
'---': '-',
}
seq = sequence.upper()
prot = []
for n in range(0, len(seq), 3):
if seq[n:n + 3] in codontable:
residue = codontable[seq[n:n + 3]]
else:
residue = "X"
prot.append(residue)
return "".join(prot)
else语句将导致任何无法识别的密码子(包括简并碱基的存在)被翻译为x。 只需将序列字符串传递给此函数即可。 如果您的序列存储为seq对象,则可以像下面这样修改函数中的行:
seq = sequence.seq.upper()