트리밍된 페어드엔드 FASTQ를 BWA로 레퍼런스에 정렬하고, samtools로 바로 BAM을 만들어 인덱싱까지 진행합니다. 기본 쓰레드는 20을 사용합니다.
NGS 리드를 레퍼런스 게놈의 위치에 배치하는 과정입니다. 보통 seed-and-extend 전략과 FM-index(Burrows–Wheeler Transform 기반)를 사용해 빠르게 후보 위치를 찾고, 갭/불일치를 허용한 지역 정렬로 최종 매핑을 확정합니다. 결과는 SAM/BAM 형식으로 저장되며, 각 리드에는 MAPQ(매핑 품질)과 CIGAR(매칭/삽입/삭제 패턴) 같은 메타정보가 포함됩니다.
BWA (Burrows–Wheeler Aligner)는 BWT/FMI를 활용하는 빠른 리드 매퍼입니다. 로우에러의 짧은~중간 길이 리드(일반적 Illumina)에 최적화되어 있으며, 변이콜링 파이프라인(예: GATK)과 호환성이 매우 좋습니다.
| 알고리즘 | 명령 | 설계 배경 / 특징 | 권장 리드 길이 | 정렬 유형 | 주요 용도/비고 |
|---|---|---|---|---|---|
| BWA-backtrack | bwa aln → bwa 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는 레거시/특수 케이스에 한정해 사용하세요.
samtools view: SAM⇄BAM 변환, 태그/리전 필터 (-bS = BAM 출력, SAM 입력 허용).samtools sort: (좌표 기준) 정렬된 BAM 생성. -@로 스레드 병렬화.samtools index: .bai 인덱스 생성 → 특정 구간만 빠르게 접근.samtools flagstat/idxstats: 매핑 요약 통계(QC) 확인.
우리가 쓰는 주요 옵션: -@ <threads>(병렬), view -bS(BAM 출력),
sort -o(출력 지정). 필요하면 view -C -T REF로 CRAM 저장도 가능(호환성 확인).
bwa | samtools 스트리밍으로 처리하나?
WGS 한 샘플의 SAM은 수백 GB까지 커질 수 있습니다. 그래서 bwa mem의 출력(SAM 텍스트)을
디스크에 저장하지 않고 파이프(|)로 즉시 samtools view와 sort에 넘겨
정렬된 BAM을 바로 만듭니다.
장점: 디스크 절약 · I/O 감소 · 파이프라인 간소화.
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"
RG는 동일한 조건(플랫폼/플로셀/레인/바코드/라이브러리 등)에서 만들어진 리드 묶음에 붙이는 메타데이터입니다. GATK·samtools 등 거의 모든 도구가 RG 정보를 활용합니다.
ILLUMINA 등.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
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}"
bwa mem → samtools view -bS → samtools sort 를 파이프(|)로 연결해 SAM을 디스크에 남기지 않고 바로 sorted BAM 생성.sample.sorted.bam + .bai. 정합성은 flagstat, idxstats로 점검.