实战之 mutect2检测somatic变异流程

1 用途

mutect2是GATK(The Genome Analysis Toolkit,是Broad Institute开发的用于二代重测序数据分析的一款软件,里面包含了很多有用的工具)中的一个工具,主要功能是检测体细胞变异,包含SNV和INDEL。GATK4中的mutect2是基于一种贝叶斯模型来检测变异的,这与 MuTect ( Cibulskis et al., 2013)不同。Mutect2 v4.1.0.0 之后的版本支持多个样本的joint calling。

GATK官网有关于mutect2 的详细介绍,也提供了最佳实践共大家参考。但对于新手来说更希望有拿来就能用的流程,而不需要研究官方给的资料。下面小编为大家整理了一套mutect2检测体细胞变异的流程(核心还是最佳实践。这里仅针对配对样本),共初学者们参考。默认上游已经完成了比对(比对推荐BWA),我们的分析将从对bam文件的BQSR校正开始。

2 实战

本文提供的代码经修改后(路径,样本名等)写到shell文件中,就可以直接运行。

2.1 BQSR校正

#!/bin/bash
SID=样本名
INPUT=/全路径/${SID}.bam
##数据库路径
REF_GENOME=/全路径/ucsc.hg19.fasta
DBSNP=/全路径/dbsnp_138.hg19.vcf
MILLS=/全路径/Mills_and_1000G_gold_standard.indels.hg19.sites.vcf
INDEL=/全路径/1000G_phase1.indels.hg19.sites.vcf
###软件路径GATK_HOME=GATK软件路径
PICARD_HOME=Picard软件路径
TMP_DIR=Tmp路径
###修改bam文件中RG标签
time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=1 -jar \
     ${PICARD_HOME}/picard.jar AddOrReplaceReadGroups \ I=${INPUT} \             
     O=${INPUT%.bam}.new.bam \
     RGID=${SID} \
     RGLB=${SID} \
     RGPL=ILLUMINA \
     RGPU=flowcell-barcode.lane \
     RGSM=${SID}
 rm -f ${INPUT}
 ##BQSR校正
time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=1 -jar \
    ${GATK_HOME}/gatk-package-4.1.2.0-local.jar BaseRecalibrator \
    -R ${REF_GENOME} \
     --known-sites $DBSNP \
    --known-sites $MILLS \
     --known-sites $INDEL \
     -I ${INPUT%.bam}.new.bam \
     -O ${INPUT%.bam}.recal.table
time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=1 -jar \
    ${GATK_HOME}/gatk-package-4.1.2.0-local.jar ApplyBQSR \
     -R ${REF_GENOME} \
     -I ${INPUT%.bam}.new.bam \
     --bqsr-recal-file ${INPUT%.bam}.recal.table \
     -O ${INPUT}
 rm -f ${INPUT%.bam}.new.bam ${INPUT%.bam}.recal.table

BQSR的校正对象是所有样本,也就是说对于成对(pair)样本中的tumor和normal都要进行校正。

2.2 生成PON(panel of normals)文件

先对所有的对照样本(normal)进行预处理(过滤掉配对reads不在同一条染色体上的reads):

#!/bin/bash
SID=样本名#这里仅为normal样本
PANEL=捕获区间bed文件#全基因组测序不需要该参数
 INPUT=${SID}.bam#经过BQSR校正后的bam
OUTPUT=${SID}.vcf.gz
 #数据库
REF_GENOME=/全路径/ucsc.hg19.fasta
GNOMAD=/全路径/af-only-gnomad.raw.sites.b37.vcf.gz
 ###软件路径
GATK_HOME=GATK软件路径
 PICARD_HOME=Picard软件路径
 TMP_DIR=Tmp路径
 time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=1 -jar \
    ${GATK_HOME}/gatk-package-4.1.2.0-local.jar Mutect2 \
     -R ${REF_GENOME} \ -I ${INPUT} \ -O ${OUTPUT} \
     -L ${PANEL} \#全基因组测序不需要改参数
     --germline-resource ${GNOMAD} \
     --max-mnp-distance 0 \
     --disable-read-filter MateOnSameContigOrNoMappedMateReadFilter

接着生成PON文件:

#!/bin/bash
SAMPLE_MAP=对照样本经过预处理后所有的${SID}.vcf.gz文件的全路径列表,每个样本一行
PANEL=捕获区间bed文件#全基因组测序不需要该参数
OUTPUT=pon.${PANEL}.vcf.gz
#数据库
REF_GENOME=/全路径/ucsc.hg19.fasta
GNOMAD=/全路径/af-only-gnomad.raw.sites.b37.vcf.gz
 ###软件路径
GATK_HOME=GATK软件路径
 PICARD_HOME=Picard软件路径
 TMP_DIR=Tmp路径

