• Aucun résultat trouvé

Création et développement d une base de données sur le VIH

N/A
N/A
Protected

Academic year: 2022

Partager "Création et développement d une base de données sur le VIH"

Copied!
27
0
0

Texte intégral

(1)

Création et développement d’une base de données sur le VIH

Stage de Licence de Biologie-Informatique

Par Stéphanie Pérot Sous la direction d’Anne Vanet Année 2005-2006

Atelier de BioInformatique

rattaché à l’Université Pierre et Marie CURIE 12 rue Cuvier F-75005 PARIS

(2)

- 1 -

Résumé

Dans le cadre de la formation Licence de BioInformatique, j’ai effectué un stage à l’Atelier de Bio-Informatique [0], sous la direction d’Anne Vanet, Maître de Conférence à Paris 7 et chargée de recherche à l’Atelier de BioInformatique. L’ABI est un laboratoire de recherche rassemblant biologistes, biophysiciens et informaticiens de provenances diverses et désirant travailler à l’interface Biologie/Informatique. J’ai réalisé la plus grande partie de mon stage l’été 2005 par initiative personnelle, puis je l’ai repris et complété durant le 2ème semestre de l’année 2005-2006. Ce stage consistait en la création et le développement d’une base de données sur le VIH, sujet sur lequel travaillent en collaboration Anne Vanet, Sophie Brouillet, Ingénieur d’Etude à Paris 6 et Emmanuelle Ollivier, Maître de Conférence à Paris 7. D’un point de vue chronologique, j’ai commencé par l’étude des bases de données en général afin d’en comprendre la logique, l’utilité et la création. Puis j’ai conçu la structure de la base et l’ai créée sous MySQL. Je me suis ensuite initiée au langage de programmation Perl en vue de comprendre et d’écrire des scripts permettant la récupération de données sur des banques existantes : Los Alamos National Laboratory (LANL), Stanford et Swissprot. Enfin, à l’aide d’HTML et de PHP, j’ai développé une interface graphique permettant une utilisation simple et visuelle de la base. A l’heure actuelle, la base n’a subit que quelques modifications et contient 115 148 séquences protéiques.

(3)

- 2 -

Remerciements

Ce stage m’a beaucoup appris autant sur un plan concret par l’apprentissage de MySQL, Perl, PHP et HTML que sur un plan plus abstrait au niveau relationnel et humain au sein du laboratoire. Un grand merci à tous les chercheurs et les thésards de l’ABI, en particulier à Anne Vanet, Sophie Brouillet et Emmanuelle Ollivier qui m’ont aidée et guidée tout au long de mon stage. Ma reconnaissance va également à Joël Pothier, directeur de l’ABI, qui m’a accueillie au sein de son laboratoire et proposé ce stage par l’intermédiaire d’Anne Vanet.

(4)

- 3 -

Sommaire

1. VIRUS HUMAIN DE L’IMMUNODEFICIENCE ... 5

1. PRESENTATION DU VIRUS... 5

2. UTILITE DE LA BASE AU SEIN DU LABORATOIRE... 6

2. BASE DE DONNEES... 7

1. MYSQL... 7

2. STRUCTURE DE LA BASE... 8

3. RECUPERATION DES DONNEES... 11

1. PERL... 11

2. CONTENU DE LA BASE... 11

4. INTERFACE GRAPHIQUE ... 12

1. PHP ET HTML ... 12

2. VISUALISATION DE LA BASE... 12

ANNEXES ... 16

BIBLIOGRAPHIE... 25

(5)

- 4 -

Introduction

Il existe des banques de données biologiques sur Internet telles LANL, Swissprot, Stanford, comportant notamment des informations sur le VIH. Cependant aucune d’entre elles n’est suffisamment exhaustive pour les besoins des chercheuses de l’ABI, avec qui j’ai travaillé. C’est pourquoi elles ont souhaité créer leur propre base de données sur le VIH grâce au recoupement des informations récupérées dans le domaine public. Après une brève description du virus et de la nécessité d’utiliser une base de données dans leur travail, je m’attacherai à présenter la structure de la base, la récupération des données et enfin la réalisation de l’interface graphique.

(6)

- 5 -

1. Virus Humain de l’Immunodéficience

1. Présentation du virus

Le Virus de l’Immunodéficience Humaine ou VIH est un rétrovirus, c’est-à-dire un virus eucaryotique contenant de l’ARN viral, ainsi qu’une ADN polymérase dépendante de cet ARN : la reverse transcriptase. Ils sont à l’intérieur d’une capside, elle-même entourée d’une enveloppe cytoplasmique de 120 nm de diamètre environ, à laquelle sont accrochées des glycoprotéines de surface, ainsi que le représente la figure 1.

Echelle : 30 nm : 1 cm

Figure 1 : Représentation schématique du rétrovirus http://en.wikipedia.org/wiki/HIV

D’un point de vue génomique et simplifié ici, le rétrovirus possède à ces extrémités de longues répétitions terminales (LTR) de 250 à 600 paires de bases (pb) et contient les gènes codants pour trois poly-protéines présentés sur la figure 2 :

gag code pour les protéines de la capside

pol produit la reverse transcriptase, l’intégrase ainsi que la protéase env donne les protéines de l’enveloppe cytoplasmique

Figure 2 : Structure du gène responsable du VIH

