Step 06. Variant Annotation

변이(VCF)를 유전자/단백질 영향, 인구 빈도, 임상 DB 정보로 주석(annotation)합니다. 이 가이드는 Funcotator(GATK) 중심이며, 대안으로 VEP, SnpEff도 간단히 소개합니다.


A) 왜 주석이 필요한가?

B) 공통 변수 & 경로


# 스레드 & 레퍼런스
THREADS=20
REF_DIR="/home/kang/raw_data/gatk_bundle/v0"
REF="${REF_DIR}/Homo_sapiens_assembly38.fasta"

# 입력(05단계 출력)
VAR_IN="/home/kang/God_Nas/WGS_2nd/variant"     # *.filtered.vcf.gz

# 출력
ANN_OUT="/home/kang/God_Nas/WGS_2nd/annotation"
mkdir -p "${ANN_OUT}"

# Funcotator 데이터소스(로컬 위치로 수정)
FUNC_DS="/home/kang/raw_data/gatk_bundle/dataSourcesFolder/funcotator_dataSources.v1.7.20200521s/"

C) 주석 전 정규화(권장)

인델의 left-alignmulti-allelic 분리는 주석 정확도를 높입니다.


# 예: NP-21.filtered.vcf.gz → 정규화
SAMPLE="NP-21"
bcftools norm -f "${REF}" -m -both \
  -O z -o "${ANN_OUT}/${SAMPLE}.normalized.vcf.gz" \
  "${VAR_IN}/${SAMPLE}.filtered.vcf.gz"
tabix -p vcf "${ANN_OUT}/${SAMPLE}.normalized.vcf.gz"

D) Funcotator (권장)

데이터소스 & 전사체 주의
  • 데이터소스는 레퍼런스 빌드(hg38)와 일치해야 함.
  • 전사체: 기본은 Gencode. 프로젝트에서 보고 전사체 기준을 명시적으로 고정.
  • 출력: Somatic → MAF가 리포팅/시각화에 편리, Germline → VCF 주로 사용.
D-1) Somatic(종양) 결과를 MAF로

SAMPLE="NP-21"

gatk Funcotator \
  -R "${REF}" \
  -V "${ANN_OUT}/${SAMPLE}.normalized.vcf.gz" \
  -O "${ANN_OUT}/${SAMPLE}.funcotated.maf.gz" \
  --output-file-format MAF \
  --data-sources-path "${FUNC_DS}" \
  --ref-version hg38 \
  --annotation-default tumor_barcode:${SAMPLE}
D-2) Germline VCF을 주석(VCF 유지)

SAMPLE="Family01_Proband"

gatk Funcotator \
  -R "${REF}" \
  -V "${ANN_OUT}/${SAMPLE}.normalized.vcf.gz" \
  -O "${ANN_OUT}/${SAMPLE}.funcotated.vcf.gz" \
  --output-file-format VCF \
  --data-sources-path "${FUNC_DS}" \
  --ref-version hg38
tabix -p vcf "${ANN_OUT}/${SAMPLE}.funcotated.vcf.gz"

E) 배치 실행 스크립트 (Somatic → MAF)


#!/usr/bin/env bash
set -euo pipefail
THREADS=20
REF="/home/kang/raw_data/gatk_bundle/v0/Homo_sapiens_assembly38.fasta"
VAR_IN="/home/kang/God_Nas/WGS_2nd/variant"
ANN_OUT="/home/kang/God_Nas/WGS_2nd/annotation"
FUNC_DS="/home/kang/raw_data/gatk_bundle/dataSourcesFolder/funcotator_dataSources.v1.7.20200521s/"
mkdir -p "${ANN_OUT}"

shopt -s nullglob
for VCF in "${VAR_IN}"/*.filtered.vcf.gz; do
  SAMPLE="$(basename "${VCF}" .filtered.vcf.gz)"
  echo "[NORM] ${SAMPLE}"
  bcftools norm -f "${REF}" -m -both -O z -o "${ANN_OUT}/${SAMPLE}.normalized.vcf.gz" "${VCF}"
  tabix -p vcf "${ANN_OUT}/${SAMPLE}.normalized.vcf.gz"

  echo "[FUNCOTATOR] ${SAMPLE}"
  gatk Funcotator -R "${REF}" \
    -V "${ANN_OUT}/${SAMPLE}.normalized.vcf.gz" \
    -O "${ANN_OUT}/${SAMPLE}.funcotated.maf.gz" \
    --output-file-format MAF \
    --data-sources-path "${FUNC_DS}" \
    --ref-version hg38 \
    --annotation-default tumor_barcode:${SAMPLE}
done
echo "All annotations written to: ${ANN_OUT}"

F) MAF 주요 컬럼 한눈에

컬럼설명
Hugo_Symbol유전자명
Chromosome / Start_Position / End_Position게놈 위치
Variant_Classification / Variant_Type예: Missense_Mutation / SNP, INS, DEL
Reference_Allele, Tumor_Seq_Allele1/2염기 정보
t_depth, t_ref_count, t_alt_count종양 depth 및 ref/alt 카운트
tumor_barcode샘플명(우리가 기본 주입)
gnomAD_xxx인구 빈도(희귀 변이 판별에 중요)
ClinVar_*임상 해석(해석 시 버전/맥락 확인)
HGVSp/HGVSc단백질/전사체 표기(p./c.)

G) 대안: VEP / SnpEff (요약)

Ensembl VEP

플러그인으로 gnomAD/ClinVar/CADD 등 확장 쉬움. 로컬 캐시 설치 필요.


# 예시: VEP VCF → VCF
vep -i input.vcf.gz -o output.vep.vcf.gz --vcf \
  --cache --offline --assembly GRCh38 \
  --dir_cache /path/to/vep_cache \
  --fork 20 --compress_output bgzip
tabix -p vcf output.vep.vcf.gz
SnpEff

가볍고 빠름. snpSift로 추가 필터/주석 가능.


# 예시: SnpEff
snpEff -v GRCh38.99 input.vcf.gz | bgzip -c > output.snpeff.vcf.gz
tabix -p vcf output.snpeff.vcf.gz

H) 자주 하는 실수 & 팁

요약 & 튜토리얼 마무리
  • 주석 전 bcftools norm으로 left-align + multiallelic 분리 권장.
  • FuncotatorSomatic→MAF, Germline→VCF 주석(데이터소스/빌드 일치 필수).
  • 핵심 컬럼: 유전자/좌표/분류/카운트/빈도/임상. 이후 우선순위·리포팅에 활용.
  • 대안: VEP/SnpEff도 가능(캐시/DB 준비 필요).