Archive de la catégorie «parser»

15 avril 2008 – Parser pour le fichier gff

avril 16, 2008

le parser pour fichier GFF est assez simple
description du format gff –> ici

un header de taille variable marqué par “#”
puis des données en colonne séparées par des tabulations.
il y a 9 colonnes.
il n’y a pas de ligne de titre
exemple :

less /home/gim2/bank/saccharomyces_cerevisiae.gff

##gff-version 3#date Wed Jul 18 19:35:09 2007## Saccharomyces cerevisiae S288C genome## Features from the 16 nuclear chromosomes labeled chrI to chrXVI,# plus the mitochondrial genome labeled chrMito and the 2-micron plasmid.## Created by Saccharomyces Genome Database (http://www.yeastgenome.org/)## Weekly updates of this file are available via Anonymous FTP from:# ftp://ftp.yeastgenome.org/yeast/data_download/chromosomal_feature/saccharomyces_cerevisiae.gff## Please send comments and suggestions to yeast-curator@yeastgenome.org## SGD is funded as a National Human Genome Research Institute Biomedical Informatics Resource from# the U. S. National Institutes of Health to Stanford University.  The staff of SGD is listed at:# http://www.yeastgenome.org/SGD-staff.html#chrI    SGD     chromosome      1       230208  .       .       .       ID=chrI;dbxref=NCBI:NC_001133chrI    SGD     repeat_family   1       62      .       -       .       ID=TEL01L-TR;Name=TEL01L-TR;Note=Terminal%20stretch%20of%20telomeric%20repeats%20on%20the%20left%20arm%20of%20Chromosome%20I;dbxref=SGD:S000028864

le contenu des colonnes est (dans l’ordre) :

  • seqname

Le nom de la séquences, dans le cas de la levure, le chromosome

  • source

La source de la feature. soit le programme ayant réalisé la prédiction, ou la base de donnée publique… dans le cas de la levure, c’est en général SGD.

  • feature

Le nom de la feature si possible un nom standardisé.

  • start, end

debut et fin de la feature, fin doit etre supérieur a debut

  • score

score de la feature ou ‘.’ s’il n’y en a pas

  • strand

‘+’ ou ‘-’ selon le brin ou alors ‘.’ si ca ne s’applique pas

  • frame

‘0′, ‘1′, ‘2′, ou ‘.’ indique la position du premier codon

  • Attribute

Cette colonne est différente car elle contient nom pas une valeur mais une liste d’attribut. ceux-ci sont séparé par des “;” et

Le fichier peut contenir des meta données identifées par un “#”

le parser doit donc
parser le header par la méthode par défaut
utiliser une liste de nom de colonne prédéfinie
parser les lignes
puis pour chaque item parser l’élément de la dernière colonne pour en extraire les attributs et les ajouter a item.

class Gff_parser(Items):    def __init__(self, **arg):        '''        x = Gff_parser(**arg)        '''

        arg['column_names']=['chr','origin','type','start','end','score','strand','frame', 'group']

        self.attr_group=set([])        #call the init method of Items        Items.__init__(self, **arg)        self.attr_list.extend(self.attr_group)

    def parse_group(self, item):        group = item.get_attribute('group')

        groups = split(group, ';')

        group_items=(self.parse_group_item(item) for item in groups)

        item.set_attribute(group_items)

        self.attr_group.update(item.get_attr_list())

        return item

    def special_data_parsing_fn(self, item):        return self.parse_group(item)

    def parse_group_item(self, group_item):        return split(group_item, '=')

j’ai modifié la méthode d’assignation des item.
j’ai rajouté une fonction qui s’applique sur chaque item juste après sa création.
cette méthode sera a surclasser dans les parser si besoin

    def list2item(self, data_list):        '''        data_item = x.list2item(data_list)        data_list -> list of list        data_item -> list        create instances of Item for all element of data_list        return all instances in a list        '''        try :            #create instance of Item for all element of data_list            return (self.special_data_parsing_fn(Item(x, self.attr_list)) for x in data_list)        except TypeError :            #if data_list can't be map, return an ampty list            return []

    def special_data_parsing_fn(self, item):        return item

j’ai ajouté un module de test gff qui reste a completer.

    def test_gff_parser(self):        test_gff = Gff_parser(file_arg = '/home/gim2/bank//saccharomyces_cerevisiae.gff')        self.assert_(isinstance(test_gff,Gff_parser))        print test_gff[0].keys()

j’ai en sortie

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 8 tests in 4.603s

OK

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.

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

14 février 2007 – modification de la classe abstraite item_list

février 14, 2008

Pour pouvoir utiliser item_list comme superclasse de microarray_list, il est nécessaire de pouvoir parser le fichier gpr dans item_list, or cette classe parse les fichier de façon très simple, fichier tabulé, 1 ligne d’entête et puis c tout.
l’idée est donc de faire un objet parser contenant toute les infos du fichier a parser. la classe parser aura des attribute contenant le format du fichier, le séparateur de champ, l’indicateur de texte (en option), l’indicateur de commentaire et/ou de meta-données.
14h13 : comment procéder ? je vais commencer par créer la classe et je verrais après
16h00 : la classe Parser a été créée avec un constructeur, et des méthodes qui vont bien

class Parser :
'''
class parser. define info for parsing a file
'''
attr_list = {
'field_separator' : '\t',
'text_separator' : '',
'comment_mark' : '#',
'metafield_marker' : '=',
'metafield_comment' : False,
'header_line' : True,
'format' : None
}
cvs = {
'field_separator' : '\t',
'text_separator' : '',
'comment_mark' : '',
'metafield_marker' : '',
'metafield_comment' : False,
'header_line' : True,
'format' : 'cvs'
}
gpr = {
'field_separator' : '\t',
'text_separator' : '',
'comment_mark' : '#',
'metafield_marker' : '=',
'metafield_comment' : False,
'header_line' : True,
'format' : 'gpr'
}
def __init__(self, **arg):
'''
x = Parser(**arg)
authorized arguments:
-field_separator (default TAB)
-text_separator (default None)
-comment_mark (default #)
-metafield_marker (default =)
-metafield_comment (default False)
-header_line (default True)
-format (default None)

'''
self.set_default()
for k,v in arg.items():
try :
self.set_attr(k,v)
except ParserError, e :
print e
if self.format :
self.set_format(self.format)

def set_default(self):
'''
x.set_default() set attribute value to their default value
'''
self.set_format("attr_list")

def get_format(self, format_name):
'''
format = x.get_format(format_name) sthe format parameters of a given format_name
'''
if hasattr(self, format_name) :
return getattr(self, format_name)
raise ParserError("user format %s is not defined" % format_name)

def set_format(self, format_name):
'''
x.set_format() set the attribute value to to the value describe by a given format_name
'''
try :
format = self.get_format(format_name)
except ParserError, e :
print e
return
for k,v in format.items():
try :
self.set_attr(k,v)
except ParserError, e :
print e

def set_attr(self, k, v):
'''
x.set_attr(k, v) set to v the value of a given attribute k
'''
if k in self.attr_list.keys() :
setattr(self, k, v)
else :
raise ParserError("option %s doesn't exist" % k)


Au passage la classe ParserError a été créée

class ParserError(Exception):
def __init__(self, msg):
self.msg = msg

def __str__(self):
return self.msg

avec cette classe Parser, je vais maintenant definir dans Item_list une méthode parsant les fichier en fonction de ces paramètres. le plus difficile va etre la gestion des meta-données. je pense créé un attribut metadata sous la forme d’un dictionnaire. le probleme du fichier gpr est la présence de 2 ligne en tête de fichier sans marker de commentaire. mon idée était de lire le fichier en cherchant des commentaires ou des meta-données et une fois tout ceux-ci trouvé, considerer les autres ligne comme des data.
1ere solution : pour eliminer les 2 lignes en tete du fichier gpr, je vais ajouter un attribut ’start_line’ a valeur de 3 pour un fichier gpr, 1 pour csv et 1 par defaut
2eme solution : la recherche des différents élement doit se faire par présence ou absence des autres éléments.
18:27: le parser est finis mais je ne suis pas totalement satisfait de la fonction de recherche des élements. elle se base juste sur la présence des marqueurs dans la ligne. dans le cas de mélange de ces marqueurs, on risque des bugs. il faudra surement retravailler ce parser pour qu’il soit un peu plus générique