[서열분석개론] 서열 분석 - 매핑과 SAM/BAM

2026. 7. 11. 02:00·Bio Data Analysis/서열분석개론

FASTQ에는 수백만 개의 read가 들어있지만, 이 자체로는 각 read가 유전체 어디서 왔는지 알 수 없습니다.

이 위치를 찾는 과정이 매핑(mapping/alignment)이고, 그 결과를 담는 표준 포맷이 SAM/BAM입니다.


레퍼런스 기반 정렬

전체 흐름은 이렇습니다.

FASTQ (위치 미상 read) + Reference(GRCh38) → BWA-MEM → SAM/BAM (정렬 위치 포함)

 

수백만 개의 read 각각을 레퍼런스 유전체 전체와 비교해서 가장 잘 맞는 위치를 찾아주는 작업입니다.

브루트포스로 비교하면 시간이 너무 오래 걸리기 때문에, 실무에서는 레퍼런스를 미리 인덱싱해두고 빠르게 검색하는 알고리즘을 씁니다.


BWA-MEM

BWA(Burrows-Wheeler Aligner)는 short-read 매핑의 사실상 표준 도구입니다(Heng Li & Durbin, 2009).

레퍼런스를 BWT(Burrows-Wheeler Transform)로 압축·인덱싱해서, 적은 메모리로도 수억 개의 read를 빠르게 검색할 수 있게 만든 게 핵심입니다.

동작 방식은 "Seed and Extend"라고 부릅니다.

  1. Seed: read 안에서 레퍼런스와 정확히 일치하는 조각(MEM, Maximal Exact Match)을 FM-index로 초고속 탐색
  2. Chaining: 가까이 있는 seed들을 묶어서 후보 위치를 선정
  3. Extend: 후보 위치 주변을 Smith-Waterman 알고리즘으로 정밀하게 정렬 (mismatch, indel 허용)
  4. MAPQ: 이 위치가 얼마나 유일하고 확실한지 점수화. 반복 영역이면 여러 후보 위치가 비슷하게 나와서 MAPQ가 낮게 매겨진다

옵션 중 -M은 짧게 갈라진 정렬(split hit)을 secondary로 표시해서 Picard/GATK와 호환되게 만들어줍니다.

SAM/BAM 구조

SAM은 텍스트 포맷이고 BAM은 이를 바이너리로 압축한 것입니다.

용량이 작고 처리 속도가 빨라서 실무에서는 BAM을 표준으로 씁니다.

@HD  VN:1.6  SO:coordinate
@SQ  SN:chr21  LN:46709983
D00360:...:31843  163  chr21  44286640  60  250M  =  44286890  498

 

@로 시작하는 줄이 헤더입니다.

@SQ에는 레퍼런스 서열 이름과 길이가 들어있습니다.

그 아래부터는 read 한 줄당 11개 필드로 구성됩니다.

필드 예시 값 의미
QNAME D00360:...:31843 read 이름
FLAG 163 read 상태 (비트 조합)
RNAME chr21 매핑된 레퍼런스 서열명
POS 44286640 1-based 매핑 시작 좌표
MAPQ 60 매핑 신뢰도, BWA 최대치는 60
CIGAR 250M 정렬 관계 문자열
RNEXT/PNEXT =, 44286890 짝 read의 위치
TLEN 498 template 길이

FLAG

read의 여러 상태를 비트로 켜고, 그 합을 하나의 10진수(0~4095)로 표기한 필드입니다.

비트(hex) 의미 비트(hex) 의미
1 (0x1) paired — 짝 있음 64 (0x40) first in pair (R1)
2 (0x2) proper pair — 정상 짝 128 (0x80) last in pair (R2)
4 (0x4) read unmapped 256 (0x100) secondary alignment
8 (0x8) mate unmapped 512 (0x200) QC fail
16 (0x10) read 역방향(reverse) 1024 (0x400) PCR/optical duplicate
32 (0x20) mate 역방향(reverse) 2048 (0x800) supplementary

FLAG 읽는 법

숫자를 2진수로 풀어보면 read 상태가 그대로 드러납니다.

정상적으로 짝지어진 paired-end read는 흔히 99와 147 조합으로 나타납니다.

99  = 1 + 2 + 32 + 64    → paired, proper pair, mate reverse, R1
147 = 1 + 2 + 16 + 128   → paired, proper pair, read reverse, R2

 

매번 비트를 손으로 분해할 필요는 없고 samtools flags 99 명령으로 바로 해석할 수 있습니다.

실무에서 자주 쓰는 건 4번 비트(unmapped) 필터링 정도입니다.

정렬 실패한 read를 걸러낼 때 이 값을 확인합니다.


CIGAR

read와 레퍼런스의 정렬 관계를 연산자 문자열로 압축 표현한 필드다.

연산자 의미
M alignment match — 일치/불일치 모두 포함 (정렬은 됨)
I Insertion — read에만 있는 삽입 서열
D Deletion — 레퍼런스 대비 결실
N skip — 레퍼런스 구간 건너뜀 (RNA-seq splice)
S Soft clip — 정렬 안 된 양끝, 서열은 유지됨
H Hard clip — 잘려나가서 서열이 아예 없음

 

예를 들어 199M1D6M1I43M이라는 CIGAR는 다음과 같이 읽습니다.

