Changeset 1750:8a7cd2cf4ea2 in orange-bioinformatics


Ignore:
Timestamp:
04/18/13 19:11:11 (12 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Using a single global Genome instance in obiKEGG module level functions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _bioinformatics/obiKEGG/__init__.py

    r1747 r1750  
    1 """\ 
     1""" 
    22============================================== 
    33KEGG - Kyoto Encyclopedia of Genes and Genomes 
     
    5656import sys 
    5757import urllib2 
     58import threading 
    5859 
    5960from collections import defaultdict 
    6061from itertools import chain 
    6162from datetime import datetime 
     63from contextlib import contextmanager 
    6264 
    6365from Orange.utils import lru_cache 
     
    307309    @classmethod 
    308310    def organism_name_search(cls, name): 
    309         genome = KEGGGenome() 
    310         try: 
    311             name = genome.org_code_to_entry_key(name) 
    312         except ValueError: 
    313             pass 
    314  
    315         if name not in genome: 
    316             ids = genome.search(name) 
    317             if ids: 
    318                 name = ids.pop(0) if ids else name 
    319             else: 
    320                 raise OrganismNotFoundError(name) 
    321  
    322         try: 
    323             return genome[name].organism_code 
    324         except KeyError: 
    325             raise OrganismNotFoundError(name) 
     311        return organism_name_search(name) 
    326312 
    327313    @classmethod 
    328314    def organism_version(cls, name): 
    329315        name = cls.organism_name_search(name) 
    330         genome = KEGGGenome() 
    331         info = genome.api.info(name) 
    332         return info.release 
     316        with _global_genome_instance() as genome: 
     317            info = genome.api.info(name) 
     318            return info.release 
    333319 
    334320    def _set_genematcher(self, genematcher): 
     
    358344def organism_name_search(name): 
    359345    """ 
    360     Search and organism by `name` and return an KEGG organism code. 
    361     """ 
    362     return KEGGOrganism.organism_name_search(name) 
     346    Search for a organism by `name` and return it's KEGG organism code. 
     347    """ 
     348    with _global_genome_instance() as genome: 
     349        try: 
     350            name = genome.org_code_to_entry_key(name) 
     351        except ValueError: 
     352            pass 
     353 
     354        if name not in genome: 
     355            ids = genome.search(name) 
     356            if ids: 
     357                name = ids.pop(0) if ids else name 
     358            else: 
     359                raise OrganismNotFoundError(name) 
     360 
     361        try: 
     362            return genome[name].organism_code 
     363        except KeyError: 
     364            raise OrganismNotFoundError(name) 
    363365 
    364366 
     
    370372 
    371373 
    372 def organisms(): 
    373     """ 
    374     Return a list of all KEGG organisms. 
    375     """ 
    376     return KEGGOrganism.organisms() 
    377  
    378  
    379374def from_taxid(taxid): 
    380375    """ 
    381376    Return a KEGG organism code for a an NCBI Taxonomy id string `taxid`. 
    382377    """ 
    383     genome = KEGGGenome() 
    384     res = genome.search(taxid) 
    385     for r in res: 
    386         e = genome[r] 
    387  
    388         if e.taxid in [taxid, genome.TAXID_MAP.get(taxid, taxid)]: 
    389             return e.org_code() 
    390  
    391     return None 
     378    with _global_genome_instance() as genome: 
     379        res = genome.search(taxid) 
     380        for r in res: 
     381            e = genome[r] 
     382 
     383            if e.taxid in [taxid, genome.TAXID_MAP.get(taxid, taxid)]: 
     384                return e.org_code() 
     385 
     386        return None 
    392387 
    393388 
     
    396391    Return a NCBI Taxonomy id for a given KEGG Organism name 
    397392    """ 
    398     genome = KEGGGenome() 
    399     if name in genome: 
    400         return genome[name].taxid 
    401  
    402     keys = genome.search(name) 
    403     if keys: 
    404         return genome[keys[0]].taxid 
    405     else: 
    406         return None 
     393    with _global_genome_instance() as genome: 
     394        if name in genome: 
     395            return genome[name].taxid 
     396 
     397        keys = genome.search(name) 
     398        if keys: 
     399            return genome[keys[0]].taxid 
     400        else: 
     401            return None 
     402 
     403 
     404def _global_genome_instance(): 
     405    genome = getattr(_global_genome_instance, "_genome", None) 
     406    if genome is None: 
     407        genome = KEGGGenome() 
     408        genome._lock = threading.RLock() 
     409        _global_genome_instance._genome = genome 
     410 
     411    @contextmanager 
     412    def instance_locked(instance, lock): 
     413        lock.acquire() 
     414        try: 
     415            yield instance 
     416        finally: 
     417            lock.release() 
     418 
     419    return instance_locked(genome, genome._lock) 
    407420 
    408421 
Note: See TracChangeset for help on using the changeset viewer.