figure tirée du cours de génétique d’Alain Zider, professeur en LBI à Paris 7

LTR GAG POL ENV LTR

Reverse transcriptase

Capside Enveloppe cytpoplasmique

Glycoprotéine de surface

ARN viral

(7)

- 6 -

Après pénétration du rétrovirus dans la cellule hôte, la reverse transcriptase synthétise de l’ADN à partir de la matrice simple brin d’ARN, transcrivant ainsi le génome viral. Puis l’ARN est dégradé et le brin complémentaire de l’ADN synthétisé. L’ADN double brin est ensuite intégré dans l’ADN chromosomique de la cellule hôte par l’intégrase et est répliqué en même temps que l’ADN cellulaire. Dans certaines conditions, souvent lors d’une infection par un autre agent pathogène, l’ADN rétroviral est transcrit donc l’ARN viral synthétisé, les protéines exprimées et insérées ou ancrées dans la membrane plasmique de la cellule hôte et de nouveaux virions sont produits par bourgeonnement d’un fragment de membrane plasmique, couvert de protéines virales, qui englobe l’ARN du virus. Ce mécanisme est représenté sur la figure 3.

Figure 3 : Mécanisme de réplication du rétrovirus http://www.actions-traitements.org/article.php3?id_article=532

2. Utilité de la base au sein du laboratoire

Les séquences du VIH sont très largement représentées dans les banques de données existantes dans le domaine public ; plus de 125 000 séquences nucléotidiques et 120 000 séquences protéiques du VIH ont été publiées à ce jour. Cette grande variabilité vient du fait que la reverse transcriptase ne possède pas de domaine de correction et fait à peu près 100 fois plus de fautes de polymérisation que la plupart des polymérases eucaryotes et procaryotes. Elle engendre ainsi un grand nombre de mutants. Néanmoins, ces mutations ne peuvent s’accumuler sans ordre ni fin. En effet, les protéines produites par ces mutants doivent conserver une structure particulière qui assure leur fonction. Les chercheuses de

(8)

- 7 -

l’ABI se sont donc intéressées « aux mutations qui ne peuvent pas apparaître ensemble sans altérer le virus et l’empêcher de se multiplier » [1] et ont développé des méthodes d’étude. C’est dans ce contexte qu’elles ont souhaité créer une base de données qui leur permette de sélectionner facilement des lots de séquences ayant une ou plusieurs caractéristiques en commun et sur lesquelles elles puissent appliquer leurs méthodes.

2. Base de Données

1. MySQL

MySLQ signifie My Structured Query Language. C’est un système de gestion de bases de données (ajouter, lire, traiter des données) et un serveur de bases de données relationnelles (à partir du langage SQL). Le serveur MySQL est très rapide, fiable et facile à utiliser. Développé à l'origine pour gérer de grandes bases de données plus rapidement que les solutions existantes, il a été utilisé avec succès dans des environnements de production très contraints et très exigeants, depuis plusieurs années. MySLQ administre les très grandes bases de données : bases de 50 millions de lignes, 60 000 tables, 32 index de 500 octets chacun … Par défaut, les tables peuvent atteindre une taille de 4Go. Comme les tables sont stockées sous forme de fichiers, il est facile et utile d’en faire une sauvegarde [2]. MySQL gère cependant mal les problèmes de redondances, point que je n’ai découvert qu’après avoir terminé mon stage.

A l’aide de requêtes, dont quelques exemples sont présentés ici, MySLQ permet de : créer une base de données

mysql> CREATE DATABASE HIV;

créer des tables

mysql> CREATE TABLE traitement (codet VARCHAR(10), duree

VARCHAR(10), debut DATE, fin DATE, pathologie TEXT, codep VARCHAR(10));

charger des données dans les tables

mysql> INSERT INTO traitement VALUES

('T42','6','2005-03-30','2005-07-30','allergie','P25');

afficher des données sur une ou plusieurs tables

mysql> SELECT codet, pathologie FROM traitement;

mysql> SELECT codet, pathologie, codep FROM traitement WHERE pathologie = "allergie" AND codep = "P25";

(9)

- 8 -

2. Structure de la base

La réalisation d’une base de données passe par 2 étapes : le modèle mathématique appelé diagramme Entités / Associations et le modèle relationnel, c’est-à-dire les tables en elles-mêmes.

Diagramme Entités / Associations

Cette base regroupe les séquences-produits du gène POL, intégrase, protéase et reverse transcriptase, de personnes porteuses du VIH. Il y a donc un type d’entité

« génomique » avec ses caractéristiques : code séquence génomique constituant la clé primaire et définissant ainsi l’unicité des données, longueur de la séquence, lieu de séquençage, séquence nucléotidique, sous-type, code patient, code banque, code date. Cette séquence génomique code pour une ou plusieurs protéines. D’où la création d’une entité

« protéique » avec ses caractéristiques : code séquence protéique constituant la clé primaire, nom de la protéine, nom du gène, séquence protéique, séquence complète ou non, code patient, code séquence génomique. Ces 2 entités sont reliées par un type d’association

« coder ».

On peut récupérer des informations plus ou moins détaillées sur la séquence protéique, informations triées dans 2 types d’entités appelées « généralité » avec les caractéristiques : code qui constitue la clé primaire, référence PDB, code résistance aux médicaments, code résistance au système immunitaire, nom de la protéine et « conformation 3D » avec les caractéristiques : référence PDB qui constitue la clé primaire, nom de l’inhibiteur. « généralité » est liée à « protéique » par une association « détailler ».