199M → 199개 염기 정렬 (일치/불일치 포함)
1D   → 1개 결실 (레퍼런스 대비)
6M   → 6개 정렬
1I   → 1개 삽입 (read에만 있음)
43M  → 43개 정렬

 

CIGAR 연산자만 봐도 어떤 변이 신호가 있는지 대략 짐작할 수 있습니다.

M 안에서 서열이 다르면 SNV(점 돌연변이), I/D가 있으면 indel, S/H/N이 있으면 구조변이나 splice 신호일 가능성을 의심해볼 수 있습니다.


Clipping

read가 레퍼런스에 부분적으로만 맞을 때, 안 맞는 끝을 잘라내고 표시하는 게 clipping입니다.

read 전체를 버리지 않고 맞는 부분만이라도 살리기 위한 처리입니다.

CIGAR: 35S215M

read  ╌╌╌35╌╌╌[====215 정렬====]
ref        [================]

 

clip이 생기는 원인은 보통 어댑터가 덜 제거됐거나, read 말단 품질이 낮거나, 구조변이/splice 경계에 걸렸을 때입니다.

  • Soft clip(S): 잘린 부분의 서열을 그대로 보존합니다.
    나중에 재정렬하거나 구조변이 breakpoint 분석에 재활용할 수 있어서, 대표(primary) 정렬에서 주로 쓰입니다.
  • Hard clip(H): 잘린 부분의 서열을 아예 제거합니다. 하나의 read가 여러 곳에 나뉘어 붙는 supplementary 정렬에서, 조각마다 전체 서열을 중복 저장하지 않으려고 이 방식을 씁니다.

samtools

BAM 파일을 다루는 핵심 도구 모음입니다.

명령 기능
view SAM↔BAM 변환, FLAG/영역/MAPQ 조건으로 read 필터링
sort 좌표순 정렬 — 인덱싱과 변이 검출의 전제조건
index .bai 인덱스 생성 — 특정 영역 즉시 접근(IGV 등에서 필요)
flagstat 총 read 수, 매핑률, 중복률, proper pair 비율 요약
depth / coverage 위치별·영역별 depth 계산
markdup PCR 중복 표시 (변이 호출 전처리에서 사용)

 

실무 순서로 보면 bwa mem 결과를 파이프로 바로 samtools sort에 넘겨서 정렬된 BAM을 만들고, samtools index로 .bai를 생성한 뒤, samtools flagstat으로 매핑이 잘 됐는지 확인하는 흐름이 일반적입니다.
이렇게 만든 sorted BAM(+.bai)이 이후 변이 호출 단계의 입력이 됩니다.

'Bio Data Analysis > 서열분석개론' 카테고리의 다른 글

[서열분석개론] 서열 분석 - 주석 및 임상 해석  (0) 2026.07.12
[서열분석개론] 서열 분석 - 변이 호출 파이프라인  (0) 2026.07.12
[서열분석개론] 서열 분석 - 변이의 종류와 표기법  (0) 2026.07.11
[서열분석개론] 서열 분석 - 파일 포맷 (FASTA, FASTQ, BED)  (0) 2026.07.11
[서열분석개론] 서열 분석 - 시퀀싱 원리  (0) 2026.07.08
'Bio Data Analysis/서열분석개론' 카테고리의 다른 글
  • [서열분석개론] 서열 분석 - 변이 호출 파이프라인
  • [서열분석개론] 서열 분석 - 변이의 종류와 표기법
  • [서열분석개론] 서열 분석 - 파일 포맷 (FASTA, FASTQ, BED)
  • [서열분석개론] 서열 분석 - 시퀀싱 원리
데이터로 읽는 생명
데이터로 읽는 생명
is-note 님의 블로그 입니다.
  • 데이터로 읽는 생명
    In Silico Note
    데이터로 읽는 생명
  • 전체
    오늘
    어제
    • 분류 전체보기 (190) N
      • Bio-Knowledge (16)
        • 분자생물학 & 유전학 기초 (0)
        • 전사체학 & 유전자 발현 (0)
        • 구조생물학 & 단백질 (0)
        • 싱글셀 & 다중오믹스 (0)
        • 임상유전학 & 질환 데이터 (0)
      • Programming (4)
        • API (4)
      • BI&Programming-Tools (111)
        • File Formats (14)
        • Linux & Bash Script (38)
        • Python (35)
        • R (11)
        • 통계 (8)
        • Pipeline Manager (0)
        • Etc (5)
      • Bio Data Analysis (28) N
        • 서열분석개론 (6)
        • WGS(Whole Genome Seq) (11)
        • WES(Whole Exome Seq) (2)
        • RNA-Seq (4) N
        • Metagenome (2)
        • Non-human Resequencing (1)
        • 임상유전체 분석 (1)
        • Multi-Omics (1)
      • Bio-Trends & Tech (1)
      • 코딩테스트 연습 (30)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    GATK
    bioinformatics
    리눅스기초
    파이썬
    FASTQ
    fasta
    데이터분석
    파이썬연습
    wgs
    분자생물학
    유전체분석
    R
    리눅스
    파이썬기초
    ngs
    통계
    코딩테스트
    R기초
    생물정보학
    파일포맷
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
데이터로 읽는 생명
[서열분석개론] 서열 분석 - 매핑과 SAM/BAM
상단으로

티스토리툴바