BSA 操作实战

2.1. bwa建立索引文件


bwa index-a bwtsw-p zm437/home/chaim/disk/zm437/Zea_mays.AGPv4.dna.toplevel.fa


2.3 BWA的mem的使用,好用快速一步到位。

bwa mem-t24-M-P-R'@RG\tID:2447-20\tSM:2447-20\tLB:WES\tPL:Illumina'zm437../origin/fastp_out/2447-20_L1.R1.clean.fastq.gz../origin/fastp_out/2447-20_L1.R2.clean.fastq.gz>2447-20_L1.sam&

sam转bam

samtools view -Sb -@40 new_ys_am43.sam -o new_ys_am43.bam

加头部

java -Xmx256g -jar /public/home/zzp/biosoft/picard.jar AddOrReplaceReadGroups I=am43green_gy14.bam O=nam43green_gy14.bam LB=WGS PL=illumina ID=A00151 SM=am43green PU=am43green

java -Xmx256g -jar /public/home/zzp/biosoft/picard.jar AddOrReplaceReadGroups I=am43_yellow_gy14.bam O=nam43_yellow_gy14.bam LB=WGS PL=illumina ID=A00129 SM=am43yellow PU=am43yellow

ID = Read group identifier

每一个read group 独有的ID,每一对reads 均有一个独特的ID,可以自定义命名;

PL = Platform

测序平台;ILLUMINA, SOLID, LS454, HELICOS and PACBIO,不区分大小写;

SM = sample

reads属于的样品名;SM要设定正确,因为GATK产生的VCF文件也使用这个名字;

LB = DNA preparation library identifier

对一个read group的reads进行重复序列标记时,需要使用LB来区分reads来自那条lane;有时候,同一个库可能在不同的lane上完成测序;为了加以区分,

同一个或不同库只要是在不同的lane产生的reads都要单独给一个ID. 一般无特殊说明,成对儿read属于同一库,可自定义,比如:library1

若是忘记添加read group信息还以通过 AddOrReplaceReadGroups 添加

gatk AddOrReplaceReadGroups -I .bam -O .add.bam -LB library1 -PL illumina -PU pl1 -SM name##参数-I Input file(BAM or SAM or a GA4GH url);-O Output file(BAM or SAM);-LB Read-Group library;-PL Read-Group platform(e.g. ILLUMINA,SOLID);-PU Read-Group platform unit(eg. run barcode);-SM Read-Group sample name

ID str:输入reads集ID号;LB:read集文库名;PL:测序平台(illunima或solid);PU:测序平台下级单位名称(run的名称);SM:样本名称。




bam排序

samtools sort -@ 40 -m 100G new_ys_am43.bam ./new_ys_am43.sorted.bam

去重

java -jar /public/home/zzp/newam43/picard.jar MarkDuplicates  INPUT=new_ys_am43.sorted.bam.bam OUTPUT=new_ys_am43.sorted.bam.bam.repeatmark.bam METRICS_FILE=new_ys_am43.sorted.bam.bam.metrics

建索引

samtools index  new_ys_am43.sorted.bam.bam.repeatmark.bam

会生成bwa比对的参考基因组文件的INDEX。 以及GATK所需要的dict.这个时候要把GATK的dict 该一个名称,比如:mv Athaliana_447_TAIR10.fa.dict Athaliana_447_TAIR10.dict。 不然下边GATKcall SNP 会报错


1.1生成Gvcf文件

java -Xmx256G -jar /public/home/zzp/biosoft/gatk-4.1.9.0/gatk-package-4.1.9.0-local.jar HaplotypeCaller -R Gy14_genome_v2.fa -I am43ys_gy14.reordered.sort.repeatmark.bam --native-pair-hmm-threads 56 --emit-ref-confidence GVCF -O am43ys_gy14.reordered.sort.repeatmark.g.vcf

本地跑GATK4的时候发现,它的参数设置中竟然没有多线程的参数,这和GATK3有点大不同,因为在GATK3中我们可以用-nt或者-nct来设定多线程运行,但是GATK4却没有类似的参数,这是为啥呢?

早有研究者问过GATK的团队,官方的回答简单粗暴,没有!如果要使用多线程来跑GATK4流程,那么就在本地节点配置好Spark,那样子就可以用GATK4中的Spark功能模块(比如: HaplotypeCallerSpark、BaseRecalibratorSpark、ApplyBQSRSpark、SortSamSpark、MarkDuplicatesSpark)运行,让Spark来完成多线程。现在GATK4中有蛮多的应用采用了Spark的技术,大家可以使用下面的代码查看:

