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 파일로 제출하여 정답처리를 받았다.
'문제해결(PS) > ROSALIND' 카테고리의 다른 글
Overlap Graphs (오버랩 그래프) (0) | 2024.07.28 |
---|---|
Mortal Fibonacci Rabbits(수명이 있는 피보나치 토끼들) (0) | 2024.07.27 |
Mendel's First Law(맨델의 첫 번째 법칙) (0) | 2024.07.21 |
Counting Point Mutations(점 돌연변이 세기) (0) | 2024.07.21 |
Computing GC Content (GC비율 계산하기) (0) | 2024.07.21 |