软件安装:
conda create -n bwa bwa conda activate bwa conda install samtools conda install bcftools conda create -n gatk4 gatk4==4.4.0.0
使用bwa建立参考基因组的index,并进行比对
bwa index output/index/ref.fasta
bwa mem -t 10 -R '@RG\tID:foo_lane\tPL:illumina\tLB:library\tSM:mother' output/index/ref.fasta \ 2-germline/fastq/mother_1.fastq \ 2-germline/fastq/mother_2.fastq > output/mapping/mother.sam
samtools view -bS -@ 10 output/mapping/mother.sam -o output/mapping/mother.bam samtools sort output/mapping/mother.bam -@ 10 -o output/mapping/mother.sorted.bam
比对得到bam文件后,使用gatk的子命令MarkDuplicates标记PCR重复,并使用samtools排序、建立索引。
MarkDuplicates
samtools
gatk MarkDuplicates -I output/mapping/mother.sorted.bam \ -O output/mapping/mother.sorted.markdup.bam \ -M output/mapping/mother.markdup.metrics.txt samtools index output/mapping/mother.sorted.markdup.bam
samtools faidx output/index/ref.fasta tabix -p vcf vcf-resource/Homo_sapiens_assembly38.known_indels.vcf.gz gatk CreateSequenceDictionary -R output/index/ref.fasta -O output/index/ref.dict
vcf文件需要建立索引
gatk BaseRecalibrator \ -I F11667.new.sort.markdup.bam \ -R out/ref/hg38.fa \ --known-sites Homo_sapiens_assembly38.known_indels.vcf.gz \ -O F11667.recal_data.table gatk ApplyBQSR \ -R out/ref/hg38.fa \ -I F11667.new.sort.markdup.bam \ --bqsr-recal-file F11667.recal_data.table \ -O F11667.new.sort.markdup.BQSR.bam
这里包含三个步骤
注意,因为BQSR实际上是为了(尽可能)校正测序过程中的系统性错误,因此,在执行的时候是按照不同的测序lane或者测序文库来进行的,这个时候@RG信息(BWA比对时所设置的)就显得很重要了,算法就是通过@RG中的ID来识别各个独立的测序过程,这也是我开始强调其重要性的原因。
HaplotypeCaller和那些直接应用贝叶斯推断的算法有所不同,它会先推断群体的单倍体组合情况,计算各个组合的几率,然后根据这些信息再反推每个样本的基因型组合。因此它不但特别适合应用到群体的变异检测中,而且还能够依据群体的信息更好地计算每个个体的变异数据和它们的基因型组合。
一般来说,在实际的WGS流程中对HaplotypeCaller的应用有两种做法,差别只在于要不要在中间生成一个gVCF:
我们首先以第一种直接进行HaplotypeCaller做法为例:调用gatk子命令CreateSequenceDictonary为参考序列生成一个.dict文件
CreateSequenceDictonary
.dict
OK,现在我们就可以进行变异检测了,同样使用GATK 4.0的HaplotypeCaller模块来完成。由于我们只有一个样本,要完成这个工作其实很简单,直接输入比对文件和参考序列就行了。
gatk HaplotypeCaller \ -R out/ref/hg38.fa \ -I F11667.new.sort.markdup.BQSR.bam \ -O F11667.new.sort.markdup.BQSR.vcf \ -D /path/to/gatk/bundle/dbsnp_138.b37.vcf \ -A QualByDepth \ -A RMSMappingQuality \ -A MappingQualityRankSumTest \ -A ReadPosRankSumTest \ -A FisherStrand \ -A StrandOddsRatio \ -A Coverage
-D
-A
另外,由于我们的例子只有一个样本因此只输入一个BAM文件就可以了,如果有多个样本那么可以继续用-I参数输入:
java -jar GenomeAnalysisTK.jar \ -T HaplotypeCaller \ -R reference.fasta \ -I sample1.bam [-I sample2.bam ...] \ ...
以上的命令是直接对全基因组做变异检测,这个过程会消耗很长的时间,通常需要几十个小时甚至几天。
然而,基因组上各个不同的染色体之间其实是可以理解为相互独立的(结构性变异除外),也就是说,为了提高效率我们可以按照染色体(或者染色体不同区域)一条条来独立执行这个步骤,最后再把结果合并起来就好了,这样的话就能够节省很多的时间。下面我给出一个按照染色体区分的例子:
gatk HaplotypeCaller \ -R out/ref/hg38.fa \ -I F11667.new.sort.markdup.BQSR.bam \ -O F11667.new.sort.markdup.BQSR.vcf \ -L 1 \ -D /path/to/gatk/bundle/dbsnp_138.b37.vcf \ -A QualByDepth \ -A RMSMappingQuality \ -A MappingQualityRankSumTest \ -A ReadPosRankSumTest \ -A FisherStrand \ -A StrandOddsRatio \ -A Coverage
注意到了吗?其它参数都没任何改变,就只增加了一个 -L 参数,通过这个参数我们可以指定特定的染色体(或者基因组区域-L 20:10,000,000-10,200,000)!我们这里指定的是 1 号染色体,有些地方会写成chr1,具体看human.fasta中如何命名,与其保持一致即可。其他染色体的做法也是如此,就不再举例了。最后合并:
-L 20:10,000,000-10,200,000
gatk CombineVariants \ -R /path/to/human.fasta \ --genotypemergeoption UNSORTED \ --variant sample_name.HC.1.vcf \ --variant sample_name.HC.2.vcf \ ... --variant sample_name.HC.MT.vcf \ -o sample_name.HC.vcf