Archive de la catégorie «SganArrayL»

29 avril 2008 – interface sganarrayl

avril 29, 2008

11h24 :
Pour faire l’interface d’ajout du fichier gal, j’ai voulu reprendre celle d’ajout du fichier gff.
celle-ci étant assez moyenne, j’ai donc décidé de la reprendre.
pour que ce soit cohérent avec l’interface finale de sganarrayl, il faut deja pensé a l’intégralité de l’interface.
Depuis la page d’accueil pour ajouter des puce, on pourra donc voir la liste des puces disponibles et aussi du fichier de définition des features utilisé.
on pourra depuis cette page aussi ajouter de nouveaux fichiers de puce et de feature.
l’ajout de feature va renvoyer sur la page add_gff.php
cette page propose un champ browse pour parcourir le disque local et ajouter un fichier.
l’envoie du formulaire va renvoyer sur la meme page.
cette fois ci, comme il y a un fichier uploader, ca va déclencher le script php.
celui-ci copie le fichier uploadé dans un répertoire spécifique.
il va aussi modifier la page pour faire apparaitre le nom du fichier traité et faire disparaitre le champs browse.
la page va aussi avoir un script javascript (add_gff.js).
celui-ci va se déclencher s’il y a un nom de fichier a traiter.
dans ce cas il va faire appelle au script add_gff.py pour traiter le fichier gff et renvoyer la réponse qui correspond au traitement et l’afficher.
add_gff.py parse le fichier gff à l’aide des du parser gff de parser_tools puis utilise la classe garden_state du module sganarrayl_interface pour se connecter à la base luce_la_puce et ajouter les feature par la méthode add_feature_data.

add_gff.py renvoie un fichier xml avec les balises ou selon le déroulement du code.
le script javascript va interpréter ce xml et afficher les messages correspondants dans une balise prévue a cette effet et ingénieusement intitulée gff
voici le flux de données


L’interface pour le fichier gff fonctionne bien maintenant et le code est propre.
passons au fichier gal

déroulement de la séquence.
l’utilisateur doit ajouter une puce dans la base.
il va alors aller sur la page add_gal.php.
il n’y a que 2 champs pour le moment.
le premier pour donner un nom à la puce.
le 2eme pour mettre le fichier gal qui contiendra les info sur les spots.
le nom de la puce sera celui utilisé par la suite pour faire référence à celle-ci.
le script va ensuite ajouter le nom de la puce dans la table array_chip_types s’il n’existe pas encore. s’il existe deja, l’ajout de la puce est refusé. par la suite il devra permettre la mise a jour de la puce.
ensuite il faut parcourir chaque spot, déterminer son type, vérifier dans la table array_spot_type si le type existe et sinon l’ajouter. on recherche ensuite dans les features de la table bank_orf qui ont la meme annotation que le spot.
si on trouve on garde la ref de la feature, sinon, la ref est nulle. on ajoute ensuite les info du spot dans la table array_spots, en ajoutant les liaisons vers les tables array_chip_types array_spot_type et bank_orf.

todo -> modifier sganarrayl_interface pour pouvoir sélectionner les id des orf ayant l’annotation du spot

15 avril 2008 – Parser pour le fichier gal

avril 15, 2008

11h04
maintenant que le parser global est construit, je vais faire un parser pour le fichier gal dérivé de celui-ci
Format d’un fichier GAL -> GenePix Array List
exemple du fichier /home/gim2/bioinfo/microarray/barcode12k_v2final.gal
la commande
less /home/gim2/bioinfo/microarray/barcode12k_v2final.gal
donne
ATF 1
51 6
Type=GenePix ArrayList V1.0
BlockCount=48
BlockType=0
"Block1= 3530, 8000, 120, 24, 180, 24, 180"
"Block2= 8030, 8000, 120, 24, 180, 24, 180"
"Block3= 12530, 8000, 120, 24, 180, 24, 180"
"Block4= 17030, 8000, 120, 24, 180, 24, 180"
"Block5= 3530, 12500, 120, 24, 180, 24, 180"
"Block6= 8030, 12500, 120, 24, 180, 24, 180"
"Block7= 12530, 12500, 120, 24, 180, 24, 180"
"Block8= 17030, 12500, 120, 24, 180, 24, 180"
"Block9= 3530, 17000, 120, 24, 180, 24, 180"
"Block10= 8030, 17000, 120, 24, 180, 24, 180"
"Block11= 12530, 17000, 120, 24, 180, 24, 180"
"Block12= 17030, 17000, 120, 24, 180, 24, 180"
"Block13= 3530, 21500, 120, 24, 180, 24, 180"
"Block14= 8030, 21500, 120, 24, 180, 24, 180"
"Block15= 12530, 21500, 120, 24, 180, 24, 180"
"Block16= 17030, 21500, 120, 24, 180, 24, 180"
"Block17= 3530, 26000, 120, 24, 180, 24, 180"
"Block18= 8030, 26000, 120, 24, 180, 24, 180"
"Block19= 12530, 26000, 120, 24, 180, 24, 180"
"Block20= 17030, 26000, 120, 24, 180, 24, 180"
"Block21= 3530, 30500, 120, 24, 180, 24, 180"
"Block22= 8030, 30500, 120, 24, 180, 24, 180"
"Block23= 12530, 30500, 120, 24, 180, 24, 180"
"Block24= 17030, 30500, 120, 24, 180, 24, 180"
"Block25= 3530, 35000, 120, 24, 180, 24, 180"
"Block26= 8030, 35000, 120, 24, 180, 24, 180"
"Block27= 12530, 35000, 120, 24, 180, 24, 180"
"Block28= 17030, 35000, 120, 24, 180, 24, 180"
"Block29= 3530, 39500, 120, 24, 180, 24, 180"
"Block30= 8030, 39500, 120, 24, 180, 24, 180"
"Block31= 12530, 39500, 120, 24, 180, 24, 180"
"Block32= 17030, 39500, 120, 24, 180, 24, 180"
"Block33= 3530, 44000, 120, 24, 180, 24, 180"
"Block34= 8030, 44000, 120, 24, 180, 24, 180"
"Block35= 12530, 44000, 120, 24, 180, 24, 180"
"Block36= 17030, 44000, 120, 24, 180, 24, 180"
"Block37= 3530, 48500, 120, 24, 180, 24, 180"
"Block38= 8030, 48500, 120, 24, 180, 24, 180"
"Block39= 12530, 48500, 120, 24, 180, 24, 180"
"Block40= 17030, 48500, 120, 24, 180, 24, 180"
"Block41= 3530, 53000, 120, 24, 180, 24, 180"
"Block42= 8030, 53000, 120, 24, 180, 24, 180"
"Block43= 12530, 53000, 120, 24, 180, 24, 180"
"Block44= 17030, 53000, 120, 24, 180, 24, 180"
"Block45= 3530, 57500, 120, 24, 180, 24, 180"
"Block46= 8030, 57500, 120, 24, 180, 24, 180"
"Block47= 12530, 57500, 120, 24, 180, 24, 180"
"Block48= 17030, 57500, 120, 24, 180, 24, 180"
Block Column Row ID Name Sequence
1 1 1 YHR185C-D-R PFS1 AGAGATCCACTTCCCATAATT
1 2 1 YHR185C-D-R PFS1 AGAGATCCACTTCCCATAATT
1 3 1 YIR043C-D CTGCACATTCGATTACAGCG
1 4 1 YIR043C-D CTGCACATTCGATTACAGCG
1 5 1 YHR067W-D RMD12 TTATGCACCGTGACGAGGCT
1 6 1 YHR067W-D RMD12 TTATGCACCGTGACGAGGCT
1 7 1 YBR296C-U PHO89 CACGACCGACAATATGGTGA
1 8 1 YBR296C-U PHO89 CACGACCGACAATATGGTGA
1 9 1 YOL076W-U MDM2 ACGGATGGATCAGTTGCTAT
1 10 1 YOL076W-U MDM2 ACGGATGGATCAGTTGCTAT
1 11 1 YNL204C-U SPS18 GCGCTGGCACAAGAATACCA
1 12 1 YNL204C-U SPS18 GCGCTGGCACAAGAATACCA
1 13 1 YLR205C-U HMX1 AACTGAACATACCCGGTGAC
1 14 1 YLR205C-U HMX1 AACTGAACATACCCGGTGAC
1 15 1 YJL039C-D NUP192 TTGAGCCCGATCAGTCGATG
1 16 1 YJL039C-D NUP192 TTGAGCCCGATCAGTCGATG
1 17 1 YGR029W-D ERV1 TTACGTCCCGGATGCCGTTT
1 18 1 YGR029W-D ERV1 TTACGTCCCGGATGCCGTTT
1 19 1 YEL072W-D RMD6 TGCAGCACGCAAGACCATGA
1 20 1 YEL072W-D RMD6 TGCAGCACGCAAGACCATGA
1 21 1 YDR022C-D CIS1 GGTCGATAATAACACGCCAC
1 22 1 YDR022C-D CIS1 GGTCGATAATAACACGCCAC
1 23 1 YBL086C-U ACCACTCACTAAGGAGGATC
1 24 1 YBL086C-U ACCACTCACTAAGGAGGATC
1 1 2 YLR327C-D-R GATAACGACTCAGTGC
1 2 2 YLR327C-D-R GATAACGACTCAGTGC
1 3 2 YIL033C-D BCY1 GGATATTAGCCATCTACGTG

