# GTF: 유전자 주석 파일

> RNA-seq 정렬·정량에서 쓰는 GTF 파일의 역할, 9개 컬럼 구조, gene_id·transcript_id 속성, GFF3와 차이, 실전 주의점.

RNA-seq에서 시퀀서가 읽은 짧은 서열(read)을 게놈에 정렬한 뒤 "이 read가 어느 유전자에 속하나"를 세려면 **유전자 위치표**가 필요합니다. 그 위치표가 보통 **GTF(Gene Transfer Format)** 파일입니다. GTF는 GFF version 2 계열을 바탕으로, 유전자·전사체 정보를 다루기 위한 관례를 얹은 탭 구분 주석 형식입니다.

한 줄 요약:

```text
GTF = 게놈 좌표 위에 유전자·전사체·엑손이 어디 있는지 적어둔 주석 파일
```

## 어디에 쓰이나

GTF는 read 자체가 아니라 **레퍼런스 주석(annotation)** 입니다. 분석 파이프라인에서는 보통 이렇게 쓰입니다.

```text
FASTQ → 정렬(STAR/HISAT2) → BAM
                         ↓
                    GTF 주석
                         ↓
              유전자별 read count / TPM
```

대표적인 사용처:

| 단계 | GTF의 역할 |
| --- | --- |
| genome index 생성 | STAR 같은 정렬기가 splice junction 정보를 미리 알 수 있게 함 |
| read counting | `featureCounts`, `HTSeq-count`가 read를 gene/exon에 배정 |
| transcript 정량 | RSEM, StringTie 등이 transcript 구조를 해석 |
| 결과 해석 | gene ID, gene name, transcript ID를 좌표와 연결 |

## GTF 한 줄의 구조

GTF는 탭으로 구분된 텍스트 파일입니다. 각 줄은 하나의 feature를 뜻하고, 항상 **9개 컬럼**을 가집니다.

```text
chr1  HAVANA  exon  11869  12227  .  +  .  gene_id "ENSG00000223972"; transcript_id "ENST00000456328"; gene_name "DDX11L1";
```

| 컬럼 | 이름 | 의미 |
| --- | --- | --- |
| 1 | seqname | 염색체/contig 이름. 예: `chr1`, `1`, `GL000...` |
| 2 | source | 주석 출처. 예: `HAVANA`, `ENSEMBL` |
| 3 | feature | feature 종류. 예: `gene`, `transcript`, `exon`, `CDS`, `UTR` |
| 4 | start | 시작 좌표 |
| 5 | end | 끝 좌표 |
| 6 | score | 점수. 없으면 `.` |
| 7 | strand | 가닥. `+`, `-`, `.` |
| 8 | frame / phase | CDS frame(phase). 단백질 코딩 영역이 아니면 보통 `.` |
| 9 | attributes | 세미콜론으로 구분된 부가 정보 |

## 좌표 규칙

GTF 좌표는 **1-based inclusive** 입니다.

```text
start = 11869
end   = 12227
```

이 뜻은 11869번째 염기부터 12227번째 염기까지 **양 끝을 모두 포함**한다는 뜻입니다.

주의할 점:

| 형식 | 좌표 규칙 |
| --- | --- |
| GTF / GFF / VCF | 1-based |
| BED | 0-based, half-open |

BED 파일과 GTF를 섞어 쓸 때는 좌표가 한 칸 어긋나는 실수가 자주 납니다.

## attributes: 가장 중요한 9번째 컬럼

GTF에서 실제 분석 도구가 가장 많이 읽는 부분은 9번째 컬럼입니다.

```text
gene_id "ENSG00000141510";
transcript_id "ENST00000269305";
gene_name "TP53";
gene_biotype "protein_coding";
```

핵심 속성:

| 속성 | 의미 |
| --- | --- |
| `gene_id` | 유전자 고유 ID. 보통 가장 안정적인 분석 단위 |
| `transcript_id` | 전사체 isoform ID. `gene` 줄에는 없고 `transcript`, `exon`, `CDS` 줄에 붙는 경우가 많음 |
| `gene_name` | 사람이 읽는 유전자 심볼. 예: `TP53`, `MDM2` |
| `gene_biotype` / `gene_type` | protein_coding, lncRNA, pseudogene 등 유전자 종류. Ensembl은 `gene_biotype`, GENCODE는 `gene_type`을 주로 사용 |
| `exon_number` | transcript 안에서 exon 순서 |

