Changeset 1470:e8cddaaee459 in orange-bioinformatics


Ignore:
Timestamp:
09/05/11 15:43:47 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
04dd626a14137649ac6f5cb4a69feb2e806cc8d9
Message:

Better caching.
Deprecated the Gene Atlas Expression interface, replaced by obiGeneAtlas module.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • obiArrayExpress.py

    r1440 r1470  
    11""" 
     2=============== 
    23obiArrayExpress 
    34=============== 
    45 
    5 A python module for accessing the ArrayExpress and GeneExpressionAtlas 
    6 web services. 
    7  
    8  
    9 Array Express 
    10 ------------- 
     6A python module for accessing the ArrayExpress web services. 
    117 
    128`Array Express Archive <http://www.ebi.ac.uk/arrayexpress/>`_ is a database of gene expression experiments that you 
     
    1713    >>> import obiArrayExpress 
    1814    >>> obiArrayExpress.query_experiments(accession='E-MEXP-31') 
     15    {u'experiments': ... 
     16     
     17    >>> obiArrayExpress.query_experiments(keywords='gliobastoma') 
    1918    {u'experiments': ... 
    2019     
     
    4443 
    4544from collections import defaultdict 
     45from functools import partial 
     46from contextlib import closing 
    4647 
    4748parse_json = json.load 
     
    5152    """ 
    5253    return ElementTree(file=stream)  
    53 #    tree.parse(stream) 
    54 #    return tree 
    5554 
    5655# All searchable fields of ArrayExpress (see query_experiments docstring 
     
    8382 
    8483class ArrayExpressConnection(object): 
    85     """ A connection to the ArrayExpress. Used for query construction, 
    86     and user login.  
     84    """ A connection to the ArrayExpress. Used to construct a REST query 
     85    and run it. 
    8786     
    8887    .. todo:: Implement user login. 
     88     
    8989    """ 
    9090     
    9191    DEFAULT_ADDRESS = "http://www.ebi.ac.uk/arrayexpress/{format}/v2/" 
    9292    DEFAULT_FORMAT = "json" 
    93      
    94     try: 
    95         DEFAULT_CACHE = shelve.open(orngServerFiles.localpath("ArrayExpress", "ArrayExpressCache.shelve")) 
    96     except Exception: 
    97         DEFAULT_CACHE = {} 
     93    DEFAULT_CACHE = orngServerFiles.localpath("ArrayExpress", "ArrayExpressCache.shelve") 
    9894    # Order of arguments in the query 
    9995    _ARGS_ORDER = ["keywords", "species", "array"] 
     
    114110        self.username = username 
    115111        self.password = password 
    116          
    117112         
    118113    def format_query(self, **kwargs): 
     
    234229        url = self.query_url_files(**kwargs) 
    235230        stream = self._cache_urlopen(url, timeout=self.timeout) 
    236 #        stream = urllib2.urlopen(url, timeout=self.timeout) 
    237231        return stream 
    238232     
     
    262256                url = file.find("url").text 
    263257                return self._cache_urlopen(url.strip(), timeout=self.timeout) 
    264 #                return urllib2.urlopen(url.strip(), timeout=self.timeout) 
    265258             
    266259    def _cache_urlopen(self, url, timeout=30): 
    267         if self.cache is not None and url in self.cache: 
    268             stream = StringIO(self.cache[url]) 
    269             return stream 
    270         elif self.cache is not None: 
    271             stream = urllib2.urlopen(url, timeout=timeout) 
    272             data = stream.read() 
    273             self.cache[url] = data 
     260        if self.cache is not None: 
     261            with self.open_cache() as cache: 
     262                cached = url in cache 
     263            if not cached: 
     264                stream = urllib2.urlopen(url, timeout=timeout) 
     265                data = stream.read() 
     266                with self.open_cache() as cache: 
     267                    cache[url] = data 
     268            else: 
     269                with self.open_cache() as cache: 
     270                    data = cache[url] 
    274271            return StringIO(data) 
    275272        else: 
    276273            return urllib2.urlopen(url, timeout=timeout) 
    277274         
     275    def open_cache(self): 
     276        if isinstance(self.cache, basestring): 
     277            return closing(shelve.open(self.cache)) 
     278        elif hasattr(self.cache, "close"): 
     279            return closing(self.cache) 
     280        elif self.cache is None: 
     281            return fake_closing({}) 
     282        else: 
     283            return fake_closing(self.cache) 
     284         
     285from contextlib import contextmanager 
     286 
     287@contextmanager 
     288def fake_closing(obj): 
     289    yield obj 
    278290     
    279291def query_experiments(keywords=None, accession=None, array=None, ef=None, 
     
    355367     
    356368        >>> query_files(species="Mus musculus", ef="developmental_stage", efv="embryo", format="xml") 
    357         <xml.etree.ElementTree.ElementTree instance... 
     369        <xml.etree.ElementTree.ElementTree object ... 
    358370         
    359371    .. todo:: why does the json interface not work. 
     
    901913        >>> for file in ae.files: 
    902914        ...     print file["name"], file["url"] 
    903         E-MEXP-2917.biosamples.svg http://www.ebi.ac.uk/arrayexpress/files/E-MEXP-2917/E-MEXP-2917.biosamples.svg 
     915        E-MEXP-2917.sdrf.txt http://www.ebi.ac.uk/arrayexpress/files/E-MEXP-2917/E-MEXP-2917.sdrf.txt 
    904916        ... 
    905917             
     
    11301142--------------------- 
    11311143 
     1144.. WARNING:: Deprecated, use ``obiGeneAtlas`` instead. 
     1145 
    11321146`Gene Expression Atlas <http://www.ebi.ac.uk/gxa/>`_ is a curated subset of  
    11331147gene expression experiments in Array Express Archive. 
     
    11741188        self.address = address if address is not None else self.DEFAULT_ADDRESS 
    11751189        self.timeout = timeout 
    1176         self.cache = cache 
     1190        self.cache = cache if cache is not None else self.DEFAULT_CACHE 
    11771191     
    11781192    def query(self, condition, format="json", start=None, rows=None, indent=False): 
    1179         url = self.address + "api/v1?" + condition.rest() 
    1180         if start and rows: 
     1193        url = self.address + "api/vx?" + condition.rest() 
     1194        if start is not None and rows is not None: 
    11811195            url += "&start={0}&rows={1}".format(start, rows) 
    11821196        url += "&format={0}".format(format) 
     
    12651279     ] 
    12661280     
     1281#_COMMON_TAXIDS = \ 
     1282#    {"Anopheles gambiae", 
     1283#     "Arabidopsis thaliana", 
     1284#     "Bos taurus", 
     1285#     "Caenorhabditis elegans", 
     1286#     "Danio rerio", 
     1287#     "Drosophila melanogaster", 
     1288#     "Epstein barr virus", 
     1289#     "Gallus gallus", 
     1290#     "Homo sapiens", 
     1291#     "Human cytomegalovirus", 
     1292#     "Kaposi sarcoma-associated herpesvirus", 
     1293#     "Mus musculus", 
     1294#     "Rattus norvegicus", 
     1295#     "Saccharomyces cerevisiae", 
     1296#     "Schizosaccharomyces pombe", 
     1297##     "Unknown", 
     1298#     "Xenopus laevis" 
     1299#     } 
     1300     
    12671301def ef_ontology(): 
    12681302    """ Return the `EF <http://www.ebi.ac.uk/efo/>`_ (Experimental Factor) ontology 
     
    14391473     
    14401474def __check_atlas_error_json(response): 
    1441      if "error" in response: 
    1442          raise GeneAtlasError(response["error"]) 
    1443      return response 
     1475    if "error" in response: 
     1476        raise GeneAtlasError(response["error"]) 
     1477    return response 
     1478  
    14441479      
    14451480def __check_atlas_error_xml(response): 
     
    14751510         
    14761511    """ 
     1512    import warnings 
     1513    warnings.warn("Use 'obiGeneAtlas.run_simple_query' instead.", DeprecationWarning) 
    14771514    conditions = AtlasConditionList() 
    14781515    if genes: 
     
    15101547         
    15111548    """ 
     1549    import warnings 
     1550    warnings.warn("Use 'obiGeneAtlas.run_query' instead.", DeprecationWarning) 
    15121551    if connection is None: 
    15131552        connection = GeneExpressionAtlasConenction() 
     
    15401579         
    15411580    """ 
     1581    import warnings 
     1582    warnings.warn("Use 'obiGeneAtlas.get_atlas_summary' instead.", DeprecationWarning) 
    15421583    genes_condition = AtlasConditionGeneProperty("Gene", "Is", genes) 
    15431584    org_condition = AtlasConditionOrganism(organism) 
     
    15491590    cell_type = collect_ef_summary(result, "cell_type") 
    15501591     
    1551     return org_part, disease_state, cell_type 
    1552      
    1553      
    1554 def collect_ef_summary(info, ef): 
     1592    return dict(org_part), dict(disease_state), dict(cell_type) 
     1593     
     1594     
     1595def collect_ef_summary(info, ef, summary=None): 
    15551596    """ Collect the results summary from query_atlas, result for experimental 
    15561597    factor `ef`.  
    15571598    """ 
    1558     summary = defaultdict(dict) 
     1599    if summary is None: 
     1600        summary = defaultdict(dict) 
     1601         
    15591602    results = info["results"] 
    15601603    for res in results: 
     
    15711614                    summary[gene["name"]][efv] = updown 
    15721615     
    1573     return dict(summary) 
    1574      
    1575      
    1576 def test(): 
    1577     from pprint import pprint     
    1578     pprint(get_atlas_summary(['Pou5f1', 'Dppa3'], 'Mus musculus')) 
    1579         
    1580     pprint(get_atlas_summary(['PDLIM5', 'FGFR2' ], 'Homo sapiens')) 
    1581      
    1582      
     1616    return summary 
     1617     
     1618     
     1619def test():     
    15831620    conn = ArrayExpressConnection() 
    15841621    import doctest 
Note: See TracChangeset for help on using the changeset viewer.