2015-08-01 1 views
0

Может ли кто-нибудь показать мне прямое решение о том, как вычислить самую длинную открытую рамку считывания (ORF) в последовательности ДНК? ATG является стартовым кодоном (то есть началом ORF) и TAG, TGA и TAA являются стоп-кодонами (то есть, конец ORF).Python находит самый длинный ORF в последовательности ДНК

Вот код, который выдает ошибки (и использует внешний модуль под названием BioPython):

import sys 
from Bio import SeqIO 

currentCid = '' 
buffer = [] 

for record in SeqIO.parse(open(sys.argv[1]),"fasta"): 
    cid = str(record.description).split('.')[0][1:] 

    if currentCid == '': 
     currentCid = cid 
    else: 
     if cid != currentCid: 
      buffer.sort(key = lambda x : len(x[1])) 
      print '>' + buffer[-1][0] 
      print buffer[-1][1] 
      currentCid = cid 
      buffer = [(str(record.description),str(record.seq))] 
     else: 
      buffer.append((str(record.description),str(record.seq))) 

buffer.sort(key = lambda x : len(x[1])) 
print '>' + buffer[-1][0] 
print buffer[-1][1] 

Можно ли записать эту процедуру с наименьшим количеством внешних зависимостей (или, по крайней мере, получить вышеприведенный код Работа)?

Вот что мой вход выглядит следующим образом:

ACCGCCGCGAACATCGCCGAGATCCTGCCGCCGCAGCCGAGCCGGCTGGTCGAGTATGCGCAACGACGCG 
CGTCCGGCAGCATCCCGGCGATCATGGCGCGCTGGGATGCACGCGTACTGCAGGACAACGAACCATTCAC 
CGCAGTCTATGGCGGCGCGTCGTACATCAACAACGACCTGTTCCTCGCCCGCCTCGCCGACTGGGGCGTG 
TCGGCCGGCAACTACAGCGGCGAGATCGGCGGCGCGACACCGCCGCTGCGCTGGCGCCCGCTGCGGCTGC 
TGCGTTCGCTGCCGGTGTTCTGGCGCATGCTGCGTGTCGCGCGCGGGCACCTGCCGACGCTCGAGCGCGG 
CTTGCAGCGCTTCGACCAGGAACTCGCGACGCTCGTCGAGCGACGCGCCGACGGCCAGCAACTGGCCGAC 
TGGTTCACGCGCTTCTACGTGTTCGTCGTGCAGGGCAACCTGTGCATCGCGTCGTCGCTGGCCAGCAGCG 
GCGGCGCACTGTGGGGCCGTCCGCCGACCGCATACGGCCAGCTCGACGACAGCCCGCACCGGCTGCCGTG 
GGAAACCGATCCGGGCACCGCACGGCCCGCGCCCACCCACCTGCCGCTGCAGGCGTTTCCCGCCTGGCCG 
CTGCCGGTCCGCGTGCTCCACGCGCTCGGCGCGCCCGGCATGCGCGGCTGGTATCTGCAGGTGCGCGAGT 
GGTATCGCGACAACCTGATGCGCGTGTTCTTCCGCCTGCATCATGCGATGCCGGCCGCCGATCGCGACAC 
GTGGTTCGCGCCCCATCCCGATCGCCGCGAACGCAACGGCAGCTTCTGGCAGGACGGCGGCGAAGGCACC 
GACGAGGCAGCCGGCTTCATGATCTATCCGGGCCACACGCAAGGCGTGCTCGGCCACGACATCCTGCTGG 
AAGACACGCTCGACCCGGGCCGGCACGCGCAGTACCAGGCCGCGCGCGCCGTGATCGCGCGCATGGGCGG 
CCGGCTGTCGCACGGCGCGACGCTGCTGCGCGAGCTGCGCAAGCCGTCGGCCGTGCTGCCGCGCGTCGAT 
GCGGCGTGGATCGGGCGCGAGGTGCGGCTCAGCGACGGCCAGCTGACGCTGGTCGAATGAACGCGATGCG 
GTTGCCGCGCACCCGAGCACGGGCCCGGGCCTGAACTGCCGATCAGCGTACCGGCGTGCGGACGACTCCG 
TCGACCTTCAGCGTGCGCCGGTCGTGCGCGGCTTCGTATTCGACCGTCTGCGCAGGCGTGACGGCGCCGT 
ATGAATGGCCGTTCACGTAGACGGTGCCGTCCCGCAGCTCGACCCGGTCGCCGTTGACCGTCGCTGTGGC 
CCGTTCACCCTGCAGCACCGCGCCCGAACAACCTGCAGTCGAAAAACTGCGGACCGACGTGCCCGGCATC 
GCGGCGATCCCGCCCTGGTCCGCCGCATGCGCCGCGCTGCACGGCGGCGCATCCATGCTGCCGGCAGCGT 
GGACCGCGCCGGCGCTGATGCCGCATCCGGCAAGCAGCGCAATCGTCATCGGCTTCAGATGGTTCATGGT 
GAGCTCCGTTGTCCGCCGCCGCGGATCGATGACCGGCCGACGCCCGTGCTCGCATGGCAGGCCGGCCGGC 
CGGATGCATCCAGTATGCGTCCGGTTCGCGGCATTCCGCCATCGTCGCCGATACCGCTCATCGCCGCCCG 
GTTCGCTCCCGCAGCGGCCTCTGGAAGCACCTCCCGCGGGGCAACCCGTCCCCATGAAAATCCACCTTGA 
TCAAGTTGCGACTCGCAACTATTATTGATTGCGATCCGCAACCTTTCCGGACCCGCCATGGACCTCATCG 
ACGCTCCCGCCAAGCCCCGCGAAGCCACGATCCTCGAGCTGCGCGACTTCTCCCGCAAACTGGTTCGCGA 
GCTCGGCTTCATGCGCGCGACGCTGGCCGACAGCGACTGGGCGCCTT 