분석에서는 가능하면 `gene_name`보다 **`gene_id`를 기준으로 보관**하는 편이 안전합니다. gene symbol은 바뀌거나 중복될 수 있지만, Ensembl gene ID 같은 식별자는 더 안정적입니다.

:::note[속성 이름은 출처마다 조금 다릅니다]
GTF의 1~8번 컬럼 구조는 비교적 일정하지만, 9번째 `attributes`의 세부 key는 주석 제공처마다 다를 수 있습니다. 예를 들어 GENCODE는 `gene_type`·`transcript_type`, Ensembl dump는 `gene_biotype` 같은 이름을 씁니다. 도구 옵션에서 어떤 attribute를 기준으로 묶을지 확인해야 합니다.
:::

## feature 종류

자주 보는 feature는 다음과 같습니다.

| feature | 의미 |
| --- | --- |
| `gene` | 유전자 전체 영역 |
| `transcript` | 하나의 전사체 isoform |
| `exon` | transcript를 구성하는 exon |
| `CDS` | 단백질로 번역되는 코딩 영역 |
| `UTR` | 번역되지 않는 5'/3' 영역 |
| `start_codon`, `stop_codon` | 시작/종결 코돈 |

RNA-seq read count에서는 보통 `exon` feature를 유전자 단위로 합쳐 셉니다. 그래서 `featureCounts`를 쓸 때 자주 보이는 옵션이 `-t exon -g gene_id` 입니다.

```bash
featureCounts \
  -a annotation.gtf \
  -t exon \
  -g gene_id \
  -o counts.txt \
  aligned.bam
```

뜻:

| 옵션 | 의미 |
| --- | --- |
| `-a annotation.gtf` | 사용할 GTF 주석 |
| `-t exon` | exon 줄만 count 대상으로 사용 |
| `-g gene_id` | 같은 gene_id를 가진 exon들을 묶어 유전자별 count 생성 |

## GTF와 GFF3의 차이

GTF와 GFF3는 둘 다 유전자 주석 형식입니다. 모양도 비슷하지만 9번째 컬럼 문법이 다릅니다.

| 항목 | GTF | GFF3 |
| --- | --- | --- |
| 9번째 컬럼 | `gene_id "X"; transcript_id "Y";` | `ID=exon1;Parent=transcript1` |
| 계층 표현 | `gene_id`, `transcript_id` 속성으로 연결 | `ID`, `Parent`로 부모-자식 관계 명시 |

GFF3는 `ID`, `Parent` 같은 예약 attribute를 사용해 gene → transcript → exon 계층을 더 명시적으로 표현합니다. GTF는 보통 각 줄에 반복되는 `gene_id`, `transcript_id` 값을 이용해 같은 유전자·전사체에 속한 feature를 묶습니다.

도구마다 기대하는 형식이 다릅니다. `featureCounts`처럼 여러 annotation 형식을 지원하는 도구도, 어떤 feature를 셀지(`-t`)와 어떤 attribute로 묶을지(`-g`)를 명확히 지정해야 합니다.

## 어디서 받나

사람 유전체 분석에서는 주로 다음 주석을 씁니다.

| 출처 | 특징 |
| --- | --- |
| GENCODE | human/mouse RNA-seq에서 매우 널리 쓰이는 고품질 주석 |
| Ensembl | 다양한 종을 지원. Ensembl gene/transcript ID와 잘 맞음 |
| RefSeq | NCBI 기반 주석. 임상/레거시 파이프라인에서 자주 등장 |

중요한 것은 **FASTA 게놈 파일과 GTF 주석의 빌드가 같아야 한다**는 점입니다.

```text
좋음: GRCh38 genome FASTA + GRCh38 GTF
위험: GRCh37 genome FASTA + GRCh38 GTF
```

## 실전 주의점

### 1. 염색체 이름이 맞아야 함

게놈 FASTA는 `chr1`인데 GTF는 `1`이면 도구가 같은 염색체로 인식하지 못할 수 있습니다.