#数据导入
 time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=4 -jar \
    ${GATK_HOME}/gatk-package-4.1.2.0-local.jar GenomicsDBImport \
     -R ${REF_GENOME} \
     --sample-name-map ${SAMPLE_MAP} \
     --genomicsdb-workspace-path ${SAMPLE_MAP%.txt} \
     -L chr1 -L chr2 -L chr3 -L chr4 -L chr5 -L chr6 -L chr7 -L chr8 -L chr9 \
     -L chr10 -L chr11 -L chr12 -L chr13 -L chr14 -L chr15 -L chr16 -L chr17 \
     -L chr18 -L chr19 -L chr20 -L chr21 -L chr22 -L chrX -L chrY
    -L chrM \
     --batch-size 50 \
     --reader-threads 5

#PON生成
 time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=4 -jar \
    ${GATK_HOME}/gatk-package-4.1.2.0-local.jar CreateSomaticPanelOfNormals \
     -R ${REF_GENOME} \
     --germline-resource ${GNOMAD} \
     -V gendb://${SAMPLE_MAP%.txt} \
     -O ${OUTPUT}

2.3 somatic变异检测与变异过滤

#!/bin/bash
TUMOR=$1 #tumor样本名
NORMAL=$2 #normal样本名
PANEL=捕获区间bed文件#全基因组测序不需要该参数
PON=/全路径/pon.$(PANEL).vcf.gz
TUMOR_BAM=/全路径/${TUMOR}.bam #经过BQSR校正后的bam
NORMAL_BAM=/全路径/${NORMAL}.bam #经过BQSR校正后的bam
RAW_VCF=/全路径/raw/${TUMOR}.vcf.gz
OUTPUT=/全路径/${TUMOR}.vcf.gz

#数据库,涉及到的数据库自己去相应官网下载,漫漫科研路会频繁使用的
REF_GENOME=/全路径/ucsc.hg19.fasta
GNOMAD=/全路径/af-only-gnomad.raw.sites.b37.vcf.gz
EXAC=/全路径/small_exac_common_3_b37.vcf.gz
BWA_IMAGE=/全路径/GRCh38.primary.index.img

###软件路径
GATK_HOME=GATK软件路径
 PICARD_HOME=Picard软件路径
 TMP_DIR=Tmp路径

 # Mutect2
time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=1 -jar \
    ${GATK_HOME}/gatk-package-4.1.2.0-local.jar Mutect2 \
     -R ${REF_GENOME} \
     -I ${TUMOR_BAM} \
     -I ${NORMAL_BAM} \
     -normal ${NORMAL} \
     -L ${PANEL} \
     --panel-of-normals ${PON} \
     --germline-resource ${GNOMAD} \
     --disable-read-filter MateOnSameContigOrNoMappedMateReadFilter \
     --f1r2-tar-gz ${TUMOR_BAM%.bam}.f1r2.tar.gz \
     --bam-output ${TUMOR_BAM%.bam}.bamout.bam \
     -O ${RAW_VCF}

 # Estimate cross-sample contamination
    time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=1 -jar \
    ${GATK_HOME}/gatk-package-4.1.2.0-local.jar GetPileupSummaries \
     -R ${REF_GENOME} \
     -I ${TUMOR_BAM} \
     -V ${EXAC} \
     -L ${EXAC} \
     -L ${PANEL} \
     --interval-set-rule INTERSECTION \
     -O ${TUMOR_BAM%.bam}.getpileupsum.table

time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=1 -jar \
    ${GATK_HOME}/gatk-package-4.1.2.0-local.jar GetPileupSummaries \
     -R ${REF_GENOME} \
     -I ${NORMAL_BAM} \
     -V ${EXAC} \
     -L ${EXAC} \
     -L ${PANEL} \
     --interval-set-rule INTERSECTION \
     -O ${NORMAL_BAM%.bam}.getpileupsum.table

 time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=1 -jar \
    ${GATK_HOME}/gatk-package-4.1.2.0-local.jar CalculateContamination \
     -I ${TUMOR_BAM%.bam}.getpileupsum.table \
     -matched ${NORMAL_BAM%.bam}.getpileupsum.table \
     -O ${TUMOR_BAM%.bam}.contamination.table \
     --tumor-segmentation ${TUMOR_BAM%.bam}.segmentation.table
rm  -f ${TUMOR_BAM%.bam}.getpileupsum.table ${NORMAL_BAM%.bam}.getpileupsum.table
rm -f ${TUMOR_BAM} ${NORMAL_BAM} ${TUMOR_BAM%.bam}.bai ${NORMAL_BAM%.bam}.bai
 
