문제해결(PS)/ROSALIND

Consensus and Profile(공통서열과 프로파일)

곰탱이장 2024. 7. 26. 18:47

https://rosalind.info/problems/cons/

 

ROSALIND | Consensus and Profile

It appears that your browser has JavaScript disabled. Rosalind requires your browser to be JavaScript enabled. Consensus and Profile solved by 14907 2012년 7월 2일 12:00:00 오전 by Rosalind Team Topics: String Algorithms Finding a Most Likely Common A

rosalind.info

 이 문제는 같은 길이의 여러 개의 서열이 주어졌을 때, 그 서열들의 프로파일과 공통서열을 구하는 문제이다. 공통서열은 서열의 그 자리에서 가장 빈번하게 나온 문자만 고른 서열이다. 프로파일은 각 서열의 그 자리에 어떤 뉴클레오타이드가 몇 번 나왔는지 알리는 매트릭스이다.

 이 문제는 fasta 파일을 먼저 읽어서 서열들만 추출한 이후, 행렬에 문자로 인덱스를 할 수 없으므로 그냥 ACGT를 각각 인덱스 0~3이라 가정하고 프로파일을 만든다. 프로파일은 이후 만들어진 프로파일의 세로열만 추출해서 몇 번째 행인지 찾아내 consensus sequence를 만든다. 자세한 설명은 코드에 주석으로 알려주겠다.

from Bio import SeqIO
import numpy as np

a_2d=[]
for i in SeqIO.parse("rosalind_cons.txt",'fasta'):#파일 속 여러 서열 저장
    a_2d.append(list(str(i.seq)))

acgt = {'A':0,'C':1,'G':2,'T':3}#문자 to 인덱스
racgt = {value: key for key,value in acgt.items()}#인덱스 to 문자

l=len(a_2d[0])
profile=np.zeros((4,l))#0으로 가득찬 프로파일

for st in a_2d:#프로파일 만들기
    for c in range(l):
        r=acgt[st[c]]
        profile[r][c]=profile[r][c]+1

consensus=''
for i in range(l):#consensus 만들기
    col = profile[:,i]
    max_index = np.argmax(col)
    consensus=consensus+racgt[max_index]

print(consensus)#출력

for a in range(4):#형식에 맞게 프로파일 출력 
    raw = profile[a,:]
    print(racgt[a]+':',end=' ')
    for r in raw:
        print(int(r),end=' ')
    print()

 처음에는 이렇게 출력된 결과를 그대로 복사붙여넣기 했으나, 계속 문제를 틀렸다고 했다. 그래서 형식의 문제인 것 같아 출력을 메모장으로 복사붙여넣기 한 이후 .txt 파일로 제출하여 정답처리를 받았다.