全外显子测序(WES)分析流程
构建数据文件夹
创建一个WES项目的日期目录和存放每个步骤生成文件的子目录raw, clean, align, genome
mkdir {raw,clean,align,genome,hg19_VCF}
此流程包含两个raw外显子测序文件:wes.1.fq.gz,wes.2.fq.gz;存放于raw目录
原始数据质控,用fastp
# 项目主目录下运行,在clean目录下生成两个过滤的fq文件
nohup fastp -i raw/wes.1.fq.gz -o clean/wes.1.clean.fq.gz -I raw/wes.2.fq.gz -O clean/wes.2.clean.fq.gz &
下载参考基因组(hg19)文件,存放于genome目录,并建立索引:
for i in $(seq 1 22) X Y M;
do
nohup wget http://hgdownload.cse.ucsc.edu/goldenPath/hg19/chromosomes/chr${i}.fa.gz &
done
for i in $(seq 1 22) X Y M;
do cat chr${i}.fa >> hg19.fa;
done
nohup bwa index -a bwtsw -p hg19 hg19.fa &
比对
# clean目录下运行此命令,在align目录下生成sam文件
nohup bwa mem -t 4 -M -R "@RG\tID:lane1\tPL:illumina\tLB:library\tSM:wes" ../genome/hg19 wes.1.clean.fq.gz wes.2.clean.fq.gz >../align/wes.sam 2>wes.bwa.align.log &
-t,线程数;
-M , -M 将 shorter split hits 标记为次优,以兼容 Picard markDuplicates 软件;
-R 接的是 Read Group的字符串信息,它是用来将比对的read进行分组的,这个信息对于我们后续对比对数据进行错误率分析和Mark duplicate时非常重要。
(1) ID,这是Read Group的分组ID,一般设置为测序的lane ID
(2) PL,指的是所用的测序平台
(3) SM,样本ID
(4) LB,测序文库的名字
这些信息设置好之后,在RG字符串中要用制表符(\t)将它们分开
samtools view -b -S wes.sam > wes.bam #sam2bam,便于存储
samtools sort wes.bam -o wes.sorted.bam #有顺序的排序,便于后面的操作
samtools flagstat wes.sorted.bam > wes.sorted.bam.flagstat #统计比对信息
1. QC pass的reads的数量为5002344 ,未通过QC的reads数量为0,意味着一共有5002344条reads;
2.标记为secondary的read
3. 嵌合体reads
4.PCR 重复引起的reads
5. 比对到参考基因组上的reads数量;
6. paired reads数据数量;
7. read1的数量;
8. read2 的数量;
9. 正确地匹配到参考序列的reads数量;
10. 一对reads都比对到了参考序列上的数量,但是并不一定比对到同一条染色体上;
11. 一对reads中只有一条与参考序列相匹配的数量;
12. 一对reads比对到不同染色体的数量;
13. 一对reads比对到不同染色体的且比对质量值大于5的数量。
外显子区域覆盖度
需要生成外显子interval文件,生成这个文件的前提又需要dict文件和外显子bed文件(此处用的是安捷伦外显子bed文件,也可以去UCSC下载)。
gatk CreateSequenceDictionary -R hg19.fa -O hg19.dict
gatk BedToIntervalList -I S31285117_Regions.bed -O Exon.Interval.bed -SD ./genome/hg19.dict
gatk CollectHsMetrics -BI Exon.Interval.bed -TI Exon.Interval.bed -I wes.sorted.bam -O wes.stat.txt
标记PCR重复序列并建立索引
以前用picard标记重复序列,现在这个工具全部整合到gatk中了
nohup gatk --java-options "-Xmx10G -Djava.io.tmpdir=./" MarkDuplicates -I wes.sorted.bam -O wes.sorted.MarkDuplicates.bam -M wes.sorted.bam.metrics > log.mark 2>&1 &
samtools view -f 1024 wes.sorted.MarkDuplicates.bam | less
samtools index wes.sorted.MarkDuplicates.bam
wes.sorted.bam.metrics有统计信息 wes.sorted.MarkDuplicates.bam创建索引文件,他的作用能够让我们可以随机访问这个文件中的任意位置,而且后面的步骤也要求这个bam文件一定要有索引。
变异检测
重新校正碱基质量值(BQSR)
变异检测是一个极度依赖测序碱基质量值,因为这个质量值是衡量我们测序出来的这个碱基到底有多正确的重要指标。它来自于测序图像数据的base calling,因此,基本上是由测序仪和测序系统来决定的,计算出来的碱基质量值未必与真实结果统一。 BQSR(Base Quality Score Recalibration)这个步骤主要是通过机器学习的方法构建测序碱基的错误率模型,然后对这些碱基的质量值进行相应的调整。 这里包含了两个步骤: 第一步,BaseRecalibrator,这里计算出了所有需要进行重校正的read和特征值,然后把这些信息输出为一份校准表文件(wes.recal_data.table) 第二步,ApplyBQSR,这一步利用第一步得到的校准表文件(wes.recal_data.table)重新调整原来BAM文件中的碱基质量值,并使用这个新的质量值重新输出一份新的BAM文件。
首先下载变异注释文件
wget -c -r -nd -np -k -L -p ftp://gsapubftp-anonymous@ftp.broadinstitute.org/bundle/hg19
下载文件均为压缩文件,需要解压才能使用
samtools faidx hg19.fa
GENOME=./genome/hg19.fa
hg19_VCF=./hg19_VCF/
gatk --java-options "-Xmx10G -Djava.io.tmpdir=./" BaseRecalibrator \
-R $GENOME -I ./align/wes.sorted.MarkDuplicates.bam \
--known-sites $hg19_VCF/1000G_phase1.indels.hg19.sites.vcf \
--known-sites $hg19_VCF/Mills_and_1000G_gold_standard.indels.hg19.sites.vcf \
--known-sites $hg19_VCF/dbsnp_138.hg19.vcf \
-L S31285117_Regions.bed -O wes.recal_data.table
gatk --java-options "-Xmx10G -Djava.io.tmpdir=./" ApplyBQSR \
-R $GENOME -I ./align/wes.sorted.MarkDuplicates.bam \
-bqsr wes.recal_data.table -L S31285117_Regions.bed \
-O wes.sorted.MarkDuplicates.BQSR.bam
# gatk AnalyzeCovariates -bqsr wes.recal_data.table -plots wes.recal_data.table.plot
变异检测
HaplotypeCaller的应用有两种做法,差别只在于要不要在中间生成一个gVCF: (1)直接进行HaplotypeCaller,这适合于单样本,或者那种固定样本数量的情况,也就是只执行一次HaplotypeCaller。如果增加一个样本就得重新运行这个HaplotypeCaller,而这个时候算法需要重新去读取所有人的BAM文件,浪费大量时间; (2)每个样本先各自生成gVCF,然后再进行群体joint-genotype。gVCF全称是genome VCF,是每个样本用于变异检测的中间文件,格式类似于VCF,它把joint-genotype过程中所需的所有信息都记录在这里面,文件无论是大小还是数据量都远远小于原来的BAM文件。这样一旦新增加样本也不需要再重新去读取所有人的BAM文件了,只需为新样本生成一份gVCF,然后重新执行这个joint-genotype就行了。
推荐使用第二种,变异检测不是一个样本的事情,有越多的同类样本放在一起joint calling结果将会越准确,而如果样本足够多的话,在低测序深度的情况下也同样可以获得完整并且准确的结果。
第一种方法
gatk --java-options "-Xmx8G -Djava.io.tmpdir=./" HaplotypeCaller \
-R $GENOME -I wes.sorted.MarkDuplicates.BQSR.bam \
-D $hg19_VCF/dbsnp_138.hg19.vcf -L S31285117_Regions.bed \
-O wes.raw1.vcf
第二种方法
# 1.生成中间文件gvcf
gatk --java-options "-Xmx8G -Djava.io.tmpdir=./" HaplotypeCaller -R $GENOME \
--emit-ref-confidence GVCF -I wes.sorted.MarkDuplicates.BQSR.bam \
-D $hg19_VCF/dbsnp_138.hg19.vcf -L S31285117_Regions.bed -O wes.gvcf
# 2.通过gvcf检测变异
gatk --java-options "-Xmx8G -Djava.io.tmpdir=./" GenotypeGVCFs \
-R $GENOME -V wes.gvcf -L S31285117_Regions.bed \
-O wes.raw.vcf
若有多个样本的gvcf文件,运行gatk CombineGVCFs \
-V 1.gvcf –V 2.gvcf …… -O final.gvcf ,再用final.gvcf运行第二步
变异质控与过滤
质控的含义和目的是指通过一定的标准,最大可能地剔除假阳性的结果,并尽可能地保留最多的正确数据。 第一种方法 GATK VQSR,它通过机器学习的方法利用多个不同的数据特征训练一个模型(高斯混合模型)对变异数据进行质控,使用VQSR需要具备以下两个条件: 第一,需要一个精心准备的已知变异集,它将作为训练质控模型的真集。比如,Hapmap、OMNI,1000G和dbsnp等这些国际性项目的数据,这些可以作为高质量的已知变异集。 第二,要求新检测的结果中有足够多的变异,不然VQSR在进行模型训练的时候会因为可用的变异位点数目不足而无法进行。
gatk --java-options "-Xmx8G -Djava.io.tmpdir=./" VariantRecalibrator -R $GENOME -V wes.raw.vcf \
-resource hapmap,known=false,training=true,truth=true,prior=15.0:$hg19_VCF/hapmap_3.3.hg19.sites.vcf \
-resource omini,known=false,training=true,truth=false,prior=12.0:$hg19_VCF/1000G_omni2.5.hg19.sites.vcf \
-resource 1000G,known=false,training=true,truth=false,prior=10.0:$hg19_VCF/1000G_phase1.snps.high_confidence.hg19.sites.vcf \
-resource dbsnp,known=true,training=false,truth=false,prior=6.0:$hg19_VCF/dbsnp_138.hg19.vcf \
-an QD -an MQ -an MQRankSum -an ReadPosRankSum -an FS -an SOR -an DP -mode SNP \
-O wes.snps.recal.vcf --tranches-file wes.snps.tranches --rscript-file wes.snps.plots.R &
gatk ApplyRecalibration -V wes.raw.vcf -O wes.VQSR.vcf --recal-file wes.snps.recal.vcf \
--tranches-file wes.snps.tranches -mode SNP
此方法要求新检测的结果中有足够多的变异,不然VQSR在进行模型训练的时候会因为可用的变异位点数目不足而无法进行。可能很多非人的物种在完成变异检测之后没法使用GATK VQSR的方法进行质控,一些小panel、外显子测序,由于最后的变异位点不够,也无法使用VQSR。全基因组分析或多个样本的全外显子组分析适合用此方法。
第二种方法通过过滤指标过滤。 QualByDepth(QD):QD是变异质量值(Quality)除以覆盖深度(Depth)得到的比值。 FisherStrand (FS):FS是一个通过Fisher检验的p-value转换而来的值,它要描述的是测序或者比对时对于只含有变异的read以及只含有参考序列碱基的read是否存在着明显的正负链特异性(Strand bias,或者说是差异性) StrandOddsRatio (SOR):对链特异(Strand bias)的一种描述. RMSMappingQuality (MQ):MQ这个值是所有比对至该位点上的read的比对质量值的均方根. MappingQualityRankSumTest (MQRankSum) ReadPosRankSumTest (ReadPosRankSum) 通过过滤指标过滤
使用SelectVariants,选出SNP
gatk SelectVariants -select-type SNP -V wes.raw.vcf -O wes.snp.vcf
# 为SNP作过滤
gatk VariantFiltration -V wes.snp.vcf --filter-expression "QD < 2.0 || MQ < 40.0 || FS > 60.0 || SOR > 3.0 || MQRankSum < -12.5 || ReadPosRankSum < -8.0" --filter-name "PASS" -O wes.snp.filter.vcf
使用SelectVariants,选出Indel
gatk SelectVariants -select-type INDEL -V wes.raw.vcf -O wes.indel.vcf
# 为Indel作过滤
gatk VariantFiltration -V wes.indel.vcf --filter-expression "QD < 2.0 || FS > 200.0 || SOR > 10.0 || MQRankSum < -12.5 || ReadPosRankSum < -8.0" --filter-name "PASS" -O wes.indel.filter.vcf
突变注释
ANNOVAR是一个perl编写的命令行工具,能在安装了perl解释器的多种操作系统上执行。允许多种输入文件格式,包括最常被使用的VCF格式。输出文件也有多种格式,包括注释过的VCF文件、用tab或者逗号分隔的txt文件,ANNOVAR能快速注释遗传变异并预测其功能。这个软件需要edu邮箱注册才能下载。 ANNOVAR website
数据库下载
perl annotate_variation.pl -buildver hg19 -downdb -webfrom annovar refGene humandb/
# -buildver 表示version
# -downdb 下载数据库的指令
# -webfrom annovar 从annovar提供的镜像下载,不加此参数将寻找数据库本身的源
# humandb/ 存放于humandb/目录下
其它数据库下载
perl annotate_variation.pl --buildver hg19 --downdb gwascatalog humandb/ &
perl annotate_variation.pl --buildver hg19 --downdb ljb26_all --webfrom annovar humandb/ &
perl annotate_variation.pl --buildver hg19 --downdb esp6500siv2_ea --webfrom annovar humandb/ &
perl annotate_variation.pl --buildver hg19 --downdb esp6500siv2_all --webfrom annovar humandb/ &
perl annotate_variation.pl --buildver hg19 --downdb 1000g2014oct humandb/ &
perl annotate_variation.pl --buildver hg19 --downdb cytoBand humandb/ &
perl annotate_variation.pl --buildver hg19 --downdb avsift -webfrom annovar humandb/ &
perl annotate_variation.pl --buildver hg19 --downdb snp138 humandb/ &
perl annotate_variation.pl --buildver hg19 --downdb genomicSuperDups humandb/ &
perl annotate_variation.pl --buildver hg19 --downdb phastConsElements46way humandb/ &
perl annotate_variation.pl --buildver hg19 --downdb tfbs humandb/
三种注释方式
Gene-based Annotation(基于基因的注释):基于基因的注释(gene-based annotation)揭示variant与已知基因直接的关系以及对其产生的功能性影响。 Region-based Annotation(基于区域的注释):基于过滤的注释精确匹配查询变异与数据库中的记录:如果它们有相同的染色体,起始位置,结束位置,REF的等位基因和ALT的等位基因,才能认为匹配。基于区域的注释看起来更像一个区域的查询(这个区域也可以是一个单一的位点),在一个数据库中,它不在乎位置的精确匹配,它不在乎核苷酸的识别。基于区域的注释(region-based annotation)揭示variant与不同基因组特定段的关系。 Filter-based Annotation(基于过滤的注释):filter-based和region-based主要的区别是,filter-based针对mutation(核苷酸的变化)而region-based针对染色体上的位置。如在全基因组数据中的变异频率,可使用1000g2015aug、kaviar_20150923等数据库;在全外显组数据中的变异频率,可使用exac03、esp6500siv2等;在孤立的或者低代表人群中的变异频率,可使用ajews等数据库。 用table_annovar.pl进行注释,可一次性完成三种类型的注释。
convert2annovar.pl # 将多种格式转为.avinput的程序
convert2annovar.pl -format vcf4 wes.snp.filter.vcf >snp.avinput
格式如下:
chr1 69511 69511 A G hom 1736.03 53
chr1 877831 877831 T C hom 85.10 4
chr1 881627 881627 G A het 399.60 37
chr1 887801 887801 A G hom 1623.03 39
chr1 888639 888639 T C hom 3991.03 106
chr1 888659 888659 T C hom 4114.03 109
chr1 897325 897325 G C hom 3998.03 113
chr1 898852 898852 C T het 647.60 38
chr1 900505 900505 G C het 478.60 35
chr1 906272 906272 A C het 540.60 30
avinput文件由tab分割,最重要的地方为前5列,分别是: 1. 染色体(Chromosome) 2. 起始位置(Start) 3. 结束位置(End) 4. 参考等位基因(Reference Allele) 5. 替代等位基因(Alternative Allele) ANNOVAR主要也是利用前五列信息对数据库进行比对,注释变异。
SNP注释:
用table_annovar.pl进行注释,可一次性完成三种类型的注释。
table_annovar.pl snp.avinput $humandb -buildver hg19 -out snpanno \
-remove -protocol refGene,cytoBand,genomicSuperDups,esp6500siv2_all \
-operation g,r,r,f -nastring . -csvout
-buildver hg19 表示使用hg19版本 -out snpanno 表示输出文件的前缀为snpanno -remove 表示删除注释过程中的临时文件 -protocol 表示注释使用的数据库,用逗号隔开,且要注意顺序 -operation 表示对应顺序的数据库的类型(g代表gene-based、r代表region-based、f代表filter-based),用逗号隔开,注意顺序 -nastring . 表示用点号替代缺省的值 -csvout 表示最后输出.csv文件
Indel注释同上