이 장에서는 시퀀스 정렬 결과인 SAM/BAM 파일의 구조를 이해하고 samtools를 사용한 처리 방법을 다룬다.
conda를 사용하여 samtools를 설치한다.
$ conda activate bioinfo
$ conda install samtools
SAM(Sequence Alignment/Map)은 정렬 결과를 저장하는 텍스트 형식이다. 헤더와 정렬 레코드로 구성된다.
헤더 예시:
@HD VN:1.6 SO:coordinate
@SQ SN:chr1 LN:248956422
@RG ID:sample1 SM:sample1 PL:ILLUMINA
@PG ID:bwa-mem2 PN:bwa-mem2 VN:2.2.1
헤더 태그:
| 태그 | 설명 |
|---|---|
| @HD | 헤더 정보 (버전, 정렬 순서) |
| @SQ | 참조 서열 정보 (이름, 길이) |
| @RG | Read Group 정보 |
| @PG | 프로그램 정보 |
각 read의 정렬 정보는 탭으로 구분된 11개의 필수 필드로 구성된다.
| 필드 | 이름 | 설명 |
|---|---|---|
| 1 | QNAME | Read 이름 |
| 2 | FLAG | 비트 플래그 |
| 3 | RNAME | 참조 서열 이름 |
| 4 | POS | 정렬 시작 위치 (1-based) |
| 5 | MAPQ | 맵핑 품질 |
| 6 | CIGAR | 정렬 정보 |
| 7 | RNEXT | 짝 read의 참조 서열 |
| 8 | PNEXT | 짝 read의 위치 |
| 9 | TLEN | 템플릿 길이 |
| 10 | SEQ | 서열 |
| 11 | QUAL | 품질 점수 |
FLAG 필드는 read의 상태를 비트 플래그로 표현한다.
| 값 | 의미 |
|---|---|
| 1 | paired-end 시퀀싱 |
| 2 | properly paired |
| 4 | unmapped |
| 8 | mate unmapped |
| 16 | reverse strand |
| 32 | mate reverse strand |
| 64 | first in pair (R1) |
| 128 | second in pair (R2) |
| 256 | secondary alignment |
| 512 | failed QC |
| 1024 | duplicate |
| 2048 | supplementary alignment |
여러 상태가 조합되면 값을 더한다. 예를 들어 FLAG=99는 paired(1) + properly paired(2) + mate reverse(32) + first in pair(64) = 99이다.
CIGAR는 정렬 상태를 압축하여 표현한다.
| 문자 | 의미 |
|---|---|
| M | 매치 또는 미스매치 |
| I | 삽입 (read에만 존재) |
| D | 삭제 (참조에만 존재) |
| N | 스킵 영역 (RNA-seq 인트론) |
| S | 소프트 클리핑 |
| H | 하드 클리핑 |
예시: 50M2I30M은 50bp 매치, 2bp 삽입, 30bp 매치를 의미한다.
BAM은 SAM의 바이너리 압축 형식이다. 파일 크기가 작고 처리 속도가 빠르다. 일반적으로 BAM 형식으로 저장하고 필요시 SAM으로 변환하여 확인한다.
SAM을 BAM으로 변환:
$ samtools view -bS aligned.sam > aligned.bam
BAM을 SAM으로 변환하여 확인:
$ samtools view aligned.bam | less
헤더와 함께 출력:
$ samtools view -h aligned.bam | less
좌표 기준 정렬:
$ samtools sort -o aligned.sorted.bam aligned.bam
Read 이름 기준 정렬:
$ samtools sort -n -o aligned.namesorted.bam aligned.bam
정렬된 BAM 파일에 인덱스를 생성하면 특정 영역을 빠르게 조회할 수 있다.
$ samtools index aligned.sorted.bam
인덱스 파일 .bai가 생성된다.
기본 통계:
$ samtools flagstat aligned.sorted.bam
상세 통계:
$ samtools stats aligned.sorted.bam > stats.txt
인덱스가 있는 BAM 파일에서 특정 영역만 추출:
$ samtools view aligned.sorted.bam chr1:1000000-2000000
mapped read만 추출 (-F 4는 unmapped 제외):
$ samtools view -F 4 aligned.sorted.bam > mapped.bam
properly paired read만 추출:
$ samtools view -f 2 aligned.sorted.bam > proper_pairs.bam
주요 옵션:
| 옵션 | 설명 |
|---|---|
-f |
해당 FLAG가 설정된 read만 포함 |
-F |
해당 FLAG가 설정된 read 제외 |
-q |
최소 맵핑 품질 |
맵핑 품질 20 이상인 read만 추출:
$ samtools view -q 20 aligned.sorted.bam > high_quality.bam
PCR 중복은 라이브러리 준비 과정에서 발생하며, 분석 전에 표시하거나 제거해야 한다.
$ samtools markdup aligned.sorted.bam marked.bam
중복 제거:
$ samtools markdup -r aligned.sorted.bam dedup.bam
IGV(Integrative Genomics Viewer)는 BAM 파일을 시각적으로 확인할 수 있는 도구이다.
IGV는 https://igv.org/doc/desktop/ 에서 다운로드할 수 있다.
IGV에서 각 read는 막대로 표시되며, 색상은 방향이나 매핑 품질을 나타낸다. 변이가 있는 위치는 다른 색으로 표시된다.
Fastq에서 분석 가능한 BAM까지의 전체 과정:
# 정렬 및 BAM 변환
$ bwa-mem2 mem -t 8 -R '@RG\tID:sample1\tSM:sample1\tPL:ILLUMINA' \
hg38.fa R1.fastq.gz R2.fastq.gz | samtools sort -o aligned.sorted.bam
# 인덱싱
$ samtools index aligned.sorted.bam
# 중복 표시
$ samtools markdup aligned.sorted.bam marked.bam
$ samtools index marked.bam
# 통계 확인
$ samtools flagstat marked.bam