description des différentes parties
le fichier est spéraré en 3 parties
les 2 première ligne donne des info sur la structure du fichier
il y a ensuite le header du fichier
puis les données
1ere ligne -> ATF : conforme au format Axon Text File
1 : version du format
2eme ligne -> 51 : nombre de ligne dans le header
6 : nombre de colonne dans les données
3éme à 53 ème ligne ->header
Type=GenePix ArrayList V1.0 -> type du fichier
BlockCount=48 -> nombre de block
BlockType=0 ->Type de block decrit :
0 = rectangulaire.
1 = orange-packing #1.
2 = orange-packing #2.
“Block1= 3530, 8000, 120, 24, 180, 24, 180″ ->position et dimension de chaque block
xOrigin : position x du centre de la feature la plus en haut a gauche
yOrigin : position y du centre de la feature la plus en haut a gauche
FeatureDiameter : Diamètre des features du block
xFeature : Nombre de colonnes de features dans le block
xSpacing : espacement des colonnes
yFeature : Nombre de lignes de features dans le block
ySpacing : espacement des lignes
54eme ligne -> ligne de titre des colonnes
55eme ligne a la fin -> information pour chaque features

Le parser doit donc spécifiquement
lire la première ligne et stocker le format de fichier et sa valeur
lire la 2eme ligne et stocker le nb de ligne de header et le nb de colonne (pas vraimenet utile)
lire toute les ligne du header, les parser pour séparer la clé des données
(possible de rajouter un mini parser pour les données de block)
puis lire les données.
je vais donc faire un parser héritant de la classe Items.
je vais surclasser parse_header pour traiter les 1ere ligne et le header
puis parser le rester par les méthodes de Items.

le code du parser


class Gal_parser(Items):'''Gal_parserparser for *.gal filesx = Gal_parser(**arg)options :file_arg -> file path or file handleitem_list -> list of item instances

'''

def __init__(self, **arg):'''x = Gal_parser(**arg)'''#call the init method of ItemsItems.__init__(self, **arg)

def parse_header(self, fhin):'''x.parse_header(fhin)fhin -> fileparse the header of the file.

'''#get the format of the file (1st line of the file)file_format = fhin.readline()#check if it's a ATF fileif not "ATF" in file_format :    raise FormatError("%s format is not correct" % fhin.name)#store the file_format dataself.file_format=split(file_format, '\t')

#get the file structure data (2nd line of the file)try :    self.nb_header_rows, self.nb_cols=split(fhin.readline(), '\t')except ValueError :    self.nb_header_rows = fhin.readline()

self.nb_header_rows = int(self.nb_header_rows)

#create the structure for the headerself.header={}#get all the header lines and parse themfor i in range(self.nb_header_rows) :    try :        k,v = self.parse_header_line(fhin.readline())    except AttributeError :        continue    except ValueError :        continue    self.header[k] = v#set the parse_header flag to true, so it won't be parsed again laterself.flag['parse_header'] = True

def parse_header_line(self, line):'''k,v = x.parse_header_line(line)clean the line and split the key and the value'''#cleaning of the linetry :    #remove backspace    line = remove_end_line(line)    #remove "    line=replace(line,'"', '')    #remove tab    line=replace(line,'\t', '')

except AttributeError :    print "no replace for %s" % line    raise#split the line with the field separator =#and return the resulting tuple ok key/valuetry :    return split(line,"=")except ValueError :    print "no = in %s" % line    raise

def get_header(self, *arg):'''header = x.get_header(*arg)return the header dictionnaryarg ->    keys : return keys of header    values : return values of header    items : return tuple ok key/value of header'''#check the arg optionif 'keys' in arg : return self.header.keys()if 'values' in arg : return self.header.values()if 'items' in arg : return self.header.items()#if no optionreturn self.header

class FormatError(exceptions.Exception):def __init__(self, msg=''):self.errmsg = msg

def __str__(self):return self.errmsg

j’ai ajouté un classe FormatError pour gérer les erreur de format de fichier.
j’ai modifié la fonction de test

def test_gal_parser(self):'''test si l'heritage fonctionne bien'''file_format="ATF"file_format_version = 1header_row_nb = 2data_col_nb = 3header_key_1 = "key1"header_val_1 = "val1"header_key_2 = "key2"header_val_2 = "val2"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"data_l2_c3 = "data_c3"data_l1_c3 = "data_c3"test_file='''%s\t%s%s\t%s%s=%s"%s=%s"%s\t%s\t%s%s\t%s\t%s%s\t%s\t%s''' % (file_format, file_format_version,header_row_nb, data_col_nb,header_key_1, header_val_1,header_key_2, header_val_2,col_1, col_2, col_3,data_l1_c1, data_l1_c2, data_l1_c3,data_l2_c1, data_l2_c2, data_l2_c3)self.write_tmp_file(filetext = test_file)test_gal = Gal_parser(file_arg = 'tmp_file')self.assert_(isinstance(test_gal,Gal_parser))self.assert_(len(test_gal.get_header())==2)

self.assert_(test_gal.get_header('keys')==[header_key_2, header_key_1])self.assert_(test_gal.get_header('values')==[header_val_2, header_val_1])self.assert_(len(test_gal)==2)self.assert_(test_gal[0].get_attribute(col_1)==data_l1_c1)

file_format="ATG"test_file='''%s\t%s%s\t%s%s=%s"%s=%s"%s\t%s\t%s%s\t%s\t%s%s\t%s\t%s''' % (file_format, file_format_version,header_row_nb, data_col_nb,header_key_1, header_val_1,header_key_2, header_val_2,col_1, col_2, col_3,data_l1_c1, data_l1_c2, data_l1_c3,data_l2_c1, data_l2_c2, data_l2_c3)self.write_tmp_file(filetext = test_file)self.assertRaises(FormatError, Gal_parser, filename = 'tmp_file')

remove('tmp_file')

test_gal = Gal_parser(file_arg = '/home/gim2/bioinfo/microarray/barcode12k_v2final.gal');self.assert_(isinstance(test_gal,Gal_parser))self.assert_(len(test_gal.get_header())==51)

et le test me renvoie

tmp_file format is not correct.col_0 is not a valide attribute....the argument is not a regular file objectfile toto doesn't existpermission denied for file tmp_parse.txt..----------------------------------------------------------------------Ran 7 tests in 2.844s

OK

