欢迎光临散文网 会员登陆 & 注册

【ROSALIND】【练Python,学生信】18 搜索开放读码框(ORF)

2019-02-14 16:35 作者:未琢  | 我要投稿

如果第一次阅读本系列文档请先移步阅读【ROSALIND】【练Python,学生信】00 写在前面  谢谢配合~

题目:

寻找所有开放读码框(ORF)

Given: A DNA string s of length at most 1 kbp in FASTA format.

所给:一条不超过1kb长的DNA序列s,以FASTA格式给出。

Return: Every distinct candidate protein string that can be translated from ORFs of s. Strings can be returned in any order.

需得:所有ORF得到的蛋白序列,可以以任意顺序给出。

 

测试数据

>Rosalind_99

AGCCATGTAGCTAACTCAGGTTACATGGGGATGACCCCGCGACTTGGATTAGAGTCTCTTTTGGAATAAGCCTGAATGATCCGAGTAGCATCTCAG

测试输出

MLLGSFRLIPKETLIQVAGSSPCNLS

M

MGMTPRLGLESLLE

MTPRLGLESLLE

 

背景

遗传信息由DNA流向蛋白质,但不是所有的DNA序列都可以编码出蛋白质。一个开放读码框(open reading frame, ORF)由起始密码子开始,由终止密码子结束,且序列中间没有终止密码子。将ORF中的序列翻译为多肽即为候选的蛋白质序列。

DNA序列可以按六种框架阅读和翻译,取决于我们如何组合三联密码子。比如...AUGCUGAC... 可以被阅读为...AUGCUG...,或 ...UGCUGA...或...GCUGAC...;两条链都可以作为模板链,因此还需要得到原序列的反向互补序列,以同样的思路得到另外三种阅读方式。

 

思路

本题可拆解为如下几个问题:

其一,得到DNA的反向互补序列,并将两个序列都转录为RNA。在之前的文档里这一步已有解答,套用即可。

其二,把ORF序列找到并分别存储下来。这里只需挨个比对是否包含起始密码子或终止密码子即可,找到就把编码序列存在列表里。

其三,把核酸序列翻译成蛋白序列。直接用之前的解答即可。

 

代码

codon_table = {

    'GCU':'A', 'GCC':'A', 'GCA':'A', 'GCG':'A', 'CGU':'R', 'CGC':'R',

    'CGA':'R', 'CGG':'R', 'AGA':'R', 'AGG':'R', 'UCU':'S', 'UCC':'S',

    'UCA':'S', 'UCG':'S', 'AGU':'S', 'AGC':'S', 'AUU':'I', 'AUC':'I',

    'AUA':'I', 'UUA':'L', 'UUG':'L', 'CUU':'L', 'CUC':'L', 'CUA':'L',

    'CUG':'L', 'GGU':'G', 'GGC':'G', 'GGA':'G', 'GGG':'G', 'GUU':'V',

    'GUC':'V', 'GUA':'V', 'GUG':'V', 'ACU':'T', 'ACC':'T', 'ACA':'T',

    'ACG':'T', 'CCU':'P', 'CCC':'P', 'CCA':'P', 'CCG':'P', 'AAU':'N',

    'AAC':'N', 'GAU':'D', 'GAC':'D', 'UGU':'C', 'UGC':'C', 'CAA':'Q',

    'CAG':'Q', 'GAA':'E', 'GAG':'E', 'CAU':'H', 'CAC':'H', 'AAA':'K',

    'AAG':'K', 'UUU':'F', 'UUC':'F', 'UAU':'Y', 'UAC':'Y', 'AUG':'M',

    'UGG':'W',

    'UAG':'Stop', 'UGA':'Stop', 'UAA':'Stop'

    }

 

 

def readfasta(lines):

'''阅读fasta文件的函数'''

    seq = []

    index = []

    seqplast = ""

    numlines = 0

    for i in lines:

        if '>' in i:

            index.append(i.replace("\n", "").replace(">", ""))

            seq.append(seqplast.replace("\n", ""))

            seqplast = ""

            numlines += 1

        else:

            seqplast = seqplast + i.replace("\n", "")

            numlines += 1

        if numlines == len(lines):

            seq.append(seqplast.replace("\n", ""))

    seq = seq[1:]

    return index, seq

 

 

def trans(seq):

'''将RNA序列翻译成多肽的函数'''

    i = 0

    p = ""

    while i < len(seq)/3:

        n = seq[3 * i] +seq[3*i+1] + seq[3*i+2]

        r = codon_table[n]

        i += 1

        p = p + r

    return p

 

 

f = open('input.txt', 'r')

lines = f.readlines()

f.close()

 

[index, seq] = readfasta(lines)

seq = seq[0]

c = ''

 

for i in range(len(seq)):  # 得到原序列的互补序列

    if seq[i] == 'A':

        c += 'T'

    elif seq[i] == 'G':

        c += 'C'

    elif seq[i] == 'T':

        c += 'A'

    elif seq[i] == 'C':

        c += 'G'

 

rseq = c

rseq = rseq[::-1]  # 得到反向序列

 

seq = seq.replace('T','U')

rseq = rseq.replace('T','U')  # 将DNA转录为RNA

 

start = 'AUG'

stop = ['UAG', 'UGA', 'UAA']

i = 0

j = 0

result = []

while i < len(seq) - 2:

    if seq[i:i+3] == start:  # 找start codon

        j = i

        sequence = ""

        while i < len(seq) - 2:

            if seq[i:i+3] == stop[0] or seq[i:i+3] == stop[1] or seq[i:i+3] == stop[2]:  # 找stop codon

                result.append(sequence)

                break

            sequence = sequence + seq[i:i+3]

            i += 3

    i = j + 1

    j += 1

 

i = 0

j = 0

while i < len(rseq) - 2:  # 对反向互补序列进行相同操作,最好包装为函数实现复用

    if rseq[i:i+3] == start:

        j = i

        sequence = ""

        while i < len(rseq) - 2:

            if rseq[i:i+3] == stop[0] or rseq[i:i+3] == stop[1] or rseq[i:i+3] == stop[2]:

                result.append(sequence)

                break

            sequence = sequence + rseq[i:i+3]

            i += 3

    i = j + 1

    j += 1

 

result2=[]

for i in result:

    if not i in result2:

        result2.append(i)

result = result2  # 用result2为中介除去重复出现的序列

# print(result)

 

i = 0

proteins = []

while i < len(result):  # 翻译序列为多肽

    protein = trans(result[i])

    proteins.append(protein)

    print(protein)

    i += 1

 

f = open('output.txt','a')  # 写入文件便于提交

i = 0

while i < len(proteins):

    f.write(proteins[i])

    f.write('\n')

    i += 1

f.close()


【ROSALIND】【练Python,学生信】18 搜索开放读码框(ORF)的评论 (共 条)

分享到微博请遵守国家法律