Il a été constaté qu’une sélection de virus mutants capables de survivre à un traitement s’opère lorsque ce traitement est administré. C’est ainsi qu’apparaissent des résistances et que l’efficacité des traitements doit constamment être remise en question : les anti-rétroviraux deviennent inactifs car ils ne reconnaissent plus l’enzyme sur laquelle ils sont censés agir. D’où la création de 2 entités directement reliées à « généralité » nommées

« résistance au système [immunitaire] » et « résistance aux médicaments » avec les caractéristiques : code résistance au système [immunitaire] / aux médicaments qui constituent les clés primaires respectives des entités, position de résistance, mutation, niveau de résistance.

La séquence génomique est présente dans une au moins des banques existantes sur Internet et on veut conserver l’identifiant par lequel elle est nommée dans ces banques. D’où

(10)

- 9 -

la création d’une entité « banque » avec ses caractéristiques : code banque qui constitue la clé primaire, identifiant swissprot, nom lanl, name lanl, autre nom lanl, autre identifiant swissprot, autre nom swissprot, accession genbank, accession swissprot, nom stanford, numéro de patient stanford, numéro d’isolat stanford, traitement stanford et temps de traitement stanford. Cette entité est directement liée à « génomique » et on choisit par souci de simplification de ne pas mettre d’association.

De la même façon, on veut garder la trace des dates clés concernant la séquence.

D’où la création d’une entité « date », avec ses caractéristiques : code date constituant la clé primaire, date d’entrée de la séquence dans la base, date d’entrée de la séquence dans la base d’origine, date de dernière modification de la séquence dans la base et date de dernière modification de la séquence dans la banque d’origine. Ses entités sont reliées par l’association « saisir ».

La séquence génomique a généralement donné lieu à une ou plusieurs publications, rédigées par un ou plusieurs auteurs. D’où la création de 2 entités ; l’entité « référence » avec ses caractéristiques : code référence qui constitue la clé primaire, titre de la publication, informations (page, volume, date …), référence Medline et référence Pubmed ; et l’entité

« auteur » avec ses caractéristiques : code auteur qui constitue la clé primaire, nom et prénom. Les entités « génomique » et « référence » sont liées par une association

« publier » et les entités « référence » et « auteur » par une association « écrire ».

La séquence génomique provient d’un patient dont on connaît certaines informations quand les séquences sont issues de la banque Stanford. Cette entité est donc aussi liée, par une association « appartenir » à une entité « patient », qui sera divisée par la suite en 5 tables par souci de simplification. Cette entité a pour principales caractéristiques : code patient qui constitue la clé primaire, sexe, date de naissance, lieu de naissance, nom du test de dépistage, date de séroconversion, date de post infection, nationalité, ainsi qu’un certain nombre d’informations sur sa sexualité, sa famille, la société dans laquelle il vit et son état médical. Ces dernières informations sont liées à une entité « traitement » avec ses caractéristiques : code traitement qui constitue la clé primaire, durée, début et fin du traitement, pathologie et code patient, par l’association « suivre ». Le lieu de naissance donne suite à la création d’une entité « géographie » avec ses caractéristiques : code géographie qui constitue la clé primaire, continent, pays, région, milieu et proximité d’une voie internationale. Cette entité sert aussi à déterminer le lieu de séquençage de l’entité

« génomique ». On ne crée pas d’association entre ces entités, le lien étant direct.

(11)

- 10 -

Un traitement comporte souvent de nombreux médicaments regroupés dans une entité

« médicaments » avec ses caractéristiques : code médicament qui constitue la clé primaire, nom du médicament, composition, présentation, type, formule chimique, et dose recommandée. Ces entités sont reliées par l’association « faire partie ».

Plusieurs patients pouvant prendre le même médicament mais en posologie différente (selon le traitement ou le patient lui-même), on définit une association « prendre » définissant la posologie, entre les entités « patient » et « médicaments ». L’entité

« médicament » est aussi liée à « résistance aux médicaments » par l’association

« correspondre ».

A un patient correspond un ou plusieurs marqueurs, définis par l’entité « marqueur » avec ses caractéristiques : code marqueur qui constitue la clé primaire, nom du marqueur et séquence concernée. Un marqueur peut correspondre à plusieurs patients. Ces entités sont liées par une association « correspondre ».

Un diagramme récapitulatif de ce modèle Entités / Association est donné en annexe 1 située en fin de rapport.

Modèle Relationnel

Le diagramme Entités / Associations est utile pour une première réflexion sur la base à réaliser, mais il est ensuite nécessaire de le transformer en Modèle Relationnel pour pouvoir créer la base en elle-même grâce à MySQL. Les entités préalablement définies deviennent des tables de même nom et leurs caractéristiques des champs de mêmes clés primaires et de types logiquement définis présentés en annexe 3. Les associations sont transformées en tables lorsqu’on est en présence de relations dites « n-n » symbolisées par (1,n) ou (0,n) en amont et en aval d’une association. C’est le cas lorsque deux entités A et B sont liées de la manière suivante : pour une entité A donnée, il existe zéro, une ou plusieurs entités B ; réciproquement, pour une entité B donnée, il existe zéro, une ou plusieurs entités A. Les entités : « auteur »-« référence »

