Step 05. Somatic Variant Calling (Mutect2)

종양(±정상)에서 발생한 체세포 변이Mutect2로 호출합니다. 입력은 *.final.bam(MarkDuplicates + BQSR)이며 기본 쓰레드는 20입니다. (참고: Germline 변이는 HaplotypeCaller 페이지에서 별도 설명)


A) 개요

B) Mutect2는 어떻게 변이를 찾을까? (알고리즘 개요)

  1. 활성 구간 탐지: 의심 구간에서만 계산(속도↑).
  2. 로컬 어셈블리: 해당 구간 리드로 de Bruijn 그래프를 만들고 후보 haplotype을 구성(복잡 인델/클립에 강함).
  3. Pair-HMM으로 리드-haplotype 가능도(우도) 계산.
  4. 소마틱 유전형 추론: 종양/정상 리드 분리, TLOD/NLOD(tumor/normal log odds) 산출.
  5. 사전/사후 확률: --germline-resource AF, PoN, 오염률, 방향성 바이어스 등을 반영해 사후확률 계산.
  6. FilterMutectCalls: 위 신호(오염/strand/맵품질/클립 등)를 결합해 PASS/FAIL 판정.
비교: 예전 pileup 기반 콜러(VarScan2, SomaticSniper 등)는 한 지점의 카운트/통계만으로 판정 → 저 VAF·인델·복잡 이벤트에서 위양성↑/민감도↓. Mutect2(및 Strelka2 등)는 어셈블리+HMM로 문맥을 반영하여 훨씬 견고합니다.

C) 공통 경로 & 자원


# 쓰레드 & 경로
THREADS=20
REF_DIR="/home/kang/raw_data/gatk_bundle/v0"
REF="${REF_DIR}/Homo_sapiens_assembly38.fasta"

IN="/home/kang/God_Nas/WGS_2nd/postproc"     # *.final.bam 위치
OUT="/home/kang/God_Nas/WGS_2nd/variant"
mkdir -p "${OUT}"

# 리소스
GERM_AF="${REF_DIR}/af-only-gnomad.hg38.vcf.gz"   # --germline-resource
PON_VCF="/path/to/pon.vcf.gz"                     # --panel-of-normals (있으면 강력 권장)

# 오염 추정에 사용할 "공통 변이 사이트" VCF(작은 사이즈 권장; .tbi 필요)
COMMON_SITES_VCF="${REF_DIR}/small_common_biallelic.vcf.gz"

D) Matched-normal 파이프라인 (권장)

정상 샘플이 있으면 germline/배경을 직접 관찰하므로 정확도가 가장 좋습니다.

D-1) Mutect2 호출

TUMOR="Case01_T";  TBAM="${IN}/${TUMOR}.final.bam"
NORMAL="Case01_N"; NBAM="${IN}/${NORMAL}.final.bam"

gatk Mutect2 \
  -R "${REF}" \
  -I "${TBAM}" -tumor "${TUMOR}" \
  -I "${NBAM}" -normal "${NORMAL}" \
  --germline-resource "${GERM_AF}" \
  $( [[ -f "${PON_VCF}" ]] && echo "--panel-of-normals ${PON_VCF}" ) \
  --f1r2-tar-gz "${OUT}/${TUMOR}.f1r2.tar.gz" \
  -O "${OUT}/${TUMOR}.unfiltered.vcf.gz" \
  --native-pair-hmm-threads ${THREADS}

# (옵션) 로컬 재정렬된 BAM을 보고 싶으면 -bamout 사용:
#  -bamout "${OUT}/${TUMOR}.bamout.bam"
D-2) 오염 추정 · 방향성 바이어스 학습 · 필터

# 1) Pileup 요약 (종양/정상 모두 수행)
gatk GetPileupSummaries -R "${REF}" -I "${TBAM}" -V "${COMMON_SITES_VCF}" -O "${OUT}/${TUMOR}.pileups.table"
gatk GetPileupSummaries -R "${REF}" -I "${NBAM}" -V "${COMMON_SITES_VCF}" -O "${OUT}/${NORMAL}.pileups.table"

# 2) 오염도 추정
gatk CalculateContamination \
  -I "${OUT}/${TUMOR}.pileups.table" \
  -matched "${OUT}/${NORMAL}.pileups.table" \
  -O "${OUT}/${TUMOR}.contamination.table" \
  --segment-output "${OUT}/${TUMOR}.segments.table"

