Archives pour février 2008

29 février 2008 – Loreleï

février 29, 2008

17h44 :

J’ai finalement décider de monter rapidement une petite base de donnée très simplifiée pour pourvoir acceder aux info sur les enzymes de restriction.
J’ai donc créer la table lorelei (pour Liste Of Restriction Enzyme with Location and Enzyme Information). cette table se trouve dans la base bab_el_oueb que je devrais renommé babel_oueb d’ailleurs, étant une sorte de fourre-tout pour mes tables.
j’y ai mis aussi une autre base, congel_location.

code pour creer ces bases

DROP TABLE lorelei;
DROP TABLE congel_location;
CREATE TABLE congel_location
(
cl_id serial NOT NULL,
cl_loc varchar(255),
CONSTRAINT congel_location_pkey PRIMARY KEY (cl_id)
)
WITHOUT OIDS;
ALTER TABLE congel_location OWNER TO fricard;
CREATE TABLE lorelei
(
lor_id serial NOT NULL,
lor_name varchar(20),
lor_link varchar(255),
lor__site varchar(50),
cl_id int4,
CONSTRAINT lorelei_pkey PRIMARY KEY (lor_id),
CONSTRAINT lorelei_cl_id_fkey FOREIGN KEY (cl_id)
REFERENCES congel_location (cl_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITHOUT OIDS;
ALTER TABLE lorelei OWNER TO fricard;

lorelei fait référence a congel_location

on stocke dans la base le nom de l’enzyme et le lieu ou est est stockée ainsi qu’un lien vers une base de données donnant les infos sur cette enzyme.

J’ai ensuite créé une interface en php très simplfiée pour voir les donnée, en ajouter et les effacer.
http://berthemorisot.gim.pasteur.fr/lorelei.php

code php

<?php

function add_enz($vals, $db){
$query = "select cl_id from congel_location where cl_loc='".$vals[1]."'";
$res = pg_query($db, $query) or die("La requète $query n'a pas pu aboutir");
if (pg_numrows($res)==0){
$query="insert into congel_location (cl_loc) values ('".$vals[1]."')";
echo $query;
$res = pg_query($db, $query) or die("La requète $query n'a pas pu aboutir");
}
$query = "select cl_id from congel_location where cl_loc='".$vals[1]."'";

$res = pg_query($db, $query) or die("La requète $query n'a pas pu aboutir");
$cl= pg_fetch_row($res, 0);

$cl_id=$cl[0];

$query="insert into lorelei (lor_name, lor_link, cl_id) values ('".$vals[0]."','".$vals[2]."',".$cl_id.")";
$res = pg_query($db, $query) or die("La requète $query n'a pas pu aboutir");
echo $vals[0]." added<br/>";
}

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title>Lorelei</title>
<style type="text/css">
body {
font-family: Arial,Helvetica,sans-serif;
font-size: 12px;
}
h1 {
font-size: 18px;
color: LightSeaGreen;
}
h2 {
font-size: 14px;
}
.initiale{
font-size: 16px;

color: LightSeaGreen;
}
a {
color:steelblue;
text-decoration:none;
}
a:hover{
color:white;
background-color:steelblue;

}
table {
font-size: 13px;
vertical-align:top;
}
td{
vertical-align:top;
}

td.head {
color:white;
background-color:steelblue;

}
td.add{
background-color:YellowGreen;

}
td.del{
background-color:IndianRed;
}
td.add_light{
background-color:#ccff99;
}
td.del_light{
background-color:#ff9999;
}
td.add_dark{
background-color:#003300;
color:white;
}
td.del_dark{
background-color:#330000;
color:white;
}
a.ancre{
color:DarkSlateBlue;
}
a.ancre:hover{
background-color:DarkSlateBlue;
color:white;
}
</style>
</head>
<body>
<table><tr><td rowspan=2>
<img src="lorelei_01.jpg" width=50 height=50 />
</td><td><h1>LORELEÏ</h1></td></tr>
<tr><td>
<h2><span class="initiale">L</span>iste <span class="initiale">O</span>f <span class="initiale">R</span>estriction <span class="initiale">E</span>nzyme with <span class="initiale">L</span>ocation and <span class="initiale">E</span>nzyme <span class="initiale">I</span>nformation</h2>
</td></tr>
</table>
<br/>
<a class="ancre" href="#update">Ajouter ou retirer des enzymes</a>

<balise id="top"></balise>
<br/>
<br/>
<?php
$HOST="berthemorisot.gim.pasteur.fr";
$PORT=5432;
$BASE="bab_el_oueb";
$USER="fricard";
$db = pg_connect("host=$HOST port=$PORT dbname=$BASE user=$USER") or die("impossible de se connecter à la base de données");
if (isset($_POST["add_data"])){
if ($_FILES["file_data"]['name']){
$fichier=$_FILES['file_data']['tmp_name'];
if (file_exists($fichier)) {
$fp2=fopen($fichier, "r");
while(!feof($fp2)){
$line[]=fgets($fp2, 4096);
}
fclose($fp2);
}
}
elseif($_POST["text_data"]){
$line=explode("\n",$_POST["text_data"]);
}
if (count($line)>0){
$sep_list=array("\t",",");
foreach($sep_list as $sep){
if (strpos($line[0],$sep)){
break;
}
}
foreach ($line as $items){
$vals=explode($sep, $items);
add_enz($vals, $db);
}
}
}
if (isset($_POST["del_data"])){
$data_array = $_POST['item_list'];
$in = implode( $data_array, ',');
$query="select lor_name from lorelei where lor_id in ($in)";
$res = pg_query($db, $query) or die("La requète $query n'a pas pu aboutir");
$query="delete from lorelei where lor_id in ($in)";
$res2 = pg_query($db, $query) or die("La requète $query n'a pas pu aboutir");
for ($i=0;$i<pg_numrows($res);$i++){
$ligne= pg_fetch_row($res, $i);
$enz[]=$ligne[0];
}
if ($i>1){
echo implode( $enz, ', ')." ont été effacées";
}else{
echo implode( $enz, ', ')." a été effacée";
}

}

$query_all = "select lor_id, lor_name, cl_loc, lor_link from lorelei, congel_location where lorelei.cl_id = congel_location.cl_id order by lor_name";
?>
<table>
<tr>
<td> </td><td class="head">Enzyme </td><td class="head">Localisation </td><td class="head">Lien </td></tr>
<?php
$res = pg_query($db, $query_all) or die("La requète n'a pas pu aboutir");
for ($i=0;$i<pg_numrows($res);$i++){
$ligne= pg_fetch_row($res, $i);
echo "<tr>";
foreach($ligne as $val){
if ((strpos($val,"html")) || (strpos($val,"http")) || (strpos($val,"www")) || (strpos($val,"php"))){
echo '<td><a href="'.$val.'">'.$val.'</a></td>';
}
else{
echo "<td>$val</td>";
}
}
echo "</tr>\n";

}
echo "</table>";

?>
<br/>
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<br/>
<a class="ancre" href="#top">Retourner au début de la page</a>
<balise id="update"> </balise>
<br/>
<table>
<tr>
<td class="add_dark">
Pour ajouter des enzymes à la liste
</td>
<td class="del_dark">
Pour effacer des enzymes de la liste
</td>
</tr>
<tr>
<td class="add">
<form name="add_item" method="POST" action="lorelei.php" ENCTYPE="multipart/form-data">
Copier-coller la liste des enzymes ci-dessous selon le format suivant :<br/>
nom localisation lien</br>
en séparant les colonnes par des tabulations ou des virgules<br/> (un copier-coller depuis excel par exemple)
</td>
<td class="del">
sélectionnez la ou les enzymes a effacer<br/>
</td>
</tr>
<tr>
<td class="add_light">
<form name="add_item" method="POST" action="lorelei.php" ENCTYPE="multipart/form-data">

<textarea name="text_data" cols="70" rows="10" wrap="physical" ></textarea>
<br/>
ou uploader un fichier au format décrit ci-dessus<br/>
<input type="file" name="file_data" />
<br/>
<input type="submit" name="add_data" value="Ajouter" />
</form>
</td>
<td class="del_light">
<form name="del_item" method="POST" action="lorelei.php" ENCTYPE="multipart/form-data">
<select name="item_list[]" multiple size=5>
<?php
for ($i=0;$i<pg_numrows($res);$i++){
$ligne= pg_fetch_row($res, $i);
$id=$ligne[0];
$nom=$ligne[1];
echo '<option value="'.$id.'">'.$nom.'</option>';
}
?>
</select>
<br/>
<input type="submit" name="del_data" value="Retirer" />
</form>
</td>
</tr>
</table>
</body>
</head>

28 févrioer 2008 – Code IUPAC nucleotides

février 28, 2008

Pour memoire le code complet des nucléotides

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
. or - gap

vient de http://www.bioinformatics.org/sms/iupac.html

28 février 2008 – ebauche d’une base pour la liste des enzymes de restriction disponible

février 28, 2008

14h43 : kenza a comptabilisé l’ensemble des enzyme disponibles au labo et a rassemblé tout ca dans un tableau excel.
~/bank/enzyme/Enz_dispo.xls


Aat II BamH I cla I Dpn I Eco R I Fok I Hinc I I Kpn I Mfe I N.Bst B I Pfl F I Rsa I Sac I Taq I Xba I
Aat II BamH I Cla I Dra I Eco R I Hinc II Kpn I Mfe I Nci I Ppu 10 I sac I Taq I Xba I
Acc I BamH I Dra III Eco R I Hinc II Mlu I Nco I Pst “HC” Sal I Taq I Xho I
Acc I Bcl I Eco RV Hind III Mme I Nco I Pst I sal I Tth111 I Xho I
Acc65 I Bcl I Eco47 III Hind III Nco I Pst I Sap I Xho I
Acc65 I Bgl I Hind III Nde I Pst I Sau 3 A xma I
Alu I Bgl II Hpa I Nde I Pvu II Sau 3 A Xma I
Alw26 I Bgl II Hpa I Nhe I Pvu II Sau 3 A Xmn I
Apa I Blp I Hpa I Nhe I Pvu II Sau 3A I
Asc I Blp I Nla III Sbf I
Asc I Bs Iw I Not I Sfi I
Asp 3 I Bsa I Not I Sma I
aTaq BsaB I Nsi I Sma I
aTaq I Bsb I Sma I
Ava I Bsi W I Sna B I
Ava I Bsm B I Sna B I
Ava II Bsm B I Spe I
Avr II Bsm I Spe I
BsmA I Sph I
BsmA I Sph I
BsmA I SsP I
BsmA I Ssp I
BsmB I Ssp I GQ
BsmB I Stu I
Bsp 12O I Stu I
BspE I sty I
BstB I sty I
BstE I
BstX I

l’idée est de passer ce tableau dan sune petite base de données avec interface simple
en gros je pense que l’interface doit avoir la liste des enzyme et leur nombre a doté, et aussi le site de restriction. et peut-etre un lien vers un site de référence
genre

BamH I – 3 – G^GATCC – http://rebase.neb.com/rebase/enz/BamHI.html

et avec en plus un lien a chaque ligne pour mettre a jour le nombre.

et aussi la possibilité de charger un nouveau fichier xls

–> vu comme ca c’est au moins 3 jours de boulot, voir meme une semaine si je veux le faire bien. on verra ca a après.

26 février 2008 – redéfinition des tables de la base pour SganArrayl (suite)

février 26, 2008

15h13 : j’ai refait la base a nouveau en modifiant legèrement la partie sample. la base est ainsi plus logique

la base commence par la partie design experiment

Cette partie comprend principalement la table des_experiments (des pour design)
avec les champs propre exp_id (clé primaire), exp_common_ref booléen indiquant si une reférence comune a été utilisée, exp_quality (text décrivant les control utilisés) et exp_description qui décrit la manip et son but.
elle fait référence à 5 autres tables.

  • la table des_experimental_factor, qui va contnir les différents parametre ou conditions testée par ex : variation génétique.
  • la table des_experiment_types listant le type de manip qui seront fait. cette table contient un champ pour le nom de la manip et un pour sa description
  • la table des_biblio listant des article ou des lien vers ceux-ci. pour l’instant cette table est simple. par la suite peut-etre qu’une table plus complexe pourrait etre bien
  • la table des_citation, idem que pour des_biblio, pour sotcker les citations
  • la table des_author_exp, qui lie les auteurs à la manip. le sens de manip ici est assez large, ca serait plus un projet qu’une manip

ensuite on a la partie sample used, extract preparation and labelling

cette partie est axée autour de la table prep_sample qui est liée directement a des_experiments.
les tables de cette partie sont assez complexes.
prep sample est liée a

  • prep_biosource : cette table est destinée a stocker les info sur la biosource, donc dans notre cas la souche utilisée. elle contient un champ bsrc_ref qui sera le nom donné la souche je pense. mais bon, je ne suis pas sur que ce soit si utile. je le garde qd meme, une liaison avec la table des_authors, pour designer le contact responsable de cette souche, une liaison vers la table prep_organism, contenant le nom de l’organisme (S. cerevisiae pour nous) une liaison vers la table prep_sample_descriptor contenant le nom de la souche

–> en reprenant toute la base je m’aperçoit encore d’une erreur, il est probable que je doive la reprendre a nouveau

25 février 2008 – Explication des manip et redéfinition des tables de la base pour SganArrayl (suite)

février 25, 2008

10h55 : Suite a certain éclaircissement sur le déroulement des manip, j’ai constaté avoir fait qq erreurs dans la conceptions de la base. outre le fait d’”avoir oublié les info pour conserver les info minimal sur les puces, j’ai mal compris la notion de manip, notamment quand 3 couleurs sont utilisées sur une lame.
le déroulement de la manip est le suivant

  1. construction de souches appat (bait)
  2. 6 nouvelles souches (A, B, C, D E, F) par ex : delta-EDC3, delta-pex22, …

  3. Obtention des doubles mutants
  4. 6 cultures de cellules dans les lesquelles on va obtenir 4700 doubles mutants en 18 générations
    on réalise aussi 2 cultures de références (R1 et R2) YFR-Delta et YEL-Delta à partir desquelles on va obtenir aussi 4700 doubles mutants.
    tous ces double mutants sont obtenus le meme jour et seront identifié par la date –> mating date

  5. Marquage de l’ADN avec les fluorophores
  6. on marque une souche avec l’un des marqueurs fluo, par ex Cy3, une autre avec un autre marqueur, Cy5, et une référence marquée par alexa594. ces 3 souches marquées sont alors hybridées sur une lame.
    on réalise ainsi 6 lames en croisant les souches et les références de façon que chaque souche soit présente sur 2 lames différentes et que la référence pour ces 2 lames soit à chaque fois différente. De plus il est également interessant de marquer la meme souche avec 2 marqueurs différent pour chacune des hybridations.
    avec les souche A, B, C, D, E, F, et les références R1 et R2, on peut alors effectuer le croisement suivant :
    lame 1 –> A-Cy3, B-Cy5, R1-Alexa594
    lame 2 –> C-Cy3, A-Cy5, R2-Alexa594
    lame 3 –> B-Cy3, D-Cy5, R2-Alexa594
    lame 4 –> E-Cy3, C-Cy5, R1-Alexa594
    lame 5 –> D-Cy3, F-Cy5, R1-Alexa594
    lame 6 –> F-Cy3, E-Cy5, R2-Alexa594

  7. obtention des rapports bait/control
  8. on va alors calculer tous les rapport A/R1, A/R2, B/R1…F/R2
    centrer les données, filtrer (SNR, diametre), eliminer les pics, puis combiner les résultats. pour chaque gène 4 spots existe sur la puce. on va garder la moyenne ou la médiane. ca reste a déterminer.

  9. comparaison avec autre date
  10. ces manip seront répétées un mois plus tard. les résultats seront comparés entre eux

il faut donc repenser la base en fonction de ces nouvelles infos. le terme de manip (ou experiment) va regrouper non pas une lame mais les couples appat/référence, la référence pourvant etre différente a chaque fois. une manip est donc principalement identifiée par son appat.
–> Rq : dans le cas de lame 2 couleurs, un couple appat/ref correspond bien a une lame
la hierarchie logique est donc la suivante:
bait --> mating date --> hybridization avec en général pour un appat 2 cultures a des dates différentes et pour chacune de ces cultures 2 hybridations

20h14 : j’ao fini une première version complete de la base.
elle comprend 5 parties correspondant aux 5 éléments décrit par le format MIAME. une partie sur le array design pour contenir les info de construction des puce et 4 partie sur la manip. je vois déja une erreur de conception dans cette base. les info de manip sont descendante, c’est a dire que ca va depuis la conception de la manip a l’analyse des résultats. les liens entre ces parties devraient donc etre descendant aussi. or j’ai des lien ascendant entre la partie sample preparation et experiment design. j’ai surement besoin d’une entité entre les 2.
de plus la table des orf a besoin d’etre sortie de ce contexte car elle est indépendante des puces.

21 février 2008 – 19 février 2008 – MIAME, minimal information about a microarray experiment (suite)

février 21, 2008

11h00 :
Bon alors j’avais pas tout compris sur le MIAME, c’est plus important que je ne croyais puisqu’il faut avoir ces info pour publier

je vais donc reprendre les infos et voir ou je peux les trouver dans la base, voir les ajouter si besoin
il s’agit de la partie Experiment description, qui est finalement la plus importante puisque on peut retrouver celles de la puce relativement facilement, encore que je me demande si dans la base j’ai l’info donnant une référence de la puce, la référence…

Experiment description :

  1. Experimental design
    • Authors, laboratory and contact information –> j’ai deja une table technicians, mais je pense que la c’est un peu différent. je vais créer une table authors et une table location. la table technicians sera surement liée a authors. par contre pas la peine de demander déjà ces infos dans l’interface web de base
    • type of experiment : ex normal vs malade, traité vs non traité, cinétique… –> a voir s’il s’agit des info decrites dans la table experiment_type. peut-etre qu’on peut mettre plus d’info dans cette table
    • Number of hybridizations in the experiment –> cette info je l’ai en reprenant le nb de slides total je pense. il faut préciser cette info
    • Whether or not a common reference sample has been used –> a ajouter dans experiments, un booléen common_reference_sample fera l’affaire
    • Quality control steps : replication a différents niveau, inversion des couleurs, spots de control –> un long text pour ca me parait bien
    • Description of experiment and its goal –> un long text encore
    • links to journal and web/publication of the experiment –> je vais créer une table biblio, simpliste pour le moment, 3 colonnes, id, title et exp_id
    • journal or URL citations –> pareil, une table citation, identique a biblio
  2. Sample used, extract preparation and labelling
    • Biosource properties : c’est le terme décrivant l’organisme d’où provient l’échantillon qui sera hybridé –> unte table biosource me semble indispensable a ce stade
      • Organism : nom utilisé par la taxonomie de NCBI
      • contact details : personne a contacter pour avoir des info sur l’échantillon –> un lien vers authors me semble bien
      • Descriptors relevant to the sample –> une table sample_descriptor
        • sex : male, femelle, hermaphrodite
        • age : en heure, jour, mois, année… et depuis quelle moment (naissance, meiose…)
        • Developmental stage
        • organism part
        • cell type
        • Animal/plant strain or line
        • genetic variation: wild type, gene knockout ou tansgenic variation
        • individual genetic characteristic
        • additiobal clinical information
        • individual ID
    • Biomaterial manipulations : ce sont les process mis en oeuvre sur la
    • biosource dans le cadre de la manip –> une petite table encore

      • Growth conditions
      • in vivo treatments
      • in vitro treatments : conditions de culture
      • treatment type : drug, heat shock, food deprivation
      • separation technique : none, microdissection, FACS
    • Hybridation extract preparation protocol –> aller encore une table
      • Extraction method URL ou protocol -> une table extraction method bien sur
      • extract type
      • Amplification
    • Labeling protocol –> a voir ou ca se met, je ne sais pas tres bien
      • Amount of nucleic acid labelled
      • label used : A-Cy3, G-Cy5 ou 33P
      • label incorporation method –> table protocol. je vais faire une table biblio globale et des sous-tables pour chaque type de protocoles
    • External controls added to hybridization extract
      • element on array expected to hybridise to spiking control
      • spike type oligonucleotide ou ADN bacterien
      • spike qualifier
  3. Hybridisation procedure and parameters
    • Information about which labelled extracts have been hybridised to which arrays
    • Hybridisation protocol
      • the solution : concentration Na+ ou formamide
      • blocking agent : COTI
      • wash procedure : temperature et concentration en Na+
      • Quantity of labelled target used
      • Time, concentration, volume and temperature
      • Hybridization instruments : fabricant et modèle
  4. Measurement data and specifications of data processing
    • Raw data description
      • Scanning protocol : matériel, logiciel et paramètres --> une petite table pour ca
      • Scanned image –> pas tjs obligatoire mais bon, a mon avis il faut l’inclure, une petite base avec le nom de l’image et sa localisation sur le serveur ca serait bien
    • Image analysis and quantitation
      • image analysis software : specification et version du logiciel d’analyse d’image, l’agorithm et tous les paramètre (ca va faire pas malde données)–> encore une table
      • image analysis output : le fichier de sortie pour chaque image –> c le fichier gpr, une petite table pour ce fichier serait pas mal aussi.
    • Normalized and summarized data : matrice de donnée d’expression des gène
      • data processing protocol : détails sur la normalization –> a voir sous quelle forme mettre ca
      • Gene expression data tables
        • Derived measurements values : rassemble les réplicats et les valeurs associées a un meme gène
        • reliability indicator for each data point : ecart-type ou ecart à la médiane (pas essentiel mais important)

Cela fait pas mal de données a ajouter. en fait je pense que je vais faire bcp de tables individuelles et y faire référence dans des sous-tables.
peut-etre serait-il intéressant de faire l’interface en fonction de ces informations.

il semble que pour l’export d’information, le format MAGE-ML soit universellement reconnu. il me faudra donc surement prévoir l’export dans ce format.
GEO est un site regroupant les données d’expression. pour vouvoir y déposer les données il faudra les envoyer dans un format particuler. le MAGE-ML semble compatible avec ce site, ca me semble le bon choix –> le xml de toute façon c l’avenir

20 février 2008 – installation du module pg pour python2.5 sur berthemorisot

février 20, 2008

14h59: comme rien n’est jamais simple, il est impossible d’utiliser python2.5 par défaut sur berthemorisot a cause de CENTOS qui nécessite python2.3 pour fonctionner (on croit réver).
mais comme python2.5 est en génral plus rapide que le 2.3 et gère mieux certaines chose, c qd meme pas mal de l’utilser si possible.
il est installé dans ~/tools/python-2.5.0/ et on l’appelle par la commande ~>python2.5
je veux utiliser PyGreSQL dans python2.5. il me faut donc l’installer car il n’est pas par défaut. et bien sur pas possible de passer par les rpm ou yum.
donc deja il faut aller chercher le fichier sur http://www.pygresql.org/ et télécharger ftp://ftp.pygresql.org/pub/distrib/PyGreSQL.tgz
moi j’ai copié l’archive dans ~/tools/python-2.5.0/lib/python2.5/site-package/ mais je ne suis pas sur que ce soit totalement nécésssaire.
là j’ai dezipé l’archive
~>gunzip PyGreSQL.tgz
et dearchivé
~>tar -vxf PyGreSQL.tar
j’ai alors un répertoire PyGreSQL-3.8.1 ou je me rend
je suis les instruction d’installation et je lance la commande ~>python2.5 setyp.py build et la bien sur j’ai une erreur

sh: pg_config: command not found
Traceback (most recent call last):
File "setup.py", line 81, in
pg_include_dir = pg_config('includedir')
File "setup.py", line 51, in pg_config
raise Exception, "pg_config tool is not available."
Exception: pg_config tool is not available.

en fait le programme appelle pg_config (fourni avec la base pgresql) sauf que ce programme n’est pas accessible ainsi. il faut donner son chemin complet /usr/local/pgsql/bin/pg_config et la ca marche
il y a qq erreur mais ca a l’air de marcher qd meme
puis on fait ~>python2.5 setup.py install
encore qq erreur mais ca semble marcher qd meme
et puis je lance python2.5 et je tape import pg
et là miracle, ca marche
donc c cool, ca a fonctionner sans trop de galère. mais j’ai peur qd meme de voir apparaitre qq erreur a l’utilisation, enfin on verra

20 février 2008 – script pour introduire des données dans la base (suite)

février 20, 2008

9h57 : suite du test sur l’utilisation du module cgi de python
je rajoute
print dir(form)

je récupère
['FieldStorageClass', '_FieldStorage__write', '__contains__', '__doc__', '__getattr__', '__getitem__', '__init__', '__iter__', '__len__', '__module__', '__repr__', 'bufsize', 'disposition', 'disposition_options', 'done', 'file', 'filename', 'fp', 'getfirst', 'getlist', 'getvalue', 'has_key', 'headers', 'innerboundary', 'keep_blank_values', 'keys', 'length', 'list', 'make_file', 'name', 'outerboundary', 'read_binary', 'read_lines', 'read_lines_to_eof', 'read_lines_to_outerboundary', 'read_multi', 'read_single', 'read_urlencoded', 'skip_lines', 'strict_parsing', 'type', 'type_options']

les methodes sont

__contains__
__getattr__
__getitem__
__init__
__iter__
__len__
__repr__
getfirst
getlist
getvalue
has_key
keys
make_file
read_binary
read_lines
read_lines_to_eof
read_lines_to_outerboundary
read_multi
read_single
read_urlencoded
skip_lines

l’objet se comporte un peu comme un dictionnaire, les méthodes has_key et keys permettent d’accéder aux noms des variables passées dans l’adresse
f.keys() renvoie la liste ['toto','tati']

maintenant il faut voir si ca marche avec une requete ajax
mon fichier avec la requete ajax
http://berthemorisot.gim.pasteur.fr/test_ajax.php
et son contenu
la partie javascript

function req_object(method,query, sync){
//fonction renvoyant un objet
XMLHttpRequest qui effectue la requete. l'objet est renvoyé juste après avoir effectuer la requete
var xhr_object = null;

if(window.XMLHttpRequest)//Firefox

xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Your web browser does not support XMLHTTPRequest objects...");
return;
}
xhr_object.open(method,query, sync);
xhr_object.send(null);
return xhr_object;
}
function request(){
//fonction requete qui envoie des données à test_get.py en utilisant la methode get et
//de façon synchrone (sync=false)
query="cgi-bin/sganarrayl/test_get.py?toto=tata&tati=tonton";
method="get";
sync=false;
var xhr_object=req_object(method,query, sync);
if(xhr_object.readyState == 4) {
//quand la requete est effectuée, affiche le résultat renvoyé par test_get.py dans
//une boite de dialogue
var reponseXML =xhr_object.responseText;
alert(reponseXML);
}
}

et la partie html



1
2

ca marche bien et je reçois correctement la réponse du script python.

12h35 : je vais tester la rapidité de python par rapport au php pour l’accès aux bases de données
j’ai écrit 2 script effectuant les meme actions
le premier en python

#! /usr/bin/python

import cgi
import pg
print "Content-type: text/html"
print

DBNAME = 'sophia'
HOST = 'berthemorisot.gim.pasteur.fr'
USER = 'fricard'
con = pg.connect(dbname=DBNAME, host=HOST, user=USER)
query_all = "select * from features"
all = con.query(query_all)
res=all.getresult()
for val in res[0]:
print val

et le second en php

header("Content-type: text/html");

$HOST="berthemorisot.gim.pasteur.fr";
$PORT=5432;
$BASE="sophia";
$USER="fricard";
$db = pg_connect("host=$HOST port=$PORT dbname=$BASE user=$USER") or die("impossible de se connecter à la base de données");
$query_all = "select * from features";

$res = pg_query($db, $query_all) or die("La requète n'a pas pu aboutir");
$ligne= pg_fetch_row($res, 0);
foreach($ligne as $val){
echo $val.'\n';
}

le code python met en moyenne 222 ms pour faire la requete (sur 11 essais) et le code php met 120 ms en moyenne (sur 11 essais). la requete part du meme script ajax, donc tout est bien equivalent. le code python est presque 2 fois plus lent.
je vais le tenter sur une requete plus longue, car il peut s’agir juste d’un problème d’initialisation.
en modifiant le script pour renvoyer l’ensemble des résultats de la table feature (13316 lignes), le temps d’execution du script python passe a 1518 ms en moyenne (sur 10 essais) et le script php 1481 ms en moyenne(12 essais).
la différence venait donc de l’initialisation de python je pense ou quelque chose comme ca. et encore, je suis obligé d’utiliser python2.3 car le module pg n’est pas installé sur python2.5. je vais essayer de l’installer sur python2.5 pour etre plus tranquille. installation ici
15:25 : je test le meme script avec python2.5 et je n’ai aucune différence, c le meme temps d’execution. mais bon, je préfère quand meme pouvoir me servir de python2.5

Au final je vais donc me servir de python puisque c’est a peine plus lent sur les grosse requetes. il serait qd meme interressant de voir s’il est possible de parser le fichier gpr en php de façon assez simple. cela dit le python est plus simple d’utilisation. a voir donc. dans un premier temps python et puis ensuite peut-etre php.

18h38 : la partie essentielle de sganarrayl est de traiter le fichier envoyé par l’utilisateur. il faut donc etre capable d’envoyer et de recevoir un fichier.
pour l’envoie, les formulaires font ca très bien en utilisant cette ligne de commande
form id="ajax_form" name="ajax_form" action="cgi-bin/sganarrayl/test_get.py" method="post" ENCTYPE="multipart/form-data"

il faut donc utiliser la méthode post, j’ai essayé avec get et ca ne marche pas, ce qui finalement est assez normal car le fichier ne peut pas passer dans l’adresse. ne pas oublier non plus l’encodage avec multipart/form-data
il faut aussi ajouter une balise input de type file mais ca c trivial
input type="file" id="fichier" name="fichier"

du coté du cgi, pour traiter ca c assez simple
on créé une première instance de FieldStorage et on récupère ainsi toutes les variable post. quand un fichier est envoyé, il est stocké sous la forme d’un objet FieldStorage (a nouveau) accessible par la clé qui est le nom de la balise input du formulaire. ok c pas clair mais par contre c tres simple a écrire

import cgi #on importe la classe cgi bien sur
post_data=cgi.FieldStorage() #on récupère les données passée en post
f=post_data['fichier'] #on récupère la variable associée a la clé "fichier"
#comme c un fichier l'objet récupéré est un FieldStorage, avec un attribut file qui est un filehandle
for line in f.file: #on parcours alors ce filehandle
print "%s" % line #et on inprime chaque ligne

facile, non ?
ca marche bien, meme avec un gros fichier du type gpr (fichier de resultat de microarray) et c rapide.
par contre, il n’y a pas le choix, il faut pour envoyer le fichier, passer par le formulaire et un bouton submit. c pas possible de traiter ca juste avec AJAX.
c’est très bien expliqué ici

19 février – script pour introduire des données dans la base

février 19, 2008

18h40 : ce premier script pour introduire des données dans la nouvelle base est un essai, pour voir la structure qu’il faut lui donner.
je vais le faire en python, mais pour bien faire il faudrait le faire en php.
le premier problème que je vois est le fait que bcp de tables sont liées, il faut donc remplir les premières tables d’abord (facile avec ajax, plus galère avec python)
il est peut-etre préférable d’attaquer l’interface web/ajax directement.
par ailleurs je viens de réaliser que le php n’est peut-etre pas nécessaire. on peut aussi passer des paramètre par get ou post à une page python.
Je vais commencer par regarder ca.
je pense que le module cgi de python est fait pour ca. je vais tester ce module avec un script python simple sur berthemorisot
-creation du répertoire sganarrayl dans www/cgi-bin/
-création tu fichier test_get.py dans www/cgi-bin/sganarrayl/
-tout d’abord je regarde si je peux afficher un texte html simple
http://berthemorisot.gim.pasteur.fr/cgi-bin/sganarrayl/test_get.py
bien sur ca ne marche pas, je ne peux afficher ni du code provenant de python, ni de l’html
-je fais des test en essayant d’afficher un fichier du répertoire oligo mais ca ne marche pas non plus
-par contre un fichier de la racine s’affiche bien –>peut-etre un pb de répertoire
-j’essaye de copier mes fichiers dans la racine mais ca ne marche pas non plus
-bon, ok, ca marche, j’avais oublié le #! en tete du fichier – ne pas oublier non plus de le rendre executable

si j’ajoute les lignes

form=cgi.FieldStorage()
print form

je récupère

FieldStorage(None, None, [])

et si je passe des paramètre dans l’adresse (genre http://berthemorisot.gim.pasteur.fr/cgi-bin/sganarrayl/test_get.py?toto=tata
je récupère FieldStorage(None, None, [MiniFieldStorage('toto', 'tata')])
et pour http://berthemorisot.gim.pasteur.fr/cgi-bin/sganarrayl/test_get.py?toto=tata&tati=tonton
je récupère FieldStorage(None, None, [MiniFieldStorage('toto', 'tata'), MiniFieldStorage('tati', 'tonton')])
a

19 février 2008 – redéfinition des tables de la base pour SganArrayl (suite)

février 19, 2008

13h54 : j’ai une ébauche de base avec 13 table pour le moment. après réflexion, je vais ajouter 2 tables, 1 bait et 1 control pour stocker les orf utilisées dans ces 2 cas. cela devrait accélerer la recherche des orf control par exemple.


la base telle qu’elle est permet de stocker les résultats brut et les données relatives à la manip. il manque d’ailleurs des champs intéressants meme s’ils sont un peu redondant. dans experiment il faut ajouter un champs exp_replicate_nb et dans duplicates il faut ajouter dup_slide_nb. au passage je vais renommer duplicates en replicates.
14h36 : maintenant que les tables de base sont construites, il faut réfléchir aux tables pour les données traitées.
après avoir chargé les données, l’utisateur devra indiquer quelles données comparer avec quelles données. c’est a dire finalement préciser quels ratios de signal vont etre observés. il serait possible de faire ce traitement a la volée chaque fois que le programme est utilisé mais ca semble une perte de temps. le mieux est de conserver les données traitées tout en laissant la possibilité de refaire les calculs sur d’autre ratio par exemple.
il faut pour cela utiliser 2 tables. une première table ratio_info qui pour chaque manip cette table sera liée à la table fluo_type, donnant ainsi les 2 éléments pour calculer le ratio. la seconde table ratio, fera reference a cette table pour le ratio et contiendra les valeurs de ratio brutes, centrées et normalisée.

je vais essayer de générer les tables dans postgresql. dbdesigner4 pemet de générer la requete sql qui va bien. je vais la récupérer et retirer les foreign_key en trop.
18h18 : j’ai fini de réécrire la requète, j’aurais presque eu le temps de ‘écrire diurectement sans passer par l’aide de dbdesigner. celle-ci était écrite en mysql, c’est finalement assez différent du postgresql. mais bon la requete marche.
j’ai ajouté un prefixe a toute les tables (llp pour luce la puce) afin de reconnaitre facilement mes table et de les effacer au cas ou. il aurait été plus malin de mettre des prefixe correspondant a la catégorie des table, genre experiment_description (ede) et experiment_data (eda).
enfin c pas grave. voici la requete a faire pour creer ces tables

CREATE TABLE llp_orf (
orf_id SERIAL NOT NULL,
orf_name VARCHAR(20) NULL,
orf_gene VARCHAR(20) NULL,
CONSTRAINT orf_id_key PRIMARY KEY(orf_id)
);

CREATE TABLE llp_mutation (
mut_id SERIAL NOT NULL,
mut_type VARCHAR NULL,
CONSTRAINT mut_id_key PRIMARY KEY(mut_id)
);

CREATE TABLE llp_orf_has_mutation (
om_id serial NOT NULL,
om_orf_id INTEGER NOT NULL,
om_mut_id INTEGER NOT NULL,
CONSTRAINT om_id_key PRIMARY KEY(om_id),
CONSTRAINT om_orf_id_key FOREIGN KEY(om_orf_id) REFERENCES llp_orf(orf_id),
CONSTRAINT om_mut_id_key FOREIGN KEY(om_mut_id) REFERENCES llp_mutation(mut_id)
);

CREATE TABLE llp_bait (
bait_id SERIAL NOT NULL,
bait_om_id INTEGER NOT NULL,
CONSTRAINT bait_id_key PRIMARY KEY(bait_id),
CONSTRAINT bait_om_id_key FOREIGN KEY(bait_om_id) REFERENCES llp_orf_has_mutation (om_id)
);

CREATE TABLE llp_control (
cont_id SERIAL NOT NULL,
cont_om_id INTEGER NOT NULL,
CONSTRAINT cont_id_key PRIMARY KEY(cont_id),
CONSTRAINT cont_om_id_key FOREIGN KEY (cont_om_id) REFERENCES llp_orf_has_mutation (om_id)
);

CREATE TABLE llp_chip_type (
ct_id SERIAL NOT NULL,
ct_name VARCHAR NULL,
CONSTRAINT ct_id_key PRIMARY KEY(ct_id)
);

CREATE TABLE llp_experiment_type (
et_id SERIAL NOT NULL,
et_name VARCHAR NULL,
et_desc VARCHAR NULL,
CONSTRAINT et_id_key PRIMARY KEY(et_id)
);

CREATE TABLE llp_technicians (
tech_id SERIAL NOT NULL,
tech_first_name VARCHAR NULL,
tech_last_name VARCHAR NULL,
CONSTRAINT tech_id_key PRIMARY KEY(tech_id)
);

CREATE TABLE llp_experiments (
exp_id SERIAL NOT NULL,
exp_ct_id INTEGER NOT NULL,
exp_et_id INTEGER NOT NULL,
exp_tech_id INTEGER NOT NULL,
exp_bait_id INTEGER NOT NULL,
exp_cont_id INTEGER NOT NULL,
exp_bait_generation_nb INTEGER NULL,
exp_control_generation_nb INTEGER NULL,
exp_fluo_nb INTEGER NULL,
exp_comment VARCHAR(250) NULL,
CONSTRAINT exp_id_key PRIMARY KEY(exp_id),
CONSTRAINT exp_ct_id_key FOREIGN KEY (exp_ct_id) REFERENCES llp_chip_type(ct_id),
CONSTRAINT exp_et_id_key FOREIGN KEY (exp_et_id) REFERENCES llp_experiment_type(et_id),
CONSTRAINT exp_tech_id_key FOREIGN KEY (exp_tech_id) REFERENCES llp_technicians(tech_id),
CONSTRAINT exp_bait_id_key FOREIGN KEY (exp_bait_id) REFERENCES llp_bait(bait_id),
CONSTRAINT exp_cont_id_key FOREIGN KEY (exp_cont_id) REFERENCES llp_control(cont_id)
);

CREATE TABLE llp_replicates (
rep_id SERIAL NOT NULL,
rep_exp_id INTEGER NOT NULL,
rep_mating_date DATE NULL,
rep_slides_nb INTEGER NOT NULL,
rep_entry_date DATE NULL,
CONSTRAINT rep_id_key PRIMARY KEY(rep_id),
CONSTRAINT rep_exp_id_key FOREIGN KEY(rep_exp_id) REFERENCES llp_experiments(exp_id)
);

CREATE TABLE llp_spots (
sp_id SERIAL NOT NULL,
sp_block INTEGER NULL,
sp_col INTEGER NULL,
sp_row INTEGER NULL,
sp_name VARCHAR NULL,
CONSTRAINT sp_id_key PRIMARY KEY(sp_id)
);

CREATE TABLE llp_slides (
sl_id SERIAL NOT NULL,
sl_rep_id INTEGER NOT NULL,
sl_ref VARCHAR NULL,
sl_metadata VARCHAR NULL,
CONSTRAINT sl_id_key PRIMARY KEY(sl_id),
CONSTRAINT sl_rep_id_key FOREIGN KEY(sl_rep_id) REFERENCES llp_replicates(rep_id)
);

CREATE TABLE llp_spot_data (
spd_id SERIAL NOT NULL,
spd_sp_id INTEGER NOT NULL,
spd_sl_id INTEGER NOT NULL,
spd_dia VARCHAR NULL,
spd_flags VARCHAR NULL,
spd_autoflag VARCHAR NULL,
CONSTRAINT spd_id_key PRIMARY KEY(spd_id),
CONSTRAINT spd_sp_id_key FOREIGN KEY(spd_sp_id) REFERENCES llp_spots(sp_id),
CONSTRAINT spd_sl_id_key FOREIGN KEY(spd_sl_id) REFERENCES llp_slides(sl_id)
);

CREATE TABLE llp_fluo_type (
fl_id SERIAL NOT NULL,
fl_name VARCHAR NULL,
fl_lambda INTEGER NULL,
fl_molecule VARCHAR NULL,
CONSTRAINT fl_id_key PRIMARY KEY(fl_id)
);
CREATE TABLE llp_raw_signal (
rsg_id SERIAL NOT NULL,
rsg_fl_id INTEGER NOT NULL,
rsg_spd_id INTEGER NOT NULL,
rsg_foreground_median INTEGER NULL,
rsg_forground_mean INTEGER NULL,
rsg_foreground_sd INTEGER NULL,
rsg_background INTEGER NULL,
rsg_background_median INTEGER NULL,
rsg_background_mean INTEGER NULL,
rsg_background_sd INTEGER NULL,
rsg_snr FLOAT NULL,
CONSTRAINT rsg_id_key PRIMARY KEY(rsg_id),
CONSTRAINT rsg_fl_id_key FOREIGN KEY(rsg_fl_id) REFERENCES llp_fluo_type(fl_id),
CONSTRAINT rsg_spd_id_key FOREIGN KEY(rsg_spd_id) REFERENCES llp_spot_data(spd_id)
);

CREATE TABLE llp_denominator (
den_id SERIAL NOT NULL,
den_fl_id INTEGER NOT NULL,
CONSTRAINT den_id_key PRIMARY KEY(den_id),
CONSTRAINT den_fl_id_key FOREIGN KEY (den_fl_id) REFERENCES llp_fluo_type(fl_id)
);

CREATE TABLE llp_numerator (
num_id SERIAL NOT NULL,
num_fl_id INTEGER NOT NULL,
CONSTRAINT num_id_key PRIMARY KEY(num_id),
CONSTRAINT num_fl_id_key FOREIGN KEY(num_fl_id) REFERENCES llp_fluo_type(fl_id)
);

CREATE TABLE llp_ratio_info (
rnfo_id SERIAL NOT NULL,
rnfo_exp_id INTEGER NOT NULL,
rnfo_num_id INTEGER NOT NULL,
rnfo_den_id INTEGER NOT NULL,
CONSTRAINT rnfo_id_key PRIMARY KEY(rnfo_id),
CONSTRAINT rnfo_exp_id_key FOREIGN KEY(rnfo_exp_id) REFERENCES llp_experiments(exp_id),
CONSTRAINT rnfo_num_id_key FOREIGN KEY(rnfo_num_id) REFERENCES llp_numerator(num_id),
CONSTRAINT rnfo_den_id_key FOREIGN KEY(rnfo_den_id) REFERENCES llp_denominator(den_id)
);

CREATE TABLE llp_ratio (
rat_id SERIAL NOT NULL,
rat_rnfo_id INTEGER NOT NULL,
rat_raw_val FLOAT NULL,
rat_centered_val FLOAT NULL,
rat_norm_val FLOAT NULL,
CONSTRAINT rat_id_key PRIMARY KEY(rat_id),
CONSTRAINT rat_rnfo_id_key FOREIGN KEY(rat_rnfo_id) REFERENCES llp_ratio_info(rnfo_id)
);

le fichier de cette requete est à l’emplacement ~/bioinfo/microarray/dbdesigner/DBDesigner4/Examples/luce_la_puce_experiment.sql

il faut maintenant écrire le script pour rentrer des données dans la base.