j’ai donc un parser de fichier gal qui fonctionne bien.
quel est le but de tout ca ?
l’idée est de parser le fichier de description de la puce et de mettre les infos dans la base de donnée. je cherche également a liéer les spot aux orf du genome de la levure.
j’ai précédemment examiné le fichier gal et d’autre fichiers décrivant les puces (12 mars, 13 mars (1) et 13 mars (2)
l’analyse de ces fichier a permis de constater que l’annotation de certain spot ne coorespond plus a une orf existante. mais que cette ancienne annotation est généralement toujours présente dans les alias des orf.
l’analyse plus fine de cela a meme permis de déterminer que seule 7 annotations avaient réellement totalement disparues.
YAR037W YAR040C YAR043C YCL006C YCL013W YCL026C YCL053C
ce qui correspond a 30 spot au total
grep YCL053C ~/bioinfo/microarray/barcode12k_v2final.gal
1 23 19 YCL053C-U CTATTGTTGAAATGCCGGGA
1 24 19 YCL053C-U CTATTGTTGAAATGCCGGGA
39 23 20 YCL053C-D CATAGTCGAGAACCGGAGAC
39 24 20 YCL053C-D CATAGTCGAGAACCGGAGAC

grep YAR043C ~/bioinfo/microarray/barcode12k_v2final.gal
34 3 8 YAR043C-U ATTCTAGCGGCAGATCCGTG
34 4 8 YAR043C-U ATTCTAGCGGCAGATCCGTG

grep YCL013W ~/bioinfo/microarray/barcode12k_v2final.gal
13 23 22 YCL013W-D CGCTCGAACATAATTGGGTA
13 24 22 YCL013W-D CGCTCGAACATAATTGGGTA
25 23 22 YCL013W-U CCTGTCAGTAAACCGAGAGA
25 24 22 YCL013W-U CCTGTCAGTAAACCGAGAGA

grep YCL026C ~/bioinfo/microarray/barcode12k_v2final.gal
5 23 21 YCL026C-D CCTCCGAACAGAGAGTCTTA
5 24 21 YCL026C-D CCTCCGAACAGAGAGTCTTA
13 3 4 YCL026C-A-U FRM2 GCTCACCGAACATCAGATTA
13 4 4 YCL026C-A-U FRM2 GCTCACCGAACATCAGATTA
17 3 21 YCL026C-U-R CCTCTGCTAAGTAGTAGA
17 4 21 YCL026C-U-R CCTCTGCTAAGTAGTAGA
17 23 21 YCL026C-U CCCTCTGCTAAAGTAGTAGA
17 24 21 YCL026C-U CCCTCTGCTAAAGTAGTAGA
42 5 19 YCL026C-A-D FRM2 GGCGGACTACAACACATTCA
42 6 19 YCL026C-A-D FRM2 GGCGGACTACAACACATTCA

grep YCL006C ~/bioinfo/microarray/barcode12k_v2final.gal
23 23 23 YCL006C-D CCCGCTAGTCAATAATCGTA
23 24 23 YCL006C-D CCCGCTAGTCAATAATCGTA
29 5 15 YCL006C-D CCCGCTAGTCAATAATCGTA
29 6 15 YCL006C-D CCCGCTAGTCAATAATCGTA
35 23 23 YCL006C-U CCTGAAGATAAATCCCGTCA
35 24 23 YCL006C-U CCTGAAGATAAATCCCGTCA
41 5 15 YCL006C-U CCTGAAGATAAATCCCGTCA
41 6 15 YCL006C-U CCTGAAGATAAATCCCGTCA

grep YAR040C ~/bioinfo/microarray/barcode12k_v2final.gal
7 3 9 YAR040C-U CCATCTCAGTGGGTGCAATG
7 4 9 YAR040C-U CCATCTCAGTGGGTGCAATG

grep YAR037W ~/bioinfo/microarray/barcode12k_v2final.gal
23 3 9 YAR037W-U AGCTAGACTATCGCCCAATG
23 4 9 YAR037W-U AGCTAGACTATCGCCCAATG

a
l’ideal serait de faire cette identification lorsque j’ajoute le fichier gal dans la base.
si on suppose que la liste des orf est dans la base de donnée.
il faut donc extraire le nom des annotation des spot, retirer les caractère qui ont été ajouté pour les puc (U, D et R) en faire une liste d’occurences uniques et les rechercher dans la base de données.
je vais faire une premiere version mais en utilisant un fichier gff au lieu de de la base de donnée.
il faut deja récupéré les ID des spots.
pour ca j’utilise la méthode get_attr_list qui me renvoie la liste des valeur d’un attribut pour l’ensemble des items.
j’utilise ensuite un set pour stocker ces valeur, ainsi je n’ai que celles qui sont distincte.
j’utilise ensuite une expression régulière pour eliminer les -D, -U, et -R

def extract_annotation_id(annot_id):return re.sub(r'-[RUD]+[1-9]*','',annot_id)

def analyse_gal_file():gal_file = '/home/gim2/bioinfo/microarray/barcode12k_v2final.gal'gal = Gal_parser(file_arg = gal_file)id = gal.get_attr_list('ID')print "il y a %i ID de spot dans %s" % (len(id), gal_file)id_set = set(id)print "il y a %i ID distintes dans %s" % (len(id_set), gal_file)id=map(extract_annotation_id, id)id_set = set(id)print "il y a %i annotations d'orf dans %s" % (len(id_set), gal_file)

j’obtiens

il y a 27648 ID de spot dans /home/gim2/bioinfo/microarray/barcode12k_v2final.galil y a 12677 ID distintes dans /home/gim2/bioinfo/microarray/barcode12k_v2final.galil y a 5920 annotations d'orf dans /home/gim2/bioinfo/microarray/barcode12k_v2final.gal

j’arrive donc a récupérer les 5920 orf utilisée dans ces puces
il faut ensuite aller les comparer avec celles du fichiers gff
je refais donc un parser gff rapide (ici)

puis je sélectionne les id des orf
gff_file = '/home/gim2/bank//saccharomyces_cerevisiae.gff'
gff = Gff_parser(file_arg = gff_file)
id2 = gff.get_attr_list('ID')

il y a 16316 ID dans /home/gim2/bank//saccharomyces_cerevisiae.gff
si je prends les tag name et gene en plus j’ai :
id2 = gff.get_attr_list('ID') + gff.get_attr_list('Name') + gff.get_attr_list('gene')
il y a 48948 ID, Name et gene dans /home/gim2/bank//saccharomyces_cerevisiae.gff
si j’utilise les set pour connaitre n’avoir que des valeurs distinctes j’ai :
il y a 16316 ID dans /home/gim2/bank//saccharomyces_cerevisiae.gff
il y a 8098 ID distinctes dans /home/gim2/bank//saccharomyces_cerevisiae.gff
il y a 48948 ID, Name et gene dans /home/gim2/bank//saccharomyces_cerevisiae.gff
il y a 12879 ID, Name et gene distincts dans /home/gim2/bank//saccharomyces_cerevisiae.gff

j’ai besoin aussi des alias des orf car ce sont parfois les anciens noms de ces orfs

alias=gff.get_attr_list('Alias')  for x in alias :      if not x : continue      x=split(x,',')      id2 += x  print len(id2)  print 'il y a %i ID, Name, gene et alias dans %s' % (len(id2), gff_file)  id_set2 = set(id2)  print 'il y a %i ID, Name, gene et alias distincts dans %s' % (len(id_set2), gff_file)

et j’obtiens

il y a 65786 ID, Name, gene et alias dans /home/gim2/bank//saccharomyces_cerevisiae.gffil y a 15774 ID, Name, gene et alias distincts dans /home/gim2/bank//saccharomyces_cerevisiae.gff

je vais donc comparer les id du fichier gal et ceux du fichier gff en faisant une simple différence de set
print "il y a %i ID presente dans %s qui sont absentes de %s" % (len(id_set2), gal_file, gff_file)
print "ce sont les ID : ", id_set.difference(id_set2)

il y a 15774 ID presentes dans /home/gim2/bioinfo/microarray/barcode12k_v2final.gal qui sont absentes de /home/gim2/bank/saccharomyces_cerevisiae.gffce sont les ID :  set(['YCL053C', 'YAR043C', 'Spotting Buffer', 'YCL013W', 'Empty', 'YCL026C', 'YCL006C', 'YAR040C', 'YAR037W'])

Ca correspond a celles trouvées précédemment

14 avril 2008 – ajout du module de conversion des données

avril 14, 2008

10h48
suite de la construction du parser global.
pour mieux utiliser les données dans le parser, il est utile de les convertir au bon format.
elles sont toutes reconnues comme texte.
les seuls autres types pouvant exister pour des données sont integer ou float.
il pourrait y avoir des booléens mais on va partir du principe qu’il n’y en a pas.
les types listes ou autre propres a python ne sont pas présents dans des fichiers de données.
la conversion des données est intéressante mais ralenti le parsing.
il me semble que malgré tout il y a un gain de temps par la suite
La conversion utilise la fonction try. qui permet e s’affranchir de pas mal de test qui sont réalisé par les fonction de conversion elle-meme. ces fonctions sont int et float.
code du convertisseur

 def set_type(self, value):     '''     val = x.set_type(value)     value -> str     val -> str, int or float     convert the data to the correct data type     '''     #store the data into the return variable     val = value     #try converting     try :         #try first to convert into a float         val = float(value)         #if succeed, try to convert into an integer         val = int(value)     except ValueError:         #catch a converting error, either from float or int         pass     #return the stored value     return val

et le code du test correspondant

 def test_type_parsed_data(self):     '''     teste si le type des donnees parsees est correcte     '''     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 = "texte"     data_l1_c2 = 1     data_l2_c1 = 1.5     data_l2_c2 = "1e+5"     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_(type(test_item[0].get_attribute(col_1)) == type(data_l1_c1))     self.assert_(type(test_item[0].get_attribute(col_2)) == type(data_l1_c2))     self.assert_(type(test_item[1].get_attribute(col_1)) == type(data_l2_c1))     self.assert_(type(test_item[1].get_attribute(col_2)) == type(float(data_l2_c2)))

     remove('tmp_file')

ce qui donne en sortie de la fonction test

..the argument is not a regular file objectfile toto doesn't existpermission denied for file tmp_parse.txt..----------------------------------------------------------------------Ran 4 tests in 0.065s

OK

11h34
le parser est bien avancé. il lui manque quelques fonctions comme l’impression

c’est facile a ajouter. l’impression sera par defaut basique en utilisant les marker et séparateur par défaut.
touts les attributs seront imprimé par défaut.
il sera cependant possible de spécifier ces paramètres

DANS Items def __str__(self, text_sep='', attr_list=[]):     '''     print x  x.__str__()     print the data in a text format, using default options

     '''     #if no text separator was specified, use the default one     if not text_sep : text_sep = self.text_sep     #if no attribute list was specified, use the default one if exist or nothing     if not attr_list :         try :             attr_list = self.attr_list         except AttributeError :             pass     #if header exist add the header_mark at the top of the each line     #and add all lines into the text to print     try :         text_list = map(lambda x: self.header_mark + x , self.header)     except AttributeError :         text_list = []     #if exist, add the attribute list, join by the text separator     if attr_list : text_list += [join(attr_list,text_sep)]     #call the print method of the item using the text separator and the attribute list as options     #and add the resulting text into the text to print     text_list += [item.__str__(text_sep=text_sep, attr_list=attr_list) for item in self]     #join element of the text to print by a \n and return it     return join(text_list, '\n')

DANS Item def __str__(self, text_sep = '\t', attr_list = []):     '''     print x  x.__str__()     print all element of x using tabulation as default text separator     options :     x.__str__([text_sep, [attr_list]])     print only the values of the attributes specified in attr_list     return the values as text using text_sep as text separator

     '''     #if no attribute list, use all the attributes of self         if not attr_list : attr_list = self.keys()     #get the value of the attributes in attr_list or an empty string if attribute does'nt exist     text_val = [self.get(attr, '') for attr in attr_list]     #return the values in a text format join by text_sep     return join(map(str,text_val), text_sep)

et j’ai donc ajouté un module de test pour cette fonction

 def test_printed_data(self):     '''     teste si les donnees parsees sont imprimees correctement     '''     header_info_1 = "header_01"     header_info_2 = "header_02"     col_1 = "col_1"     col_2 = "col_2"     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 with a complete file     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.__str__() == test_file)

     #test using a specific attribute list     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')     attr_list=[col_1]     test_file='''#%s#%s%s%s%s''' % (header_info_1, header_info_2, col_1, data_l1_c1, data_l2_c1)     self.assert_(test_item.__str__(attr_list=attr_list) == test_file)

     #test using a specific text separator     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')     attr_list=[col_1]     test_file='''#%s#%s%s;%s%s;%s%s;%s''' % (header_info_1, header_info_2, col_1, col_2, data_l1_c1, data_l1_c2, data_l2_c1, data_l2_c2)     self.assert_(test_item.__str__(text_sep=";") == test_file)

     #test with no header     test_file='''%s\t%s%s\t%s%s\t%s''' % (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.__str__() == test_file)

     #test with no attribute list     test_file='''%s\t%s%s\t%s''' % (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.__str__() == test_file)

     #test with no data     test_file='''%s\t%s''' % (col_1, col_2)     self.write_tmp_file(filetext = test_file)     test_item = Items(file_arg = 'tmp_file')     self.assert_(test_item.__str__() == test_file)

     #test with only header     test_file='''#%s#%s''' % (header_info_1, header_info_2)     self.write_tmp_file(filetext = test_file)     test_item = Items(file_arg = 'tmp_file')     self.assert_(test_item.__str__() == test_file)

     #test with nothing     test_file=''     self.write_tmp_file(filetext = test_file)     test_item = Items(file_arg = 'tmp_file')     self.assert_(test_item.__str__() == test_file)

     remove('tmp_file')     def valid_object(self, nb_header_line, nb_col, nb_line):     '''     x.valid_object(nb_header_line, nb_col, nb_line)     create a tmp file with the given parameters     parse the file using Items     test if all data have been correctly parsed     '''     #create the name of the file using the parameters (it could have been an arbitrary filename)     filename = 'file_%s_%s_%s' % (nb_header_line, nb_col, nb_line)     #call the method for creating the file     self.create_tmp_file(filename, nb_header_line, nb_col, nb_line)

     self.valid_item(filename=filename, nb_header_line=nb_header_line, nb_col=nb_col, nb_line=nb_line)

     #delete te tmp file     self.delete_tmp_file(filename)

qui renvoie

...the argument is not a regular file objectfile toto doesn't existpermission denied for file tmp_parse.txt..----------------------------------------------------------------------Ran 5 tests in 0.065s

OK

je vais aussi ajouter une fonction assez pratique au parser.
il s’agit d’une sorte d’index des infos qui sont dans les attributs.
je ne suis pas sur que ce soit pertinenet car ca risque d’etre lourd d’un point de vue traitement.
il faut probablement que ce soit fait a la demande.
comment procéder ?
il faut une fonction de requete.
cette fonction va créer l’index nécessaire s’il n’existe pas et rechercher dedans par la suite.
elle va donc passer par une fonction de création d’index. cette fonction var créer l’index souhaité pour le ou les attributs passé en argument.
en laissant la possibilité d’avoir plusieurs attributs en argument, on s’assure que la fonction pourra etre utilisée dans d’autre cas, comme la création de ces index de manière explicite.
si aucun argument est passé a cette fonction alors l’ensemble des index pour chaque attribut sera créé (risque d’etre long)

def create_indexes(self, attr_list=[]):       '''       x.create_indexes([attr_list])       attr_list -> list of string or str       create indexes for a list of attribute       '''       #test if there is an argument       if not attr_list :           #if not try to get the default attribute list           try :               attr_list = self.attr_list           except AttributeError :               #catch the error if it does'nt exist               print "no attribute for these data, indexes cannot be created"               #and stop function by raising error               raise       #build the index for each item       map(lambda x : self.build_index(x, attr_list), self)

   def build_index(self, item, attr_list):       '''       x.build_index(item, attr_list)       item -> instance of item       attr_list -> list of str or str       '''       #if attr_list is a single string, convert, put it in a list       if type(attr_list) == str : attr_list=[attr_list]       #for each attr       for attr in attr_list :           #test if it's a valid attribute           if attr not in self.attr_list :               print "%s is not a valide attribute" % attr               continue           #try to access to the value associated with the key attr           #if it doesn't exist, create the key as an empty dict and return it           try :               attr_index_list = self.indexes.setdefault(attr,{})           except AttributeError :               #catch the error if the attribute indexes does'nt exist,               #and create it               self.indexes = {}               attr_index_list = self.indexes.setdefault(attr,{})           #get the list associated with the key of the attribute of the item           #or an empty list if the key does'nt already exist           attr_index_item_list = attr_index_list.setdefault(item.get_attribute(attr), [])           #add item into this list           attr_index_item_list.append(item)

   def get_items_by_value(self, attr, value):       '''       item_list = x.get_items_by_value(attr, value)       attr -> str       value -> str, int or float       item_list -> instance of Items       return a list of items having a specified value for the attribute attr       '''

       try :           #check if the attr is in the attribute list           if attr not in self.attr_list :               #if not raise a keyError               print "%s is not a valide attribute" % attr               raise IndexError, "%s is not a valide attribute" % attr       except AttributeError :           #catch the AttributeError if ther is no attribute list           print "no attribute list available"           raise       #try to access to the index of the given attribute       try :           attr_index_list = self.indexes[attr]       except AttributeError :           #catch the error if the attribute indexes doesn't exist           #or if the key attr does'nt exist           #the index for the given attribuite is created           self.create_indexes(attr)           #and put into attr_index_list           attr_index_list = self.indexes[attr]       except KeyError :           #catch the error if the attribute indexes doesn't exist           #or if the key attr does'nt exist           #the index for the given attribuite is created           self.create_indexes(attr)           #and put into attr_index_list           attr_index_list = self.indexes[attr]       #return an instance of items with the list of the items matching with the given value       return Items(item_list = attr_index_list.get(value, []))   

j’ai du coup du modifier un peu le __init__ pour qu’il accepte des liste de item pour créer l’objet. cela permet dans une fonction de recherche de renvoyer un sous ensemble de l’objet de la meme forme que l’objet (une instance de items) plutot que une simple liste.
j’ai ajouté le code de test correspondant