Мой вывод должен быть:

Самая длинная подстрока, которая начинается с ATG (т.е. начало из ORF) и заканчивается либо TAG, TGA , или TAA как стоп-кодоны (то есть конец ORF).

ответ

0

Поскольку BioPython является устоявшейся и широко доступны модуль, специально разработанный для подобных вопросов, нет причин для его устранения и повторного создания колеса. Тем не менее, полезно использовать регулярные выражения для выявления стартовых кодонов:

from Bio import Seq 
import regex as re 
startP = re.compile('ATG') 
nuc = input_seq.replace('\n','') 
longest = (0,) 
for m in startP.finditer(nuc, overlapped=True): 
    if len(Seq.Seq(nuc)[m.start():].translate(to_stop=True)) > longest[0]: 
     pro = Seq.Seq(nuc)[m.start():].translate(to_stop=True) 
     longest = (len(pro), 
        m.start(), 
        str(pro), 
        nuc[m.start():m.start()+len(pro)*3+3]) 

Обратите внимание, что это использует модуль regex, а не re модуля; первая позволяет легче идентифицировать совпадающие совпадения. Мы можем позволить BioPython считать триплеты и искать стоп-кодоны, а не пытаться работать с помощью регулярных выражений.

Здесь longest дает длину белка, кодируемого ORF, стартового сайта (примечание, используя нумерацию на основе 0), последовательность белка, кодируемую ORF, и последовательность самой ORF, включая остановку кодон.

(338, 
93, 
'MARWDARVLQDNEPFTAVYGGASYINNDLFLARLADWGVSAGNYSGEIGGATPPLRWRPLRLLRSLPVFWRMLRVARGHLPTLERGLQRFDQELATLVERRADGQQLADWFTRFYVFVVQGNLCIASSLASSGGALWGRPPTAYGQLDDSPHRLPWETDPGTARPAPTHLPLQAFPAWPLPVRVLHALGAPGMRGWYLQVREWYRDNLMRVFFRLHHAMPAADRDTWFAPHPDRRERNGSFWQDGGEGTDEAAGFMIYPGHTQGVLGHDILLEDTLDPGRHAQYQAARAVIARMGGRLSHGATLLRELRKPSAVLPRVDAAWIGREVRLSDGQLTLVE', 
'ATGGCGCGCTGGGATGCACGCGTACTGCAGGACAACGAACCATTCACCGCAGTCTATGGCGGCGCGTCGTACATCAACAACGACCTGTTCCTCGCCCGCCTCGCCGACTGGGGCGTGTCGGCCGGCAACTACAGCGGCGAGATCGGCGGCGCGACACCGCCGCTGCGCTGGCGCCCGCTGCGGCTGCTGCGTTCGCTGCCGGTGTTCTGGCGCATGCTGCGTGTCGCGCGCGGGCACCTGCCGACGCTCGAGCGCGGCTTGCAGCGCTTCGACCAGGAACTCGCGACGCTCGTCGAGCGACGCGCCGACGGCCAGCAACTGGCCGACTGGTTCACGCGCTTCTACGTGTTCGTCGTGCAGGGCAACCTGTGCATCGCGTCGTCGCTGGCCAGCAGCGGCGGCGCACTGTGGGGCCGTCCGCCGACCGCATACGGCCAGCTCGACGACAGCCCGCACCGGCTGCCGTGGGAAACCGATCCGGGCACCGCACGGCCCGCGCCCACCCACCTGCCGCTGCAGGCGTTTCCCGCCTGGCCGCTGCCGGTCCGCGTGCTCCACGCGCTCGGCGCGCCCGGCATGCGCGGCTGGTATCTGCAGGTGCGCGAGTGGTATCGCGACAACCTGATGCGCGTGTTCTTCCGCCTGCATCATGCGATGCCGGCCGCCGATCGCGACACGTGGTTCGCGCCCCATCCCGATCGCCGCGAACGCAACGGCAGCTTCTGGCAGGACGGCGGCGAAGGCACCGACGAGGCAGCCGGCTTCATGATCTATCCGGGCCACACGCAAGGCGTGCTCGGCCACGACATCCTGCTGGAAGACACGCTCGACCCGGGCCGGCACGCGCAGTACCAGGCCGCGCGCGCCGTGATCGCGCGCATGGGCGGCCGGCTGTCGCACGGCGCGACGCTGCTGCGCGAGCTGCGCAAGCCGTCGGCCGTGCTGCCGCGCGTCGATGCGGCGTGGATCGGGCGCGAGGTGCGGCTCAGCGACGGCCAGCTGACGCTGGTCGAATGA') 
4

Вы должны смотреть в регулярные выражения:

import re 

max(re.findall(r'ATG(?:(?!TAA|TAG|TGA)...)*(?:TAA|TAG|TGA)',s), key = len) 

Существует хороший учебник here, который фокусируется на использовании регулярных выражений со строками ДНК

+1

Вау, это гораздо более элегантно, чем решение, которое я придумал :) (44 LOC) – pushkin

+1

Осторожно: '\ W +' является «по крайней мере, одна буква (и некоторые другие вещи, никто не заботится о)» , Для ORF вам нужны триплеты, и есть довольно простой способ изменить регулярное выражение для работы. Я не собираюсь делать это за вас (я ленив), но вот ссылка на [онлайн-тестер регулярных выражений] (https://regex101.com/r/wJ5rK7/1). Повеселись! – NightShadeQueen