Changes in [1776:e7da84795108:1777:ab15a6b6fbbe] in orange-bioinformatics


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • _bioinformatics/obiGO.py

    r1716 r1771  
    1 """obiGO is a Gene Ontology (GO) Handling Library. 
    2  
    31""" 
     2`obiGO` is a Gene Ontology (GO) Handling Library. 
     3 
     4""" 
    45 
    56from __future__ import absolute_import 
     7import os 
     8import sys 
     9import tarfile 
     10import gzip 
     11import re 
     12import cPickle 
     13import shutil 
     14import urllib2 
     15import warnings 
     16import copy 
    617 
    718from urllib import urlretrieve 
    819from gzip import GzipFile 
    9 import tarfile 
    10 import gzip 
    11 import shutil 
    12 import sys, os 
    13 import re, cPickle 
    1420from datetime import datetime 
    1521from collections import defaultdict 
    1622 
    1723from Orange.orng import orngEnviron 
     24from Orange.orng import orngServerFiles 
     25from Orange.orng import orngMisc 
    1826 
    1927from . import obiProb, obiGene 
    2028 
    21 try: 
    22     from Orange.orng import orngServerFiles 
    23     default_database_path = os.path.join(orngServerFiles.localpath(), "GO") 
    24 except Exception: 
    25     default_database_path = os.curdir 
     29default_database_path = os.path.join(orngServerFiles.localpath(), "GO") 
     30 
    2631 
    2732_CVS_REVISION_RE = re.compile(r"^(rev)?\d+\.\d+$") 
    2833 
    2934evidenceTypes = { 
    30 ##Experimental 
     35# Experimental 
    3136    'EXP': 'Inferred from Experiment', 
    3237    'IDA': 'Inferred from Direct Assay', 
    33     'IPI': 'Inferred from Physical Interaction', ## [with <database:protein_name>]', 
     38    'IPI': 'Inferred from Physical Interaction',  # [with <database:protein_name>]', 
    3439    'IMP': 'Inferred from Mutant Phenotype', 
    35     'IGI': 'Inferred from Genetic Interaction', ## [with <database:gene_symbol[allele_symbol]>]', 
     40    'IGI': 'Inferred from Genetic Interaction',  # [with <database:gene_symbol[allele_symbol]>]', 
    3641    'IEP': 'Inferred from Expression Pattern', 
    37 ##Computational Analysis Evidence Codes 
    38     'ISS': 'Inferred from Sequence Similarity', ## [with <database:sequence_id>] ', 
     42# Computational Analysis Evidence Codes 
     43    'ISS': 'Inferred from Sequence Similarity',  # [with <database:sequence_id>] ', 
    3944    'ISA': 'Inferred from Sequence Alignment', 
    4045    'ISO': 'Inferred from Sequence Orthology', 
     
    4247    'IGC': 'Inferred from Genomic Context', 
    4348    'RCA': 'Inferred from Reviewed Computational Analysis', 
    44 ##Author Statement Evidence Codes 
     49# Author Statement Evidence Codes 
    4550    'TAS': 'Traceable author statement', 
    4651    'NAS': 'Non-traceable author statement', 
    47 ##Curatorial Statement Evidence Codes 
     52# Curatorial Statement Evidence Codes 
    4853    'IC': 'Inferred by curator', 
    4954    'ND': 'No biological data available', 
    50 ##Computationally-assigned Evidence Codes 
    51     'IEA': 'Inferred from electronic annotation', ## [to <database:id>]', 
    52 ##Obsolete Evidence Codes 
     55# Computationally-assigned Evidence Codes 
     56    'IEA': 'Inferred from electronic annotation',  # [to <database:id>]', 
     57# Obsolete Evidence Codes 
    5358    'NR': 'Not Recorded(Obsolete)' 
    5459} 
    55 ##evidenceDict={"IMP":1, "IGI":2, "IPI":4, "ISS":8, "IDA":16, "IEP":32, "IEA":64, 
    56 ##              "TAS":128, "NAS":256, "ND":512, "IC":1024, "RCA":2048, "IGC":4096, "RCA":8192, "NR":16384} 
    57  
    58 evidenceDict=defaultdict(int, [(e, 2**i) for i, e in enumerate(evidenceTypes.keys())]) 
     60 
     61 
     62evidenceDict = defaultdict(int, [(e, 2 ** i) for i, e in 
     63                                enumerate(evidenceTypes.keys())]) 
    5964 
    6065evidenceTypesOrdered = [ 
     
    6570'IGI', 
    6671'IEP', 
    67 ##Computational Analysis Evidence Codes 
     72# Computational Analysis Evidence Codes 
    6873'ISS', 
    6974'ISA', 
     
    7277'IGC', 
    7378'RCA', 
    74 ##Author Statement Evidence Codes 
     79# Author Statement Evidence Codes 
    7580'TAS', 
    7681'NAS', 
    77 ##Curatorial Statement Evidence Codes 
     82# Curatorial Statement Evidence Codes 
    7883'IC', 
    7984'ND', 
    80 ##Computationally-assigned Evidence Codes 
     85# Computationally-assigned Evidence Codes 
    8186'IEA', 
    82 ##Obsolete Evidence Codes 
     87# Obsolete Evidence Codes 
    8388'NR' 
    8489] 
    8590 
    86 multiplicitySet=set(["alt_id","is_a","subset","synonym","related_synonym", 
    87                      "exact_synonym","broad_synonym","narrow_synonym", 
    88                      "xref_analog","xref_unknown","relationship"]) 
     91multiplicitySet = set( 
     92    ["alt_id", "is_a", "subset", "synonym", "related_synonym", 
     93     "exact_synonym", "broad_synonym", "narrow_synonym", 
     94     "xref_analog", "xref_unknown", "relationship"]) 
    8995 
    9096multipleTagSet = multiplicitySet 
    9197 
    92 annotationFields=["DB","DB_Object_ID","DB_Object_Symbol","Qualifier","GO_ID", 
    93                   "DB_Reference","Evidence_Code","With_From","Aspect", 
    94                   "DB_Object_Name","DB_Object_Synonym","DB_Object_Type", 
    95                   "Taxon","Date","Assigned_by"] 
    96  
    97 annotationFieldsDict={"DB":0, 
    98                       "DB_Object_ID":1, 
    99                       "DB_Object_Symbol":2, 
    100                       "Qualifier":3, 
    101                       "GO_ID":4, 
    102                       "GO ID":4, 
    103                       "GOID":4, 
    104                       "DB_Reference":5, 
    105                       "DB:Reference":5, 
    106                       "Evidence_Code":6, 
    107                       "Evidence Code":6, 
    108                       "Evidence_code":6, #compatibility with  older revisions 
    109                       "With_or_From":7, 
    110                       "With (or) From":7, 
    111                       "Aspect":8, 
    112                       "DB_Object_Name":9, 
    113                       "DB_Object_Synonym":10, 
    114                       "DB_Object_Type":11, 
    115                       "taxon":12, 
    116                       "Date":13, 
    117                       "Assigned_by":14}     
     98annotationFields = [ 
     99    "DB", "DB_Object_ID", "DB_Object_Symbol", "Qualifier", "GO_ID", 
     100    "DB_Reference", "Evidence_Code", "With_From", "Aspect", "DB_Object_Name", 
     101    "DB_Object_Synonym", "DB_Object_Type", "Taxon", "Date", "Assigned_by"] 
     102 
     103annotationFieldsDict = { 
     104    "DB": 0, 
     105    "DB_Object_ID": 1, 
     106    "DB_Object_Symbol": 2, 
     107    "Qualifier": 3, 
     108    "GO_ID": 4, 
     109    "GO ID": 4, 
     110    "GOID": 4, 
     111    "DB_Reference": 5, 
     112    "DB:Reference": 5, 
     113    "Evidence_Code": 6, 
     114    "Evidence Code": 6, 
     115    "Evidence_code": 6,  # compatibility with  older revisions 
     116    "With_or_From": 7, 
     117    "With (or) From": 7, 
     118    "Aspect": 8, 
     119    "DB_Object_Name": 9, 
     120    "DB_Object_Synonym": 10, 
     121    "DB_Object_Type": 11, 
     122    "taxon": 12, 
     123    "Date": 13, 
     124    "Assigned_by": 14 
     125} 
    118126 
    119127builtinOBOObjects = [""" 
     
    160168definition: Indicates that a term is the intersection of several others [OBO:defs]"""] 
    161169 
     170 
    162171class OBOObject(object): 
    163     """ Represents a generic OBO object (e.g. Term, Typedef, Instance, ...) 
     172    """Represents a generic OBO object (e.g. Term, Typedef, Instance, ...) 
    164173    Example: 
     174 
    165175    >>> OBOObject(r"[Term]\nid: FOO:001\nname: bar", ontology) 
     176 
    166177    """ 
    167178    _INTERN_TAGS = ["id", "name", "namespace", "alt_id", "is_a"] 
     179 
    168180    def __init__(self, stanza=None, ontology=None): 
    169181        self.ontology = ontology 
     
    203215        if "def" in self.__dict__: 
    204216            self.__dict__["def_"] = self.__dict__["def"] 
    205          
    206217 
    207218    def GetRelatedObjects(self): 
    208         """ Return a list of tuple pairs where the first element is relationship 
    209         typeId and the second id of object to whom the relationship applys to. 
    210         """ 
    211         ##TODO: add other defined Typedef ids 
     219        """Return a list of tuple pairs where the first element is relationship 
     220        typeId and the second id of object to whom the relationship applies to. 
     221 
     222        """ 
     223        # TODO: add other defined Typedef ids 
    212224        typeIds = [intern("is_a")] 
    213         result = [(typeId, id) for typeId in typeIds for id in self.values.get(typeId, [])]  
    214         result = result + [tuple(map(intern, r.split(None, 1))) for r in self.values.get("relationship", [])] 
     225        result = [(typeId, id) for typeId in typeIds 
     226                  for id in self.values.get(typeId, [])] 
     227        result = result + [tuple(map(intern, r.split(None, 1))) 
     228                           for r in self.values.get("relationship", [])] 
    215229        return result 
    216230 
     
    238252        for typeId, id in self.relatedTo: 
    239253            yield (typeId, self.ontology[id]) 
    240          
     254 
     255 
    241256class Term(OBOObject): 
    242257    pass 
    243258 
     259 
    244260class Typedef(OBOObject): 
    245261    pass 
    246262 
     263 
    247264class Instance(OBOObject): 
    248265    pass 
    249          
     266 
     267 
    250268class Ontology(object): 
    251269    """ Ontology is the main class representing a gene ontology. 
    252      
     270 
    253271    Example:: 
    254272        >>> ontology = Ontology("my_gene_ontology.obo") 
    255          
     273 
    256274    """ 
    257275    version = 1 
     276 
    258277    def __init__(self, file=None, progressCallback=None, rev=None): 
    259278        """ Initialize the ontology from file (if `None` the default gene 
    260279        ontology will be loaded). The optional `progressCallback` will be 
    261280        called with a single argument to report on the progress. 
    262          
     281 
    263282        """ 
    264283        self.terms = {} 
     
    266285        self.instances = {} 
    267286        self.slimsSubset = set() 
    268         if isinstance(file, basestring): 
     287 
     288        if file is not None: 
    269289            self.ParseFile(file, progressCallback) 
    270              
    271290        elif rev is not None: 
    272291            if not _CVS_REVISION_RE.match(rev): 
     
    274293            if rev.startswith("rev"): 
    275294                rev = rev[3:] 
    276             pc = lambda v: progressCallback(v/2.0) \ 
     295            pc = lambda v: progressCallback(v / 2.0) \ 
    277296                 if progressCallback else None 
    278             filename = os.path.join(default_database_path, "gene_ontology_edit@rev%s.obo" % rev) 
     297            filename = os.path.join(default_database_path, 
     298                                    "gene_ontology_edit@rev%s.obo" % rev) 
    279299            if not os.path.exists(filename): 
    280300                self.DownloadOntologyAtRev(rev, filename, pc) 
    281             self.ParseFile(filename, lambda v: progressCallback(v/2.0 + 50) \ 
     301            self.ParseFile(filename, lambda v: progressCallback(v / 2.0 + 50) \ 
    282302                                     if progressCallback else None) 
    283303        else: 
     304            # Load the default ontology file. 
    284305            fool = self.Load(progressCallback) 
    285             self.__dict__ = fool.__dict__ ## A fool and his attributes are soon parted 
     306            # A fool and his attributes are soon parted 
     307            self.__dict__ = fool.__dict__ 
    286308 
    287309    @classmethod 
     
    290312        default_database_path. It looks for a filename starting with 
    291313        'gene_ontology'. If not found it will download it. 
    292         """ 
    293         filename = os.path.join(default_database_path, "gene_ontology_edit.obo.tar.gz") 
     314 
     315        """ 
     316        filename = os.path.join(default_database_path, 
     317                                "gene_ontology_edit.obo.tar.gz") 
    294318        if not os.path.isfile(filename) and not os.path.isdir(filename): 
    295             from Orange.orng import orngServerFiles 
    296319            orngServerFiles.download("GO", "gene_ontology_edit.obo.tar.gz") 
    297         try: 
    298             return cls(filename, progressCallback=progressCallback) 
    299         except (IOError, OSError), ex: 
    300             print ex 
    301             raise Exception, "Could not locate ontology file" 
    302          
     320 
     321        return cls(filename, progressCallback=progressCallback) 
     322 
    303323    def ParseFile(self, file, progressCallback=None): 
    304324        """ Parse the file. file can be a filename string or an open filelike 
     
    306326        argument to report on the progress. 
    307327        """ 
    308         if type(file) == str: 
     328        if isinstance(file, basestring): 
    309329            if os.path.isfile(file) and tarfile.is_tarfile(file): 
    310330                f = tarfile.open(file).extractfile("gene_ontology_edit.obo") 
    311331            elif os.path.isfile(file): 
    312332                f = open(file) 
     333            elif os.path.isdir(file): 
     334                f = open(os.path.join(file, "gene_ontology_edit.obo")) 
    313335            else: 
    314                 f = open(os.path.join(file, "gene_ontology_edit.obo")) 
     336                raise ValueError("Cannot open %r for parsing" % file) 
    315337        else: 
    316338            f = file 
    317          
     339 
    318340        data = f.readlines() 
    319341        data = "".join([line for line in data if not line.startswith("!")]) 
    320342        self.header = data[: data.index("[Term]")] 
    321         c=re.compile("\[.+?\].*?\n\n", re.DOTALL) 
    322         data=c.findall(data) 
    323  
    324         from Orange.orng import orngMisc 
     343        c = re.compile("\[.+?\].*?\n\n", re.DOTALL) 
     344        data = c.findall(data) 
     345 
    325346        milestones = orngMisc.progressBarMilestones(len(data), 90) 
    326347        for i, block in enumerate(builtinOBOObjects + data): 
     
    335356                self.instances[instance.id] = instance 
    336357            if progressCallback and i in milestones: 
    337                 progressCallback(90.0*i/len(data)) 
    338          
     358                progressCallback(90.0 * i / len(data)) 
     359 
    339360        self.aliasMapper = {} 
    340361        self.reverseAliasMapper = defaultdict(set) 
     
    344365                self.terms[parent].relatedTo.add((typeId, id)) 
    345366            try: 
    346                 self.aliasMapper.update([(alt_id, id) for alt_id in term.alt_id]) 
     367                self.aliasMapper.update([(alt_id, id) 
     368                                         for alt_id in term.alt_id]) 
    347369                self.reverseAliasMapper[id].union_update(term.alt_id) 
    348370            except AttributeError: 
    349371                pass 
    350372            if progressCallback and i in milestones: 
    351                 progressCallback(90.0 + 10.0*i/len(self.terms)) 
     373                progressCallback(90.0 + 10.0 * i / len(self.terms)) 
    352374 
    353375    def GetDefinedSlimsSubsets(self): 
    354376        """ Return a list of defined subsets. 
    355377        """ 
    356         return [line.split()[1] for line in self.header.splitlines() if line.startswith("subsetdef:")] 
     378        return [line.split()[1] for line in self.header.splitlines() 
     379                if line.startswith("subsetdef:")] 
    357380 
    358381    def SetSlimsSubset(self, subset): 
     
    361384        """ 
    362385        if type(subset) == str: 
    363             self.slimsSubset = [id for id, term in self.terms.items() if subset in getattr(term, "subset", set())] 
     386            self.slimsSubset = [id for id, term in self.terms.items() 
     387                                if subset in getattr(term, "subset", set())] 
    364388        else: 
    365389            self.slimsSubset = set(subset) 
    366390 
    367391    def GetSlimsSubset(self, subset): 
    368         return [id for id, term in self.terms.items() if subset in getattr(term, "subset", set())] 
     392        return [id for id, term in self.terms.items() 
     393                if subset in getattr(term, "subset", set())] 
    369394 
    370395    def GetSlimTerms(self, termId): 
     
    380405                slims.add(term) 
    381406            else: 
    382                 queue.update(set(id for typeId, id in self[term].related) - visited) 
     407                queue.update(set(id for typeId, id in self[term].related) - 
     408                             visited) 
    383409        return slims 
    384410 
     
    392418            term = queue.pop() 
    393419            visited.add(term) 
    394             queue.update(set(id for typeId, id in self[term].related) - visited) 
     420            queue.update(set(id for typeId, id in self[term].related) - 
     421                         visited) 
    395422        return visited 
    396423 
     
    404431            term = queue.pop() 
    405432            visited.add(term) 
    406             queue.update(set(id for typeId, id in self[term].relatedTo) - visited) 
     433            queue.update(set(id for typeId, id in self[term].relatedTo) - 
     434                         visited) 
    407435        return visited 
    408436 
     
    412440        """ 
    413441        if term not in cache_: 
    414             cache_[term] = min([self.GetTermDepth(parent) + 1 for typeId, parent in self[term].related] or [1]) 
     442            cache_[term] = min([self.GetTermDepth(parent) + 1 
     443                                for typeId, parent in self[term].related] or 
     444                               [1]) 
    415445        return cache_[term] 
    416446 
    417447    def __getitem__(self, id): 
    418         """ Return object with id (same as ontology.terms[id] 
    419         """ 
    420         return self.terms.get(id, self.terms.get(self.aliasMapper.get(id, id))) 
     448        """ 
     449        Return a object with id. 
     450        """ 
     451        if id in self.terms: 
     452            return self.terms[id] 
     453        elif id in self.aliasMapper: 
     454            return self.terms[self.aliasMapper[id]] 
     455        else: 
     456            raise KeyError(id) 
    421457 
    422458    def __iter__(self): 
    423         """ Iterate over all ids in ontology 
     459        """ 
     460        Iterate over all ids in ontology. 
    424461        """ 
    425462        return iter(self.terms) 
    426463 
    427464    def __len__(self): 
    428         """ Return number of objects in ontology 
     465        """ 
     466        Return number of objects in ontology. 
    429467        """ 
    430468        return len(self.terms) 
    431469 
    432470    def __contains__(self, id): 
     471        """ 
     472        Return `True` if a term with `id` is present in the ontology. 
     473        """ 
    433474        return id in self.terms or id in self.aliasMapper 
    434475 
    435476    @staticmethod 
    436477    def DownloadOntology(file, progressCallback=None): 
    437         tFile = tarfile.open(file, "w:gz") if isinstance(file, basestring) else file 
     478        tFile = tarfile.open(file, "w:gz") if isinstance(file, basestring) \ 
     479                else file 
    438480        tmpDir = os.path.join(orngEnviron.bufferDir, "tmp_go/") 
    439481        try: 
     
    441483        except Exception: 
    442484            pass 
    443         urlretrieve("http://www.geneontology.org/ontology/gene_ontology_edit.obo",  
     485        urlretrieve("http://www.geneontology.org/ontology/gene_ontology_edit.obo", 
    444486                    os.path.join(tmpDir, "gene_ontology_edit.obo"), 
    445487                    progressCallback and __progressCallbackWrapper(progressCallback)) 
     
    451493    @staticmethod 
    452494    def DownloadOntologyAtRev(rev, filename=None, progressCallback=None): 
    453         import shutil 
    454         import urllib2 
    455495        url = "http://cvsweb.geneontology.org/cgi-bin/cvsweb.cgi/~checkout~/go/ontology/gene_ontology_edit.obo?rev=%s" % rev 
    456496        url += ";content-type=text%2Fplain" 
    457497        if filename is None: 
    458             filename = os.path.join(default_database_path, "gene_ontology_edit@rev%s.obo" % rev) 
     498            filename = os.path.join(default_database_path, 
     499                                    "gene_ontology_edit@rev%s.obo" % rev) 
    459500        r = urllib2.urlopen(url) 
    460          
     501 
    461502        with open(filename + ".part", "wb") as f: 
    462503            shutil.copyfileobj(r, f) 
    463              
     504 
    464505        os.rename(filename + ".part", filename) 
    465          
    466          
     506 
     507 
    467508_re_obj_name_ = re.compile("([a-zA-z0-9-_]+)") 
     509 
    468510 
    469511class AnnotationRecord(object): 
     
    477519    data members for quicker access: geneName, GOId, evidence, aspect and 
    478520    alias(a list of aliases) 
    479      
     521 
    480522    """ 
    481523    __slots__ = annotationFields + ["geneName", "GOId", "evidence", 
    482524                                    "aspect", "alias", "additionalAliases"] 
     525 
    483526    def __init__(self, fullText): 
    484527        """\ 
    485528        :param fulText: A single line from the annotation file. 
    486          
     529 
    487530        """ 
    488531        for slot, val in zip(annotationFields, fullText.split("\t")): 
     
    496539        self.additionalAliases = [] 
    497540        if ":" in self.DB_Object_Name: 
    498             self.additionalAliases = [] #_re_obj_name_.findall(self.DB_Object_Name.split(":")[0]) 
     541            self.additionalAliases = []  # _re_obj_name_.findall(self.DB_Object_Name.split(":")[0]) 
    499542 
    500543    def __getattr__(self, name): 
     
    509552    """ 
    510553    version = 2 
    511     def __init__(self, file=None, ontology=None, genematcher=None, progressCallback=None, rev=None): 
     554 
     555    def __init__(self, file=None, ontology=None, genematcher=None, 
     556                 progressCallback=None, rev=None): 
    512557        """Initialize the annotations from file by calling ParseFile on it. 
    513558        The ontology must be an instance of Ontology class. 
    514559        The optional progressCallback will be called with a single argument 
    515560        to report on the progress. 
    516          
    517         """ 
    518         self.file = file 
     561 
     562        """ 
    519563        self.ontology = ontology 
    520564        self.allAnnotations = defaultdict(list) 
     
    529573        self.genematcher = genematcher 
    530574        self.taxid = None 
     575 
    531576        if type(file) in [list, set, dict, Annotations]: 
    532577            for ann in file: 
    533578                self.AddAnnotation(ann) 
    534579            if type(file, Annotations): 
    535                 taxid = file.taxid 
     580                self.taxid = file.taxid 
     581 
    536582        elif isinstance(file, basestring) and os.path.exists(file): 
    537583            self.ParseFile(file, progressCallback) 
     
    540586            except IOError: 
    541587                pass 
    542         elif file is not None: 
    543             # Organism code 
     588 
     589        elif isinstance(file, basestring): 
     590            # Assuming organism code/name 
    544591            if rev is not None: 
    545592                if not _CVS_REVISION_RE.match(rev): 
    546593                    raise ValueError("Invalid revision format") 
    547                  
     594 
    548595                if rev.startswith("rev"): 
    549596                    rev = rev[3:] 
    550597                code = self.organism_name_search(file) 
    551598                filename = os.path.join(default_database_path, 
    552                                         "gene_association.%s@rev%s.tar.gz" % (code, rev)) 
    553                  
     599                                        "gene_association.%s@rev%s.tar.gz" % 
     600                                        (code, rev)) 
     601 
    554602                if not os.path.exists(filename): 
    555                     self.DownloadAnnotationsAtRev(code, rev, filename, 
    556                                                   progressCallback 
    557                                                   ) 
    558                      
     603                    self.DownloadAnnotationsAtRev( 
     604                        code, rev, filename, progressCallback) 
     605 
    559606                self.ParseFile(filename, progressCallback) 
    560607                self.taxid = to_taxid(code).pop() 
     
    563610                self.__dict__ = a.__dict__ 
    564611                self.taxid = to_taxid(organism_name_search(file)).pop() 
     612        elif file is not None: 
     613            self.ParseFile(file, progressCallback) 
     614 
    565615        if not self.genematcher and self.taxid: 
    566             from . import obiGene 
    567             self.genematcher = obiGene.matcher([obiGene.GMGO(self.taxid)] + \ 
    568                                                ([obiGene.GMDicty(), [obiGene.GMGO(self.taxid), 
    569                                                                      obiGene.GMDicty()]] \ 
    570                                                 if self.taxid == "352472"  else [])) 
     616            matchers = [obiGene.GMGO(self.taxid)] 
     617            if self.taxid == "352472": 
     618                matchers.extend( 
     619                    [obiGene.GMDicty(), 
     620                     [obiGene.GMGO(self.taxid), obiGene.GMDicty()]] 
     621                ) 
     622 
     623            self.genematcher = obiGene.matcher(matchers) 
     624 
    571625        if self.genematcher: 
    572626            self.genematcher.set_targets(self.geneNames) 
    573          
     627 
    574628    @classmethod 
    575629    def organism_name_search(cls, org): 
    576         ids = to_taxid(org)  
     630        ids = to_taxid(org) 
    577631        from . import obiTaxonomy as tax 
    578632        if not ids: 
    579             ids = [org] if org in Taxonomy().common_org_map.keys() + Taxonomy().code_map.keys() else [] 
     633            ids = [org] if org in Taxonomy().common_org_map.keys() + \ 
     634                  Taxonomy().code_map.keys() else [] 
    580635        if not ids: 
    581636            ids = tax.to_taxid(org, mapTo=Taxonomy().keys()) 
     
    588643        codes = set([from_taxid(id) for id in ids]) 
    589644        if len(codes) > 1: 
    590             raise tax.MultipleSpeciesException, ", ".join(["%s: %s" % \ 
    591                             (str(from_taxid(id)), tax.name(id)) for id in ids]) 
     645            raise tax.MultipleSpeciesException( 
     646                ", ".join(["%s: %s" % (str(from_taxid(id)), tax.name(id)) 
     647                           for id in ids])) 
    592648        elif len(codes) == 0: 
    593             raise tax.UnknownSpeciesIdentifier, org 
     649            raise tax.UnknownSpeciesIdentifier(org) 
    594650        return codes.pop() 
    595651 
     
    597653    def organism_version(cls, name): 
    598654        name = organism_name_search(name) 
    599         orngServerFiles.localpath_download("GO", "gene_association.%s.tar.gz" % name) 
     655        orngServerFiles.localpath_download( 
     656            "GO", "gene_association.%s.tar.gz" % name) 
    600657        return ("v%i." % cls.version) + orngServerFiles.info("GO", 
    601658                        "gene_association.%s.tar.gz" % name)["datetime"] 
     
    612669    ontology = property(GetOntology, SetOntology, 
    613670                        doc="Ontology object for annotations") 
    614      
     671 
    615672    @classmethod 
    616673    def Load(cls, org, ontology=None, genematcher=None, progressCallback=None): 
     
    618675        given organism from default_database_path. 
    619676        """ 
    620         from Orange.orng import orngServerFiles 
    621677        code = organism_name_search(org) 
    622          
     678 
    623679        file = "gene_association.%s.tar.gz" % code 
    624680 
     
    633689            orngServerFiles.download("GO", file) 
    634690 
    635         return cls(path, ontology=ontology, genematcher=genematcher, progressCallback=progressCallback) 
    636      
     691        return cls(path, ontology=ontology, genematcher=genematcher, 
     692                   progressCallback=progressCallback) 
     693 
    637694    def ParseFile(self, file, progressCallback=None): 
    638695        """ Parse and load the annotations from file. Report progress 
     
    644701            - an open file-like object of the association file 
    645702        """ 
    646         if type(file) == str: 
     703        if isinstance(file, basestring): 
    647704            if os.path.isfile(file) and tarfile.is_tarfile(file): 
    648705                f = tarfile.open(file).extractfile("gene_association") 
    649706            elif os.path.isfile(file) and file.endswith(".gz"): 
    650                 f = gzip.open(file)  
     707                f = gzip.open(file) 
    651708            elif os.path.isfile(file): 
    652709                f = open(file) 
     710            elif os.path.isdir(file): 
     711                f = open(os.path.join(file, "gene_association")) 
    653712            else: 
    654                 f = open(os.path.join(file, "gene_association")) 
     713                raise ValueError("Cannot open %r for parsing." % file) 
    655714        else: 
    656715            f = file 
    657716        lines = [line for line in f.read().splitlines() if line.strip()] 
    658         from Orange.orng import orngMisc 
     717 
    659718        milestones = orngMisc.progressBarMilestones(len(lines), 100) 
    660         for i,line in enumerate(lines): 
     719        for i, line in enumerate(lines): 
    661720            if line.startswith("!"): 
    662721                self.header = self.header + line + "\n" 
    663722                continue 
    664              
    665             a=AnnotationRecord(line) 
     723 
     724            a = AnnotationRecord(line) 
    666725            self.AddAnnotation(a) 
    667726#            self.annotations.append(a) 
    668727            if progressCallback and i in milestones: 
    669                 progressCallback(100.0*i/len(lines)) 
     728                progressCallback(100.0 * i / len(lines)) 
    670729 
    671730    def AddAnnotation(self, a): 
     
    677736        if not a.geneName or not a.GOId or a.Qualifier == "NOT": 
    678737            return 
    679          
     738 
    680739        self.geneAnnotations[a.geneName].append(a) 
    681740        self.annotations.append(a) 
    682741        self.termAnnotations[a.GOId].append(a) 
    683742        self.allAnnotations = defaultdict(list) 
    684          
     743 
    685744        self._geneNames = None 
    686745        self._geneNamesDict = None 
     
    706765            self._aliasMapper = {} 
    707766            for ann in self.annotations: 
    708                 self._aliasMapper.update([(alias, ann.geneName) for alias in ann.alias + \ 
    709                                           [ann.geneName, ann.DB_Object_ID]]) 
     767                self._aliasMapper.update([(alias, ann.geneName) 
     768                                          for alias in ann.alias + 
     769                                           [ann.geneName, ann.DB_Object_ID]]) 
    710770        return self._aliasMapper 
    711771 
     
    713773        """ Return a dictionary mapping canonical names (DB_Object_Symbol) 
    714774        to `genes`. 
    715           
     775 
    716776        """ 
    717777        def alias(gene): 
     
    722782                        self.aliasMapper.get(gene, 
    723783                             self.additionalAliases.get(gene, None)) 
    724                          
     784 
    725785        return dict([(alias(gene), gene) for gene in genes if alias(gene)]) 
    726786 
     
    730790        if id not in self.allAnnotations and id not in visited: 
    731791            if id in self.ontology.reverseAliasMapper: 
    732                 annotations = [self.termAnnotations.get(alt_id, []) \ 
    733                                for alt_id in self.ontology.reverseAliasMapper[id]] + \ 
    734                                              [self.termAnnotations[id]] 
     792                annotations = [self.termAnnotations.get(alt_id, []) 
     793                               for alt_id in 
     794                               self.ontology.reverseAliasMapper[id]] + \ 
     795                              [self.termAnnotations[id]] 
    735796            else: 
    736797                ## annotations for this term alone 
    737                 annotations = [self.termAnnotations[id]]  
     798                annotations = [self.termAnnotations[id]] 
    738799            visited.add(id) 
    739800            for typeId, child in self.ontology[id].relatedTo: 
     
    750811        """ Return a set of all annotations (instances if `AnnotationRectord`) 
    751812        for GO term `id` and all it's subterms. 
    752          
     813 
    753814        :param id: GO term id 
    754815        :type id: str 
    755          
     816 
    756817        """ 
    757818        visited = set() 
    758819        id = self.ontology.aliasMapper.get(id, id) 
    759         if id not in self.allAnnotations or type(self.allAnnotations[id]) == list: 
     820        if id not in self.allAnnotations or \ 
     821                type(self.allAnnotations[id]) == list: 
    760822            annot_set = set() 
    761823            for annots in self._CollectAnnotations(id, set()): 
     
    764826        return self.allAnnotations[id] 
    765827 
    766     def GetAllGenes(self, id, evidenceCodes = None): 
     828    def GetAllGenes(self, id, evidenceCodes=None): 
    767829        """ Return a list of genes annotated by specified `evidenceCodes` 
    768830        to GO term 'id' and all it's subterms." 
    769          
     831 
    770832        :param id: GO term id 
    771833        :type id: str 
    772          
     834 
    773835        :param evidneceCodes: List of evidence codes to consider when 
    774836                              matching annotations to terms. 
     
    777839        evidenceCodes = set(evidenceCodes or evidenceDict.keys()) 
    778840        annotations = self.GetAllAnnotations(id) 
    779         return list(set([ann.geneName for ann in annotations if ann.Evidence_Code in evidenceCodes])) 
    780  
    781     def GetEnrichedTerms(self, genes, reference=None, evidenceCodes=None,  
     841        return list(set([ann.geneName for ann in annotations 
     842                         if ann.Evidence_Code in evidenceCodes])) 
     843 
     844    def GetEnrichedTerms(self, genes, reference=None, evidenceCodes=None, 
    782845                         slimsOnly=False, aspect=None, prob=obiProb.Binomial(), 
    783846                         useFDR=True, progressCallback=None): 
     
    785848        (list_of_genes, p_value, reference_count) for items and term 
    786849        ids as keys. P-Values are FDR adjusted if useFDR is True (default). 
    787          
     850 
    788851        :param genes: List of genes 
    789852        :param reference: list of genes (if None all genes included in the 
     
    804867        if aspect == None: 
    805868            aspects_set = set(["P", "C", "F"]) 
     869        elif isinstance(aspect, basestring): 
     870            aspects_set = set([aspect]) 
    806871        else: 
    807             aspects_set = set([aspect]) if isinstance(aspect, basestring) else aspect 
     872            aspects_set = aspect 
    808873 
    809874        evidenceCodes = set(evidenceCodes or evidenceDict.keys()) 
    810         annotations = [ann for gene in genes for ann in self.geneAnnotations[gene] \ 
    811                        if ann.Evidence_Code in evidenceCodes and ann.Aspect in aspects_set] 
    812         refAnnotations = set([ann for gene in reference for ann in self.geneAnnotations[gene] \ 
    813                               if ann.Evidence_Code in evidenceCodes and ann.Aspect in aspects_set]) 
     875        annotations = [ann 
     876                       for gene in genes for ann in self.geneAnnotations[gene] 
     877                       if ann.Evidence_Code in evidenceCodes and 
     878                       ann.Aspect in aspects_set] 
     879 
     880        refAnnotations = set( 
     881            [ann 
     882             for gene in reference for ann in self.geneAnnotations[gene] 
     883             if ann.Evidence_Code in evidenceCodes and 
     884             ann.Aspect in aspects_set] 
     885        ) 
     886 
    814887        annotationsDict = defaultdict(set) 
    815888        for ann in annotations: 
    816889            annotationsDict[ann.GO_ID].add(ann) 
    817              
     890 
    818891        if slimsOnly and not self.ontology.slimsSubset: 
    819             import warnings 
    820             warnings.warn("Unspecified slims subset in the ontology! Using 'goslim_generic' subset", UserWarning) 
     892            warnings.warn("Unspecified slims subset in the ontology! " 
     893                          "Using 'goslim_generic' subset", UserWarning) 
    821894            self.ontology.SetSlimsSubset("goslim_generic") 
    822              
    823         terms = self.ontology.ExtractSuperGraph(annotationsDict.keys()) 
     895 
     896        terms = annotationsDict.keys() 
     897        filteredTerms = [term for term in terms if term in self.ontology] 
     898 
     899        if len(terms) != len(filteredTerms): 
     900            termDiff = set(terms) - set(filteredTerms) 
     901            warnings.warn("%s terms in the annotations were not found in the " 
     902                          "ontology." % ",".join(map(repr, termDiff)), 
     903                          UserWarning) 
     904 
     905        terms = self.ontology.ExtractSuperGraph(filteredTerms) 
    824906        res = {} 
    825         from Orange.orng import orngMisc 
     907 
    826908        milestones = orngMisc.progressBarMilestones(len(terms), 100) 
    827909        for i, term in enumerate(terms): 
     
    847929                progressCallback(100.0 * i / len(terms)) 
    848930        if useFDR: 
    849             res = sorted(res.items(), key = lambda (_1, (_2, p, _3)): p) 
    850             res = dict([(id, (genes, p, ref)) \ 
    851                         for (id, (genes, _, ref)), p in zip(res, obiProb.FDR([p for _, (_, p, _) in res]))]) 
     931            res = sorted(res.items(), key=lambda (_1, (_2, p, _3)): p) 
     932            res = dict([(id, (genes, p, ref)) 
     933                        for (id, (genes, _, ref)), p in 
     934                        zip(res, obiProb.FDR([p for _, (_, p, _) in res]))]) 
    852935        return res 
    853936 
    854     def GetAnnotatedTerms(self, genes, directAnnotationOnly=False, evidenceCodes=None, progressCallback=None): 
     937    def GetAnnotatedTerms(self, genes, directAnnotationOnly=False, 
     938                          evidenceCodes=None, progressCallback=None): 
    855939        """ Return all terms that are annotated by genes with evidenceCodes. 
    856940        """ 
     
    859943        genes = set(revGenesDict.keys()) 
    860944        evidenceCodes = set(evidenceCodes or evidenceDict.keys()) 
    861         annotations = [ann for gene in genes for ann in self.geneAnnotations[gene] \ 
     945        annotations = [ann for gene in genes for ann in self.geneAnnotations[gene] 
    862946                       if ann.Evidence_Code in evidenceCodes] 
    863947        dd = defaultdict(set) 
     
    865949            dd[ann.GO_ID].add(revGenesDict.get(ann.geneName, ann.geneName)) 
    866950        if not directAnnotationOnly: 
    867             terms = self.ontology.ExtractSuperGraph(dd.keys()) 
     951            terms = dd.keys() 
     952            filteredTerms = [term for term in terms if term in self.ontology] 
     953            if len(terms) != len(filteredTerms): 
     954                termDiff = set(terms) - set(filteredTerms) 
     955                warnings.warn( 
     956                    "%s terms in the annotations were not found in the " 
     957                    "ontology." % ",".join(map(repr, termDiff)), 
     958                    UserWarning) 
     959 
     960            terms = self.ontology.ExtractSuperGraph(filteredTerms) 
    868961            for i, term in enumerate(terms): 
    869962                termAnnots = self.GetAllAnnotations(term).intersection(annotations) 
    870963##                termAnnots.intersection_update(annotations) 
    871                 dd[term].update([revGenesDict.get(ann.geneName, ann.geneName) for ann in termAnnots]) 
     964                dd[term].update([revGenesDict.get(ann.geneName, ann.geneName) 
     965                                 for ann in termAnnots]) 
    872966        return dict(dd) 
    873967 
    874     def DrawEnrichmentGraph(self, terms, clusterSize, refSize=None, file="graph.png", width=None, height=None, precison=3): 
     968    def DrawEnrichmentGraph(self, terms, clusterSize, refSize=None, 
     969                            file="graph.png", width=None, height=None, 
     970                            precison=3): 
    875971        refSize = len(self.geneNames) if refSize == None else refSize 
    876         sortedterms = sorted(terms.items(), key=lambda term:term[1][1]) 
    877         fdr = dict(zip([t[0] for t in sortedterms], obiProb.FDR([t[1][1] for t in sortedterms]))) 
    878         termsList = [(term, (float(len(terms[term][0]))/clusterSize) / (float(terms[term][2])/refSize), 
    879                       len(terms[term][0]), terms[term][2], terms[term][1], 
    880                       fdr[term], terms[term][0]) for term in terms] 
    881                            
    882         drawEnrichmentGraph(termsList, file, width, height, ontology=self.ontology, precison=precison) 
     972        sortedterms = sorted(terms.items(), key=lambda term: term[1][1]) 
     973        fdr = dict(zip([t[0] for t in sortedterms], 
     974                       obiProb.FDR([t[1][1] for t in sortedterms]))) 
     975        termsList = [(term, 
     976                      ((float(len(terms[term][0])) / clusterSize) / 
     977                       (float(terms[term][2]) / refSize)), 
     978                      len(terms[term][0]), 
     979                      terms[term][2], 
     980                      terms[term][1], 
     981                      fdr[term], 
     982                      terms[term][0]) 
     983                     for term in terms] 
     984 
     985        drawEnrichmentGraph(termsList, file, width, height, 
     986                            ontology=self.ontology, precison=precison) 
    883987 
    884988    def __add__(self, iterable): 
    885989        """ Return a new Annotations object with combined annotations 
    886990        """ 
    887         return Annotations([a for a in self] + [a for a in iterable], ontology=self.ontology) 
     991        return Annotations([a for a in self] + [a for a in iterable], 
     992                           ontology=self.ontology) 
    888993 
    889994    def __iadd__(self, iterable): 
     
    8951000    def __contains__(self, item): 
    8961001        return item in self.annotations 
    897              
     1002 
    8981003    def __iter__(self): 
    8991004        """ Iterate over all AnnotationRecord objects in annotations 
     
    9311036 
    9321037    def RemapGenes(self, map): 
    933         """  
    934         """ 
    935         from copy import copy 
     1038        """ 
     1039        """ 
    9361040        for gene in map: 
    9371041            annotations = self.geneAnnotations[gene] 
    9381042            for ann in annotations: 
    9391043                for name in map[gene]: 
    940                     ann1 = copy(ann) 
     1044                    ann1 = copy.copy(ann) 
    9411045                    ann1.geneName = name 
    9421046                    self.add(ann1) 
     
    9471051            pass 
    9481052        self.genematcher.set_targets(self.geneNames) 
    949      
     1053 
    9501054    @staticmethod 
    9511055    def DownloadAnnotations(org, file, progressCallback=None): 
    952         tFile = tarfile.open(file, "w:gz") if type(file) == str else file 
     1056        if isinstance(file, basestring): 
     1057            tFile = tarfile.open(file, "w:gz") 
     1058        else: 
     1059            tFile = file 
     1060 
    9531061        tmpDir = os.path.join(orngEnviron.bufferDir, "tmp_go/") 
    9541062        try: 
     
    9571065            pass 
    9581066        fileName = "gene_association." + org + ".gz" 
    959         urlretrieve("http://www.geneontology.org/gene-associations/" + fileName, 
     1067        urlretrieve(("http://www.geneontology.org/gene-associations/" + 
     1068                     fileName), 
    9601069                    os.path.join(tmpDir, fileName), 
    961                     progressCallback and __progressCallbackWraper(progressCallback)) 
     1070                    progressCallback and __progressCallbackWrapper(progressCallback)) 
    9621071        gzFile = GzipFile(os.path.join(tmpDir, fileName), "r") 
    9631072        file = open(os.path.join(tmpDir, "gene_association." + org), "w") 
     
    9651074        file.flush() 
    9661075        file.close() 
    967 ##        tFile = tarfile.open(os.path.join(tmpDir, "gene_association." + org + ".tar.gz"), "w:gz") 
    968         tFile.add(os.path.join(tmpDir, "gene_association." + org), "gene_association") 
     1076 
     1077        tFile.add(os.path.join(tmpDir, "gene_association." + org), 
     1078                  "gene_association") 
    9691079        annotation = Annotations(os.path.join(tmpDir, "gene_association." + org), 
    9701080                    genematcher=obiGene.GMDirect(), progressCallback=progressCallback) 
     
    9741084        os.remove(os.path.join(tmpDir, "gene_association." + org)) 
    9751085        os.remove(os.path.join(tmpDir, "gene_names.pickle")) 
    976          
     1086 
    9771087    @staticmethod 
    978     def DownloadAnnotationsAtRev(org, rev, filename=None, progressCallback=None): 
    979         import urllib2 
    980         import shutil 
     1088    def DownloadAnnotationsAtRev(org, rev, filename=None, 
     1089                                 progressCallback=None): 
    9811090        if filename is None: 
    9821091            filename = os.path.join(default_database_path, 
    983                                     "gene_association.%s@rev%s.tar.gz" % (code, rev)) 
    984         url = "http://cvsweb.geneontology.org/cgi-bin/cvsweb.cgi/~checkout~/go/gene-associations/gene_association.%s.gz?rev=%s" % (org, rev) 
     1092                                    "gene_association.%s@rev%s.tar.gz" % 
     1093                                    (code, rev)) 
     1094        url = ("http://cvsweb.geneontology.org/cgi-bin/cvsweb.cgi/~checkout~/go/gene-associations/gene_association.%s.gz?rev=%s" % 
     1095               (org, rev)) 
    9851096        url += ";content-type=application%2Fx-gzip" 
    9861097        r = urllib2.urlopen(url) 
    987          
     1098 
    9881099        with open(filename + ".part", "wb") as f: 
    9891100            shutil.copyfileobj(r, f) 
    990          
     1101 
    9911102        os.rename(filename + ".part", filename) 
    9921103 
    9931104from .obiTaxonomy import pickled_cache 
    9941105 
    995 @pickled_cache(None, [("GO", "taxonomy.pickle"), ("Taxonomy", "ncbi_taxonomy.tar.gz")]) 
     1106 
     1107@pickled_cache(None, [("GO", "taxonomy.pickle"), 
     1108                      ("Taxonomy", "ncbi_taxonomy.tar.gz")]) 
    9961109def organism_name_search(name): 
    9971110    return Annotations.organism_name_search(name) 
     1111 
    9981112 
    9991113def filterByPValue(terms, maxPValue=0.1): 
    10001114    """ Filters the terms by the p-value. Asumes terms is a dict with 
    10011115    the same structure as returned from GetEnrichedTerms. 
    1002      
     1116 
    10031117    """ 
    1004     return dict(filter(lambda (k,e): e[1]<=maxPValue, terms.items())) 
     1118    return dict(filter(lambda (k, e): e[1] <= maxPValue, terms.items())) 
     1119 
    10051120 
    10061121def filterByFrequency(terms, minF=2): 
    10071122    """ Filters the terms by the cluster frequency. Asumes terms is 
    10081123    a dict with the same structure as returned from GetEnrichedTerms. 
    1009      
     1124 
    10101125    """ 
    1011     return dict(filter(lambda (k,e): len(e[0])>=minF, terms.items())) 
     1126    return dict(filter(lambda (k, e): len(e[0]) >= minF, terms.items())) 
     1127 
    10121128 
    10131129def filterByRefFrequency(terms, minF=4): 
    10141130    """ Filters the terms by the reference frequency. Asumes terms is 
    10151131    a dict with the same structure as returned from GetEnrichedTerms. 
    1016      
     1132 
    10171133    """ 
    1018     return dict(filter(lambda (k,e): e[2]>=minF, terms.items())) 
    1019  
    1020 ##def drawEnrichmentGraph(termsList, clusterSize, refSize, filename="graph.png", width=None, height=None): 
    1021 ##    if type(termsList) == dict: 
    1022 ##        termsList = [(term, (float(len(termsList[term][0]))/clusterSize) / (float(termsList[term][2])/refSize), 
    1023 ##                      len(termsList[term][0]), termsList[term][2], termsList[term][1], 1.0, termsList[term][0]) for term in termsList] 
    1024 ##                      
    1025 ##                      
    1026 ##                              
    1027 ##    drawEnrichmentGraph_tostreamMk2(termsList, open(filename, "wb"), width, height) 
    1028  
    1029 def drawEnrichmentGraph_tostream(GOTerms, clusterSize, refSize, fh, width=None, height=None): 
    1030     def getParents(term): 
    1031         parents = extractGODAG([term]) 
    1032         parents = filter(lambda t: t.id in GOTerms and t.id!=term, parents) 
    1033         c = [] 
    1034         map(c.extend, [getParents(t.id) for t in parents]) 
    1035         parents = filter(lambda t: t not in c, parents) 
    1036         return parents 
    1037     parents = dict([(term, getParents(term)) for term in GOTerms]) 
    1038     #print "Parentes", parents 
    1039     def getChildren(term): 
    1040         return filter(lambda t: term in [p.id for p in parents[t]], GOTerms.keys()) 
    1041     topLevelTerms = filter(lambda t: not parents[t], parents.keys()) 
    1042     #print "Top level terms", topLevelTerms 
    1043     termsList=[] 
    1044     def collect(term, parent): 
    1045         termsList.append( 
    1046             ((float(len(GOTerms[term][0]))/clusterSize) / (float(GOTerms[term][2])/refSize), 
    1047             len(GOTerms[term][0]), 
    1048             GOTerms[term][2], 
    1049             "%.4f" % GOTerms[term][1], 
    1050             loadedGO.termDict[term].name, 
    1051             loadedGO.termDict[term].id, 
    1052             ", ".join(GOTerms[term][0]), 
    1053             parent) 
    1054             ) 
    1055 ##        print float(len(GOTerms[term][0])), float(GOTerms[term][2]), clusterSize, refSize 
    1056         parent = len(termsList)-1 
    1057         for c in getChildren(term): 
    1058             collect(c, parent) 
    1059                           
    1060     for topTerm in topLevelTerms: 
    1061         collect(topTerm, None) 
    1062  
    1063     drawEnrichmentGraphPIL_tostream(termsList, fh, width, height) 
    1064  
    1065 def drawEnrichmentGraph(enriched, file="graph.png", width=None, height=None, header=None, ontology = None, precison=3): 
     1134    return dict(filter(lambda (k, e): e[2] >= minF, terms.items())) 
     1135 
     1136 
     1137def drawEnrichmentGraph(enriched, file="graph.png", width=None, height=None, 
     1138                        header=None, ontology=None, precison=3): 
    10661139    file = open(file, "wb") if type(file) == str else file 
    1067     drawEnrichmentGraph_tostreamMk2(enriched, file,  width, height, header, ontology, precison) 
    1068      
    1069 def drawEnrichmentGraph_tostreamMk2(enriched, fh, width, height, header=None, ontology = None, precison=4): 
     1140    drawEnrichmentGraph_tostreamMk2(enriched, file, width, height, header, 
     1141                                    ontology, precison) 
     1142 
     1143 
     1144def drawEnrichmentGraph_tostreamMk2(enriched, fh, width, height, header=None, 
     1145                                    ontology=None, precison=4): 
    10701146    ontology = ontology if ontology else Ontology() 
    1071     header = header if header else ["List", "Total", "p-value", "FDR", "Names", "Genes"] 
     1147    header = header if header else ["List", "Total", "p-value", "FDR", 
     1148                                    "Names", "Genes"] 
    10721149    GOTerms = dict([(t[0], t) for t in enriched if t[0] in ontology]) 
     1150 
    10731151    def getParents(term): 
    10741152        parents = ontology.ExtractSuperGraph([term]) 
    10751153        parents = [id for id in parents if id in GOTerms and id != term] 
    1076         c = reduce(set.union, [set(ontology.ExtractSuperGraph([id])) - set([id]) for id in parents], set()) 
     1154        c = reduce(set.union, [set(ontology.ExtractSuperGraph([id])) - 
     1155                               set([id]) for id in parents], set()) 
    10771156        parents = [t for t in parents if t not in c] 
    10781157        return parents 
    10791158    parents = dict([(term, getParents(term)) for term in GOTerms]) 
    1080     #print "Parentes", parents 
     1159    # print "Parentes", parents 
     1160 
    10811161    def getChildren(term): 
    10821162        return [id for id in GOTerms if term in parents[id]] 
    10831163    topLevelTerms = [id for id in parents if not parents[id]] 
    1084     #print "Top level terms", topLevelTerms 
    1085     termsList=[] 
     1164    # print "Top level terms", topLevelTerms 
     1165    termsList = [] 
    10861166    fmt = "%" + ".%if" % precison 
     1167 
    10871168    def collect(term, parent): 
    1088 ##        termsList.append( 
    1089 ##            ((float(len(GOTerms[term][0]))/clusterSize) / (float(GOTerms[term][2])/refSize), 
    1090 ##            len(GOTerms[term][0]), 
    1091 ##            GOTerms[term][2], 
    1092 ##            "%.4f" % GOTerms[term][1], 
    1093 ##            loadedGO.termDict[term].name, 
    1094 ##            loadedGO.termDict[term].id, 
    1095 ##            ", ".join(GOTerms[term][0]), 
    1096 ##            parent) 
    1097 ##            ) 
    10981169        termsList.append(GOTerms[term][1:4] + \ 
    10991170                         (fmt % GOTerms[term][4], 
     
    11011172                          ontology[term].name, 
    11021173                          ", ".join(GOTerms[term][6])) + (parent,)) 
    1103 ##        print float(len(GOTerms[term][0])), float(GOTerms[term][2]), clusterSize, refSize 
    1104         parent = len(termsList)-1 
     1174        parent = len(termsList) - 1 
    11051175        for c in getChildren(term): 
    11061176            collect(c, parent) 
    1107                           
     1177 
    11081178    for topTerm in topLevelTerms: 
    11091179        collect(topTerm, None) 
     
    11171187 
    11181188    drawEnrichmentGraphPIL_tostream(termsList, header, fh, width, height) 
    1119 ##    drawEnrichmentGraphPylab_tostream(termsList, header, fh, width, height) 
    1120      
     1189 
     1190 
    11211191def drawEnrichmentGraphPIL_tostream(termsList, headers, fh, width=None, height=None): 
    11221192    from PIL import Image, ImageDraw, ImageFont 
     
    11241194    textColor = (0, 0, 0) 
    11251195    graphColor = (0, 0, 255) 
    1126     fontSize = height==None and 12 or (height-60)/len(termsList) 
     1196    fontSize = height == None and 12 or (height - 60) / len(termsList) 
    11271197    font = ImageFont.load_default() 
    11281198    try: 
     
    11321202    getMaxTextHeightHint = lambda l: max([font.getsize(t)[1] for t in l]) 
    11331203    getMaxTextWidthHint = lambda l: max([font.getsize(t)[0] for t in l]) 
    1134     maxFoldWidth = width!=None and min(150, width/6) or 150 
     1204    maxFoldWidth = width != None and min(150, width / 6) or 150 
    11351205    maxFoldEnrichment = max([t[0] for t in termsList]) 
    1136     foldNormalizationFactor = float(maxFoldWidth)/maxFoldEnrichment 
    1137     foldWidths = [int(foldNormalizationFactor*term[0]) for term in termsList] 
     1206    foldNormalizationFactor = float(maxFoldWidth) / maxFoldEnrichment 
     1207    foldWidths = [int(foldNormalizationFactor * term[0]) for term in termsList] 
    11381208    treeStep = 10 
    11391209    treeWidth = {} 
    11401210    for i, term in enumerate(termsList): 
    1141         treeWidth[i] = (term[-1]==None and 1 or treeWidth[term[-1]]+1) 
    1142     treeStep = width!=None and min(treeStep, width/(6*max(treeWidth.values())) or 2) or treeStep 
    1143     treeWidth = [w*treeStep + foldWidths[i] for i, w in treeWidth.items()] 
     1211        treeWidth[i] = (term[-1] == None and 1 or treeWidth[term[-1]] + 1) 
     1212    treeStep = width != None and min(treeStep, width / (6 * max(treeWidth.values())) or 2) or treeStep 
     1213    treeWidth = [w * treeStep + foldWidths[i] for i, w in treeWidth.items()] 
    11441214    treeWidth = max(treeWidth) - maxFoldWidth 
    11451215    verticalMargin = 10 
     
    11481218##    treeWidth = 100 
    11491219    firstColumnStart = verticalMargin + maxFoldWidth + treeWidth + 10 
    1150     secondColumnStart = firstColumnStart + getMaxTextWidthHint([str(t[1]) for t in termsList]+[headers[0]]) + 2 
    1151     thirdColumnStart = secondColumnStart + getMaxTextWidthHint([str(t[2]) for t in termsList]+[headers[1]]) + 2 
    1152     fourthColumnStart = thirdColumnStart + getMaxTextWidthHint([str(t[3]) for t in termsList]+[headers[2]]) + 2 
    1153     fifthColumnStart = fourthColumnStart + getMaxTextWidthHint([str(t[4]) for t in termsList]+[headers[3]]) + 4 
     1220    secondColumnStart = firstColumnStart + getMaxTextWidthHint([str(t[1]) for t in termsList] + [headers[0]]) + 2 
     1221    thirdColumnStart = secondColumnStart + getMaxTextWidthHint([str(t[2]) for t in termsList] + [headers[1]]) + 2 
     1222    fourthColumnStart = thirdColumnStart + getMaxTextWidthHint([str(t[3]) for t in termsList] + [headers[2]]) + 2 
     1223    fifthColumnStart = fourthColumnStart + getMaxTextWidthHint([str(t[4]) for t in termsList] + [headers[3]]) + 4 
    11541224##    maxAnnotationTextWidth = width==None and getMaxTextWidthHint([str(t[4]) for t in termsList]+["Annotation"]) or (width - fourthColumnStart - verticalMargin) * 2 / 3 
    1155     maxAnnotationTextWidth = width==None and getMaxTextWidthHint([str(t[5]) for t in termsList]+[headers[4]]) or max((width - fifthColumnStart - verticalMargin) * 2 / 3, getMaxTextWidthHint([t[5] for t in termsList]+[headers[4]])) 
    1156     sixthColumnStart  = fifthColumnStart + maxAnnotationTextWidth + 4 
    1157     maxGenesTextWidth = width==None and getMaxTextWidthHint([str(t[6]) for t in termsList]+[headers[5]]) or (width - fifthColumnStart - verticalMargin) / 3 
    1158      
    1159     legendHeight = font.getsize("1234567890")[1]*2 
     1225    maxAnnotationTextWidth = width == None and getMaxTextWidthHint([str(t[5]) for t in termsList] + [headers[4]]) or max((width - fifthColumnStart - verticalMargin) * 2 / 3, getMaxTextWidthHint([t[5] for t in termsList] + [headers[4]])) 
     1226    sixthColumnStart = fifthColumnStart + maxAnnotationTextWidth + 4 
     1227    maxGenesTextWidth = width == None and getMaxTextWidthHint([str(t[6]) for t in termsList] + [headers[5]]) or (width - fifthColumnStart - verticalMargin) / 3 
     1228 
     1229    legendHeight = font.getsize("1234567890")[1] * 2 
    11601230    termHeight = font.getsize("A")[1] 
    11611231##    print fourthColumnStart, maxAnnotationTextWidth, verticalMargin 
    11621232    width = sixthColumnStart + maxGenesTextWidth + verticalMargin 
    1163     height = len(termsList)*termHeight+2*(legendHeight+horizontalMargin) 
     1233    height = len(termsList) * termHeight + 2 * (legendHeight + horizontalMargin) 
    11641234 
    11651235    image = Image.new("RGB", (width, height), backgroundColor) 
     
    11671237 
    11681238    def truncText(text, maxWidth, append=""): 
    1169         #print getMaxTextWidthHint([text]), maxAnnotationTextWidth 
    1170         if getMaxTextWidthHint([text])>maxWidth: 
    1171             while getMaxTextWidthHint([text+"..."+append])>maxWidth and text: 
     1239        # print getMaxTextWidthHint([text]), maxAnnotationTextWidth 
     1240        if getMaxTextWidthHint([text]) > maxWidth: 
     1241            while getMaxTextWidthHint([text + "..." + append]) > maxWidth and text: 
    11721242                text = text[:-1] 
    11731243            if text: 
    1174                 text = text+"..."+append 
     1244                text = text + "..." + append 
    11751245            else: 
    11761246                text = append 
     
    11791249    connectAtX = {} 
    11801250    for i, term in enumerate(termsList): 
    1181         draw.line([(verticalMargin, currentY+termHeight/2), (verticalMargin + foldWidths[i], currentY+termHeight/2)], width=termHeight-2, fill=graphColor) 
     1251        draw.line([(verticalMargin, currentY + termHeight / 2), (verticalMargin + foldWidths[i], currentY + termHeight / 2)], width=termHeight - 2, fill=graphColor) 
    11821252        draw.text((firstColumnStart, currentY), str(term[1]), font=font, fill=textColor) 
    11831253        draw.text((secondColumnStart, currentY), str(term[2]), font=font, fill=textColor) 
     
    11851255        draw.text((fourthColumnStart, currentY), str(term[4]), font=font, fill=textColor) 
    11861256##        annotText = width!=None and truncText(str(term[5]), maxAnnotationTextWidth, str(term[5])) or str(term[4]) 
    1187         annotText = width!=None and truncText(str(term[5]), maxAnnotationTextWidth) 
     1257        annotText = width != None and truncText(str(term[5]), maxAnnotationTextWidth) 
    11881258        draw.text((fifthColumnStart, currentY), annotText, font=font, fill=textColor) 
    1189         genesText = width!=None and truncText(str(term[6]), maxGenesTextWidth) or str(term[6]) 
     1259        genesText = width != None and truncText(str(term[6]), maxGenesTextWidth) or str(term[6]) 
    11901260        draw.text((sixthColumnStart, currentY), genesText, font=font, fill=textColor) 
    1191         lineEnd = term[-1]==None and firstColumnStart-10 or connectAtX[term[-1]] 
    1192         draw.line([(verticalMargin+foldWidths[i]+1, currentY+termHeight/2), (lineEnd, currentY+termHeight/2)], width=1, fill=textColor) 
    1193         if term[-1]!=None: 
    1194             draw.line([(lineEnd, currentY+termHeight/2), (lineEnd, currentY+termHeight/2 - termHeight*(i-term[-1]))], width=1, fill=textColor) 
     1261        lineEnd = term[-1] == None and firstColumnStart - 10 or connectAtX[term[-1]] 
     1262        draw.line([(verticalMargin + foldWidths[i] + 1, currentY + termHeight / 2), (lineEnd, currentY + termHeight / 2)], width=1, fill=textColor) 
     1263        if term[-1] != None: 
     1264            draw.line([(lineEnd, currentY + termHeight / 2), (lineEnd, currentY + termHeight / 2 - termHeight * (i - term[-1]))], width=1, fill=textColor) 
    11951265        connectAtX[i] = lineEnd - treeStep 
    1196         currentY+=termHeight 
     1266        currentY += termHeight 
    11971267 
    11981268    currentY = horizontalMargin 
     
    12051275 
    12061276    horizontalMargin = 0 
    1207     #draw.line([(verticalMargin, height - horizontalMargin - legendHeight), (verticalMargin + maxFoldWidth, height - horizontalMargin - legendHeight)], width=1, fill=textColor) 
     1277    # draw.line([(verticalMargin, height - horizontalMargin - legendHeight), (verticalMargin + maxFoldWidth, height - horizontalMargin - legendHeight)], width=1, fill=textColor) 
    12081278    draw.line([(verticalMargin, horizontalMargin + legendHeight), (verticalMargin + maxFoldWidth, horizontalMargin + legendHeight)], width=1, fill=textColor) 
    1209     maxLabelWidth = getMaxTextWidthHint([" "+str(i) for i in range(int(maxFoldEnrichment+1))]) 
    1210     numOfLegendLabels = max(int(maxFoldWidth/maxLabelWidth), 2) 
    1211     for i in range(numOfLegendLabels+1): 
    1212         #draw.line([(verticalMargin + i*maxFoldWidth/10, height - horizontalMargin - legendHeight/2), (verticalMargin + i*maxFoldWidth/10, height - horizontalMargin - legendHeight)], width=1, fill=textColor) 
    1213         #draw.text((verticalMargin + i*maxFoldWidth/10 - font.getsize(str(i))[0]/2, height - horizontalMargin - legendHeight/2), str(i), font=font, fill=textColor) 
    1214  
    1215         label = str(int(i*maxFoldEnrichment/numOfLegendLabels)) 
    1216         draw.line([(verticalMargin + i*maxFoldWidth/numOfLegendLabels, horizontalMargin + legendHeight/2), (verticalMargin + i*maxFoldWidth/numOfLegendLabels, horizontalMargin + legendHeight)], width=1, fill=textColor) 
    1217         draw.text((verticalMargin + i*maxFoldWidth/numOfLegendLabels - font.getsize(label)[0]/2, horizontalMargin), label, font=font, fill=textColor) 
    1218          
     1279    maxLabelWidth = getMaxTextWidthHint([" " + str(i) for i in range(int(maxFoldEnrichment + 1))]) 
     1280    numOfLegendLabels = max(int(maxFoldWidth / maxLabelWidth), 2) 
     1281    for i in range(numOfLegendLabels + 1): 
     1282        # draw.line([(verticalMargin + i*maxFoldWidth/10, height - horizontalMargin - legendHeight/2), (verticalMargin + i*maxFoldWidth/10, height - horizontalMargin - legendHeight)], width=1, fill=textColor) 
     1283        # draw.text((verticalMargin + i*maxFoldWidth/10 - font.getsize(str(i))[0]/2, height - horizontalMargin - legendHeight/2), str(i), font=font, fill=textColor) 
     1284 
     1285        label = str(int(i * maxFoldEnrichment / numOfLegendLabels)) 
     1286        draw.line([(verticalMargin + i * maxFoldWidth / numOfLegendLabels, horizontalMargin + legendHeight / 2), (verticalMargin + i * maxFoldWidth / numOfLegendLabels, horizontalMargin + legendHeight)], width=1, fill=textColor) 
     1287        draw.text((verticalMargin + i * maxFoldWidth / numOfLegendLabels - font.getsize(label)[0] / 2, horizontalMargin), label, font=font, fill=textColor) 
     1288 
    12191289    image.save(fh) 
     1290 
    12201291 
    12211292def drawEnrichmentGraphPylab_tostream(termsList, headers, fh, width=None, height=None, show=True): 
    12221293    from matplotlib import pyplot as plt 
    12231294    from matplotlib.patches import Rectangle 
    1224      
    1225     maxFoldWidth = width!=None and min(150, width/6) or 150 
     1295 
     1296    maxFoldWidth = width != None and min(150, width / 6) or 150 
    12261297    maxFoldEnrichment = max([t[0] for t in termsList]) 
    1227     foldNormalizationFactor = float(maxFoldWidth)/maxFoldEnrichment 
     1298    foldNormalizationFactor = float(maxFoldWidth) / maxFoldEnrichment 
    12281299##    foldWidths = [int(foldNormalizationFactor*term[0]) for term in termsList] 
    12291300    foldWidths = [term[0] for term in termsList] 
    1230     treeStep = maxFoldEnrichment*0.05 
     1301    treeStep = maxFoldEnrichment * 0.05 
    12311302    treeWidth = {} 
    12321303 
    12331304    for i, term in enumerate(termsList): 
    1234         treeWidth[i] = (term[-1]==None and treeStep or treeWidth[term[-1]] + treeStep) 
     1305        treeWidth[i] = (term[-1] == None and treeStep or treeWidth[term[-1]] + treeStep) 
    12351306    maxTreeWidth = max(treeWidth) 
    12361307 
     
    12451316        connectAt[i] = connectAt.get(parent, maxFoldEnrichment + maxTreeWidth) - treeStep 
    12461317        if parent != None: 
    1247             plt.plot([connectAt.get(parent)]*2, [len(termsList) - i, len(termsList) - parent], color="black") 
     1318            plt.plot([connectAt.get(parent)] * 2, [len(termsList) - i, len(termsList) - parent], color="black") 
    12481319        cellText.append((str(n), str(m), p_val, fdr_val, name, genes)) 
    12491320 
     
    12571328        for i, line in enumerate(cellText): 
    12581329            for j, text in enumerate(line): 
    1259                 table.add_cell(i, j,width=len(text), height=1, text=text, loc="left", edgecolor="w", facecolor="w") 
     1330                table.add_cell(i, j, width=len(text), height=1, text=text, loc="left", edgecolor="w", facecolor="w") 
    12601331 
    12611332        table.set_figure(plt.gcf()) 
     
    12661337##    table = plt.table(cellText=cellText, colLabels=headers, loc="right") 
    12671338##    table.set_transform(plt.gca().transData) 
    1268 ##     
     1339## 
    12691340##    table.set_xy(20,20) 
    12701341    plt.show() 
    1271      
     1342 
     1343 
    12721344class Taxonomy(object): 
    1273     """Maps NCBI taxonomy ids to coresponding GO organism codes 
     1345    """Maps NCBI taxonomy ids to corresponding GO organism codes 
    12741346    """ 
    1275     common_org_map = {"297284":"9913", "30523":"9913", # Bos taurus 
    1276                       "5782":"352472", "44689":"352472", "366501":"352472", # Dictyostelium discoideum 
    1277                       "83333": "562", # Escherichia coli 
    1278                       "52545":"4530", "4532":"4530", "65489":"4530", "4533":"4530", "77588":"4530", "29689":"4530", 
    1279                       "4538":"4530", "40148":"4530", "29690":"4530", "110450":"4530", "4534":"4530", "83309":"4530", 
    1280                       "4528":"4530", "127571":"4530", "40149":"4530", "83307":"4530", "63629":"4530", "4536": "4530", 
    1281                       "4535":"4530", "4537":"4530", "65491":"4530", "83308":"4530", "4529":"4530", "4530":"4530", 
    1282                       "39946":"4530", "39947":"4530", "110451":"4530", "364100":"4530", "364099":"4530", "4539":"4530", 
     1347    common_org_map = {"297284": "9913", "30523": "9913", # Bos taurus 
     1348                      "5782": "352472", "44689": "352472", "366501": "352472", # Dictyostelium discoideum 
     1349                      "83333": "562",  # Escherichia coli 
     1350                      "52545": "4530", "4532": "4530", "65489": "4530", "4533": "4530", "77588": "4530", "29689": "4530", 
     1351                      "4538": "4530", "40148": "4530", "29690": "4530", "110450": "4530", "4534": "4530", "83309": "4530", 
     1352                      "4528": "4530", "127571": "4530", "40149": "4530", "83307": "4530", "63629": "4530", "4536": "4530", 
     1353                      "4535": "4530", "4537": "4530", "65491": "4530", "83308": "4530", "4529": "4530", "4530": "4530", 
     1354                      "39946": "4530", "39947": "4530", "110451": "4530", "364100": "4530", "364099": "4530", "4539": "4530", 
    12831355                      } 
    1284     code_map = {"3702":"tair",  # Arabidopsis thaliana 
    1285                 "9913":"goa_cow", # Bos taurus 
    1286                 "6239":"wb", # Caenorhabditis elegans 
    1287                 "3055":None, # Chlamydomonas reinhardtii 
    1288                 "7955":"zfin", # Danio rerio (zebrafish) 
    1289                 "352472":"dictyBase", # Dictyostelium discoideum 
    1290                 "7227": "fb", # Drosophila melanogaster 
    1291                 "562": "ecocyc", # Escherichia coli 
    1292                 "11103": None, # Hepatitis C virus 
     1356    code_map = {"3702": "tair",  # Arabidopsis thaliana 
     1357                "9913": "goa_cow", # Bos taurus 
     1358                "6239": "wb", # Caenorhabditis elegans 
     1359                "3055": None, # Chlamydomonas reinhardtii 
     1360                "7955": "zfin", # Danio rerio (zebrafish) 
     1361                "352472": "dictyBase", # Dictyostelium discoideum 
     1362                "7227": "fb",  # Drosophila melanogaster 
     1363                "562": "ecocyc",  # Escherichia coli 
     1364                "11103": None,  # Hepatitis C virus 
    12931365                "9606": "goa_human",  # Homo sapiens 
    1294                 "10090": "mgi", # Mus musculus 
     1366                "10090": "mgi",  # Mus musculus 
    12951367                "2104": None,  # Mycoplasma pneumoniae 
    12961368                "4530": "gramene_oryza",  # Oryza sativa 
    12971369                "5833": "GeneDB_Pfalciparum",  # Plasmodium falciparum 
    12981370                "4754": None,  # Pneumocystis carinii 
    1299                 "10116": "rgd", # Rattus norvegicus 
     1371                "10116": "rgd",  # Rattus norvegicus 
    13001372                "4932": "sgd",  # Saccharomyces cerevisiae 
    1301                 "4896": "GeneDB_Spombe", # Schizosaccharomyces pombe 
    1302                 "31033": None, # Takifugu rubripes 
     1373                "4896": "GeneDB_Spombe",  # Schizosaccharomyces pombe 
     1374                "31033": None,  # Takifugu rubripes 
    13031375                "8355": None,  # Xenopus laevis 
    1304                 "4577": None # Zea mays 
     1376                "4577": None  # Zea mays 
    13051377                } 
    13061378    version = 1 
    13071379    __shared_state = {"tax": None} 
     1380 
    13081381    def __init__(self): 
    13091382        self.__dict__ = self.__shared_state 
    13101383        if not self.tax: 
    1311             from Orange.orng import orngServerFiles 
    13121384            path = orngServerFiles.localpath_download("GO", "taxonomy.pickle") 
    13131385            if os.path.isfile(path): 
     
    13161388                orngServerFiles.download("GO", "taxonomy.pickle") 
    13171389                self.tax = cPickle.load(open(path, "rb")) 
    1318                  
     1390 
    13191391    def __getitem__(self, key): 
    13201392        key = self.common_org_map.get(key, key) 
    13211393        return self.code_map[key] 
    1322      
     1394 
    13231395    def keys(self): 
    13241396        return list(set(self.common_org_map.keys() + self.code_map.keys())) 
    1325      
    1326 #    @classmethod 
    1327 #    def get_taxonomy(cls): 
    1328 #        import urllib2 as url 
    1329 #        import sgmllib 
    1330 #        organisms 
    1331 #        class MyParser(sgmllib.SGMLParser): 
    1332 #            inTable = False 
    1333 #            def start_table(self, attributes): 
    1334 #                self.inTable = dict(attributes).get("summary", False) 
    1335 #            def end_table(self): 
    1336 #                self.inTable = False 
    1337 #            def start 
    1338      
     1397 
     1398 
    13391399def from_taxid(id): 
    13401400    """ Return a set of GO organism codes that correspond to NCBI taxonomy id 
    13411401    """ 
    13421402    return Taxonomy()[id] 
     1403 
    13431404 
    13441405def to_taxid(db_code): 
     
    13471408    r = [key for key, val in Taxonomy().code_map.items() if db_code == val] 
    13481409    return set(r) 
    1349      
     1410 
    13501411 
    13511412class __progressCallbackWrapper: 
    13521413    def __init__(self, callback): 
    13531414        self.callback = callback 
     1415 
    13541416    def __call__(self, bCount, bSize, fSize): 
    13551417        fSize = 10000000 if fSize == -1 else fSize 
    1356         self.callback(100*bCount*bSize/fSize) 
    1357          
     1418        self.callback(100 * bCount * bSize / fSize) 
     1419 
    13581420from .obiGenomicsUpdate import Update as UpdateBase 
    13591421 
    1360 import urllib2 
    13611422 
    13621423class Update(UpdateBase): 
    13631424    def __init__(self, local_database_path=None, progressCallback=None): 
    13641425        UpdateBase.__init__(self, local_database_path or getDataDir(), progressCallback) 
     1426 
    13651427    def CheckModified(self, addr, date=None): 
    13661428        return date < self.GetLastModified(addr) if date else True 
    1367          
     1429 
    13681430    def CheckModifiedOrg(self, org): 
    13691431        return self.CheckModified("http://www.geneontology.org/gene-associations/gene_association." + org + ".gz", self.LastModifiedOrg(org)) 
    1370      
     1432 
    13711433    def LastModifiedOrg(self, org): 
    13721434        return self.shelve.get((Update.UpdateAnnotation, (org,)), None) 
     
    13891451        elif func == Update.UpdateAnnotation: 
    13901452            return self.CheckModifiedOrg(args[0]) 
    1391              
     1453 
    13921454    def GetDownloadable(self): 
    13931455        orgs = set(self.GetAvailableOrganisms()) - set(self.GetDownloadedOrganisms()) 
     
    14061468        Annotations.DownloadAnnotations(org, os.path.join(self.local_database_path, "gene_association." + org + ".tar.gz"), self.progressCallback) 
    14071469        self._update(Update.UpdateAnnotation, (org,), self.GetLastModified("http://www.geneontology.org/gene-associations/gene_association." + org + ".gz")) 
    1408          
     1470 
    14091471    def UpdateTaxonomy(self, org): 
    14101472        exclude = ["goa_uniprot", "goa_pdb", "GeneDB_tsetse", "reactome", "goa_zebrafish", "goa_rat", "goa_mouse"] 
     
    14191481                a = obiGO.Annotations(os.path.join(self.local_database_path, "gene_association." + org + ".tar.gz")) 
    14201482                taxons = set(ann.taxon for ann in a.annotations) 
    1421                 for taxId in [t.split(":")[-1] for t in taxons if "|" not in t]: ## exclude taxons with cardinality 2 
     1483                for taxId in [t.split(":")[-1] for t in taxons if "|" not in t]:  # exclude taxons with cardinality 2 
    14221484                    tax[taxId].add(org) 
    14231485            except Exception, ex: 
    14241486                print ex 
    1425                  
     1487 
    14261488        cPickle.dump(dict(tax), open(os.path.join(path, "taxonomy.pickle"), "wb")) 
    1427              
     1489 
    14281490 
    14291491def _test1(): 
     
    14341496    o = Ontology("ontology_arch.tar.gz") 
    14351497    a = Annotations("annotations_arch.tar.gz", ontology=o) 
    1436      
    1437     a.GetEnrichedTerms(sorted(a.geneNames)[:100])#, progressCallback=_print) 
     1498 
     1499    a.GetEnrichedTerms(sorted(a.geneNames)[:100])  # , progressCallback=_print) 
    14381500##    profile.runctx("a.GetEnrichedTerms(sorted(a.geneNames)[:100])", {"a":a}, {}) 
    1439     a.GetEnrichedTerms(sorted(a.geneNames)[:100])#, progressCallback=_print) 
    1440     d1 = a.GetEnrichedTerms(sorted(a.geneNames)[:1000])#, progressCallback=_print) 
    1441      
     1501    a.GetEnrichedTerms(sorted(a.geneNames)[:100])  # , progressCallback=_print) 
     1502    d1 = a.GetEnrichedTerms(sorted(a.geneNames)[:1000])  # , progressCallback=_print) 
     1503 
    14421504##    print a.GetEnrichedTerms(sorted(a.geneNames)[:100])#, progressCallback=_print) 
     1505 
    14431506 
    14441507def _test2(): 
     
    14521515        print i 
    14531516#    a.DrawEnrichmentGraph(filterByPValue(terms), len(clusterGenes), len(a.geneNames)) 
    1454                
     1517 
    14551518##    drawEnrichmentGraph([("bal", 1.0, 5, 6, 0.1, 0.4, ["vv"]), 
    14561519##                        ("GO:0019079", 0.5, 5, 6, 0.1, 0.4, ["cc", "bb"]), 
    14571520##                        ("GO:0022415", 0.4, 5, 7, 0.11, 0.4, ["cc1", "bb"])], open("graph.png", "wb"), None, None) 
     1521 
    14581522 
    14591523def _test3(): 
     
    14631527    clusterGenes = sorted(a.geneNames)[:1] + sorted(a.geneNames)[-1:] 
    14641528##    clusterGenes = [g + "_" + str(i%5) for g in sorted(a.geneNames)[:2]] 
    1465     exonMap = dict([(gene, [gene+"_E%i" %i for i in range(10)]) for gene in a.geneNames]) 
     1529    exonMap = dict([(gene, [gene + "_E%i" % i for i in range(10)]) for gene in a.geneNames]) 
    14661530    a.RemapGenes(exonMap) 
    14671531##    o.reverseAliasMapper = o.aliasMapper = {} 
     
    14711535##    a.DrawEnrichmentGraph(filterByPValue(terms), len(clusterGenes), len(a.geneNames)) 
    14721536    a.DrawEnrichmentGraph(filterByPValue(terms, maxPValue=0.1), len(clusterGenes), len(a.geneNames)) 
    1473      
     1537 
    14741538if __name__ == "__main__": 
    14751539    _test2() 
Note: See TracChangeset for help on using the changeset viewer.