modélisation bioinformatique du motif de reconnaissance d ... · en un assemblage d'acides...

28

Upload: dinhminh

Post on 15-Sep-2018

212 views

Category:

Documents


0 download

TRANSCRIPT

Modélisation bioinformatique

du motif de reconnaissance

d'une protéine clé de la di�érenciation

sexuelle chez S. pombe

MENEZO-SCHLOSSER Céline

Le 16 mai 2013

Table des matières

1 La problématique 4

1.1 Acquisition des données du problème . . . . . . . . . . . . . . . . . . . . . . . 41.2 Les objectifs et principales problématiques à résoudre . . . . . . . . . . . . . . 5

2 Recherche de solutions techniques :

choix du modèle utilisé 6

2.1 Séquences consensus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.2 PWM (Position-Weight Matrix ) . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.2.1 Matrice fréquentielle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.2.2 Matrice de score . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.3 Modèles de Markov caché . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.3.1 Avantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.3.2 Inconvénients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3 Résolution du problème 10

3.1 Détection du sixmer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.2 Elargissement autour du sixmer . . . . . . . . . . . . . . . . . . . . . . . . . . 103.3 Construction des PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.4 Relachement de la matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3.4.1 Calcul du score . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.4.2 Passage de la fréquence au score . . . . . . . . . . . . . . . . . . . . . . 12

3.5 Scan du génome complet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.6 Fixation d'un seuil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.7 Recherche des gênes cibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.8 Statistiques sur les sites de �xation . . . . . . . . . . . . . . . . . . . . . . . . 153.9 Interprétation des résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

1

Remerciements

Je tiens à remercier Monsieur Nicolas Thierry-Mieg pour le temps et l'attention qu'il m'aconsacrés tout au long de mon IRL, me permettant ainsi de découvrir les démarches du travailde recherche et d'approfondir mes connaissances et savoir-faire en bioinformatique. Il m'a o�ertune grande opportunité et je lui en suis très reconnaissante.

Un grand merci également à André Verdel pour m'avoir exposé les problématiques bi-ologiques liées à ce sujet.

En�n, je remercie vivement toute l'équipe BCM et l'administration du TIMC-IMAG pourleur accueil.

2

Introduction

L'ensemble des processus biochimiques par lesquels l'information héréditaire stockée dansun gène est lue pour aboutir à la fabrication de molécules qui auront un rôle actif dansle fonctionnement cellulaire (comme les protéines) constitue l'expression des gènes. Il s'agitd'un phénomène régulé à plusieurs niveaux et essentiel dans tous les processus biologiques.Le matériel génétique de l'ADN est dans un premier temps transcrit en ARN, puis traduiten un assemblage d'acides aminés qui forme une protéine. Les gènes sont exprimés di�érem-ment pour chaque cellule de l'organisme, et ce processus fait intervenir divers mécanismes derégulation à tous les niveaux (transcription, traduction, etc). On s'intéresse ici au niveau post-transcriptionnel, où les ARNs messagers peuvent être ciblés pour une dégradation rapide (aulieu d'être traduits en protéines).

Des études récentes chez la levure S. pombe montrent qu'une protéine, Mmi1, inhibe ladi�érenciation sexuelle en se �xant à des ARNs et en induisant leur dégradation. Cette levurevit habituellement sous forme haploïde (les chromosomes sont chacun en un seul exemplaire)mais dans un environnement spéci�que (vis-à-vis de l'alimentation par exemple) une di�éren-ciation sexuelle va aboutir à le formation de deux types de cellules qui, après accouplement,vont engendrer la sporulation. La protéine Mmi1 va inhiber ce phénomène en dégradant cer-tains ARNs. A ce jour, certaines cibles ARNs de Mmi1 ont été identi�ées mais pas de manièreexhaustive. L'objectif de notre travail est de s'appuyer sur ces cibles connues pour construireun modèle qui permette d'identi�er les autres cibles. Ce modèle pourra être utilisé pour in-terpréter de nouvelles données expérimentales, en cours de production par séquençage massifNext-Generation (RNA-IP-seq) et permettront de prédire de manière plus �able les cibles po-tentielles de Mmi1 dans l'ensemble du génome. Plus généralement, cette étude pourrait mettreen évidence les limites du modèle "séquence consensus" traditionnellement utilisé, et contribuerà faire adopter par la communauté scienti�que des modèles plus �ns et plus expressifs. L'étudepourrait aussi avoir des répercussions pour d'autres génomes et notamment le génome humain.

Ce sujet d'introduction à la recherche en laboratoire a été réalisé avec l'équipe BCM dulaboratoire TIMC-IMAG. Ce dernier réunit scienti�ques et cliniciens autour de l'utilisation del'informatique et des mathématiques appliquées pour la compréhension et le contrôle des pro-cessus normaux et pathologiques en biologie et santé. Son activité pluridisciplinaire contribuetant à la connaissance de base dans ces domaines qu'au développement de systèmes pour l'aideau diagnostic et à la thérapie. Huit équipes de recherche y sont réunies travaillant notammentsur la chirurgie assistée par ordinateur et l'épidémiologie. L'équipe BCM travaille sur trois axesd'étude : la génomique, la biologie des systèmes et la modélisation mathématique des systèmesbiologiques complexes. Elle développe notamment de nouvelles méthodes et des algorithmespermettant de valider des modèles mathématiques qui peuvent raisonnablement expliquer lacomplexité de données biologiques. Le travail était encadré par Nicolas Thierry-Mieg et réaliséen collaboration avec l'équipe d'André Verdel (Institut Albert Bonniot).

3

Chapitre 1

La problématique

1.1 Acquisition des données du problème

D'après les expériences réalisées par les biologistes et en se basant sur la littérature scien-ti�que, on disposait de 20 ARNs considérés comme reconnus par la protéine Mmi1 dont 15ARNs de plus haute con�ance sur lesquels baser notre étude. En relevant les noms de ces ARNson pouvait en retrouver les séquences associées grâce à Pombase. Il s'agit d'une base de don-nées complète pour la levure de �ssion Schizosaccharomyces pombe, en libre accès sur internet,fournissant des annotations structurales et fonctionnelles, rassemblant de la documentation etaccédant à des ensembles de données à grande échelle. On y relève les séquences d'ARNs surlesquelles on a constaté la �xation de la protéine Mmi1.

