一.软件下载安装
bwa:https://github.com/lh3/bwa
安装及命令详解参考:http://starsyi.github.io/2016/05/24/BWA-%E5%91%BD%E4%BB%A4%E8%AF%A6%E8%A7%A3/
samtools:https://github.com/samtools/
Picard:https://github.com/broadinstitute/picard
GATK:https://github.com/broadinstitute/gatk/releases
二.运行流程
2.1 原始数据处理
(1)下机数据过滤和比对
因为下机数据是clean reads,所以省略过滤的步骤,直接使用bwa和参考基因组比对
(a)bwa index
#bwa(version:0.7.17-r1188)
bwa index ref.fa
bwa index选项:
-a
BWT构造算法: bwtsw, is or rb2 [auto]
is:用于构建后缀数组的 IS 线性时间算法。简单、速度较快,但不适用于大于 2GB 的基因组。
bwtsw:在 BWT-SW 中实现的算法,对大于10M的基因组才生效。这种方法适用于整个人类基因组。
-p
index的前缀 [默认和fasta保持一致]
-b
bwtsw算法的block size (仅当-a bwtsw有效) [默认10000000]
(b)bwa alignment
bwa mem -t 10 -M -Y -R '@RG\tID:foo\tPL:Illumina\tSM:example' ref.fa read_1_clean.fq.gz read_2_clean.fq.gz > sample.sam
选项:
-R
设定头文件,ID:通道名或样本名,通过这个信息分组,必须唯一;SM:样本名;LB:文库名;PL:测序平台信息[COMPLETE,ILLUMINA,SANGER]。以上这些信息后续GATK和markduplicate会用到,不可出错。
-M
对于一条序列同时比对到基因组不同区域的情况,bwa认为都是最优匹配,但是会与Picard tools不兼容,影响后面GATK检测,这个时候可以设置-M选项,将较短的比对标记为次优,与picard兼容。
-Y
把默认的hard clip变为soft clip。hard clip 不会显示不匹配的碱基串,soft clip会显示不匹配的碱基串。
对-M
-Y
参数的详细解释可以参考http://t.zoukankan.com/timeisbiggestboss-p-8856888.html
(2)samtools格式转换
(a)sam转bam格式
bam是二进制文件,运算速度快
#samtools(version:1.9)
samtools view -bS example.sam -o example.bam
# -b 输出bam格式文件 -S 输入sam格式文件
(b)质控
输出MAPQ≥30的序列
samtools view -h -b -q30 example.bam > example.q30.bam
# -q 比对的最低质量值 -h 输出的文件包含头部信息 -b 输出bam格式文件
(c)排序
samtools sort -@ 5 example.q30.bam > example.q30.sorted.bam
# @ 线程数
2.2 运行GATK4
(1)Picard去重
在制备文库的过程中,由于PCR扩增过程中会存在一些偏差,也就是说有的序列会被过量扩增。这样,在比对的时候,这些过量扩增出来的完全相同的序列就会比对到基因组的相同位置。而这些过量扩增的reads并不是基因组自身固有序列,不能作为变异检测的证据,因此,要尽量去除这些由PCR扩增所形成的duplicates,这一步可以使用picard-tools来完成。去重复的过程是给这些序列设置一个flag以标志它们,方便GATK的识别。还可以设置 REMOVE_DUPLICATES=true 来丢弃duplicated序列。对于是否选择标记或者删除,对结果应该没有什么影响,GATK官方流程里面给出的例子是仅做标记不删除。这里定义的重复序列是这样的:如果两条reads具有相同的长度而且比对到了基因组的同一位置,那么就认为这样的reads是由PCR扩增而来,就会被GATK标记。
#Picard(version:2.27.1)
java -jar picard.jar MarkDuplicates -I example.q30.sorted.bam -O markdup.bam -M markdup.bam.mat -MAX_FILE_HANDLES 1000 --REMOVE_DUPLICATES false --TMP_DIR /path/to/tmpdir
(2)构建索引
samtools构建索引
samtools index markdup.bam
gatk对参考基因组构建索引
gatk CreateSequenceDictionary -R ref.fa
(3)gatk变异检测
(a)分染色体生成gvcf、vcf文件
#批量生成分染色体生成gvcf的命令
for i in {01..17};do
echo "gatk --java-options \"-Xmx8G -XX:ParallelGCThreads=8 -Djava.io.tmpdir=./tmpdir \" HaplotypeCaller -R ref.fa -I markdup.bam -L chr$i -ERC GVCF -O Chr$i.g.vcf.gz"
done >total.gvcf.sh
bash total.gvcf.sh
#批量生成分染色体生成vcf的命令
for i in {01..17};do echo "gatk --java-options \"-Xmx4G -XX:ParallelGCThreads=8 -Djava.io.tmpdir=./tmpdir \" GenotypeGVCFs -R ref.fa --variant Chr$i.g.vcf.gz -O Chr$i.vcf.gz" ;done >total.vcf.sh
bash total.vcf.sh
GVCF(Genomic VCF)是一种 VCF,因此基本格式与常规 VCF 相同,但GVCF包含额外信息。参考gvcf文件与vcf文件_卡西莫多的礼物的博客-CSDN博客_gvcf文件
在将多个样本的vcf文件进行合并的时候,需要区分./.和0/0的情况,./.是未检出的基因型,而0/0是未突变的基因型,如果仅使用普通的vcf文件进行合并,那么就无法区分这两种情况,进而对合并结果产生偏差。实际上,我们也可以直接将gvcf文件和vcf文件使用bcftools merge进行merge,但是这样拿到的结果会有偏差,因为vcf文件没有未突变的位点的情况。
(b)提取SNP
#批量生成分染色体提取SNP的命令
for i in {01..17};do echo "gatk SelectVariants -R ref.fa -V Chr$i.vcf.gz --select-type-to-include SNP -O Chr$i.snp.vcf";done >select_snp.sh
bash select_snp.sh
(c)VariantsFiltration
参考https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7204223/
https://bio-protocol.org/bio101/r9594358
https://gencore.bio.nyu.edu/variant-calling-pipeline-gatk4/
for i in {01..17};do echo "gatk VariantFiltration -R ref.fa -V Chr$i.snp.vcf \
-O Chr$i.snp.filterd.vcf -filter-name \"QD_filter\" -filter \"QD < 2.0\" \
-filter-name \"FS_filter\" -filter \"FS > 60.0\" -filter-name \"MQ_filter\" \
-filter \"MQ < 40.0\" -filter-name \"SOR_filter\" -filter \"SOR > 4.0\" \
-filter-name \"MQRankSum_filter\" -filter \"MQRankSum < -12.5\" \
-filter-name \"ReadPosRankSum_filter\" -filter \"ReadPosRankSum < -8.0\" ";done >filter.snp.sh
bash filter.snp.sh
选项:
-R
参考序列
-V
输入变异文件
-O
输出文件
filter
过滤条件
-filter-name
被过滤的SNP不会被删除,而是加上标签
过滤指标的含义可参考:
https://gatk.broadinstitute.org/hc/en-us/articles/360035890471?id=11069
https://gencore.bio.nyu.edu/variant-calling-pipeline-gatk4/
测序分析之Variants - 知乎 (zhihu.com)
运行过程中有warning显示undefined variable
在论坛中搜索后得知,https://gatk.broadinstitute.org/hc/en-us/community/posts/4408733963803-GATK-Variant-Filtration-undefined-variable,这些警告最有可能出现在文件中没有 ReadPosRankSum 或 MQRankSum 值的位置,指出 VariantFiltration 将无法在不存在这些注释的位点上过滤这些注释。这些不是实际的错误消息。
(d)合并vcf文件
#删除被过滤的snp,grep -v意思是显示不包含匹配文本的所有行,”_filter"是上一步给出的标签
for i in {01..17};do echo "grep -v \"_filter\" Chr$i.snp.filterd.vcf >Chr$i.snp.2.vcf";done >filter2.snp.sh
bash filter2.snp.sh
#将所有过滤后的vcf文件合并成一个文件
gatk MergeVcfs -I Chr01.snp.2.vcf -I Chr02.snp.2.vcf -I Chr03.snp.2.vcf -I Chr04.snp.2.vcf -I Chr05.snp.2.vcf -I Chr06.snp.2.vcf -I Chr07.snp.2.vcf -I Chr08.snp.2.vcf -I Chr09.snp.2.vcf -I Chr10.snp.2.vcf -I Chr11.snp.2.vcf -I Chr12.snp.2.vcf -I Chr13.snp.2.vcf -I Chr14.snp.2.vcf -I Chr15.snp.2.vcf -I Chr16.snp.2.vcf -I Chr17.snp.2.vcf -O Filter.snp.vcf
参考文章:https://zhuanlan.zhihu.com/p/69726572
http://starsyi.github.io/2016/05/25/%E5%8F%98%E5%BC%82%E6%A3%80%E6%B5%8B%EF%BC%88BWA-SAMtools-picard-GATK%EF%BC%89/
https://cloud.tencent.com/developer/article/1720656
http://bio-bwa.sourceforge.net/bwa.shtml
http://t.zoukankan.com/timeisbiggestboss-p-8856888.html