# CIGAR 스트링 읽기

> SAM/BAM의 6번 컬럼 CIGAR가 read와 참조의 정렬 상태를 어떻게 압축하는지, 9개 연산자와 splice(N)·indel·clip을 실제 문자열로 읽고 참조 구간 길이를 계산한다.

**CIGAR**(Compact Idiosyncratic Gapped Alignment Report)는 정렬 결과 파일인 SAM/BAM의 레코드 안에 들어가는 **정렬 상태 문자열**입니다. 한 줄의 6번 컬럼에서 read가 참조서열에 **어떻게** 붙었는지를 짧게 적습니다. 위치(POS)가 "어디에"라면 CIGAR는 "어떤 모양으로", 즉 어디가 맞고, 어디에 삽입·결실이 있고, 어디가 접혔는지를 기록합니다.

> **이 레퍼런스의 질문**: `40M1523N36M` 같은 문자열이 read 하나의 정렬을 어떻게 설명하는가?

CIGAR는 SAM/BAM 레코드의 한 컬럼입니다. 전체 11개 컬럼과 FLAG·tag는 [SAM/BAM 레퍼런스](/reference/sam-bam/)를 참고하세요.

## 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개

핵심은 각 연산자가 **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가 아니라 `NM` tag로 확인합니다.

## 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**의 결과가 [정렬 개념](/lessons/rna-seq-alignment/)에서 말하는 "intron을 건너뛴 정렬"이 됩니다. intron 위치 자체는 [GTF](/reference/gtf/)에 적힌 exon 경계와 대응합니다.

## 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으로 나타나기도 합니다(어댑터·트리밍은 [트리밍 레퍼런스](/reference/trimming/)).

## 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 하나의 정렬 모양을 왼쪽부터 `길이+연산자`로 압축한 문자열입니다. 처음에는 아홉 개 연산자를 다 외우기보다 세 가지를 기억하면 됩니다.

1. **M은 일치가 아니라 정렬**이다. 진짜 mismatch 개수는 `NM` tag로 본다.
2. **N은 intron 건너뛰기**(splice), **D는 짧은 결실**이다. RNA-seq splice read는 N을 가진다.
3. query 소비 연산자 합은 SEQ 길이, reference 소비 연산자 합은 참조 구간 길이다.

전체 SAM 레코드의 맥락은 [SAM/BAM 한 줄 읽기](/reference/sam-bam/), splice 정렬의 개념은 [read 위치 찾기](/lessons/rna-seq-alignment/)에서 이어집니다.