美文网首页Call Mutation基因组学生物信息学
实战之 mutect2检测somatic变异流程

实战之 mutect2检测somatic变异流程

作者: bioYIYI | 来源:发表于2020-03-29 21:46 被阅读0次

    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变异流程

        本文链接:https://www.haomeiwen.com/subject/lkkyyhtx.html