實操 | 合併VCF檔案的幾種方法及注意事項

背 景

在基因組分析領域的

很多

不同場景中,需要合併VCF檔案。

VCF檔案

。簡單來說,就是記錄樣本基因型的檔案。但多數VCF檔案不只記錄了基因型,也包含有關該基因型的來源的細節。

其它檔案

。VCF檔案的上游是

BAM檔案

,主要記錄Reads與參考基因組的比對資訊;更上游的,就是

FASTQ測序資料

,以及物種的

參考基因組

不同型別的VCF檔案

。VCF檔案有單樣本的、多樣本的;也有普通VCF檔案 (只記錄變異,未測到的、野生型的都不記錄),及GVCF檔案 (野生型的、變異的都記錄,未測到的不記錄)。

實操 | 合併VCF檔案的幾種方法及注意事項

一個典型的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個樣本中無變異,則會⾃動記為

缺失

(“

./.

”) 。

實操 | 合併VCF檔案的幾種方法及注意事項

1個典型的普通VCF檔案 (只查看了第9、10列)

vcftools和bcftools在使用之前一般都需要對VCF檔案:壓縮、索引 (略)。

vcf-merge # 略 (對於連軟體安裝都麻煩的程式)bcftools sample1。vcf sample2。vcf 。。。 -o sample。all。vcf

實操 | 合併VCF檔案的幾種方法及注意事項

vcf-merge重新計算了AC、AN等指標的值

合併分型質量 (“QUAL”列) 時,vcf

-merge取了

平均取值,bcftools取了最⼤值, (下圖的)gatk

CombineVariants (不是CombineGVCFs,也不是MergeVcfs/GatherVcfs)

取了最⼩值 (gatk4)

圖片來源:https://wenku。baidu。com/view/a0ecad5602f69e3143323968011ca300a7c3f643。html

實操 | 合併VCF檔案的幾種方法及注意事項

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 , see man page for details [both] # -O, ——output-type ‘b’ compressed BCF; ‘u’ uncompressed BCF; ‘z’ compressed VCF; ‘v’ uncompressed VCF [v]  # gVCF引數(可能不適用於gVCF檔案): # -g, ——gvcf <-|ref。fa> merge gVCF blocks, INFO/END tag is expected。 Implies -i QS:sum,MinDP:min,I16:sum,IDV:max,IMF:max# 測試某個位點 # zcat bcftools。merged。103samps。vcf。gz | grep ‘1        12626   ’ # 有返回結果。但無DP等資訊# 索引合併後的檔案bcftools index bcftools。merged。103samps。vcf。gz &

bcftools merge雖然有“——gvcf”引數,但根據之前的測試,可能不適用於對gVCF檔案的合併。

總 結

總之,① 合併VCF檔案要區分其檔案型別,如:是否為gVCF檔案,是否為基因組的不同區域,其內部的樣本名稱等;② 考慮到整個流程的相容性和流暢性,

建議

當GATK有相應的工具時,優先使用之;③ 其它場景可依次考慮:bcftools、vcftools。