Chez les eucaryotes (organismes dont les cellules possèdent un noyau), il existe un pro-cessus appelé épissage par lequel les ARNs transcrits à partir de l'ADN génomique peuventsubir des étapes de coupure et ligature qui conduisent à l'élimination de certaines régions del'ARN �nal, d'où di�érents types de séquences. Les segments conservés s'appellent des exonset ceux qui sont éliminés s'appellent des introns. On sélectionne ici dans la base de données lesséquences avec CDS + UTRs + Introns, c'est-à-dire avant épissage. Les UTRs sont des sous-séquences situées aux extrémités de la séquence globale qui ne sont pas traduites alors que lesCDS constituent la séquence codante qui sera traduite (entre les UTRs). Les séquences d'ADNsont représentées par des suites de molécules organiques appelées nucléotides et représentéespar une lettre. Pour l'ADN, il existe quatre nucléotides di�érents :

� L�adénine (A)� La guanine (G)� La thymine (T)� La cytosine (C)

'Dans le cas où il reste une incertitude sur la nature du nucléotide présent en une position,

on utilise une nomenclature, le code IUPAC, qui autorise di�érents caractères en une mêmeposition. Par exemple, la lettre W correspond à un A ou un T. Les séquences récupérées sontdans des �chiers au format FASTA, un format de �chier texte utilisé pour stocker des séquencesbiologiques de nature nucléique ou protéique. Ces séquences sont représentées par une suite delettres codant pour des acides nucléiques (ou des acides aminés) selon la nomenclature IUPAC.Chaque séquence peut être précédée par un nom et des commentaires sur une ligne précédéedu signe ">".

4

Figure 1.1 � Alphabet IUPAC

1.2 Les objectifs et principales problématiques à résoudre

La reconnaissance spéci�que des ARN cibles (ceux qui seront dégradés par le protéineMmi1) dépend de la présence de sous-séquences particulières dans leurs séquences. Dans lecadre de cette étude, les biologistes nous avaient d'emblée donné un motif consensus (un sixmer :suite de 6 nucléotides) comme supposé site de �xation de la protéine Mmi1 : TNAAAC où,d'après la nomenclature IUPAC le N symbolise un nucléotide indéterminé (à cette position,les 4 nucléotides sont donc acceptées). De plus, l'état actuel des connaissances indique que lescibles connues de la protéine comportent plusieurs sites de �xation (environ 5).

L'objectif de ce travail est de prédire les cibles potentielles de Mmi1 en construisant unmodèle se basant sur les occurrences du sixmer dans les cibles connues. On pourra ensuitemodi�er ce modèle pour relacher les contraintes sur le sixmer a�n de diminuer le poids �relatif�du sixmer par rapport aux autres positions. L'idée est ici de corriger un biais de la premièreétape, qui a consisté à se baser initialement uniquement sur les �match� exacts au sixmer, alorsque, potentiellement, nous attendons que des séquences ne comportant pas le sixmer exactpuissent néanmoins être les cibles de la protéine Mmi1. On pourra ensuite �xer un seuil àpartir duquel on considèrera que la séquence est une cible de la protéine Mmi1 et scanner legénome complet de la levure pour identi�er les sites de �xation. En�n, pour rendre le résultatfacilement exploitable pour les biologistes, on pourra faire une correspondance entre ces sitesde �xation et les gênes dans lesquels ils se trouvent ainsi que les propriétés associées à ces gênes.Il conviendra alors d'étudier les corrélations entre la �xation e�ective de la protéine Mmi1 etle nombre de sites cibles contenus dans un même gène et d'en tenir compte pour prédire lescibles.

5

Chapitre 2

Recherche de solutions techniques :

choix du modèle utilisé

2.1 Séquences consensus

Une séquence consensus est une représentation de la séquence sous forme d'expressionréguilère. Pour chaque nucléotide, on dispose donc d'une information de nature booléenne :une lettre est accepté ou non selon celle de la séquence consensus. Ce modèle ne permet pasde prendre en compte les préférences relatives pour certains nucléotides et encore moins lesdépendances entre les nucléotides.

2.2 PWM (Position-Weight Matrix )

Si l'on se place dans le cadre d'un modèle de Bernoulli, où les di�érentes positions sontindépendantes entres elles, une matrice poids-position permet de représenter l'information : enchaque position, on calcule la fréquence d'apparition de chacun des caractères.

2.2.1 Matrice fréquentielle

Cette matrice possède L colonnes et V lignes, où V est la cardinalité de l'alphabet (ici 4pour les 4 nucléotides) et L la longueur du motif recherché. Pour chaque position i, on notenBi le nombre d'occurrences de la base B et N le nombre de séquences étudiées. Une hypothèseforte du modèle est l'indépendance des résidus : chaque colonne de la matrice se comporteindépendamment des autres. Notons pBi la fréquence observée de la lettre B :

pBi =nBi

N

On approxime ainsi la probabilité de présence d'un nucléotide mesurée en une position i.

2.2.2 Matrice de score

Il faut savoir que les proportions de chaque nucléotide dans le génome ne sont pas équiv-alentes (les 4 n'ont pas une probabilité d'apparition de 0,25). Les probabilités présumées dechacun de nucléotides constituent le background model dont il faudra tenir compte dans lescalculs.

6

# Definition du background (ici celui de la levure Schizosaccharomyces pombe)

l_seq.background = {'A': 0.32, 'C': 0.18, 'T': 0.32, 'G': 0.18}

On note backB la fréquence empirique observée sur le génome (en se basant sur le background).

Calcul classique du score

Le rapport pBi/backB mesure l'écart de la distribution observée à celle attendue aléatoire-ment. Pour que le score soit aisé à calculer, c'est à dire mette en jeu des additions plutôt quedes multiplications, on prend généralement le logarithme du rapport, log( pBi

backB) et pour une

séquence S de longueur L on obtient le score :

score(S) =L∑i=1

log(pBi

backB) (2.2.1)

Les B représentent ici les bases successives de la séquence S.

Calcul du score avec pseudo-comptes

Il peut potentiellement arriver qu'un caractère ne soit jamais présent en une position donnéedans les séquences. Dans ce cas, le score n'est plus dé�ni car

log(0) = −∞

On corrige alors pBi à l'aide de pseudo-comptes :

pBi =nBi + 1

N + V

score(S) =L∑i=1

log

nBi+1nAi+nCi+nTi+nGi+4

backB(2.2.2)

Conclusion

Ainsi, il existe deux représentations possibles des PWM : les matrices fréquentielles et lesmatrices de score. Ces modèles s'avèrent tous deux pertinents pour résoudre notre problème.

