XHMM检测CNV

XHMM是一个用PCA降噪+HMM方法来检测全外显子CNV的软件。软件文档可在这里查看。

安装XHMM

XHMM安装依赖GCC 4.4以上,以及pthreadlapack

wget https://bitbucket.org/statgen/xhmm/get/master.zip
unzip master.zip
cd statgen-xhmm-*
make

安装比较麻烦,可以到docker hub找一个现成的镜像。

下载测试数据

XHMM文档中从1000g弄了30个样本,每个样本取300个外显子作为测试数据

wget https://statgen.bitbucket.io/xhmm/EXAMPLE_BAMS.zip
unzip EXAMPLE_BAMS.zip

这些数据是使用hs37d5参考基因组进行比对,经过了排序、去重以及GATK BQSR的标准bam文件准备流程。

XHMM标准流程

获得覆盖深度

使用GATK3获得覆盖深度。由于GATK4的DepthOfCoverage与GATK3有较大差异,如–countType不能选择COUNT_FRAGMENTS等,这里还是使用GATK3进行。注意XHMM提供了一个interval_list,但我们日常使用还是习惯用bed格式多一点,而GATK的-L参数其实是能兼容bed的。

java -jar GenomeAnalysisTK.jar \
	-T DepthOfCoverage -I group1.bam.list -L bed/EXOME.bed \
	-R /b37/human_g1k_v37_decoy.fasta \
	-dt BY_SAMPLE -dcov 5000 -l INFO --omitDepthOutputAtEachBase --omitLocusTable \
	--minBaseQuality 0 --minMappingQuality 20 --start 1 --stop 5000 --nBins 200 \
	--includeRefNSites \
	--countType COUNT_FRAGMENTS \
	-o depth/group1

XHMM的教程中把bam分为了3组,来表明如果需要合并不同批次的数据应该怎么做。重复上面的流程获得3个批次的统计结果。也可以将list合并,一次获取结果。

合并结果

将GATK统计结果进行合并

xhmm --mergeGATKdepths \
	-o xhmm/data.rd.txt \
	--GATKdepths depth/group1.sample_interval_summary \
	--GATKdepths depth/group2.sample_interval_summary \
	--GATKdepths depth/group3.sample_interval_summary

获得target区域GC比例

使用GATK获得target区的GC比例,方便后面进行GC校正

java -jar GenomeAnalysisTK.jar \
	-T GCContentByInterval -L bed/EXOME.bed \
	-R /b37/human_g1k_v37_decoy.fasta \
	-o xhmm/data.locus.gc.txt
cat data.locus.gc.txt | awk '{if ($2 < 0.1 || $2 > 0.9) print $1}' > xhmm/extreme.gc.target.txt

计算重复碱基并过滤,可选

使用script文件夹中的interval_list_to_pseq_reg进行。这一步,在部分shell中会报错,可以直接看这个脚本的内容查看其修改的方式自己新建脚本进行修改。

interval_list_to_pseq_reg bed/EXOME.interval_list > bed/EXOME.target.reg

这里使用pseq进行,获取重复碱基多的区域并排除

pseq . loc-load \
	--locdb bed/EXOME.targets.LOCDB \
	--file bed/EXOME.target.reg \
	--group targets \
	--out bed/EXOME.targets.LOCDB.loc-load \
	--noweb

pseq . loc-stats \
	--locdb bed/EXOME.targets.LOCDB \
	--group targets --seqdb seqdb.hg19 | \
	awk '{if (NR > 1) print $_}' | \
	sort -k1 -g | awk '{print $10}' | \
	paste bed/EXOME.interval_list - | \
	awk '{print $1"\t"$2}' \
	> bed/DATA.locus_complexity.txt

cat bed/DATA.locus_complexity.txt | awk '{if ($2 > 0.25) print $1}' > bed/low_complexity_targets.txt

其中的seqdb.hg19可以在plinkseq官网下载,但是我发现官网下载都崩了,也可以自己构建