def test_indexed_data(self):       '''       teste si les index creer sont correct       '''       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"       data_l2_c3 = "data_c3"       data_l1_c3 = "data_c3"       test_file='''#%s#%s%s\t%s\t%s%s\t%s\t%s%s\t%s\t%s''' % (header_info_1, header_info_2, col_1, col_2, col_3, data_l1_c1, data_l1_c2, data_l1_c3, data_l2_c1, data_l2_c2, data_l2_c3)       self.write_tmp_file(filetext = test_file)       test_item = Items(file_arg = 'tmp_file')       items_index_1 = test_item.get_items_by_value(col_1, data_l1_c1)       self.assert_(isinstance(items_index_1,Items))       self.assert_(len(items_index_1)==1)       self.assert_(isinstance(items_index_1[0], Item))       self.assert_(items_index_1[0].get_attribute(col_1) == data_l1_c1)

       items_index_2 = test_item.get_items_by_value(col_3, data_l1_c3)       self.assert_(isinstance(items_index_2,Items))       self.assert_(len(items_index_2)==2)       self.assert_(isinstance(items_index_2[0], Item))       self.assert_(isinstance(items_index_2[1], Item))       self.assert_(items_index_2[0].get_attribute(col_3) == data_l1_c3)       self.assert_(items_index_2[1].get_attribute(col_3) == data_l2_c3)

       items_index_3 = test_item.get_items_by_value(col_1, 'toto')       self.assert_(isinstance(items_index_3,Items))       self.assert_(len(items_index_3)==0)       self.assertFalse(items_index_3)

       self.assertRaises(IndexError, test_item.get_items_by_value, attr = 'col_0', value = 'toto')     

       remove('tmp_file')

le test renvoie alors

col_0 is not a valide attribute....the argument is not a regular file objectfile toto doesn't existpermission denied for file tmp_parse.txt..----------------------------------------------------------------------Ran 6 tests in 0.170s

OK

Le parser a l’air a peu pret complet, a voir a l’usage.
–> todo list tester le parser sur un plus gros fichier, type gal

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.

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

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.

7 mars 2008 – interface pour SganArrayL

mars 7, 2008

11h17 : maintenant que la base de données est construite il faut faire l’interface pour y accéder, et y entrer des données.

Prenons les choses dans l’ordre. Les premières infos a rentrer sont celles des orfs.
reprenons un peu la table bank_orf

Cette table est un peu pauvre, la table des orf peut-etre bcp plus étendue. dans la base sophia, j’ai créé une table d’orf à partir du fichier gff /home/gim2/bank/saccharomyces_cerevisiae.gff
je vais donc faire pareil pour cette table. et cette fois je vais faire un vrai joli code en python pour ca.
de plus je me dit qu’il faut peut-etre aussi stocker les infos sur la date du fichier d’orf.
bon, y’a plus qu’a retravailler sur un parser de gff finalement.

6 mars 2008 – redéfinition des tables de la base pour SganArrayl (suite)

mars 6, 2008

11h41 : la base que j’avais défini précédemment comportait un certain nombre d’erreur et ne prenait pas en compte les appâts multiples sur une même lame (voir explication)
je l’ai reprise en partant cette fois du point de vu de l’utilisateur, ce qui a mon avis est mieux.
Comment j’ai procédé –> j’ai essayé de voir la façon dont allait procéder l’utilisateur pour rentrer des données en me basant sur la version actuelle de SganArrayL et sur ce que je sais des manip.
d’un point de vue théorique, une manip consiste à hybrider les extraits d’une souche appât et d’une souche contrôle sur une lame et cela plusieurs fois en marquant éventuellement les extraits avec différents fluorochromes.
d’un point de vue pratique, une manip consiste le meme jour a hybrider 6 lames avec plusieurs souche appat différentes et plusieurs controle. l’utilisateur va alors scanner toutes ces lames, générés les fichiers gpr correspondant et les introduire dans la base de données.
l’élément central pour l’utilisateur c’est alors la lame. je suis donc parti de ca pour organiser la base. la table hyb_slide est celle autour de laquelle gravitent toutes les autres plus ou moins directement. c’est finalement assez logique.

cette table comprend un id comme clé primaire, une reférence de lame, un champs metatdat qui ne sera jamais rempli. c juste pour me rappeler de traiter les metadonnées du fichier gpr, un champ de commentaire, un lien vers l’image de la lame, et un lien vers le fichier gpr correspondant. de plus cette table est liée a la table des_experiment par le champs exp_id.

cette table contient un champs common_ref, un champ quality et un champs description. voir MIAME
de plus cette table est liée a des_biblio (liste d’article), des_citations (liste de citation), des_authors (listes des auteurs) et aussi a des_experimental_factors.
la table hyb_slide est aussi liée a la table prep_sample

cette table rassemble les éléments d’autres tables., biomaterial_manipulation, labelling_protocol, organism, extract_preparation
cettet table est dan sla partie sample used, extract preparetion and labelling (voir MIAME). dans cette partie on trouve aussi une table prep_strain, qui va associer a un gène une mutation et une utilisation, par exemple,
orf -> YPL093W – mutation -> DAMP – utilisation -> bait
ou aussi
orf -> YFR057W – mutation -> DAMP – utilisation -> control
le type de mutation et d’utilisation sont dans 2 tables liées à celle-ci.
les orf sont dans une table bank_orf et liée aussi a celle-ci.

la table prep_strain est liée à hyb_strain, elle-meme liée à hyb_slide. hyb_strain est liée aussi a hyb_fluorophore, qui contient la liste des marqueurs fluo utilisés (a priori cy3, cy5, alexa). on peut ainsi par cette table dire pour une plaque quelles sont les bait et control et quels marqueurs ont été utilisés.
hyb_slide est aussi liée à hyb_protocol et hyb_scan_protocol et surtout a hyb_mating_date, qui listera toute les differentes date d’hybridation.
les resultats traité ou non, sont dans la partie measurment data and specification.

la table mes_sot_data est liée à hyb_slide. elle va reprednre les info général sur chaque spot, diamètre, et flag. elle est liée à array_spots de la partie array description

cette table contient les info de position et de nom de chaque spot. elle est liée à array_chip_types pour le type de puce, array_spot_type pour le type de spot (feature ou control) et a bank_orf, pour l’orf a laquelle correspond ce spot.
la table mes_raw_signal est la table contenant les valeurs brute de fluorescence des spot. elles contient 7 champs propres correspondant aux valeurs du signal moyen, median et a l’ecart-type ainsin qu’aux valeurs du background moyen et median et a l’ecart-type. il y a aussi une valeur du rapport signal/bruit (SNR). cette table est liée à spd_id pour savoir de quelle spot il s’agit et à hyb_strain pour savoir de quel marqueur (et donc de quel gène) c’est le signal. dans le cas d’une lame à 3 couleurs ont va donc avoir pour chaque spot 3 lignes de resultats soit environ 60 000 lignes par lame. –> cela représente pour les 1000 gènes du projet genogim environ 2000 lames soit 120 millions de lignes pour cette table (voir le post sur les limites de postgresql).
les données doivent ensuite etre traité et entre autre il y a des ratio a effectué entre les différents signaux d’une meme lame. les ratio a effectué seront précisé dans mes_analysed_protocol. cette table est liée a 2 petite table mes_numerator et mes_denominator qui contiennent la litse des gene utilisé comme numérateur du ratio et comme dénominateur du ratio. il y a en plus une table mes_ratio_protocol decrivant les étape de l’analyse des signaux. enfin les valeurs de ratio sont stockées dans mes_analysed_data. cette table est liée a mes_analysed_protocol et contient 3 champs pour le moment, raw_ratio, centered_ratio et norm_ratio, pour les données brute, centrée et normalisée.

–> je remarque que cette table n’est pas directement liée aux spot ce qui est idiot car il y a une perte d’info. il faut ajouter en plus une liaison vers mes_spot_data
voila qui est fait.
j’ai généré les fichier sql pour créer et affacer la base et aussi faire les requètes.
ils sont dans /home/gim2/vpworkspace/
ce sont les fichier llp create.ddl , llp drop.ddl , llp insert.sql , llp select.sql , llp update.sql , llp delete.sql

  • pour créer les tables :

