使用bcftools进行SNP calling
bcftools也可以进行SNP calling。在之前的版本中,通常都是和samtools的mpileup命令结合使用, 命令如下
samtools mpileup -uf ref.fa aln.bam | bcftools view -bvcg - > var.raw.bcf
由于samtools和bcftools更新得都很快,只要有一个版本不对,采用上面的pipeline就会报错。为了减少版本不合适带来的问题,bcftools的开发团队将mpileup
这个功能添加到了bcftools中。
在最新版的bcftools 中,只需要使用bcftools这一个工具就可以实现SNP calling, 用法如下
bcftools mpileup mpileup.1.bam --fasta-ref mpileup.ref.fa | bcftools call -mv -o raw.vcf
--fasta-ref
参数指定参考序列的fasta文件,mpileup.bam
是输入文件,通常都是GATK 标准预处理流程得到的bam文件。
需要注意的是mpileup
命令虽然也会输出VCF格式的文件,但是并不直接进行snp calling。下面的命令可以生成VCF格式的文件
bcftools mpileup mpileup.1.bam --fasta-ref mpileup.ref.fa >mpileup.vcf
直接生成的VCF文件内容如下
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00100
17 1 . A <*> 0 . DP=5; PL
17 2 . A <*> 0 . DP=5; PL
17 3 . G <*> 0 . DP=5; PL
17 4 . C <*> 0 . DP=5; PL
17 5 . T <*> 0 . DP=5; PL
里面的每一条记录并不是一个SNP位点,而是染色体上每个碱基的比对情况的汇总。这种信息官方称之为genotype likelihoods。
call
命令才是真正的执行SNP calling的程序,基本用法如下
bcftools call mpileup.vcf -c -v -o variants.vcf
在进行SNP calling 时,必须选择一种算法,有两种calling算法可供选择,分别对应-c
和-m
参数。-c
参数对应consensus-caller
算法, -m
参数对应multiallelic-caller
算法,后者更适合多种allel和罕见变异的calling。
-v
参数也是常用参数,作用是只输出变异位点的信息,如果一个位点不是snp/indel, 不会输出。
注:新版本bcftools中 call命令可替代view命令
--------------------------------------------------------------------------------------------------------------
其他命令
1. annotate
annotate
命令有两个用途,第一个是用于注释VCF文件,用法如下
bcftools annotate -a db.vcf -c ID,QUAL,+TAG view.vcf -o annotate.vcf
-a
参数指定注释用的数据库文件,格式可以是VCF, BED, 或者是\t
分隔的自定义文件。在\t
分隔的自定义文件中,必须包含CHROM, POS字段;-c
参数指定将数据库的哪些信息添加到输出文件中。
第二个用途是编辑VCF文件,比如去除其中的某些注释信息,或者去除某些样本,用法如下
bcftools annotate -x ID,INFO/DP,FORMAT/DP view.vcf -o remove.id.vcf
-x
参数表示去除VCF文件中的注释信息,可以是其中的某一列,比如ID
, 也可以是某些字段,比如INFO/DP
,多个字段的信息用逗号分隔;去除之后,这些信息所在的列并不会去除,而是用.
填充。
2. concat
concat
命令可以将多个VCF文件合并为一个VCF文件,要求输入的VCF文件必须是排序之后的,如果包含多个样本的信息,样本的顺序也必须一致。经典的应用场景包括合并不同染色体上的VCF文件,合并SNP和INDEL 两种类型的VCF文件,用法如下
bcftools concat merge.2.a.vcf.gz merge.3.a.vcf.gz -o -o merge.vcf
还需要注意一点,输入的VCF文件必须是经过bgzip
压缩的文件。
3. merge
merge
命令也是用于合并VCF文件,主要用于将单个样本的VCF文件合并成一个多个样本的VCF文件。用法如下
bcftools merge merge.a.vcf.gz merge.b.vcf.gz -o merge.vcf
该命令要求输入文件必须是经过bgzip
压缩的文件, 而且还需要有.tbi
的索引。
4. isec
isec
用于在多个VCF文件之间取交集,差集,并集等操作,经典的应用场景是对多种软件的SNP calling 结果进行venn 分析。用法如下
bcftools isec A.vcf.gz B.vcf.gz -p dir
默认参数就是取交集,更多高级用法请参考帮助文档。
5. stats
stats
命令用于统计VCF文件的基本信息,比如突变位点的总数,不同类型突变位点的个数等。用法如下
bcftools stats view.vcf > view.stats
输出文件中记录了很多类型的统计数据,重点介绍以下几种
基本信息:
SN 0 number of samples: 3
SN 0 number of records: 15
SN 0 number of no-ALTs: 1
SN 0 number of SNPs: 11
SN 0 number of MNPs: 0
SN 0 number of indels: 3
SN 0 number of others: 0
SN 0 number of multiallelic sites: 1
SN 0 number of multiallelic SNP sites: 0
颠换和转换的比例:
# TSTV, transitions/transversions:
# TSTV [2]id [3]ts [4]tv [5]ts/tv [6]ts (1st ALT) [7]tv (1st ALT) [8]ts/tv (1st ALT)
TSTV 0 8 3 2.67 8 3 2.67
Indel 长度分布:
# IDD, InDel distribution:
# IDD [2]id [3]length (deletions negative) [4]count
IDD 0 -2 1
IDD 0 1 2
IDD 0 3 1
碱基替换类型:
# ST, Substitution types:
# ST [2]id [3]type [4]count
ST 0 A>C 0
ST 0 A>G 0
ST 0 A>T 0
ST 0 C>A 1
ST 0 C>G 0
ST 0 C>T 4
ST 0 G>A 1
ST 0 G>C 1
ST 0 G>T 1
ST 0 T>A 0
ST 0 T>C 3
ST 0 T>G 0
输出文件可以用于plot-vcfstats
命令,进行可视化, 这个脚本位于bcftools安装目录的misc
目录下。用法如下
plot-vcfstats view.stats -p output
-p
参数指定输出结果的目录,这个脚本依赖latex 生成pdf 文件,所以系统上的latext 一定要安装好。
输出目录下文件很多,详细列表如下
├── counts_by_af.indels.dat
├── counts_by_af.snps.dat
├── depth.0.dat
├── depth.0.pdf
├── depth.0.png
├── indels.0.dat
├── indels.0.pdf
├── indels.0.png
├── plot.py
├── plot-vcfstats.log
├── substitutions.0.pdf
├── substitutions.0.png
├── summary.aux
├── summary.log
├── summary.pdf
├── summary.tex
├── tstv_by_af.0.dat
└── tstv_by_qual.0.dat
主要看summary.pdf
文件就可以了,该文件包含了很多信息
1.不同类型的突变位点汇总
2.插入缺失长度分布图
3.测序深度分布
4.碱基转换类型分布
6. index
index
命令用于对VCF文件建立索引,要求输入的VCF文件必须是使用bgzip
压缩之后的文件,支持.csi
和.tbi
两种索引,默认情况下建立的索引是.csi
格式, 用法如下
bgzip view.vcf
bcftools index view.vcf.gz
运行成功后,会生成索引文件view.vcf.gz.csi
。如果需要建立.tbi
格式的索引,用法如下
bcftools index -t view.vcf.gz
tbi索引文件为view.vcf.gz.tbi
。
7. view
view
命令可以用于VCF和BCF格式的转换,用法如下
bcftools view view.vcf.gz -O u -o view.bcf
-O
参数指定输出文件的类型,b
代表压缩后的BCF文件,u
代表未经压缩的BCF文件,z
代表压缩后的VCF文件,v
代表未经压缩的VCF文件;-o
参数指定输出文件的名字。
还可以根据样本筛选VCF文件,用法如下
bcftools view view.vcf.gz -s NA00001,NA00002 -o subset.vcf
-s
参数指定想要保留的样本信息,多个样本用逗号分隔。
如果样本名称添加了^
前缀,代表去除这些样本,比如-s ^NA00001,NA00002
,这个写法表示从VCF文件中去除NA00001,NA00002
这两个样本的信息。
还可以过滤突变位点,过滤的条件非常多,可以根据突变位点的类型,基因型类型等等条件进行过滤,详细的参数可以参考软件的帮助文档,这里只做一个基本示例
bcftools view view.vcf.gz -k -o known.vcf
-k
参数表示筛选已知的突变位点,即ID
那一列值不是.
的突变位点。
8. query
query
命令也是用于格式转换,和view
命令不同,query
通过表达式来指定输出格式,可定制化程度更高。用法如下
bcftools query -f '%CHROM\t%POS\t%REF\t%ALT[\t%SAMPLE=%GT]\n' view.vcf.gz
-f
参数通过一个表达式来指定输出格式,其中变量的写法如下
-
%CHROM
代表VCF文件中染色体那一列,其他的列,比如POS
,ID
,REF
,ALT
,QUAL
,FILTER
也是类似的写法 -
[]
对于FORMAT字段的信息,必须要中括号括起来 -
%SAMPLE
代表样本名称 -
%GT
代表FORMAT字段中genotype的信息 -
\t
代表制表符分隔 -
\n
代表新的一行
输出文件如下
11 2343543 A . NA00001=0/0 NA00002=0/0 NA00003=0/0
11 5464562 C T NA00001=./. NA00002=./. NA00003=./.
20 76962 T C NA00001=0/1 NA00002=1/1 NA00003=1/1
更多变量的写法请参考官方文档。
9. sort
sort
命令用于对VCF文件排序, 按照染色体位置进行排序,用法如下
bcftools sort view.vcf.gz -o sort.view.vcf
10. reheader
reheader
命令有两个用途,第一用途用于编辑VCF文件的头部,第二个用途用于替换VCF文件中的样本名。
替换样本的用法如下
bcftools reheader -s sample.file view.vcf -o new.sample.vcf
-s
参数指定需要替换的样本名,内容如下
NA00001 NA1
NA00002 NA2
NA00003 NA3
第一列代表VCF文件中原始的样本名称,第二列代表替换后的样本名称,两类之间用空格分隔,需要注意的是,样本名不允许有空格。
编辑VCF文件的头部的用法如下
bcftools reheader -h header.file view.vcf -o new.header.vcf
-h
参数指定新的header文件,内容如下
##fileformat=VCFv4.3
##reference=file:///seq/references/1000Genomes-NCBI37.fasta
##contig=<ID=11,length=135006516>
##contig=<ID=20,length=63025520>
....
----------------------------------------------------------------------------------------------
长流程
#一开始写好引用,方便以后
ACC=AF086833
ebola=/vol2/agis/xiaoyutao_group/liuyunze/project/ebola
REF=$ebola/ref/$ACC.fa
SRR=SRR1553500
BAM=$ebola/align/$SRR.bam
R1=$ebola/raw/${SRR}_1.fastq
R2=$ebola/raw/${SRR}_2.fastq
TAG="@RG\tID:$SRR\tSM:$SRR\tLB:$SRR"
VARI=$ebola/variant
##bwa比对,samtools排序并构建索引,为了之后更快调用比对文件
mkdir -p $ebola/align && cd $ebola/align
bwa mem -R $TAG $REF $R1 $R2 | samtools sort > $BAM
samtools index $BAM
mkdir -p $VARI
samtools faidx $REF
##第一种方法:bcftools召唤变异
samtools mpileup -uvf $REF $BAM | bcftools call -vm -Oz > bcftools.vcf.gz
##第二种方法:freebayes
freebayes -f $REF $BAM > $ebola/align/freebayes.vcf
##第三种方法:GATK(版本:4.0.7.0)
#注意:在使用GATK之前,需要先建立两个参考基因组的索引文件.dict和.fai【具体参见https://gatkforums.broadinstitute.org/gatk/discussion/1601/how-can-i-prepare-a-fasta-file-to-use-as-reference】
#.dict中包含了基因组中contigs的名字,也就是一个字典;
#构建.dict文件(原来要使用picard的CreateSequenceDictionary模块,但是现在gatk整合了此模块,可以直接使用)
gatk CreateSequenceDictionary -R $REF -O $ebola/ref/$ACC.dict
#.fai也就是fasta index file,索引文件,可以快速找出参考基因组的碱基
#构建
samtools faidx $REF
#gatk开始:
#必选 -I -O -R,代表输入、输出、参考
#接下来可以按照字母顺序依次写出来,这样比较清晰
#-bamout:将一整套经过gatk程序重新组装的单倍体基因型(haplotypes)输出到文件
#-stand-call-conf :低于这个数字的变异位点被忽略,可以设成标准30(默认是10)
gatk HaplotypeCaller -R $REF -I $BAM -O $ebola/align/HaplotypeCaller.vcf \
-bamout $ebola/align/$SRR.gatk.bam \
-stand-call-conf 30
# gatk用时3.95 minutes.
#<gatk补充>GATK进行变异检测的时候,是按照染色体排序顺序进行的,并非多条染色体并行检测的。因此,如果样本数据量比较大的话,一般多个染色体并行。