#计算Orientation bias模型参数
time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=1 -jar \     ${GATK_HOME}/gatk-package-4.1.2.0-local.jar LearnReadOrientationModel \
     -I ${TUMOR_BAM%.bam}.f1r2.tar.gz \
     -O ${TUMOR_BAM%.bam}.artifact.tar.gz
 rm -f ${TUMOR_BAM%.bam}.f1r2.tar.gz
 # Filter for confident somatic calls

time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=1 -jar \
    ${GATK_HOME}/gatk-package-4.1.2.0-local.jar FilterMutectCalls \
     -R ${REF_GENOME} \ -V ${RAW_VCF} \
     --contamination-table ${TUMOR_BAM%.bam}.contamination.table \
     --tumor-segmentation ${TUMOR_BAM%.bam}.segmentation.table \
     --ob-priors ${TUMOR_BAM%.bam}.artifact.tar.gz \
     -stats ${RAW_VCF}.stats \
     -O ${RAW_VCF%.vcf.gz}.filtered.vcf.gz
 rm -f ${TUMOR_BAM%.bam}.segmentation.table ${TUMOR_BAM%.bam}.artifact.tar.gz
rm -f ${TUMOR_BAM%.bam}.contamination.table
rm -f ${RAW_VCF} ${RAW_VCF}.tbi ${RAW_VCF}.stats
 #过滤由于比对引入的Artifacts

time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=1 -jar \
     ${GATK_HOME}/gatk-package-4.1.2.0-local.jar FilterAlignmentArtifacts \
     -R ${REF_GENOME} \ -V ${RAW_VCF%.vcf.gz}.filtered.vcf.gz \
     -I ${TUMOR_BAM%.bam}.bamout.bam \
     --bwa-mem-index-image ${BWA_IMAGE} \
     -O ${OUTPUT}
 rm -f ${RAW_VCF%.vcf.gz}.filtered.vcf.gz ${RAW_VCF%.vcf.gz}.filtered.vcf.gz.tbi
 rm -f ${TUMOR_BAM%.bam}.bamout.bam ${TUMOR_BAM%.bam}.bamout.bai 

2.4 变异LeftAlign、indel碱基Trim、拆分复等位变异,提取

#!/bin/bash
 INPUT=上一步生成的变异文件(*.vcf.gz)
OUTPUT=/全路径/pass/${INPUT##*/}
#数据库,涉及到的数据库自己去相应官网下载,漫漫科研路会频繁使用的REF_GENOME=/全路径/ucsc.hg19.fasta
###软件路径
GATK_HOME=GATK软件路径 PICARD_HOME=Picard软件路径 TMP_DIR=Tmp路径
 
time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=4 -jar \
    ${GATK_HOME}/gatk-package-4.1.2.0-local.jar LeftAlignAndTrimVariants \
     -R ${REF_GENOME} \
    -V ${INPUT} \
     -O ${OUTPUT}.biallele.vcf \
     --split-multi-allelics
 cat ${OUTPUT}.biallele.vcf | egrep '^##fileformat|^##FORMAT|^##INFO|^##contig' > ${OUTPUT}.vcf
cat ${OUTPUT}.biallele.vcf | grep -v '^##' | cut -f1-9,11 >> ${OUTPUT}.vcf
 rm -f ${OUTPUT}.biallele.vcf ${OUTPUT}.biallele.vcf.idx

 time java -Djava.io.tmpdir=${TMP_DIR} -XX:ParallelGCThreads=4 -jar \
    ${GATK_HOME}/gatk-package-4.1.2.0-local.jar SelectVariants \
     -V ${OUTPUT}.vcf \
     -O ${OUTPUT} \
     --exclude-non-variants \
     --exclude-filtered
 rm -f ${OUTPUT}.vcf

经过上述过程已经将高质量的somatic变异检测及提取出来啦~~

感谢流程原始撰写者WM大侠~


对上述流程进行简单总结:

最后为初学者提供一些关于mutec2 的介绍,虽然都是来自GATK官网,但毕竟官网辣么大,慢慢遨游也需要些时间~

GATK4 Mutect2官网介绍:https://gatk.broadinstitute.org/hc/en-us/articles/360037593851-Mutect2

最佳实践之预处理:https://gatk.broadinstitute.org/hc/en-us/articles/360035535912

最佳实践之somatic SNV/indel检测:https://gatk.broadinstitute.org/hc/en-us/articles/360035894731-Somatic-short-variant-discovery-SNVs-Indels-

讨论社区:https://gatk.broadinstitute.org/hc/en-us/community/topics

FilterMutectCalls:https://gatk.broadinstitute.org/hc/en-us/articles/360037225412-

当然,实现一次分析不是目的,有时间还是要好好研究一下官网~

你可能感兴趣的:(实战之 mutect2检测somatic变异流程)