SNP calling using VARSCAN
VarScan 用 Java 编写,命令行执行,输入pileup文件。
安装
https://sourceforge.net/projects/varscan/files/
下载相应版本VarScan.jar文件到指定位置如/public/home/huangsisi/bin/varscan/VarScan.v2.3.9.jar
使用方法
1 | java -jar /public/home/huangsisi/bin/varscan/VarScan.v2.3.9.jar [命令] |
call SNP流程
fastp
质控
1 | fastp -i ${InDir}/${fq1} -I ${InDir}/${fq2} -w ${SLURM_CPUS_PER_TASK} \ |
bwa
比对,要sort
1 | # 建立index |
-F4
去掉比对不上的读,但可能非必要。
- 生成
pileup
文件
1 | samtools mpileup -f ${ref} sort.bam > sort.mpileup |
- varscan
mpileup2snp
call SNP
1 | java -jar /public/home/huangsisi/bin/varscan/VarScan.v2.3.9.jar \ |
后两步骤也可以合起来
1 | samtools mpileup -f ${ref} sort.bam |\ |
注意:我一开始使用samtools mpileup中加了-B参数,
-B, –no-BAQ disable BAQ (per-Base Alignment Quality)
即忽略了比对质量,导致多了很多不可靠突变,这是不可取的,但是作为探索似乎也能说明什么……
- 个人完整版本
1 | fastp -i ${InDir}/${fq1} -I ${InDir}/${fq2} -w ${SLURM_CPUS_PER_TASK} \ |
输出结果
将以上流程应用到新冠病毒分离培养捕获测序样本(credit to jianglab),结果如下
1 | Chrom Position Ref Var Cons:Cov:Reads1:Reads2:Freq:P-value StrandFilter:R1+:R1-:R2+:R2-:pval SamplesRef SamplesHet SamplesHom SamplesNC Cons:Cov:Reads1:Reads2:Freq:P-value |
其中Reads1表示未发生突变数量,Reads2表示突变数量,R1+表示未发生突变的正义链数量,R1-、R2+、R2-类似理解,Freq为突变频率。(但是我算了一下有些不太对头,并不清楚每个值明确是怎样计算的,大致差不多)
可以看到高于90%的高频突变为
位置 | 参考序列碱基 | 突变 |
---|---|---|
22303 | T | G |
27775 | T | C |
27776 | T | G |
27777 | G | A |
以及程序输出结果
1 | Only SNPs will be reported |
mpileup2snp
选项说明
- –min-coverage:最小读深度[8]
- –min-reads2:呼叫突变的位置处的最小支持读数[2]
- –min-avg-qual:在计算读次数的位置上的最低碱基质量[15]
- –min-var-freq:最低突变等位基因频率阈值[0.01]
- –min-freq-for-hom:呼叫纯合子的最低频率[0.75]
- –p-value:呼叫突变的p值阈值[99e-02]
- –strand-filter:忽略在一个链上支持> 90%的突变[1]
- –output-vcf:如果设置为1,以VCF格式输出,不需要可以不设置
- –variants:仅报告突变(SNP / indel)位置(仅适用于mpileup2cns)[0]
由于扩增子测序链常常有bias(正反链比例悬殊比如2205:72),因此采用--strand-filter 0
,同时可以降低频率阈值查看更低频突变。例如
1 | java -jar /public/home/huangsisi/bin/varscan/VarScan.v2.3.9.jar \ |
此外,varscan除mpileup2snp
外,还有
mpileup2indel
:call indelmpileup2cns
:makes consensus calls (SNP/Indel/Reference)