/path/of/your/local/gatk4/gatk--list

跑过GATK3的同学们应该了解过,以前GATK3中的多线程功能的效果其实并不好,而且还容易出问题。可能也是由于这方面的原因,GATK团队这一次在GATK4中就干脆放弃了通过自己团队实现多线程的想法,直接使用现成的Spark来完成多线程使用的调度。另外,值得一提的是在GATK4中跑并行任务的最好做法是采用WDL和Cromwell相结合的方式。

话虽如此,但GATK团队实际上还是留下了唯一的一个例外!那就是HaplotypeCaller中最消耗计算资源的模块——pariHMM,这个是可以本地单独多线程的!通过“–native-pair-hmm-threads”这个参数来设置,它默认是4,功能有些隐蔽!

HaplotypeCaller的应用有两种做法,差别只在于要不要在中间生成一个gVCF: (1)直接进行HaplotypeCaller,这适合于单样本,或者那种固定样本数量的情况,也就是只执行一次HaplotypeCaller。如果增加一个样本就得重新运行这个HaplotypeCaller,而这个时候算法需要重新去读取所有人的BAM文件,浪费大量时间; (2)每个样本先各自生成gVCF,然后再进行群体joint-genotype。gVCF全称是genome VCF,是每个样本用于变异检测的中间文件,格式类似于VCF,它把joint-genotype过程中所需的所有信息都记录在这里面,文件无论是大小还是数据量都远远小于原来的BAM文件。这样一旦新增加样本也不需要再重新去读取所有人的BAM文件了,只需为新样本生成一份gVCF,然后重新执行这个joint-genotype就行了。

推荐使用第二种,变异检测不是一个样本的事情,有越多的同类样本放在一起joint calling结果将会越准确,而如果样本足够多的话,在低测序深度的情况下也同样可以获得完整并且准确的结果。

1.2合并之前生成的GVCF文件到一个文件。

java -Xmx256G -jar /public/home/zzp/biosoft/gatk-4.1.9.0/gatk-package-4.1.9.0-local.jar CombineGVCFs -R Gy14_genome_v2.fa --variant am43ys_gy14.reordered.sort.repeatmark.g.vcf --variant /public/home/zzp/am43_bsa/gy14/am43_yellow_gy14.g.vcf.gz --variant /public/home/zzp/am43_bsa/gy14/am43_green_gy14.g.vcf.gz -O am43_all.g.vcf.gz

1.3 GenotypeGVCFs

java -Xmx256G -jar /public/home/zzp/biosoft/gatk-4.1.9.0/gatk-package-4.1.9.0-local.jar GenotypeGVCFs -R Gy14_genome_v2.fa -V am43_all.g.vcf.gz -O am43_all.vcf.gz


2.select SNP

java -Xmx256G -jar /public/home/zzp/biosoft/gatk-4.1.9.0/gatk-package-4.1.9.0-local.jar SelectVariants -R Gy14_genome_v2.fa -O am43_all_snp.vcf --variant am43_all.vcf.gz --select-type-to-include SNP 2>select_snp.err

3.select indel

java -Xmx256G -jar /public/home/zzp/biosoft/gatk-4.1.9.0/gatk-package-4.1.9.0-local.jar SelectVariants -R Gy14_genome_v2.fa -O am43_all_indel.vcf --variant am43_all.vcf.gz --select-type-to-include INDEL 2>select_indel.err

4.1 filter SNP(变异过滤,硬过滤。)

质控的含义和目的是指通过一定的标准,最大可能地剔除假阳性的结果,并尽可能地保留最多的正确数据。 第一种方法 GATK VQSR,它通过机器学习的方法利用多个不同的数据特征训练一个模型(高斯混合模型)对变异数据进行质控,使用VQSR需要具备以下两个条件: 第一,需要一个精心准备的已知变异集,它将作为训练质控模型的真集。比如,Hapmap、OMNI,1000G和dbsnp等这些国际性项目的数据,这些可以作为高质量的已知变异集。 第二,要求新检测的结果中有足够多的变异,不然VQSR在进行模型训练的时候会因为可用的变异位点数目不足而无法进行。

此方法要求新检测的结果中有足够多的变异,不然VQSR在进行模型训练的时候会因为可用的变异位点数目不足而无法进行。可能很多非人的物种在完成变异检测之后没法使用GATK VQSR的方法进行质控,一些小panel、外显子测序,由于最后的变异位点不够,也无法使用VQSR。全基因组分析或多个样本的全外显子组分析适合用此方法。

