Introduction
Un SNP (Single Nucleotid Polymorphism) est la mutation d'un seul nucléotide à une position donnée, entre individus d'une même population. Ces substitutions ponctuelles permettent d'identifier des sous-populations.
Vous avez sûrement étudié en cours l'exemple de la drépanocytose, une maladie causée par la mutation ponctuelle d'un gène. L'origine de cette maladie génétique peut être observée en analysant les SNPs dans la population humaine. Analyser ces derniers peut ainsi permettre de trouver des prédispositions à certaines maladies, mais peut également être utile entre autres, en génétique des populations ou en cancérologie. L'arrivée des séquenceurs de deuxième génération (les fameux NGS) a facilité leur étude.
Pour la suite, nous partirons du principe que vous êtes familiers avec les concepts liés à l'analyse de données NGS (reads, mapping, format SAM/BAM, fastq, profondeur de séquençage etc.) sinon la suite risque d'être un peu ardue.
L'analyse
Pour analyser vos SNPs, je vous propose le pipeline ci-dessous. Ce dernier a pour but d'identifier les SNPs présents dans vos échantillons puis de les filtrer. À la fin de l'article nous verrons comment les annoter par rapport à une base de données.
L'analyse commence après alignement de vos reads contre votre génome de référence via votre mapper préféré. À la suite de cette étape vous obtenez classiquement un fichier au format BAM. La première étape propre à l'analyse des SNPs consiste à utiliser la commande
mpileup, fournie avec l'outil
samtools. Elle s'utilise de la manière suivante :
samtools mpileup -uf ref.fasta fichier.bam > output.bcfD'autres options peuvent bien sûr être rajoutées (cf. la doc).
Si vous possédez plusieurs fichiers BAM (correspondant à plusieurs échantillons mappés contre le même génome), vous pouvez utiliser cette commande sur tous vos fichier d'un coup, il est d'ailleurs fortement conseillé de procéder ainsi. D'une part vous n'aurez qu'un fichier à gérer par la suite et d'autre part, l'algorithme de
mpileuputilise les reads de tous vos échantillons pour ses calculs. La commande
mpileupproduit un fichier au format pileup (plus trop utilisé actuellement). Plus généralement, l'option
-uest utilisée afin de produire un fichier binaire (format BCF). Ce dernier est le format compressé de VCF : Variant Call Format (en gros BCF est à VCF ce que BAM est à SAM).
Ci-dessus un exemple de fichier VCF. Ce format se compose de 3 parties :
- Les premières lignes, commençant par "##", contiennent la description des champs. Dans l'exemple ci-dessus on peut lire "##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">" ce qui indique que le champ DP ne doit contenir qu'un seul chiffre ("Number=1") entier ("Type=Integer") et ce chiffre correspond à la profondeur du read ("Description="Reads Depth"").
- L'en-tête (header) : Le nom des colonnes, commençant par "#"
- Les données elles-mêmes contenant différents champs séparés par une tabulation.
Plus d'infos sur ce format sur la page wikipedia d'où provient la capture d'écran. La documentation officielle du format VCF est disponible ici.
Revenons à notre pipeline,
mpileupne fait qu' "entasser" les reads alignés sur votre génome (du verbe anglais to pileup). Afin de supprimer les faux positifs dus à des erreurs de séquençage (c'est-à-dire un mismatch entre un read et le génome de référence sans pour autant que cela soit un SNP), il est possible d'utiliser l'outil
bcftools. Celui-ci vous permettra également d'obtenir un fichier au format VCF qui sera utile pour la suite.
Par exemple, pour convertir le fichier
output.bcfobtenu précédemment, il suffit d'écrire :
bcftools view -v output.bcf > output.vcfL'option
-vsert à afficher uniquement les potentiels variants.
D'une manière générale
bcftoolspermet de manipuler les fichier VCF et BCF (
bcftoolsest aux formats VCF et BCF ce que
samtoolsest aux formats SAM et BAM).
À noter :
La commande
viewest faite pour fonctionner avec
samtools≤ 0.1.19 (la version de
samtoolsdisponible dans les paquets Ubuntu à l'heure actuelle). Si vous avez une version de
samtoolset
bcftoolsplus récente il faudra passer par la commande
call(l'étape de détection des SNPs se nomme SNP calling). Ainsi la commande sera :
bcftools call -v -m output.bcf > output.vcfPourquoi
-m? Eh ben d'après le site officiel de bcftools :
Users are now required to choose between the old samtools calling model (-c/--consensus-caller) and the new multiallelic calling model (-m/--multiallelic-caller). The multiallelic calling model is recommended for most tasks.
L'option
-mest donc la nouvelle recommandation des auteurs. L'option
-cest plutôt utilisée pour rechercher des sites bialléliques.
La différence entre
mpileupet
bcftoolspeut vous sembler floue. Pour résumer,
mpileuprassemble tous les reads à la même position sur le génome et
bcftoolsdétecte les SNPs de manière plus fine en supprimant les faux positifs. Dans la pratique, ces deux commandes sont utilisées conjointement via le symbole pipe (
|) sous Unix. C'est d'ailleurs cette façon de faire qui est indiquée dans la doc de mpileup.
Ainsi si vous ne deviez retenir qu'une seule commande, retenez celle-là :
samtools mpileup -uf ref.fasta fichier.bam | bcftools call -v -m > output.vcf
Filtres
Maintenant que vous avez identifié vos SNPs, vous pouvez les compter, les regarder, mais vous pouvez aussi vous demander que faire (de plus) avec tous ces SNPs ? Comment ne garder que les plus "pertinents" ? (La difficulté ici est de définir "pertinent").
Vous pouvez filtrer vos SNPs selon :
- Le nombre de fois qu'ils sont lus;
- La qualité de l'alignement;
- Le taux d’allèles à une position donnée
C'est par exemple ce qui est effectué dans Seo et. al (2012) sur des SNPs humains (cf. paragraphe "Somatic single nucleotide and short-indel discovery").
Afin de vous aider à choisir vos filtres, vous pouvez vous poser les deux questions suivantes :
- Avez-vous des contrôles positifs ? Si vous êtes sûrs que vous devez retrouver tel ou tel SNPs, est-ce que vous les retrouvez après avoir appliqué vos filtres ?;
- Quel est le contexte de votre étude ? Est-ce que vous vous attendez à avoir "beaucoup" ou "peu" de SNPs ?
Pour filtrer vos SNPs, vous pouvez par exemple utiliser
snpsift.
Utilisation :
java -jar SnpSift.jar filter [options] 'expression‘Par exemple, dans la publication citée ci-dessus, les auteurs préconisent de ne garder que les SNPs lus avec une profondeur ≥ 3. Ce qui se traduit par la commande suivante :
java -jar SnpSift.jar filter "(DP >= 3)" -f Outputfile.vcf > Outputfile_filter.vcf
Plus d'info sur http://snpeff.sourceforge.net/SnpSift.html#filter
Sachez que certains outils, tels que GATK, offrent des filtres plus fin pour analyser les SNPs. Par contre ce dernier est plus compliqué à utiliser : l'installation n'est pas simple et avant de commencer à analyser vos SNPs, prévoyez de nombreuses heures pour lire la doc.
L'annotation
Le pipeline présenté tout au long de cet article s'arrête après l'étape de filtrage. Ceci dit, une fois vos SNPs obtenus, vous pouvez également les comparer à des bases de données afin de les annoter.
SnpSiftpermet de le faire grâce à la commande
annotate. L'idée est de regarder si vos SNPs sont présents dans la base de données choisie et si oui de leur rajouter certaines informations. Prenons par exemple la base de données dbSNP qui est une base de données de SNPs humains hébergée par le NCBI. Mettons que si l'un de vos SNPs est présent chez dbSNP alors vous voulez rajouter l'information à propos de la fréquence de l'allèle basée sur l'étude 1 000 genomes (cette information est contenue dans le champ CAF d'après le glossaire). Pour réaliser ceci vous pouvez utiliser la commande suivante :
java -jar SnpSift.jar annotate 00-All.vcf myFile.vcf -info 'CAF' > annotatedSample.vcfDans la commande ci-dessus
00-All.vcfcorrespond à la base de données.
Conclusion
Pour résumer, une analyse de SNPs commence toujours par un mapping, suivi d'un SNP calling (avec samtools et bcftools) afin d'obtenir un fichier VCF. Ce dernier peut éventuellement être filtré dans le but d'éliminer les allèles moins fréquents par exemple. Enfin, la partie annotation des SNPs est la plus compliquée car elle est dépendante des données et plus particulièrement du génome et du contexte de l'étude.
Comme évoqué dans l'introduction, les NGS ont grandement facilité l'étude des SNPs. La probabilité de détecter un SNP rare dépend du nombre d'individus séquencés. Ainsi, grâce au projet 100,000 genomes (séquençage de 100,000 génomes humains pour étudier des maladies rares) on peut s'attendre à découvrir de nouveaux SNPs chez l'humain. Pour finir, sachez que les SNPs sont le plus souvent étudiés dans le cadre des maladies génétiques mais rien ne vous empêche de les analyser dans d'autres domaines comme la phylogénie par exemple.
Merci à Julien Fouret pour son aide ainsi qu'à Lelouar, Bérénice, et NiGoPol pour les commentaires et discussions lors de l’édition de cet article.
Laisser un commentaire