转载:http://blog.sina.com.cn/s/blog_6721167201018jik.html
Change Logs:
13/01/12: 增加了一篇文献,外加一些无聊的修改。
12/08/20: 修正了一个代码错误;增加了对-rf(Read filters)参数的说明。
12/08/14: 补充了2.x版本有改动的一些地方。
12/08/10: 更正一个错误。
12/11/06:因为后面一直都没什么时间,同时也觉得没有什么好讲的了就一直搁置了,在这边再补充说明一下,其实GATK毕竟只是工具,用着方便的地方拿来用就可以,GATK本身也是为了处理千人基因组的数据才开发的,解决了千人基因组测的很多低覆盖度的样本call出来的snp的假阳性太高问题,同时提出了二代测序技术数据处理的一个框架(有兴趣的可以参考这篇文章http://www.nature.com/doifinder/10.1038/ng.806)
这张图的具体实现就是GATK的best practice。不过框架归框架,但实际操作的时候遇到的数据不同,处理方式也不尽相同,毕竟不是每个人都会去大批量的测低覆盖的样本,而且就我看过的文献来说(当然也可能是我文献看的少),其实用到GATK的不算很多,而用到best practice一整个完整流程的好像还没看到过(大部分也就只用其中个别步骤而已) 修正一下,其实有看到过,例如 Jiao, Y. et al. Genome-wide genetic changes during modern breeding of maize. Nature Genetics 44, 812–815 (2012).
不过因为研究目的不同,实际上只要能达到自己数据要说明的问题,用什么工具并不是那么重要,而工具只是方便操作而已,所以在大家用好工具的同时还是要把重点放在数据本身的意义上面,为什么要做这样的处理,这些处理对我的数据有多大的作用,有时候都值得我们去探究(当然其实结果是最重要的(?),谁管你用了哪些花里胡哨的工具,你能自圆其说就可以(当然要圆的很好),这话我敢乱说= = 还是就当我乱说好了。。。)
随便盗个图,顺祝大家科研愉快,多看文献多看报,少打dota少睡觉。
Part2部分主要讲一下GATK用于Variant Detection的一个完整的官方攻略,这个也是我们用GATK最主要的目的,通过对整个流程的了解,也能更好的掌握GATK的使用方法。
这部分就是官网上所谓的best-practices,所用的流程被用于人的基因组数据的处理,但同样也可以用于其他物种。
关于流程的详细描述:
http://www.broadinstitute.org/gatk/guide/best-practices
现在的版本更新到v4,下面先介绍一些之后会用到的一些概念:
Lane: 测序的最基本单位,可以认为是测序的一个run
Library: 建库时候的一个库,一个library可以包含几个lane,即几个lane测的都是同一个库 (一个库包含多个sample或者其他情况这边就暂时不考虑了,能够大致了解这个概念就可以)
Sample: 用来建库的样,一个Sample可以建多个库 (同上这边只考虑这种情况)
Cohort: 所测的样的一个群体,这个取决于实验设计的目的,例如我们测的是某个物种的一个群体,想看看这个群体的一些性质,这边的cohort就是我们测的这个群体的所有samples,他们之间有一定的相互联系,通过把他们放在一起研究可以得到我们所需要的结果。
为了方便起见,假设我们现在测了一个cohort,里面有3个sample (sample01, sample02, sample03),每个sample建了一个paired-end library,每个库一个lane (多库或者多lane的情况只多一些数据合并的步骤,所以这边就举最简单也是一般测序的时候测的比较多的方式,其他方式可以在此基础上增加一些其他处理即可)。这样我们得到的原始reads文件就有6个,分别是
sample01_1.fq, sample01_2.fq,
sample02_1.fq, sample02_2.fq,
sample03_1.fq, sample03_2.fq,
而我们的参考基因组序列名称假设为ref.fasta (注:GATK要求reference sequence的格式是fasta格式的,而且必须以.fa或者.fasta结尾,然后文件还需要经过index,前面已经提过,不再赘述)。
测试用的数据可以从网站上给的地址下载,这边我们只用一些假定的数据来进行说明~
整个流程包括3个阶段,每个阶段又分为好几布,下面一一说明
1) Phase I: Raw data processing (对于mapping结果的处理)
(1) 通过mapping得到原始的mapping结果
我们这边是3个sample,假设我们经过mapping得到的结果为
sample01.bam
sample02.bam
sample03.bam
GATK要求输入文件是BAM格式的,网站上推荐使用bwa进行mapping,bwa速度上比较有优势,而且输出的结果就是SAM格式的,用samtools转换成BAM格式即可,以sample01为例用bwa进行mapping的整个流程代码大致如下:
## step1: 建库,-a参数用来选择建库方式,10M以下基因组用默认
## 的is即可,10M以上的推荐-a设置成bwtsw
bwa index -a is ref.fasta
## step2: 对paired-end的两组reads 分别进行aln
bwa aln ref.fasta sample01_1.fq > sample01_1.sai
bwa aln ref.fasta sample01_2.fq > sample01_2.sai
## step3: 转换得到SAM文件,注意这边@RG这个tag的设置很重要
bwa sampe -r "@RG ID:sample01 LB:sample01 PL:ILLUMINA SM:sample01"
ref.fasta sample01_1.sai sample01_2.sai
sample01_1.fq sample01_2.fq
> sample01.sam
## step4:把SAM格式转换成BAM格式
samtools view -bS sample01.sam -o sample01.bam
## step5:对bam文件进行排序
java -Xmx4g -jar picard-tools-1.70/SortSam.jar
INPUT=sample01.bam
OUTPUT=sample01.sort.bam
SORT_ORDER=coordinate
这一步对bam文件进行排序的时候用的是picard里面的SortSam这个工具,而不是直接用是samtools来进行sort,因为samtools sort排完序以后不会更新BAM文件的头文件,SO这个tag显示的可能还是unsorted,下游程序处理的时候可能会报错;SORT_ORDER这边设置成coordinate表示按照染色体位置进行排序。
通过上面的流程,我们就得到了一个初步的mapping结果:
sample01.sort.bam
sample02.sort.bam
sample03.sort.bam
(2) 处理原始的mapping结果
GATK提供了几种不同层次的处理方法,这边只讲一下最好也是最耗时的一种方式,其他的几种在此基础上调整一些步骤即可实现。
Best: multi-sample realignment with known sites and recalibration
同时考虑多个sample来进行本地重排以及校正,下面简单的介绍一下涉及到的几个步骤。
注: 下面的有些步骤虽然提到要合并文件,但有的工具本身可以指定多个输入文件的话实际上是不需要专门先去合并的,得到的结果就直接是一个合并好的文件,具体情况请根据实际碰到的为准。
for each sample
lanes.bam <- merged lane.bam's for sample
第一步是把同一个sample测了多个lane的结果进行合并,合并可以用picard里面的MergeSamFiles工具来实现。
例如我们要把lane1.bam, lane2.bam, lane3.bam, lane4.bam合并成sample.bam,可以用
## 合并每个sample的bam文件
java -Xmx4g -jar picard-tools-1.70/MergeSamFiles.jar
INPUT=lane1.bam
INPUT=lane2.bam
INPUT=lane3.bam
INPUT=lane4.bam
OUTPUT=sample.bam
因为我们这边每个sample只有一个lane,所以这一步跳过。
dedup.bam <- MarkDuplicates(lanes.bam)
这一步是对每个sample的一些重复序列进行一些处理,这些重复的序列可能是因为PCR扩增的时候引入的一些引物序列,容易干扰下游结果,这个操作可以通过picard里面的MarkDuplicates工具实现,MarkDuplicates处理完成不会删除这些reads而是加上一个标签,带有这些标签的reads在后续处理的时候会被跳过。(注:dedup这一步只要在library层面上进行就可以了,例如一个sample如果建了多个库的话,对每个库进行dedup即可,不需要把所有库合成一个sample再进行dedup操作)
以sample01为例,命令行代码如下:
## 用picard里面的MarkDuplicates工具去除PCR duplicates,这一步会生成
## 两个文件,一个dedup好的bam文件以及一个纯文本文件,这边起名叫
## sample01.dedup.metrics,里面包含duplicates的一些统计信息
java –Xmx4g -jar picard-tools-1.70/MarkDuplicates.jar
MAX_FILE_HANDLES_FOR_READ_ENDS_MAP=8000
INPUT= sample01.sort.bam
OUTPUT= sample01.dedup.bam
METRICS_FILE= sample01.dedup.metrics
realigned.bam <- realign(dedup.bam) [with known sites included if available]
这一步是sample层次的一个本地重排,因为在indel周围出现mapping错误的概率很高,而通过在indel周围进行一些重排可以大大减少由于indel而导致的很多SNP的假阳性,如果已经有一些可靠位点的信息的话 (例如dbsnp的数据),这一步可以只在一些已知的可靠位点周围进行,这样得到的结果比较可靠也比较节省时间;而缺少这些数据的情况下则需要对所有位点都进行这样一个操作。
(题外话:之前版本v3的时候realign是在cohort层次进行的,不过相当耗时耗力,所以到这个版本就废弃了。。。(当然也有一些特例可能需要综合考虑才能得到更好的结果)
realign这一步用的是GATK里面的RealignerTargetCreator和IndelRealigner工具,如果已经有可靠的INDEL位点(如dbsnp数据等等,需要是VCF格式的)信息,可以通过-known参数来进行设置,让realign操作主要集中在这些位点附近,实际情况下可能很多物种并没有这样的参考数据,所以需要对所有INDEL位点进行这样的一个操作:
## 对INDEL周围进行realignment,这个操作有两个步骤,第一步生成需要进行
## realignment的位置的信息,第二步才是对这些位置进行realignment,最后生
## 成一个realin好的BAM文件sample01.realn.bam
java -Xmx4g -jar GenomeAnalysisTK.jar
-R ref.fasta
-T RealignerTargetCreator
-o sample01.realn.intervals
-I sample01.dedup.bam
java -Xmx4g -jar GenomeAnalysisTK.jar
-R ref.fasta
-T IndelRealigner
-targetIntervals sample01.realn.intervals
-o sample01.realn.bam
-I sample01.dedup.bam
recal.bam <- recal(realigned.bam)
sample.bam <- realigned.bam
最后一步是对realign得到的结果进行校正,因为mapping得到的结果的分值往往不能反应真实情况下的分值,而只有尽量消除这种偏态才能保证得到的结果的可靠性与正确性,所以如果情况允许的条件下都需要进行这样的一个校正步骤。这样最后我们就得到一个对于每个sample而言最好的处理结果。
校正这一步对低覆盖度的数据比较重要,可以消除很多假阳性;对于高覆盖度(10x~)的数据可以不做这一步,这一步最重要的是有已知的可靠位点作为参考, human因为研究的比较多,所以有很多这样的数据(包括dbsnp的数据等等),而其他的物种则可能缺少这些数据,这个时候我们可以考虑先做一次初步的variants calling,然后筛选出我们认为最可靠的那些位点作为参考位点,用这部分的数据再来进行校正,下面提供一种用来生成参考位点的数据的方法,仅供参考:## step1: variants calling by GATK
java -jar GenomeAnalysisTK.jar
-R ref.fasta
-T UnifiedGenotyper
-I sample01.realn.bam
-o sample01.gatk.raw.vcf
-stand_call_conf 30.0
-stand_emit_conf 0
-glm BOTH
-rf BadCigar
这边有一个-rf参数,是用来过滤掉不符合要求的reads,这边是把包含错误的Cigar字符串的reads给排除掉,关于Cigar字符串可以参考关于sam文件的说明(The SAM Format Specification),sam文件的第六行就是这边的Cigar字符串,-rf的其他参数可以参考GATK网站Read filters下面的条目http://www.broadinstitute.org/gatk/gatkdocs/
## step2: variants calling by samtools
samtools mpileup -DSugf ref.fasta sample01.realn.bam |
bcftools view -Ncvg -
> sample01.samtools.raw.vcf
## step3: 选取GATK和samtools一致的结果
java -Xmx4g -jar GenomeAnalysisTK.jar
-R ref.fasta
-T SelectVariants
--variant sample01.gatk.raw.vcf
--concordance sample01.samtools.raw.vcf
-o sample01.concordance.raw.vcf
## step4:筛选上面得到的结果,这边filter用到的几个标准可以根据实际情况
## 灵活更改,对QUAL值的筛选用的是$MEANQUAL,表示所有QUAL值的平均
## 值,linux底下这个值可以通过第一条命令行得到
## 计算平均值
MEANQUAL=`awk '{ if ($1 !~ /#/) { total += $6; count++ } }
END { print total/count }' sample01.concordance.raw.vcf`
## 筛选
java -Xmx4g -jar GenomeAnalysisTK.jar
-R ref.fasta
-T VariantFiltration
--filterExpression " QD < 20.0 || ReadPosRankSum < -8.0 || FS > 10.0 || QUAL < $MEANQUAL"
--filterName LowQualFilter
--missingValuesInExpressionsShouldEvaluateAsFailing
--variant sample01.concordance.raw.vcf
--logging_level ERROR
-o sample01.concordance.flt.vcf
## step5:提取通过筛选标准的位点到结果文件中
grep -v "Filter" sample01.concordance.flt.vcf > sample01.confidence.raw.vcf
最后这个sample01.confidence.raw.vcf的结果就可以当作可靠的参考位点用于后面的分析。
校正这个步骤如果使用的是GATK 1.x版本的话需要使用CountCovariates和TableRecalibration等工具,2.x版本取消了这两个工具而改成BaseRecalibrator,下面都给出命令行代码:
## GATK 1.x版本
## step1:生成校正要用的文件sample01.recal_data.pre.csv
java -Xmx4g -jar GenomeAnalysisTK.jar
-R ref.fasta
-T CountCovariates
-cov ReadGroupCovariate
-cov QualityScoreCovariate
-cov CycleCovariate
-cov DinucCovariate
-knownSites sample01.confidence.raw.vcf
-I sample01.realn.bam
-recalFile sample01.recal_data.pre.csv
## step2:这一步和最后两步也可以跳过,主要作用是生成一系列的统计图表,
## 在做完校正之后可以再次生成上一步的文件,这样可以比较清楚的看到校正
## 前后的差别
java -Xmx4g -jar AnalyzeCovariates.jar
-recalFile sample01.recal_data.pre.csv
-outputDir sample01.graphs.pre
-ignoreQ 5
## step3:进行校正,生成校正后的文件sample01.recal.bam
java -Xmx4g -jar GenomeAnalysisTK.jar
-R ref.fasta
-T TableRecalibration
-I sample01.realn.bam
-recalFile sample01.recal_data.pre.csv
-o sample01.recal.bam
## step4:再次生成校正数据sample01.recal_data.post.csv
java -Xmx4g -jar GenomeAnalysisTK.jar
-R ref.fasta
-T CountCovariates
-cov ReadGroupCovariate
-cov QualityScoreCovariate
-cov CycleCovariate
-cov DinucCovariate
-knownSites sample01.confidence.raw.vcf
-I sample01.recal.bam
-recalFile sample01.recal_data.post.csv
## step5:生成统计图表
java -Xmx4g -jar AnalyzeCovariates.jar
-recalFile sample01.recal_data.post.csv
-outputDir sample01.graphs.post
-ignoreQ 5
2.x版本改动最大的就是淘汰了原来用于生成校正文件以及进行校正的两个工具:CountCovariates和TableRecalibration,取而代之的是新版本里面的BaseRecalibrator与PrintReads这两个工具,主要影响的就是原来的step1以及step3,这边就只给出这两步的代码:
## step1:生成校正要用的文件sample01.recal_data.grp
java -Xmx4g -jar GenomeAnalysisTK.jar
-R ref.fasta
-T BaseRecalibrator
-I sample01.realn.bam
-knownSites sample01.confidence.raw.vcf
-o sample01.recal_data.grp
这一步会生成好几个文件,包括关于分值的一些统计报告。另外这边也有-cov这个参数,可以像上面一样设置,不管设不设ReadGroupCovariate和QualityScoreCovariate两个是一定会有的。
## step3:进行校正,生成校正后的文件sample01.recal.bam
java -jar GenomeAnalysisTK.jar
-R ref.fasta
-T PrintReads
-I sample01.realn.bam
-BQSR sample01.recal_data.grp
-o sample01.recal.bam
下面是GATK网站上给出的几张校正前后的比较图:
* 2.x版本的一些工具的使用等有之后再补上,其实大部分处理都集中在了Phase I,后面还有两个Phase一个是正式call SNP和INDEL,还有一个是对最后variants结果的处理(VQSR缺少可信的参考数据的话好像很难得到比较满意的结果),如果开始就有一些已知的可靠variants位点文件的话就可以用GATK提供的QUEUE工具来直接完成整个流程(不用一步一步的敲下去),所有东西等后面更新的时候再补上= =
* 所有高亮代码由发芽网提供