SNP是指在基因组上单个核苷酸的变异,包括置换、颠换、缺失和插入。SNP在基因组中分布相当广泛,近来的研究表明在很多物种基因组中每300bp就出现一次。大量存在的SNP位点,使人们有机会发现与各种疾病,包括肿瘤相关的基因组突变。既然SNP那么广泛存在,获得SNP就变成一项重要的任务。在经历了样本收集、测序、质控和mapping后,我们输出了bam格式的数据。之后,我们就要尝试利用GATK call SNP了。
GATK提供多种方法安装,初学者容易陷入混乱,这里提供一张较为便捷的方法,后面附录在介绍其他安装办法。
GATK官网有明确说明,有以下要求:
注意这只是运行要求,GATK安装分为直接解压运行版和build版,这里介绍规范的build过程,直接解压运行的在附录中会提到。
这个很多同学都会配置,但是鉴于有部分同学还是不是很会配置,这里我们将介绍。
有些同学不知道自己的系统有没有安装适合的java版本,可以用以下命令查看:
$ java -version
如果是1.8就跳过这一步骤,不过比这个版本低的话就继续阅读本步骤的内容。
首先到官网下载jdk到本地,先用浏览器到官网上寻找自己要的版本,然后获得链接,在centos上用wget下载(如果下载得很慢的话可以试试先下载的Windows上,然后用传输工具传输到centos机子上),如要下载jdk-8u171-linux-x64.tar.gz,则在合适的文件夹下面用wget下载:
$ wget https://download.oracle.com/otn/java/jdk/8u221-b11/230deb18db3e4014bb8e3e8324f81b43/jdk-8u221-linux-x64.tar.gz
需要注意的是无论从Windows浏览器下载还是利用centos命令行下载都需要接受它们的license。因此应当用以下的指令,否则可能出现错误。
$ wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8u171-linux-x64.tar.gz
此外还要注意自己的目标系统的版本,是64位还是32位的,以及下载rpm包安装还是下载压缩包解压安装,这里演示利用压缩包安装的步骤。
$ tar -zxvf jdk-8u221-linux-x64.tar.gz # 具体版本以自己下载为准
$ cd jdk-8u221-linux-x64
# 配置环境变量
$ vim /etc/profile # 这种不是很安全,可以用以下更多安全的方法
或
$ vim ~/.bash_profile
在上面其中一个文件末尾加入下列内容(根据自己的情况修改):
export JAVA_HOME=(你自己的jdk路径)
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
最后记得检查下是否按照jdk8成功
$ java -version
另外我想到一个更加简单的办法,可以直接在有管理员权限的前提下,使用yum安装。
$ sudo yum list java-1.8*
$ yum install java-1.8.0-openjdk* -y
$ java -version
安装gradle的方法其实和按照java的方法一样,在官网下载安装包,解压后设置环境变量。
传统的按照方法当然也可以,但是这里推荐一个更加简单的办法,那就是用sdkman安装。
这个sdkman很有意思,编写人估计想给它赋予类似人的智商,所以help、安装过程和网站都与众不同。在官网也有介绍便捷的安装方式,这里简单说一下:
$ curl -s "https://get.sdkman.io" | bash
在打入这个指令之后会冒出一段话,同学们应当根据这段话最后的指令执行。执行完成后就算安装了。
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
检查安装
$ sdk version
如果出现版本的话就算安装成功了,然后就可以直接输入指令:
$ sdk java gradle
就可以安装最新版的gradle了,安装完后记得检查一下是否安装成功:
$ gradle -version
还有人说python和java也都可以用这个sdkman安装,大家可以试试看。
Centos7自带python 2.7,所以本身已经达到2.6的要求无需再升级。但是GATK要求安装python 3.6.2或以上,所以我们可以再安装python3.7,如果需要切换的话,可以手动切换,或者用conda切换。Python3.7的安装方法这个博主已经说得很清楚了,大家按照他的方法安装就可以了。地址:
https://www.cnblogs.com/cosiray/p/9946401.html
R的安装也十分方便,直接用yum和EPEL安装就可以了。
首先安装EPEL:
$ sudo yum install epel-release # 如果安装了就无需再安装
然后安装R
$ sudo yum install R
然后就可以输入R直接查看版本了。
这是个很坑的东西,如果要build GATK就需要这个东西,而这个东西用在GATK下对资源(CPU和网络)占用要求比较高,所以容易build失败。
安装很简单,直接用yum安装:
$ sudo yum install git-lfs
Build过程简单但是异常漫长,因为你需要下载很多东西。
找到一个空的文件夹,然后输入以下指令:
$ git clone https://github.com/broadinstitute/gatk
请准备至少15G的空间,良好的网络,以及不要占用太多线程的环境,这个指令是将花费同学们较多时间。
在clone过程中由于种种原因,容易导致终止,这个时候,如果报错信息中有代码提示,则根据代码操作,如果没有,则看看停在了什么地方,如果停在了安装一个东西(20Mb的)就无视之,直接继续,否则,只能自认倒霉,重新下载(重新下载前记得清空之前下载的文件)。
在进行完git clone之后,根据官网的提示,进入生成的gatk文件夹,观察是否有有gradlew执行文件,若没有,则进入官网(git clone的那个网址),找到gradlew文件放进该文件夹,然后,输入:
$ ./gradlew
注意,如果这个时候提示,缺什么,就直接到网上(上面的网站)下载那个东西。最后如果build成功,就可以运行了。
如果以下指令都可以正常运行,就说明OK了。
$ ./gatk --help
$ ./gatk --list
通过这两个指令,同学们也可以大概知道gatk可以干些什么,至于具体怎么做,可以上网查某个具体的步骤或指令,也可以继续观看本文。
我们所使用的文件为52个mapping好的文件(将52个个体的),包含1个maternal的mapping bam文件、3个high coverage的offsprings文件和48个low coverage的offsprings文件。在利用GATK call SNP前,我们先检查一下bam的头文件。我们使用samtools查看这些文件:
$ samtools view -H
通过查看输出的txt文件,我们知道了@HD、@RG和@PG的内容。从@PG我们得知在上一步的map当中我们在参考序列的5’和3’段都加入100kbp的buffer片段。
以上是GATK变异检测的完整流程,但是我们暂时不做那么多不做那么细,我们这次主要来学习一下如何call SNP。
网上说,在制备文库的过程中,由于PCR扩增过程中会存在一些偏差,也就是说有的序列会被过量扩增。这样,在比对的时候,这些过量扩增出来的完全相同的序列就会比对到基因组的相同位置。而这些过量扩增的reads并不是基因组自身固有序列,不能作为变异检测的证据,因此,要尽量去除这些由PCR扩增所形成的duplicates。
这个步骤用以下命令:
$ ./gatk MarkDuplicates REMOVE_DUPLICATES= false /
MAX_FILE_HANDLES_FOR_READ_ENDS_MAP=8000 /
INPUT=<自己的bam文件> /
OUTPUT=<自己定义> /
METRICS_FILE=<自己的metrics文件>
这一步的目的就是将比对到indel附近的reads进行局部重新比对,将比对的错误率降到最低。一般来说,绝大部分需要进行重新比对的基因组区域,都是因为插入/缺失的存在,因为在indel附近的比对会出现大量的碱基错配,这些碱基的错配很容易被误认为SNP。还有,在比对过程中,比对算法对于每一条read的处理都是独立的,不可能同时把多条reads与参考基因组比对来排错。因此,即使有一些reads能够正确的比对到indel,但那些恰恰比对到indel开始或者结束位置的read也会有很高的比对错误率,这都是需要重新比对的。Local realignment就是将由indel导致错配的区域进行重新比对,将indel附近的比对错误率降到最低。
主要分为两步:
由于该命令已经不再支持,如果需要使用,请用gatk3。
这一步是对bam文件里reads的碱基质量值进行重新校正,使最后输出的bam文件中reads中碱基的质量值能够更加接近真实的与参考基因组之间错配的概率。这一步适用于多种数据类型,包括illunima、solid、454、CG等数据格式。在GATK2.0以上版本中还可以对indel的质量值进行校正,这一步对indel calling非常有帮助。
第一步:利用工具BaseRecalibrator,根据一些known sites,生成一个校正质量值所需要的数据文件,GATK以“.grp”为后缀命名:
$ ./gatk BaseRecalibrator /
-R <参考序列> /
-I <自己的bam文件> /
-o <自己定义> /
第二步:利用第一步生成的.grp来生成校正后的数据文件,也是以“.grp”命名,这一步主要是为了与校正之前的数据进行比较,最后生成碱基质量值校正前后的比较图,如果不想生成最后BQSR比较图,这一步可以省略。
$ ./gatk BaseRecalibrator /
-R <参考序列> /
-I <输入的bam文件> /
-BQSR <上一步的.grp> /
-o <输出的.grp文件>
第三步:利用工具PrintReads将经过质量值校正的数据输出到新的bam文件中,用于后续的变异检测。
$ ./gatk PrintReads /
-R <.fa> /
-I <.bam> /
-BQSR <.grp> /
-o <.bam> /
这一步算是最重要的步骤。用指令HaplotypeCaller:
$ HaplotypeCaller \
-R reference.fasta \
-I sample1.bam [-I sample2.bam ...] \
[--dbsnp dbSNP.vcf] \
[-stand_call_conf 30] \
[-L targets.interval_list] \
-o output.raw.snps.indels.vcf
这一步就是filter了,方法太多了,可以用GATK进行filter,也可以用其他软件进行filter,这里说下用GATK初步filter的方法。
可以用VariantFiltration,这个指令可以基于vcf文件的INFO和/或FORMAT注释进行filter:
$ ./gatk VariantFiltration \
-V in.vcf \
-O out.vcf \
--genotype-filter-expression <…> \
--genotype-filter-name <…>
更加详细的过滤方法可以参考官网给的piplines:
https://software.broadinstitute.org/gatk/documentation/article?id=23216
GATK官网有许多不同版本的GATK包,进入release选取自己喜欢的版本,然后下载压缩包(有些地方网速不好,下载得比较慢)解压之后。可以找到一个gatk-package-[版本]-local.jar和gatk的执行文件。将所有文件放置到自己喜欢的目录,就可以使用了。
$ ./gatk --help
$ ./gatk --java-options "-Xmx8G" HaplotypeCaller -R reference.fasta -I input.bam -O output.vcf
由于gatk的一些脚本需要使用到不同的python环境,所以同学们也可以选择安装在conda中,不过据小编所知这个conda比较坑,所以大家使用这种方法的时候最好谨慎一点。首先进入conda的官网,安装步骤进行安装,下载地址官网有,请耐心查找,肯定可以找到的:
https://docs.conda.io/projects/conda/en/latest/
需要注意的是conda其实是一个目录,安装gatk的方法参考前文即可,安装完毕之后就可以使用,如果要切换python环境,就用conda切换到之前搭建的环境即可。
SAM的全称是sequence alignment/map format,而BAM就是SAM的二进制文件。SAM文件由两个部分组成:
头部区:以’@'开始,体现了比对的一些总体信息。比如比对的SAM格式版本,比对的参考序列,比对使用的软件等。
主体区:比对结果,每一个比对结果是一行,有11个主列和一个可选列。
@HD VN:1.0 SO:unsorted(排序类型)
头部区第一行:VN是格式版本;SO表示比对排序的类型,有unknown(default),unsorted,queryname和coordinate几种。samtools软件在进行行排序后不能自动更新bam文件的SO值,而picard却可以。
@SQ SN:contig1 LN:9401(序列ID及长度)
参考序列名,这些参考序列决定了比对结果sort的顺序,SN是参考序列名;LN是参考序列长度;每个参考序列为一行。
例如:@SQ SN:NC_000067.6 LN:195471971
@RG ID:sample01 (样品基本信息)
Read Group。1个sample的测序结果为1个Read Group;该sample可以有多个library的测序结果,可以利用bwa mem -R 加上去这些信息。
例如:@RG ID:ZX1_ID SM:ZX1 LB:PE400 PU:Illumina PL:Miseq
ID:样品的ID号 SM:样品名 LB:文库名 PU:测序以 PL:测序平台
这些信息可以在形成sam文件时加入,ID是必须要有的后面是否添加看分析要求。
@PG ID:bowtie2 PN:bowtie2 VN:2.0.0-beta7 (比对所使用的软件及版本)
例如:@PG ID:bwa PN:bwa VN:0.7.12-r1039 CL:bwa sampe -a 400 -f ZX1.sam -r @RG ID:ZX1_ID SM:ZX1 LB:PE400 PU:Illumina PL:Miseq …/0_Reference/Reference_Sequence.fa ZX_HQ_clean_R1.fq.sai ZX_HQ_clean_R2.fq.sai …/2_HQData/ZX_HQ_clean_R1.fq …/2_HQData/ZX_HQ_clean_R2.fq
这里的ID是bwa,PN是bwa,VN是0.7.12-r1039版本。CL可以认为是运行程序@RG是上面RG表示的内容,后面是程序内容,这里的@GR内容是可以自己在运行程序是加入的
主体部分有11个主列和1个可选列(如果某一列为“0”或“*”表示这一列没有信息):
QNAME
比对的序列名称。根据比对的结果(同一read比对不同的其他序列或这条read比对到同一序列的不同位置)可能出现多次。
例如:M04650:84:000000000-B837R:1:1101:22699:1759(一条测序reads的名称)
FLAG
Bwise FLAG(表明比对类型:paring,strand,mate strand等) 不同数值代表不同的数值组合,不同的数值可以通过samtools的flags指令查看具体含义。
例如:99
RENAME
比对上的参考序列名。名称与头部的@SQ相对应,如果这列是“*”,可以认为这条read没有比对上的序列,则这一行的第四,五,八,九 列是“0”,第六,七列与该列是相同的表示方法。
例如:NC_000075.6
POS
1-Based的比对上的最左边的定位。
例如:124057649
MAPQ
比对质量。如果值为255表示mapping值是不可用的,如果是unmapped read则MAPQ为0。
例如:60
CIGAR
Extended CIGAR string(操作符:MIDNSHP)比对结果信息;匹配碱基数,可变剪接等 。
M:alignment match (can be a sequence match or mismatch)
表示read可mapping到第三列的序列上,则read的碱基序列与第三列的序列碱基相同,表示正常的mapping结果,M表示完全匹配,但是无论reads与序列的正确匹配或是错误匹配该位置都显示为M
I:insertion to the reference
表示read的碱基序列相对于第三列的RNAME序列,有碱基的插入
D:deletion from the reference
表示read的碱基序列相对于第三列的RNAME序列,有碱基的删除
N:skipped region from the reference
表示可变剪接位置
P:padding (silent deletion from padded reference)
S:soft clipping (clipped sequences present in SEQ)
H:hard clipping (clipped sequences NOT present in SEQ)
clipped均表示一条read的序列被分开,之所以被分开,是因为read的一部分序列能匹配到第三列的RNAME序列上,而被分开的那部分不能匹配到RNAME序列上。S可以单独出现,而H必须有与之对应的S出现时才可能出现,不可在相同第一列的情况下单独出现。
"="表示正确匹配到序列上
"X"表示错误匹配到序列上
N:如果是mRNA-to-genome,N出现的位置代表内含子,其它比对形式出现N时则没有具体解释。
M/I/S/=/X:这些数值的加和等于第10列SEQ的长度
例如:3S6M1P1I4M
前三个碱基被剪切去除了,然后6个比对上了,然后打开了一 个缺口,有一个碱基插入,最后是4个比对上了。
RNEXT
双端测序中下一个reads比对的参考系列的名称。“*”是完全没有比对上,“=”代表完全比对。
例如:= 意味着双端测序的另一条read也比对上,并且是比对到同一个片段
PNEXT
如果是双端测序,是指另一端匹配到参考基因组的位置,如果设置为0,那么该列不可用。
例如:124057667
ISIZE
插入片段长度。最左边得为正,最右边的为负,中间的不用定义正负,不分区段(single-segment)的比对上,或者不可用时,此处为0。区别于第6列和第10列是对应测出来的序列的长度。这里第9列的长度是对应插入片段的长度,insert size,也就是建库时,将DNA片段打断成的长度。
例如:200
SEQ
和参考序列在同一个链上比对的序列(若比对结果在负义链上,则序列是其反向重复序列,反向互补序列)。
例如:ATTACTTGGCTGCT
QUAL
比对序列的质量(ASCII-33=Phred base quality)reads碱基质量值。
例如:-8CCCGFCCCF7@E-
可选的列
以TAG:TYPE:VALUE的形式提供额外的信息。
略
The GATK resource bundle is a collection of standard files for working with human resequencing data with the GATK. We provide several versions of the bundle corresponding to the various reference builds, but be aware that we no longer actively support very old versions (b36/hg18). In addition, we are currently transitioning to support the Grch38/hg38 reference build, but we have not yet generated all of the files necessary for all use cases (in particular we are still missing the Hg38 version of the Broad's exome intervals).
SNP用作遗传标记的优点:
https://max.book118.com/html/2019/0305/7061113065002012.shtm
GATK官网:
https://software.broadinstitute.org/gatk/
SAM格式文件解读
https://blog.csdn.net/genome_denovo/article/details/78712972
GATK中文readme
https://www.helplib.com/GitHub/article_123523
常用生物信息学格式介绍
https://www.jianshu.com/p/1e273cb25c20?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq
sam格式的简单了解
https://www.jianshu.com/p/2aad7fc4f14a
samtools常用命令详解
https://blog.csdn.net/luobailian/article/details/50316627
CentOS Java环境搭建
https://www.cnblogs.com/krockey/p/9044735.html
sdkman的安装
https://sdkman.io/install
使用sdkman安装java、gradle环境
https://blog.csdn.net/sheng_Mu555/article/details/82527439
在CentOS上安装Python3的三种方法
https://www.cnblogs.com/cosiray/p/9946401.html
centos上按照R
https://blog.csdn.net/bodybo/article/details/79999136
GATK call SNP流程
https://www.jianshu.com/p/938d362fc48d
GATK初步安装
https://www.jianshu.com/p/e8370c550717
conda官网
https://docs.conda.io/projects/conda/en/latest/
GATK使用方法详解
http://blog.sina.com.cn/s/blog_12d5e3d3c0101qu6e.html
GATK之HaplotypeCaller
http://biotrainee.com/thread-1417-1-1.html