一.軟件下載安裝
??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