第二种方法通过过滤指标过滤。 QualByDepth(QD):QD是变异质量值(Quality)除以覆盖深度(Depth)得到的比值。 FisherStrand (FS):FS是一个通过Fisher检验的p-value转换而来的值,它要描述的是测序或者比对时对于只含有变异的read以及只含有参考序列碱基的read是否存在着明显的正负链特异性(Strand bias,或者说是差异性) StrandOddsRatio (SOR):对链特异(Strand bias)的一种描述. RMSMappingQuality (MQ):MQ这个值是所有比对至该位点上的read的比对质量值的均方根. MappingQualityRankSumTest (MQRankSum) ReadPosRankSumTest (ReadPosRankSum) 通过过滤指标过滤

如何理解硬过滤的指标和阈值的计算

考虑到SNP和Indel在判断指标和阈值方面的思路是一致的,因此没必要重复说。所以,下面我只以SNP为例子,告诉大家设定阈值的思路。强调一下,为了更具有通用价值,这些阈值是借用NA12878(来自GIAB)的高深度数据进行计算获得的,所以如果你的数据(或者物种)相对比较特殊(不是哺乳动物),那么就不建议直接套用了,但可以依照类似的思路去寻找新阈值。

QualByDepth(QD)

QD是变异质量值(Quality)除以覆盖深度(Depth)得到的比值。这里的变异质量值就是VCF中QUAL的值——用来衡量变异的可靠程度,这里的覆盖深度是这个位点上所有含有变异碱基的样本的覆盖深度之和,通俗一点说,就是这个值可以通过累加每个含变异的样本(GT为非0/0的样本)的覆盖深度(VCF中每个样本里面的DP)而得到。举个例子:

11429249 .CT1044.77 .  .GT:AD:DP:GQ:PL 0/1:48,15:63:99:311,0,1644 0/0:47,0:47:99:392,0,0 1/1:0,76:76:99:3010,228,0

这个位点是1:1429249,VCF格式,但我把FILTER和INFO的信息省略了,它的变异质量值QUAL=1044.77。我们可以从中看到一共有三个样本,其中一个是杂合变异(GT=0/1),一个纯合的非变异(GT=0/0),最后一个是纯合的变异(GT=1/1)。每个样本的覆盖深度都在其各自的DP域上,分别是:63,47和76。按照定义,这个位点的QD值就应该等于质量值除以另外两个含有变异的样本的深度之和(排除中间GT=0/0这个不含变异的样本),也就是:

QD = 1044.77 / (63+76) = 7.516

QD这个值描述的实际上就是单位深度的变异质量值,也可以理解为是对变异质量值的一个归一化,QD越高一般来说变异的可信度也越高。在质控的时候,相比于QUAL或者DP(深度)来说,QD是一个更加合理的值。因为我们知道,原始的变异质量值实际上与覆盖的read数目是密切相关的,深度越高的位点QUAL一般都是越高的,而任何一个测序数据,都不可避免地会存在局部深度不均的情况,如果直接使用QUAL或者DP都会很容易因为覆盖深度的差异而带来有偏的质控结果。

在上面『执行硬过滤』的例子里面,我们看到认为好的SNP变异,QD的值不能低于2,但问题是为什么是2,而不是3或者其它数值呢?

要回答这个问题,我们可以通过利用NA12878 VQSR质控之后的变异数据和原始的变异数据来进行比较,并把它说明白。

首先,我们可以先把所有变异位点的QD值都提取出来,然后画一个密度分布图(Y轴代表的是对应QD值所占总数的比例,而不是个数),看看QD值的总体分布情况(如下图,来自NA12878的数据)。

从这个图里,我们可以看到QD的范围主要集中在0~40之间。同时,我们可以明显地看到有两个峰值(QD=12和QD=32)。这两个峰所反映的恰恰是杂合变异和纯合变异的QD值所集中的地方。这里大家可以思考一下,哪一个是代表杂合变异的峰,哪一个是代表纯合变异的峰呢?

回答是,第一个峰(QD=12)代表杂合,而第二峰(QD=32)代表纯合,为什么呢?因为对于纯合变异来说,贡献于质量值的read是杂合变异的两倍,同样深度的情况下,QD会更大。对于大多数的高深度测序数据来说,QD的分布和上面的情况差不多,因此这个分布具有一定的代表性。

