Structural Variant detection
Olivier QUENEZ - INSERM
Guillaume Robert-Siegwald - Inovarion
Mathieu Charles - INRAE
École de bioinformatique AVIESAN-IFB-INSERM 2021
Workflow
2
Fastq Quality Control
-- FastQC --
Mapping
-- Bowtie2/Bwa --
Reads (Fastq)
Reference genome (Fasta)
Processing Post Alignement
Variant Calling
Filtrage & Annotation
Variants Structuraux
Copy Number
3
→ Réarrangements déséquilibrés (variation du nombre de copie - CNV)
Définition
→ Réarrangements équilibrés
4
5
Principe de détection des SVs
Short reads (Illumina) : selon l’outil et la qualité des données
→ faible recall : 10 à 70% des SVs détectés
→ faible précision : jusqu’à 90% de Faux Positifs
→ Difficulté à caractériser des SVs complexes (alignement imprécis dans les régions répétées et faible résolution)
/!\ Un calling consensus avec plusieurs outils de détection peut être utile avec des données short reads /!\
6
Short reads ou long reads?
Long reads (PacBio/MinION) :
→ Meilleure caractérisation des altérations des régions répétées
→ Une faible profondeur de couverture suffit (15-30x)
Sedlazeck, F. J. et al.Nat. Methods 15, 461–468 (2018).
Critères de choix :
7
Quel outil choisir ?
Détection de SV pour données short reads
8
Peiyong Guan, , Methods 102 (2016)
9
Outils en long reads
Data : souche de Zymoseptoria tritici séquencées à la fois en Illumina et en MinION.
→ chaque set de reads a été aligné sur le génome de référence avec les outils dédiés
→ les données ont été réduites aux premiers 500kb du chr10
Tools :
�
10
Partie TP
Workflow - Variants Structuraux
11
Alignment (bwa) Processé (BAM)
Delly
Sniffles
Alignment (NGMLR) Processé (BAM)
Short Reads (Illumina)
Long Reads (MinION)
# Copie des données SV
$ cp -R /shared/projects/form_2021_26/data/atelier_variant/sv ~/tp_sv
$ cd ~/tp_sv
# Indexation des fichiers
$ module load samtools/1.13
$ samtools index mapping_illumina_chr10_500kb.bam
$ samtools index mapping_minion_chr10_500kb.bam
$ samtools faidx Zymoseptoria_tritici.fa
$ ls -l
12
Préparation des données
$ mkdir -p delly/logs
$ cd delly
$ module load delly/0.8.3
$ delly # (v0.8.3)
$ delly call
Usage: delly call [OPTIONS] -g <ref.fa> <sample1.sort.bam> <sample2.sort.bam> ...
Generic options:
-? [ --help ] show help message
-t [ --svtype ] arg (=ALL) SV type to compute [DEL, INS, DUP, INV,
BND, ALL]
-g [ --genome ] arg genome fasta file
-x [ --exclude ] arg file with regions to exclude
-o [ --outfile ] arg (="sv.bcf") SV BCF output file
13
Delly
$ sbatch -J delly -o logs/delly.out -e logs/delly.err --mem=8G --wrap=" \
delly call -g ~/tp_sv/Zymoseptoria_tritici.fa \
-o SV_calling_illumina.bcf ~/tp_sv/mapping_illumina_chr10_500kb.bam"
# Conversion en fichier vcf
$ module load bcftools/1.10.2
$ sbatch -J bcf_to_vcf -o logs/bcf_to_vcf.out -e logs/bcf_to_vcf.err --wrap=" \
bcftools view SV_calling_illumina.bcf > SV_calling_illumina.vcf"
$ less -S SV_calling_illumina.vcf # “Q” pour quitter
$ less SV_calling_illumina.bcf
# "delly/SV_calling_illumina.bcf" may be a binary file. See it anyway? n
14
Delly
15
Header du vcf de Delly
# Combien de variants ?
$ grep -v -c "^#" SV_calling_illumina.vcf
16
Delly : comptage du nombre de SVs
# Combien de variants de bonne qualité ?
$ grep -v "^#" SV_calling_illumina.vcf | grep -v -c "LowQual"
17
Delly : comptage du nombre de SVs
# Combien de variants de bonne qualité de type Deletion…
$ grep -v "^#" SV_calling_illumina.vcf | grep -v "LowQual" | grep -c "<DEL>"
$ grep -v "^#" SV_calling_illumina.vcf | grep -v "LowQual" | grep -c "<DUP>"
$ grep -v "^#" SV_calling_illumina.vcf | grep -v "LowQual" | grep -c "<INV>"
$ grep -v "^#" SV_calling_illumina.vcf | grep -v "LowQual" | grep -c "<BND>"
$ grep -v "^#" SV_calling_illumina.vcf | grep -v "LowQual" | grep -c "<INS>"
18
Delly : extraction des informations
$ grep -v "^#" SV_calling_illumina.vcf | grep -v "LowQual" | grep "<DEL>"
#Récupération du start des variants
$ grep -v "^#" SV_calling_illumina.vcf | grep -v "LowQual" | grep "<DEL>" | \
cut -f1,2 > delly_del_start.txt
#Récupération des autres informations
$ grep -v "^#" SV_calling_illumina.vcf | grep -v "LowQual" | grep "<DEL>" | \
cut -f8 | cut -d ";" -f1,4,5,13 | sed "s/;/\t/g" > delly_del_info.txt
#Fusion des deux fichiers
$ paste -d '\t' delly_del_start.txt delly_del_info.txt > delly_del.txt
#Formattage et ménage
$ awk '{OFS=”\t”;print $1,$2,$4,$3,$5,$6}' delly_del.txt | sed "s/END=//g" \
> delly_del.tsv
$ rm delly_del_info.txt delly_del_start.txt delly_del.txt
19
Delly : extraction des informations des délétions
Workflow - Variants Structuraux
20
Alignment Processé (BAM)
Delly
Sniffles
Alignment Processé (BAM)
Short Reads (Illumina)
Long Reads (MinION)
$ module load sniffles/1.0.11
$ sniffles --help
Usage: sniffles [options] -m <sorted.bam> -v <output.vcf>
Version: 1.0.11
Contact: fritz.sedlazeck@gmail.com
Input/Output:
-m <string>, --mapped_reads <string>
(required) Sorted bam File
-v <string>, --vcf <string>
VCF output file name []
-b <string>, --bedpe <string>
bedpe output file name []
--Ivcf <string>
Input VCF file name. Enable force calling []
--tmp_file <string>
path to temporary file otherwise Sniffles will use the current directory. []
( -l <int>, --min_length <int>
Minimum length of SV to be reported. [30] )
21
Détection de données long reads avec Sniffles
$ mkdir -p ~/tp_sv/sniffles/logs
$ cd ~/tp_sv/sniffles
$ sbatch -J sniffles -o logs/sniffles.out -e logs/sniffles.err --mem=8G --wrap=" \
sniffles -l 100 -m ~/tp_sv/mapping_minion_chr10_500kb.bam \
-v SV_calling_minion.vcf"
$ less -S SV_calling_minion.vcf
22
Sniffles
23
Header du vcf de Sniffles
$ cat SV_calling_minion.vcf | grep ^chr_10 | grep "DEL" | wc -l
$ cat SV_calling_minion.vcf | grep ^chr_10 | grep "DUP" | wc -l
$ cat SV_calling_minion.vcf | grep ^chr_10 | grep "INV" | wc -l
$ cat SV_calling_minion.vcf | grep ^chr_10 | grep "TRA" | wc -l
$ cat SV_calling_minion.vcf | grep ^chr_10 | grep "INS" | wc -l
$ cat SV_calling_minion.vcf | grep ^chr_10 | wc -l
24
Sniffles : comptage du nombre de SVs
$ cat SV_calling_minion.vcf | grep ^chr_10 | grep "DEL"
25
Sniffles : extraction des positions des délétions
$ cat SV_calling_minion.vcf | grep ^chr_10 | grep "DEL" | cut -f -1,2 \
> sniffles_del_start.txt
$ cat SV_calling_minion.vcf | grep ^chr_10 | grep "DEL" | cut -d ";" -f 4 | \
cut -d "=" -f 2 > sniffles_del_stop.txt
$ paste sniffles_del_start.txt sniffles_del_stop.txt sniffles_del_infos.txt \
> sniffles_del.tsv
$ rm sniffles_del_start.txt sniffles_del_stop.txt sniffles_del_infos.txt
$ cat SV_calling_minion.vcf | grep ^chr_10 | grep "DEL" | cut -f 8 | \
cut -d ";" -f 1 > sniffles_del_infos.txt
26
Sniffles : extraction des positions des délétions
$ cd ~/tp_sv
$ cat delly/delly_del.tsv
$ cat sniffles/sniffles_del.tsv
27
Comparaison des résultats de Delly et Sniffles
→ ~/tp_sv/Zymoseptoria_tritici.fa/fai� → ~/tp_sv/mapping_illumina_chr10_500kb.bam/bam.bai
→ ~/tp_sv/mapping_minion_chr10_500kb.bam/bam.bai
28
Visualisation sous IGV
deletion 90309-101040 (illumina), 91233-98159 (Minion)
29
deletion 90309-101040 (illumina), 91233-98159 (Minion)
30
deletion 111021-111676
31
deletion 191291-191343
32
deletion 343161-343273
33
34
Comparaison des résultats de Delly et Sniffles
→ Nécessité de croiser différents outils/technologies
→ Nécessité de bien utiliser les métriques des outils
→ Nécessité d’une bonne profondeur (variant hétérozygote)
35
Conclusion