Changeset 1440:dd095aafafb8 in orange-bioinformatics


Ignore:
Timestamp:
06/27/11 11:50:20 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
7d7199a5b41b0e34737bfdc766766446d0b479db
Message:

Added persistent caching for Gene Atlas Tissue expression widget.

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • obiArrayExpress.py

    r1418 r1440  
    4141import json 
    4242from xml.etree.ElementTree import ElementTree 
     43from StringIO import StringIO 
    4344 
    4445from collections import defaultdict 
     
    264265             
    265266    def _cache_urlopen(self, url, timeout=30): 
    266         from StringIO import StringIO 
    267267        if self.cache is not None and url in self.cache: 
    268268            stream = StringIO(self.cache[url]) 
     
    11591159    """ 
    11601160    DEFAULT_ADDRESS = "http://www.ebi.ac.uk:80/gxa/" 
    1161      
    1162     def __init__(self, address=None, timeout=30): 
     1161    try: 
     1162        DEFAULT_CACHE = shelve.open(orngServerFiles.localpath("ArrayExpress", "GeneAtlasCache.shelve")) 
     1163    except Exception, ex: 
     1164        print ex 
     1165        DEFAULT_CACHE = {} 
     1166    def __init__(self, address=None, timeout=30, cache=None): 
    11631167        """ Initialize the conenction. 
    11641168         
    11651169        :param address: Address of the server. 
    1166         :timeout: Socket timeout. 
     1170        :param timeout: Socket timeout. 
     1171        :param cache : A dict like object to use as a cache. 
    11671172         
    11681173        """ 
    11691174        self.address = address if address is not None else self.DEFAULT_ADDRESS 
    11701175        self.timeout = timeout 
     1176        self.cache = cache 
    11711177     
    11721178    def query(self, condition, format="json", start=None, rows=None, indent=False): 
     
    11781184            url += "&indent" 
    11791185#        print url 
    1180         response = urllib2.urlopen(url) 
     1186        if self.cache is not None: 
     1187            return self._query_cached(url) 
     1188        else: 
     1189            return urllib2.urlopen(url) 
    11811190        return response 
     1191     
     1192    def _query_cached(self, url): 
     1193        if self.cache is not None: 
     1194            if url not in self.cache: 
     1195                response = urllib2.urlopen(url) 
     1196                contents = response.read() 
     1197                self.cache[url] = contents 
     1198                if hasattr(self.cache, "sync"): 
     1199                    self.cache.sync() 
     1200            return StringIO(self.cache[url]) 
     1201        else: 
     1202            return urllib2.urlopen(url) 
     1203                 
    11821204     
    11831205# Names of all Gene Property filter names 
     
    12391261     "Saccharomyces cerevisiae", 
    12401262     "Schizosaccharomyces pombe", 
    1241      "Unknown", 
     1263#     "Unknown", 
    12421264     "Xenopus laevis" 
    12431265     ] 
     
    12501272    import orngServerFiles 
    12511273    # Should this be in the OBOFoundry (Ontology) domain 
    1252     file_name = orngServerFiles.localpath_download("ArrayExpress", "efo.obo") 
    1253     return obiOntology.OBOOntology(open(filename, "rb")) 
     1274    try: 
     1275        file = open(orngServerFiles.localpath_download("ArrayExpress", "efo.obo"), "rb") 
     1276    except urllib2.HTTPError: 
     1277        file = urllib2.urlopen("http://efo.svn.sourceforge.net/svnroot/efo/trunk/src/efoinobo/efo.obo") 
     1278    return obiOntology.OBOOntology(file) 
    12541279 
    12551280 
     
    12771302    def rest(self): 
    12781303        return "&".join(cond.rest() for cond in self) 
     1304 
    12791305 
    12801306class AtlasConditionGeneProperty(AtlasCondition): 
     
    14721498""" 
    14731499 
    1474 def query_atlas(condition, format="json", start=None, rows=None, indent=False): 
     1500def query_atlas(condition, format="json", start=None, rows=None, indent=False, connection=None): 
    14751501    """ Query Atlas based on a `condition` (instance of AtlasCondition) 
    14761502     
     
    14841510         
    14851511    """ 
    1486     connection = GeneExpressionAtlasConenction() 
     1512    if connection is None: 
     1513        connection = GeneExpressionAtlasConenction() 
    14871514    results = connection.query(condition, format=format, start=start, 
    14881515                               rows=rows, indent=indent) 
     
    14951522 
    14961523 
    1497 def get_atlas_summary(genes, organism): 
     1524def get_atlas_summary(genes, organism, connection=None): 
    14981525    """ Return 3 dictionaries containing a summary of atlas information 
    14991526    about three experimental factors: 
     
    15161543    org_condition = AtlasConditionOrganism(organism) 
    15171544    condition = AtlasConditionList([genes_condition, org_condition]) 
    1518     result = query_atlas(condition, format="json") 
     1545    result = query_atlas(condition, format="json", connection=connection) 
    15191546     
    15201547    org_part = collect_ef_summary(result, "organism_part") 
     
    15231550     
    15241551    return org_part, disease_state, cell_type 
     1552     
    15251553     
    15261554def collect_ef_summary(info, ef): 
     
    15571585    doctest.testmod(optionflags=doctest.ELLIPSIS, extraglobs={"conn": conn}) 
    15581586     
     1587     
    15591588if __name__ == "__main__": 
    15601589    test() 
  • widgets/prototypes/OWGeneAtlasTissueExpression.py

    r1438 r1440  
    1313 
    1414import orngDataCaching 
     15import orngServerFiles 
    1516import obiGene 
     17 
     18import shelve 
     19 
    1620 
    1721# Mapping for common taxids from obiTaxonomy 
     
    3438     } 
    3539 
     40 
     41try: 
     42    cache_filename = orngServerFiles.localpath("ArrayExpress", "GeneAtlasTissue.shelve") 
     43    GENE_ATLAS_TISSUE_CACHE = shelve.open(cache_filename) 
     44except Exception, ex: 
     45    print >> sys.stderr, ex 
     46    GENE_ATLAS_TISSUE_CACHE = {} 
     47     
     48      
    3649def construct_matcher(taxid): 
    3750    return obiGene.matcher([obiGene.GMEnsembl(taxid), obiGene.GMNCBI(taxid)]) 
     51 
    3852 
    3953class OWGeneAtlasTissueExpression(OWWidget): 
     
    108122        self.values_cb.box.setFlat(True) 
    109123         
     124        box = OWGUI.widgetBox(self.controlArea, "Cache", addSpace=True) 
     125        OWGUI.button(box, self, "Clear cache", 
     126                     callback=self.on_cache_clear, 
     127                     tooltip="Clear Gene Atlas cache.") 
     128         
    110129        OWGUI.rubber(self.controlArea) 
    111130         
     
    135154        self.query_genes = [] 
    136155         
    137         # Cached get_atlas_summary  
    138         @lru_cache(maxsize=20) 
     156        # Cached get_atlas_summary 
    139157        def get_atlas_summary(genes, organism): 
    140             return obiArrayExpress.get_atlas_summary(list(genes), organism) 
     158            import time 
     159            args = (tuple(genes), organism) 
     160            args = repr(args) 
     161            if args not in GENE_ATLAS_TISSUE_CACHE: 
     162                results = obiArrayExpress.get_atlas_summary(list(genes), organism) 
     163                GENE_ATLAS_TISSUE_CACHE[args] = (time.time(), results) 
     164                if len(GENE_ATLAS_TISSUE_CACHE) > 30: 
     165                    key_time = [(time, key) for key, (time, _) in GENE_ATLAS_TISSUE_CACHE.iteritems()] 
     166                    key_time = sorted(key_time) 
     167                    for key, _ in key_time[: 10]: 
     168                        del GENE_ATLAS_TISSUE_CACHE[key] 
     169                GENE_ATLAS_TISSUE_CACHE.sync() 
     170            return GENE_ATLAS_TISSUE_CACHE[args][1] 
    141171         
    142172        self.get_atlas_summary = get_atlas_summary 
     
    239269        self.update_report_view() 
    240270         
     271    def on_cache_clear(self): 
     272        GENE_ATLAS_TISSUE_CACHE.clear() 
     273        GENE_ATLAS_TISSUE_CACHE.sync() 
     274         
    241275    def input_genes(self): 
    242276        """ Extract input gene names from ``self.data``.  
Note: See TracChangeset for help on using the changeset viewer.