pseq . seq-load --seqdb seqdb.hg19 \
	--file hg19.fa.gz \
	--format build=hg19 repeat-mode=lower \
	--name hg19 --description UCSC-hg19

过滤

使用xhmm进行过滤

xhmm --matrix \
	-r xhmm/data.rd.txt --centerData --centerType target \
	-o xhmm/data.filtered_centered.RD.txt \
	--outputExcludedTargets xhmm/data.filtered_centered.RD.txt.filtered_targets.txt \
	--outputExcludedSamples xhmm/data.filtered_centered.RD.txt.filtered_samples.txt \
	--excludeTargets xhmm/extreme.gc.target.txt --excludeTargets bed/low_complexity_targets.txt \
	--minTargetSize 10 --maxTargetSize 10000 \
	--minMeanTargetRD 10 --maxMeanTargetRD 500 \
	--minMeanSampleRD 25 --maxMeanSampleRD 200 \
	--maxSdSampleRD 150

PCA聚类分析

使用xhmm进行PCA聚类

xhmm --PCA -r xhmm/data.filtered_centered.RD.txt --PCAfiles xhmm/data.RD.PCA

降噪

使用聚类结果进行降噪

xhmm --normalize -r xhmm/data.filtered_centered.RD.txt --PCAfiles xhmm/data.RD.PCA \
	--normalizeOutput xhmm/data.PCA_normalized.txt \
	--PCnormalizeMethod PVE_mean --PVE_mean_factor 0.7

Z检验

使用xhmm进行Z检验

xhmm --matrix \
	-r xhmm/data.PCA_normalized.txt --centerData --centerType sample --zScoreData \
	-o xhmm/data.PCA_normalized.filtered.sample_zscores.RD.txt \
	--outputExcludedTargets xhmm/data.PCA_normalized.filtered.sample_zscores.RD.txt.filtered_targets.txt \
	--outputExcludedSamples xhmm/data.PCA_normalized.filtered.sample_zscores.RD.txt.filtered_samples.txt \
	--maxSdTargetRD 30

原始深度过滤

使用xhmm进行过滤

xhmm --matrix \
	-r xhmm/data.rd.txt \
	--excludeTargets xhmm/data.filtered_centered.RD.txt.filtered_targets.txt \
	--excludeTargets xhmm/data.PCA_normalized.filtered.sample_zscores.RD.txt.filtered_targets.txt \
	--excludeSamples xhmm/data.filtered_centered.RD.txt.filtered_samples.txt \
	--excludeSamples xhmm/data.PCA_normalized.filtered.sample_zscores.RD.txt.filtered_samples.txt \
	-o xhmm/data.same_filtered.RD.txt

CNV检测

使用xhmm检测CNV检测,做到这一步其实在xhmm/data.xcnv文件里已经能看到结果了。

xhmm --discover \
	-p params.txt \
	-r xhmm/data.PCA_normalized.filtered.sample_zscores.RD.txt -R xhmm/data.same_filtered.RD.txt \
	-c xhmm/data.xcnv -a xhmm/data.aux_xcnv -s xhmm/data

我获得的结果某些值与XHMM标准答案有点差异,不过总体结果是相同的。

SAMPLE	CNV	INTERVAL	KB
HG00121	DEL	22:18898403-18913235	14.83
HG00113	DUP	22:17071769-17073440	1.67

结果Vcf导出

将结果转为VCF导出,通过看每个Sample的最后一个INFO是Y或N可以看出是否检出。

xhmm --genotype \
	-p params.txt \
	-r xhmm/data.PCA_normalized.filtered.sample_zscores.RD.txt -R xhmm/data.same_filtered.RD.txt \
	-g xhmm/data.xcnv -F /b37/human_g1k_v37_decoy.fasta \
	-v xhmm/data.xhmm.vcf

docker

使用docker

docker pull pzweuj/xhmm:1.0

写了一个脚本来运行

xhmmPipe.sh -i <bam dir> -o <output dir> -s <seqdb> -b <bed file> -r <ref.fa>