2012-10-28 39 views
12

Tôi đang sử dụng Python và biểu thức chính quy để tìm một số ORF (khung đọc mở).Cách tìm khung đọc mở trong Python

Tìm một tiểu chuỗi một chuỗi chỉ gồm các chữ cái ATGC (không dấu cách hoặc dòng mới) rằng:

Bắt đầu với ATG, kết thúc bằng TAG hoặc TAA hoặc TGA và nên xem xét các chuỗi từ ký tự đầu tiên, sau đó thứ hai và sau đó thứ ba:

Seq= "CCTCAGCGAGGACAGCAAGGGACTAGCCAGGAGGGAGAACAGAAACTCCAGAACATCTTGGAAATAGCTCCCAGAAAAGC 
AAGCAGCCAACCAGGCAGGTTCTGTCCCTTTCACTCACTGGCCCAAGGCGCCACATCTCCCTCCAGAAAAGACACCATGA 
GCACAGAAAGCATGATCCGCGACGTGGAACTGGCAGAAGAGGCACTCCCCCAAAAGATGGGGGGCTTCCAGAACTCCAGG 
CGGTGCCTATGTCTCAGCCTCTTCTCATTCCTGCTTGTGGCAGGGGCCACCACGCTCTTCTGTCTACTGAACTTCGGGGT 
GATCGGTCCCCAAAGGGATGAGAAGTTCCCAAATGGCCTCCCTCTCATCAGTTCTATGGCCCAGACCCTCACACTCAGAT 
CATCTTCTCAAAATTCGAGTGACAAGCCTGTAGCCCACGTCGTAGCAAACCACCAAGTGGAGGAGCAGCTGGAGTGGCTG 
AGCCAGCGCGCCAACGCCCTCCTGGCCAACGGCATGGATCTCAAAGACAACCAACTAGTGGTGCCAGCCGATGGGTTGTA 
CCTTGTCTACTCCCAGGTTCTCTTCAAGGGACAAGGCTGCCCCGACTACGTGCTCCTCACCCACACCGTCAGCCGATTTG 
CTATCTCATACCAGGAGAAAGTCAACCTCCTCTCTGCCGTCAAGAGCCCCTGCCCCAAGGACACCCCTGAGGGGGCTGAG 
CTCAAACCCTGGTATGAGCCCATATACCTGGGAGGAGTCTTCCAGCTGGAGAAGGGGGACCAACTCAGCGCTGAGGTCAA 
TCTGCCCAAGTACTTAGACTTTGCGGAGTCCGGGCAGGTCTACTTTGGAGTCATTGCTCTGTGAAGGGAATGGGTGTTCA 
TCCATTCTCTACCCAGCCCCCACTCTGACCCCTTTACTCTGACCCCTTTATTGTCTACTCCTCAGAGCCCCCAGTCTGTA 
TCCTTCTAACTTAGAAAGGGGATTATGGCTCAGGGTCCAACTCTGTGCTCAGAGCTTTCAACAACTACTCAGAAACACAA 
GATGCTGGGACAGTGACCTGGACTGTGGGCCTCTCATGCACCACCATCAAGGACTCAAATGGGCTTTCCGAATTCACTGG 
AGCCTCGAATGTCCATTCCTGAGTTCTGCAAAGGGAGAGTGGTCAGGTTGCCTCTGTCTCAGAATGAGGCTGGATAAGAT 
CTCAGGCCTTCCTACCTTCAGACCTTTCCAGATTCTTCCCTGAGGTGCAATGCACAGCCTTCCTCACAGAGCCAGCCCCC 
CTCTATTTATATTTGCACTTATTATTTATTATTTATTTATTATTTATTTATTTGCTTATGAATGTATTTATTTGGAAGGC 
CGGGGTGTCCTGGAGGACCCAGTGTGGGAAGCTGTCTTCAGACAGACATGTTTTCTGTGAAAACGGAGCTGAGCTGTCCC 
CACCTGGCCTCTCTACCTTGTTGCCTCCTCTTTTGCTTATGTTTAAAACAAAATATTTATCTAACCCAATTGTCTTAATA 
ACGCTGATTTGGTGACCAGGCTGTCGCTACATCACTGAACCTCTGCTCCCCACGGGAGCCGTGACTGTAATCGCCCTACG 
GGTCATTGAGAGAAATAA" 

