Archives pour mars 2008

31 3ars 2008 – parser global, la suite

mars 31, 2008

12h29 : le parser actuellment ne gère pas la possibilité qu’il n’y ai pas de ligne de titre pour les colonnes, je vais le rajouter.
l’option est assez simple. si rien n’est mentionné le parser suppose qu’il y a une ligne de titre a récupéré. si une liste nom de colonne est passée en argument (genre column_names=['colonne A', 'colonne B', 'colonne C'] elle est utilisée comme liste par défaut. si l’argument est column_names=None, alors la liste de nom de colonne sera choisie arbitrairement (par ex col_0, col_1, col_2).
j’en ai profité pour modifié un peu l’__init__.
on peut lui passer une liste d’argument en entrée.
les mots clés reconnus pour l’instant sont filename, file, file_arg, tous les 3 pour le nom du fichier a parser (c’est juste pour laisser plus de liberté) et column_names.

def __init__(self, **arg):        '''        x = Items(**arg)        open and read the file to parse.        parse it according to the specified options        arg keys :        file, filename or file_arg -> str, identifier for the file to parse        column_names -> optional. must be NOT specified if the column names are in the file to parse         must be specified if there is no column names in the file.            - column names are given as a list or tuple            - if value None affected, column names will be assigned automatically.        '''        #initialize a flag dictionary        self.flag = {}        #get the column_names argument        self.flag['column_names'] = arg.get('column_names', False)        #get the filename argument (3 possibilities)        file_arg = arg.get('filename', '')        if not file_arg : file_arg = arg.get('file', '')        if not file_arg : file_arg = arg.get('file_arg', '')        try :            #call get_fhin to open file_arg            fhin = self.get_fhin(file_arg)

        except TypeError, e :            #if error of type of the argument file_arg returned, raise the error            print e            raise        except IOError :            #if problem for opening file_arg, raise the error            raise        #if the file is open and readable start to parse the file        self.parse_file(fhin)        #do some after init actions like closing files        self.__end_init__(fhin)

le module de test tel qu’il est fait vérifie bien que toutes les infos ont été parsées mais ne vérifie pas que ce sont bien les bonnes données qui sont dans les bons attributs.
pour cela il me faut des accesseurs pour les items.
J’ai ajouté la méthode get_attribute() a item. cette méthode renvoie la valeur affectée à un attribut passé en argument et none si l’attribut n’existe pas.

    def get_attribute(self, attr):        '''        val = x.get_attribute(attr)        attr -> str        val -> str, int, float or boolean        return the value of an attribute if exists, None if not        '''

        return self.get(attr, None)

j’ai également ajouté get_attr_list() à items qui renvoie la liste des valeurs affectées a un attribut passé en argument pour l’ensemble des item stockés dans la collection

    def get_attr_list(self, attr):        '''        values = x.get_attr_list(attr)        attr -> str        values -> list of str, int, float, boolean or None        return a list containing values of the given attr for all items in x        '''        return [item.get_attribute(attr) for item in self]

puis j’ai ajouté un nouveau module de test pour verifier que toutes les info sont bien récupérées.

    def test_parsed_data(self):        '''        teste si les donnees parsees sont correctes        '''        header_info_1 = "header_01"        header_info_2 = "header_02"        col_1 = "col_1"        col_2 = "col_2"        col_3 = "col_3"        data_l1_c1 = "data_l1_c1"        data_l1_c2 = "data_l1_c2"        data_l2_c1 = "data_l2_c1"        data_l2_c2 = "data_l2_c2"        test_file='''#%s#%s%s\t%s%s\t%s%s\t%s''' % (header_info_1, header_info_2, col_1, col_2, data_l1_c1, data_l1_c2, data_l2_c1, data_l2_c2)        self.write_tmp_file(filetext = test_file)        test_item = Items(file_arg = 'tmp_file')        self.assert_(test_item.get_header() == [header_info_1,header_info_2])        self.assert_(test_item[0].get_attribute(col_1) == data_l1_c1)        self.assert_(test_item[0].get_attribute(col_2) == data_l1_c2)        self.assert_(test_item[1].get_attribute(col_1) == data_l2_c1)        self.assert_(test_item[1].get_attribute(col_2) == data_l2_c2)        self.assert_(test_item[0].get_attribute(col_3) == None)        self.assert_(test_item[1].get_attribute(col_3) == None)               self.assert_(test_item.get_attr_list(col_1) == [data_l1_c1, data_l2_c1])        self.assert_(test_item.get_attr_list(col_2) == [data_l1_c2, data_l2_c2])        self.assert_(test_item.get_attr_list(col_3) == [None, None])

        remove('tmp_file')

a faire demain -> les données sont pour l’instant parsées indépendamment de leur contenu. elles sont toutes stockées comme texte. il faut que je rajoute le module de conversion…

26 mars 2008 – répartition aleatoire de sage sur le génome

mars 26, 2008

17h18 :
Je veux savoir si une répartition des sage aléatoire sur le génome produirait les memes résultats en terme de segments.
l’idée est de répartir sur les 24 million de position possible les 267000 tags de façon aleatoire, puis de rechercher les segments de la meme manière qu’avec les vraies données et ensuite de regarder la tailles des segments produites.
1- je pars des valeurs suivante
genome : 24 313 356 bases
tag, après filtration (juste tag unique et correct) 267023 tag
2- dans matlab je fait une répartition random de ces tags.
pour cela je genere 267023 valeurs aléatoire que je multiplie par la taille du génome
j’ai alors 267023 valeurs comprise entre 0 et 24313356

rand_tag=zeros(267023,1);for i=1:267023rand_tag(i,1)=gen*rand();end

on reparti dans une matrice de la taille du genome ces différents tag

g=zeros(24313356,1);for i=1:267023g(ceil(rand_tag(i,1)))=g(ceil(rand_tag(i,1))) + 1;end

je fait appelle ensuite à la fonction region_hit

cpt = region_hit(g, 1,1,1,1);

je recupère en sortie une matrice
–> cette méthode n’est pas la bonne car je vais etudier la répartition des segments sur une ditribution aléatoire. hors ce n’est pas exactement ce que je veux montrer.
je veux finalement montrer que c’est la distrivution des sage (ou le tirage) qui est ou pas aléatoire.
je suis parti sur l’idée d’un tirage aléatoire.
je ne le fait que sur les tag des manip 1 et 2.
ca en fait 77000
je fait un randperm sur une matrice de la taille du génome et je sélection les 77000 premie résultats.
ce seront les 77000 position aléatoire de mes tag

>> taille_gen=24313356;>> gen=[1:taille_gen];>> x=randperm(taille_gen);>> rand_tag_12=gen(x(1:77212));>> rand_tag_12=sort(rand_tag_12');>> dist_rand_tag12=diff(rand_tag_12);>> hist(dist_rand_tag12,100)

et je récupère en sortie

je fait la meme chose sur les tag des manip 1 & 2
j’utilise le fichier matlab ~/total/stats/tag_tot_genome.mat

n12 = sum(header01) + sum(header02);tag12=zeros(n12,1);j=1;for i=1:size(header01,1)t=header01(i,1);if (t>0)  for k=1:t     tag12(j,1)=i;     j=j+1;  endendendfor i=1:size(header02,1)t=header02(i,1);if (t>0)  for k=1:t     tag12(j,1)=i;     j=j+1;  endendendtag12=sort(tag12);dist_tag12=diff(tag12);hist(dist_tag12(find(dist_tag12<3500)),100)

et je récupère

on voit bien que les distributions sont différentes mais il faudrait une valeur numérique pour le prouver.
on a pour la distribution des tag 1 et 2 :

>>mean(dist_tag12)ans =306.8112>> median(dist_tag12)ans =0>> std(dist_tag12)ans =1.4071e+03

et pour la dsitribution aléatoire

>> mean(dist_rand_tag12)ans =314.8891>> median(dist_rand_tag12)ans =218>> std(dist_rand_tag12)ans =316.0702

on voit bien que la mediane est très différente.
mais ce n’est peut-etre pas un critère suffisant
le test du chi2 permet de voir si une distribution est aléatoire ou non
prennons la taille du génome totale -> 24313356
prennons le nb de tag 1 et 2 -> 77212
s’il sont répartis de façon homgène sur le génome ca fait 1 tag tout les 314 nucleotide environ.
imaginons qu’il soient réparti selon une distribution normal centrée autour de cette distance moyenne.

>> g2=randn(77212,1);>> g2=g2+abs(min(g2));>> mean(g2)ans =4.3959>> coeff = 314/4.3954coeff =71.4383>> g2=g2*coeff;>> hist(g2,100)>> [h,p]=chi2gof(g2)h =0p =0.7848

la distribution de ces distances est la suivante


avec une p-value sur le test de chi2 de 0.7848,
donc une proba très forte que cette distribution soit aléatoire.
Si je représente la distribution des distance entre tag des manip 1 et 2
(voir au-dessus), on voit que celle-ci est centrée sur 0, donc la plupart
des tag sont très proches entre eux

le test du chi2 sur cette distribution donne :

>> [h,p]=chi2gof(dist_tag12, 'nbins',32)h =1p =0

une p-value de 0, soit une proba nulle que ce soit une distribution aléatoire.
on calcule pour la distrib aléatoire

>> median(g2)ans =  314.8353>> mean(g2)ans =  314.8909>> std(g2)ans =   71.6086

et pour les manip

>>mean(dist_tag12)ans =306.8112>> median(dist_tag12)ans =0>> std(dist_tag12)ans =1.4071e+03

je fais ensuite la meme chose pour les tag des manip 7 et 8

n78 = sum(header07) + sum(header08);tag78=zeros(n78,1);j=1;for i=1:size(header07,1) t=header07(i,1); if (t>0)     for k=1:t         tag78(j,1)=i;         j=j+1;     end endendfor i=1:size(header08,1) t=header08(i,1); if (t>0)     for k=1:t         tag78(j,1)=i;         j=j+1;     end endendtag78=sort(tag78);dist_tag78=diff(tag78);

puis je fais une distribution aléatoire de tag équivalente

g=randn(69549,1);>> g=g+abs(min(g));>> mean(g)ans = 4.3684>> 24313356/69549ans =349.5860>> coeff = 349/4.3684coeff =79.8920>> g=g*coeff;>> hist(g,100)

j’obtiens pour la distribution aléatoire

>> [h,p]=chi2gof(g)h =   0p =  0.7109

soit une proba de 0.7 que ce soit une distrib aléatoire
avec la distrib suivante

et pour les tag

>> [h,p]=chi2gof(dist_tag78, 'nbins',25)h =   1p =   0

soit une proba nulle que ce soit aléatoire
avec la distrib suivante

pour cette distribution on a

>> mean(dist_tag78)ans =  348.9803>> median(dist_tag78)ans =     0>> std(dist_tag78)ans =   1.5912e+03

et pour la distrib aléatoire

>> median(g)ans =  348.9698>> mean(g)ans =  348.9981>> std(g)ans =   80.0903

les images sont dans ~/Desktop/screenshot/tags

26 mars 2008 – parser global, browsing du fichier

mars 26, 2008

10h44 : je vais donc écrire les méthodes pour parcourir les fichiers et effectuer les actions adaptées selon la ligne.
il faut prévoir tous les cas. voila ce que je pense faire.
une méthode de pré-traitement, vide par défault pour analyser le header de façon spécifique
une méthode de browsing avec un filtre qui met de coté les lignes du header (ca peut etre optionnel aussi)
les ligne de data sont récupéré dans une liste
une méthode d’analyse de la première ligne pour déterminer les nom de colonne, optionnel aussi
une méthode de traitement de toutes les autres lignes.

j’ai créé ces méthodes.
le programme suit donc la logique suivante :
parsing du header par une méthode spécifique. -> celle-ci est vide par défaut mais elle devra etre surclasser si besoin dans les parser qui dériveront ce celui-ci
browsing de tout le fichier et stockage des lignes dans une liste. au moment de ce stockage, les lignes sont testée pour savoir s’il elle sont valides.
je teste si ce n’est pas une ligne vide et si ce n’est pas du commentaire. a noter que ce que j’appelle commentaire est le header du fichier. je stocke ce header dans une liste mais un objet header serait plus malin. je ferai ca
une fois que j’ai récupéré les lignes valides, je cherche dans la première ligne les nom des colonne. il faut que je puisse m’affranchir de ca. je vais ajouter une option a l’instanciation de item pour préciser s’il y a une ligne de titre de colonne.
et sinon, il faut pouvoir fournir des noms de colonne ou les générer s’ils ne sont pas fournis
ensuite je parcours la liste des données et je parse chaque ligne en splitant sur le séparateur de champ et je créé une instance de Item en lui passant la liste des valeurs et des attributs.
Item va alors faire des couple de valeurs nom de colonne/valeur et va rentrer l’ensemble de ces couple dans son dictionnaire interne (car item hérite de dict).
je récupère chaque item dans une liste
et cette liste est ajoutée a la liste interne de Items (qui hérite de list)
et voial, c’est parsé. c’est beau non ?
je suis pas certain que ce soit l’algo le plus efficace car je parcours plusieurs fois les données. le problème est surtout que je stocke le fichier dans une liste temporaire. ce n’est pas très bien si on ne connait pas la taille du fichier avant.
mais bon, deja je peux faire une vérif de la taille du fichier avant et aussi la capacité des micro permet facilement de gerer ca je pense. les liste ne devraient pas faire plus de qq centaine de millier de ligne, a mon avis moins d’un million. en tou cas pour le moment. ce n’est pas très dur de modifier ce code pour mieux traiter les gros fichiers. il suffit de parser les ligne lors du browsing.

j’ai aussi mis en place la partie test de ces méthodes.
je créer des fichiers en faisant varier le nb de ligne, de colonnes et aussi le nb de ligne de header et je test si le fichier est bien parsé, si j’ai le bon nombre de lignes (taille de la liste items), le bon nombre de colonne (taille des objet item contenus dans items) et le bon nombre de ligne dans headers.
je teste aussi les fichiers vide, les fichier sans header, les fichiers sans valeurs, juste des noms de colonnes. il faut aussi que je teste les fichiers qui n’ont pas de ligne de titre de colonne. mais pour ca je dois modifier le programme pour gérer cette option.
il me faut aussi prévoir des fichiers qui auraient été mal fait. comme par exemple des lignes vides, des colonnes vides, des ligne sans le meme nombre de valeurs

en testant ces fichiers, j’ai vu que
-si une ligne est vide mais qu’elle contient juste une tabulation ca génère une erreur. a voir si c’est important. ca venait peut-etre aussi du fait que c’était la première ligne parsée, avant celle des attributs
-si j’ai moins d’élément dans la ligne que le nb de colonne, alors certain attributs de colonnes vont manquer dans l’objet item. ca peut-etre génant, mais c pas sur non plus
sinon ca marche bien.
lundi il faudra ajouter la gestion de la ligne de titre de colonne absente et gérer ces petites erreurs eventuellement.

25 mars 2008 – vers un parser global

mars 25, 2008

14h19 : j’ai ecrit plusieurs parser pour différents format de fichiers.
ceux-ci sont toujours basé sur la meme structure. un objet item dans lequel seront stockés les info d’une ligne (ou d’un ensemble de lignes) et un objet collection qui rassemble l’ensemble des items.
l’objet collections gere a peu pret tout. cela dit c’est l’objet item qui parse les lignes individuelles mais ce n’est peut-etre pas une bonne idée.
en fait si on veut créer un super-parser d’ou hériteront tous les autres, c’est compliqué de travailler avec 2 classes qu’ils faudra manipuler.
meme si je préfère donner plus de responsabilité a la classe item, je vais bcp limiter celle-ci et les transferer sur la classe collections.
a moins que je puisse vraiment les donner a la classe item en lui transferant la fonction de parsing.
bon, il faut que je vois comment on passe des fonctions en argument.
en cherchant ca, j’ai trrouver un passage d’un livre sur les test de fonction.
il semble que ce soit très important. je vais donc essayer de travailler dans ce sens en créant des fonction de test de mon programme.
la fonction assert permet de faire les test facilement.
–> le passage d’une fonction en argument est on ne peut plus simple. je vais donc utiliser cela avec ma classe item.
bon, commençons ce parser de façon simple.
tout d’abord il faut créer une classe items qui sera ma collection d’item.
celle-ci va commencer par traiter un fichier ou un filehandle.
le nome du fichier ou l’instance du filehandle correspondant est passé en argument.
je met en place un système de gestion d’erreur pour tester la validité des fichiers présents.

class Items(list) :  '''  class Items  classe generique pour creer un parser.  cette classe est une collections d'objet item  '''  def __init__(self, file_arg):      '''      x = Items(filename) or x = Items(filehandle)      open and read the file to parse.      parse it according to the specified options      '''      try :          fhin = self.get_fhin(file_arg)      except TypeError, e :          print e          raise

      except IOError :          raise

  def get_fhin(self, file_arg):      '''      fhin = x.get_fhin(file_arg)      test the type of the argument, return the matching filehandle if any or raise a TypeError      '''      if type(file_arg) == file :          return file_arg      if type(file_arg) == str :          try :              return self.open_file(file_arg)          except IOError, e :              print e              raise

      raise TypeError, 'the argument is not a regular file object'

  def open_file(self, filename):      if not isfile(filename) :          raise IOError, "file %s doesn't exist" % filename      if not access(filename, R_OK) :          raise IOError, "permission denied for file %s" % filename      return open(filename, 'r')

j’implémente en meme temps un module de test pour ce programme. j’utilise le framework unittest qui est très simple.
pour cette première partie, dans lme module de test je créé d’abord un fichier a parser et je vérifie qu’il s’ouvre bien.
je teste aussi que les erreurs sont bien repérées.

from parser import *from string import joinimport unittestfrom os import remove, chmod

class parser_test_case(unittest.TestCase):  '''  Classe de test de parser.py.  herite de unittest.TestCase  execute automatiquement la methode setUp a l'initialisation  puis toute les fonctions commencant par test_  puis la methode tearDown (uniquement si setUp n'a pas renvoye d'erreur)  '''

  def setUp(self):      '''      mise en place des element de test      s'applique automatiquement la fin du test      '''      #definition d'un nom de fichier      self.filename = 'tmp_parse.txt'      #creation du fichier temporaire      self.create_tmp_file(filename = self.filename)

  def tearDown(self):      '''      nettoyage des elements mis en place dans le setup      s'applique automatiquement la fin du test      '''      #effece le fichier cree dans le setup      remove(self.filename)   

  def test_read_file(self):      '''      fonction test de lecture de fichier           '''      #ouvre le fichier qui a ete cree dans le setup en lecture      fhin = open(self.filename)      #cree une instance de items avec ce filehandle      test_item = Items(fhin)      #teste si une instance de Items a bien ete cree      self.assert_(isinstance(test_item, Items))      #ferme le fichier      fhin.close()      #cree une instance de items en passant juste le nom de fichier      test_item = Items(self.filename)      #teste si une instance de Items a bien ete cree      self.assert_(isinstance(test_item, Items))      #teste si le passage d'un argument du mauvais type renvoie bien l'erreur      self.assertRaises(TypeError, Items, 2)      #teste si l'ouverture d'un fichier inexistant renvoie une erreur      self.assertRaises(IOError, Items, 'toto')      #retire tous les droits d'acces au fichier cree      chmod(self.filename, 000)      #test si l'ouverture de fichier sans droit de lecture renvoie uen erreur      self.assertRaises(IOError, Items, self.filename)

  def write_header(self, fhout):      '''      x.write_header(fhout)      ecriture d'un header dans le fichier      '''      #defini le header      header = '#header line'      #ecrit le header dans le fichier      print >>fhout,header

  def write_line(self, fhout, values):      '''      x.write_line(fhout, values)      ecriture des valeurs contenues dans une collection (values)      sous la forme d'une ligne dons les element sont separes par une tabulation      '''      #concatene les valeurs de la liste      line = join(values, '\t')      #ecrit la ligne dans le fichier      print >>fhout, line

  def write_data(self, fhout):      '''      x.write_data(fhout)      ecrit le contenu du fichier      '''      #definit les intitules des colonnes           attr = ('col1', 'col2')      #defini les valeurs sous forme d'une liste de liste. chaque sous-liste correspond a une ligne      data = (              ('data1.1',),              ('data1.2',),              )      #appel la fonction write_line pour ecrire les noms des colonnes      self.write_line(fhout, attr)      #map sur la liste data pour appeler sur chaque element la fonction write_line      map(lambda x :  self.write_line(fhout, x), data)

  def create_tmp_file(self, filename):      '''      x.create_tmp_file(filename)      creation d'un fichier qui sera parse      '''      # creation du fichier      fhout = open(filename,'w')      #appel de la fonction de creation du header      self.write_header(fhout)      #appel de la fonction de creation du corp du fichier      self.write_data(fhout)      #fermetur du fichier      fhout.close()

if __name__ == '__main__' :  #lance tous les classes de test du module  unittest.main()

je recupère en sortie

the argument is not a regular file objectfile toto doesn't existpermission denied for file tmp_parse.txt.----------------------------------------------------------------------Ran 1 test in 0.001s

OK

j’ai donc maintenant une objet capable d’ouvrir un fichier ou de récupéré un filehandle. bon, c’est pas très avancé pour l’instant.
une fois qu’on a le filehandle, il faut donc le parcourir.
on a plusieurs choix. parcourir tout le ficher, mettre les ligne dans une structure et y revenir après, ou analyser chaque ligne et faire l’action qui va bien en fonction de ce qu’on voit.
la première méthode permet un parsing plus complexe car on peut ainsi analyser les lignes assez finement mais ca necessite de stocker les info dans une liste qui peut s’averer grosse.
la deuxième n’a pas cet inconvénient mias necessite de faire le parsing a la volée, il faut donc que toutes les actions soient définies avant.
partons sur la méthode utilisant moins de mémoire. on a plusieurs chose a retrouver.
il y a donc la partie header, la liste des colonnes et les valeurs.
mais ca c’est en supposant que le fichier est toujours sous cette forme, des meta-données en haut, puis un tableau avec le nom des colonnes dans la première ligne.
c’est vrai que c’est comme ca dans la majorité des cas. on peu imaginer que pour des fichiers très différents on fera un parser très différent.
maintenant il se pose un autre problème. mers teste sur les fichier gal m’ont montré qu’il était plus intéressant pour ce type de fichier de savoir le nombre de ligne du header (qui est indiqué dans la 2eme ligne du fichier). du coup le parsing du header se fait sur un nb de ligne définit. mais ce n’est pas possible dans les cas plus généraux.
a mon avis il faut que les méthodes de parsing soient modifiables ou alors que simplement surclasser les méthodes dans les classes spécifique du fichier gal.
ca semble plutot pas mal de surclasser.
dans ce cas, ca permet un peu de liberté et surtout ca evite d’avoir a penser à des méthodes trop générales.
reprennons. il nous faut une méthode browse qui va parcourir le fichier et extraire chaque ligne. on peut imaginer une méthode spéciale qui précederai le browse pour recuperer des infos dans les première lignes. ca serait une action optionnelle un peu dans le genre du setup de testCase.
le browse que j’utilise jusqu’a present tire parti des list comprehension ce qui permet un parcours rapide du fichier et créé une liste qui va etre ajoutée a iItems (qui herite du format list).
le probleme est que si je fais ca sur tout le fichier, il va y avoir des lignes a traiter different et que je ne veux pas ajouter dans la liste.
il me faut un systeme pour trier les ligne dans le liste comprehension, le tri va alors renvoyer vers une methode traitant les ligne de headers. c’est pourtant pas tout a fait correcte de faire ca.

14 mars 2008 – recherche d’un module R pour python

mars 14, 2008

14h12 : Pour SganArrayl il va etre nécessaire de traiter les valeurs par des modules statistiques accessibles dans des package R.
comme je compte tout refaire en python, l’idéal serait d’interfacer avec R a partir de python.
il me faut donc un module pour ca.
une petite recherche de google donne déja un premier apercu de ce qu’il existe.
première piste

Il n’y a pas vraiment d’autre module d’interface avec R. je vais essayer celui la.
au passage j’ai trouvé un document qui met en correspondance les fonction matlab, R et Python (NumPy). très pratique je pense. on le trouve ici : http://www.scribd.com/doc/26685/Matlab-Python-and-R
document.write(”);

Read this doc on Scribd: Matlab, Python, and R

var scribd_doc = new scribd.Document(26685, ‘ffe3v3jpfltbv’); scribd_doc.write(‘embedded_flash_26685_o9kh7′);
avec le document c’est encore mieux

————–edit du 25 mars 2008——————–
bon, j’ai pas mal galéré avec le module RSPython.
j’avais d’ailleurs trouvé un autre module, RPython (http://rpy.sourceforge.net/) mais pas vraiment plus simple a installer.
j’ai installé rpy très facilement sur douanierousseau / ubuntu feisty avec synaptic.
par contre j’ai essayé sur berthemorisot et ca a été beaucoup plus dur.
premier esssai sudo yum install rpy
ca semble s’installer mais bien sur quand je lance python et que j’importe le module rpy j’ai une erreur.
je télécharge le fichier source du module et décide de le compiler moi-meme, ce qui me permettra de l’installer dans python2.5 installer sur berthemorisot dans le répertoire tools de l’utilisateur gim.
dans le fichier d’instruction d’installation, il est précisé que R doit etre installé en librairies partagées. j’ai supposé que c’était le cas et j’ai essayé d’installé le package rpy mais ca n’a pas marché.
j’ai essayé de réinstallé R par yum mais ca n’a pas marché non plus.
j’ai essayé d’ajouter au pythonpath les répertoires ou se trouve rpy.
ca m’a permis de faire import rpy mais j’avais une erreur. impossible de trouver le module _rpy2041.so.
comme je l’ai sur ma machine, je le copie sur berthemorisot, mais ca ne marche pas, il faut qu’il soit compilé sur la machine ou il est installé.
je fini par télécharger la source de R, la réinstaller avec l’option qui va bien, ce qui se passe très bien sur centos.
puis je réinstalle rpy
j’ai encore qq erreur due aux chemin d’accès qui ne sont pas mis tout seul dans le pythonpath.
je rajoute les bons chemins et je modifie un peu rpy.py (voir ici).
au final ca marche sur python2.5, c cool.
tous les tests ne passent pas mais bon, on verra a l’usage.
j’ai réussi a m’en servir un peu qd meme. sur les fonction de base, pas de problème, l’interface est très simple.
je mettrais un tutorail en ligne dés que je commencerais a m’en servir vraiment.

13 mars 2008 – identification des tags du fichier gal

mars 13, 2008

18h28 : après avoir vu que le fichier de délétion ne contient pas tous les tags du fichier gal (ici) je recherche dans uin autre fichier si je peux trouver ces séquences.
ce fichier ( /home/gim2/bioinfo/microarray/original_vs_repair.txt) contient les sequence des tag qui ont été identifiés sur la puce comme étant mal séquencé. il donne la coorespondance avec la bonne séquence.

ORF Batch Tag Original_sequence Repaired_sequence Avgerage_signal_repaired Avgerage_signal_original Defect_score Sequencing_data Recommended_version
YAL016W chr00_12 down GTAGACGGAGGATTATTCAC GTAGACGGAGGATTATCAC 1879.5 590.45 4 data_not_checked repaired
YBL022C chr2_1 down CTGCGAGCAATCAGCCGATA CTGTGAGCAATCAGCCGATA 79.6 74.65 4 data_ok repaired
YBL025W chr2_1 down CTGCTGCGAAGTTCCGAGAA CTGCTGCGAAGTTCCCGAGAA 3607.55 2536.5 8 data_not_checked repaired
YBL046W chr2_1 down CTTGCGAAGTGTATTCACCA CTTGGCGAAGTGTATTCACCA 1230.55 648.4 4 data_not_checked repaired
YBL054W chr2_1 down GAAGTGCGGCTAATATGCTA GAAGTGCGGCTAACATGCTA 4143.4 2695.45 7 data_not_checked repaired
YBL060W chr2_1 down GACCCAATTCTACAGCGTAA GACCCATTCTACAGCGTAA 3901.4 2245.7 7 data_not_checked repaired
YBL077W chr2_1 down GAGAGACCATGCAGCCGATA GAGAGACCATGCAGCGATA 3599.85 2338.7 5 data_not_checked repaired
YBL080C chr2_1 down GAGAGTGGAATCGCTCATAA GAGAGTGGATCGCTCATAA 2906.7 1226 9 data_not_checked repaired
YBL085W chr2_1 down GAGGGTCTAATCCTGAGTAA GAGGGTCAATCCTGAGTAA 2805.55 783.9 8 data_not_checked repaired

je vais donc vérifié que les nouvelles séquences ainsi définie correspondent aux séquences absente du fichier de délétion.
pour ca je vais deja parser le fichier.
j’ai fait le parser reparatio_parser.py
je le fait tourner et je fais matcher les Repaired_sequence avec celle du fichier gal

ouverture de barcode12k_v2final.gal en 2.398 sec
barcode12k_v2final.gal contient 27648 lignes
ouverture de original_vs_repair.txt en 0.092 sec
original_vs_repair.txt contient 818 lignes
('Repaired_sequence',)
original_vs_repair.txt contient 818 tags distincts
('Sequence',)
barcode12k_v2final.gal contient 12683 tags distincts
818 elements de original_vs_repair.txt sont absents de barcode12k_v2final.gal
12683 elements de barcode12k_v2final.gal sont absents de original_vs_repair.txt

aucune des sequences n’est dans le fichier gal. j’ai le meme résultat avec la colonne original_sequence
si je recherche ces séquence dans le fichier de délétion j’obtiens

ouverture de Deletion_primers_PCR_sizes.txt en 1.325 sec
Deletion_primers_PCR_sizes.txt contient 6363 lignes
ouverture de original_vs_repair.txt en 0.063 sec
original_vs_repair.txt contient 818 lignes
('Original_sequence',)
original_vs_repair.txt contient 818 tags distincts
('UPTAG', 'DNTAG')
Deletion_primers_PCR_sizes.txt contient 12481 tags distincts
818 elements de original_vs_repair.txt sont absents de Deletion_primers_PCR_sizes.txt
12481 elements de Deletion_primers_PCR_sizes.txt sont absents de original_vs_repair.txt

j’ai le meme résultat avec la colonne repaired_sequence
il semble donc qu’il n’y ai aucune correspondance entre ce fichier et les séquences existante

en regardant de plus pret on constate que les séquence du fichier de reparation semble a l’envers
je modifie mon parser pour inverser les séquences. j’obtiens en comparant les séquences d’origine avec le fichier de délétion.

ouverture de Deletion_primers_PCR_sizes.txt en 1.504 sec
Deletion_primers_PCR_sizes.txt contient 6363 lignes
ouverture de original_vs_repair.txt en 0.080 sec
original_vs_repair.txt contient 818 lignes
('Original_sequence',)
original_vs_repair.txt contient 818 tags distincts
('UPTAG', 'DNTAG')
Deletion_primers_PCR_sizes.txt contient 12481 tags distincts
1 elements de original_vs_repair.txt sont absents de Deletion_primers_PCR_sizes.txt
sequences absentes set(['GCCTCTTCGCAAAGTAACAA'])
11664 elements de Deletion_primers_PCR_sizes.txt sont absents de original_vs_repair.txt

je retrouve bien toute les séquence originelles
cependant si je compare les séquences réparée avec le fichier gal j’obtiens

ouverture de barcode12k_v2final.gal en 2.186 sec
barcode12k_v2final.gal contient 27648 lignes
ouverture de Deletion_primers_PCR_sizes.txt en 1.369 sec
Deletion_primers_PCR_sizes.txt contient 6363 lignes
ouverture de original_vs_repair.txt en 0.083 sec
original_vs_repair.txt contient 818 lignes
('Repaired_sequence',)
original_vs_repair.txt contient 818 tags distincts
('Sequence',)
barcode12k_v2final.gal contient 12683 tags distincts
595 elements de original_vs_repair.txt sont absents de barcode12k_v2final.gal
12460 elements de barcode12k_v2final.gal sont absents de original_vs_repair.txt

je retrouve donc environ 200 séquences mais presque 600 sont encore absentes.

13 mars 2008 – association des tag des spot des microarray avec les ORF

mars 13, 2008

10h45 : hier j’ai pu constater que environ une centaine d’anotations des spots des puces n’était pas présente dans le fichier gff. voir ici
mais en prenant au hasard quelque orf j’ai juste constaté qu’elle était bien présente dans le fichier GFF mais sous le nom orf-A ou orf-B. du coup la correspondance ne marche plus en python.
je vais essayer de voir si je peux faire matcher ces orf quand meme…
pour cela j’ai une première idée, c’est tout simplement de ne garder que le nom d’orf sans le -A quand j’extrais les noms des orf avec le parser gff_parser et de voir si j’ai des meilleurs match.
par cette méthode ce sont juste 29 élément que je ne retrouve plus dans le fichier gff

YKL199C YAR044W YCL060C YCL006C YCL062W YBR100W YER108C YLR391W YKL158W YOR240W
YAR037W YKL200C YCL012W YCL053C YAR043C YGL046W YFL018W YFL006W YJL018W YOL053C
YML010C YDR474C YJL021C YML033W YOR088W YCL013W YFL035C YAR040C YCL003W

Cependant je n’aime pas trop cette méthode car je perd de l’info.
finalement je parse le fichier gal (identique a priori au barcode et je récupère les id des spot. avec une expression régulière je retire les -D, -U, -R présents a la fin des id
re.sub(r'-[RUD]+[1-9]*','',tag) j’ai mis des chiffres a la suite des D, U et R car parfois il y en a dans les id.
du coup j’obtiens 40 orf absente du gff

YFL035C-B YFL035C-A YKL199C YBR090C-A YHR079C-B YAR044W YCL060C YCL006C YCL062W YAR037W
YER108C YLR391W YKL158W YHR039C-B YOR240W Spotting Buffer Empty YKL200C YCL012W YFR024C
YCL053C YAR043C YGL046W YFL006W YJL018W YBR100W YDR474C YFL018W-A YCL026C YJL021C
YJL206C-A YML033W YOR088W YOL053C-A YCL013W YML010C-B YDL134C-A YFL035C YAR040C YCL003W

si je fais une recherche sur le premier, YFL035C-B, je trouve sur le chr VI l’orf YFL034-B qui a pour alias YFL035-B. je vais donc modifié le parser gff pour aussi tenir compte des alias
de cette manière je n’ai plus que 7 orf non présentes dans le gff

YCL053C YAR043C Spotting Buffer YCL013W Empty YCL026C YCL006C YAR040C YAR037W

12 mars 2008 – recupération des information des microarray

mars 12, 2008

12h03 : les données des puces ne sont pas très simple a récupérée sachant que d’une part les tag sur les spot sont liées a des régions dont l’annotation peut avoir changer depuis le premier design de la puce et que d’autre part certaine séquence de la puce n’ont pas été bien séquencées.
j’ai ecrit 2 parser simple en python pour parser le fichier gal (/home/gim2/workspace/SganArrayL/src/gal_parser.py) et le fichier contenant l’ensemble des délétion (/home/gim2/workspace/SganArrayL/src/deletion_parser.py)
j’ai ainsi pu parser les fichiers barcode12k_v2final.gal et Deletion_primers_PCR_sizes.txt
grace aux méthodes objets créés lors du parsing, j’ai pu verifier quelles séquences du fichiers gal étaient présentes dans le fichiers de description des délétions
j’ai utilisé des set pour cette recherche, c’est très rapide et très pratique pour croisé 2 set de données.
le programme renvoie ceci

ouverture de barcode12k_v2final.gal en 2.764 secbarcode12k_v2final.gal contient 27648 lignesouverture de Deletion_primers_PCR_sizes.txt en 3.048 secDeletion_primers_PCR_sizes.txt contient 6363 lignesbarcode12k_v2final.gal contient 12683 tags distinctsDeletion_primers_PCR_sizes.txt contient 12481 tags distincts688 elements de Deletion_primers_PCR_sizes.txt sont absents de barcode12k_v2final.gal890 elements de barcode12k_v2final.gal sont absents de Deletion_primers_PCR_sizes.txt

*****Edit du 14 mars 2008*****
On vois qu’un certain nombre de tag du fichier gal ne sont pas dans le fichier de deletion. cela provient du fait que certain tag ont été mal séquencés a l’origine. ils ont donc été resequencés et la bonne séquence a été introduites dans le fichier gal.
si je fais un grep sur le fichier barcode12k_v2final.gal en recherchant les ligne qui ont un -R dans le nom de l’orf, que je garde juste la colone du nom d’orf, et que je compte les occurences uniques(grep "\-R" barcode12k_v2final.gal | cut -f4 | uniq |wc) j’obtiens 889 nom d’orf avec un -R (par exemple YDR242W-U-R, YHR005C-D-R, YDR246W-U-R, YHR028C-U-R) vu que le nombre est presque identique a celui des séquences du fichier gal absentes du fichier de délétion, j’en déduis que les ligne avec un nom d’orf en -R correspondent a des spot pour lesquels les tag étaient mal séquencés et qu’il ont été réparés.
si je modifie le programme pour récupéré les id des 890 spot dont les tag ne sont pas dans le fichier de délétion, je constate que ce sont bien les id avec -R, ce qui confirme ma supposition

ouverture de barcode12k_v2final.gal en 3.120 sec
barcode12k_v2final.gal contient 27648 lignes
ouverture de Deletion_primers_PCR_sizes.txt en 1.620 sec
Deletion_primers_PCR_sizes.txt contient 6363 lignes
('Sequence',)
barcode12k_v2final.gal contient 12683 tags distincts
('UPTAG', 'DNTAG')
Deletion_primers_PCR_sizes.txt contient 12481 tags distincts
688 elements de Deletion_primers_PCR_sizes.txt sont absents de barcode12k_v2final.gal
890 elements de barcode12k_v2final.gal sont absents de Deletion_primers_PCR_sizes.txt
liste des 890 id spot present dans barcode12k_v2final.gal et absent de Deletion_primers_PCR_sizes.txt
YDR178W-U-R YIR012W-D-R YNL074C-D-R YDR033W-D-R YPR148C-U-R YCR014C-U-R YLR124W-U-R YPR002W-U-R YML050W-U-R YOL015W-U-R
YGL133W-U-R YJR121W-U-R YLR257W-U-R YNR012W-U-R YDR503C-D-R YJR036C-U-R YEL072W-U-R YKR073C-U-R YDR197W-D-R YKL212W-U-R
YJL139C-U-R YDR400W-U-R YLR432W-D-R YCR083W-D-R YHR008C-D-R YER122C-U-R YLR186W-U-R YML068W-U-R YBR123C-D-R YNL139C-D-R
YGR115C-D-R YDR082W-U-R YLL040C-U-R YNL003C-D-R YPR148C-D-R YMR116C-U-R YMR032W-U-R YNR052C-D-R YKL015W-D-R YKL025C-U-R
YOR179C-D-R YDL161W-U-R YER141W-D-R YOL143C-D-R YKL079W-D-R YAL016W-U-R YOR235W-U-R YJR055W-U-R YER135C-D-R YBL043W-U-R
YOL159C-U-R YOR017W-U-R YGL246C-D-R YLR085C-D-R YOR312C-U-R YER091C-D-R YNR006W-D-R YDR096W-U-R YGR053C-U-R YCR095C-D-R
YMR133W-D-R YFR024C-A-D-R YKL077W-D-R YJL180C-D-R YML115C-U-R YPL078C-U-R YHR125W-D-R YKL166C-U-R YDR504C-U-R YOL056W-D-R
YOR091W-D-R YLR239C-D-R YPR199C-D-R YOR374W-D-R YKR082W-D-R YGR253C-U-R YJL191W-D-R YOL136C-D-R YJR084W-U-R YOR356W-U-R
YIL154C-D-R YOR364W-D-R YNL300W-D-R YLR110C-D-R YMR210W-D-R YNL284C-U-R YGR046W-D-R YPL047W-U-R YDL099W-U-R YDR348C-U-R
YOL118C-U-R YKL002W-D-R YOR170W-U-R YNL117W-U-R YBL008W-D-R YCR090C-D-R YMR172W-D-R YDR300C-U-R YOL043C-D-R YER110C-D-R
YDL020C-U-R YNL014W-D-R YKR006C-U-R YDL199C-D-R YOL013W-A-D-R YGL141W-U-R YGL002W-D-R YOL052C-D-R YKR074W-D-R YDR079W-U-R
YBR047W-U-R YLR341W-D-R YGL036W-U-R YGL041C-U-R YPL049C-U-R YPL270W-U-R YDR043C-D-R YDL146W-D-R YNR047W-U-R YER031C-D-R
YML122C-U-R YDR125C-D-R YGR281W-U-R YGL123W-U-R YNL131W-D-R YLR358C-U-R YOL098C-D-R YPL243W-U-R YDR242W-U-R YNL113W-D-R
YDR507C-U-R YJR011C-U-R YDL005C-U-R YFR057W-U-R YMR041C-U-R YNL237W-U-R YLR060W-U-R YKL009W-U-R YAL047C-U-R YGL094C-D-R
YJR104C-D-R YPL015C-D-R YML117W-A-D-R YLR390W-U-R YNL064C-D-R YJR090C-U-R YKR050W-D-R YBR295W-U-R YCR094W-D-R YPR105C-D-R
YCL038C-U-R YIL114C-D-R YKL138C-U-R YKR057W-D-R YCR063W-U-R YNL015W-D-R YHR167W-D-R YDR525W-A-D-R YLR366W-U-R YIL015W-U-R
YDL236W-U-R YMR201C-D-R YIL118W-U-R YDR113C-U-R YGR165W-U-R YKR014C-D-R YFR027W-D-R YBL102W-D-R YJR097W-U-R YLR423C-U-R
YGR223C-U-R YNL135C-U-R YKL188C-D-R YDR237W-U-R YGR086C-D-R YOR150W-D-R YGR040W-U-R YER095W-D-R YLL057C-D-R YDR216W-D-R
YNL276C-D-R YDR384C-U-R YCR102W-A-D-R YOL163W-D-R YPL187W-D-R YIL034C-U-R YEL009C-D-R YLR420W-D-R YLR431C-D-R YDL117W-U-R
YHR038W-D-R YBR046C-D-R YOR258W-U-R YJL172W-D-R YDR056C-D-R YHR185C-D-R YLR134W-D-R YFL010C-D-R YPR154W-U-R YGR136W-U-R
YKL081W-D-R YPL076W-U-R YGR110W-U-R YKL135C-D-R YDR041W-D-R YDL233W-U-R YKL084W-U-R YNL066W-D-R YNL224C-U-R YPR137W-U-R
YJR119C-U-R YFR049W-U-R YER134C-U-R YOR120W-U-R YJL088W-D-R YDR027C-D-R YDR455C-D-R YGL034C-D-R YGR028W-D-R YDR177W-D-R
YNL050C-D-R YLR052W-D-R YKR072C-D-R YMR121C-D-R YMR275C-U-R YDL196W-D-R YBL046W-D-R YGL147C-D-R YHL034C-U-R YGR051C-U-R
YDL146W-U-R YNR040W-D-R YER117W-U-R YMR302C-D-R YKL069W-D-R YPL069C-U-R YMR021C-U-R YHR178W-U-R YBR161W-D-R YER013W-D-R
YKL041W-U-R YFR010W-D-R YDR270W-U-R YOR133W-U-R YHR110W-D-R YCL024W-U-R YJR024C-D-R YOL077C-D-R YMR129W-D-R YML054C-U-R
YDL234C-U-R YGL171W-U-R YJR107W-U-R YBR278W-U-R YFL044C-U-R YLR328W-D-R YKR098C-D-R YJR124C-U-R YLR130C-D-R YJR091C-D-R
YNL101W-D-R YGL160W-U-R YKL159C-D-R YCR061W-D-R YMR004W-D-R YGR277C-U-R YOR386W-U-R YJL027C-U-R YKL042W-D-R YPL215W-D-R
YDR246W-U-R YDR006C-D-R YGR195W-D-R YBR231C-D-R YML096W-D-R YMR232W-D-R YER014W-D-R YKR044W-D-R YMR227C-U-R YNL141W-D-R
YNL023C-U-R YNL330C-U-R YBR109C-D-R YOR361C-U-R YBR273C-D-R YDR199W-U-R YNL266W-U-R YNL028W-D-R YBR112C-U-R YGR279C-U-R
YJL163C-D-R YLR139C-D-R YPR036W-U-R YDL065C-U-R YKL169C-U-R YGR086C-U-R YDR365C-U-R YPR044C-U-R YKL096W-A-D-R YIR003W-U-R
YJL110C-D-R YCL034W-U-R Empty YPR190C-D-R YMR175W-D-R YPL061W-U-R YPR195C-D-R YLR004C-D-R YML082W-U-R YJL106W-D-R
YKR035C-D-R YPL194W-D-R YNL011C-U-R YBR054W-U-R YNL010W-D-R YHR161C-U-R YBR152W-D-R YPL078C-D-R YFL013W-A-D-R YOR200W-D-R
YLR452C-U-R YPL113C-U-R YLR275W-U-R YLR033W-D-R YPL194W-U-R YLR238W-U-R YFL063W-D-R YMR326C-D-R YKL213C-U-R YFR041C-U-R
YJL043W-D-R YML024W-U-R YDL213C-D-R YBR075W-U-R YKL087C-U-R YCL026C-U-R YKL060C-U-R YOR166C-D-R YCL009C-D-R YJL092W-D-R
YJL128C-U-R YGL142C-U-R YML086C-U-R YPR036W-D-R YDR530C-U-R YPL228W-U-R YJL194W-D-R YOL148C-U-R YMR080C-D-R YPL247C-D-R
YJL074C-U-R YGR248W-U-R YBR056W-D-R YBR176W-D-R YOR056C-U-R YLR327C-D-R YOL141W-D-R YBR075W-D-R YGR174C-D-R YDL023C-U-R
YGR147C-D-R YFR057W-D-R YNL259C-D-R YOR363C-U-R YLR350W-D-R YMR057C-D-R YDR484W-D-R YDR421W-U-R YFL034W-U-R YPR170C-D-R
YER031C-U-R YBR143C-D-R YGR062C-U-R YOR099W-D-R YDL194W-D-R YPL121C-U-R YPL004C-U-R YPL023C-D-R YNL245C-U-R YJR070C-D-R
YNR029C-D-R YER142C-D-R YIL083C-D-R YOL008W-D-R YGL151W-D-R YDR268W-U-R YLR120C-U-R YPL196W-D-R YMR297W-U-R YDL082W-U-R
YPL070W-U-R YAL045C-U-R YDR428C-D-R YGL016W-U-R YDR070C-U-R YNL279W-D-R YGL214W-U-R YMR253C-U-R YMR171C-D-R YGR225W-D-R
YOR298W-U-R YLR092W-U-R YFR011C-U-R YDL010W-U-R YOR259C-U-R YMR170C-D-R YKR001C-U-R YDR450W-D-R YKL128C-U-R YLR291C-D-R
YLL017W-U-R YMR175W-U-R YLL018C-D-R YNL198C-D-R YLR053C-D-R YHL012W-D-R YHR041C-D-R YGL154C-U-R YGL241W-U-R YGL013C-U-R
YFR052W-D-R YPR065W-U-R YNL232W-D-R YDL125C-U-R YOR037W-D-R YJL077C-D-R YNL119W-U-R YHR100C-U-R YHR204W-U-R YDR105C-U-R
YOR057W-U-R YKL222C-D-R YDR289C-U-R YCL022C-U-R YKR106W-U-R YGR257C-D-R YOR381W-U-R YLL051C-D-R YPL201C-D-R YDR182W-U-R
YNL237W-D-R YNL280C-U-R YKL099C-D-R YDR273W-U-R YNL046W-U-R YFR039C-D-R YBR163W-D-R YMR147W-D-R YBR252W-U-R YMR173W-U-R
YBR070C-D-R YHR028C-U-R YMR233W-U-R YNL295W-U-R YEL030W-U-R YPR032W-D-R YNR069C-D-R YKL152C-U-R YNL268W-U-R YOL083W-D-R
YGL227W-U-R YHL045W-D-R YGR112W-U-R YKR030W-D-R YML110C-D-R YGR180C-D-R YGR196C-U-R YKL199C-U-R YLR342W-U-R YGL125W-U-R
YHL035C-U-R YGR093W-D-R YDR496C-D-R YER052C-D-R YOR228C-U-R YNR015W-U-R YJL093C-U-R YMR160W-U-R YFR030W-D-R YJR023C-U-R
YNR014W-D-R YMR216C-D-R YPR129W-D-R YAL013W-U-R YER090W-D-R YOR105W-D-R YHR039C-B-U-R YDL135C-U-R YGR037C-D-R YKR048C-D-R
YMR177W-U-R YPR200C-D-R YGR234W-U-R YNL338W-U-R YJL161W-D-R YFL020C-U-R YIL110W-U-R YPR088C-D-R YMR143W-D-R YBR206W-U-R
YDL142C-U-R YGR286C-U-R YJL010C-U-R YPL032C-D-R YNL043C-U-R YFR055W-U-R YNR056C-D-R YOR200W-U-R YLR125W-U-R YHR154W-U-R
YNL154C-D-R YNR008W-U-R YHR035W-D-R YLR364W-U-R YDR453C-U-R YGL115W-D-R YDR227W-D-R YNL118C-D-R YGR202C-D-R YGR097W-D-R
YKR004C-U-R YKL005C-U-R YNL073W-D-R YLR282C-U-R YPL183W-A-D-R YNL280C-D-R YBL098W-D-R YJL003W-U-R YBR094W-U-R YPL245W-D-R
YBR178W-D-R YLR447C-U-R YHL047C-U-R YCR048W-U-R YMR284W-U-R YGL097W-D-R YPL207W-U-R YML116W-D-R YLR324W-U-R YJL206C-D-R
YDL061C-U-R YOR183W-D-R YJL182C-D-R YNL215W-D-R YDR052C-U-R YOR331C-U-R YPR027C-D-R YBR250W-D-R YBL093C-D-R YGL080W-U-R
YPL199C-D-R YOR021C-U-R YCL038C-D2 YKL100C-D-R YDL084W-D-R YBR285W-D-R YEL052W-D-R YDR284C-U-R YIL077C-U-R YMR119W-D-R
YPL109C-U-R Spotting Buffer YIL014W-U-R YCL037C-U-R YNL156C-D-R YDR392W-U-R YKL001C-D-R YHR154W-D-R YDL126C-U-R YCR083W-U-R
YGL028C-U-R YKL216W-D-R YDL140C-U-R YPR021C-U-R YIL156W-D-R YDR108W-U-R YCL036W-U-R YLR097C-D-R YOR201C-D-R YGL196W-D-R
YNR075W-D-R YER126C-U-R YDR380W-U-R YKL220C-D-R YMR040W-U-R YBL087C-D-R YJL122W-D-R YLR456W-U-R YGR276C-D-R YLR242C-U-R
YBL048W-D-R YPR049C-D-R YPR076W-D-R YDR198C-U-R YNR034W-U-R YDR223W-D-R YGR121C-U-R YGR166W-U-R YPL041C-D-R YFL001W-D-R
YPL025C-U-R YJL126W-D-R YPL005W-U-R YDR500C-U-R YNL109W-U-R YOR029W-D-R YER066W-D-R YKL078W-D-R YOR298C-A-U-R YPR116W-D-R
YBR293W-U-R YIL117C-U-R YML055W-U-R YDR509W-U-R YJR059W-D-R YPL189W-U-R YGR152C-D-R YFL026W-D-R YJL183W-D-R YBL007C-D-R
YJR030C-U-R YGL054C-U-R YDL192W-D-R YOR137C-D-R YNL110C-U-R YCR073C-U-R YPL195W-D-R YMR005W-U-R YJR049C-U-R YJR013W-U-R
YGR161C-U-R YBR020W-U-R YDL183C-D-R YOR350C-D-R YER152C-U-R YGR135W-U-R YFL006W-D-R YKL056C-U-R YBR022W-D-R YMR154C-D-R
YPR163C-D-R YKL055C-U-R YDL238C-U-R YPR145W-D-R YDR179W-A-U-R YBR157C-D-R YIL128W-U-R YDR410C-U-R YOR337W-U-R YLR309C-D-R
YHR196W-D-R YNL271C-D-R YHR044C-U-R YCL060C-U-R YML077W-U-R YOR274W-U-R YGL077C-U-R YPL090C-U-R YML088W-U-R YDL219W-U-R
YFR043C-U-R YDR111C-D-R YLR039C-D-R YDR093W-D-R YGR208W-D-R YDL031W-D-R YGL107C-D-R YKL148C-D-R YDR073W-U-R YLR178C-D-R
YKL142W-D-R YDR176W-U-R YHR137W-U-R YIL141W-D-R YOR197W-D-R YGL040C-U-R YPL107W-D-R YJL076W-U-R YOR107W-D-R YBL006C-D-R
YJL002C-D-R YCR089W-U-R YDR355C-U-R YJL146W-U-R YGL031C-D-R YBR227C-U-R YJR078W-U-R YCL008C-U-R YJR049C-D-R YNL089C-D-R
YCR107W-D-R YPR004C-U-R YMR191W-U-R YJL158C-D-R YKR105C-D-R YBR298C-U-R YIL042C-U-R YJR034W-D-R YMR160W-D-R YIL105C-D-R
YKR076W-D-R YBL082C-D-R YDL134C-A-U-R YGL132W-U-R YBR251W-D-R YBR279W-U-R YPL079W-U-R YDR406W-D-R YGR189C-D-R YIL094C-D-R
YPR055W-U-R YBL101C-D-R YMR073C-U-R YGR213C-U-R YBR263W-D-R YJL017W-U-R YEL045C-U-R YGL105W-U-R YDL162C-D-R YOR352W-D-R
YOR103C-U-R YLR347C-U-R YKL119C-U-R YBR274W-U-R YMR148W-U-R YER008C-U-R YCR092C-D-R YBR137W-D-R YOL147C-U-R YPL048W-U-R
YDR387C-U-R YLR397C-U-R YOR248W-U-R YNL093W-U-R YPL051W-D-R YDL008W-D-R YPL005W-D-R YDL081C-U-R YMR181C-D-R YDR317W-D-R
YPL119C-U-R YBL072C-D-R YDR445C-D-R YJR121W-D-R YLR416C-D-R YBR108W-U-R YLL007C-D-R YJR063W-U-R YER108C-D-R YOR355W-D-R
YFL042C-U-R YCR020W-B-U-R YMR107W-U-R YER030W-D-R YCL064C-U-R YBR182C-D-R YDR102C-U-R YOR161C-D-R YPR043W-D-R YBR014C-U-R
YCR013C-D-R YAL016W-D-R YHL039W-D-R YMR290C-U-R YML104C-D-R YPR106W-D-R YNL281W-U-R YBR189W-D-R YHL013C-U-R YLR402W-D-R
YFL014W-U-R YBR170C-U-R YDR127W-D-R YDR269C-U-R YDR328C-U-R YMR089C-D-R YMR092C-U-R YNL091W-D-R YLL006W-U-R YOR007C-D-R
YNL055C-D-R YLR409C-U-R YHR050W-D-R YHR005C-D-R YML081W-U-R YDR193W-U-R YPL198W-U-R YKL096W-D-R YBR213W-U-R YPR197C-U-R
YJR106W-D-R YBL055C-D-R YJL078C-U-R YPR146C-U-R YBR015C-D-R YIL086C-U-R YDR385W-U-R YKR027W-D-R YKR101W-D-R YCR086W-D-R
YER039C-U-R YDR124W-U-R YBR150C-U-R YML130C-U-R YDR171W-D-R YJL162C-U-R YPL257W-U-R YOR087W-D-R YOL044W-U-R YGR117C-D-R
YOL012C-D-R YJR113C-U-R YNL031C-D-R YBR191W-D-R YDR286C-U-R YKL024C-U-R YBL085W-D-R YDR455C-U-R YNL171C-U-R YDR242W-D-R
YNL080C-D-R YHR064C-D-R YEL017C-A-U-R YGR243W-U-R YLR436C-D-R YLL006W-D-R YER128W-U-R YDL035C-U-R YFL034C-A-U-R YPL268W-D-R
YBL058W-U-R YML035C-D-R YMR169C-D-R YGL092W-U-R YGR032W-D-R YML091C-D-R YNL330C-D-R YIL111W-D-R YBR280C-U-R YML056C-U-R
YBR040W-D-R YML031W-D-R YMR002W-U-R YDL227C-D-R YNR071C-D-R YDL175C-D-R YMR102C-D-R YPR163C-U-R YFR004W-D-R YKR059W-D-R
YKL011C-U-R YOL150C-D-R YIL100W-D-R YGL254W-U-R YCR065W-D-R YBR242W-U-R YLR429W-D-R YDR427W-D-R YDR248C-D-R YHR143W-D-R
YJR006W-U-R YJR032W-U-R YLR206W-U-R YBR300C-U-R YLR389C-U-R YML098W-U-R YPL271W-D-R YLR444C-U-R YDR017C-U-R YPR159W-D-R
YML115C-D-R YLR218C-D-R YCL039W-U-R YOL139C-D-R YFR025C-D-R YJR095W-U-R YOR254C-U-R YDR360W-U-R YJL191W-U-R YJL136C-D-R
YDR054C-D-R YOR318C-U-R YGR089W-U-R YDR341C-D-R


il y a 3 spots sans le -R a la fin : Empty, YCL038C-D2 et Spotting Buffer
seul YCL038C-D2 nous intéresse.
l’orf YCL038C existe dans le gal avec les spots
YCL038C-D1 ATG22 CACCTTTCGAGAGGACGATG
YCL038C-D2 ATG22 CCTGTAGAATAAGGCTCAAC
YCL038C-U2 ATG22 GGTTCTACACACCATAATGC
YCL038C-U-R AUT4 GGTTCTACACACCATAATGA
YCL038C-U1 ATG22 CCAGCCTGTAAAGGTGTCGA

l’orf YCL038C a les noms ATG22 et AUT4
si je cherche les séquence des tag de ces spot dans le fichier de délétion, je retrouve celle du spot YCL038C-D1 et YCL038C-U2 à la ligne de la délétion de YCL038C.
je ne retrouve pas les spot YCL038C-D2 et YCL038C-U-R.
et aussi je retrouve YCL038C-U1 à la ligne de YDR074W dans la colonne UPTAG.
ilsemble y avoir une confusion a ce niveau. cepandant si je recherche YDR074W dans le fichier gal je ne trouve que le spot de la séquence down, donc il semble que ce soit correct quand meme

*****Fin edit*****

le fichier /home/gim2/bioinfo/microarray/A-MEXP-714_SLRI_Yeast_Barcode_13k.txt contient toutes les information de la puce, il est supposé contenir les meme information que le fichier gal
j’ai fait un parser pour ce fichier barcode_parser.py et j’ai appliqué les meme méthode que precedemment.
j’obtiens en sortie

ouverture de barcode12k_v2final.gal en 2.450 secbarcode12k_v2final.gal contient 27648 lignesouverture de Deletion_primers_PCR_sizes.txt en 2.741 secDeletion_primers_PCR_sizes.txt contient 6363 lignesouverture de A-MEXP-714_SLRI_Yeast_Barcode_13k.txt en 3.531 secA-MEXP-714_SLRI_Yeast_Barcode_13k.txt contient 27648 lignesbarcode12k_v2final.gal contient 12683 tags distinctsA-MEXP-714_SLRI_Yeast_Barcode_13k.txt contient 12681 tags distincts0 elements de A-MEXP-714_SLRI_Yeast_Barcode_13k.txt sont absents de barcode12k_v2final.gal2 elements de barcode12k_v2final.gal sont absents de A-MEXP-714_SLRI_Yeast_Barcode_13k.txt

On voit que le fichier gal contient toutes les séquences du fichier barcode. 2 items du fichier gal sont absent du fichier barcode, il s’agit des item empty et Spotting Buffer, ce ne sont donc pas des sequence a proprement parlé.
ce sont donc bien les memes fichiers.

je recherche ensuite les genes du fichier barcode qui ne sont plus présent dans le fichier gff actuel (juillet 2007)
j’ai recréé un parser gff gff_parser.py dans le meme style que les autres.
je fais une recherche sur les nom ou id des orf dans le gff et sur ‘Reporter BioSequence Database Entry [ebi.ac.uk:Database:sgd]‘ dans le fichier barcode
je récupère en sortie

ouverture de A-MEXP-714_SLRI_Yeast_Barcode_13k.txt en 4.002 secA-MEXP-714_SLRI_Yeast_Barcode_13k.txt contient 27648 lignesouverture de saccharomyces_cerevisiae.gff en 3.488 secsaccharomyces_cerevisiae.gff contient 16316 lignessaccharomyces_cerevisiae.gff contient 8097 tags distincts('Reporter BioSequence Database Entry [ebi.ac.uk:Database:sgd]',)A-MEXP-714_SLRI_Yeast_Barcode_13k.txt contient 5867 tags distincts103 elements de A-MEXP-714_SLRI_Yeast_Barcode_13k.txt sont absents de saccharomyces_cerevisiae.gff2333 elements de saccharomyces_cerevisiae.gff sont absents de A-MEXP-714_SLRI_Yeast_Barcode_13k.txtYCR062W YAL064C YCR020W YER014C YCL006C YER108C YKL158W YMR306C YKL006C YKL200CYGL046W YFL018W YER038W YOL053C YFL010W YDR474C YMR031W YFR024C YHR049C YMR244CYFL035C YMR075C YKL199C YMR052C YAR044W YMR086C YBR084C YMR158C YNR032C YIR020WYMR304C YBR162W YER019C YBR100W YJR094W YER068C YAR043C YMR153C YGL226C YBR075WYCR073W YMR172C YLR312W YMR193C YDL045W YPL183W YCL062W YML013C YLR391W YER067CYOR240W YDL133C YHR132W YEL017C YOR298C YPR133W YFL006W YJL018W YML058C YKR035WYML010C YCR102W YER066C YML033W YOR088W YMR135W YOR304C YIL009C YPR090W YHR021WYJR010C YAL034W YCL060C YMR194C YFL013W YLR438C YJL017W YOL013W YAR002C YCR087CYML081C YMR316C YAR037W YCL012W YFL034C YCL013W YKL053C YCL053C YAL035C YIL015CYFL043C YCL026C YER007C YJL021C YDR179W YAL058C YML102C YMR290W YGR122C YER087CYER048W YAR040C YCL003W YCR062W

on voit qu’il y a environ 100 orf qui ne sont plus présentes dans la base

10 mars 2008 – interface d’ajout des puces (fichier gal)

mars 10, 2008

15h53 : après avoir ajouter les features, il faut créer une nouvelle puce, a partir du fichier gal correspondant (fichier de définition des puce d’afficmetrix) et peut-etre qq infos en plus.
deja j’ai plusieurs questions.
il est facile de créer une puce et de mettre ne relation les element du fichiers gal avec ceux de la table des feature.
cependant que faut il faire quand on modifie le fichier des features ? faut t’il créer une nouvelle puce liée a ces nouvelle feature qui seront utilisées a partir de ce moment, ou alors remplacer dans la liste les lien vers les nouvelles features.
idem si on importe un nouveau fichier gal, faut-il ajouter en plus ou mettre a jour. dans ce cas je pense qu’il faut ajouter car les précédentes manip auront été faite avec une ancienne puce et donc un ancien fichier gal.
il semble que finalement le plus interessant c’est de toujours tout mettre a jour.
par contre je pense qu’il faut coupler tout ca avec la base de délétion disponible ici
je vais surement créer une nouvelle table pour ca.

7 mars 2008 – Interface pour l’ajout des orf dans luce_la_puce

mars 7, 2008

11h52 : l’ajout va donc se faire a partir d’un fichier gff.
l’interface va donc etre très simple. une page web avec un formulaire de base. un controle pour envoyer un fichier et un controle submit. et puis le code php pour traiter tout ca. bref, pas trop compliqué. la table bank_orf va etre a revoir cependant.
je vais créer une table bank_gff qui va contenir les metadonnées du fichier gff et la date de release du fichier.

pour créer la table bank_orf, je m’aide de la table feature de la base sophia

CREATE TABLE features(ft_index serial NOT NULL,ft_chr varchar(10),ft_origin varchar(10),ft_type varchar(50),ft_start int4,ft_end int4,ft_score varchar(5),ft_strand varchar(1),ft_frame char(1),ft_rev varchar,ft_dbxref varchar,ft_id varchar,ft_name varchar,ft_note varchar,ft_orf_classification varchar,ft_ontology_term varchar,ft_parent varchar,ft_alias varchar,ft_gene varchar,CONSTRAINT ft_id_key PRIMARY KEY (ft_index))WITHOUT OIDS;ALTER TABLE features OWNER TO fricard;

en fait je ne vais pas créer toute ces colonnes, certaines seront générées automatiquement a partir du fichier gff. cependant je vais les mettre qd meme dans le schema de la base.


create table bank_orf (orf_index serial not null, orf_chr varchar(10), orf_origin varchar(10), orf_type varchar(50), orf_start int4, orf_end int4, orf_score varchar(5), orf_strand varchar(1), orf_frame varchar(1), gff_id serial not null, primary key (orf_index));
create table bank_gff (gff_id serial not null, gff_release_date date, gff_metadata text, primary key (gff_id));

je vais utiliser le module DBGFF.py que j’ai créé pour genepy. comme ca le parser gff est deja fait.

je le fait grace a la commande sys.path += ['/home/gim/genepy']

j’ai finalement modifié bank_gff et j’utilise la date comme clé, ce qui permet d’avoir une contrainte d’unicité sur cette valeur. ce qui se gère bien en python/sql

try :
con.query(query)
except pg.ProgrammingError, e :
print e

qui renvoie

ERROR: duplicate key violates unique constraint "bank_gff_pkey"

si la date existe deja.

j’ai ajouté dans DBGFF.py une méthode pour la classe Features renvoyant un dictionnaire dont les clés sont les attributs de l’objet et les valeurs sont le contenu des attributs. on peut de plus passer un prefixe pour le nom des clés en argument.

  def get_attrdict(self, prefixe=''):      attr_tupple = [ (prefixe + attr, self.getattribute(attr)) for attr in self.attrList  ]      return dict(attr_tupple)

l’avantage de cette méthode est donc d’avoir un dictionnaire des couple attributs, valeurs, ce qui est assez pratique avec la méthode insert de pg.DB
le script pour introduire des features dans la base est donc le suivant

#! /usr/bin/python2.5

import cgiimport pgimport sys

sys.path += ['/home/gim/genepy']

import DBGFF

def create_postgres_db(base):#===============================================================================#    creation de la base de donnee postgresql#===============================================================================

    db = DBGFF.DB(base)    db_date=db.get_release_date('DATE')    print db_date    a=2    DBNAME = "luce_la_puce"    HOST = 'berthemorisot.gim.pasteur.fr'    USER = 'postgres'       #con = pg.connect(dbname=DBNAME, host=HOST, user=USER)    llp=pg.DB(dbname=DBNAME, host=HOST, user=USER)    try :        llp.insert('bank_gff', {'gff_release_date' : db_date, 'gff_metadata':db.info})

    except pg.ProgrammingError, e :        print e        return    prefixe = "orf_"    i = 0    listfields = llp.get_attnames('bank_orf').keys()    listfields = set(map(lambda x : x[4:], listfields))    date_dict={'gff_release_date' : db_date}    for feature in db :        attr_list = set(feature.get_attrlist().keys())        diff = attr_list.difference(listfields)

        if diff :               for attr in diff :

                attr_col = "%s%s" % (prefixe, attr)

                llp.query("alter table bank_orf add column %s varchar" % attr_col)

                listfields.add(attr)

        values = feature.get_attrdict(prefixe)        values.update(date_dict)        llp.insert('bank_orf', values)

        i+=1        if not i%1000 :            print i

print "Content-type: text/html"print

print "insertion des donnees"

post_data=cgi.FieldStorage()gff=post_data['gff_file']create_postgres_db(gff.file)

print "script fini"

ce script n’est pas définitif, il faut l’améliorer pour que l’ergonomie soit correcte.