« référence »-« génomique »

« patient »-« marqueur »

« patient »-« médicament »

« médicament »-« traitement »

« médicament »-« résistance aux médicaments »

(12)

- 11 -

sont liées par des associations donnant naissance à des tables de noms différents mais relativement explicites. Les champs sont généralement constitués des 2 clés primaires des 2 entités concernées et la réunion de ces clés constitue la clé primaire de la nouvelle table. Les autres associations correspondent à un lien symbolisé par des clés étrangères à l’intérieur des tables. Ce modèle est représenté sous Microsoft Access en annexe 2. J’ai alors entré ces informations sous MySQL, créant ainsi la structure de la base VIH.

3. Récupération des données

1. Perl

Perl signifie Practical Extraction and Report Language que l’on pourrait traduire par

« langage pratique d’extraction et d’édition ». C’est un langage de programmation, qui permet la gestion des expressions régulières. Il est très utilisé en biologie pour parser des séquences.

[3] [4].

2. Contenu de la base

Les données récupérées viennent des bases Lanl, Stanford et Swissprot [5]. Les programmes de récupération et de parsing des informations ont été écrits par Anne Vanet dans le langage perl. J’ai ensuite traité ces données dans un programme sequence.pl, fourni en annexe 4, qui permet le remplissage des tables créées sous MySQL. Le principe général est simple. A partir d’une séquence génomique donnée, on recherche l’éventuelle existence d’une séquence protéique associée. Dans le cas où elle existe, on insère cette séquence et les informations la concernant dans la table protéique. Dans les deux cas, on insère la séquence génomique et les informations associées dans la table génomique. Les données associées à la banque, aux publications, aux auteurs, au patient séquencé, aux traitements qu’il suit, aux médicaments qu’il prend sont insérées dans les tables correspondantes, tout en évitant les éventuels doublons. Pour ce faire, le programme remplit des listes d’auteurs, de titres, de dates et de médicaments et compare les nouvelles informations à ces listes. Si ces informations sont déjà contenues dans les listes, on n’insère pas dans les tables, sinon on insère et on complète les listes.

(13)

- 12 -

4. Interface graphique

1. PHP et HTML

MySLQ ne permet pas une visualisation claire des données qu’il contient. Il est donc nécessaire de réaliser une interface graphique. Cela se fait très bien à l’aide de PHP qui va chercher les informations écrites dans les tables et HTML qui réalise l’interface proprement dite.

PHP est le sigle mis pour Hypertext Preprocessor. C’est un langage de scripts généraliste, facilement intégrable au HTML. Il est à noter la différence avec d’autres scripts écrits dans d’autres langages tels que Perl ou C. Au lieu d’écrire un programme avec de nombreuses lignes de commandes afin d’afficher une page HTML, on peut écrire du code HTML avec du code inclus à l’intérieur afin de réaliser une action précise (afficher à l’écran, par exemple). Le code PHP est inclus entre une balise de début et une balise de fin qui permettent au serveur Web de passer en mode PHP. Une des grandes forces de PHP est le support de nombreux systèmes de gestion de bases de données dont MySLQ [6] [7].

HTML mis pour HyperText Markup Language est un langage de « mark up » qui définit la structure logique d’un document www diffusé sur le Web. Ce langage est basé sur la notion d’environnement possédant un début et une fin. Un environnement est délimité par un marqueur lui-même délimité par < et >. [8]

2. Visualisation de la base

J’ai enfin réalisé des programmes .php afin de créer une interface graphique. Seul le premier de ces programmes est présenté ici, car cette interface encore est en cours de développement. En effet lorsque j’ai commencé PHP et HTML, seules certaines tables étaient partiellement remplies et l’interface porte donc sur ces tables. Je n’ai pas eu le temps de la terminer. L’idée de départ était de réaliser trois sortes d’interface reliées entre elles par le programme base.php, détaillé en annexe 5, qui affiche une page d’accueil.

Une interface générale permet d’accéder à toutes les informations de toutes les tables en choisissant certains critères de sélection.

Une interface fasta permet d’afficher des séquences alignées ce qui facilite les comparaisons dans un fichier de la forme

(14)

- 13 -

> nom de la séquence ; id swissprot ; … SEQUENCE

Une interface « géographie » permet de remplir la table géographie en vue de l’éventuel projet en Afrique.

Le programme base.php renvoie la figure 4 suivante.

Figure 4 : Page d’accueil de l’interface de la base de données HIV

Pour récupérer les données contenues dans les tables, on utilise des fonctions qui sont des requêtes SQL intégrées à du code PHP (figure 5). Des formulaires font ensuite le liens entre l’utilisateur et la base (figure 6).

/* cette fonction permet d extraire la ligne de donnees de la table banque ou codeb vaut $code */

function extraire($code){

$base = "hiv";

$cx = mysql_connect("abigbug","root","") or die ("echec de connexion");

$db = mysql_select_db($base,$cx) or die ("echec d'ouverture de la base");

$req = "SELECT * FROM banque WHERE banque.codeb='$code'";

$res = mysql_query($req) or die ("echec d'execution de la requete");

return mysql_fetch_array($res, MYSQL_ASSOC);

}

(15)

- 14 -

/* pour afficher la sequence nucleotidique correspondant a la reference donnee par $code (coder) */

