查看原文
其他

最新版针对RNA-seq数据的GATK找变异流程

生信技能树 生信技能树 2022-06-07

RNA-seq标准分析,我们已经讲解的太多了,表达矩阵到差异分析等下游生物学注释都没有啥新颖之处,融合基因和可变剪切算是出彩的地方,如果加上GATK找变异流程就更棒了,反正都使用了star软件进行序列比对拿到bam文件了。

如果你简单谷歌搜索关键词:gatk best practices pipeline rna-seq 会搜索到大量过期的教程

  • 2014年5月6日 - Best Practices workflow for RNAseq  https://gist.github.com/PoisonAlien/c6c03539cf4b1ac41cf1

  • 2016年10月27日 - https://www.biostars.org/p/219281/

  • 2016年10月17日 -   https://gatkforums.broadinstitute.org/gatk/discussion/3892/the-gatk-best-practices-for-variant-calling-on-rnaseq-in-full-detail

  • 2017年3月17日 -  2017 Mar 17. doi: 10.12688/wellcomeopenres.10501.2

因为软件和数据库都是在持续更新,所以我们必须得紧跟潮流。

我们需要看最新的:Best Practices Workflows | Created 2018-01-09 | Last updated 2019-07-11 ,链接是 https://software.broadinstitute.org/gatk/best-practices/workflow?id=11164

image-20191107112152080

回顾一下star的2-pass比对代码

我在介绍star-fusion:最好用的融合基因查找工具终于正式发表了 的时候,附带了比对代码,核心代码是:

start=$(date +%s.%N)
echo star start `date`
$bin_star --runThreadN  4  --genomeDir $star_index  \
--twopassMode Basic --outReadsUnmapped None --chimSegmentMin 12  \
--alignIntronMax 100000 --chimSegmentReadGapMax parameter 3  \
--alignSJstitchMismatchNmax 5 -1 5 5  \
--readFilesCommand zcat --readFilesIn $fq1 $fq2 --outFileNamePrefix  ${sample}_
mv ${sample}_Aligned.out.sam $sample.sam
$bin_samtools sort -o $sample.bam  $sample.sam
$bin_samtools index $sample.bam
$bin_samtools flagstat $sample.bam  > $sample.flagstat
# 这里需要判断上一个步骤是否成功,判断命令状态
touch  ok.star.$sample.status
rm  $sample.sam
echo star  end  `date`
dur=$(echo "$(date +%s.%N) - $start" | bc)
printf "Execution time for star : %.6f seconds" $dur

实际上就是一行命令在运行比对过程,但是呢,参数太多了,调起来很麻烦,通常如果不理解的话就不建议修改参数。如果你确实需要做star-fusion 有一个链接需要注意:https://github.com/STAR-Fusion/STAR-Fusion/issues/104  我们这里仅仅是需要star比对后的bam文件来走GATK找变异流程。

参考基因组都使用star-fusion的31G数据库文件里面的:

~/biosoft/starFusion/db/GRCh38_gencode_v31_CTAT_lib_Oct012019.plug-n-play/ctat_genome_lib_build_dir

值得注意的是,因为下载star-fusion的31G数据库文件解压后只有 ref_genome.fa ,并没有 ref_genome.dict,需要自己构建。

Picard CreateSequenceDictionary creates .dict file and samtools faidx creates a .fai file. Both are needed for GATK. 自行搜索如何构建哈。

image-20191107141859696

下载最新版GATK

官网:https://software.broadinstitute.org/gatk/  目前最新版是:4.1.4.0 我后面的教程都是基于此:

地址是:https://github.com/broadinstitute/gatk/releases/download/4.1.4.0/gatk-4.1.4.0.zip

mkdir -p ~/biosoft 
cd ~/biosoft
mkdir gatk
wget https://github.com/broadinstitute/gatk/releases/download/4.1.4.0/gatk-4.1.4.0.zip 
unzip gatk-4.1.4.0.zip 

主要流程

首先去除PCR重复

conda activate rna
# 我们对bam文件取部分作为测试数据
samtools view -h ../star/SRR2016932.bam|head -100000 > tmp.sam
samtools sort -O bam -@ 4 tmp.sam -o tmp.bam
samtools index tmp.bam

conda install -y -c bioconda sambamba
sample=tmp
sambamba markdup --overflow-list-size 600000  --tmpdir='./'  -r  $sample.bam  ${sample}_rmd.bam

然后SplitNCigarReads

这个时候需要参考基因组文件,以及配套的dict好fai文件。

gatk='/home/jmzeng/biosoft/gatk/gatk-4.1.4.0/gatk'
GENOME='/home/jmzeng/biosoft/starFusion/db/GRCh38_gencode_v31_CTAT_lib_Oct012019.plug-n-play/ctat_genome_lib_build_dir/ref_genome.fa'
$gatk  CreateSequenceDictionary -R $GENOME # 最新版gatk,这个步骤非常快
$gatk SplitNCigarReads -R $GENOME \
-I ${sample}_rmd.bam \
-O  ${sample}_rmd_split.bam

这样得到的bam文件,才跟DNA流程的类似,可以走gatk后续流程了。

接着走Base Quality Recalibration

