前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >生物信息学算法之Python实现|Rosalind刷题笔记:011 DNA六框翻译

生物信息学算法之Python实现|Rosalind刷题笔记:011 DNA六框翻译

作者头像
简说基因
发布2020-12-15 11:27:13
9940
发布2020-12-15 11:27:13
举报
文章被收录于专栏:简说基因

开放阅读框(Open Reading Frame, ORF)是由起始密码子开始,直到终止密码子结束,中间不含有其他终止密码子的核酸序列。由于 DNA 是双链结构,任何一条链都可以作为模板合成 RNA;并且又因为遗传密码是三联体,由三个核苷酸决定一个氨基酸,因此对于一段 DNA 序列,有六种可能的阅读框(正向三个,反向三个)。通常情况下,六种阅读框只有一种是正确的:一般是翻译得到最长氨基酸序列的阅读框。

图源:rosalind.info

给定: Fasta 文件中一条长度不超过 1kb 的 DNA 序列。

需得: 不同的由 ORF 翻译而来的蛋白序列。返回翻译的蛋白序列时可以是任意顺序。

示例数据

代码语言:javascript
复制
>Rosalind_99
AGCCATGTAGCTAACTCAGGTTACATGGGGATGACCCCGCGACTTGGATTAGAGTCTCTTTTGGAATAAGCCTGAATGATCCGAGTAGCATCTCAG

示例结果

代码语言:javascript
复制
MLLGSFRLIPKETLIQVAGSSPCNLS
M
MGMTPRLGLESLLE
MTPRLGLESLLE

Python 实现

Open_Reading_Frames.py

代码语言:javascript
复制
import sys
import pysam
table = """TTT F      CTT L      ATT I      GTT V
TTC F      CTC L      ATC I      GTC V
TTA L      CTA L      ATA I      GTA V
TTG L      CTG L      ATG M      GTG V
TCT S      CCT P      ACT T      GCT A
TCC S      CCC P      ACC T      GCC A
TCA S      CCA P      ACA T      GCA A
TCG S      CCG P      ACG T      GCG A
TAT Y      CAT H      AAT N      GAT D
TAC Y      CAC H      AAC N      GAC D
TAA Stop   CAA Q      AAA K      GAA E
TAG Stop   CAG Q      AAG K      GAG E
TGT C      CGT R      AGT S      GGT G
TGC C      CGC R      AGC S      GGC G
TGA Stop   CGA R      AGA R      GGA G
TGG W      CGG R      AGG R      GGG G"""
table = dict(zip(table.split()[::2],table.split()[1::2]))

def translate(dna):
    aa = ''
    for i in range(0, len(dna), 3):
        codon = dna[i:i+3]
        if table[codon] == 'Stop':
            break
        aa += table[dna[i:i+3]]
    return aa

def reverse_complement(dna):
    revc = ""
    basepair = {'A':'T', 'T':'A', 'G':'C', 'C':'G'}
    for c in dna:
        revc = basepair[c] + revc
    return revc

def find_orf(dna):
    ret = []
    dna_len = int(len(dna)/3) * 3
    i = 0
    for i in range(0, dna_len, 3):
        codon = dna[i:i+3]
        if codon != 'ATG': continue
        base = codon
        for j in range(i+3, dna_len, 3):
            codon = dna[j:j+3]
            base += codon
            if table[codon] == 'Stop':
                ret.append(base)
                break
    return ret

def six_frame_translate(dna):
    revc = reverse_complement(dna)
    amino_acids = []
    for i in range(3):
        for orf in find_orf(dna[i:]) + find_orf(revc[i:]):
            if orf:
                amino_acids.append(translate(orf))
    return set(amino_acids)

def test():
   dna = 'AGCCATGTAGCTAACTCAGGTTACATGGGGATGACCCCGCGACTTGGATTAGAGTCTCTTTTGGAATAAGCCTGAATGATCCGAGTAGCATCTCAG'
   return 'MLLGSFRLIPKETLIQVAGSSPCNLS' in six_frame_translate(dna)


if __name__ == '__main__':
    if not test():
        print("six_frame_translate: Failed")
        sys.exit(1)

    with pysam.FastxFile('rosalind_orf.txt') as fh:
        for r in fh:
            six = six_frame_translate(r.sequence)
            print("\n".join(six))
  • 六框翻译,即正向三次,反向三次
  • 由于允许 ORF 重叠,因此本题的关键是要找到所有的 ORF(find_orf 函数,使用了双层循环,第一层找起始密码子,第二层找终止密码子)
  • 逐个翻译每个 ORF(translate 函数),最后用 set()函数去除冗余
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 简说基因 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例数据
  • 示例结果
  • Python 实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档