Cet article présente un cadre complet pour analyse du pan-génome, mettant l'accent sur la classification des gènes en catégories centrales, softcore, dispensables et privées en fonction de la fréquence de présence/absence à travers les génomes. En utilisant le pipeline PSVCP et OrthoFinder, nous construisons un pan-génome linéaire, détectons des variants structurels et identifions des familles de gènes orthologues. Un flux de travail statistique est mis en œuvre pour attribuer des catégories de gènes et quantifier leur distribution. Des techniques de visualisation - y compris des graphiques en secteurs, des histogrammes, des graphiques à barres et des cartes de chaleur - mettent en évidence la diversité génomique et la structure des populations. Cette approche permet d'obtenir des aperçus plus approfondis sur l'évolution du génome, la différenciation fonctionnelle et les traits adaptatifs, soutenant des applications dans la sélection végétale, les études microbiennes et la génomique des maladies.
Qu'est-ce qu'un pan-génome ?
Le pan-génome représente l'ensemble des gènes dans un groupe défini d'organismes, englobant à la fois le contenu génomique partagé et variable entre les individus ou les espèces. Contrairement à l'approche traditionnelle d'analyse d'un seul génome de référence, le pan-génome intègre la diversité génomique intra-espèces, permettant des aperçus plus complets sur la variation structurelle, la variation de présence/absence de gènes (PAV) et les dynamiques évolutives.
Initialement proposé dans la génomique bactérienne, le concept de pan-génome a depuis évolué pour devenir un paradigme central dans la sélection des plantes, l'adaptation microbienne et la génomique du cancer.
Contexte historique et pertinence
Le terme "pan-génome" a été inventé en 2005 par Tettelin et al. lors de l'analyse comparative de plusieurs souches de Streptococcus agalactiae. Leur travail a mis en lumière les limites de l'analyse basée uniquement sur des références, plaidant en faveur d'un modèle plus inclusif du contenu génomique. Depuis lors, le concept a révolutionné :
Pourquoi classer les gènes en quatre catégories ?
L'analyse du pan-génome révèle que tous les gènes ne sont pas distribués de manière égale entre les individus. La stratification des gènes en catégories de gènes de base, de softcore, de dispensables et de privés fournit un cadre quantitatif pour :
Services qui pourraient vous intéresser
En savoir plus
Dans les études pan-génomiques, les familles de gènes sont généralement classées en fonction de leur présence à travers les échantillons. Les gènes de base sont universellement conservés et apparaissent chez tous les individus de la population, suggérant leurs rôles biologiques essentiels. Les gènes semi-essentiels, bien qu'ils ne soient pas strictement universels, se trouvent chez plus de 90 % des individus et peuvent refléter une forte conservation évolutive avec une variabilité mineure spécifique à la population. Les gènes dispensables sont présents dans un sous-ensemble d'individus, généralement plus d'un mais moins de 90 %, et correspondent souvent à des gènes impliqués dans la réponse environnementale, l'immunité ou l'adaptation au stress. Enfin, les gènes privés sont exclusifs à un seul génome au sein du jeu de données, indiquant de possibles insertions récentes, des variants structurels ou des artefacts d'annotation. Cette classification sert de fondement pour les analyses statistiques et fonctionnelles en aval.
Figure 1. Composition du pan-génome syntenique.Li, X. et al, 2024)
Les gènes essentiels codent souvent des fonctions essentielles liées à l'entretien cellulaire, au développement et à la reproduction.
Les gènes softcore peuvent refléter des adaptations spécifiques à l'environnement ou une conservation spécifique à des sous-populations.
Les gènes dispensables entraînent une diversité phénotypique et sont souvent enrichis dans la réponse au stress, l'immunité et le métabolisme secondaire.
Les gènes privés pourraient représenter des insertions récentes, des événements de transfert horizontal ou des artefacts d'assemblage ou d'annotation.
Le pipeline psvcp_v1.01 facilite la construction d'un pan-génome linéaire et identifie les variations structurelles (SV) à l'échelle de la population à partir de données de séquences courtes.
Étapes clés :
Génomes assemblés en FASTA, annotations (GFF) et données de séquençage de population
Étape 1 : Téléchargez le pipeline psvcp_v1.01
git clone https://github.com/wjian8/psvcp_v1.01.git
Étape 2 : Fusionner les génomes de référence via Genome_construct_Pangenome.py
#construction d'un pan-génome linéaire par deux génomes bash $path_of_the_pipeline/Refgenome_update_by_quest.sh ref.fa query.fa > job.sh && bash job.sh #construction d'un pan-génome par plusieurs (plus de 2) génomes python3 $path_of_the_pipeline/1Genome_construct_Pangenome.py genome_example_dir genome_list
Étape 3 : Mapper les lectures au pan-génome en utilisant Map_fq_to_Pan.py
python3 $chemin_du_pipeline/2Map_fq_to_Pan.py -t 4 -fqd fq_dir -r FichierDeRéférence -br bam_dir
Étape 4 : Appeler les SVs (PAVs, inversions, translocations) et générer une matrice de génotypes avec Call_sv_to_genotype.py
python3 $chemin_du_pipeline/3Call_sv_to_genotype.py -br répertoire_bam -o préfixe_hmp
le fichier de sortie est le préfixe d'un fichier de génotype au format hapmap.
Pour suivre de manière fiable les familles de gènes à travers les individus, OrthoFinder est utilisé pour détecter les orthogroupes à travers plusieurs génomes, regroupant ainsi les gènes qui ont évolué à partir d'un ancêtre commun. Il résout également les duplications et les pertes de gènes, offrant des perspectives sur l'évolution des familles de gènes et les expansions ou contractions spécifiques à une lignée. De plus, OrthoFinder identifie les blocs synteniques, qui sont des ordres de gènes conservés à travers les génomes, facilitant l'analyse de la colinéarité et améliorant la précision de l'attribution des gènes orthologues dans les études de pan-génome.
Étape 1 : Installer OrthoFinder
conda installer orthofinder -c bioconda
Étape 2 : Exécution d'OrthoFinder
"OrthoFinder/ExampleData" avec le répertoire contenant vos fichiers fasta d'entrée, avec un fichier par espèce.
OrthoFinder/orthofinder -f OrthoFinder/ExemplesDeDonnées
Une exécution typique d'OrthoFinder génère une collection complète de fichiers de sortie, y compris des informations sur les orthogroupes, les relations orthologues, les arbres génétiques, les arbres génétiques résolus, l'arbre des espèces enraciné, les événements de duplication de gènes et des statistiques génomiques comparatives entre les espèces analysées. Tous les résultats sont organisés dans une structure de répertoire bien structurée et conviviale pour une navigation et une interprétation faciles.
L'analyse nécessite une matrice de présence/absence d'orthogroupes binaires dans laquelle chaque ligne représente un orthogroupe (famille de gènes) et chaque colonne représente un échantillon (génome). Les entrées indiquent si un orthogroupe donné est présent (1) ou absent (0) dans chaque échantillon. En option, des métadonnées telles que l'origine de l'échantillon, le phénotype ou le contexte écologique peuvent être intégrées pour des analyses stratifiées en aval.
Pour stratifier les gènes en catégories de cœur, de softcore, de dispensable et de privé, les étapes suivantes sont mises en œuvre :
Étape 1 : Calculer la fréquence de présence du gène
La fréquence de chaque orthogroupe à travers les échantillons est calculée comme la proportion de génomes dans lesquels le gène est présent.
bibliothèque(tidyverse)
# Charger la matrice de comptage des gènes d'orthogroupe et le tableau des gènes non assignés
df <- read.csv('Orthogroups.GeneCount.tsv', sep = '\t', row.names = 1)
df_uniq <- read.csv('Orthogroups_UnassignedGenes.tsv', sep = '\t', row.names = 1)
# Supprimer la dernière colonne si elle contient des statistiques sommaires
df <- df[, 1:(ncol(df) - 1)]
# Convertir le tableau des gènes non assignés en format binaire
df_uniq[df_uniq != ''] <- 1
df_uniq[df_uniq == ''] <- 0
# Fusionner les tableaux de gènes assignés et non assignés
df_combined <- rbind(df, df_uniq)
df_combined[is.na(df_combined)] <- 0 # Remplir NA avec 0
Pour illustrer le flux de travail, nous simulons une matrice de présence/absence aléatoire.
set.seed(123)
n_genes <- 1000
n_samples <- 27
gene_categories <- sample(c("Noyau", "Noyau souple", "Dispensable", "Privé"),
n_genes,
replace = TRUE,
prob = c(0.20, 0.15, 0.55, 0.1))
binary_matrix <- sapply(gene_categories, function(cat) {
switch(cat,
"Noyau" = rep(1, n_samples),
"Noyau souple"= rbinom(n_samples, 1, 0.95),
"Privé" = rbinom(n_samples, 1, 0.05),
"Dispensable" = rbinom(n_samples, 1, 0.5)
)
}) %>% t()
colnames(binary_matrix) <- paste0("Génome_", 1:n_samples)
rownames(binary_matrix) <- paste0("Gène_", 1:n_genes)
df_combined <- as.data.frame(binary_matrix)
Étape 2 : Attribuer des catégories de gènes en fonction des seuils de fréquence
Chaque gène est classé dans l'une des quatre catégories :
# Calculer la fréquence de présence pour chaque gène df_summary <- data.frame( gène = rownames(df_combined), fréquence = apply(df_combined, 1, function(x) sum(x != 0) / ncol(df_combined)), stringsAsFactors = FALSE ) df_summary <- df_summary[!df_summary$fréquence == 0,] # Assigner une catégorie de gène en fonction de la fréquence df_summary$Catégorie <- with(df_summary, case_when( fréquence == 1 ~ "Noyau", fréquence >= 0.9 ~ "Noyau souple", fréquence == 1 / ncol(df_combined) ~ "Privé", TRUE ~ "Dispensable" ))
Étape 3 : Générer des statistiques récapitulatives
Une fois classées, un résumé statistique est produit pour quantifier la distribution des catégories de gènes :
# Compter le nombre de gènes dans chaque catégorie table(df_summary$Category) # Calculer les proportions par catégorie prop.table(table(df_summary$Category))
Cela inclut le nombre total et la proportion de gènes dans chaque catégorie.
Pour faciliter l'interprétation intuitive de la structure pan-génomique et des dynamiques des catégories de gènes, plusieurs stratégies de visualisation sont employées :
Objectif : Visualiser la proportion de gènes dans chaque catégorie.
ggplot(df_summary, aes(x = "", fill = Category)) +
geom_bar(width = 1, color = "white") +
coord_polar("y") +
theme_void() +
scale_fill_manual(values = c("#F8766D", "#7CAE00", "#00BFC4", "#C77CFF")) +
geom_text(aes(label = paste0(round(..count../sum(..count..)*100, 2), "%")),
stat = "count",
position = position_stack(vjust = 0.5),
color = "black", size = 4)
Cela fournit un aperçu immédiat de la composition génétique à l'échelle du génome.
Figure 2. La proportion de gènes dans chaque catégorie.
Objectif : Afficher la distribution des fréquences de présence des gènes, en mettant en évidence les seuils de catégorie.
ggplot(df_summary, aes(x = fréquence, fill = Catégorie)) +
geom_histogram(binwidth = 0.05, alpha = 0.8) +
scale_fill_manual(values = c("#F8766D", "#7CAE00", "#00BFC4", "#C77CFF")) +
labs(x = "Fréquence de Présence", y = "Nombre de Gènes",
title = "Distribution de la Fréquence des Gènes (Gènes Pan/Core)") +
theme_minimal() +
geom_vline(xintercept = c(0.9, 1/n_samples), linetype = "dashed")
Figur3. La distribution des fréquences de présence des gènes.
Objectif : Comparer la composition des catégories de gènes entre des génomes individuels ou des groupes d'échantillons.
# Reshape la matrice au format long et fusionne avec les informations de catégorie de gène
df_long <- df_combined %>%
as.data.frame() %>%
rownames_to_column("gène") %>%
pivot_longer(-gène, names_to = "Échantillon", values_to = "Présence") %>%
left_join(df_summary, by = "gène") %>%
filter(Présence == 1)
# Calculer la proportion de chaque catégorie par échantillon
df_stack <- df_long %>%
group_by(Échantillon, Catégorie) %>%
summarise(Compte = n(), .groups = "drop") %>%
group_by(Échantillon) %>%
mutate(Proportion = Compte / sum(Compte))
ggplot(df_stack, aes(x = Échantillon, y = Proportion, fill = Catégorie)) +
geom_bar(stat = "identity", position = "fill") +
ylab("Proportion de Gènes") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
Utile pour les comparaisons au niveau de la population et pour révéler des motifs d'enrichissement spécifiques à l'échantillon.
Figure 4. Composition des catégories de gènes à travers les génomes individuels.
Objectif : Regrouper les génomes et les gènes pour révéler la structure et les modules fonctionnels potentiels.
library(pheatmap)
ordre_lignes <- order(rowMeans(binary_matrix), decreasing = TRUE)
binary_matrix <- binary_matrix[ordre_lignes, ]
pheatmap(binary_matrix,
color = c("#2166AC", "#B2182B"),
show_rownames = FALSE,
show_colnames = TRUE,
cluster_rows = FALSE,
cluster_cols = FALSE,
breaks = seq(0, 1, length.out = 3),
legend = TRUE,
legend_breaks = c(0, 1),
legend_labels = c("Absence", "Présence"),
main = "Présence/Absence de gènes dans 27 génomes",
annotation_row = data.frame(Category=df_summary$Category, row.names=df_summary$gene),
annotation_colors = list(Category = c(Core="#F8766D", Softcore="#7CAE00",
Dispensable="#00BFC4", Private="#C77CFF")))
Les clusters peuvent correspondre à des sous-populations, des écotypes ou des pressions sélectives.
Figure 5. Informations sur la présence et l'absence de toutes les familles de gènes.
L'analyse du pan-génome fournit un cadre complet pour caractériser la variation génomique intra-espèces. La classification des gènes en catégories de noyau, de softcore, de dispensable et de privé permet aux chercheurs de prioriser les gènes essentiels, d'identifier les caractéristiques adaptatives et d'évaluer la diversité des populations. En intégrant des pipelines robustes comme PSVCP pour l'appel de variations structurelles et des outils tels qu'OrthoFinder pour le regroupement de familles de gènes, les chercheurs peuvent dériver des matrices de présence/absence à haute résolution essentielles pour l'analyse en aval. Associées à un profilage quantitatif et à des techniques de visualisation intuitives - allant des graphiques en secteurs aux cartes thermiques hiérarchiques - ces stratégies offrent des aperçus puissants sur l'évolution du génome, la structure des populations et la diversité fonctionnelle, ouvrant ainsi la voie à une sélection génomique et à des études d'association plus éclairées tant en recherche fondamentale qu'appliquée.
Références: