转载: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\tID:sample01\tLB:sample01\tPL:ILLUMINA\tSM: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版本改动最大的就是淘汰了原来用于生成校正文件以及进行校正的两个工具:CountCovariatesTableRecalibration,取而代之的是新版本里面的BaseRecalibratorPrintReads这两个工具,主要影响的就是原来的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工具来直接完成整个流程(不用一步一步的敲下去),所有东西等后面更新的时候再补上= =

* 所有高亮代码由发芽网提供

17、GATK使用简介 Part2/2的更多相关文章

  1. 17、enum简介

    enum简介 在日常开发中可能有一些东西是固定的,比如一年只有4个季节,春夏秋冬.我们可以自己定义一个类里面存放这4个季节.在jdk5之后,引入了枚举(enum)的概念,可以通过enum去定义这四个季 ...

  2. 2017年9月17日 JavaScript简介

    javascript简介 javascript是个什么东西? JavaScript是个脚本语言,需要有宿主文件,它的宿主文件就是html文件. 它与java有什么关系? 没有什么直接联系,java是s ...

  3. 16、GATK使用简介 Part1/2

    转载:http://blog.sina.com.cn/s/blog_6721167201018fyw.html GATK (全称The Genome Analysis Toolkit)是Broad I ...

  4. 蚁群算法简介(part2: 蚁群算法之构造路径)

    蚁群算法主要可以分为以下几个步骤:首先,蚁群中的每只蚂蚁都根据地面上信息素浓度的大小找出一条从原点通向终点的遍历所有城市一次的路径(构造路径):然后每只蚂蚁沿着自己刚刚找到的路径回溯,在路径经过的各个 ...

  5. javascript总结17:javascript 函数简介

    1 释义:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 2 格式:通过 function  关键字. function test(){ alert("您好"); } ...

  6. ENode简介与各种教学视频资源汇总(要进群这篇文章必看)

    ENode是什么 ENode是一个.NET平台开源的应用开发框架,为开发人员提供了一套完整的基于DDD+CQRS+ES+(in-memory)+EDA架构风格的解决方案. ENode的特色是什么 解决 ...

  7. 第17章 EXTI—外部中断/事件控制器

    第17章     EXTI—外部中断/事件控制器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  8. 第17章 EXTI—外部中断/事件控制器—零死角玩转STM32-F429系列

    第17章     EXTI—外部中断/事件控制器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  9. CentOS7 实战源码安装mysql5.7.17数据库服务器

    CentOS7 实战源码安装mysql5.7.17数据库服务器 简介:实战演练mysql数据库服务器的搭建  mysql简介: mysql是一个开源的关系型数据库管理系统,现在是oracle公司旗下的 ...

随机推荐

  1. 《UNIX网络编程》daytimetcpcli测试

    对于刚刚接触网络的人来说,<UNIX网络编程>中第一个例子(daytimetcpcli)可能就测试不通过.也许你试着继续向后读来,自己写一个服务程序来解决这个问题,但是daytime服务也 ...

  2. 使用MapReduce将mysql数据导入HDFS

    package com.zhen.mysqlToHDFS; import java.io.DataInput; import java.io.DataOutput; import java.io.IO ...

  3. UVA 1493 Draw a Mess(并查集+set)

    这题我一直觉得使用了set这个大杀器就可以很快的过了,但是网上居然有更好的解法,orz... 题意:给你一个最大200行50000列的墙,初始化上面没有颜色,接着在上面可能涂四种类型的形状(填充):  ...

  4. java.sql.SQLException: Column count doesn't match value count at row 1 Query: insert into category values(null,?,?,?) Parameters: [1111111, 1111, 软件]

    java.sql.SQLException 问题: java.sql.SQLException: Column count doesn't match value count at row 1 Que ...

  5. Myeclipse或者Eclipse恢复默认启动时显示选择workspace的问题

    [问题描述] 不知道是不是Myeclipse8.5的Bug,我最近安装了8.5之后,前面几天打开MyEclipse的时候都是让我自己选择工作空间的,但是最近突然每次打开的时候都自己打开了C盘下面工作空 ...

  6. shingling算法——提取特征,m个hash函数做指纹计算,针对特征hash后变成m维向量,最后利用union-find算法计算相似性

    shingling算法用于计算两个文档的相似度,例如,用于网页去重.维基百科对w-shingling的定义如下: In natural language processing a w-shinglin ...

  7. 【leetcode刷题笔记】N-Queens II

    Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...

  8. 说几个JS优化技巧吧

    JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...

  9. Gym - 100570B :ShortestPath Query(SPFA及其优化)

    题意:给定N点M边的有向图,每条边有距离和颜色,一条有效路径上不能有相邻的边颜色相同.现在给定起点S,多次讯问S到点X的最短有效距离. TLE思路:用二维状态dis(u,c)表示起点到u,最后一条边的 ...

  10. OSS阿里云文件上传 demo。

    所需jar包: aliyun-openservices-1.2.3.jar jdom-1.1.jar commons-codec-1.4.jar commons-logging-1.1.1.jar g ...