728x90
๋ฌธ์ ์ค๋ช
Motif๋ ๋น์ทํ ์์ด์ ๊ฐ์ง์ผ๋ก์ ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ ๊ฒ์ผ๋ก ์๋ ค์ง DNA ๋ด์ ์งง์ ์์ด๋ค์ด๋ค. ์๋ฅผ ๋ค์ด, A๋ผ๋ ๋จ๋ฐฑ์ง์ด DNA์ ๊ฒฐํฉํ๋ ์์น๋ DNA ์์์ ์ฌ๋ฌ ์์น์ ์กด์ฌํ์ง๋ง ๋ชจ๋ ๋น์ทํ ์์ด์ ๊ฐ์ ธ์ผ A๊ฐ ๊ฒฐํฉํ ์ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง motif๋ 100% ๋๊ฐ์ ์์ด์ด ์๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ motif๋ฅผ ์ฐพ๊ธฐ ์ํด์๋ ์ด๋ ์ ๋ ์ผ๊ธฐ์์ด์ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
์ด ๋ฌธ์ ์์๋ (k, d)-motif๋ฅผ ์ฐพ๋๋ฐ ์ฌ๊ธฐ์ k๋ k ๊ธธ์ด๋ฅผ ๊ฐ์ง motif๋ฅผ ๋ปํ๊ณ , d๋ ์ต๋ d ๊ฐ์๋งํผ ์ผ๊ธฐ์์ด ์ฐจ์ด๊ฐ ์์ ์ ์๋ค๋๊ฑธ ๋ปํ๋ค. ์ด๋ฌํ (k, d)-motif๋ ์์ด์ ์ง์ ์กด์ฌํ์ง ์์ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ๊ฐ ์ฐพ์ 15 bp ๊ธธ์ด๋ฅผ ๊ฐ์ง (k, d)-motif๊ฐ AAAAAAAAGGGGGGG ์ผ ๋, ์ ์ฌํ motif๋ค์ AgAAgAAAGGttGGG์ cAAtAAAAcGGGGcG ์ผ ์ ์๋ค. ๋ ์์ด์ (k, d)-motif์์ 4๊ฐ์ ์ผ๊ธฐ์์ด ๋ฐ์ ์ฐจ์ด๊ฐ ๋์ง ์์ง๋ง ์๋ก๋ฅผ ๋น๊ตํ์ ๋๋ 8๊ฐ์ ์ผ๊ธฐ์์ด์ ์ฐจ์ด๊ฐ ์๋ค.
์ด๋ ๊ฒ (k, d)-motif๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ ์ค์ ์์ด์๋ ์์ ์๋ ์๋ motif ์์ด์ ์ฐพ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ motif๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ง๋๋ ๊ฒ์ด ์ข ๋ ๊น๋ค๋ก์ธ ์ ์๋ค.
๋ฌธ์ (ํ์ด๋ณด๊ธฐ)
์ฒซ ์ค์ k์ d ๊ฐ์ด ์ฃผ์ด์ง๊ณ , ๋๋จธ์ง ์ค์๋ ์ฌ๋ฌ DNA ์์ด๋ค์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋ ์์ด์ด ๊ณตํต์ ์ผ๋ก ๊ฐ์ง (k, d)-motif๋ฅผ ๋ชจ๋ ์ฐพ์ผ์์ค.
์์
3 1
ATTTGGC
TGCCTTA
CGGTATC
GAAAATT
์์ ๊ฒฐ๊ณผ
ATA ATT GTT TTT
ํด๊ฒฐ
# a์ b ์์ด์์ ์ฐจ์ด๋๋ ์ผ๊ธฐ์์ด ๊ฐ์๋ฅผ ๋ฐํํ๋ ํจ์
def hamming_dist(a, b):
return sum(map(lambda x: x[0] != x[1], zip(a, b)))
# d ์ฐจ์ด๋๋ ๋ชจ๋ k-mer ์ฐพ๋ ํจ์
def neighbors(pattern, d):
if d == 0:
return [pattern]
if len(pattern) == 1:
return ['A', 'C', 'T', 'G']
neighborhood = []
suffix_neighbors = neighbors(pattern[1:], d)
for suffix in suffix_neighbors:
# d ๋ณด๋ค ์์ผ๋ฉด ์์ง ์ต์ 1๊ฐ๋ ๋ ๋ฌ๋ผ๋ ๋๋ค๋ ๋ป์ด๋๊น ์์ A,C,T,G๋ฅผ ๋ค ๋ถ์ฌ๋ด๋ ๋จ
if hamming_dist(pattern[1:], suffix) < d:
for nuc in ['A', 'C', 'T', 'G']:
neighborhood.append(nuc + suffix)
# d๋ ๊ฐ๋ค๋ฉด ๋ ์ด์ mismatch๊ฐ ์์ผ๋ฉด ์๋๊ธฐ ๋๋ฌธ์ ์๋ pattern์ ์๊ธ์๋ง ๋ํด์ค
else:
neighborhood.append(pattern[0] + suffix)
return neighborhood
# ๋ชจ๋ k-mer์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ ํจ์
def get_kmers(k, dna):
kmers = []
for i in range(len(dna) - k + 1):
kmers.append(dna[i:i+k])
return kmers
# (k, d)-motif ์ฐพ๋ ํจ์
def motif_enumeration(k, d, dnas):
kmers = get_kmers(k, dnas[0]) # ์ฒซ๋ฒ์งธ ์์ด์ ๋ชจ๋ kmer ์ฐพ๊ธฐ
kd_motifs = []
for kmer in kmers:
neighborhood = neighbors(kmer, d)
for neighbor in neighborhood:
available = [1] + [0 for i in range(len(dnas) - 1)]
for i in range(1, len(dnas)):
if neighbor in ' '.join(neighbors(dnas[i], d)):
available[i] = 1
if sum(available) == len(dnas):
kd_motifs.append(neighbor)
return set(kd_motifs)
# ์
๋ ฅ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
given = []
with open('rosalind_ba2a.txt', 'r') as f:
for line in f.readlines():
given.append(line.strip())
# ์ฝ๋ ์คํํ๊ธฐ
k, d = map(int, given[0].split())
motifs = motif_enumeration(k, d, given[1:])
print(' '.join(motifs))
์ฐธ๊ณ
https://www.bioinformaticsalgorithms.org/bioinformatics-chapter-2
'๐งฌ Biology > ๋ฐ์ด์ค ์ฝ๋ฉ ๋ฌธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ROSALIND] ํจํด์ ์ซ์๋ก (0) | 2023.07.01 |
---|---|
[ROSALIND] ์ ํ ์๋ฆฌ(restriction site) ์ฐพ๊ธฐ (0) | 2023.06.16 |
[ROSALIND] ๋ถ๋ถ์ ์์ด (0) | 2023.06.15 |
[ROSALIND] Open reading frame (6-frame ๋ฒ์ญํ๊ธฐ) (0) | 2023.05.30 |
[ROSALIND] ๋จ๋ฐฑ์ง ์์ด์์ mRNA ์์ด ์์ธกํด๋ณด๊ธฐ (0) | 2023.05.29 |
๋๊ธ