gatk='/home/jmzeng/biosoft/gatk/gatk-4.1.4.0/gatk'
DBSNP=/home/jmzeng/biosoft/GATK/resources/bundle/hg38/dbsnp_146.hg38.vcf.gz
kgSNP=/home/jmzeng/biosoft/GATK/resources/bundle/hg38/1000G_phase1.snps.high_confidence.hg38.vcf.gz
kgINDEL=/home/jmzeng/biosoft/GATK/resources/bundle/hg38/Mills_and_1000G_gold_standard.indels.hg38.vcf.gz
GENOME='/home/jmzeng/biosoft/starFusion/db/GRCh38_gencode_v31_CTAT_lib_Oct012019.plug-n-play/ctat_genome_lib_build_dir/ref_genome.fa'

# 因为我的star比对得到的bam文件里面没有 Read groups
# 参考:https://gatkforums.broadinstitute.org/gatk/discussion/6472/read-groups
$gatk AddOrReplaceReadGroups   -I  ${sample}_rmd_split.bam  \
  -O  ${sample}_rmd_split_add.bam -LB $sample -PL ILLUMINA -PU $sample -SM $sample
$gatk  --java-options "-Xmx20G -Djava.io.tmpdir=./"   BaseRecalibrator \
        -I  ${sample}_rmd_split_add.bam \
        -R $GENOME \
        -O ${sample}_recal.table --known-sites $kgSNP --known-sites $kgINDEL

$gatk  --java-options "-Xmx20G -Djava.io.tmpdir=./"   ApplyBQSR \
        -I  ${sample}_rmd_split_add.bam -R $GENOME --output ${sample}_recal.bam -bqsr ${sample}_recal.table

最后Variant Calling

因为最后所有的样本需要合并比较,所以这里使用gvcf模式的Variant Calling

bed=/home/jmzeng/annotation/CCDS/human/exon_probe.GRCh38.gene.150bp.bed
# ftp://ftp.ncbi.nlm.nih.gov/snp/organisms/human_9606/VCF/All_20180418.vcf.gz
bam=${sample}_recal.bam
$gatk  --java-options "-Xmx20G -Djava.io.tmpdir=./"   HaplotypeCaller  \
        -ERC GVCF  -L $bed -R $GENOME -I $bam  --dbsnp $DBSNP -O  ${sample}_gatk.gvcf

一个样本的star比对后的bam文件,走RNA-seq数据的GATK找变异流程得到的全部文件如下:

image-20191107153441355

如果是普通的vcf文件,是需要过滤一下的,官网是这样说的:We recommend specific hard filters, since VQSR and CNNScoreVariants require truth data for training that we don’t yet have for RNA.

因为我这里走的是gvcf模式,所以暂时不需要这个过滤步骤。

串起来成为shell脚本流程

只需要把我们的全部star的bam文件全路径保存为bam_path.txt 文件,就可以使用下面的脚本提交任务批量运行我们的gvcf流程啦,当然也可以控制并行的样本数量,具体需要理解shell脚本的语法了。

cat bam_path.txt |while read id
do
    file=$(basename $id )
    sample=${file%%.*}
    if((i%$number1==$number2))
    then 
        if [  ! -f  ok.gvcf.$sample.status ]; then
            time sambamba markdup --overflow-list-size 600000  --tmpdir='./'  -r  $id  ${sample}_rmd.bam
            time $gatk SplitNCigarReads -R $GENOME \
            -I ${sample}_rmd.bam \
            -O  ${sample}_rmd_split.bam 
            time $gatk AddOrReplaceReadGroups   -I  ${sample}_rmd_split.bam  \
              -O  ${sample}_rmd_split_add.bam -LB $sample -PL ILLUMINA -PU $sample -SM $sample
            time $gatk BaseRecalibrator \
                    -I  ${sample}_rmd_split_add.bam \
                    -R $GENOME \
                    -O ${sample}_recal.table --known-sites $kgSNP --known-sites $kgINDEL

            time $gatk   ApplyBQSR \
                    -I  ${sample}_rmd_split_add.bam -R $GENOME --output ${sample}_recal.bam -bqsr ${sample}_recal.table

            time $gatk HaplotypeCaller  \
                    -ERC GVCF  -L $bed -R $GENOME -I ${sample}_recal.bam  --dbsnp $DBSNP -O  ${sample}_gatk.gvcf
            if [ $? -eq 0 ]; then
                 echo "succeed" $sample  
                 touch ok.gvcf.$sample.status
                 rm ${sample}_rmd.bam     ${sample}_rmd_split.bam      ${sample}_rmd_split_add.bam  
                 rm ${sample}_rmd.bam.bai     ${sample}_rmd_split.bam.bai   
            else
                 echo "failed" $sample  
            fi  # check gvcf status 

        fi ## check whether we need to process current sampel
    fi # check the batch 
    i=$((i+1))
done

一个真正的样本测序数据走这个针对RNA-seq数据的GATK找变异流程会输出的文件非常多,而且耗时很夸张的!

下面的5个文件是需要删除的:

image-20191108124755163

得到vcf文件,目前不显示了。

大家注意一下java问题

仔细看我分步骤调试代码的时候,有时候加上了 " --java-options -Xmx20G -Djava.io.tmpdir=./" 的参数,但是合并起来成为脚本的时候,又删除它了,具体细节看:虽然不知道为什么但是我可以解决这个bug,但它就是被解决了

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存