Những gì tôi đã cố gắng:

# finding the stop codon here 

def stop_codon(seq_0): 

     for i in range(0,len(seq_0),3): 
      if (seq_0[i:i+3]== "TAA" and i%3==0) or (seq_0[i:i+3]== "TAG" and i%3==0) or (seq_0[i:i+3]== "TGA" and i%3==0) : 
       a =i+3 

       break 

      else: 
       a = None 

# finding the start codon here 

startcodon_find =[m.start() for m in re.finditer('ATG', seq_0)] 

Làm cách nào tôi có thể tìm cách kiểm tra codon bắt đầu và sau đó tìm codon dừng đầu tiên. Sau đó tìm codon bắt đầu tiếp theo và codon dừng kế tiếp.

Tôi muốn chạy điều này cho ba khung. Như đã đề cập trước đó, ba khung hình sẽ xem xét các ký tự đầu tiên, thứ hai và thứ ba của chuỗi là khởi đầu.

Cũng chuỗi cần được chia thành các phần nhỏ của 3. Có cho nó nên có một số điều như thế này:

ATG TTT AAA ACA AAA TAT TTA TCT AAC CCA ATT GTC TTA ATA ACG CTG ATT TGA 

Bất kỳ trợ giúp sẽ được đánh giá cao.

câu trả lời cuối cùng của tôi:

def orf_find(st0): 

    seq_0="" 
    for i in range(0,len(st0),3): 
     if len(st0[i:i+3])==3: 
      seq_0 = seq_0 + st0[i:i+3]+ " " 

    ms_1 =[m.start() for m in re.finditer('ATG', seq_0)] 
    ms_2 =[m.start() for m in re.finditer('(TAA)|(TAG)|(TGA)', seq_0)] 

    def get_next(arr,value): 
     for a in arr: 
      if a > value: 
       return a 
     return -1 




    codons = [] 
    start_codon=ms_1[0] 
    while (True): 
     stop_codon = get_next(ms_2,start_codon) 
     if stop_codon == -1: 
      break 
     codons.append((start_codon,stop_codon)) 
     start_codon = get_next(ms_1,stop_codon) 
     if start_codon==-1: 
      break 

    max_val = 0 
    selected_tupple =() 
    for i in codons: 
     k=i[1]-i[0] 
     if k > max_val: 
      max_val = k 
      selected_tupple = i 

    print "selected tupple is ", selected_tupple 

    final_seq=seq_0[selected_tupple[0]:selected_tupple[1]+3] 

    print final_seq 
    print "The longest orf length is " + str(max_val) 



output_file = open('Longorf.txt','w') 
output_file.write(str(orf_find(st0))) 

output_file.close() 

Chức năng ghi ở trên không giúp tôi bằng văn bản nội dung trên vào một tập tin văn bản. Tất cả tôi nhận được trong đó là NONE .. Tại sao lỗi này .. Ai có thể giúp?

+0

Bạn phải trở đầu ra từ hàm. Tôi vừa chỉnh sửa câu trả lời của mình. – MoRe

Trả lời

8

Vì bạn đã gắn thẻ nó Biopython Tôi cho rằng bạn biết về Biopython. Bạn đã xem tài liệu chưa? http://biopython.org/DIST/docs/tutorial/Tutorial.html#htoc231 có thể hữu ích.

tôi điều chỉnh mã từ liên kết ở trên một chút để làm việc trên chuỗi của bạn:

from Bio.Seq import Seq 