# 3) 방향성 바이어스(FFPE 등) 학습
gatk LearnReadOrientationModel \
  -I "${OUT}/${TUMOR}.f1r2.tar.gz" \
  -O "${OUT}/${TUMOR}.artifact-priors.tar.gz"

# 4) 최종 필터
gatk FilterMutectCalls \
  -R "${REF}" \
  -V "${OUT}/${TUMOR}.unfiltered.vcf.gz" \
  --contamination-table "${OUT}/${TUMOR}.contamination.table" \
  --tumor-segmentation "${OUT}/${TUMOR}.segments.table" \
  --ob-priors "${OUT}/${TUMOR}.artifact-priors.tar.gz" \
  -O "${OUT}/${TUMOR}.filtered.vcf.gz"

E) Tumor-only 파이프라인 (정상 샘플 없음)

포인트
  • gnomAD AF(--germline-resource)와 PoN 의존도가 큽니다(위양성 억제).
  • 오염 추정이 특히 중요하며, 필터가 더 보수적으로 작동할 수 있어 저 VAF 변이의 민감도는 떨어질 수 있습니다.
E-1) Mutect2 호출

TUMOR="NP-21"; TBAM="${IN}/${TUMOR}.final.bam"

gatk Mutect2 \
  -R "${REF}" \
  -I "${TBAM}" -tumor "${TUMOR}" \
  --germline-resource "${GERM_AF}" \
  $( [[ -f "${PON_VCF}" ]] && echo "--panel-of-normals ${PON_VCF}" ) \
  --f1r2-tar-gz "${OUT}/${TUMOR}.f1r2.tar.gz" \
  -O "${OUT}/${TUMOR}.unfiltered.vcf.gz" \
  --native-pair-hmm-threads ${THREADS}
E-2) 오염 추정 · 방향성 바이어스 학습 · 필터

gatk GetPileupSummaries -R "${REF}" -I "${TBAM}" -V "${COMMON_SITES_VCF}" -O "${OUT}/${TUMOR}.pileups.table"

gatk CalculateContamination \
  -I "${OUT}/${TUMOR}.pileups.table" \
  -O "${OUT}/${TUMOR}.contamination.table" \
  --segment-output "${OUT}/${TUMOR}.segments.table"

gatk LearnReadOrientationModel \
  -I "${OUT}/${TUMOR}.f1r2.tar.gz" \
  -O "${OUT}/${TUMOR}.artifact-priors.tar.gz"

gatk FilterMutectCalls \
  -R "${REF}" \
  -V "${OUT}/${TUMOR}.unfiltered.vcf.gz" \
  --contamination-table "${OUT}/${TUMOR}.contamination.table" \
  --tumor-segmentation "${OUT}/${TUMOR}.segments.table" \
  --ob-priors "${OUT}/${TUMOR}.artifact-priors.tar.gz" \
  -O "${OUT}/${TUMOR}.filtered.vcf.gz"

F) Matched-normal vs Tumor-only 비교

항목Matched-normalTumor-only
특이도/위양성 우수 (정상으로 germline/배경 직접 제거) 상대적으로 낮음(gnomAD/PoN 의존, 필터 보수적)
저 VAF 변이 검출력↑ 검출력↓(필터 강도↑)
리소스 의존 보조적(germline-resource/PoN 필요성↓) 높음(gnomAD AF, PoN 필수적 권장)
권장 사용 가능하면 항상 채택 정상 확보 불가·예산/윤리 제한 등

G) (선택) 변이 어노테이션: Funcotator


RESOURCE="/home/kang/raw_data/gatk_bundle/dataSourcesFolder/funcotator_dataSources.v1.7.20200521s/"
SAMPLE="NP-21"

gatk Funcotator \
  -R "${REF}" \
  -V "${OUT}/${SAMPLE}.filtered.vcf.gz" \
  -O "${OUT}/${SAMPLE}.funcotated.maf.gz" \
  --output-file-format MAF \
  --data-sources-path "${RESOURCE}" \
  --ref-version hg38 \
  --annotation-default tumor_barcode:${SAMPLE}
요약
  • Mutect2로컬 어셈블리 + Pair-HMM 기반으로 TLOD/NLOD와 사전정보를 결합해 소마틱 변이를 판정합니다.
  • Matched-normal이 최선이며, Tumor-only는 gnomAD AF/PoN/오염·방향성 모델에 크게 의존합니다.
  • 표준 필터 체인: GetPileupSummaries → CalculateContamination → LearnReadOrientationModel → FilterMutectCalls.
  • 구식 pileup 콜러 대비 인델/저 VAF·복잡 이벤트에서 민감도/특이도가 우수합니다.