2012-10-28 19 views
12

私はORF(オープンリーディングフレーム)を見つけるためにPythonと正規表現を使用しています。 TAGまたはTAAまたはTGAで終わる、ATGPythonでオープンリーディングフレームを見つける方法

開始からの順序を考慮する必要があります。

ONLY文字ATGC(スペースや改行)が構成された文字列を部分文字列を検索します第3その後、第2および第1の文字は、:

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

私がしようとしているもの:

# 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)] 

どのようにして開始コドンを確認し、最初の停止コドンを見つけるかを見つけることができます。その後、次の開始コドンおよび次の停止コドンを見出す。

これを3つのフレームで実行します。前述したように、3つのフレームは、シーケンスの最初、2番目、3番目の文字を開始とみなします。

またシーケンスは、このようないくつかのものでなければなりませんのためにそこに3の小さな部分に分割する必要があります。

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

任意の助けが理解されるであろう。

私の最終的な答え:

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() 

上記書き込み機能は、テキストファイルに上のコンテンツを書面で私を助けていません。私はそこには誰もいません..なぜこのエラー..誰でも助けることができますか?

+0

。私はちょうど私の答えを編集しました。 – MoRe

答えて

8

Biopythonとタグ付けしたので、私はあなたがBiopythonについて知っていると思います。あなたはまだ文書をチェックアウトしましたか? http://biopython.org/DIST/docs/tutorial/Tutorial.html#htoc231が役に立ちます。

私は、上記のリンクからコードをあなたのシーケンスで動作するように少し調整:

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) 

ORFも翻訳されています。別の変換テーブルを選択することができます。私はあなたの文字列のうち、シーケンス・オブジェクトを作成上部に

右:コードの説明:http://biopython.org/DIST/docs/tutorial/Tutorial.html#sec:translation

EDITをチェックしてください。 seq = Seq("ACGT")に注目してください。 2つのforループが6つの異なるフレームを作成します。内側forループは、選択された翻訳テーブルに従って各フレームを翻訳し、各停止コドンが*としてコードされるアミノ酸鎖を戻す。 split関数は、これらのプレースホルダを削除してこの文字列を分割し、可能なタンパク質配列のリストを生成します。 min_pro_lenを設定することにより、検出されるタンパク質の最小アミノ酸鎖長を定義することができます。 1が標準表です。チェックアウトhttp://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi#SG1開始コドンがAUGATGに等しい)であり、最後のコドン(ヌクレオチド配列で*)がTAA,TAG、およびTGAであることがわかります。別の変換テーブルを使用することもできます。

EDIT(終止コドンの位置にあるアスタリスクを気づか)

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

あなたはforループ秒内

print nuc[frame:].translate(table) 

右追加するときに、あなたのような何かを得ます:あなたの2番目の質問への回答:

ファイルに書き込む文字列を返す必要があります。出力文字列を作成し、関数の最後でそれを返す:

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

私に「STR」の属性に 'reverse_complement'がありません – Nodnin

+0

私が投稿したコードの最初の3行に気づきましたか?あなたの文字列からSequenceオブジェクトへの変換があります。 – MoRe

+0

しかし、私は見ることができません。どのように配列が "ATG"で始まり、終止コドンで終わるでしょうか?1つのリーディングフレームで複数の部分文字列を見つけるにはどうすればいいですか? – Nodnin

9

をあなたはそれをコードに手にしたい場合は:あなたは、関数からの出力を返す必要が

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) 
関連する問題