seq = Seq("CCTCAGCGAGGACAGCAAGGGACTAGCCAGGAGGGAGAACAGAAACTCCAGAACATCTTGGAAATAGCTCCCAGAAAAGCAAGCAGCCAACCAGGCAGGTTCTGTCCCTTTCACTCACTGGCCCAAGGCGCCACATCTCCCTCCAGAAAAGACACCATGAGCACAGAAAGCATGATCCGCGACGTGGAACTGGCAGAAGAGGCACTCCCCCAAAAGATGGGGGGCTTCCAGAACTCCAGGCGGTGCCTATGTCTCAGCCTCTTCTCATTCCTGCTTGTGGCAGGGGCCACCACGCTCTTCTGTCTACTGAACTTCGGGGTGATCGGTCCCCAAAGGGATGAGAAGTTCCCAAATGGCCTCCCTCTCATCAGTTCTATGGCCCAGACCCTCACACTCAGATCATCTTCTCAAAATTCGAGTGACAAGCCTGTAGCCCACGTCGTAGCAAACCACCAAGTGGAGGAGCAGCTGGAGTGGCTGAGCCAGCGCGCCAACGCCCTCCTGGCCAACGGCATGGATCTCAAAGACAACCAACTAGTGGTGCCAGCCGATGGGTTGTACCTTGTCTACTCCCAGGTTCTCTTCAAGGGACAAGGCTGCCCCGACTACGTGCTCCTCACCCACACCGTCAGCCGATTTGCTATCTCATACCAGGAGAAAGTCAACCTCCTCTCTGCCGTCAAGAGCCCCTGCCCCAAGGACACCCCTGAGGGGGCTGAGCTCAAACCCTGGTATGAGCCCATATACCTGGGAGGAGTCTTCCAGCTGGAGAAGGGGGACCAACTCAGCGCTGAGGTCAATCTGCCCAAGTACTTAGACTTTGCGGAGTCCGGGCAGGTCTACTTTGGAGTCATTGCTCTGTGAAGGGAATGGGTGTTCATCCATTCTCTACCCAGCCCCCACTCTGACCCCTTTACTCTGACCCCTTTATTGTCTACTCCTCAGAGCCCCCAGTCTGTATCCTTCTAACTTAGAAAGGGGATTATGGCTCAGGGTCCAACTCTGTGCTCAGAGCTTTCAACAACTACTCAGAAACACAAGATGCTGGGACAGTGACCTGGACTGTGGGCCTCTCATGCACCACCATCAAGGACTCAAATGGGCTTTCCGAATTCACTGGAGCCTCGAATGTCCATTCCTGAGTTCTGCAAAGGGAGAGTGGTCAGGTTGCCTCTGTCTCAGAATGAGGCTGGATAAGATCTCAGGCCTTCCTACCTTCAGACCTTTCCAGATTCTTCCCTGAGGTGCAATGCACAGCCTTCCTCACAGAGCCAGCCCCCCTCTATTTATATTTGCACTTATTATTTATTATTTATTTATTATTTATTTATTTGCTTATGAATGTATTTATTTGGAAGGCCGGGGTGTCCTGGAGGACCCAGTGTGGGAAGCTGTCTTCAGACAGACATGTTTTCTGTGAAAACGGAGCTGAGCTGTCCCCACCTGGCCTCTCTACCTTGTTGCCTCCTCTTTTGCTTATGTTTAAAACAAAATATTTATCTAACCCAATTGTCTTAATAACGCTGATTTGGTGACCAGGCTGTCGCTACATCACTGAACCTCTGCTCCCCACGGGAGCCGTGACTGTAATCGCCCTACGGGTCATTGAGAGAAATAA") 


table = 1 
min_pro_len = 100 

for strand, nuc in [(+1, seq), (-1, seq.reverse_complement())]: 
    for frame in range(3): 
     for pro in nuc[frame:].translate(table).split("*"): 
      if len(pro) >= min_pro_len: 
       print "%s...%s - length %i, strand %i, frame %i" % (pro[:30], pro[-3:], len(pro), strand, frame) 

Các ORF cũng được dịch. Bạn có thể chọn một bảng dịch khác. Kiểm tra http://biopython.org/DIST/docs/tutorial/Tutorial.html#sec:translation