2.3 Modèles de Markov caché

Un automate de Markov à états cachés est un quadruplet {S,Π, A,B} des ensembles décritssuivant :

� Si l'état i ;� πi la probabilité que Si soit l'état initial� aij la probabilité de la transition Si → Sj

� bi(k) la probabilité d'émettre le symbole k étant dans l'état Si

avec les contraintes suivantes :�∑

i πi = 1 la somme des probabilités des états initiaux est égale à 1� ∀i,

∑j aij = 1 la somme des probabilités des transitions partant d'un état est égale à 1

� ∀i,∑

k bi(k) = 1 la somme des probabilités des émissions depuis un état est égale à 1

7

Il y a trois exemples typiques de problèmes que l'on peut chercher à résoudre avec cemodéle :

1. Connaissant l'automate, calculer la probabilité d'une séquence particulière quelque soitle chemin emprunté pour l'obtenir (grâce à l'algorithme de Viterbi)

2. Connaissant l'automate, trouver la séquence la plus probable d'états (cachés) ayant con-duit à la génération d'une séquence de sortie donnée (grâce à l'algorithme de Viterbi)

3. Chercher d'autres occurences du motif et leurs probabilités d'apparition (grâce à l'algo-rithme de Baum-Welch)

Les modèles de Markov partagent de nombreuses caractéristiques communes avec la représen-tation PWM. Néanmoins, dans le cas général, ces modèles permettent d'exprimer plus de sub-tilités que le modèle matriciel et notamment la dépendance entre les positions des cibles. Ilconvient donc d'étudier la pertinence de ces modèles dans le cadre de notre étude.

2.3.1 Avantages

Pour compenser la perte d'information due à l'hypothèse d'indépendance des colonnes dumodèle de Bernoulli sur lequel se basent les PWM, on peut utiliser une chaîne de Markovcachée. Cela correspond à un automate stochastique qui apporte une plus grande souplessedans la structure du motif pour di�érentes raisons :

1. La connaissance actuelle du motif se limite à un sixmer mais on cherche à étendre la taillede ce motif. On voudrait pouvoir e�ectuer des insertions ou délétions sur le motif élargi.Dans le cadre de la représentation matricielle, ce type de modi�cation impliquerait decréer une nouvelle matrice, ce qui alourdirait nettement les calculs alors que dans le cadredes modèles de Markov caché, se basant sur le principe d'un automate, ce sera beaucoupplus simple.

2. On peut envisager la présence de dinucléotides (si on connait deux nucléotides néces-sairement sucessifs), trinucléotides...

3. Cette représentation permettrait de modéliser des dépendances entre di�érentes positionsdu site.

2.3.2 Inconvénients

Les modèles de Markov caché nécessitent de prendre en compte divers paramètres. Or,dans le cadre de notre étude, nous ne disposons pas d'assez de données pour les dé�nir. Ene�et, une généralisation parait impossible car la dé�nition des paramètres serait réalisée defaçon à obtenir des résultats cohérents basés sur nos données mais nous ne pourrions en dé-duire un résultat exploitable pour un autre jeu de données. Cependant, de nouvelles donnéesexpérimentales, en cours de production par séquençage massif Next-Generation (RNA-IP-seq)permettraient éventuellement d'envisager l'utilisation de ces modèles.

8

2.4 Conclusion

En conclusion, le modèle des PWM smble particulièrement adapté à notre étude.D'un point de vue technique, il existe di�érentes alternatives pour résoudre le probléme.

1. Des logiciels tels que PreDetector qui limitent la taille des données en entrée et imposentdes fonctionnalités restrictives.

2. Le langage R.

3. Le langage C++ disposant de librairies spéci�ques telles que motility.

4. Le langage Python disposant de librairies spéci�ques telles que Biopython aux fonction-nalités variées et facilement adaptables.

Le chapitre suivant présente donc la résolution de notre problème en se basant sur la représen-tation matricielle et en implémentant des solutions en Python.

9

Chapitre 3

Résolution du problème

3.1 Détection du sixmer

Une première étape consiste à chercher dans nos ARNs cibles les motifs de �xation présumésde la protéine Mmi1 ce qui revient à rechercher le sixmer dans ces séquences d'ARN. Grâceaux fonctions de la bibliothèque Biopython, on va créer une liste dans laquelle on stocke toutesles occurences du sixmer et leurs positions.

3.2 Elargissement autour du sixmer

On considère ici le cas où le site de �xation de la protéine Mmi1 serait de taille supérieure àsix. On utilise alors une variable taille_ajout représentant le nombre de nucléotides que l'on vaconsidérer de chaque côté de notre sixmer. On obtient ainsi des motifs de taille 2∗taille_ajout+6. Si cet élargissement s'avère impossible car on a détecté le sixmer à proximité des extrémitésde la séquence connue, on dispose de trois alternatives :

1. Ignorer les sixmer concernés mais cela implique une perte d'information du côté où laséquence était connue

2. Chercher dans le génome complet (accessible sur Pombase) la suite de la séquence maiscela dépend de la con�ance attribuée aux choix des annotations concernant l'initialisationet la �n de la transcription sur Pombase

3. Reconsidérer la PWM avec des données manquantes

On choisit ici cette troisième alternative et on utilise l'aphabet �gapped� de la nomenclatureIUPAC, c'est à dire que l'on met �-� aux positions auxquelles on ne connait pas la séquence.

On adaptera alors les calculs à cette potentielle absence de donnée. Par exemple, pourles matrices fréquentielles, au lieu de diviser le nombre de nucléotide de chaque type à uneposition donnée par le nombre total de séquences, on le divisera par le nombre de séquencesoù l'on dispose d'une information en cette position.

10

3.3 Construction des PWM

La librairie Biopython met à disposition des fonctions permettant de calculer les PWM,qu'il a fallu adapter à une potentielle absence de données. Le code associé à ces fonctions setrouve en annexe.

3.4 Relachement de la matrice

On peut à présent modi�er les PWM pour relacher les contraintes sur le sixmer a�n dediminuer le poids �relatif� du sixmer par rapport aux autres positions. Initialement on serestreignait aux �match� exacts au sixmer alors que, potentiellement, nous attendons que desséquences ne comportant pas le sixmer exact puissent être les cibles de la protéine Mmi1.Pour cela, nous considérons que la probabilité pour le nucléotide présent dans le sixmer estréduite de 1, 0 à 0, 85 et augmentée de 0 à 0.05 pour les autres. Néanmoins cette informationest fréquentielle et nous utilisons ici des matrices de score. Or il existe deux méthodes de calculdes scores : avec ou sans pseudo-comptes.

3.4.1 Calcul du score

Exemple de calcul de score

Prenons l'exemple du cas suivant :Avec un background de A : 0,25 ; C : 0,25 ; T : 0,25 ; G : 0,25

numéro séquence nucléotide 1 nucléotide 2 nucléotide 3 nucléotide 41 A C C A2 A T C A3 A G A C4 T C G Tscore de A (classique) 2.2.1 1.09 impossible 0 0.69score de A (pseudo-comptes) 2.2.2 0.69 −0.69 0 0.40

Les résultats di�èrent selon la méthode utilisée.

Remarque

Fusionner les méthodes semble contre-indiqué puisque les valeurs de score di�èrent. Néan-moins, pour un grand nombre de séquence, ces valeurs vont tendre l'une vers l'autre, car lescore calculé avec pseudo-compte tendra vers le score calculé sans pseudo-compte.

11

3.4.2 Passage de la fréquence au score

Résolution

Le passage de la fréquence au score est trivial en choisissant la première méthode 2.2.1.

Par exemple pour relacher à 0, 85 on calcule log0, 85

0, 25(en prenant le cas du background de

l'exemple ci-dessus).Cependant, ce n'est pas aussi simple avec la seconde méthode. En e�et, à partir de la fréquence(freq = nBi

nAi+nCi+nTi+nGi) on ne peut pas accéder aux informations séparément que sont nBi et

nAi + nCi + nT i + nGi. En e�et 0, 85 =85

100=

170

200mais

85 + 1

100 + 46= 170 + 1

200 + 4.

Néanmoins on calcule simplement nAi +nCi +nT i +nGi en comptant le nombre de séquence (cequi constitue un unique calcul) ou en comptant systématiquement les séquences e�ectives pourtraiter le cas des �-� en l'absence de données (autant de calcul que la séquence la plus longue).Grâce à cette information supplémentaire on peut calculer nBi = freq ∗ (nAi +nCi +nT i +nGi)et �nalement calculer le ratio 2.2.2.

Observations

En e�ectuant le relachement à l'étape du calcul de la PWM, on dispose de nA + nC +nT + nG. Dans notre implémentation, pour ne pas calculer le relachement systématiquement,on choisit de le réaliser dans une seconde étape. La di�érence majeure se situe dans le nombrede calculs que l'on fait. En considérant que l'on peut avoir des �-� ou non, on ne calcule pasnA +nC +nT +nG de la même manière. Sinon, en e�ectuant le relachement au moment mêmede l'élaboration de la PWM on peut économiser le temps de ce calcul.

En conclusion, si toutes les fréquences étaient non-nulles, on ne serait pas obligés d'utiliserdes pseudo-comptes. Dans le cas général, il faut les utiliser et par souci de cohérence, onl'applique à toutes les positions (y compris celles du sixmer).

On remarque néanmoins que le temps de calcul de cette étape est très négligeable devantcelui du scan du génome.

3.5 Scan du génome complet

On relève sur Pombase les séquences des trois chromosomes de la levure S.pombe et on faitglisser notre matrice de score relachée (de taille 2∗taille_ajout+6) sur le génome complet. Onva alors sommer les scores associés à chaque nucléotide pour toutes les positions adoptées parla matrice. Ainsi on va sommer le score associé aux 2 ∗ taille_ajout+ 6 nucléotides concernéspar une position donnée de la matrice. On associe ainsi un score à chaque position du génome.On peut aussi remarquer que le génome contient également des N et pour que cette positiontotalement neutre n'impacte pas les scores que l'on trouve, on lui associe un score nul. En�n,il convient de déterminer un seuil en deça duquel on considèrera que la probabilité n'est passu�sante pour que cette position puisse être considérée comme une cible de la protéine Mmi1.On ne gardera donc que les positions associées à des scores supérieurs à ce seuil.

12

3.6 Fixation d'un seuil

Pour �xer le seuil au delà duquel on considèrera avoir une cible potentielle de la protéineMmi1, il convient de tracer un histogramme représentant les e�ectifs de chaque score trouvé.Pour le chromosome 1, on obtient un considérable pic dans les scores négatifs. Cela correspond

Figure 3.1 � Scores obtenus en scannant le chromosome 1 avec taille_ajout = 10

à nos attentes puisque la majorité des motifs de taille 2 ∗ taille_ajout+ 6 du génome ne sontpas des bons sites de �xation pour Mmi1. Pour avoir plus de précision dans les scores positifs(là où sont normalement les occurrences du site de liaison e�ectif), on peut passer l'axe des Yen échelle logarithmique a�n d'écraser le pic principal et de zoomer sur ce qui se passe dansles scores positifs.

A�n de déterminer le seuil au delà duquel on va considérer que les scores des sites sontsu�samment élevés pour considérer qu'il s'agit de sites de �xation de la protéine Mmi1, onva générer une séquence aléatoire tenant compte du background. En comparant les résultatsobtenus par cette séquence aléatoire et ceux du génome de la levure S.pombe, on va pouvoirdéterminer à partir de quels scores on relève des di�érences et ainsi �xer un seuil adapté.

Dans les scores positifs, une di�érence entre les résultats respectifs de la séquence aléatoireet du chromosome est perceptible à partir d'un score égal à 2. Cependant, il semble correctde considérer que cette di�érence est signi�cative à partir d'un score égal à 5,5. En e�et sion génère une séquence aléatoire de la même taille que le chromosome 1, 4799 séquences duchromosome dépassent ce seuil contre 706 séquences aléatoires pour un seuil de 5,5. Cette nettedi�érence est su�sante à montrer que les sites dont les scores dépassent ce seuil se distinguentde sites générés aléatoirement et donc peuvent être relevés comme sites de �xation poten-tiels. Augmenter le seuil diminuera le risque d'avoir des faux positifs, c'est-à-dire de considérerqu'une séquence générée aléatoirement puisse être la cible de la protéine Mmi1. Toutefois, unseuil trop élevé éliminerait à tort des sites de �xation. Choisir un seuil de 5,5 semble être uncompromis correct en vu de notre jeu de données.

seuil = 5, 5 (3.6.1)

13

Figure 3.2 � Scores obtenus en scannant le chromosome 1 avec taille_ajout = 10, échellelogarithmique, bins=1000

Figure 3.3 � Comparaison entre une séquence aleatoire et le chromosome 1 avec taille_ajout= 10, échelle logarithmique, bins=100

14

Remarque

Il existe une di�érence entre le relachement de la matrice et la détermination de ce seuil :le relachement revient a diminuer le poids relatif du sixmer par rapport aux autres positionsalors que diminuer le cuto� ne change pas le poids relatif des di�érentes positions. Il est po-tentiellement envisageable de compenser un �non-match� du sixmer avec les positions latéralesles plus signi�catives.

3.7 Recherche des gênes cibles

Nous avons jusque là trouvé les positions les plus susceptibles d'être les cibles de la protéineMmi1 et a�n de rendre ce résultat plus facilement exploitable par les biologistes, il convientd'accéder aux gênes concernés. La base de données permet de faire des correspondances entreles positions dans le génome et les gênes impliqués puis entre un gêne et ses propriétés.

Au �nal, on retourne un tableau contenant toutes les positions cibles (c'est-à-dire dontle score dépasse le seuil que l'on a �xé) de la protéine Mmi1 avec des données sur les gênes àcette position.

3.8 Statistiques sur les sites de �xation

Il convient également de remarquer qu'avec le modèle choisi, plusieurs sixmers présentsdans la même séquence sont considérés comme indépendants. Or il est connu qu'il y ait unecorrélation entre la �xation e�ective de la protéine Mmi1 et le nombre de sites cibles présents :un site de �xation ne su�t certainement pas à relever la �xation de la protéine à l'échelle dela séquence. Toutes les cibles connues de la protéine ont au moins 5 sites de �xation. On peutdonc envisager de prendre en compte d'autres paramètres tels que :

1. le nombre de sites par gène

2. le nombre de sites par KB de gène (ce qui revient à normaliser par la taille des gènes)

3. la distance entre les sites de �xation

Dans le cadre de cet IRL, on se limite à ce premier critère : le nombre de sites par gène. On écritdonc une fonction associant à chaque gène le nombre de sites cibles, celui-ci étant directementlié au seuil choisi précédemment.

15

3.9 Interprétation des résultats

Le raisonnement de cette étude se base sur l'idée d'élargir le sixmer à ses bases voisines.Pour taille_ajout = 1, on ne trouve pas que les bases voisines au sixmer aient des scoressu�sants pour être considérés comme informatifs sur les sites de �xation de la protéine Mmi1 :les nucléotides ayant les scores les plus élevés (T et C) ont des scores respectifs de l'ordre de0.2 et 0.5 alors que dans le sixmer les mêmes nucléotides ont des scores de l'ordre de 1.6 et2.5. Le relachement de la matrice permet de relativiser l'importance du sixmer. En choisissantdes probabilités de 85% pour les bases du sixmer, on restreint ces derniers scores à 0.97 et 1.6mais cela ne su�t pas à considérer que les bases voisines ont des probabilités signi�catives. Ilparait néanmoins normal que les bases touchant le sixmer ne soient pas tellement informativespuisque, si c'était le cas, elles auraient déjà été détectées et on étudierait d'emblée un motif detaille supérieur à six. Il convient d'étudier l'in�uence de taille_ajout et ainsi de déterminerla plus petite taille_ajout permettant de faire ressortir le plus de positions signi�catives.Pour taille_ajout = 10, on relève à une distance 5 à 7 du sixmer des scores particulièrementélevés pour A : 0.36, 0.36 et 0.62. Le score étant de 0.97 dans le sixmer relaché, on peut doncconsidérer que ces positions sont relativement signi�catives. Le motif de �xation de la protéineMmi1 qui était jusque là connu comme �TNAAAC� pourrait ainsi être étendu en considérantune forte probabilité d'apparition de trois A à trois nucléotides à la droite du sixmer. Or, parceque le nombre de séquences sur lequelles a été construit la PWM est assez faible (15 ARNsreprésentant une centaine de sites) et parce que ces scores restent modérément signi�catifs, onne peut pas a�rmer ce résultat de façon certaine. Pour conclure sur l'acceptation de nouveauxnucléotides dans le motif, il faut que l'écart entre leurs probabilités et le background soit assezsigni�catif. En tenant compte de ces observations, il semble ainsi qu'il faille une taille_ajoutsupérieure à 7. Or au delà de ces positions, en ayant étudié les résultats obtenus jusqu'àtaille_ajout = 30, on ne relève pas de score signi�cativement élévé donc aucun nucléotide nesemble particulièrement favorisé.

taille_ajout = 7 (3.9.1)

On se limite à taille_ajout = 7 car élargir excessivement la matrice introduirait une pertede précision pour la suite : plusieurs positions latérales ayant des scores positifs permettraientrapidement de compenser une mauvaise base dans le sixmer. D'ailleurs, l'utilisation d'une ma-trice de score introduit un calcul logarithmique qui �écrase� les gros scores (ceux du sixmer)et �ampli�e� les petits, d'où, l'importance de choisir un seuil su�samment élevé. En ce quiconcerne le relachement de la matrice, choisir 85% plutôt que 100% pour les bases du sixmersemble être un bon compromis car un relachement plus conséquent n'attribuearait pas assezd'importance au sixmer.

On remarque néanmoins que ces positions signi�catives sont toutes à droite du sixmeret qu'il est donc pertinent d'élargir la matrice de 7 bases à droite mais pas nécessairement àgauche. Dans le cadre de cette étude, on nous demandait un élargissement symétrique autourdu sixmer mais cette contrainte pourrait être remise en question par nos résultats.

16

On peut ensuite étudier le nombre de sites cibles par gène. Une donnée du problème reposesur la nécessité d'au moins 5 sites de �xation pour obtenir une cible. Pour a�ner ce chi�re, oncalcule le nombre de sites par gène pour di�érents seuils.

Pour le chromosome 1, pour un seuil de 4, la majorité des gènes possèdent entre 1 et30 sites mais certains ont 42, 65 voire 81 sites de �xation présumés. Ce résultat sembleraitindiquer que les sites cibles sont regroupés sur certains mêmes gènes. Ces gênes seraient donctout particulièrement concernés par la �xation de la protéine Mmi1.

Cependant, nous avons montré qu'un seuil de 4 est insu�sant pour sélectionner les sites eton a choisi un seuil de 5,5. Avec ce seuil, 54 gênes ont entre 5 et 21 sites de �xation et peuventainsi être considéré comme des cibles de la protéine Mmi1.

En augmentant le seuil de sélection, ce résultat serait remis en question : pour un seuilde 7, on trouve au maximum 3 sites de �xation par gènes et 1 site pour la majorité desgènes, ce qui con�rme qu'un tel seuil serait excessivement élevé et contredirait les données duproblème.

17

Conclusion

En se basant sur les occurrences du sixmer dans les cibles connues et le génome de la levureS. pombe, nous avons pu améliorer la connaissance des cibles potentielles de la protéine Mmi1.Notre étude s'est basée sur le modèle des matrices poids-positions (PWM) dans lesquelles nouspouvions relacher les contraintes sur le sixmer a�n de diminuer le poids �relatif� du sixmer parrapport aux autres positions. Cela nous permettait de ne pas limiter notre étude aux �match�exacts du sixmer mais de prendre en compte d'autres cibles potentielles.

Nous avons �nalement relevé des positions signi�catives en étendant le génome de septnucléotides à droite du sixmer. L'apparition de trois A semble en e�et favorisée à 5 nucléotidesà droite du sixmer connu. Un plus large jeu de données permettrait de con�rmer ce résultat.Par ailleurs, notre étude nous permet d'évaluer qu'un site du génome est considéré commecible de la protéine Mmi1 pour un score supérieur à 5,5.

Pour rendre nos résultats plus facilement exploitables par les biologistes, nous renvoyonsun tableau associant pour chaque position cible de la protéine selon le seuil �xé le gène danslequel elle se situe ainsi que les propriétés associées à ce gêne. Toutefois, on peut noter qu'unjeu de données plus fourni permettrait d'envisager l'utilisation des modèles de Markov cachéet ainsi d'obtenir potentiellement des résultats plus précis.

D'autre part, nous avons étudié les corrélations entre la �xation e�ective de la protéineMmi1 et le nombre de sites cibles contenus dans un même gène. Un gêne sera une cible de laprotéine Mmi1 s'il a plus de 5 sites de �xation et étant donné le seuil que nous avons �xé ungène peut avoir jusqu'à 21 sites de �xation. Il pourrait être intéressant de tenir compte de plusde paramètres concernant les sites de �xation et notamment la distance entre chacun d'entreeux.

18

Bibliographie

[1] Chih Lee and Chun-Hsi Huang. Searching for transcription factor binding sites in vectorspaces. 2012.

[2] Xin Chen, Lingqiong Guo, Zhaocheng Fan, and Tao Jiang. Learning position weightmatrices from sequence and expression data. 2007.

[3] Mathieu Giraud and all. Recherches de motifs et de similarites en bioinformatique :modelisations, solutions logicielles et materielles. 2007.

[4] Ra�k A. Salama and Dov J. Stekel. Inclusion of neighboring base interdependencies sub-stantially improves genome-wide prokaryotic transcription factor binding site prediction.Epub, 38, 2010.

[5] Martin Tompa, Nan Li, Timothy L Bailey, and George M Church. Assessing computationaltools for the discovery of transcription factor binding sites. Nat Biotechnol, 23 :137�44,2005.

[6] Harigaya Y. Selective elimination of messenger rna prevents an incidence of untimelymeiosis. Nature, 442 :45�50, 2006.

[7] Hiriart E. Mmi1 rna surveillance machinery directs rnai complex rits to speci�c meioticgenes in �ssion yeast. EMBO J., 31 :2296�308, 2012.

[8] R.Durbin, S.Eddy, A.Krogh, and G.Mitchison. Biological sequence analysis. CambridgeUniversity Press, 1998.

[9] S. Robin, J. Daudin, H. Richard, M. Sagot, and S. Schbath. Occurrence probability ofstructured motifs in random sequences. Journal of Computational Biology, 9 :761�773,2001.

[10] G. Nuel. S-spatt : simple statistics for patterns on markov chain. Bioinformatics, 21 :3052,2005.

19

Annexe : code en python

Réalisation générale

from Bio import SeqIO

from Bio.Seq import Seq

from Bio import Motif

from Bio.Alphabet import Gapped

from Bio.Alphabet import IUPAC

from collections import Counter

import matplotlib.pyplot as plt

import print_pwm, scan_gen, fct_pwm, math, chro_info, stats_sites_gen, gen_alea

# Alphabet (comprenant le - pour l'absence de donnees)

alphabet=Gapped(IUPAC.unambiguous_dna)

#####################################################################

# Ouverture du fichier contenant les sequences

#####################################################################

f=open("data/database15ARN.adn")

# Liste contenant les differentes sequences

seq_list=list(SeqIO.parse(f,"fasta",alphabet))

f.close()

#####################################################################

# Recherche du 6mer

#####################################################################

sixmer = Motif.Motif(alphabet) # Motif recherche

#sixmer.add_instance(Seq('TNAAAC', sixmer.alphabet))

#MotifTools.Motif_from_text('TNAAAC') Variante pour initialiser un motif

sixmer.add_instance(Seq('TAAAAC', sixmer.alphabet))

sixmer.add_instance(Seq('TTAAAC', sixmer.alphabet))

sixmer.add_instance(Seq('TCAAAC', sixmer.alphabet))

sixmer.add_instance(Seq('TGAAAC', sixmer.alphabet))

# Matches_list : liste contenant pour chaque ARN les occurences du sixmer

matches_list = []

for elem_seq_list in seq_list:

# on ajoute la liste de correspondance vis-a-vis du sixmer

# dans matches_list pour l'"elem_seq_list" (la sequence) traite

# et recherche du sixmer

matches_list.append(sixmer.search_instances(elem_seq_list.seq))

# liste des sites (sous forme de string)

l_seq = Motif.Motif(alphabet)

20

# Definition du background (ici celui de la levure etudiee)

l_seq.background = {'A': 0.32, 'C': 0.18, 'T': 0.32, 'G': 0.18, '-' : 0.00}

#####################################################################

# Extension (de taille taille_ajout) du sixmer a gauche et a droite

#####################################################################

taille_ajout = 7;

# on mets des - en l'absence de donnees sur les bords

for i in range(len(matches_list)):

for pos,seq in matches_list[i]:

if pos-taille_ajout < 0:

chaine = '-'*(taille_ajout-pos) + seq_list[i].seq.tostring()

[0:pos+len(sixmer)+taille_ajout] + '-'*

(pos+len(sixmer)+taille_ajout - len(seq_list[i]))

else:

chaine = seq_list[i].seq.tostring()[pos-taille_ajout:pos+

len(sixmer)+taille_ajout] + '-'*(pos+len(sixmer)+taille_ajout

- len(seq_list[i]))

l_seq.add_instance(Seq(chaine,l_seq.alphabet))

#####################################################################

# PWM

#####################################################################

# Matrice frequentielle

pwm_TNAAAC_bg1 = fct_pwm.pwm(l_seq,laplace=False) #l_seq.pwm(laplace=False)

print_pwm.print_pwm(pwm_TNAAAC_bg1,True)

l_seq.weblogo("image.png", res=192)

#Matrice de score

pwm_TNAAAC_bg1_score = fct_pwm.log_odds(l_seq,laplace=False)

print_pwm.print_pwm(pwm_TNAAAC_bg1_score,False)

print '\n'

#####################################################################

# Relaxation de la matrice de score

#####################################################################

#### On relaxe a partir de la ligne numero "taille_ajout"

#### On considere que le sixmer a relaxer est TNAAAC

#### Donc on relaxe T puis AAAC.

pwm_TNAAAC_bg1_score[taille_ajout]['T'] = math.log(0.85/l_seq.background['T'])

pwm_TNAAAC_bg1_score[taille_ajout]['A'] = math.log(0.05/l_seq.background['A'])

pwm_TNAAAC_bg1_score[taille_ajout]['C'] = math.log(0.05/l_seq.background['C'])

pwm_TNAAAC_bg1_score[taille_ajout]['G'] = math.log(0.05/l_seq.background['G'])

pwm_TNAAAC_bg1_score[taille_ajout+2]['A'] = math.log(0.85/l_seq.background['A'])

pwm_TNAAAC_bg1_score[taille_ajout+2]['T'] = math.log(0.05/l_seq.background['T'])

pwm_TNAAAC_bg1_score[taille_ajout+2]['C'] = math.log(0.05/l_seq.background['C'])

pwm_TNAAAC_bg1_score[taille_ajout+2]['G'] = math.log(0.05/l_seq.background['G'])

pwm_TNAAAC_bg1_score[taille_ajout+3]['A'] = math.log(0.85/l_seq.background['A'])

pwm_TNAAAC_bg1_score[taille_ajout+3]['T'] = math.log(0.05/l_seq.background['T'])

pwm_TNAAAC_bg1_score[taille_ajout+3]['C'] = math.log(0.05/l_seq.background['C'])

21

pwm_TNAAAC_bg1_score[taille_ajout+3]['G'] = math.log(0.05/l_seq.background['G'])

pwm_TNAAAC_bg1_score[taille_ajout+4]['A'] = math.log(0.85/l_seq.background['A'])

pwm_TNAAAC_bg1_score[taille_ajout+4]['T'] = math.log(0.05/l_seq.background['T'])

pwm_TNAAAC_bg1_score[taille_ajout+4]['C'] = math.log(0.05/l_seq.background['C'])

pwm_TNAAAC_bg1_score[taille_ajout+4]['G'] = math.log(0.05/l_seq.background['G'])

pwm_TNAAAC_bg1_score[taille_ajout+5]['C'] = math.log(0.85/l_seq.background['C'])

pwm_TNAAAC_bg1_score[taille_ajout+5]['T'] = math.log(0.05/l_seq.background['T'])

pwm_TNAAAC_bg1_score[taille_ajout+5]['A'] = math.log(0.05/l_seq.background['A'])

pwm_TNAAAC_bg1_score[taille_ajout+5]['G'] = math.log(0.05/l_seq.background['G'])

print_pwm.print_pwm(pwm_TNAAAC_bg1_score,False)

print '\n'

# Pour comparer les scores des positions laterales selon taille_ajout

#for pos in range(len(pwm_TNAAAC_bg1_score)):

# max = 0

# for base in ['A', 'T', 'C', 'G']:

# if max < pwm_TNAAAC_bg1_score[pos][base]:

# max = pwm_TNAAAC_bg1_score[pos][base]

# print pos, max

# pour trouver l'indice du plus grand score:

# tab_scan = scan_gen.scan_gen(pwm_TNAAAC_bg1_score,

"AAAAAAAAAAAAAATAAAACGGGGGGTTAAACGTACAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAA")

# tab_scan.index(max(tab_scan))

#####################################################################

# Ouverture des fichiers contenant le genome de la levure

#####################################################################

chro_1=open("data/Schizosaccharomyces_pombe.ASM294v1.17.dna.chromosome.I.fa")

# Liste contenant les differentes sequences

seqchro_list=list(SeqIO.parse(chro_1,"fasta",alphabet))

chro_1.close()

#####################################################################

# Scan du genome

#####################################################################

print len(seqchro_list[0].seq)

tab_scan_chro_1 = scan_gen.scan_gen(pwm_TNAAAC_bg1_score, seqchro_list[0].seq)

# seqchro_list[0].seq[4142277+taille_ajout:4142277+taille_ajout+6]

#####################################################################

# Sequence aleatoire pour determiner seuil

#####################################################################

seq_alea = gen_alea.random_seq(l_seq.background, 1000000)

tab_scan_alea = scan_gen.scan_gen(pwm_TNAAAC_bg1_score, seq_alea)

#####################################################################

# Histogramme visant a determiner le seuil

#####################################################################

plt.hist(tab_scan_chro_1, bins=100, normed=True, log=True, alpha = 0.5)

22

plt.hist(tab_scan_alea, bins=100, normed=True, log=True, alpha = 0.5)

plt.show()

#####################################################################

# Association positions -> genes et proprietes

#####################################################################

cut_off = 5.5

nb_chro_1 = 0

nb_alea = 0

for elem in tab_scan_chro_1:

if elem >= cut_off:

nb_chro_1 += 1

for elem in tab_scan_alea:

if elem >= cut_off:

nb_alea += 1

print nb_chro_1, nb_alea

res_scan = scan_gen.get_pos(tab_scan_chro_1, cut_off )

chro_info.link_info(res_scan, "data/chromosome1.coords")

chro_info.link_sysID2product(res_scan)

chro_info.print_info(res_scan)

chro_info.save_info(res_scan, "data/res_scan.txt")

stats_sites_gen.stats_sites_gen(res_scan, "data/stats_gen.txt")

chro_2=open("data/Schizosaccharomyces_pombe.ASM294v1.17.dna.chromosome.II.fa")

# Liste contenant les differentes sequences

#seqchro2_list=list(SeqIO.parse(chro_2,"fasta",alphabet))

chro_2.close()

#tab_scan_chro_2 = scan_gen.scan_gen(pwm_TNAAAC_bg1_score, seqchro2_list[0].seq)

#plt.hist(tab_scan_chro_2, bins=100, normed=True)

#plt.show()

chro_3=open("data/Schizosaccharomyces_pombe.ASM294v1.17.dna.chromosome.III.fa")

# Liste contenant les differentes sequences

#seqchro3_list=list(SeqIO.parse(chro_3,"fasta",alphabet))

chro_3.close()

#tab_scan_chro_3 = scan_gen.scan_gen(pwm_TNAAAC_bg1_score, seqchro3_list[0].seq)

#plt.hist(tab_scan_chro_3, bins=100, normed=True)

#plt.show()

Fonction de calcul des PWM

from Bio.SubsMat import FreqTable

from Bio.Alphabet import IUPAC

from Bio.Seq import Seq

import math,random

########################################################

# Adaptation des fonctions biopython a l'alphabet gapped

23

########################################################

def pwm(motif,laplace=True):

if motif._pwm_is_current:

return motif._pwm

#we need to compute new pwm

motif._pwm = []

for i in xrange(motif.length):

dict = {}

#filling the dict with 0's

for letter in motif.alphabet.letters:

if laplace:

dict[letter]=motif.beta*motif.background[letter]

else:

dict[letter]=0.0

if motif.has_counts:

#taking the raw counts

for letter in motif.alphabet.letters:

dict[letter]+=motif.counts[letter][i]

elif motif.has_instances:

#counting the occurences of letters in instances

for seq in motif.instances:

#dict[seq[i]]=dict[seq[i]]+1

try:

if seq[i] != '-':

dict[seq[i]]+=1

except KeyError: #we need to ignore non-alphabet letters

pass

motif._pwm.append(FreqTable.FreqTable(dict,FreqTable.COUNT,motif.alphabet))

motif._pwm_is_current=1

return motif._pwm

def log_odds(motif,laplace=True):

if motif._log_odds_is_current:

return motif._log_odds

#we need to compute new pwm

motif._log_odds = []

#pwm=motif.pwm(laplace)

for i in xrange(motif.length):

dict = {}

#filling the dict with 0's

for letter in motif.alphabet.letters:

if laplace:

dict[letter]=motif.beta*motif.background[letter]

else:

dict[letter]=0.0

if motif.has_counts:

#taking the raw counts

for letter in motif.alphabet.letters:

dict[letter]+=motif.counts[letter][i]

elif motif.has_instances:

#counting the occurences of letters in instances

for seq in motif.instances:

#dict[seq[i]]=dict[seq[i]]+1

try:

if seq[i] != '-':

dict[seq[i]]+=1

24

except KeyError: #we need to ignore non-alphabet letters

pass

d = {}

dict_count = 0;

for a in motif.alphabet.letters:

dict_count += dict[a]

for a in motif.alphabet.letters:

if a != '-':

d[a]=math.log(((dict[a]+1)/(4+dict_count))/motif.background[a],2)

motif._log_odds.append(d)

motif._log_odds_is_current=1

return motif._log_odds

A�chage matriciel

##########################################

# Affichage de matrice pwm

##########################################

def print_pwm(pwm, gapped):

for elem in pwm:

if gapped:

print 'A : %.3f | C : %.3f | T : %.3f | G : %.3f | - : %.3f'

%(elem['A'],elem['C'],elem['T'],elem['G'],elem['-'])

else:

print 'A : %.3f | C : %.3f | T : %.3f | G : %.3f'

%(elem['A'],elem['C'],elem['T'],elem['G'])

Association aux données des gènes cibles

###########################################

# A un tableau de coordonnee - score

# associe l'information du gene

###########################################

def link_info(tab_coord_score, file_chro):

f = open(file_chro,'r')

lignes = f.readlines()

f.close()

debut = 0

fin = 0

name = ""

ind_ligne = 0

split_line = lignes[ind_ligne].split()

debut = int(split_line[0])

fin = int(split_line[1])

name = split_line[-1] #-1 pour avoir le dernier element d'une liste

for i in range(len(tab_coord_score)):

cur_pos = tab_coord_score[i][0] + 1

if cur_pos >= debut and cur_pos <= fin:

25

tab_coord_score[i].append(name)

else:

while not(cur_pos >= debut and cur_pos <= fin) and cur_pos >= debut:

ind_ligne = ind_ligne + 1

split_line = lignes[ind_ligne].split()

debut = int(split_line[0])

fin = int(split_line[1])

name = split_line[-1] #-1 pour avoir le dernier element d'une liste

if cur_pos >= debut and cur_pos <= fin:

tab_coord_score[i].append(name)

else:

tab_coord_score[i].append("UNKN")

def link_sysID2product(res_scan):

f = open("data/sysID2product.txt", 'r')

lignes = f.readlines()

f.close()

for elem in res_scan:

name = elem[2]

ind = 0

f_name = lignes[ind].split('\t')[0]

while name != f_name and ind < len(lignes):

f_name = lignes[ind].split('\t')[0]

ind += 1

if ind < len(lignes):

elem.append(lignes[ind].split('\t')[-1])

else:

elem.append('\n')

def print_info(res_scan):

for elem in res_scan:

print '\t'.join(map(str, elem))

def save_info(res_scan, file_scan):

fichier = open(file_scan, "w")

for elem in res_scan:

fichier.write('\t'.join(map(str, elem)))

fichier.close()

26

Statistiques sur les sites dans un même gène

#############################################

# Compte le nombre de sites retenus par gene

#############################################

def stats_sites_gen(res_scan, file_scan):

nb_sites = {}

for ligne in res_scan:

name = ligne[2]

if nb_sites.has_key(name):

nb_sites[name] += 1

else:

nb_sites[name] = 1

print nb_sites

# ecriture des resultats

fichier = open(file_scan, "w")

for cle, valeur in nb_sites.items():

fichier.write("{} {}" .format(cle,valeur))

fichier.write('\n')

fichier.close()

Génération d'une séquence aléatoire

import random

def random_pick(background):

x = random.uniform(0,1)

cumul = 0

for letter, prob in background.items():

cumul += prob

if x < cumul:

break

return letter

def random_seq(background, size):

seq = ""

for i in range(size):

seq += random_pick(background)

return seq

27