GATK使用简介 Part1/2
GATK(全称The Genome Analysis Toolkit)是Broad Institute开发的用于二代重测序数据分析的一款软件,里面包含了很多有用的工具。
网址:http://www.broadinstitute.org/gsa/wiki/index.php/Home_Page
前段时间刚发布了2.x版本的,最近几天都在不断更新,网址也搬迁到
http://www.broadinstitute.org/gatk/
不过目前为止原先的文档还没有全部转移过去。2.0版本有一些比较大的更新,同时增加了一些新的功能,具体内容可以参考http://gatk.vanillaforums.com/discussion/67/release-notes-for-gatk-version-2-0,由于2.0目前依然出于比较初步的阶段,下面还是以1.x版本进行介绍(后面涉及到的大部分应该变动都不大)。
================================== 下载 =================================
程序本身可以通过主页上的下载链接进去下载:http://www.broadinstitute.org/gsa/wiki/index.php/Downloading_the_GATK
或者可以访问ftp地址进行下载:ftp://ftp.broadinstitute.org/pub/gsa/GenomeAnalysisTK/
想要得到更新提醒的话可以添加邮件提醒(页面现在貌似删掉了,可能是换地址了,麻烦需要的自己找下吧,或者下次我再补上= =)
从以上两个地址下载到的是已经编译好的版本,可以直接运行,如果需要下载源程序,可以去github上去找https://github.com/broadgsa/gatk/commits/master,或者linux底下可以通过git工具来下载,下载好的源程序再通过ant进行编译即可,此处不再赘述。
================================== 运行 =================================
后面以GATK 1.x的最后一个版本1.6-13进行介绍,GATK是一个java程序,解开编译好的压缩包,我们可以看到下面有几个文件:
$ ls
AnalyzeCovariates.jar GenomeAnalysisTK.jar resources
两个后缀名为jar的文件和一个名为resources的文件夹,这两个.jar文件就是后面我们要用到java程序,主要要用的就是GenomeAnalysisTK.jar这个程序,resources文件夹里面有一些example的数据,可以用来进行一些测试,另外GATK网站上面还提供了跟human基因组相关的很多数据下载(http://www.broadinstitute.org/gsa/wiki/index.php/GATK_resource_bundle,例如dbsnp的数据等等),在做跟human相关的一些分析的时候可以直接从上面下载。
Java程序可以在任何安装有Java平台的系统上运行,运行的时候语法如下:
java -jar <program.jar>
-jar这个参数是必须有的,后面跟你的java程序,例如我们这边就是
java -jar /home/biosoft/GenomeAnalysisTK-1.6-13/GenomeAnalysisTK.jar …
这边在引用程序位置时推荐使用绝对路径,然后除了-jar这个参数以外,还有一个经常用到的参数就是用来设定内存上限的-Xmx参数,用法如下:
java -Xmx<size> -jar …
这边的size可以用m、g等等做单位,例如
java -Xmx4g -jar /home/biosoft/GenomeAnalysisTK-1.6-13/GenomeAnalysisTK.jar …
就表示把内存的最大使用量限制在4G,对于处理一些比较大的文件,可以适当的把这个值调高一点,来提高运算效率或者防止内存不足程序无法运行。
================================== 全局参数 =================================
GenomeAnalysisTK.jar这一个程序里面包含了很多小的子程序,可以通过
java -jar /home/biosoft/GenomeAnalysisTK-1.6-13/GenomeAnalysisTK.jar --help
来查看具体内容,更详细的说明请参照
http://www.broadinstitute.org/gsa/gatkdocs/release/
然后简单的介绍一下几个全局的参数,这些参数是基本上都会用到的几个参数
--analysis_type / -T (required String)
这个参数是必须的,用来设定选用的子程序(GATK的参数一般都可以通过一个长参数名或者一个短参数名来进行设定,在每个用法页面的Argument details里面都会用/给出两种名称),所以一个最基本的GATK命令行的样子应该是
java -jar/home/biosoft/GenomeAnalysisTK-1.6-13/GenomeAnalysisTK.jar \
-T <String> \
……
--reference_sequence / -R (File)
用来指定fasta格式的参考基因组序列,GATK需要reference序列是经过index的,而且需要两个index文件,一个是后缀名为.fai的,另外一个是后缀名称为.dict的,缺少这些文件,或者两个文件中的内容不一致都可能导致程序报错,一般情况下没有这两个文件GATK在运行时会先生成,如果无法生成或者生成的有问题,也可以通过samtools和picard来手动生成这两个文件,例如我们的reference序列名称叫ref.fasta,则用下面的命令行可以生成我们需要的这两个文件:
Bash语言: 高亮代码由发芽网提供
## 第一步先用samtools进行index,会在当前目录下生成一个ref.fasta.fai的文件
samtools faidx ref.fasta
## 在得到.fai文件的基础上,第二步可以用picard (http://picard.sourceforge.net/)
## 里面的CreateSequenceDictionary这个工具进行index,可以生成另外一个后缀名为.dict
## 的index文件,这一步也可以不做,缺少这个文件的时候运行GATK会自动先生成这个文件,
## 而生成这个文件的过程实际上调用的就是picard里面的这个工具
java -jar /home/biosoft/picard-tools-1.70/CreateSequenceDictionary.jar \
REFERENCE=ref.fasta \
OUTPUT=ref.dict
--input_file / -I (List[String] with default value [])
用来设定输入的SAM或BAM文件, GATK要求BAM文件也是经过index的,所以如果缺少index文件的话则需要先通过samtools对BAM文件进行index:
samtools index sample.bam
在当前目录下则会生成sample.bam.bai这个index文件
--intervals / -L (List[IntervalBinding[Feature]])
用来指定某些区域,所有操作只对这些区域进行而不是整个基因组
上面两个参数都可以设多次,例如在同时处理多个BAM文件的时候,需要通过
-I Sampe01.bam -I Sample02.bam….来进行设定。
--logging_level / -l (String with default value INFO)
用来控制屏幕上显示的记录信息的多少,总共有3个等级,INFO, ERROR和FATAL,设定成INFO就表示输出所有的记录到屏幕,ERROR就表示只输出ERROR或FATAL的记录,FATAL表示只输出FATAL的记录,默认等级是INFO,当屏幕上输出内容太多的时候可以改成ERROR (例如在运行VariantFiltration的时候,默认情况下会输出大量的WARNING信息)
--num_threads / -nt (Integer with default value 1)
设定线程数,部分(应该很少)GATK子程序是支持多线程的,可以设置这个参数,如果不支持这个参数但是设置了的话运行时会报错。
--gatk_key / -K (File)
GATK为了不断改进希望从用户那边得到比较多的反馈信息,所以每次程序运行完以后都会生成一些报告发送回服务器,对于有些缺少网络环境或者不希望发送报告的,可以去申请这个key文件http://www.broadinstitute.org/gsa/wiki/index.php/Phone_home,设置了这个参数以后可以跳过最后的这个步骤。(无法访问网络之类的情况下也可以无视,INFO等级下最后完成后会报HttpMethodDirector - I/O exception的错误,持续几十秒,如果确定已经成功完成的话可以直接掐断退出
其他的全局参数可以参考http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_gatk_CommandLineGATK.html,有的用到的不太多,这边就暂时跳过了。
注:命令行里的斜杠(\)是linux底下用来断行显示的,通过\把一行比较长的命令行断成几行写可以方便代码的阅读,执行的时候这个地方不会被当作行尾而实现把后面的都连起来的目的,注意\后面不能再有空格或其他的字符,否则就起不到断行的效果;另外Windows下无效<img title="GATK使用简介 Part1/2" alt="GATK使用简介 Part1/2" src="http://www.sinaimg.cn/uc/myshow/blog/misc/gif/E___6726EN00SIGG.gif" type="face" real_src="http://www.sinaimg.cn/uc/myshow/blog/misc/gif/E___6726EN00SIGG.gif" />
下面简单的介绍一下GATK里面一些常用的子程序(工具)。
==============================UnifiedGenotyper============================
这个可以说是GATK里面用到最多的一个工具,这个工具就是我们call SNP (单核苷酸多态性)或者Indel (插入缺失)的时候用的,最基本的用法如下:
java -jar GenomeAnalysisTK.jar \
-R resources/Homo_sapiens_assembly18.fasta \
-T UnifiedGenotyper \
-I sample1.bam \
-o snps.raw.vcf
前几个参数之前都讲过了,然后简要解释一下其他的一些参数:
--out / -o (VCFWriter with default value stdout)
输出文件,输出文件的格式为vcf格式,vcf格式的具体信息可以参阅http://www.1000genomes.org/wiki/Analysis/Variant Call Format/vcf-variant-call-format-version-41,这个参数是必须提供的
--output_mode / -out_mode (OUTPUT_MODE with default value EMIT_VARIANTS_ONLY)
输出模式,总共有3种
EMIT_VARIANTS_ONLY 只输出variants位点(SNPs和INDELs)
EMIT_ALL_CONFIDENT_SITES 除了variants位点以外与reference一致的可靠位点也输出
EMIT_ALL_SITES 只要是能call的到的位点都输出(应该是除了没覆盖到的位点,其余位点都输出),这个模式下会得到最多的结果
-stand_emit_conf / --standard_min_confidence_threshold_for_emitting (double with default value 30.0)
只有QUAL值大于这个值的才会输出
-stand_call_conf / --standard_min_confidence_threshold_for_calling (double with default value 30.0)
最低可信值,QUAL值低于这个值而大于上面stand_emit_conf这个值的在结果里面显示的时候会被标记为LowQual
这两个参数默认的都是30,就是只有QUAL值大于30的才会输出到结果中,一般认为对于高覆盖度的数据(>10x),QUAL值在30以上就可以认为比较可信
--genotype_likelihoods_model / -glm (Model with default value SNP)
calling模式,默认值为SNP,只输出SNP的结果,INDEL模式用来输出INDEL结果,BOTH则会把SNP和INDEL结果都输出出来
--comp / -comp (List[RodBinding[VariantContext]] with default value [])
用这个参数可以提供一个(或多个,设多个时同样是设这个参数多次,每次一个文件)已有的vcf结果文件,用于与结果进行比较,如果提供的vcf里面的variants结果与call出来的结果一致,则会在后面加上comp1,[comp2…],或者用户可以自己指定每个文件用的标识名称,例如:
-comp:sample1 sample1.vcf \
-comp:sample2 sample2.vcf \
…
--dbsnp / -D (RodBinding[VariantContext] with default value none)
dbSNP文件,这个参数实际跟上面-comp的参数差不多,不过dbSNP数据在GATK里面有特殊的用途,后面会再提到
=========================== VariantFiltration==========================
用法:
Bash语言: 高亮代码由发芽网提供
java -Xmx2g -jar GenomeAnalysisTK.jar \
-R ref.fasta \
-T VariantFiltration \
-o output.vcf \
--variant input.vcf \
--filterExpression "AB < 0.2 || MQ0 > 50"\
--filterName "Nov09filters"\
--mask mask.vcf \
--maskName InDel
根据用户自定义的标准来筛选VCF文件,常用参数如下:
--variant / -V (required RodBinding[VariantContext])
输入的VCF文件,GATK对文件格式的完整性要求高一点,所以VCF文件格式不符合要求的可能会导致报错退出。
--out / -o (VCFWriter with default value stdout)
输出的文件名,结果输出还是VCF格式的,然后筛选掉的结果不会直接被删掉,而是用标识给标记出来,就是VCF文件里面FILTER这一列的信息,而VCF开头也会给出这些标识用的是哪些筛选标准,而所有通过筛选的位点这一列会以PASS标出。
--clusterSize / -cluster (Integer with default value 3)
--clusterWindowSize / -window (Integer with default value 0)
这两个参数一起用可以设定指定长度内的variants数量的最大值,例如-window设成10,-cluster设成3,表示10bp以内的variants的数量不应当超过3个,如果超过了则会用SnpCluster标示出来。一般这种聚集的SNP可以被认为是不可靠的(10bp里面超过3个(Bowen et al., 2011))。
--filterExpression / -filter (ArrayList[String] with default value [])
--filterName / -filterName (ArrayList[String] with default value [])
这两个参数也是一起使用的,可以一个第一个参数设置筛选用的条件表达式,第二个参数设置这个筛选在结果里面标识的名称,两个参数设置的时候必须是成对的,然后可以设置多次,例如上面的例子中:
--filterExpression "AB < 0.2 || MQ0 > 50" \
--filterName "Nov09filters" \
也可以写成
--filterExpression "AB < 0.2" \
--filterName "ABfilter" \
--filterExpression "MQ0 > 50" \
--filterName "MQ0filter" \
--invalidatePreviousFilters (boolean with default value false)
如果输入的VCF文件是已经筛选过的,而且里面筛选掉的内容是已经不要的了,可以通过设置这个参数来去掉这些已经筛选掉的位点;否则这些位点会被再次筛选一遍,然后保留原来的筛选标识不变,后面可能会加上新的筛选标识。
--mask (RodBinding[Feature] with default value none)
--maskName / -maskName (String with default value Mask)
--mask参数用来筛选与某个指定文件中记录一致的位点,例如筛选repeat区域的位点的时候就可以使用这个参数,这边给的是一个文件,支持的格式很多,所以适用的范围其实很广,这边暂时先简单的介绍一下;--maskName同样是来设置被FILTER掉的位点的标识的。
--missingValuesInExpressionsShouldEvaluateAsFailing (Boolean with default value false)
最后在讲一下这个参数,当筛选标准比较多的时候,可能有一些位点没有筛选条件当中的一条或几条,例如下面的这个表达式
QUAL < 30.0 || QD < 2.0 || FS > 60.0 || MQ < 40.0 || HaplotypeScore > 13.0
并不一定所有位点都有这些信息,这种情况下GATK运行的时候会报很多WARNING信息,用这个参数可以把这些缺少某些FLAG的位点也给标记成没有通过筛选的。
=========================== DepthOfCoverage==========================
这个也是我比较喜欢用的一个工具,可以对mapping结果进行一些列的统计得到覆盖度相关的一些信息,用法:
Bash语言: 高亮代码由发芽网提供
java -Xmx2g -jar GenomeAnalysisTK.jar \
-R ref.fasta \
-T DepthOfCoverage \
-o file_name_base \
-I input_bams.list
[-geneList refSeq.sorted.txt]\
[-pt readgroup]\
[-ct 4 -ct 6 -ct 10]\
[-L my_capture_genes.interval_list]
*[]里面的表示可选的参数
因为一般粗略统计的时候,只需要_summary和_statistics这两个文件就能获得比较有用的一些信息,而对于特定区段或者gene区间等等的,只要再次基础上指定某段区域或者提供gene位置的一些信息即可,下面就仅仅介绍和整个基因组统计相关的一些参数:
--out / -o (Map[DoCOutputType,PrintStream] with default value None)
指定输出文件的文件名,默认情况,这个程序运行完成以后除了生成这个文件以外,还会生成一些列其他的文件,前面部分的名称还是这个,后面会加上_summary, _statistics等等来表示对不同信息的统计结果,每个文件的内容说明如下:
- no suffix:这个就是没有加任何后缀的文件,每个位点的覆盖度,这个文件一般会很大,而且很多时候可能根本不需要这么详细的结果,可以通过后面的参数设置取消输出这个结果
- _summary:总的统计信息,包括总的碱基数,基因组的平均覆盖度,大于某个quality值的碱基数所占的比例等等
- _statistics:某个覆盖度范围之间碱基的数目,这边是一个直方图的统计结果,可以根据这个做出一张覆盖度的分布图,很直观的显示出覆盖度的信息。
- _interval_summary:如果设置了特定区段而不是整个基因组的话,相关结果会在这个文件里面
- _interval_statistics:同上,也是特定区段的统计结果
- _gene_summary: gene区间的统计结果
- _gene_statistics:同上,这边的几个文件可以方便对某些比较关心的区段,或者是gene区间进行一些统计
- _cumulative_coverage_counts:大于某个覆盖度值的
- _cumulative_coverage_proportions:同上,一些比例信息
--partitionType / -pt (Set[Partition] with default value [sample])
DepthOfCoverage可以对多个BAM文件进行统计,这个时候可以将多个文件按照不同的方式进行组合统计,所有的组合以BAM文件头里面的ReadGroup这一行即开头是@RG的这一行设定的值为准,可以以sample, readgroup, library…等等字段进行组合,例如-pt设成sample的话,sample名称相同的BAM文件会被当作一个sample来处理,结果统计的就是一个sample的信息,但是如果这几个文件的readgroup值不一样的话,根据readgroup进行统计得到的结果就是对每个readgroup而言的。
--includeRefNSites (boolean with default value false)
mapping所用的reference基因组序列可能包含N,如果这个参数设成true的话,它会根据N附近reads的mapping情况来对这段区域进行一个统计
--nBins (int with default value 499)
DepthOfCoverage进行统计的时候是按照不重叠的window (这边称为一个bin)来进行统计的,这边就是指这个bin的个数,也就是最后得到的直方图里面看到的柱形的个数。
--start (int with default value 1)
--stop (int with default value 500)
这两个值用来设定开头和结尾的bin里面应当包含覆盖度是多少的碱基,--start设成5就表示第一个bin统计的是所有depth≤5的碱基的个数,而—stop设成100就表示最后一个bin统计的是所有depth≥100的碱基的个数,注意这边stop的值和start的值之间的间隔应该刚好等于上面nBins设置的值,即stop – start = nBins
--summaryCoverageThreshold / -ct (int[] with default value [15])
这个值表示统计depth≥这个值的碱基所占的比例,可以设定多个值,例如:
-ct 0 -ct 1 -ct 5 -ct 10 -ct 15,则会分别统计depth≥0, 1, 5, 10, 15的碱基所占的百分比,结果输出在_summary文件里
--omitDepthOutputAtEachBase / -omitBaseOutput (boolean with default value false)
--omitIntervalStatistics / -omitIntervals (boolean with default value false)
--omitLocusTable / -omitLocusTable (boolean with default value false)
实际用的时候很多太详细的结果用处可能不大(例如对每个base的统计DepthOutputAtEachBase),可以通过这几个参数来取消,同时可以加快程序的运行速度
所以一个快速统计mapping结果的例子大致如下:
Bash语言: 高亮代码由发芽网提供
java -Xmx4g -jar GenomeAnalysisTK.jar \
-R ref_genome.fasta \
-T DepthOfCoverage \
--omitDepthOutputAtEachBase \
--omitIntervalStatistics \
--omitLocusTable \
-ct 0 -ct 1 -ct 5 -ct 10 -ct 15 -ct 20 -ct 25 -ct 30 \
--nBins 99 --start 1 --stop 100 \
-I sample.bam \
-o sample.depth