Step 03. Alignment (BWA + Samtools)

트리밍된 페어드엔드 FASTQ를 BWA로 레퍼런스에 정렬하고, samtools로 바로 BAM을 만들어 인덱싱까지 진행합니다. 기본 쓰레드는 20을 사용합니다.


A) Alignment란?

NGS 리드를 레퍼런스 게놈의 위치에 배치하는 과정입니다. 보통 seed-and-extend 전략과 FM-index(Burrows–Wheeler Transform 기반)를 사용해 빠르게 후보 위치를 찾고, 갭/불일치를 허용한 지역 정렬로 최종 매핑을 확정합니다. 결과는 SAM/BAM 형식으로 저장되며, 각 리드에는 MAPQ(매핑 품질)과 CIGAR(매칭/삽입/삭제 패턴) 같은 메타정보가 포함됩니다.

B) BWA란?

BWA (Burrows–Wheeler Aligner)는 BWT/FMI를 활용하는 빠른 리드 매퍼입니다. 로우에러의 짧은~중간 길이 리드(일반적 Illumina)에 최적화되어 있으며, 변이콜링 파이프라인(예: GATK)과 호환성이 매우 좋습니다.

C) BWA 알고리즘 비교 (backtrack / SW / MEM)

알고리즘 명령 설계 배경 / 특징 권장 리드 길이 정렬 유형 주요 용도/비고
BWA-backtrack bwa alnbwa samse/sampe 초기 세대 알고리즘. 짧은 리드에 최적화, 메모리 적음. ~50–70 bp 이하 글로벌에 가까운 정렬 레거시 데이터용. 현대 WGS에는 보통 비권장.
BWA-SW bwa sw 더 긴 리드(초창기 장문 리드) 대응. 스플릿/갭 허용. 수백 bp 이상 로컬 정렬(스미스-워터만 기반) 역사적 이유로 존재. 현재는 사용 드묾.
BWA-MEM bwa mem 현대 표준. seed로 Maximal Exact Match 사용, 스플릿/소프트클리핑 지원, 정확도/속도 균형 우수. ~70 bp – 1 Mb 로컬 정렬 + 스플릿 정렬 일반적인 Illumina WGS/WES에 권장. GATK 등과 호환성 우수.

정리: 현대 Illumina WGS/Exome는 BWA-MEM이 사실상 표준입니다. backtrack/SW는 레거시/특수 케이스에 한정해 사용하세요.

D) samtools는 무엇을 하나요?

우리가 쓰는 주요 옵션: -@ <threads>(병렬), view -bS(BAM 출력), sort -o(출력 지정). 필요하면 view -C -T REF로 CRAM 저장도 가능(호환성 확인).

E) 왜 bwa | samtools 스트리밍으로 처리하나?

WGS에서는 SAM이 너무 큽니다

WGS 한 샘플의 SAM은 수백 GB까지 커질 수 있습니다. 그래서 bwa mem의 출력(SAM 텍스트)을 디스크에 저장하지 않고 파이프(|)로 즉시 samtools viewsort에 넘겨 정렬된 BAM을 바로 만듭니다.

장점: 디스크 절약 · I/O 감소 · 파이프라인 간소화.

F) 단일 샘플 예제 (스트리밍 → 정렬 BAM + 인덱스)


THREADS=20
REF="/home/kang/raw_data/gatk_bundle/v0/Homo_sapiens_assembly38.fasta"
R1="/home/kang/God_Nas/WGS_2nd/Trimmed_fastq/NP-21_R1.trimmed.fastq.gz"
R2="/home/kang/God_Nas/WGS_2nd/Trimmed_fastq/NP-21_R2.trimmed.fastq.gz"
OUT="/home/kang/God_Nas/WGS_2nd/aln"
SAMPLE="NP-21"
mkdir -p "${OUT}"

# Read Group(RG) — GATK 단계에서 필수/중요
RG="@RG\tID:${SAMPLE}\tSM:${SAMPLE}\tLB:${SAMPLE}\tPL:ILLUMINA"

# BWA-MEM 정렬 (SAM을 파일로 쓰지 않고 바로 BAM으로)
bwa mem \
  -t ${THREADS} \
  -M \            # Picard/GATK 호환(보조 정렬을 secondary로 마킹)
  -R "${RG}" \
  "${REF}" "${R1}" "${R2}" \
| samtools view  -@ ${THREADS} -bS - \
| samtools sort  -@ ${THREADS} -o "${OUT}/${SAMPLE}.sorted.bam" -

samtools index -@ ${THREADS} "${OUT}/${SAMPLE}.sorted.bam"