create table bank_orf (orf_id serial not null, orf_name varchar(255), orf_gene varchar(255), primary key (orf_id));
create table prep_mutation (mut_id serial not null, mut_type varchar(255), primary key (mut_id));
create table prep_strain (pstr_id serial not null, orf_id serial not null, mut_id serial not null, use_id serial not null, primary key (pstr_id));
create table des_authors (auth_id serial not null, auth_first_name varchar(50), auth_last_name varchar(50), loc_id serial not null, primary key (auth_id));
create table des_locations (loc_id serial not null, loc_name varchar(255), loc_address1 varchar(255), loc_address2 varchar(255), loc_zip_code int4, loc_city varchar(255), primary key (loc_id));
create table array_chip_types (ct_id serial not null, ct_name varchar(255), primary key (ct_id));
create table des_experiment_types (et_id serial not null, et_name varchar(255), et_desc varchar(255), primary key (et_id));
create table des_biblio (biblio_id serial not null, biblio_text varchar(255), primary key (biblio_id));
create table des_experiments (exp_id serial not null, exp_common_ref bool, exp_quality text, et_id serial not null, ef_id serial not null, exp_description text, primary key (exp_id));
create table des_citation (cit_id serial not null, cit_text varchar(255), primary key (cit_id));
create table prep_organism (org_id serial not null, orf_name varchar(255), primary key (org_id));
create table prep_orf_usage (use_id serial not null, use_type varchar(10), primary key (use_id));
create table prep_biomaterial_manipulation (biomat_id serial not null, biomat_growth_cond varchar(30), biomat_treatment_type varchar(25), biomat_separation_technique varchar(25), primary key (biomat_id));
create table prep_extraction_preparation (expr_id serial not null, expr_extract_type varchar(15), expr_amplification varchar(15), extp_id serial not null, primary key (expr_id));
create table prep_labeling_protocol (labp_id serial not null, labp_amount varchar(15), labp_label_used varchar(15), labp_incorporation text, primary key (labp_id));
create table hyb_protocol (hybp_id serial not null, hybp_protocol text, primary key (hybp_id));
create table hyb_mating_date (mdate_id serial not null, mdate_date date, primary key (mdate_id));
create table hyd_slide (sl_id serial not null, sl_ref varchar(10), exp_id serial not null, sl_metadata varchar(255), hybp_id serial not null, sl_comment varchar(255), mdate_id serial not null, scan_id serial not null, sl_image_path varchar(255), sl_gpr_path int4, auth_id serial not null, sa_id serial not null, ct_id serial not null, primary key (sl_id));
create table hyb_strain (hstr_id serial not null, hstr_generation_nb float4, sl_id serial not null, fluo_id serial not null, pstr_id serial not null, primary key (hstr_id));
create table hyb_fluorophore (fluo_id serial not null, "fluo name" varchar(10), fluo_lambda int2, primary key (fluo_id));
create table hyb_scan_protocol (scan_id serial not null, scan_protocol text, primary key (scan_id));
create table array_spots (sp_id serial not null, sp_block int4, sp_col int4, sp_row int4, sp_name int4, spt_id serial not null, ct_id serial not null, orf_id serial, primary key (sp_id));
create table mes_spot_data (spd_id serial not null, spd_diameter int4, spd_flag varchar(10), spd_autoflag varchar(10), sl_id serial not null, sp_id serial not null, primary key (spd_id));
create table mes_raw_signal (rsg_id serial not null, rsg_foreground_median int4, rsg_foreground_mean int4, rsg_forground_sd int4, rsg_background int4, rsg_background_median int4, rsg_background_mean int4, rsg_background_sd int4, rsg_snr float4, spd_id serial not null, hstr_id serial not null, primary key (rsg_id));
create table mes_analysed_data (anad_id serial, spd_id serial not null, anad_raw_ratio float8, anad_centered_ratio float8, anad_norm_ratio float8, anap_id serial not null);
create table mes_analysed_protocol (anap_id serial not null, num_id serial not null, den_id serial not null, ratp_id serial not null, primary key (anap_id));
create table mes_numerator (num_id serial not null, str_id serial not null, primary key (num_id));
create table mes_denominator (den_id serial not null, str_id serial not null, primary key (den_id));
create table array_spot_type (spt_id serial not null, spt_type varchar(10), constraint spt_type primary key (spt_id));
create table prep_sample (sa_id serial not null, biomat_id serial not null, labp_id serial not null, expr_id serial not null, org_id serial not null, primary key (sa_id));
create table des_authors_exp (auth_id serial not null, exp_id serial not null, primary key (auth_id, exp_id));
create table des_experimental_factors (ef_id serial not null, ef_factor varchar(30), primary key (ef_id));
create table des_biblio_exp (biblio_id serial not null, exp_id serial not null, primary key (biblio_id, exp_id));
create table des_cit_exp (cit_id serial not null, exp_id serial not null, primary key (cit_id, exp_id));
create table prep_extraction_prot (extp_id serial not null, extp_text text, primary key (extp_id));
create table mes_ratio_protocol (ratp_id serial not null, ratp_text text, primary key (ratp_id));
alter table prep_strain add constraint FKprep_strai403802 foreign key (orf_id) references bank_orf;
alter table prep_strain add constraint FKprep_strai214282 foreign key (mut_id) references prep_mutation;
alter table des_authors add constraint FKdes_author231061 foreign key (loc_id) references des_locations;
alter table des_experiments add constraint FKdes_experi225877 foreign key (et_id) references des_experiment_types;
alter table prep_sample add constraint FKprep_sampl485169 foreign key (org_id) references prep_organism;
alter table prep_strain add constraint FKprep_strai136538 foreign key (use_id) references prep_orf_usage;
alter table prep_sample add constraint FKprep_sampl452472 foreign key (labp_id) references prep_labeling_protocol;
alter table mes_spot_data add constraint FKmes_spot_d918897 foreign key (sp_id) references array_spots;
alter table mes_raw_signal add constraint FKmes_raw_si626364 foreign key (spd_id) references mes_spot_data;
alter table mes_analysed_protocol add constraint FKmes_analys951623 foreign key (num_id) references mes_numerator;
alter table mes_analysed_protocol add constraint FKmes_analys786494 foreign key (den_id) references mes_denominator;
alter table mes_analysed_data add constraint FKmes_analys587731 foreign key (anap_id) references mes_analysed_protocol;
alter table hyd_slide add constraint FKhyd_slide72580 foreign key (mdate_id) references hyb_mating_date;
alter table hyd_slide add constraint FKhyd_slide483698 foreign key (hybp_id) references hyb_protocol;
alter table array_spots add constraint FKarray_spot230773 foreign key (spt_id) references array_spot_type;
alter table array_spots add constraint FKarray_spot154343 foreign key (orf_id) references bank_orf;
alter table prep_sample add constraint FKprep_sampl459810 foreign key (expr_id) references prep_extraction_preparation;
alter table des_authors_exp add constraint FKdes_author795609 foreign key (auth_id) references des_authors;
alter table des_experiments add constraint FKdes_experi36244 foreign key (ef_id) references des_experimental_factors;
alter table des_authors_exp add constraint FKdes_author917097 foreign key (exp_id) references des_experiments;
alter table hyd_slide add constraint FKhyd_slide920516 foreign key (ct_id) references array_chip_types;
alter table des_biblio_exp add constraint FKdes_biblio481512 foreign key (biblio_id) references des_biblio;
alter table des_biblio_exp add constraint FKdes_biblio538208 foreign key (exp_id) references des_experiments;
alter table des_cit_exp add constraint FKdes_cit_ex676417 foreign key (cit_id) references des_citation;
alter table des_cit_exp add constraint FKdes_cit_ex401799 foreign key (exp_id) references des_experiments;
alter table prep_sample add constraint FKprep_sampl686540 foreign key (biomat_id) references prep_biomaterial_manipulation;
alter table prep_extraction_preparation add constraint FKprep_extra865431 foreign key (extp_id) references prep_extraction_prot;
alter table hyd_slide add constraint FKhyd_slide628246 foreign key (exp_id) references des_experiments;
alter table hyd_slide add constraint FKhyd_slide329699 foreign key (sa_id) references prep_sample;
alter table hyb_strain add constraint FKhyb_strain18944 foreign key (pstr_id) references prep_strain;
alter table hyb_strain add constraint FKhyb_strain340557 foreign key (sl_id) references hyd_slide;
alter table hyb_strain add constraint FKhyb_strain6029 foreign key (fluo_id) references hyb_fluorophore;
alter table hyd_slide add constraint FKhyd_slide946515 foreign key (scan_id) references hyb_scan_protocol;
alter table array_spots add constraint FKarray_spot991272 foreign key (ct_id) references array_chip_types;
alter table mes_spot_data add constraint FKmes_spot_d379231 foreign key (sl_id) references hyd_slide;
alter table mes_raw_signal add constraint FKmes_raw_si231276 foreign key (hstr_id) references hyb_strain;
alter table mes_denominator add constraint FKmes_denomi703686 foreign key (str_id) references hyb_strain;
alter table mes_numerator add constraint FKmes_numera792103 foreign key (str_id) references hyb_strain;
alter table mes_analysed_protocol add constraint FKmes_analys48304 foreign key (ratp_id) references mes_ratio_protocol;
alter table hyd_slide add constraint FKhyd_slide369363 foreign key (auth_id) references des_authors;
alter table mes_analysed_data add constraint FKmes_analys921582 foreign key (spd_id) references mes_spot_data;

  • pour effacer les tables


