챕터 21 본편: SAM/BAM 파일 처리
SAM/BAM 파일 처리 실습
개요
이 장에서는 시퀀스 정렬 결과인 SAM/BAM 파일의 구조를 이해하고 samtools를 사용한 처리 방법을 다룬다.
실습 환경 구성
conda를 사용하여 samtools를 설치한다.
$ conda activate bioinfo
$ conda install samtools
SAM/BAM 파일 형식
SAM 파일 구조
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 필드
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 문자열
CIGAR는 정렬 상태를 압축하여 표현한다.
| 문자 | 의미 |
|---|---|
| M | 매치 또는 미스매치 |
| I | 삽입 (read에만 존재) |
| D | 삭제 (참조에만 존재) |
| N | 스킵 영역 (RNA-seq 인트론) |
| S | 소프트 클리핑 |
| H | 하드 클리핑 |
예시: 50M2I30M은 50bp 매치, 2bp 삽입, 30bp 매치를 의미한다.
BAM 형식
BAM은 SAM의 바이너리 압축 형식이다. 파일 크기가 작고 처리 속도가 빠르다. 일반적으로 BAM 형식으로 저장하고 필요시 SAM으로 변환하여 확인한다.
samtools 기본 명령
파일 변환
SAM을 BAM으로 변환:
$ samtools view -bS aligned.sam > aligned.bam
BAM을 SAM으로 변환하여 확인:
$ samtools view aligned.bam | less
헤더와 함께 출력:
$ samtools view -h aligned.bam | less
정렬 (sorting)
좌표 기준 정렬:
$ 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 파일 필터링
특정 영역 추출
인덱스가 있는 BAM 파일에서 특정 영역만 추출:
$ samtools view aligned.sorted.bam chr1:1000000-2000000
FLAG 기반 필터링
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를 이용한 시각화
IGV(Integrative Genomics Viewer)는 BAM 파일을 시각적으로 확인할 수 있는 도구이다.
IGV 설치
IGV는 https://igv.org/doc/desktop/ 에서 다운로드할 수 있다.
BAM 파일 로드
-
참조 유전체를 선택한다 (Genomes > Load Genome).
-
BAM 파일을 로드한다 (File > Load from File).
-
관심 영역으로 이동하여 정렬 결과를 확인한다.
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
실습 과제
실습 21.1: SAM 파일 구조 이해
-
SAM 파일을 열어 헤더와 정렬 레코드를 확인한다.
-
특정 read의 FLAG 값을 해석한다.
-
CIGAR 문자열이 의미하는 정렬 상태를 설명한다.
실습 21.2: samtools 기본 사용
-
SAM 파일을 BAM으로 변환한다.
-
BAM 파일을 좌표 기준으로 정렬한다.
-
인덱스를 생성한다.
-
flagstat으로 통계를 확인한다.
실습 21.3: 필터링과 시각화
-
특정 염색체 영역의 read만 추출한다.
-
맵핑 품질 20 이상인 read만 추출한다.
-
IGV에서 BAM 파일을 로드하여 정렬 결과를 확인한다.
출처
이 본편 글은 원본 docx에 기록된 아래 출처를 기준으로 게시했습니다.
- 원본 문서: https://chaek.org/books/introduction-to-biomedical-informatics
- 원본 저장소: https://github.com/chaek-union/introduction-to-biomedical-informatics
- 원본 파일:
practices/21-sam-bam.md
문제 풀이
Chapter 21. SAM/BAM 파일 처리
주관식 답안은 Gemini API로 채점합니다. API 키는 이 브라우저에만 저장됩니다.
-
1. [쉬움] 객관식
SAM 헤더 태그와 설명의 연결로 옳은 것을 고르시오.
-
2. [쉬움] 객관식
SAM 정렬 레코드의 11개 필수 필드에 대한 설명으로 옳은 것을 고르시오.
-
3. [쉬움] 객관식
FLAG=99의 해석으로 본편에 제시된 내용과 일치하는 것을 고르시오.
-
4. [쉬움] 객관식
CIGAR 문자열
50M2I30M의 의미로 옳은 것을 고르시오. -
5. [보통] 객관식
SAM 파일을 BAM 파일로 변환하는 명령어로 옳은 것을 고르시오.
-
6. [보통] 객관식
BAM 파일을 SAM 형식으로 헤더와 함께 확인하는 명령어로 옳은 것을 고르시오.
-
7. [보통] 객관식
좌표 기준 정렬, 인덱싱, 기본 통계 확인 명령어의 조합으로 옳은 것을 고르시오.
-
8. [보통] 객관식
FLAG 및 품질 기반 필터링 옵션에 대한 설명으로 옳은 것을 고르시오.
-
9. [보통] 객관식
FLAG 계산 문제이다. paired(1), properly paired(2), reverse strand(16), first in pair(64)가 설정된 read의 FLAG 값은 얼마인가?
-
10. [어려움] 객관식
CIGAR 문자열
10S80M5D10M의 해석으로 옳은 것을 고르시오. -
11. [어려움] 객관식
다음 SAM 레코드 일부에서 read가 정렬된 참조 서열과 시작 위치로 옳은 것을 고르시오.
read001 99 chr1 1000 60 50M = 1100 200 ACGT... IIII... -
12. [어려움] 객관식
중복 표시와 제거에 대한 설명으로 옳은 것을 고르시오.
-
13. [어려움] 객관식
특정 영역 추출과 IGV 시각화 흐름에 대한 설명으로 옳은 것을 고르시오.
-
14. [어려움] 객관식
전체 파이프라인 예시에 포함된 순서로 가장 적절한 것을 고르시오.
-
주관식 1. [쉬움] 주관식 · Gemini 채점
aligned.sam을aligned.bam으로 변환하고, 좌표 기준으로 정렬하여aligned.sorted.bam으로 저장한 뒤, 인덱스를 생성하고 기본 통계를 확인하는 명령어를 순서대로 작성하시오. -
주관식 2. [쉬움] 주관식 · Gemini 채점
aligned.bam을 SAM 형식으로 헤더와 함께 출력하여less로 확인하는 명령어를 작성하시오. -
주관식 3. [보통] 주관식 · Gemini 채점
인덱스가 있는
aligned.sorted.bam에서chr1:1000000-2000000영역만 추출하는 명령어를 작성하시오. -
주관식 4. [보통] 주관식 · Gemini 채점
aligned.sorted.bam에서 mapped read만mapped.bam으로 저장하고, properly paired read만proper_pairs.bam으로 저장하며, 맵핑 품질 20 이상인 read만high_quality.bam으로 저장하는 명령어를 작성하시오. -
주관식 5. [어려움] 주관식 · Gemini 채점
FLAG 값 83을 본편의 방식처럼 비트 조합으로 분해하고 read 상태를 설명하시오.
-
주관식 6. [어려움] 주관식 · Gemini 채점
정렬된 BAM에서 중복 표시 → 인덱스 생성 → 통계 확인을 수행하는 명령어를 작성하시오.
-
주관식 7. [어려움] 주관식 · Gemini 채점
IGV에서 BAM 파일을 확인하는 절차와 화면에서 해석할 수 있는 정보를 설명하시오.