카테고리 없음

RNA Splicing(RNA 스플라이싱)

곰탱이장 2024. 8. 17. 15:23

https://rosalind.info/problems/splc/

 

ROSALIND | RNA Splicing

It appears that your browser has JavaScript disabled. Rosalind requires your browser to be JavaScript enabled. RNA Splicing solved by 9177 2012년 7월 24일 12:00:00 오전 by Rosalind Team Topics: String Algorithms Genes are Discontiguous Figure 1. The e

rosalind.info

Problem

After identifying the exons and introns of an RNA string, we only need to delete the introns and concatenate the exons to form a new string ready for translation.

Given: A DNA string ss (of length at most 1 kbp) and a collection of substrings of ss acting as introns. All strings are given in FASTA format.

Return: A protein string resulting from transcribing and translating the exons of ss. (Note: Only one solution will exist for the dataset provided.)

Sample Dataset

>Rosalind_10
ATGGTCTACATAGCTGACAAACAGCACGTAGCAATCGGTCGAATCTCGAGAGGCATATGGTCACATGATCGGTCGAGCGTGTTTCAAAGTTTGCGCCTAG
>Rosalind_12
ATCGGTCGAA
>Rosalind_15
ATCGGTCGAGCGTGT

Sample Output

MVYIADKQHVASREAYGHMFKVCA

 

 이 문제는 여러 개의 서열이 들어있는 fasta 파일을 주고 이 파일의 첫 번째가 스플라이싱 해야할 RNA이고 그 이후는 인트론의 서열들이 주어진다. 즉 첫 번째 RNA 중 뒤의 RNA 서열들을 제거해야 한다. 

 필자는 이 문제를 두 가지 방식을 이용하여 풀었다. 하나는 파이썬의 내장모듈들을 사용해서 푸는 방식. 다른 하나는 KMP 알고리즘을 이용하여 푸는 방식이다. 실상 내장모듈이 그러한 알고리즘을 이용하니 어떻게 푸나 똑같다.

 파이썬의 내장함수 문자열.replace()를 사용하면 손 쉽게 문자열 안의 타겟 문자열을 다른 걸로 바꿀 수 있다.

from Bio import SeqIO

subseq_lst=[]
file = SeqIO.parse(r'파일경로','fasta')
for i in file:
    subseq_lst.append(i.seq)
ori_seq=subseq_lst.pop(0)

for i in subseq_lst:
    ori_seq=ori_seq.replace(i,'')#인트론을 제거

print(ori_seq.translate(to_stop=True))#생물학적 룰을 따라 번역

  

 위의 방식대로 푸는 것이 편하긴 하나 필자는 KMP알고리즘이 쓰고 싶어 KMP알고리즘을 이용하여 문제를 푸는 방법도 서술해놓겠다.

from Bio import SeqIO

def get_pi(seq):#pi배열을 구하기
    pi=[]
    for i in range(1,len(seq)+1):
        part_seq = seq[:i]
        f=0
        for fix in range(1,i//2+1):
            if part_seq[:fix] == part_seq[-(fix):]:
                f=len(part_seq[:fix])
        pi.append(f)

    return pi

def KMP(ori,want,pi):#KMP알고리즘
    ind=0
    while True:
        p=0
        if ind>len(ori)-1:
            break
        for ima in range(0,len(want)):
            if ind+ima>len(ori)-1 or (want[ima] != ori[ind+ima]):
                break
            p=p+1
        if p==len(want):
            ind_lst.append([ind,ind+len(want)])#시작과 끝 저장
        ind+=pi[p-1]+1
    return(ind_lst)

subseq_lst=[]

file = SeqIO.parse(r'파일경로','fasta')
for i in file:
    subseq_lst.append(i.seq)
ori_seq=subseq_lst.pop(0)
ind_lst=[]
for sub in subseq_lst:
    pi=get_pi(sub)
    ind_lst=KMP(ori_seq,sub,pi)


ind_lst.sort(key=lambda x:x[0],reverse=True)#크기순으로 내림차순으로 정렬
for start,end in ind_lst:
    ori_seq=ori_seq[:start]+ori_seq[end:]#뒤에서부터 잘라가면 앞의 인덱스는 영향 안 받음

print(ori_seq.translate(to_stop=True))#생물학적 룰을 따라 번역