alter table prep_strain drop constraint FKprep_strai403802;
alter table prep_strain drop constraint FKprep_strai214282;
alter table des_authors drop constraint FKdes_author231061;
alter table des_experiments drop constraint FKdes_experi225877;
alter table prep_sample drop constraint FKprep_sampl485169;
alter table prep_strain drop constraint FKprep_strai136538;
alter table prep_sample drop constraint FKprep_sampl452472;
alter table mes_spot_data drop constraint FKmes_spot_d918897;
alter table mes_raw_signal drop constraint FKmes_raw_si626364;
alter table mes_analysed_protocol drop constraint FKmes_analys951623;
alter table mes_analysed_protocol drop constraint FKmes_analys786494;
alter table mes_analysed_data drop constraint FKmes_analys587731;
alter table hyd_slide drop constraint FKhyd_slide72580;
alter table hyd_slide drop constraint FKhyd_slide483698;
alter table array_spots drop constraint FKarray_spot230773;
alter table array_spots drop constraint FKarray_spot154343;
alter table prep_sample drop constraint FKprep_sampl459810;
alter table des_authors_exp drop constraint FKdes_author795609;
alter table des_experiments drop constraint FKdes_experi36244;
alter table des_authors_exp drop constraint FKdes_author917097;
alter table hyd_slide drop constraint FKhyd_slide920516;
alter table des_biblio_exp drop constraint FKdes_biblio481512;
alter table des_biblio_exp drop constraint FKdes_biblio538208;
alter table des_cit_exp drop constraint FKdes_cit_ex676417;
alter table des_cit_exp drop constraint FKdes_cit_ex401799;
alter table prep_sample drop constraint FKprep_sampl686540;
alter table prep_extraction_preparation drop constraint FKprep_extra865431;
alter table hyd_slide drop constraint FKhyd_slide628246;
alter table hyd_slide drop constraint FKhyd_slide329699;
alter table hyb_strain drop constraint FKhyb_strain18944;
alter table hyb_strain drop constraint FKhyb_strain340557;
alter table hyb_strain drop constraint FKhyb_strain6029;
alter table hyd_slide drop constraint FKhyd_slide946515;
alter table array_spots drop constraint FKarray_spot991272;
alter table mes_spot_data drop constraint FKmes_spot_d379231;
alter table mes_raw_signal drop constraint FKmes_raw_si231276;
alter table mes_denominator drop constraint FKmes_denomi703686;
alter table mes_numerator drop constraint FKmes_numera792103;
alter table mes_analysed_protocol drop constraint FKmes_analys48304;
alter table hyd_slide drop constraint FKhyd_slide369363;
alter table mes_analysed_data drop constraint FKmes_analys921582;
drop table bank_orf;
drop table prep_mutation;
drop table prep_strain;
drop table des_authors;
drop table des_locations;
drop table array_chip_types;
drop table des_experiment_types;
drop table des_biblio;
drop table des_experiments;
drop table des_citation;
drop table prep_organism;
drop table prep_orf_usage;
drop table prep_biomaterial_manipulation;
drop table prep_extraction_preparation;
drop table prep_labeling_protocol;
drop table hyb_protocol;
drop table hyb_mating_date;
drop table hyd_slide;
drop table hyb_strain;
drop table hyb_fluorophore;
drop table hyb_scan_protocol;
drop table array_spots;
drop table mes_spot_data;
drop table mes_raw_signal;
drop table mes_analysed_data;
drop table mes_analysed_protocol;
drop table mes_numerator;
drop table mes_denominator;
drop table array_spot_type;
drop table prep_sample;
drop table des_authors_exp;
drop table des_experimental_factors;
drop table des_biblio_exp;
drop table des_cit_exp;
drop table prep_extraction_prot;
drop table mes_ratio_protocol;

  • pour inserer des donnée


