CNVkit

CNVkit 的用法比较简单,可以参考官网的教程:https://cnvkit.readthedocs.io/en/stable/index.html,写得很详细,这里我不再说明。下面是我用到的脚本(在这里我比较关心的是最后拿到的 segment 文件,即 final.seg,该文件可以用直接载入到 IGV 进行可视化,当然也可以用 cnvkit.py export 生成这样的 segments 文件,两者基本一样,然后和上一节 GATK 的结果进行比较)

  1. ## cnvkit.sh
  2. GENOME=~/wes_cancer/data/Homo_sapiens_assembly38.fasta
  3. bed=~/wes_cancer/data/hg38.exon.bed
  4. cnvkit.py batch ./5.gatk/*[ABC]*bqsr.bam ./5.gatk/*techrep_2_bqsr.bam \
  5. --normal ./5.gatk/*germline_bqsr.bam \
  6. --targets ${bed} \
  7. --fasta $GENOME \
  8. --drop-low-coverage --scatter --diagram --method amplicon \
  9. --output-reference my_reference.cnn --output-dir ./8.cnv/cnvkit
  10. cd ./8.cnv/cnvkit
  11. cnvkit.py export seg *bqsr.cns -o gistic.segments
  12. sed 's/_bqsr//' gistic.segments
  13. awk '{print FILENAME"\t"$0}' *bqsr.cns | grep -v chromosome |sed 's/_bqsr.cns//g' |awk '{print $1"\t"$2"\t"$3"\t"$4"\t"$8"\t"$6}' >final.seg

下面两张图是 CNVkit 结果和上一节 GATK CNV 流程的结果,对比两个图,发现这两个软件拿到的结果基本一样,同样的 case4 技术重复的两个样本拷贝数缺失事件碎片化。

12 拷贝数变异分析(非GATK) - 图1

12 拷贝数变异分析(非GATK) - 图2


GISTIC2

GISTIC2 的安装比较复杂,需要安装 MATLAB,具体可以参考曾老师的博客:用 GISTIC 多个 segment 文件来找SCNA 变异 http://www.bio-info-trainee.com/1648.html

  1. cd ~/wes_cancer/project/8.cnv/gistic
  2. ## 下载解压
  3. wget -c ftp://ftp.broadinstitute.org/pub/GISTIC2.0/GISTIC_2_0_23.tar.gz
  4. tar zvxf GISTIC_2_0_23.tar.gz
  5. ## 安装MATLAB
  6. cd MCR_Installer/
  7. unzip MCRInstaller.zip
  8. ./install -mode silent -agreeToLicense yes -destinationFolder ~/wes_cancer/project/8.cnv/gistic/MATLAB_Compiler_Runtime/
  9. ## 安装后的文件结构
  10. ## 添加环境变量
  11. echo "export XAPPLRESDIR=~/wes_cancer/project/8.cnv/gistic/MATLAB_Compiler_Runtime/v83/X11/app-defaults:\$XAPPLRESDIR" >> ~/.bashrc
  12. source ~/.bashrc

安装完成之后,新建一个目录,把上一步 cnvkit 拿到的 gistic.segments 文件拷贝到当前目录

  1. mkdir SRP070662_gistic
  2. cp ~/wes_cancer/project/8.cnv/cnvkit/gistic.segments ./SRP070662_gistic

然后把将脚本 run_gistic_example 做了一定的修改,实际运行 GISTIC 的脚本 my.gistic.sh 如下:

  1. #!/bin/sh
  2. ## run example GISTIC analysis
  3. ## output directory
  4. echo --- creating output directory ---
  5. basedir=`pwd`/SRP070662_gistic
  6. # mkdir -p $basedir
  7. echo --- running GISTIC ---
  8. ## input file definitions
  9. segfile=`pwd`/SRP070662_gistic/gistic.segments
  10. #markersfile=`pwd`/examplefiles/markersfile.txt
  11. refgenefile=`pwd`/refgenefiles/hg38.UCSC.add_miR.160920.refgene.mat
  12. #alf=`pwd`/examplefiles/arraylistfile.txt
  13. #cnvfile=`pwd`/examplefiles/cnvfile.txt
  14. ## call script that sets MCR environment and calls GISTIC executable
  15. ./gistic2 -b $basedir -seg $segfile -refgene $refgenefile -genegistic 1 -smallmem 1 -broad 1 -brlen 0.5 -conf 0.90 -armpeel 1 -savegene 1 -gcm extreme

生成的文件有

  1. all_data_by_genes.txt
  2. all_lesions.conf_90.txt
  3. all_thresholded.by_genes.txt
  4. amp_genes.conf_90.txt
  5. amp_qplot.pdf
  6. amp_qplot.png
  7. broad_data_by_genes.txt
  8. broad_significance_results.txt
  9. broad_values_by_arm.txt
  10. D.cap1.5.mat
  11. del_genes.conf_90.txt
  12. del_qplot.pdf
  13. del_qplot.png
  14. focal_dat.0.5.mat
  15. focal_data_by_genes.txt
  16. freqarms_vs_ngenes.pdf
  17. gistic_inputs.mat
  18. peak_regs.mat
  19. perm_ads.mat
  20. raw_copy_number.pdf
  21. raw_copy_number.png
  22. regions_track.conf_90.bed
  23. sample_cutoffs.txt
  24. sample_seg_counts.txt
  25. scores.0.5.mat
  26. scores.gistic
  27. wide_peak_regs.mat

可视化结果生成的 3 张图,3张图均未展示性染色体的拷贝数变异信息,图 1 垂直方向是基因组,水平方向是样本,如果倒过来,就和前面的 cnvkit 结果基本一致。图 2,3 表示的是拷贝数增加或者缺失的情况,水平方向下面是q值,绿线代表显着性阈值(q 值 = 0.25)。图上面是 G-score,某个区域的 G-score 分数越高,该区域的发生拷贝数变异事件的可能性就越大,偶然性越低。可以在输出文件 amp_genes.conf_90.txtdel_genes.conf_90.txt查看每一个区域所包含的基因。

12 拷贝数变异分析(非GATK) - 图3

在这里,拷贝数缺失事件明显比拷贝数增加事件要多,可能是 case4 技术重复异常带来的影响,我试着删除掉 case4 技术重复的两个样本,对比一下结果(如下)发现,拷贝数增加和缺失事件分布:12 拷贝数变异分析(非GATK) - 图4


facet

facet是一个 R 包,但不在 CRAN 中收录,安装的时候有点麻烦,在 Mac 和 Linux 上安装没问题,在 windows 上安装没成功。 facet 的输入文件是处理后的 vcf 文件,在这里我用的是 GATK 的HaplotypeCaller工具生成的结果并走了gvcf流程拿到的 merge.vcf,最后载入 R 中进行分析, R 语言分析部分的代码如下:

  1. if(F){
  2. install.packages('devtools')
  3. devtools::install_github("mskcc/facets", build_vignettes = TRUE)
  4. devtools::install_github("mskcc/pctGCdata")
  5. }
  6. options( stringsAsFactors = F )
  7. library("facets")
  8. # check if .Random.seed exists
  9. seedexists <- exists(".Random.seed")
  10. # save seed
  11. if(seedexists)
  12. oldSeed <- .Random.seed
  13. # Alway use the same random seed
  14. set.seed(0xfade)
  15. # read the data
  16. if(F){
  17. library(vcfR)
  18. vcf_file='./5.gatk/gvcf/merge.vcf'
  19. ### 直接读取群体gvcf文件即可
  20. vcf <- read.vcfR( vcf_file, verbose = FALSE )
  21. save(vcf,file = 'input_vcf.Rdata')
  22. }
  23. load(file = 'input_vcf.Rdata')
  24. vcf@fix[1:4,1:4]
  25. vcf@gt[1:14,1:4]
  26. colnames(vcf@gt)
  27. library(stringr)
  28. tmp_f <- function(x){
  29. #x=vcf@gt[,2]
  30. gt=str_split(x,':',simplify = T)[,1]
  31. ad=str_split(str_split(x,':',simplify = T)[,2],',',simplify = T)[,2]
  32. dp=str_split(x,':',simplify = T)[,3]
  33. return(data.frame(gt=gt,dp=as.numeric(dp),ad=as.numeric(ad)))
  34. }
  35. colnames(vcf@gt)
  36. tms=colnames(vcf@gt)[!grepl('_germline',colnames(vcf@gt))][-1]
  37. tmp <- lapply(tms, function(tm){
  38. #tm=tms[1]
  39. print(tm)
  40. nm=paste0(strsplit(tm,'_')[[1]][1],'_germline')
  41. print(nm)
  42. if(nm %in% colnames(vcf@gt)){
  43. snpm=cbind(vcf@fix[,1:2],
  44. tmp_f(vcf@gt[,nm]),
  45. tmp_f(vcf@gt[,tm]))
  46. ## only keep tumor or normal have mutations
  47. kp=snpm[,3] %in% c('1/1','0/1') | snpm[,6] %in% c('1/1','0/1')
  48. table(kp)
  49. snpm=snpm[kp,]
  50. ## remove those show ./. positions
  51. kp=snpm[,3] == './.' | snpm[,6]== './.'
  52. print(table(!kp))
  53. snpm=snpm[!kp,c(1,2,4,5,7,8)]
  54. rcmat=snpm
  55. rcmat$POS=as.numeric(rcmat$POS)
  56. dim(rcmat)
  57. rcmat=na.omit(rcmat)
  58. colnames(rcmat)=c("Chromosome", "Position","NOR.DP","NOR.RD","TUM.DP","TUM.RD")
  59. rcmat[,1]=gsub('chr','',rcmat$Chrom)
  60. ## fit segmentation tree
  61. xx = preProcSample(rcmat)
  62. ## estimate allele specific copy numbers
  63. oo=procSample(xx,cval=150)
  64. oo$dipLogR
  65. ## EM fit version 1
  66. fit=emcncf(oo)
  67. tmp=fit$cncf
  68. write.table(tmp,file = paste0('facets_cnv_',tm,'.seg.txt'),
  69. row.names = F,col.names = F,quote = F)
  70. head(fit$cncf)
  71. fit$purity
  72. fit$ploidy
  73. png(paste0('facets_cnv_',tm,'.png'),res=150,width = 880,height = 880)
  74. plotSample(x=oo,emfit=fit, sname=tm)
  75. dev.off()
  76. if(F){
  77. fit2=emcncf2(oo)
  78. head(fit2$cncf)
  79. fit2$purity
  80. fit2$ploidy
  81. png(paste0('facets_cnv2_',tm,'.png'),res=150,width = 880,height = 880)
  82. plotSample(x=oo,emfit=fit2, sname=tm)
  83. dev.off()
  84. }
  85. return(c( fit$dipLogR,fit$ploidy,fit$purity))
  86. }
  87. })
  88. tmp <- do.call(rbind,tmp)
  89. rownames(tmp)=tms
  90. colnames(tmp)=c('dipLogR', 'ploidy', 'purity')
  91. write.csv(tmp,'ploidy_and_purity.csv')

我们就拿case1_biorep_A_techrep样本的结果进行展示,主要关心图的第三个 panel ,绘制每个 segment 的主要(黑色 =2 )和次要(红色 = 1)拷贝数。底部栏显示相关的细胞分数(cf)。深蓝色表示高 cf。浅蓝色表示低 cf。米色表示正常。这个结果就和上面略有不同了,比如这个样本的 19 号染色体在第三个 panel(第一、二个panel 好像还是正常的)中显示是拷贝数增加,但在上面几个软件的结果中 19 号染色体的拷贝数均没有太大的变化。毕竟 facet 的输入数据是 germline mutations,和前面即个软件都不太一样。

12 拷贝数变异分析(非GATK) - 图5

可能是软件基于不同类型的输入数据,算法不一样,facet 对 case4 技术重复的结果就比较正常了

12 拷贝数变异分析(非GATK) - 图6