「GATK 4」如何提高HaplotyperCaller的效率

GATK的HaplotypeCaller 應該是目前最常用的變異檢測軟件,尤其是在人類基因組上。不過HaplotypeCaller的速度相對于其他軟件,例如bcftools, freeBayes 也是最慢的,當然這還是可以搶救一下的,只不過需要我們額外寫一些代碼,利用--intervals參數進行手動并行。

如下代碼僅考慮單個樣本,多個樣本的gvcf文件類似

策略1: 按照染色體進行運算

最簡單的方法也是最容易想到的方法,直接利把原來的任務按照染色體拆分。擬南芥是5+2, 5條核基因組染色體和2條細胞器基因組染色體,那么就可以一次性投遞7個任務。

# $SM指的是你樣本名(不包括名字后綴)
# $REF指的是你的參考基因組名字
chroms=($(grep '>' $REF |sed 's/>//' | tr '\n' ' '))
for chr in ${chroms[@]}
do
        if [ ! -f ${SM}.${chr}.vcf.gz ]; then
        gatk HaplotypeCaller -R $REF -I ${SM}_mkdup.bam --genotyping-mode DISCOVERY \
                --intervals ${chr} -stand-call-conf 30 --sample-ploidy 2 \
                -O ${SM}.${chr}.vcf.gz &
        fi
done && wait

策略2: 針對染色體的NNNN區(qū)進一步拆分

既然我們可以分成不同的染色體進行并行運算,那能不能進一步把染色體繼續(xù)拆分呢?這個思路也是可行,畢竟真核生物的基因組大部分都不完美,也就是基因組存在著一些gap沒有被填上。gap區(qū)域肯定是沒有read能夠回貼上的,那么就可以根據這些gap進一步的細分。

GAP區(qū)域

這里用到了seqkit locate 定位染色體上NNN, 然后用bedtools complement 得到后續(xù)輸入的bed文件。

seqkit locate -j 20 -Pp '"N{10,}"' /data/reference/genome/TAIR10/Athaliana.fa | tail -n+2 | awk '{print $1"\t"$5"\t"$6}' > ath_n_pos.bed
bioawk -c fastx '{print $name"\t"length($seq)}' /data/reference/genome/TAIR10/Athaliana.fa > tair10.txt
bedtools complement -i ath_n_pos.bed -g tair10.txt  > tair10_interval.bed

之后就可以根據bed文件構建出interval

BED="tair10_interval.bed"
chroms=($(awk '{print $1":"$2+1"-"$3}' $BED | tr '\n' ' '))
for chr in ${chroms[@]}
do
        if [ ! -f ${SM}.${chr}.vcf.gz ]; then
        gatk HaplotypeCaller -R $REF -I ${SM}_mkdup.bam --genotyping-mode DISCOVERY \
                --intervals ${chr} -stand-call-conf 30 --sample-ploidy 2 \
                -O ${SM}.${chr}.vcf.gz &
        fi
done && wait

策略3: 根據BAM文件特點進行拆分

如果你還想追求速度,那么還可以對BAM文件進行分析,找出在比對后結果中哪些區(qū)域是沒有read覆蓋,那么將這些區(qū)域進行拆分。

低覆蓋區(qū)間

我們可以用bedtools genomecov 統(tǒng)計基因組上低覆蓋度區(qū)域, 選擇其中寬度大于100 bp 或1000 bp(按照需求進行確定閾值)的區(qū)間作為分割點

bedtools genomecov -bga -ibam ${SM}.bam -g tair10.txt | awk '$4 < 3' | bedtools merge -i - | awk '{if ($3-$2 > 1000) print $0}' > result.bed 
bedtools complement -i  result.bed -g tair10.txt  > tair10_interval.bed

分分鐘給你搞出上千個區(qū)間,你就可以瘋狂的投遞任務了。

也可以簡單粗暴的按照固定大小對染色體進行劃分。

最后運行結束之后,還需要對文件進行合并,用到的是MergeVcfs。

## merge chr.vcf
merge_vcfs=""
for chr in ${chroms[@]}; do
        merge_vcfs=${merge_vcfs}" -I ${SM}.${chr}.vcf.gz"
done && gatk MergeVcfs ${merge_vcfs} -O ${SM}.HC.vcf.gz && echo "Vcfs haved been successfully merged"
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容