```text
FASTA: >chr1
GTF:   1  HAVANA  exon ...
```

이런 경우 count가 거의 0으로 나오거나 index 생성에서 경고가 납니다. `chr` prefix 유무를 반드시 확인하세요.

### 2. 주석 버전을 기록해야 함

같은 GRCh38이라도 GENCODE v39, v44, v46처럼 주석 버전에 따라 유전자 모델이 달라질 수 있습니다. 재현성을 위해 결과와 함께 기록합니다.

```text
genome: GRCh38
annotation: GENCODE v46
```

GENCODE/Ensembl은 계속 갱신되므로, "GRCh38을 썼다"만으로는 충분하지 않습니다. 논문·노트북·결과 테이블에는 가능하면 **게놈 빌드 + 주석 출처 + release 번호**를 같이 남깁니다.

### 3. gene_id 버전 suffix 처리

Ensembl ID에는 버전이 붙을 수 있습니다.

```text
ENSG00000141510.18
```

다른 데이터베이스에는 suffix 없는 `ENSG00000141510` 형태로 들어 있는 경우가 많습니다. 외부 데이터와 합칠 때 `.18` 같은 버전 suffix를 유지할지 제거할지 정해야 합니다.

### 4. gene_name만 믿지 말 것

`gene_name`은 사람이 읽기 좋지만, 분석 키로는 약합니다.

- 과거 이름이 바뀔 수 있음
- 같은 symbol이 여러 위치에 등장할 수 있음
- pseudogene/lncRNA까지 포함하면 중복 가능성이 커짐

그래서 내부 분석 테이블은 `gene_id`를 기준으로 두고, 마지막 해석 단계에서 `gene_name`을 붙이는 방식이 안전합니다.

## 작은 예시

아래 예시는 하나의 유전자에 transcript 하나, exon 두 개가 있는 단순한 구조입니다.

```text
chr1  source  gene        1000  5000  .  +  .  gene_id "GENE1"; gene_name "ABC1";
chr1  source  transcript  1000  5000  .  +  .  gene_id "GENE1"; transcript_id "TX1";
chr1  source  exon        1000  1200  .  +  .  gene_id "GENE1"; transcript_id "TX1"; exon_number "1";
chr1  source  exon        3000  5000  .  +  .  gene_id "GENE1"; transcript_id "TX1"; exon_number "2";
```

이 GTF를 기준으로 count하면, exon 1 또는 exon 2에 겹친 read들이 `GENE1` count로 합쳐집니다.

## 한 줄 치트시트

```text
GTF는 "게놈 위 유전자 지도"다.
RNA-seq에서는 BAM의 read를 gene/exon에 배정하기 위해 쓴다.
좌표는 1-based inclusive, 핵심 속성은 gene_id와 transcript_id.
게놈 FASTA와 GTF는 같은 빌드·같은 염색체 이름을 써야 한다.
```

관련 형식은 [데이터 형식 레퍼런스](/reference/data-formats/)와 [raw count를 비교 가능한 값으로 바꾸기](/lessons/rna-seq-quantification/)를 함께 참고하세요.

## 참고자료

- [Ensembl: GFF/GTF File Format](https://www.ensembl.org/info/website/upload/gff.html): GFF/GTF의 9개 컬럼, 1-based inclusive 좌표, attribute 컬럼 설명.
- [GENCODE: Data format](https://www.gencodegenes.org/pages/data_format.html): GENCODE GTF의 컬럼 정의, `gene_id`, `transcript_id`, `gene_type`, `exon_number` 등 attribute 설명.
- [Sequence Ontology: GFF3 specification](https://github.com/The-Sequence-Ontology/Specifications/blob/master/gff3.md): GFF3의 `ID`, `Parent`, `tag=value` attribute 문법과 계층 표현.
- [Subread/featureCounts User Guide](https://subread.sourceforge.net/SubreadUsersGuide.pdf): `featureCounts -a annotation.gtf -t exon -g gene_id` 방식의 read summarization 옵션.
- Liao Y, Smyth GK, Shi W. **featureCounts: an efficient general purpose program for assigning sequence reads to genomic features.** *Bioinformatics* (2014). DOI: [10.1093/bioinformatics/btt656](https://doi.org/10.1093/bioinformatics/btt656)