FASTA : 생물학적 서열에 대한 공통 포맷
각 FASTA 문자열은 '>' 로 시작하는 header line 으로 시작한다.
그 다음에는 여러 줄의 문자열 데이터가 들어오는데,
DNA 는 ACGT 로 구성된 문자열이
RNA 는 ACGU 로 구성된 문자열이
단백질은 ACDEFGHIKLMNOPQRSTUVWY 로 구성된 문자열이 주어진다.
하나의 문자열은 또 다른 header line 을 만나거나 EOF 신호를 만나면 끝난다.
따라서 하나의 FASTA 파일에는 여러 시퀀스가 존재할 수 있다.
또한 각 시퀀스는 0-index 가 아니라 1-index 형태를 따른다.
예를 들어 SARS-COV-2Wuhan.fasta 파일을 보면 첫 줄에는 > 로 시작하는 헤더라인이 있다.
그 다음줄에는 ATCG 로 구성된 DNA 염기서열이 주어지며, 이 염기서열은 우한에서 발생한 초기 코로나 바이러스의 염기서열을 보여준다.
(근데 코로나 바이러스는 RNA 바이러스 아닌가?)
def loadFasta(filename):
""" Parses a classically formatted and possibly
compressed FASTA file into two lists. One of
headers and a second list of sequences.
The ith index of each list correspond."""
if (filename.endswith(".gz")):
fp = gzip.open(filename, 'r')
else:
fp = open(filename, 'r')
# split at headers
data = fp.read().split('>')
fp.close()
# ignore whatever appears before the 1st header
data.pop(0)
headers = []
sequences = []
for sequence in data:
lines = sequence.split('\n')
headers.append(lines.pop(0))
# add an extra "+" to make string "1-referenced"
sequences.append('+' + ''.join(lines))
return (headers, sequences)
다음 코드는 fasta 파일에서 DNA 정보를 읽어오는 함수를 보여준다.
앞으로 자주 사용할 함수이다.
먼저 주어진 데이터를 '>' 로 쪼갠다.
각 데이터에를 개행 문자로 쪼개고, 첫번째 줄은 header 로, 나머지 줄들은 하나로 합친 뒤 맨 앞에 + 문자를 붙여서 sequences 배열에 추가한다.
+ 를 붙이는 이유는 0-index 대신 1-index 를 사용하기 위함이다.
이제 이 DNA 염기 서열을 탐색해보자.
Genome 문자열을 분석할 때는 그 부분 문자열로 쪼개서 분석한다.
이때 길이가 k 인 부분 문자열을 가리켜, k-mer 라고 부른다.
k-mers 의 통계와 패턴을 통해서 Genome 의 조직 형태와 각각의 국소적인 기능을 알아낼 수 있다.
k-mers 에 대해서는 다음의 2가지 규칙이 존재한다.
1. DNA의 k-mers 로 가능한 모든 경우의 수는 4 ** k 이다. (ACGT 중에서 k 번 선택하는 중복 순열)
2. 길이가 N 인 문자열에는 N - k + 1 의 k-mers 가 존재한다.
ex) ACGTACGT 에는 5-mer 가 몇 개 있을까?
8 - 5 + 1 = 4 개 있다.
ACGTA
CGTAC
GTACG
TACGT
다음 그림은 어떤 DNA 염기 서열에서 3-mer 부터 24-mer 까지를 구한 결과이다.
k = 3 일 때 DNA 에서 발견한 k-mer 은 64 종류가 발견되었다.
k = 3 일 때 가능한 모든 k-mers 의 경우의 수는 4 ** 3 = 64 가지 이므로, 모든 종류의 k-mers 가 존재함을 알 수 있다.
k = 5 일 때 처음으로 발견한 가짓수와 전체 가능한 가짓수 사이에 차이가 발생하기 시작했다. CGGGG 라는 조합이 존재하지 않는다.
이후로는 존재하지 않는 경우의 수가 점점 증가하고, 반복적으로 등장하는 k-mers 의 개수는 줄어든다.
SARS-COV2 DNA 에서 6-mers 의 등장횟수를 x축으로 하고, 해당 횟수 만큼 등장한 6-mer 가짓수를 y 축으로 하는 그래프를 그려보면
이렇게 보인다고 한다.
이 그림은 1번만 등장한 6-mers 는 432개 있고, 430 개의 6-mers 는 2번 등장했고, 3번 등장한 것, 4번 등장한 것으로 갈 수록 점점 개수가 적어진다.
40번 이상 등장한 6-mers 는 2개 밖에 없다. (TTGTTA 42번, TGTTAA 41 번)
이런 개수 분포는 과연 일반적일까? 아니면 특별한 경우일까?
SARS-COV2 와 같은 길이를 갖는 랜덤한 DNA를 만들어서 똑같이 6-mers의 분포를 그려보았다.
랜덤 DNA 서열에서는 유일한 6-mers 의 개수가 훨씬 더 적었다.
또한 대부분의 6-mers 는 대략적으로 7번 나타났다.
또한 25번 이상 반복되는 6-mer 은 굉장히 드물었다.
따라서 바이러스의 DNA 서열은 단순한 랜덤 패턴과는 달랐다.
(바이러스에서는 1번만 등장하는 unique 한 k-mer 가 매우 많았지만, 랜덤 분포에서는 평균적으로는 7번씩 등장하기 때문)
바이러스는 spkie 단백질을 통해 세포 수용체에 결합하여 세포 내로 들어온 뒤 그 안에서 세포의 자원을 이용해 증식한다.
따라서 백신을 만들 때는 spike 단백질과 유사한 형태의 단백질을 미리 주입하여 면역 시스템을 적응시킨다.
주어진 FASTA 데이터에서 spike 유전자의 염기서열을 확인해보자.
'S' 라는 키가 가리키는 인덱스 범위가 spike 유전자의 염기서열이다.
3822 글자의 매우 긴 ACGT 로 구성된 문자열이 나타난다.
이를 위와 같은 dictionary 를 사용하여 코돈으로 번역하면 다음과 같다.
그런데 코로나 바이러스 이후에 오미크론 변이가 나타났다.
오미크론 바이러스는 기존의 우한 바이러스와 비교하여 단 6개의 아미노산이 달랐다.
하지만 이 차이가 매우 큰 차이를 만들어낸다.
이처럼 염기서열의 분석을 통해 우리는 유전자와 genome 을 파악할 수 있다.
'CS > 문제해결기법' 카테고리의 다른 글
6. Advanced Sequence Alignment (0) | 2024.10.29 |
---|---|
5. Aligning Sequences (0) | 2024.10.29 |
4. Finding TFBS Motifs in our lifetime (0) | 2024.10.29 |
3. Searching Pattern (0) | 2024.10.29 |
1. Bioinformatics (1) | 2024.10.28 |