Exercice récapitulatif
Contexte
L’outil
Orthofinder (https://github.com/davidemms/OrthoFinder) est un outil permettant d’identifier des gènes orthologues chez différentes espèces par l’analyse phylogénétique de leur protéome. Orthofinder crée des Orthogroupes qui contiennent les gènes des différentes espèces qui ont pour origine un même gène ancestral. C’est donc à l’intérieur des orthogroupes que l’on peut identifier les gènes orthologues entre 2 espèces et les paralogues au sein d’une même espèce. La Figure 1 illustre cette logique.
L’analyse
A l’aide de ce programme, nous avons cherché à identifier les gènes orthologues chez 3 espèces de la famille des Brassicaceae: Arabidopsis thaliana, Sinapis alba et Brassica oleracea. Pour permettre à Orthofinder de déduire des groupes d’orthologues qui contiennent des gènes de ces 3 espèces relativement éloignées, nous avons inclus dans l’analyse une série de protéomes d’espèces qui s’intercallent entre ces 3 espèces dans l’arbre phylogénétique.
Les différents protéomes utilisés dans le cadre de cette analyse sont :
less SpeciesIDs.txt
0: Alinifolium_472_v1.1.protein_prefixed_1.fa
1: Alyrata_384_v2.1.protein_prefixed_1.fa
2: Athaliana_447_Araport11.protein_prefixed_1.fa
3: Boleraceacapitata_446_v1.0.protein_prefixed_1.fa
4: BrapaFPsc_277_v1.3.protein_prefixed_1.fa
5: Brassica_oleracea.BOL.protein_prefixed_1.fa
6: Bstricta_278_v1.2.protein_prefixed_1.fa
7: Cgrandiflora_266_v1.1.protein_prefixed_1.fa
8: Crubella_474_v1.1.protein_prefixed_1.fa
9: Esalsugineum_173_v1.0.protein_prefixed_1.fa
10: Iamara_485_v1.1.protein_prefixed_1.fa
11: Lsativum_478_v1.1.protein_prefixed_1.fa
12: Mmaritima_477_v1.1.protein_prefixed_1.fa
13: Salba_584_v3.1.protein_prefixed_1.fa
14: Tarvense_479_v1.1.protein_prefixed_1.fa
Exercice 1: Concevoir la base de données
L’un des nombreux fichiers de résultat produit par Orthofinder contient une liste de tous les orthogroupes identifiés et, pour chacun d’eux, une liste des gènes de chaque espèces qui le compose. Des informations et un extrait de ce fichier (Orthogroups.txt
, lien de télécharement) sont produits ci-dessous :
echo "Nombre d'Orthogroupes: $(cat Orthogroups.txt | wc -l | tr -d ' ')"
N=6000
echo "Exemple du ${N}è orthogroupe:"
sed -n ${N}p Orthogroups.txt | fold
# équivalent à head -n5000 Orthogroups.txt | tail -n1 | fold
echo "Il contient des gènes de $(sed -n ${N}p Orthogroups.txt | cut -d':' -f2 |
sed 's/^ //' | tr ' ' '\n' | cut -d'|' -f1 | sort | uniq | wc -l | tr -d ' ') espèces."
Nombre d'Orthogroupes: 65099
Exemple du 6000è orthogroupe:
OG0005999: 109376|Bo1g019640.1 109376|Bo3g157020.1 109376|Bo7g106030.1 13288|Thl
ar.0019s0482.1.p 190884|Ibeam.2158s0006.1.p 190884|Ibeam.7688s0002.1.p 264402|Ca
gra.2935s0006.1.p 313683|Mamar.0058s0208.1.p 33125|Lesat.0002s0137.1.p 33125|Les
at.0101s0172.1.p 3702|AT4G18501.1 3711|Brara.A00963.1.p 3711|Brara.A00964.1.p 37
11|Brara.H00955.1.p 3711|Brara.K00440.1.p 3712|Bol009409 3712|Bol024431 3728|Sia
lb.0001s0298.1.p 3728|Sialb.0003s0399.1.p 3728|Sialb.0078s0211.1.p 3728|Sialb.00
78s0212.1.p 3728|Sialb.2613s0013.1.p 457770|Alyli.0011s0328.1.p 59689|AL7G35780.
t1 72658|Bostr.30275s0325.1.p 72664|Thhalv10027250m 81985|Carub.0007s2273.1.p
Il contient des gènes de 15 espèces.
La structure de l’information de chaque ligne de ce fichier est donc la suivante:
ORTHOGROUP_ID
: TAXID
|GENE_ID
TAXID
|GENE_ID
TAXID
|GENE_ID
…
Le problème
Supposons que nous souhaitions explorer ces données pour en tirer des informations telles que:
- Pour chaque espèce, combien y a-t-il d’orthogroupes dans lesquels elles sont représentées ?
- Pour une espèce en particulier, quels sont les orthogroupes qui ne contiennent qu’un seul de ses gènes ?
- Combien d’orthogroupes contiennent des gènes des 15 espèces étudiées ?
- …
Il est bien sûr possible d’écrire des lignes de codes qui permettent de trouver une réponse à ces questions, mais c’est typiquement le genre d’opérations pour lesquelles le langage SQL est conçu… encore faut-il que l’information soit disponible sous la forme d’une base de données.
Concevoir la base de données
L’objectif de l’exercice est donc de construire la structure d’une base de données qui sera ensuite remplie avec les données contenues dans le fichier Orthogroups.txt
.
Pour cela, vous devez mettre en oeuvre les 5 étapes de modélisation et de conception suivantes:
- Etablissez la liste des propositions binaires (du type “des publications référencent des gènes”) qui décrivent le contexte.
- A travers cette description, identifiez les différents types d’entité et élaborez d’un schéma simple de type Entités-Associations en ne vous concentrant que sur ces 2 éléments (n’incluez pas encore les attributs à ce stade). Réfléchissez bien entendu aux cardinalités des associations.
- Construisez ensuite le modèle relationnel qui intègrent les attributs et leurs cardinalités et qui résout les différentes associations. Représentez ce modèle grâce qux boites à 2 compartiments qui vous permettent de spécifier les clés primaires et clés étrangères.
- Ecrivez le code qui permet de produire le schéma de la base de données.
- Créez la base de données.
Exercice 2: Remplir la base de données
Introduire des données dans la base de données s’effectue en utilisant la requête SQL suivante:
INSERT INTO table (colonne1, colonne2, ...) VALUES ("string", 10, ...);
Notez que l’ordre et le nombre de colonnes spécifiées doit correspondre exactement au nombre de valeurs introduites dans le second groupes de parenthèses. Par ailleurs, il est possible d’insérer plusieurs lignes en même temps dans une même table:
INSERT INTO table (col1, col2, ...) VALUES ("string", 10, ...), ("string2", 20, ...),
("string3", 30, ...), ("string4", 40, ...);
Réalisez un “parser”
Réalisez un script bash (ou R) permettant de lire les données présentes dans le fichier Orthogroups.txt
et de remplir chacune des tables de votre base de données. L’enjeu est bien entendu de créer correctement les liens (clés primaires, clés étrangères) entre chacune des tables.
Dans le cas de bash
, vous pourrez vous en sortir facilement en utilisant les structures while read ...; do ... ; done < Orthogroups.txt
et for ... ; do ...; done
que nous avons étudiées dans le module d’introduction à la ligne de commande (Pour rappel voir l’exercice récapitulatif).
Dans le cas de R, vous maitrisez certainement les structures de programmation qui vous permettront de lire et traiter le fichier de données. En ce qui concerne l’interfaçage avec la base de données, vous avez 2 possibilités:
- soit vous utilisez la fonction
system()
qui vous permet d’utiliser des commandes de votre shell système à l’intérieur d’un script R. Il suffira d’y placer la commandesqlite
que vous auriez utilisez dans le terminal. - soit vous utilisez une librairie qui fournit une interface SQLite dans R, telle que RSQLite que nous avons utilisée dasn l’exercice précédent.
Créez les requêtes permettant de répondre aux questions suivantes
- Pour chaque espèce, combien y a-t-il d’orthogroupes dans lesquels elles sont représentées ?
- Pour une espèce en particulier, quels sont les orthogroupes qui ne contiennent qu’un seul de ses gènes ?
- Combien d’orthogroupes contiennent des gènes des 15 espèces étudiées ?