接着,我们同时画出VQSR之后所有可信变异(FILTER=Pass)和不可信变异的QD分布图,如下,浅绿色代表可信变异的QD分布图,浅红色代表不可信变异的QD分布图。

你可以看到,大多数Fail的变异,都集中在左边的低QD区域,而且红波峰恰好是QD=2的地方,这就是为什么硬过滤时设置QD>2的原因了。

可是在上面的图里,我想你也看到了,有很多Fail的变异它的QD还是很高的,有些甚至高于30,通过这样的硬过滤参数所得到的结果中就会包含这部分本该要过滤掉的坏变异;而同样的,在低QD(<2)区域其实也有一些是好的变异,但是却被过滤掉了。这其实也是硬过滤的一大弊端,它不会像VQSR那样,通过多个不同维度的数据构造合适的高维分类模型,从而能够更准确地区分好和坏的变异,而仅仅是一刀切。

当你理解了上面有关QD的计算和阈值选择的过程之后,要弄懂后面的指标和阈值也就容易了,因为用的也都是同样的思路。

FisherStrand(FS)

FS是一个通过Fisher检验的p-value转换而来的值,它要描述的是测序或者比对时对于只含有变异的read以及只含有参考序列碱基的read是否存在着明显的正负链特异性(Strand bias,或者说是差异性)。这个差异反应了测序过程不够随机,或者是比对算法在基因组的某些区域存在一定的选择偏向。如果测序过程是随机的,比对是没问题的,那么不管read是否含有变异,以及是否来自基因组的正链或者负链,只要是真实的它们就都应该是比较均匀的,也就是说,不会出现链特异的比对结果,FS应该接近于零。

这里多说一句,在VCF的INFO中有时除了FS之外,有时你还会看到SB或者SOR。它们实际上是从不同的层面对链特异的现象进行描述。只不过SB给出的是原始各链比对数目,而FS则是对这些数据做了精确Fisher检验;SOR原理和FS类似,但是用了不同的统计检验方法计算差异程度,它更适合于高覆盖度的数据。

与QD一样,我们先来看一下质控前所有变异的FS总体密度分布图(如下)。很明显与QD相比,FS的范围更加的大,从0到好几百的都有。不过从图中也可以看出,绝大部分的变异还是在100以下的。

下面这一个图则是经过VQSR之后,画出来的FS分布图。跟上面的QD一样,浅绿色代表好变异,浅红色代表坏变异。我们可以看到,大部分好变异的FS都集中在0~10之间,而且坏变异的峰值在60左右的位置上,因此过滤的时候,我们把FS设置为大于60。其实设置这么高的一个阈值是比较激进的(留下很多假变异),但是从图中你也可以看到,不过设置得多低,我们总会保留下很多假的变异,既然如此我们就干脆选择尽可能保留更多好的变异,然后祈祷可以通过『执行硬过滤』里其他的阈值来过滤掉那些无法通过FS过滤的假变异。

StrandOddsRatio(SOR)

关于SOR在上面讲到FS的时候,我就在注释里提及过了。它同样是对链特异(Strand bias)的一种描述,但是从上面我们也可以看到FS在硬过滤的时候并不是非常给力,而且由于很多时候read在外显子区域末端的覆盖存在着一定的链特异(这个区域的现象其实是正常的),往往只有一个方向的read,这个时候该区域中如果有变异位点的话,那么FS通常会给出很差的分值,这时SOR就能够起到比较好的校正作用了。计算SOR所用的统计检验方法也与FS不同,它用的是symmetric odds ratio test,数据是一个2×2的列联表(如下),公式也十分简单,我把公式进行了简单的展开,从中可以清楚地看出,它考虑的其实就是ALT和REF这两个碱基的read覆盖方向的比例是否有偏,如果完全无偏,那么应该等于1。

sor = (ref_fwd/ref_rev) / (alt_fwd/alt_rev) = (ref_fwd * alt_rev) / (ref_rev * alt_fwd)

OK,那么同样的,我们先看一下这个值总体的密度分布情况(如下)。总的来说,这个分布明显集中在0~3之间,这也和我们的预期比较一致。不过也有比较明显的长尾现象,这个时候我们也没必要定下太过明确的阈值预期,先看VQSR的分布结果。

下面这个图就是在VQSR之后,区分了好和坏变异之后,SOR的密度分布。很明显,好的变异基本就在1附近。结合这个分布图,我们在上面的例子里把它的阈值定为3基本上也不会过损失好的变异了,虽然单靠这个阈值还是会保留下不少假的变异,但是至少不合理的长尾部分可以被砍掉。

RMSMappingQuality(MQ)

MQ这个值是所有比对至该位点上的read的比对质量值的均方根(先平方、再平均、然后开方,如下公式)。

它和平均值相比更能够准确地描述比对质量值的离散程度。而且有意思的是,如果我们的比对工具用的是bwa mem,那么按照它的算法,对于一个好的变异位点,我们可以预期,它的MQ值将等于60。

下面是所有未过滤的变异位点上MQ的密度分布图。基本上就只在60的地方存在一个很瘦很高的峰。可以说这是目前为止这几个指标中图形最为规则的了,在这个图上,我们甚至就可以直接定出MQ的阈值了,比如所有小于50的就可以过滤掉了。

但是,理性告诉我们还是要看一下VQSR的对比结果(下图)。

你会发现似乎所有好的变异都紧紧集中在60旁边了,其它地方就都是假的变异了,所以MQ的阈值设置为50也是合理的。但是同样要注意到的地方是,60这个范围实际上依然有假的变异位点在那里,我们把这个区域放大来看,如下图,这里你就会发现其实假变异的密度分布图也覆盖到60这个范围了。

考虑到篇幅的问题,接下来MappingQualityRankSumTest(MQRankSum)和ReadPOSRankSumTest(ReadPOSRankSum)的阈值设定原理,我不打算再细说下去,思路和上面的4个是完全一样的。都是通过比较VQSR之后的密度分布图,最后确定了硬过滤的阈值。

但请不要以为这只是适用于GATK得到的变异,实际上,只要我们弄懂了这些指标选择的原因和过滤的思路,那么通过任何其他的变异检测工具也是依旧可以适用的,区别就在于GATK帮我们把这些要用的指标算好了。

同样地,这些指标也不是一成不变的,可以根据实际的情况换成其他,或者我们自己重新计算。

Ti/Tv处于合理的范围

Ti/Tv的值是物种在与自然相互作用和演化过程中在基因组上留下来的一个统计标记,在物种中这个值具有一定的稳定性。因此,一般来说,在完成了以上的质控之后,还会看一下这些变异位点Ti/Tv的值是多少,以此来进一步确定结果的可靠程度。

Ti(Transition)指的是嘌呤转嘌呤,或者嘧啶转嘧啶的变异位点数目,即A<->G或C<->T;

Tv(Transversion)指的则是嘌呤和嘧啶互转的变异位点数目,即A<->C,A<->T,G<->C和G<->T。(如下图)

另外,在哺乳动物基因组上C->T的转换比较多,这是因为基因组上的胞嘧啶C在甲基化的修饰下容易发生C->T的转变。

说了这么多Ti/Tv的比值应该是多少才是正常的呢?如果没有选择压力的存在,Ti/Tv将等于0.5,因为从概率上讲Tv将是Ti的两倍。但现实当然不是这样的,比如对于人来说,全基因组正常的Ti/Tv在2.1左右,而外显子区域是3.0左右,新发的变异(Novel variants)则在1.5左右

最后多说一句,Ti/Tv是一个被动指标,它是对最后质控结果的一个反应,我们是不能够在一开始的时候使用这个值来进行变异过滤的。



indel

java -Xmx256G -jar /public/home/zzp/biosoft/gatk-4.1.9.0/gatk-package-4.1.9.0-local.jar VariantFiltration -V am43_all_indel.vcf --filter-expression "QD < 2.0 || FS > 200.0 || SOR > 10.0 || MQRankSum < -12.5 || ReadPosRankSum < -8.0" --filter-name "PASS" -O am43_all_indel.filed.vcf


java -Xmx256G -jar /public/home/zzp/biosoft/gatk-4.1.9.0/gatk-package-4.1.9.0-local.jar VariantFiltration -V 9930_am43_all_gy14_indel.vcf --filter-expression "QD < 2.0 || FS > 200.0 || ReadPosRankSum < -8.0 || QUAL < 30.0" --filter-name "PASS" -O 9930_am43_all_gy14_indel.filed.vcf

snp

java -Xmx256G -jar /public/home/zzp/biosoft/gatk-4.1.9.0/gatk-package-4.1.9.0-local.jar VariantFiltration -V 9930_am43_all_gy14_snp.vcf --filter-expression "QD < 2.0 || MQ < 40.0 || FS > 60.0 || SOR > 3.0 || MQRankSum < -12.5 || ReadPosRankSum < -8.0 || QUAL < 30.0" --filter-name "PASS" -O 9930_am43_all_gy14_snp.filed.vcf

