정렬된 BAM에서 중복 리드를 마킹하고(MarkDuplicates), 알려진 변이 사이트를 이용해 BQSR(Base Quality Score Recalibration)을 수행합니다. 기본 쓰레드는 20을 사용합니다.
FLAG로 표시(제거 X)하고, 이후 분석에서 자동으로 제외되도록 합니다.BaseRecalibrator가 리드–레퍼런스 불일치를 세는데,
알려진 변이 위치는 “진짜 변이”로 보고 제외합니다. (진짜 변이를 오류로 세면 모델이 틀어짐)ApplyBQSR 단계에서 새 품질로 바꿉니다.
aln/SAMPLE.sorted.bam (+ .bai).Homo_sapiens_assembly38.fasta (+ .fai, .dict).dbsnp_146.hg38.vcf.gz, Mills_and_1000G_gold_standard.indels.hg38.vcf.gz,
1000G_phase1.snps.high_confidence.hg38.vcf.gz (각각 .tbi 인덱스 필요).
# 스레드 & 경로
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/aln" # 03단계 출력 위치
OUT="/home/kang/God_Nas/WGS_2nd/postproc" # 04단계 출력 위치
mkdir -p "${OUT}"
# Known sites (gzip + .tbi 필요)
DBSNP="${REF_DIR}/dbsnp_146.hg38.vcf.gz"
MILLS="${REF_DIR}/Mills_and_1000G_gold_standard.indels.hg38.vcf.gz"
G1KHC="${REF_DIR}/1000G_phase1.snps.high_confidence.hg38.vcf.gz"
SAMPLE="NP-21"
# 1) MarkDuplicates (Spark 버전: 빠름)
gatk MarkDuplicatesSpark \
-I "${IN}/${SAMPLE}.sorted.bam" \
-O "${OUT}/${SAMPLE}.dup.bam" \
--metrics-file "${OUT}/${SAMPLE}.dup.metrics.txt" \
--conf 'spark.executor.cores='"${THREADS}" \
--conf 'spark.local.dir=/tmp' \
--create-output-bam-index true
# (대안) Picard MarkDuplicates (단일 스레드/호환성 높음)
# gatk MarkDuplicates \
# -I "${IN}/${SAMPLE}.sorted.bam" \
# -O "${OUT}/${SAMPLE}.dup.bam" \
# -M "${OUT}/${SAMPLE}.dup.metrics.txt" \
# --CREATE_INDEX true
# 2) BaseRecalibrator (리포트 생성)
gatk BaseRecalibrator \
-R "${REF}" \
-I "${OUT}/${SAMPLE}.dup.bam" \
--known-sites "${DBSNP}" \
--known-sites "${MILLS}" \
--known-sites "${G1KHC}" \
-O "${OUT}/${SAMPLE}.recal.table"
# 3) ApplyBQSR (보정 적용 → 최종 BAM)
gatk ApplyBQSR \
-R "${REF}" \
-I "${OUT}/${SAMPLE}.dup.bam" \
--bqsr-recal-file "${OUT}/${SAMPLE}.recal.table" \
-O "${OUT}/${SAMPLE}.final.bam"
# 인덱스 & QC
samtools index -@ ${THREADS} "${OUT}/${SAMPLE}.final.bam"
samtools flagstat -@ ${THREADS} "${OUT}/${SAMPLE}.final.bam" > "${OUT}/${SAMPLE}.final.flagstat.txt"
--metrics-file에 중복 통계가 기록되며, --create-output-bam-index로 자동 색인 생성.recal.table 생성..tbi 필수).run_postproc.sh)03단계에서 생성한 aln/*.sorted.bam을 모두 찾아 일괄 처리합니다.
#!/usr/bin/env bash
set -euo pipefail
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/aln"
OUT="/home/kang/God_Nas/WGS_2nd/postproc"
mkdir -p "${OUT}"
DBSNP="${REF_DIR}/dbsnp_146.hg38.vcf.gz"
MILLS="${REF_DIR}/Mills_and_1000G_gold_standard.indels.hg38.vcf.gz"
G1KHC="${REF_DIR}/1000G_phase1.snps.high_confidence.hg38.vcf.gz"
shopt -s nullglob
for BAM in "${IN}"/*.sorted.bam; do
SAMPLE="$(basename "${BAM}" .sorted.bam)"
echo "[POSTPROC] ${SAMPLE}"
gatk MarkDuplicatesSpark \
-I "${BAM}" \
-O "${OUT}/${SAMPLE}.dup.bam" \
--metrics-file "${OUT}/${SAMPLE}.dup.metrics.txt" \
--conf 'spark.executor.cores='"${THREADS}" \
--conf 'spark.local.dir=/tmp' \
--create-output-bam-index true
gatk BaseRecalibrator \
-R "${REF}" \
-I "${OUT}/${SAMPLE}.dup.bam" \
--known-sites "${DBSNP}" \
--known-sites "${MILLS}" \
--known-sites "${G1KHC}" \
-O "${OUT}/${SAMPLE}.recal.table"
gatk ApplyBQSR \
-R "${REF}" \
-I "${OUT}/${SAMPLE}.dup.bam" \
--bqsr-recal-file "${OUT}/${SAMPLE}.recal.table" \
-O "${OUT}/${SAMPLE}.final.bam"
samtools index -@ ${THREADS} "${OUT}/${SAMPLE}.final.bam"
samtools flagstat -@ ${THREADS} "${OUT}/${SAMPLE}.final.bam" > "${OUT}/${SAMPLE}.final.flagstat.txt"
done
echo "All done. Final BAMs in: ${OUT}"
sorted.bam → 출력: dup.bam → final.bam(+.bai)..tbi 인덱스 필요.*.dup.metrics.txt·flagstat로 중복률/매핑 요약 확인.