Lecture 3

View the file with less

Create a new directory and move the vcf file and its index to the new directory using mv

Set up variables

REF=/home/hgen_share/bwa
VCF=/home/hgen_share/vcf/b37
PICARD_JAR=/home/hgen_share/utils/picard.jar
GATK_JAR=/home/hgen_share/utils/GenomeAnalysisTK-3.8.1.jar
export PATH="/home/hgen_share/utils/gatk-4.1.9.0:$PATH"
module load StdEnv/2020 samtools/1.16
module load nixpkgs/16.09 java/1.8.0_192

Replace the hashtag (#) with the recommended cut-offs found here

gatk --java-options "-Xmx4G" \
    VariantFiltration \
    -V HG002.g.vcf \
    -filter "QD < #" --filter-name "QD" \
    -filter "FS > #" --filter-name "FS" \
    -filter "SOR > #" --filter-name "SOR" \
    -filter "MQ < #" --filter-name "MQ" \
    -filter "MQRankSum < #" --filter-name "MQRankSum" \
    -filter "ReadPosRankSum < #" --filter-name "ReadPosRankSum" \
    -O HG002.filt.g.vcf 2> >(grep -v undefined)

How many variants appear ok?

grep -v '^#' HG002.filt.g.vcf | cut -f7 | grep 'PASS' | wc -l

How many total variants are called? Hint: use grep


Set up variables for DeepVariant

module load StdEnv/2020 apptainer/1.1.3
mkdir -p "${PWD}/data"
mkdir -p "${PWD}/output"
INPUT_DIR="${PWD}/data"
OUTPUT_DIR="${PWD}/output"
TMPDIR=.
cp /home/hgen_share/lec3/* ${INPUT_DIR}

Run DeepVariant on the same sample from last week. Note: this may take a few minutes

singularity run -B $PWD,/usr/lib/locale/ \
   /home/hgen_share/deepvariant/deepvariant_1.4.0.sif \
   /opt/deepvariant/bin/run_deepvariant \
   --model_type=WGS \
   --ref="${INPUT_DIR}"/b37.chr20.fa \
   --reads="${INPUT_DIR}"/HG002.sorted.bam \
   --regions "20:43200000-43300000" \
   --output_vcf="${OUTPUT_DIR}"/HG002.dv.vcf.gz \
   --output_gvcf="${OUTPUT_DIR}"/HG002.dv.g.vcf.gz \
   --num_shards=1

Unzip the g.vcf found in the output directory using gunzip then filter it using similar parameters as above. Compare the number of variants that pass. Note: you may need to set-up your variables for GATK again

Copy whole genome variant calls

cp /home/hgen_share/lec3_part2 ./

Since SNPs and indels need to be trained separately, start with SNPs

gatk --java-options "-Xmx4G" \
  VariantRecalibrator \
   -R ${REF}/b37.fa \
   -V raw.vcf \
   --resource:hapmap,known=false,training=true,truth=true,prior=15.0 $VCF/b37/hapmap.vcf \
   --resource:omni,known=false,training=true,truth=false,prior=12.0 $VCF/b37/omni.vcf \
   --resource:1000G,known=false,training=true,truth=false,prior=10.0 $VCF/b37/1KG.snps.vcf \
   --resource:dbsnp,known=true,training=false,truth=false,prior=2.0 $VCF/b37/dbSNP.vcf \
   -an DP -an QD -an FS -an SOR -an MQ -an MQRankSum -an ReadPosRankSum \
   -mode SNP \
   -O recal_SNP.recal \
   --tranches-file recal_SNP.tranches \
   --rscript-file recal_SNP.plots.R

Apply VQSR to SNPs

gatk --java-options "-Xmx4G" \
  ApplyVQSR \
  -R ${REF}/b37.fa \
  -V raw.vcf \
  -O raw.snp.vcf \
  --truth-sensitivity-filter-level 99.5 \
  --tranches-file recal_SNP.tranches \
  --recal-file recal_SNP.recal \
  -mode SNP

Now repeat for indels

gatk --java-options "-Xmx4G" \
  VariantRecalibrator \
  -R ${REF}/b37.fa \
  -V raw.snp.vcf \
  --resource:mills,known=false,training=true,truth=true,prior=12.0 $VCF/b37/Mills.indels.vcf \
  --resource:dbsnp,known=true,training=false,truth=false,prior=2.0 $VCF/b37/dbSNP.vcf \
  --max-gaussians 4 \
  -an QD -an DP -an FS -an SOR -an MQRankSum -an ReadPosRankSum \
  -mode INDEL \
  -O recal_INDEL.recal \
  --tranches-file recal_INDEL.tranches \
  --rscript-file recal_INDEL.plots.R
 
gatk --java-options "-Xmx4G" \
  ApplyVQSR \
  -R ${REF}/b37.fa \
  -V raw.snp.vcf \
  -O recal.vcf \
  --truth-sensitivity-filter-level 99.0 \
  --tranches-file recal_INDEL.tranches \
  --recal-file recal_INDEL.recal \
  -mode INDEL

How many variants in the same region passed?

gatk SelectVariants \
  -R ${REF}/b37.fa \
  -V recal.vcf \
  -O recal.sub.vcf \
  -L 20:43200000-43300000
 
grep -v '^#' recal.sub.vcf | cut -f7 | grep 'PASS' | wc -l

Set up bcftoolsto filter PASS variants

module load StdEnv/2020 gcc/9.3.0 bcftools/1.16

Run bcftools. The input file can be the VCF file produced from either variant caller

bcftools view -f 'PASS,.' -O v -o output_filename input_file 

VariantsToTable, by default, only extracts variants that passed filtering. Use the --show-filtered parameter to show all variants.

REF=/home/hgen_share/bwa
gatk VariantsToTable \
    -R $REF/b37.fa \
    -V input_vcf \
    -F CHROM -F POS -F FILTER -F TYPE -GF AD -GF DP \
    --show-filtered \
    -O output_filename.tsv

You may need to reload modulesfor GATK again

Copy whole genome variant calls

cp /home/hgen_share/lec3_part2/* ./

Use SnpEff with mostly default parameters

UTILS=/home/partage/utils
SNPEFF_JAR=/home/hgen_share/utils/snpEff/snpEff.jar
java -Xmx4G -jar $SNPEFF_JAR \
  -c /home/hgen_share/utils/snpEff/snpEff.config \
  -i vcf -o vcf -v hg19 \
  ex.vcf > ex.snpeff.vcf

Download .html results file to your local computer using scp

Add the directory containing gemini

export PATH=/home/hgen_share/utils/gemini/anaconda/bin:$PATH

Generate annotated database with gemini

module load mugqic/gemini/0.20.1
gemini load --cores 4 --tempdir $PWD -t snpEff -v ex.snpeff.vcf ex.snpeff.db

Dump database to plain-text csv using sqlite

db=ex.snpeff.db
t=($(sqlite3 $db ".tables"))
for i in "${t[@]}"; do
	sqlite3 $db<<- EXIT_HERE
	.mode csv
	.headers on
	.output $i.csv
	SELECT * FROM $i;
	.exit
	EXIT_HERE
  echo "$i.csv generated"
done

Download csv file


For more details regarding columns: GEMINI database