function pagination2($code){

$base = "hiv";

$cx = mysql_connect("abigbug","root","") or die ("echec de connexion");

$db = mysql_select_db($base,$cx) or die ("echec d'ouverture de la base");

$req = "SELECT * FROM ref, genomique, pagination WHERE ref.coder='$code' AND pagination.coder=ref.coder

AND genomique.codesg=pagination.codesg";

$res = mysql_query($req) or die ("echec d'execution de la requete");

return mysql_fetch_array($res, MYSQL_ASSOC);

}

Figure 5 : Exemples de requêtes SQL intégrées à du code PHP.

/* creation du formulaire de choix */

$infos = array( "table"=>"Nom de la table : ","code"=>"Nom de la colonne : ",

"voeu"=>"Valeur de la case : ");

echo "<p align='center'>

<b>Entrez vos choix dans le formulaire qui suit.</b><hr>";

echo "<form action='extraire.php' method='POST'>

<table width='95%' border='0' cellspacing='10' cellpadding='2'>\n";

foreach($infos as $champ=>$info){

echo "<tr><td align='right'> <B> {$infos[$champ]} </B></td>";

if ($infos[$champ] == "Nom de la table : "){

echo "<td><select name='table'>

<option value='3D'>3D

<option value='auteur'>auteur

<option value='banque'>banque

<option value='data'>date

<option value='dosage'>dosage

<option value='generalite'>g&eacute;n&eacute;ralite

<option value='genomique'>g&eacute;nomique

<option value='geo'>g&eacute;ographie

<option value='marqueur'>marqueur

<option value='medicament'>m&eacute;dicament

<option value='patient'>patient

<option value='patientfam'>patient famille

<option value='patientmed'>patient m&eacute;decine

<option value='patientsex'>patient sexualit&eacute;

<option value='patientsoc'>patient soci&eacute;t&eacute;

<option value='proteique'>prot&eacute;ique

<option value='ref'>r&eacute;f&eacute;rence

<option value='resistancemed'>r&eacute;sistancemed

<option value='resistancesys'>r&eacute;sistancesys

<option value='traitement'>traitement

</select></td></tr>";

} else{

echo "<td><input type='text' name='$champ' size='20'maxlength='20'></td><tr>";

} }

Figure 6 :Exemple de formulaire de choix

(16)

- 15 -

Conclusion

Le développement de cette base de données sur le VIH s’est inscrit dans un contexte utilitaire et aujourd’hui ,même si l’interface n’est pas encore utilisable, la quasi-totalité de la structure est conservée, la base remplie et utilisée au sein de l’Atelier de BioInformatique, notamment pour des comparaisons de séquences. A ce jour, elle contient 77 832 séquences des produits du gène POL, dont on extrait 115 148 séquences protéiques, parmi lesquelles 41 535 protéases, 1 555 intégrases et 72 058 reverse transcriptases.

On compte environ 37 690 patients, 45 713 traitements, 30 médicaments et 797 références bibliographiques pour 2 778 auteurs. Les tables concernant les patients sont peu remplies car les données sont souvent absentes et une partie d’entre elles a été créée uniquement en vue d’un éventuel séquençage en Afrique. La structure de la base est donc fonctionnelle et il est envisageable de l’étendre aux produits des gènes GAG et ENV puis à d’autres virus tels la grippe ou l’hépatite B.

(17)

- 16 -

Annexes

ANNEXE 1 :DIAGRAMME ENTITES /ASSOCIATIONS...17

ANNEXE 2 :MODELE RELATIONNEL...18

ANNEXE 3 :DEFINITIONS DES TYPES ASSOCIES AUX CHAMPS...19

ANNEXE 4 :PROGRAMME DE REMPLISSAGE DES TABLES...20

ANNEXE 5:EXEMPLE DE PROGRAMME DE LINTERFACE...24

(18)

- 17 -

Annexe 1 : Diagramme Entités / Associations

(19)

- 18 -

Annexe 2 : Modèle Relationnel

(20)

- 19 -

Annexe 3 : Définitions des types associés aux champs

TABLE generalites TABLE 3D TABLE resistancesys

code varchar(10) refPDB varchar(10) coders varchar(10) refPDB varchar(10) nom_inhib varchar(10) position int

coders varchar(10) mutation varchar(10)

coderm varchar(10) TABLE genomique niveau_res enum (0 à 5) nom_prot varchar(10) codesg varchar(10)

longueur int TABLE proteique

TABLE resistancemed codeg varchar(10) codesp varchar(10) coderm varchar(10) seq_nucleo text nom_prot varchar(10) position int sous_type varchar(10) nom_gene varchar(10) mutation varchar(10) codep varchar(10) seq_prot text

niveau_res enum (0 à 5) codeb varchar(10) seq_complet bool coded varchar(10) codesg varchar(10)

codep varchar(10) TABLE resistance TABLE banque

coderm varchar(10) codeb varchar(20) TABLE date

codem varchar(10) id_swissprot varchar(20) coded varchar(10) nom_lanl varchar(20) date_ent date TABLE medecine name_lanl varchar(20) date_ent_ori date codem varchar(10) au_nom_lanl varchar(20) date_mod date codet varchar(10) au_id_sw varchar(20) date_mod_ori date

au_nom_sw varchar(20)

TABLE reference acc_genbank varchar(20) TABLE marqueur

