2012-10-28 4 views
12

파이썬과 정규 표현식을 사용하여 ORF (오픈 독서 프레임)을 찾습니다. TAG 또는 TAA 또는 TGA로 끝나는, ATGPython에서 오픈 독서 프레임을 찾는 방법

시작과에서 순서를 고려해야합니다

만 문자 ATGC (공백이나 새 라인)이 구성되는 문자열을 하위 문자열 찾기 다음 세 번째 다음 두 번째와 첫 번째 문자는 :

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

시작 코돈을 확인하고 첫 번째 종료 코돈을 찾는 방법을 어떻게 찾을 수 있습니까? 이어서 다음 시작 코돈과 다음 종결 코돈을 찾습니다.

세 개의 프레임에 대해 실행하고 싶습니다. 앞에서 언급했듯이 세 프레임은 시퀀스의 첫 번째, 두 번째 및 세 번째 문자를 시작으로 간주합니다. 어떤 도움을 이해할 수있을 것이다

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

:

또한 순서는이 같은 어떤 것을해야 거기 3. 작은 부분으로 구분 될 필요가있다.

내 최종 답변은 :

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")에 주목하십시오. 두 개의 for-loop는 6 개의 다른 프레임을 만듭니다. inner for-loop는 선택한 변환 테이블에 따라 각 프레임을 변환하고 각 종료 코돈이 *으로 코딩 된 아미노산 사슬을 반환합니다. split 함수는이 문자열을 분할하여 이러한 자리 표시자를 제거하여 가능한 단백질 시퀀스 목록을 만듭니다. min_pro_len을 설정하면 검출 할 단백질의 최소 아미노산 사슬 길이를 정의 할 수 있습니다. 1이 표준 표입니다. 체크 아웃 http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi#SG1 여기에 시작 코돈은 AUG (같음 ATG)이고 원하는 코돈과 같게 TAA, TAGTGA입니다. 다른 번역 표를 사용할 수도 있습니다.

EDIT (정지 코돈 위치에있는 별표를 통지)

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

:

당신을위한 루프 제 2 내측

print nuc[frame:].translate(table) 

바로 추가 할 때 같은 얻을 : 두 번째 질문에 대한 답변 :

파일에 쓸 문자열을 반환해야합니다. 를 출력 문자열을 만들고 함수의 끝에 반환 :

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"로 시작하고 종료 코돈으로 끝날 것인가? 하나의 읽기 프레임에서 여러 부분 문자열을 찾을 수있는 방법 – 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)