背 景
在基因組分析領域的
很多
不同場景中,需要合併VCF檔案。
VCF檔案
。簡單來說,就是記錄樣本基因型的檔案。但多數VCF檔案不只記錄了基因型,也包含有關該基因型的來源的細節。
其它檔案
。VCF檔案的上游是
BAM檔案
,主要記錄Reads與參考基因組的比對資訊;更上游的,就是
FASTQ測序資料
,以及物種的
參考基因組
。
不同型別的VCF檔案
。VCF檔案有單樣本的、多樣本的;也有普通VCF檔案 (只記錄變異,未測到的、野生型的都不記錄),及GVCF檔案 (野生型的、變異的都記錄,未測到的不記錄)。
一個典型的GVCF檔案
因此,本篇文章的使用者,需要首先了解GVCF檔案與普通VCF檔案的不同。因為二者對應的生信處理方法也非常不同。但具體有哪些不同,這裡不再繼續講,可自行在網路資源上按照相應的關鍵詞檢索。
合併VCF檔案需要注意的問題
。VCF檔案有時是多個
樣本
、多個
個體
、或多個
病例
的合併;有時是
不同染色體區域的VCF合併
。上述每個場景都涉及不同的軟體、程式,甚至演算法,需要非常小心、謹慎地操作。
合併:不同樣本的GVCF檔案
GATK的
CombineGVCFs
+
GenotypeGVCFs
上面2個程式是一套組合,不可拆分,不可單獨使用。
那為什麼GATK開發者將二者分開呢,推測有兩個原因:① 二者分別有些特定的引數;② 第1個程式非常耗時,第2個程式相對較快、但演算法複雜。這個問題對使用者也無關緊要。
# 合併佇列中每個樣本的每一個變異 (GVCF檔案)gatk CombineGVCFs \ -R $ref \ $(for i in `tail -n +2 metadata。txt | cut -f 1 `; do echo “——variant ${i}。hg38。raw。g。vcf ” ;done) \ -O cohort。g。vcf。gz# 獲取具體基因型,完成變異Callinggatk GenotypeGVCFs \ -R $ref \ ——dbsnp ${dbSNP} \ ——variant cohort。g。vcf。gz \ -O Genotype。cohort。dbSNP。g。vcf
當樣本很多、資料量也大時,CombineGVCF程式很消耗記憶體,並且一旦中斷(檔案不全)就得重新來。其“-L”引數 (如“-L chr1:1-10000”) 也不推薦使用 (否則GenotypeGVCFs步驟可能報錯),但“-L chr1”沒問題。
解決方法:①
限制記憶體:
用“——java-option Xmx20g”等;② 分染色體,用“-L chrX”等。③ 組合使用①和②。
需要了解的是,
GenomicsDB
可以替代:
CombineGVCFs + GenotypeGVCFs,
將多個樣本GVCF處理生成一起的工作空間。兩種方案各有各的優缺點。
根據GATK官網的描述,GenomicsDB更適用於幾百個樣本以上的情形。
合併:不同染色體區域的VCF檔案
cat chr。list。25 # chr1# chr2# chr3# 。。。# chr22# chrX# chrY# chrMgatk MergeVcfs \ $(for i in `cat chr。list。25 | cut -f 1 `; do echo “-I Genotype。cohort。${i}。dbSNP。g。vcf ” ;done) \ -O Genotype。cohort。dbSNP。g。vcf
MergeVcfs與CombineGVCFs不同
。前者用於單純地合併:樣本相同、位點獨立的VCF檔案。如:同一個(或一組)樣本的不同染色體的結果。
不像CombineGVCFs,MergeVcfs不做“gVCF block”的計算。此外MergeVcfs會檢測兩個VCF檔案裡的樣本名是否相互“match”。
如果只檢視
MergeVcfs程式的介紹,根本看不出來它的用法的特點 (例如:對GVCF檔案的合併可能無效),那麼必然容易踩坑:
MergeVcfs (Picard) - Combines multiple variant files into a single variant file。
事實上,
MergeVcfs及其等價的程式 (
GatherVcfs
)
不可用於合併不同樣本的GVCF檔案
。但用來合併不同基因組區域的檔案非常方便。
此場景除了MergeVcfs、GatherVcfs外的其它程式
:
vcf-concat sample1。chr1。vcf sample。chr2。vcf 。。。 > sample1。chrAll。vcfbcftools concat sample1。chr1。vcf sample。chr2。vcf 。。。 -o sample1。chrAll。vcf
其中,透過conda安裝的vcftools,可能不帶vcf-concat等程式。從這一點看,
bcftools更方便
。
1個經驗是:既然有GATK的MergeVcfs可用,那就儘量不用vcftools或bcftools,否則可能踩到
另一個坑
:
不同程式對VCF檔案的
索引格式
的要求不同、VCF的
"FORMAT"列
等也可能改變。
合併:不同樣本的普通VCF檔案
普通VCF檔案
只記錄變異
,即:① 無
0/0
基因型 (測序測到了、但未變異,即“Wild type”) ;② 無“
./
。”基因型 (即“缺失”,測序未測到,即“No call”) 。
對不同樣本的⽂件合併,共有位點會
合併
、
統計
;非共有位點若在某1個樣本中無變異,則會⾃動記為
缺失
(“
./.
”) 。
1個典型的普通VCF檔案 (只查看了第9、10列)
vcftools和bcftools在使用之前一般都需要對VCF檔案:壓縮、索引 (略)。
vcf-merge # 略 (對於連軟體安裝都麻煩的程式)bcftools sample1。vcf sample2。vcf 。。。 -o sample。all。vcf
vcf-merge重新計算了AC、AN等指標的值
合併分型質量 (“QUAL”列) 時,vcf
-merge取了
平均取值,bcftools取了最⼤值, (下圖的)gatk
CombineVariants (不是CombineGVCFs,也不是MergeVcfs/GatherVcfs)
取了最⼩值 (gatk4)
圖片來源:https://wenku。baidu。com/view/a0ecad5602f69e3143323968011ca300a7c3f643。html
gatk CombineVariants (GATK4已無此程式)
# 壓縮、索引單個VCF檔案ls sorted。*。vcf | while read id;do bcftools view $id -Oz -o $id。gz bcftools index $id。gzdone# 合併bcftools merge ——threads 8 -m id -O z sorted。*。vcf。gz \ -o bcftools。merged。103samps。vcf。gz # -m, ——merge (關於多等位基因)Allow multiallelic records for
bcftools merge雖然有“——gvcf”引數,但根據之前的測試,可能不適用於對gVCF檔案的合併。
總 結
總之,① 合併VCF檔案要區分其檔案型別,如:是否為gVCF檔案,是否為基因組的不同區域,其內部的樣本名稱等;② 考慮到整個流程的相容性和流暢性,
建議
當GATK有相應的工具時,優先使用之;③ 其它場景可依次考慮:bcftools、vcftools。