适用于GATK 4.2 版本以上,流程参考于这篇文章。
软件安装
GATK建议使用conda部署环境,其中gatkcondaenv.yml文件可以在下载的gatk.zip中找到。
conda env create -f gatkcondaenv.yml
conda activate gatk
或者使用GATK官方docker
docker pull broadinstitute/gatk:4.2.2.0
测试了一下,普通环境下主要是缺少gcnvkernel这个模块。
下载测试数据
测试数据照旧使用xhmm的数据。这些数据是使用hs37d5参考基因组进行比对,经过了排序、去重以及GATK BQSR的标准bam文件准备流程。
wget https://statgen.bitbucket.io/xhmm/EXAMPLE_BAMS.zip
unzip EXAMPLE_BAMS.zip
运行
GATK文章中分为批次模式和单样本模式。其中单样本模式需要先使用批次模式建立model。这里使用批次模式进行。
需要输入参考基因组、bed文件、输出文件夹、bam文件存放文件夹(仅包含一批次的bam及bai)、ploidy文件。
其中ploidy文件格式参考
CONTIG_NAME | PLOIDY_PRIOR_0 | PLOIDY_PRIOR_1 | PLOIDY_PRIOR_2 | PLOIDY_PRIOR_3 |
---|---|---|---|---|
1 | 0.01 | 0.01 | 0.97 | 0.01 |
2 | 0.01 | 0.01 | 0.97 | 0.01 |
X | 0.01 | 0.49 | 0.49 | 0.01 |
Y | 0.50 | 0.50 | 0.00 | 0.00 |
运行参数
reference=$1
bed=$2
output=$3
bamDir=$4
ploidy=$5
准备interval list
使用PreprocessIntervals准备intervallist
gatk PreprocessIntervals \
-R $reference \
-L $bed \
--bin-length 0 \
--padding 0 \
-imr OVERLAPPING_ONLY \
-O $output/target.prep.interval_list
注释GC,可选
使用AnnotateIntervals获得GC比例
gatk AnnotateIntervals \
-L $bed \
-R $reference \
-imr OVERLAPPING_ONLY \
-O $output/target.annotated.tsv
获得counts结果
使用循环,CollectReadCounts获得每个bam的counts
for i in $bamDir/*.bam;
do
bamName=$(basename "$i" .bam);
echo $bamName;
# collect reads per bin
gatk CollectReadCounts \
-L $output/target.prep.interval_list \
-R $reference \
-imr OVERLAPPING_ONLY \
-I $i \
--format TSV \
-O $output/counts/$bamName.tsv;
done
获得query
获取所有counts结果,形成query供后续使用
ls $output/counts/*.tsv | while read line;
do
echo -n "-I $line " >> $output/tmp;
done
sampleQuery=$(cat $output/tmp)
过滤interval,可选
可选操作,使用FilterIntervals与GC比例结果过滤interval,但是这步我运行报错了,因此没有选。
gatk FilterIntervals \
-L $output/target.prep.interval_list \
--annotated-intervals $output/target.annotated.tsv \
$sampleQuery \
-imr OVERLAPPING_ONLY \
-O $output/cohort.gc.filtered.interval_list
获取ploidy
使用DetermineGermlineContigPloidy获取ploidy,如果上面运行成功,这一步的interval_list可用上一步的结果。
gatk DetermineGermlineContigPloidy \
-L $output/target.prep.interval_list \
--interval-merging-rule OVERLAPPING_ONLY \
$sampleQuery \
--contig-ploidy-priors $ploidy \
--output $output/ploidy \
--output-prefix ploidy \
--verbosity DEBUG
使用批次模式获得结果
获得批次的CNV分析结果
gatk GermlineCNVCaller \
--run-mode COHORT \
-L $output/target.prep.interval_list \
$sampleQuery \
--contig-ploidy-calls $output/ploidy/ploidy-calls \
--interval-merging-rule OVERLAPPING_ONLY \
--output $output/cohort \
--output-prefix cohort \
--verbosity DEBUG
结果导出
使用PostprocessGermlineCNVCalls导出结果。GATK这个流程的问题在于结果居然是凭index而不是样本名称来导出的,需要确认样本的index才能导出对应样本。这里我直接重命名了。
echo -e "#SM\tSAMPLEID" > $output/sample.list
for ((i=0; i<$((`ls $bamDir | wc -l` / 2)); i++));
do
echo "sample_${i}";
gatk PostprocessGermlineCNVCalls \
--model-shard-path $output/cohort/cohort-model \
--calls-shard-path $output/cohort/cohort-calls \
--sample-index $i \
--contig-ploidy-calls $output/ploidy/ploidy-calls \
--output-genotyped-intervals $output/output/sample_${i}_cohort.vcf.gz \
--output-genotyped-segments $output/output/sample_${i}_segment.cohort.vcf.gz \
--output-denoised-copy-ratios $output/output/sample_${i}_ratio.txt;
# rename / name from bam SM tag
sampleName=`zcat $output/output/sample_${i}_cohort.vcf.gz | grep "#CHROM" | cut -f 10`;
echo -e $sampleName"\tSample_"$i >> $output/sample.list;
mv $output/output/sample_${i}_cohort.vcf.gz $output/output/${sampleName}_cohort.vcf.gz;
mv $output/output/sample_${i}_cohort.vcf.gz.tbi $output/output/${sampleName}_cohort.vcf.gz.tbi;
mv $output/output/sample_${i}_segment.cohort.vcf.gz $output/output/${sampleName}_segment.cohort.vcf.gz;
mv $output/output/sample_${i}_segment.cohort.vcf.gz.tbi $output/output/${sampleName}_segment.cohort.vcf.gz.tbi;
mv $output/output/sample_${i}_ratio.txt $output/output/${sampleName}_ratio.txt;
done
最终结果可查看${sampleName}_segment.cohort.vcf.gz。总的来说,GATK流程比exomeDepth以及XHMM都要慢,而且CPU占用高,另外获得结果更多(考虑exomeDepth及XHMM结果一致,GATK的假阳性结果可能多得多)。