EDIT: Giải thích về các mã:

Ngay ở đầu tôi tạo ra một đối tượng chuỗi ra khỏi chuỗi của bạn. Hãy chú ý đến số seq = Seq("ACGT"). Hai vòng lặp tạo ra 6 khung khác nhau. Vòng lặp bên trong dịch mỗi khung theo bảng dịch đã chọn và trả về một chuỗi axit amin trong đó mỗi codon dừng được mã hóa là *. Hàm split tách chuỗi này loại bỏ các trình giữ chỗ này dẫn đến danh sách các chuỗi protein có thể. Bằng cách thiết lập min_pro_len bạn có thể xác định chiều dài chuỗi axit amin tối thiểu cho một protein được phát hiện. 1 là bảng tiêu chuẩn. Hãy xem http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi#SG1 Ở đây bạn thấy rằng mã khởi đầu là AUG (bằng ATG) và các codon cuối (* trong trình tự nucleotide) là TAA, TAGTGA, giống như bạn muốn. Bạn cũng có thể sử dụng một bảng dịch khác.

Khi bạn thêm

print nuc[frame:].translate(table) 

ngay trong thứ hai cho vòng bạn sẽ có được một cái gì đó như:

PQRGQQGTSQEGEQKLQNILEIAPRKASSQPGRFCPFHSLAQGATSPSRKDTMSTESMIRDVELAEEALPQKMGGFQNSRRCLCLSLFSFLLVAGATTLFCLLNFGVIGPQRDEKFPNGLPLISSMAQTLTLRSSSQNSSDKPVAHVVANHQVEEQLEWLSQRANALLANGMDLKDNQLVVPADGLYLVYSQVLFKGQGCPDYVLLTHTVSRFAISYQEKVNLLSAVKSPCPKDTPEGAELKPWYEPIYLGGVFQLEKGDQLSAEVNLPKYLDFAESGQVYFGVIAL*REWVFIHSLPSPHSDPFTLTPLLSTPQSPQSVSF*LRKGIMAQGPTLCSELSTTTQKHKMLGQ*PGLWASHAPPSRTQMGFPNSLEPRMSIPEFCKGRVVRLPLSQNEAG*DLRPSYLQTFPDSSLRCNAQPSSQSQPPSIYICTYYLLFIYYLFICL*MYLFGRPGCPGGPSVGSCLQTDMFSVKTELSCPHLASLPCCLLFCLCLKQNIYLTQLS**R*FGDQAVATSLNLCSPREP*L*SPYGSLREI 

(chú ý các dấu sao là tại các vị trí dừng codon)

EDIT : Trả lời câu hỏi thứ hai của bạn:

Bạn phải trả về một chuỗi mà bạn muốn ghi vào một tập tin. Tạo một chuỗi đầu ra và gửi lại vào cuối của hàm:

output = "selected tupple is " + str(selected_tupple) + "\n" 
output += final_seq + "\n" 
output += "The longest orf length is " + str(max_val) + "\n" 
return output 
+0

cho tôi lỗi 'STR' không có thuộc tính 'reverse_complement' – Nodnin

+0

bạn có thấy 3 dòng mã đầu tiên tôi đăng không? Có sự chuyển đổi từ chuỗi của bạn thành một đối tượng Sequence. – MoRe

+0

Nhưng tôi không thể thấy, làm thế nào trình tự bắt đầu với "ATG" và kết thúc với codon dừng .. làm thế nào tôi có thể tìm thấy nhiều chất nền trong một khung đọc – Nodnin

9

Nếu bạn muốn trao mã nó:

import re 
from string import maketrans 

pattern = re.compile(r'(?=(ATG(?:...)*?)(?=TAG|TGA|TAA))') 

def revcomp(dna_seq): 
    return dna_seq[::-1].translate(maketrans("ATGC","TACG")) 

def orfs(dna): 
    return set(pattern.findall(dna) + pattern.findall(revcomp(dna))) 

print orfs(Seq) 
Các vấn đề liên quan