coder varchar(10) acc_sw varchar(20) codemq varchar(10) titre varchar(10) nom_stanford varchar(20) nom varchar(10)

infos text num_p_stan varchar(20) sequence text

refmedline varchar(10) num_is_stan varchar(20)

refpubmed varchar(10) tmt_stan varchar(20) TABLE patient_seq tps_tmt_stan varchar(20) codep varchar(10)

TABLE pagination codemq varchar(10)

codesg varchar(10) TABLE patient

coder varchar(10) codep varchar(10) TABLE traitement

sexe enum codet varchar(10)

TABLE bibli date_naiss date duree varchar(10)

coder varchar(10) codeg varchar(10) debut date

codea varchar(10) test_depist varchar(10) fin date date_sero date pathologie text

TABLE auteur date_postinf date codep varchar(10)

codea varchar(10) nationalite varchar(10)

nom varchar(10) TABLE medicament

prenom varchar(10) TABLE geographie codem varchar(10)

codeg varchar(10) nom varchar(10)

TABLE dosage continent varchar(10) composition text

coded varchar(10) pays varchar(10) presentation varchar(10) codem varchar(10) region varchar(10) type varchar(10) dosage int milieu enum (rur,urb) formule_chim text

voie_inter bool dose_recom varchar(10)

(21)

- 20 -

Annexe 4 : Programme de remplissage des tables

sequences.pl

#!/usr/bin/perl

# Initialisation des variables

%pleinseq1=();%pleinseq2=();

@champs=();

$ligne="";$seq1="";$seq2="";$nom1="";$nom2="";$debutnom1="";$seq2bis="";$longueur="";$lg="";

$sous_type="";$st="";

$k=0;$j=0;$a=0;$c=0;$d=0;$z=0;$t=0;$m=0;

@oldtitre=("","");@oldauteur=("","");@olddate=(["",""]);@oldmedoc=("","")

# Ouverture des fichiers

open (DONNEE,"data") or die "Pb d'ouverture : $!" ;

open (DONNEEFINALE,"data.final") or die "Pb d'ouverture : $!" ; open (RESULTAT, ">assemblage") or die "Pb d'ouverture : $!" ;

# Appel de MySQL use DBI;

$user="root";

$pass="";

$database="hiv";

$dsn="DBI:mysql:database=$database;host=localhost";

$dbh=DBI->connect($dsn,$user,$pass);

# Remplissage du hash de Anne while ($ligne = <DONNEE>){

chomp ($ligne);

if ($ligne =~ /^>/){

$seq1="";

$nom1=$ligne;

} else{

$seq1.=$ligne;

$pleinseq1{$nom1}=$seq1;

} }

# Remplissage du hash de Sophie while ($ligne = <DONNEEFINALE>){

chomp ($ligne);

if ($ligne =~ /^>/){

$seq2="";

$nom2=$ligne;

} else{

$seq2.=$ligne;

$pleinseq2{$nom2}=$seq2;

} }

# Comparaison des sequences

while (($nom1, $seq1) = each %pleinseq1){

++$j;

while (($nom2, $seq2) = each %pleinseq2){

$debutnom1 = substr ($nom1,O,74);

$nom2 =~ s/;;/; ;/g;

$nom2 =~ s/;;/; ;/g;

# Cas d'egalite de 2 noms : il existe une sequence proteique extraire de la sequence genomique

if ($debutnom1 eq $nom2){

print RESULTAT "$nom2\n$seq1\n$seq2\n";

$seq2bis = $seq2;

$seq2bis =~ s/\.//g;

$lg = length($seq2bis);

(22)

- 21 -

# Determination : sequence complete ou non if ($lg == 99){$bool = 'oui'; }

else{$bool = 'non';}

# Insertion dans la table proteique

$sql1="insert into proteique values ('SP$a','reverse transcriptase','POL', '$seq2','$bool','SG$k','$champs[5]')";

$sth1=$dbh->prepare($sql1) or die "can't prepare $sql1: $dbh->errstr\n";

$sth1->execute or die "can't execute the query1: $sth1->errstr\n";

}

# Cas de non egalite : il n'existe pas de sequence proteique correspondant a la sequence genomique

else{ print RESULTAT "$nom1\n$seq1\n" ;}

}

# Dans tous les cas on fait ce qui suit $nom1 =~ s/>//;

@champs = split (';',$nom1);

$longueur = length($seq1);

# Comparaison des sous-types

if ($champs[2] eq $champs[13] or $champs[2] ne "" and $champs[13] eq ""){

$sous_type = $champs[2];

}

elsif ($champs[2] eq "" and $champs[13] ne ""){

$sous_type = $champs[13];

}

$st = $sous-type;

# Insertion dans la table banque

$sql="insert into banque values ( 'B$k','$champs[0]','$champs[12]','$champs[14]', '$champs[15]','$champs[16]','$champs[17]','$champs[1]', '$champs[11]','$champs[4]','$champs[5]','$champs[6]', '$champs[7]','$champs[8]')";

$sth=$dbh->prepare($sql) or die "can't prepare $sql: $dbh->errstr\n";

$sth->execute or die "can't execute the query: $sth->errstr\n";

# Insertion dans la table genomique

$sql2="insert into genomique values ('SG$k','$longueur','','$seq1','$champs[2]', '$champs[5]','B$k','D$d')";

$sth2=$dbh->prepare($sql2) or die "can't prepare $sql2: $dbh->errstr\n";

$sth2->execute or die "can't execute the query2: $sth2->errstr\n";

# Etude des dates pour enlever les doublons

# ATTENTION a la premiere mise en marche du programme ( mais pas a chaque reinitialisation ) remplacer la date 2005-08-21 par la date du jour

$drap = 0;

for ($w = 0; $w < $#olddate+1; ++$w){

if (($olddate[$w][0] eq "$champs[40]") and ($olddate[$w][1] eq "$champs[41]")){

$drap = 1;

last;

}

else{

$drap = 0;

}

}

if ($drap == 0){

# Insertion dans la table date

$sql4="insert into date values ('D$d','2005-08-21','$champs[40]',curdate(),

'$champs[41]')";

$sth4=$dbh->prepare($sql4) or die "can't prepare $sql4: $dbh->errstr\n";

$sth4->execute or die "can't execute the query4: $sth4->errstr\n";

push (@olddate,[$champs[40],$champs[41]]);

++$d;

}

