BCM2550 - Automne 2010 – TP2 – Les tableaux et les tables de hachages Ce TP n’est pas à rendre, néanmoins, il est important de (bien) le faire. Partie I Question 1: Ecrire un programme qui demande à l'utilisateur d'entrer une séquence en acides aminés, et calcule le nombre d'occurrence de chacun des 20 acides aminés dans cette séquence. Nous avions vu, lors du TP1, une manière simple de calculer la composition d’une séquence ADN (en comptant le nombre de A, de C, de G et de T séparément. Toutefois, avec 20 acides aminés, la technique alors utilisée devient fastidieuse. Pour aller plus vite, on vous propose de procéder de la manière suivante: Au tout début du script, construisez-vous un tableau contenant l’ensemble des 20 lettres correspondant aux 20 acides aminés : my @aminoacids = ('A','C','D','E','F','G','H','I','K','L','M','N','P','Q','R' ,'S','T','V','W','Y'); my $naa = 20; De cette manière, vous pouvez accéder à un acide aminé particulier directement à partir de son index dans le tableau : print “$aminoacids[3]\n”; # affichera E for (my $i=0; $i<$naa; $i = $i + 1) { print “$aminoacids[$i]\n”; } Affichera tous les acides aminés les uns en dessous des autres. Ensuite, créez un tableau @count de dimension 20, et remplissez le de telle sorte que $count[$i] va contenir le nombre d'occurrences de l'acide aminé numéro $i dans la séquence. Donc, $count[0]va contenir le nombre de A, $count[1]le nombre de C, etc. Ce tableau doit être initialisé de telle sorte que les 20 entrées sont toutes égales à 0. Enfin, pour remplir le tableau @count, il faut faire une boucle allant lire une par une les positions (les 'lettres') de la séquence protéique (en utilisant substr()), et incrémentant les entrées correspondantes dans le tableau @count. A la fin, il faut afficher chaque acide aminé, le nombre total de fois qu'il a été observé, et la fréquence correspondante (nombre de fois sur nombre total d'acides aminés dans la séquence). Question 2. Plutôt que d’utiliser substr(), vous pouvez également 'splitter' une séquence en un tableau contenant toutes ses lettres séparément : my $seq = “ADAGE”; my @a = split('', $seq); my $l = (@a); print “$l\n”; # affichera 5 print “$a[0]\n”; # affichera A print “$a[1]\n”; # affichera D etc. Modifier le programme de la question 1 de telle sorte qu'il utilise split plutôt que substr. Question 3. Plutôt que de faire un tableau @count, il est possible de faire une table de hachage %count, dont les clés seront les acides aminés, et les valeurs les nombres d'occurrence. Donc, $count{'A'} va contenir le nombre de A, $count{'C'} le nombre de C, etc Modifier le programme de facon à utiliser une table de hachage. Question 4. Le fichier sce.fasta contient les séquences de l’ensemble des gènes codant pour des protéines identifiés chez Saccharomyces cerevisiae. Construire une table associative (table de hachage) dont les clés seront l’ensemble des noms des gènes du fichier sce.fasta, et les valeurs seront les séquences associées. Question 5: faire une boucle qui prend les gènes un par un, puis calcule la composition de ce gène pour les 20 acides aminés (donc la fréquence de A, de C, de D, de E, etc.). Écrire un fichier qui va tabuler: le nom de chaque gène, sa longueur, puis la fréquence des 20 acides aminés, le tout sur la même ligne, et séparés par des tabulations. Partie II Une séquence consensus est une séquence issue d’un alignement multiple. Un fichier pileup est un fichier qui contient l’alignement de la séquence consensus avec la séquence de référence. Cet alignement est formaté en colonnes séparées par des tabulations, c’est spécifique aux fichiers pileup. Il y a 7 colonnes dans un fichier pileup, la première est le nom du chromosome, généralement, il s’agit d’un chiffre (1, 2, 3 …) parfois il y a l’abréviation de chromosome devant ces chiffres (chr1, chr2, chr3 …). La deuxième colonne contient les positions des nucléotides qui ont été alignés sur le chromosome. La troisième colonne contient les nucléotides de la séquence de référence tandis que la quatrième contient ceux de la séquence consensus. Les trois colonnes suivantes contiennent des informations plus précises sur l’alignement. La cinquième colonne contient le nombre de séquences qui se sont alignées à cette position sur ce chromosome, lors de l’alignement multiple dont la séquence consensus est issue. La sixième colonne contient les nucléotides spécifiques à la position de chaque séquences alignées sur cette position, s’il y a 6 séquences alignées pour la position 43, il y aura donc 6 nucléotides, un par séquence. La dernière colonne contient la qualité des nucléotides de la colonne précédente. C’est une variable calculée à partir de plusieurs paramètres et qui indique la confiance qu’on peut donner au nucléotide. Si la qualité est basse, il est peu sur que le nucléotide A soit vraiment un A, par contre si elle est haute, il est fortement probable que le nucléotide A soit réellement un A. Le fichier alignement.pileup est un fichier qui contient l’alignement d’une séquence consensus, issue d’un alignement multiple, avec une séquence de référence. Le but de l’exercice est de vous familiariser avec les tableaux. Question 1 : construire une boucle dans laquelle le fichier va être lu pour que chaque ligne soit stockée dans une case d'un tableau. (Tableau 1) Ce tableau servira pour toutes les autres questions de cette partie. Question 2 : En s'aidant du tableau 1, calculer le nombre de positions pour chaque chromosome. Il faut s’aider d’une boucle pour parcourir le tableau et d’un incrémenteur par chromosome pour avoir le nombre de positions. Les incrémenteurs doivent être stockés dans un tableau pour ensuite en faire l’impression, voir plus bas le format d’impression. (Tableau 2) Voici le code IUPAC des nucléotides. Il s’agit du code employé pour les nucléotides des séquences de référence et de consensus dans un fichier pileup, exception faite du N. IUPAC nucleotide code Base A Adenine C Cytosine G Guanine T (or U) Thymine (or Uracil) R A or G Y C or T S G or C W A or T K G or T M A or C B C or G or T D A or G or T H A or C or T V A or C or G N any base Question 3 : En vous aidant du code IUPAC, déterminer le nombre de chaque combinaison de nucléotide (incluant A, C, G, et T) de la séquence consensus. En faisant une boucle, vous passez dans le premier tableau et vous comptez, à l’aide d’un incrémenteur, les combinaisons de nucléotides. Il est plus facile de donner un incrémenteur par combinaison dans une table de hachage, si vous êtes à l’aise avec ces tables, faites le ainsi, sinon, utilisez un tableau. (Tableau 3) Question 4 : Donner les nucléotides des séquences et leurs qualités des positions ayant 5 ou 21 séquences alignées. En s’aidant d’une boucle, vous pouvez créer 2 tableaux, un pour les nucléotides et un pour les qualités, pour les positions ayant 5 séquences alignées, puis 2 autres pour celles ayant 21 séquences alignées. Sinon, vous pouvez aussi utiliser les tables de hachages si vous êtes à l’aise avec. (Tableau 4) Impression des tableaux : Imprimer les données des tableaux en suivant les formats suivant : tableau 2 : tableau 3 : tableau 4 : nom_du_chromosome ... code_de_la_combinaison … positions à X séquences … nombre_de_positions nombre_de_fois_qu’il_apparaît nucléotides qualité