QD,描述单位深度的变异值,越大可信度越高。一般过滤掉<2的值。

FS,描述正负链特异性,差异性较大,说明测序或组装的过程中不够随机。FS越小越好。一般过掉掉>40(严格)或60(普通)

MQ 使用bwa-mem的话,正常值应该是60,描述某个位点测序reads的质量值的离散程度。MQ< 40.0

MQRankSum < -12.5

SOR,也是表示正负链特异性,正常值在0-3,过滤掉>3的值。

重新合并过滤后的SNP和Indel

java -Xmx256G -jar /public/home/zzp/biosoft/gatk-4.1.9.0/gatk-package-4.1.9.0-local.jar MergeVcfs -I am43_all_snp.filed.vcf -I am43_all_indel.filed.vcf -O am43_all.filed.vcf



5转换vcf为table格式

java -Xmx256G -jar /public/home/zzp/biosoft/gatk-4.1.9.0/gatk-package-4.1.9.0-local.jar VariantsToTable -R Gy14_genome_v2.fa -V am43_all.filed.vcf -F CHROM -F POS -F REF -F ALT -GF AD -GF DP -GF GQ -GF PL -O am43_all.filed.vcf.table

三、使用qtl-seqr包(可以和第四步同时进行)

QTLseqr在github

#安装使用QTL-seqr#安装installed.packages('devtools')library('devtools')install_github("bmansfeld/QTLseqr")#load the packagelibrary("QTLseqr")#set sample and file name HighBulk<-"样品名称1"LowBulk<-"样品名称2"file<-"common.table"#choose which chromosomes will be included in the analysis chroms<-paste0Chroms<-paste0(rep("Chr",10),1:10)#Import SNP data from filedf<-importFromGATK(file=file,highBulk=HighBulk,lowBulk=LowBulk,chromList=Chroms)#Filter SNPs based on some criteriadf_filt<-filterSNPs(SNPset=df,refAlleleFreq=0.20,minTotalDepth=100,maxTotalDepth=400,minSampleDepth=40,minGQ=99)#Run G' analysisdf_filt<-runGprimeAnalysis(SNPset=df_filt,windowSize=1e6,outlierFilter="deltaSNP")#Run QTLseq analysisdf_filt<-runQTLseqAnalysis(SNPset=df_filt,windowSize=1e6,popStruc="F2",#根据群体结构调整F2或者RILbulkSize=c(25,25),#根据池中的样本单株数量replications=10000,intervals=c(95,99))#PlotplotQTLStats(SNPset=df_filt,var="Gprime",plotThreshold=TRUE,q=0.01)plotQTLStats(SNPset=df_filt,var="deltaSNP",plotIntervals=TRUE)#export summary CSVgetQTLTable(SNPset=df_filt,alpha=0.01,export=TRUE,fileName="my_BSA_QTL.csv")

四. 使用snpEff处理gatk4输出的vcf。(此步骤和第三步骤的输出结果可以互相对比,两者具有相同的功能)

snpEff的教程

下载snpEff地址

解压unzip snpEff_latest_core.zip

我的路径是/home/chaim/bsa/snpEff/

配置玉米zm437版本的数据库

在路径/home/chaim/bsa/snpEff/snpEff/目录下创建文件夹data,

cd /home/chaim/bsa/snpEff/snpEff/mkdir datacd datamkdir genomesmkdir zm437#在zm437目录存放基因组注释文件genes.gff,  蛋白库,protein.fa#在genomes目录放置基因组参考序列 zm437.fa

注意上述的基因组注释文件是gff3格式。

修改snpEff.config的参数

添加如下内容

#maize genome,version zm437 zm437.genome:maize

回到snpEFF目录,运行命令

java -jar snpEff.jar build -gff3 -v zm437

对vcf格式文件进行注释:

bwa目录存放着GATK4处理之后的文件common_filtration.vcf

在/home/chaim/bsa/bwa目录执行下面命令

java -Xmx128g -jar /home/chaim/bsa/snpEff/snpEff/snpEff.jar zm437 common_filtration.vcf > common.eff.vcf

会输出三个文件,

snpEff_genes.txt

snpEff_summary.html

common.eff.vcf

如果想更改使用其他注释文件,

删除/home/chaim/bsa/snpEff/snpEff//data/zm437/snpEffectPredictor.bin该文件删除即可。

重新从步骤1开始即可。


2.1. bwa建立索引文件

你可能感兴趣的:(BSA 操作实战)