# Etude des ref et auteurs pour enlever les doublons

@newtitre=();@newinfo=();@newauteur=();@newmedline=();@newpubmed=();

if ($champs[18] eq ""){

$champs[18] = 1;

}

(23)

- 22 -

if ($champs[42] eq ""){

$champs[42] = 1;

}

for ($i = 0; $i < $champs[42]; ++$i){

for ($j = 0; $j < $champs[18]; ++$j){

push(@newtitre,"$champs[20+3*$j]");

push(@newinfo,"$champs[21+3*$j]");

push(@newauteur,"$champs[19+3*$j]");

}

push(@newtitre,"$champs[44+5*$i]");

push(@newinfo,"$champs[45+5*$i]");

push(@newauteur,"$champs[43+5*$i]");

push(@newmedline,"$champs[46+5*$i]");

push(@newpubmed,"$champs[47+5*$i]");

}

$drapeau=0;

$drapeau1=0;

for ($p = 0; $p < $#newtitre; ++$p){

for ($q = 0; $q <= $#oldtitre; ++$q){

if ($newtitre[$p] eq $oldtitre[$q]){

$drapeau=1;

last;

} }

if ($drapeau == 1){

$bluf = $q-2;

# Insertion dans la table pagination

$sql11="insert into pagination values ('SG$k','R$bluf')";

$sth11=$dbh->prepare($sql11) or die "can't prepare $sql11: $dbh->errstr\n";

$sth11->execute or die "can't execute the query11: $sth11->errstr\n";

}

elsif ($drapeau == 0){

$recup = $c;

# Insertion dans la table pagination

$sql11="insert into pagination values ('SG$k','R$c')";

$sth11=$dbh->prepare($sql11) or die "can't prepare $sql11: $dbh->errstr\n";

$sth11->execute or die "can't execute the query11: $sth11->errstr\n";

# Insertion dans la table ref

$sql12="insert into ref values ('R$c','$newtitre[$p]','$newinfo[$p]', '$newmedline[$p]','$newpubmed[$p]')";

$sth12=$dbh->prepare($sql12) or die "can't prepare $sql12: $dbh->errstr\n";

$sth12->execute or die "can't execute the query12: $sth12->errstr\n";

push (@oldtitre,"$newtitre[$p]");

++$c;

}

for ($s = 0; $s <= $#oldauteur; ++$s){

if ($newauteur[$p] eq $oldauteur[$s]){

$drapeau1=1;

last;

} }

if ($drapeau1 == 0){

# Insertion dans la table bibli

$sql14="insert into bibli values ('R$recup','A$z')";

$sth14=$dbh->prepare($sql14) or die "can't prepare $sql14: $dbh->errstr\n";

$sth14->execute or die "can't execute the query14: $sth14->errstr\n";

@auteur = split (', ',$newauteur[$p]);

$nom = @auteur[0];

$prenom = @auteur[1];

# Insertion dans la table auteur

$sql15="insert into auteur values ('A$z','$nom','$prenom')";

$sth15=$dbh->prepare($sql15) or die "can't prepare $sql15: $dbh->errstr\n";

$sth15->execute or die "can't execute the query15: $sth15->errstr\n";

push (@oldauteur,"$newauteur[$p]");

++$z;

} }

(24)

- 23 -

# Cas des medicaments

