比对及去重

比对是生物信息分析最常用的方法,就是把自己的数据拿去跟参考数据进行比较,得到差异的结果。而当所要分析的数据是变异时,差异的结果就是突变的碱基,也可以说是突变的基因。

建立索引

首先需要下载一个参考基因组,正如前面所说,我们使用hg38(GRCh38)。hg38基因组也有多个来源,比如UCSCGIABGATKNCBINCI等等。

将fasta(fna)下载下来后,需要建立索引。这里推荐使用bwa-mem2进行比对,它比标准bwa mem快约3倍,但需要建立专用索引。同时也使用samtools建立索引。

# bwa-mem2索引
bwa-mem2 index GRCh38.d1.vd1.fa

# samtools索引
samtools faidx GRCh38.d1.vd1.fa

bwa-mem2的索引文件为.bwt.2bit.64等,如果这些索引文件不存在,流程会自动退回使用标准bwa mem。

比对

推荐使用bwa-mem2进行比对。它需要CPU支持AVX2或AVX512指令集,至少16线程,以及大于16GB的内存。如果条件不满足,会自动退回使用标准bwa mem。

bwa-mem2 mem \
    -t 16 \
    -M -R "@RG\tID:SRR14724513\tSM:SRR14724513\tPL:illumina\tPU:WES" \
    GRCh38.d1.vd1.fa \
    cleandata/SRR14724513_R1.clean.fq.gz \
    cleandata/SRR14724513_R2.clean.fq.gz | \
samtools sort -@ 4 -m 2G -o bam/SRR14724513.sorted.bam -

samtools index bam/SRR14724513.sorted.bam

比对时务必加入 -R 参数指定Read Group,包含SM(样本名)、ID、PL(测序平台)、PU等信息,不然部分识别SM tag的程序可能会报错。-M 参数标记短split reads为secondary,以便与Picard兼容。

如果使用标准bwa mem,命令格式完全一致,只需将bwa-mem2替换为bwa

标记重复

需要对重复reads进行标记。这里使用sambamba,它的效率比GATK MarkDuplicates更高。

mkdir -p ./tmp

sambamba markdup \
    --nthreads 16 \
    --overflow-list-size 1000000 \
    --hash-table-size 1000000 \
    --compression-level 1 \
    bam/SRR14724513.sorted.bam \
    bam/SRR14724513.markdup.bam \
    --tmpdir=./tmp \
    2> bam/SRR14724513.sambamba.log

samtools index bam/SRR14724513.markdup.bam

文库复杂度评估

标记重复后,使用samtools flagstat统计reads信息,并通过Lander-Waterman模型估算文库大小:

samtools flagstat bam/SRR14724513.markdup.bam > bam/SRR14724513.flagstat

# 从flagstat中提取总数和重复数
TOTAL_READS=$(grep "in total" bam/SRR14724513.flagstat | awk '{print $1}')
DUPLICATES=$(grep "duplicates" bam/SRR14724513.flagstat | awk '{print $1}')

# Lander-Waterman文库复杂度估算
awk -v N="$TOTAL_READS" -v D="$DUPLICATES" '
BEGIN {
    U = N - D;
    if (N == 0 || U == 0) { C = 0; }
    else if (U >= N) { C = N; }
    else {
        lower = U; upper = N * 1000.0;
        for (i = 0; i < 100; i++) {
            C = (lower + upper) / 2.0;
            U_est = C * (1.0 - exp(-N / C));
            diff = U_est - U;
            if (diff < 0) diff = -diff;
            if (diff < 0.1) break;
            else if (U_est < U) lower = C;
            else upper = C;
        }
    }
    printf "Total Reads:          %d\n", N
    printf "Duplicate Reads:      %d\n", D
    printf "Unique Reads:         %d\n", U
    printf "PERCENT_DUPLICATION:  %.4f\n", (N > 0 ? (D / N) : 0)
    printf "--------------------------------------\n"
    printf "ESTIMATED_LIBRARY_SIZE: %d\n", C
}' > bam/SRR14724513.sambamba.stats

ESTIMATED_LIBRARY_SIZE是文库复杂度的估计值,可以理解为文库中理论上独立的DNA分子数量。这个值越大,说明文库多样性越高。

结果质控

在比对后,需要进行多层次的质控。

覆盖度统计

使用xamdst统计靶向区域的覆盖情况、覆盖深度等信息:

xamdst -1 \
    -p bed/S31285117_Covered.bed \
    -o qc/xamdst \
    --threads 16 \
    --cutoffdepth 1000 \
    bam/SRR14724513.markdup.bam

cp qc/xamdst/coverage.report.json qc/SRR14724513.xamdst.report.json

--cutoffdepth 1000指定关注的深度上限为1000X,-1表示单端模式统计。

比对信息统计

使用gatk来统计比对质量和靶向捕获效率:

gatk CollectAlignmentSummaryMetrics \
    -I bam/SRR14724513.markdup.bam \
    -R GRCh38.d1.vd1.fa \
    -O qc/metrics/SRR14724513.metrics.txt

gatk BedToIntervalList \
    -I bed/S31285117_Covered.bed \
    -O S31285117.interval_list \
    -SD GRCh38.d1.vd1.fa

gatk CollectHsMetrics \
    -BI S31285117.interval_list \
    -TI S31285117.interval_list \
    -I bam/SRR14724513.markdup.bam \
    -O qc/metrics/SRR14724513.hs.txt

CollectHsMetrics会计算On-target rate、Fold enrichment、Fold 80 base penalty等WES特有的质控指标。

样本指纹检测

使用Pengelly 24-SNP面板对样本进行身份鉴定,生成指纹文件:

bcftools mpileup \
    -f GRCh38.d1.vd1.fa \
    -R pengelly_snp.txt \
    --annotate FORMAT/AD,FORMAT/DP \
    bam/SRR14724513.markdup.bam | \
bcftools call -m -Ov -o fingerprint.vcf

这个指纹可以用来跨样本身份追踪,防止样本混淆。

性别评估

需要计算数据的性别,然后与临床信息中的性别进行比较,作为数据的一个初步质控。

使用统计SRY基因覆盖reads数的方案,这是最常用的方案:

# GRCh38
samtools view bam/SRR14724513.markdup.bam Y:2786855-2787682 | wc -l

# GRCh37
samtools view bam/SRR14724513.markdup.bam Y:2654896-2655723 | wc -l

SRY基因位于Y染色体上,男性的测序数据应有一定数量的reads覆盖该区域,女性则几乎没有。一般以30 reads为阈值进行区分。

QC汇总报告

将以上所有质控信息汇总为一个JSON报告:

python3 generate_qc_report.py \
    --sample SRR14724513 \
    --output qc/SRR14724513.qc.json \
    --fastp qc/SRR14724513.fastp_stats.json \
    --xamdst qc/SRR14724513.xamdst.report.json \
    --fingerprint qc/SRR14724513.fingerprint.json \
    --metrics qc/metrics/SRR14724513.metrics.txt \
    --hs qc/metrics/SRR14724513.hs.txt \
    --sry qc/SRR14724513.SRY.count.txt \
    --sry-cutoff 30 \
    --sambamba-stats bam/SRR14724513.sambamba.stats

这个汇总报告包含了fastp质控、覆盖度、比对质量、文库复杂度、性别、指纹等所有质控信息,便于统一查看。