CIGAR 스트링 읽기
CIGAR(Compact Idiosyncratic Gapped Alignment Report)는 정렬 결과 파일인 SAM/BAM의 레코드 안에 들어가는 정렬 상태 문자열입니다. 한 줄의 6번 컬럼에서 read가 참조서열에 어떻게 붙었는지를 짧게 적습니다. 위치(POS)가 “어디에”라면 CIGAR는 “어떤 모양으로”, 즉 어디가 맞고, 어디에 삽입·결실이 있고, 어디가 접혔는지를 기록합니다.
이 레퍼런스의 질문:
40M1523N36M같은 문자열이 read 하나의 정렬을 어떻게 설명하는가?
CIGAR는 SAM/BAM 레코드의 한 컬럼입니다. 전체 11개 컬럼과 FLAG·tag는 SAM/BAM 레퍼런스를 참고하세요.
1. 문자열의 구조: 길이 + 연산자
섹션 제목: “1. 문자열의 구조: 길이 + 연산자”CIGAR는 길이숫자 + 연산자문자 쌍을 왼쪽부터 이어 붙인 것입니다. 예를 들어 40M1523N36M은 40M · 1523N · 36M 세 조각으로 끊어 읽습니다. 이 조각들을 왼쪽(read의 5’ 끝)부터 순서대로 읽습니다.
40M: 40 bp가 참조에 정렬됨1523N: 참조에서 1,523 bp를 건너뜀(intron)36M: 다시 36 bp가 참조에 정렬됨
즉 이 read는 길이 76 bp이면서, 참조 위에서는 1,599 bp 구간에 걸쳐 놓입니다. 중간의 1,523 bp는 read에 없는 부분(intron)이라 건너뛴 것입니다. RNA-seq에서 아주 흔한 모양입니다.
2. 연산자 9개
섹션 제목: “2. 연산자 9개”핵심은 각 연산자가 read(query) 쪽 길이를 소비하는지, 참조(reference) 쪽 길이를 소비하는지입니다. 이 두 열만 알면 CIGAR를 계산할 수 있습니다.
| 연산자 | 뜻 | query 소비 | ref 소비 |
|---|---|---|---|
| M | 정렬됨(match 또는 mismatch, 둘 다 M) | ✅ | ✅ |
| = | 정렬됐고 염기까지 일치 | ✅ | ✅ |
| X | 정렬됐지만 염기 불일치 | ✅ | ✅ |
| I | read에 있는 삽입(insertion), 참조엔 없음 | ✅ | |
| D | 참조에 있는데 read에서 빠짐(deletion) | ✅ | |
| N | 참조를 건너뜀(skipped, 보통 intron) | ✅ | |
| S | soft clip: 안 맞아 접힌 끝, SEQ엔 남음 | ✅ | |
| H | hard clip: 잘려나가 SEQ에도 없음 | ||
| P | padding(multiple alignment 정렬용, 드묾) |
두 규칙만 기억하면 됩니다.
- query(SEQ)를 소비하는 연산자(M·I·S·=·X)의 길이 합 = SEQ 길이.
- reference를 소비하는 연산자(M·D·N·=·X)의 길이 합 = read가 참조에서 덮는 구간 길이(reference span).
🧩 M은 “일치”가 아니다: M은 참조와 자리를 맞췄다는 뜻일 뿐, 염기가 같은지는 보장하지 않습니다. 실제로 대부분의 정렬 도구(STAR·BWA 등)는 match와 mismatch를 구분하지 않고 전부 M으로 적습니다. 진짜 일치·불일치를 나누고 싶으면
=(일치)와X(불일치)를 쓰지만, 이 둘을 출력하는 도구는 소수입니다. 그래서 실무에서 mismatch 개수는 CIGAR가 아니라NMtag로 확인합니다.
3. N과 D의 차이: 둘 다 참조를 건너뛰는데?
섹션 제목: “3. N과 D의 차이: 둘 다 참조를 건너뛰는데?”N과 D 모두 “read에 없는 참조 구간”을 표시하지만 의미가 다릅니다.
- D(deletion): 참조엔 있는데 이 read에서 몇 bp가 빠진 것. 보통 짧습니다(indel 수준).
- N(skipped): 참조를 의도적으로 건너뛴 것. RNA-seq에서는 read가 exon-intron-exon을 가로질러 붙을 때 intron 구간이 N으로 표시됩니다. 보통 수백~수만 bp로 깁니다.
즉 50M3D26M은 “3 bp 결실이 있는 read”, 40M1523N36M은 “1,523 bp intron을 가로지른 splice read”입니다. 이 N이 있어서 STAR·HISAT2 같은 splice-aware aligner의 결과가 정렬 개념에서 말하는 “intron을 건너뛴 정렬”이 됩니다. intron 위치 자체는 GTF에 적힌 exon 경계와 대응합니다.
4. soft clip과 hard clip
섹션 제목: “4. soft clip과 hard clip”read의 끝부분이 참조와 안 맞으면 그 부분을 접습니다(clip). POS는 clip을 뺀, 실제로 정렬된 첫 M의 위치를 가리킵니다.
- S(soft clip): 접힌 염기가 SEQ 컬럼엔 그대로 남습니다. 그래서 SEQ 길이 계산에 포함됩니다.
- H(hard clip): 접힌 염기가 SEQ에서도 잘려나갑니다. supplementary alignment(쪼개져 여러 곳에 붙은 정렬)에서 주로 보입니다.
예: 5S71M은 앞 5 bp를 접고 뒤 71 bp만 정렬한 것으로, SEQ 길이는 여전히 76 bp(5+71)입니다. 어댑터 잔여물이나 품질 낮은 끝이 여기서 soft clip으로 나타나기도 합니다(어댑터·트리밍은 트리밍 레퍼런스).
5. 실제 문자열 읽어보기
섹션 제목: “5. 실제 문자열 읽어보기”paired-end read의 앞줄 CIGAR가 76M이라면 단순합니다. 몇 가지 실전 예시:
| CIGAR | 해석 | SEQ 길이 | ref span |
|---|---|---|---|
76M | 76 bp 그대로 정렬(mismatch는 있을 수 있음) | 76 | 76 |
5S71M | 앞 5 bp soft clip, 71 bp 정렬 | 76 | 71 |
50M2I24M | 중간에 2 bp 삽입 | 76 | 74 |
50M3D26M | 중간에 3 bp 결실 | 76 | 79 |
40M1523N36M | 1,523 bp intron을 가로지른 splice read | 76 | 1599 |
30M500N20M2I24M | splice + 그 뒤 2 bp 삽입 | 76 | 574 |
ref span 계산을 마지막 줄로 확인해 봅시다: reference 소비 연산자는 M·D·N·=·X이므로 30M(30) + 500N(500) + 20M(20) + 24M(24) = 574. 2I는 참조를 소비하지 않으니 뺍니다. SEQ 길이는 query 소비 연산자 30M+20M+2I+24M = 76.
💡 CIGAR를 눈으로 확인하려면:
samtools view file.bam chr21:33426891-33427000으로 특정 구간의 정렬을 열면 6번 컬럼이 CIGAR입니다. splice가 의심되는 유전자에서 N이 예상한 intron 길이와 맞는지, 특정 위치에서만 I·D가 몰리는지를 이렇게 직접 봅니다.samtools view -c에 FLAG 필터를 걸어 세는 것과 함께 정렬 디버깅의 기본입니다.
CIGAR는 read 하나의 정렬 모양을 왼쪽부터 길이+연산자로 압축한 문자열입니다. 처음에는 아홉 개 연산자를 다 외우기보다 세 가지를 기억하면 됩니다.
- M은 일치가 아니라 정렬이다. 진짜 mismatch 개수는
NMtag로 본다. - N은 intron 건너뛰기(splice), D는 짧은 결실이다. RNA-seq splice read는 N을 가진다.
- query 소비 연산자 합은 SEQ 길이, reference 소비 연산자 합은 참조 구간 길이다.
전체 SAM 레코드의 맥락은 SAM/BAM 한 줄 읽기, splice 정렬의 개념은 read 위치 찾기에서 이어집니다.