for ($v = 0; $v < $champs[120]; ++$v){

if ($champs[122+3*$v] !~ /None/){

# Insertion dans la table traitement

$sql31="insert into traitement values ('T$t','$champs[123+3*$v]','','', '','$champs[5]')";

$sth31=$dbh->prepare($sql31) or die "can't prepare $sql31: $dbh->errstr\n";

$sth31->execute or die "can't execute the query31: $sth31->errstr\n";

if ($v == $champs[120]-1){

$g = $t;

# Insertion dans la table patientmed

$sql30="insert into patientmed values ('','$champs[5]','T$g', '','','','','','','', '','','','','','')";

$sth30=$dbh->prepare($sql30) or die "can't prepare $sql30: $dbh-

>errstr\n";

$sth30->execute or die "can't execute the query30: $sth30-

>errstr\n";

}

@medoc = split ('\+\s',$champs[122+3*$v]);

for ($n = 0; $n <= $#medoc; ++$n){

$drapeau2=0;

for ($do = 0; $do <= $#oldmedoc; ++$do){

if ($medoc[$n] eq $oldmedoc[$do]){

$drapeau2=1;

last;

} }

if ($drapeau2 == 1){

$bluff = $do-1;

# Insertion dans la table medecine

$sql32="insert into medecine values ('M$bluff','T$t')";

$sth32=$dbh->prepare($sql32) or die "can't prepare $sql32:

$dbh->errstr\n";

$sth32->execute or die "can't execute the query32: $sth31-

>errstr\n";

} else{

# Insertion dans la table medicament

$sql33="insert into medicament values ('M$m',

'$medoc[$n]','','','','','')";

$sth33=$dbh->prepare($sql33) or die "can't prepare $sql33:

$dbh->errstr\n";

$sth33->execute or die "can't execute the query33: $sth33-

>errstr\n";

# Insertion dans la table medecine

$sql32="insert into medecine values ('M$m','T$t')";

$sth32=$dbh->prepare($sql32) or die "can't prepare $sql32:

$dbh->errstr\n";

$sth32->execute or die "can't execute the query32: $sth32-

>errstr\n";

push (@oldmedoc,"$medoc[$n]");

++$m;

} }

++$t;

} }

++$k;

++$a;

}

# Fermeture des fichiers close DONNEE;

close DONNEEFINALE;

close RESULTAT;

(25)

- 24 -

Annexe 5 : Exemple de programme de l’interface

base.php

<html>

<head>

<title>Base HIV</title>

</head>

<body >

<left><IMG src="logo.gif" border=0 width=160 height=50></left><br>

<center><h1><FONT color="red">Base de donn&eacute;e HIV</FONT></h1></center>

<br><hr>

<p align='center'>

<b>Que souhaitez-vous faire ?</b>

<hr><br>

<!-- boutons permettant d acceder aux autres pages internes -->

<form action='demandebest.php'>

<div align='center'><p><input type='submit' value='Afficher la base en HTML'></p></div>

</form>

<form action='genom.php'>

<div align='center'><p><input type='submit' value='Cr&eacute;er des fichiers fasta'></p></div>

</form>

<form action='geographie.php'>

<div align='center'><p><input type='submit' value='Remplir la table g&eacute;ographie'></p></div>

</form>

<!-- lien vers des sites pouvant servir -->

<br><br><br><br><br>

Banque Swissprot : <a href="http://srs.ebi.ac.uk/"

target="_blank">http://srs.ebi.ac.uk/</a>

<br><br>

Banque Lanl : <a href="http://www.hiv.lanl.gov/"

target="_blank">http://www.hiv.lanl.gov/</a>

<br><br>

Banque Stanford : <a href="http://hivdb.stanford.edu/"

target="_blank">http://hivdb.stanford.edu/</a>

<br><br>

Atelier de BioInformatique : <a href="http://wwwabi.snv.jussieu.fr/"

target="_blank">http://wwwabi.snv.jussieu.fr/</a>

<br><br>

</body>

</html>

(26)

- 25 -

Bibliographie

[0] Atelier de BioInformatique (ABI) http://www.abi.snv.jussieu.fr/

[1] S. Brouillet, E. Ollivier, L. Marsan et A. Vanet Ce qui n’existe pas chez VIH (papier long) [2] Site officiel de MySLQ

http://www.mysql.com/

[3] L. Schwartz et T. Phoenix, édition Broché Introduction à Perl

[4] L. Wall, édition Broché Programmation en Perl [5] Sites des banques utilisées

Swissprot : http://srs.ebi.ac.uk/

Stanford HIV Drug Resistance Database : http://hivdb.stanford.edu/

Los Alamos National Library (Lanl) HIV Database: http://www.hiv.lanl.gov/

[6] J. Valade, édition Poche PHP et MySQL pour les Nuls [7] Manuel PHP

http://www.phpscripts-fr.net/

[8] Cours HTML

http://www.allhtml.com/

(27)

Références

Documents relatifs

ALTER TABLE PARTICIPANT ADD COLUMN (EMAIL VARCHAR (50) ) 2- Modification d’une colonne. Elargir la taille du champ EMAIL et le rendre not

On désire afficher, dans une zone de texte située sous les zones de coordonnées, le nom de la ville située sous la souris (si elle est connue). Proposez une solution (ne

dans differentes sources et centres de documentation llideal se- rait de creer une Base Commune de Donnees qui rassemblerait toute 1a litterature de developpement dans ce domaine.. 4

passe toutes les espérances et nous proposons à tous les collèges intéressés d'y participer : conçu pour une Zone d' Education Prioritaire, il peut s'adapter

Elle affiche deux champs de saisie de texte, pour le numéro du court et l'heure de début de la réservation, et une liste permettant de choisir son partenaire; la liste affiche

The proof of the Milin conjecture here given differs from the argument verified by the Leningrad Seminar in Geometric Function Theory [6] in that it avoids approxima- tion

(Resolution 4 adoptee par ia Confe seance nleni^r pxenxaro de cloture le 4 Hn n^+ ^wie 1963).

12. En application de l ' alinea 1 c) de 1&#34; resolu.tion 3 'lui d'lIliandait au Comite des NeUf de &#34;pJ.'eparer, a 1\ intention de la llan~ue, de&#34; projets pour l'