insert into bank_orf(orf_id, orf_name, orf_gene) values (?, ?, ?);
insert into prep_mutation(mut_id, mut_type) values (?, ?);
insert into prep_strain(pstr_id, orf_id, mut_id, use_id) values (?, ?, ?, ?);
insert into des_authors(auth_id, auth_first_name, auth_last_name, loc_id) values (?, ?, ?, ?);
insert into des_locations(loc_id, loc_name, loc_address1, loc_address2, loc_zip_code, loc_city) values (?, ?, ?, ?, ?, ?);
insert into array_chip_types(ct_id, ct_name) values (?, ?);
insert into des_experiment_types(et_id, et_name, et_desc) values (?, ?, ?);
insert into des_biblio(biblio_id, biblio_text) values (?, ?);
insert into des_experiments(exp_id, exp_common_ref, exp_quality, et_id, ef_id, exp_description) values (?, ?, ?, ?, ?, ?);
insert into des_citation(cit_id, cit_text) values (?, ?);
insert into prep_organism(org_id, orf_name) values (?, ?);
insert into prep_orf_usage(use_id, use_type) values (?, ?);
insert into prep_biomaterial_manipulation(biomat_id, biomat_growth_cond, biomat_treatment_type, biomat_separation_technique) values (?, ?, ?, ?);
insert into prep_extraction_preparation(expr_id, expr_extract_type, expr_amplification, extp_id) values (?, ?, ?, ?);
insert into prep_labeling_protocol(labp_id, labp_amount, labp_label_used, labp_incorporation) values (?, ?, ?, ?);
insert into hyb_protocol(hybp_id, hybp_protocol) values (?, ?);
insert into hyb_mating_date(mdate_id, mdate_date) values (?, ?);
insert into hyd_slide(sl_id, sl_ref, exp_id, sl_metadata, hybp_id, sl_comment, mdate_id, scan_id, sl_image_path, sl_gpr_path, auth_id, sa_id, ct_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
insert into hyb_strain(hstr_id, hstr_generation_nb, sl_id, fluo_id, pstr_id) values (?, ?, ?, ?, ?);
insert into hyb_fluorophore(fluo_id, "fluo name", fluo_lambda) values (?, ?, ?);
insert into hyb_scan_protocol(scan_id, scan_protocol) values (?, ?);
insert into array_spots(sp_id, sp_block, sp_col, sp_row, sp_name, spt_id, ct_id, orf_id) values (?, ?, ?, ?, ?, ?, ?, ?);
insert into mes_spot_data(spd_id, spd_diameter, spd_flag, spd_autoflag, sl_id, sp_id) values (?, ?, ?, ?, ?, ?);
insert into mes_raw_signal(rsg_id, rsg_foreground_median, rsg_foreground_mean, rsg_forground_sd, rsg_background, rsg_background_median, rsg_background_mean, rsg_background_sd, rsg_snr, spd_id, hstr_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
insert into mes_analysed_data(anad_id, spd_id, anad_raw_ratio, anad_centered_ratio, anad_norm_ratio, anap_id) values (?, ?, ?, ?, ?, ?);
insert into mes_analysed_protocol(anap_id, num_id, den_id, ratp_id) values (?, ?, ?, ?);
insert into mes_numerator(num_id, str_id) values (?, ?);
insert into mes_denominator(den_id, str_id) values (?, ?);
insert into array_spot_type(spt_id, spt_type) values (?, ?);
insert into prep_sample(sa_id, biomat_id, labp_id, expr_id, org_id) values (?, ?, ?, ?, ?);
insert into des_authors_exp(auth_id, exp_id) values (?, ?);
insert into des_experimental_factors(ef_id, ef_factor) values (?, ?);
insert into des_biblio_exp(biblio_id, exp_id) values (?, ?);
insert into des_cit_exp(cit_id, exp_id) values (?, ?);
insert into prep_extraction_prot(extp_id, extp_text) values (?, ?);
insert into mes_ratio_protocol(ratp_id, ratp_text) values (?, ?);

  • pour selectionner des données


select orf_id, orf_name, orf_gene from bank_orf;
select mut_id, mut_type from prep_mutation;
select pstr_id, orf_id, mut_id, use_id from prep_strain;
select auth_id, auth_first_name, auth_last_name, loc_id from des_authors;
select loc_id, loc_name, loc_address1, loc_address2, loc_zip_code, loc_city from des_locations;
select ct_id, ct_name from array_chip_types;
select et_id, et_name, et_desc from des_experiment_types;
select biblio_id, biblio_text from des_biblio;
select exp_id, exp_common_ref, exp_quality, et_id, ef_id, exp_description from des_experiments;
select cit_id, cit_text from des_citation;
select org_id, orf_name from prep_organism;
select use_id, use_type from prep_orf_usage;
select biomat_id, biomat_growth_cond, biomat_treatment_type, biomat_separation_technique from prep_biomaterial_manipulation;
select expr_id, expr_extract_type, expr_amplification, extp_id from prep_extraction_preparation;
select labp_id, labp_amount, labp_label_used, labp_incorporation from prep_labeling_protocol;
select hybp_id, hybp_protocol from hyb_protocol;
select mdate_id, mdate_date from hyb_mating_date;
select sl_id, sl_ref, exp_id, sl_metadata, hybp_id, sl_comment, mdate_id, scan_id, sl_image_path, sl_gpr_path, auth_id, sa_id, ct_id from hyd_slide;
select hstr_id, hstr_generation_nb, sl_id, fluo_id, pstr_id from hyb_strain;
select fluo_id, "fluo name", fluo_lambda from hyb_fluorophore;
select scan_id, scan_protocol from hyb_scan_protocol;
select sp_id, sp_block, sp_col, sp_row, sp_name, spt_id, ct_id, orf_id from array_spots;
select spd_id, spd_diameter, spd_flag, spd_autoflag, sl_id, sp_id from mes_spot_data;
select rsg_id, rsg_foreground_median, rsg_foreground_mean, rsg_forground_sd, rsg_background, rsg_background_median, rsg_background_mean, rsg_background_sd, rsg_snr, spd_id, hstr_id from mes_raw_signal;
select anad_id, spd_id, anad_raw_ratio, anad_centered_ratio, anad_norm_ratio, anap_id from mes_analysed_data;
select anap_id, num_id, den_id, ratp_id from mes_analysed_protocol;
select num_id, str_id from mes_numerator;
select den_id, str_id from mes_denominator;
select spt_id, spt_type from array_spot_type;
select sa_id, biomat_id, labp_id, expr_id, org_id from prep_sample;
select auth_id, exp_id from des_authors_exp;
select ef_id, ef_factor from des_experimental_factors;
select biblio_id, exp_id from des_biblio_exp;
select cit_id, exp_id from des_cit_exp;
select extp_id, extp_text from prep_extraction_prot;
select ratp_id, ratp_text from mes_ratio_protocol;

  • pour modifier des données


update bank_orf set orf_name = ?, orf_gene = ? where orf_id = ?;
update prep_mutation set mut_type = ? where mut_id = ?;
update prep_strain set orf_id = ?, mut_id = ?, use_id = ? where pstr_id = ?;
update des_authors set auth_first_name = ?, auth_last_name = ?, loc_id = ? where auth_id = ?;
update des_locations set loc_name = ?, loc_address1 = ?, loc_address2 = ?, loc_zip_code = ?, loc_city = ? where loc_id = ?;
update array_chip_types set ct_name = ? where ct_id = ?;
update des_experiment_types set et_name = ?, et_desc = ? where et_id = ?;
update des_biblio set biblio_text = ? where biblio_id = ?;
update des_experiments set exp_common_ref = ?, exp_quality = ?, et_id = ?, ef_id = ?, exp_description = ? where exp_id = ?;
update des_citation set cit_text = ? where cit_id = ?;
update prep_organism set orf_name = ? where org_id = ?;
update prep_orf_usage set use_type = ? where use_id = ?;
update prep_biomaterial_manipulation set biomat_growth_cond = ?, biomat_treatment_type = ?, biomat_separation_technique = ? where biomat_id = ?;
update prep_extraction_preparation set expr_extract_type = ?, expr_amplification = ?, extp_id = ? where expr_id = ?;
update prep_labeling_protocol set labp_amount = ?, labp_label_used = ?, labp_incorporation = ? where labp_id = ?;
update hyb_protocol set hybp_protocol = ? where hybp_id = ?;
update hyb_mating_date set mdate_date = ? where mdate_id = ?;
update hyd_slide set sl_ref = ?, exp_id = ?, sl_metadata = ?, hybp_id = ?, sl_comment = ?, mdate_id = ?, scan_id = ?, sl_image_path = ?, sl_gpr_path = ?, auth_id = ?, sa_id = ?, ct_id = ? where sl_id = ?;
update hyb_strain set hstr_generation_nb = ?, sl_id = ?, fluo_id = ?, pstr_id = ? where hstr_id = ?;
update hyb_fluorophore set "fluo name" = ?, fluo_lambda = ? where fluo_id = ?;
update hyb_scan_protocol set scan_protocol = ? where scan_id = ?;
update array_spots set sp_block = ?, sp_col = ?, sp_row = ?, sp_name = ?, spt_id = ?, ct_id = ?, orf_id = ? where sp_id = ?;
update mes_spot_data set spd_diameter = ?, spd_flag = ?, spd_autoflag = ?, sl_id = ?, sp_id = ? where spd_id = ?;
update mes_raw_signal set rsg_foreground_median = ?, rsg_foreground_mean = ?, rsg_forground_sd = ?, rsg_background = ?, rsg_background_median = ?, rsg_background_mean = ?, rsg_background_sd = ?, rsg_snr = ?, spd_id = ?, hstr_id = ? where rsg_id = ?;
update mes_analysed_data set anad_id = ?, spd_id = ?, anad_raw_ratio = ?, anad_centered_ratio = ?, anad_norm_ratio = ?, anap_id = ? where ;
update mes_analysed_protocol set num_id = ?, den_id = ?, ratp_id = ? where anap_id = ?;
update mes_numerator set str_id = ? where num_id = ?;
update mes_denominator set str_id = ? where den_id = ?;
update array_spot_type set spt_type = ? where spt_id = ?;
update prep_sample set biomat_id = ?, labp_id = ?, expr_id = ?, org_id = ? where sa_id = ?;
update des_authors_exp set where auth_id = ? and exp_id = ?;
update des_experimental_factors set ef_factor = ? where ef_id = ?;
update des_biblio_exp set where biblio_id = ? and exp_id = ?;
update des_cit_exp set where cit_id = ? and exp_id = ?;
update prep_extraction_prot set extp_text = ? where extp_id = ?;
update mes_ratio_protocol set ratp_text = ? where ratp_id = ?;

  • pour effacer des données


delete from bank_orf where orf_id = ?;
delete from prep_mutation where mut_id = ?;
delete from prep_strain where pstr_id = ?;
delete from des_authors where auth_id = ?;
delete from des_locations where loc_id = ?;
delete from array_chip_types where ct_id = ?;
delete from des_experiment_types where et_id = ?;
delete from des_biblio where biblio_id = ?;
delete from des_experiments where exp_id = ?;
delete from des_citation where cit_id = ?;
delete from prep_organism where org_id = ?;
delete from prep_orf_usage where use_id = ?;
delete from prep_biomaterial_manipulation where biomat_id = ?;
delete from prep_extraction_preparation where expr_id = ?;
delete from prep_labeling_protocol where labp_id = ?;
delete from hyb_protocol where hybp_id = ?;
delete from hyb_mating_date where mdate_id = ?;
delete from hyd_slide where sl_id = ?;
delete from hyb_strain where hstr_id = ?;
delete from hyb_fluorophore where fluo_id = ?;
delete from hyb_scan_protocol where scan_id = ?;
delete from array_spots where sp_id = ?;
delete from mes_spot_data where spd_id = ?;
delete from mes_raw_signal where rsg_id = ?;
delete from mes_analysed_data where ;
delete from mes_analysed_protocol where anap_id = ?;
delete from mes_numerator where num_id = ?;
delete from mes_denominator where den_id = ?;
delete from array_spot_type where spt_id = ?;
delete from prep_sample where sa_id = ?;
delete from des_authors_exp where auth_id = ?andexp_id = ?;
delete from des_experimental_factors where ef_id = ?;
delete from des_biblio_exp where biblio_id = ?andexp_id = ?;
delete from des_cit_exp where cit_id = ?andexp_id = ?;
delete from prep_extraction_prot where extp_id = ?;
delete from mes_ratio_protocol where ratp_id = ?;

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.