# (선택) QC 요약
samtools flagstat -@ ${THREADS} "${OUT}/${SAMPLE}.sorted.bam" > "${OUT}/${SAMPLE}.flagstat.txt"
samtools idxstats "${OUT}/${SAMPLE}.sorted.bam" > "${OUT}/${SAMPLE}.idxstats.txt"
Read Group (RG)란? 왜 중요할까

RG는 동일한 조건(플랫폼/플로셀/레인/바코드/라이브러리 등)에서 만들어진 리드 묶음에 붙이는 메타데이터입니다. GATK·samtools 등 거의 모든 도구가 RG 정보를 활용합니다.

  • SM(Sample): 샘플 이름. 변이콜링에서 샘플 식별에 사용. 샘플마다 유일해야 함.
  • ID(Read group ID): 각 RG의 고유 ID. 보통 FLOWCELL.LANE 조합 등으로 유일하게.
  • LB(Library): 라이브러리(시료 준비 단위). 중복 마킹/통계가 라이브러리 단위로 집계됨.
  • PL(Platform): ILLUMINA 등.
  • PU(Platform unit, 선택): FLOWCELL.LANE.BARCODE 같이 더 세밀한 단위.
주의: RG/SM 라벨링이 잘못되면 Variant calling 시 모든 샘플이 하나의 샘플로 인식되거나 BQSR 모델링이 왜곡될 수 있습니다. 각 샘플은 서로 다른 SM을 가져야 하며, 같은 샘플의 여러 레인/러는 동일 SM + 서로 다른 ID/PU를 사용하세요.

RG 확인

samtools view -H /path/to/sample.sorted.bam | grep '^@RG'

RG 수정(예: 잘못된 RG를 교체)

gatk AddOrReplaceReadGroups \
  -I in.bam -O out.bam \
  -ID FLOWCELL1.L1 -SM SAMPLE1 -LB LIB1 -PL ILLUMINA -PU FLOWCELL1.L1.BC01
samtools index out.bam

G) 배치 실행 스크립트 (run_alignment.sh)

트리밍 디렉토리의 *_R1.trimmed.fastq.gz를 기준으로 페어를 찾아 일괄 정렬합니다.


#!/usr/bin/env bash
set -euo pipefail

THREADS=20
REF="/home/kang/raw_data/gatk_bundle/v0/Homo_sapiens_assembly38.fasta"
IN="/home/kang/God_Nas/WGS_2nd/Trimmed_fastq"
OUT="/home/kang/God_Nas/WGS_2nd/aln"
mkdir -p "${OUT}"

shopt -s nullglob
for R1 in "${IN}"/*_R1.trimmed.fastq.gz; do
  SAMPLE="$(basename "${R1}" _R1.trimmed.fastq.gz)"
  R2="${IN}/${SAMPLE}_R2.trimmed.fastq.gz"
  [[ -f "${R2}" ]] || { echo "[WARN] ${SAMPLE}: R2 not found — skip"; continue; }

  RG="@RG\tID:${SAMPLE}\tSM:${SAMPLE}\tLB:${SAMPLE}\tPL:ILLUMINA"

  echo "[ALIGN] ${SAMPLE} with BWA-MEM"
  bwa mem -t ${THREADS} -M -R "${RG}" "${REF}" "${R1}" "${R2}" \
    | samtools view -@ ${THREADS} -bS - \
    | samtools sort -@ ${THREADS} -o "${OUT}/${SAMPLE}.sorted.bam" -

  samtools index -@ ${THREADS} "${OUT}/${SAMPLE}.sorted.bam"
  samtools flagstat -@ ${THREADS} "${OUT}/${SAMPLE}.sorted.bam" > "${OUT}/${SAMPLE}.flagstat.txt"
done

echo "All done. BAMs in: ${OUT}"

H) 파일 형식 한눈에

요약
  • Alignment는 리드를 레퍼런스에 배치하는 과정으로, BWA는 BWT/FMI 기반의 빠른 매퍼입니다.
  • BWA-MEM이 현대 Illumina WGS/WES의 사실상 표준입니다. (backtrack/SW는 레거시/특수 케이스)
  • Read Group(RG)는 필수 메타데이터. 샘플마다 SM이 고유해야 하며, 잘못 라벨링하면 변이콜링에서 모든 샘플이 1개로 합쳐져 인식될 수 있습니다.
  • 스트리밍 처리: bwa memsamtools view -bSsamtools sort 를 파이프(|)로 연결해 SAM을 디스크에 남기지 않고 바로 sorted BAM 생성.
  • 산출물: sample.sorted.bam + .bai. 정합성은 flagstat, idxstats로 점검.