Changeset 1472:719699e629cf in orange-bioinformatics


Ignore:
Timestamp:
09/05/11 15:46:01 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
e87ae8b9687a1433ae97fc6513a9d0a48533311f
Message:

Use obiGeneAtlas module. Uses local gene matcher and implements better caching.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • widgets/prototypes/OWGeneAtlasTissueExpression.py

    r1440 r1472  
    44import os, sys 
    55import obiArrayExpress 
     6import obiGeneAtlas 
    67import Orange 
    78 
     
    1819import shelve 
    1920 
    20  
    21 # Mapping for common taxids from obiTaxonomy 
    22 TAXID_TO_ORG = {"": "Anopheles gambiae", 
    23                 "3702": "Arabidopsis thaliana", 
    24                 "9913": "Bos taurus", 
    25                 "6239": "Caenorhabditis elegans", 
    26                 "7955": "Danio rerio", 
    27                 "7227": "Drosophila melanogaster", 
    28                 "": "Epstein barr virus", 
    29                 "": "Gallus gallus", 
    30                 "9606": "Homo sapiens", 
    31                 "": "Human cytomegalovirus", 
    32                 "": "Kaposi sarcoma-associated herpesvirus", 
    33                 "10090": "Mus musculus", 
    34                 "10116": "Rattus norvegicus", 
    35                 "4932": "Saccharomyces cerevisiae", 
    36                 "4896": "Schizosaccharomyces pombe", 
    37                 "8355": "Xenopus laevis" 
    38      } 
    39  
    40  
    41 try: 
    42     cache_filename = orngServerFiles.localpath("ArrayExpress", "GeneAtlasTissue.shelve") 
    43     GENE_ATLAS_TISSUE_CACHE = shelve.open(cache_filename) 
    44 except Exception, ex: 
    45     print >> sys.stderr, ex 
    46     GENE_ATLAS_TISSUE_CACHE = {} 
    47      
    48       
    49 def construct_matcher(taxid): 
    50     return obiGene.matcher([obiGene.GMEnsembl(taxid), obiGene.GMNCBI(taxid)]) 
    51  
     21TAXID_TO_ORG = obiGeneAtlas.TAXID_TO_ORG 
    5222 
    5323class OWGeneAtlasTissueExpression(OWWidget): 
     
    151121        self.results = {}, {}, {} 
    152122         
     123        self.ensembl_info = None 
    153124        self.gene_matcher = obiGene.GMDirect() 
     125        self.loaded_matcher_taxid = None 
     126        self.unknown_genes = [] 
    154127        self.query_genes = [] 
    155128         
    156         # Cached get_atlas_summary 
    157         def get_atlas_summary(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] 
    171          
    172         self.get_atlas_summary = get_atlas_summary 
     129#        self.set_organism(self.selected_organism, update_results=False) 
     130         
     131        self.get_atlas_summary = obiGeneAtlas.get_atlas_summary 
    173132         
    174133        #Cached construct_matcher 
    175         self.construct_matcher = lru_cache(maxsize=3)(construct_matcher) 
     134        @lru_cache(maxsize=3) 
     135        def my_cached_matcher(org): 
     136            return obiGeneAtlas.default_gene_matcher(org) 
     137        self.construct_matcher = my_cached_matcher 
    176138         
    177139    def set_data(self, data=None): 
     
    229191        self.candidate_var_names = [a.name for a in data.domain.attributes] 
    230192        if not self.candidate_vars: 
    231             self.genes_in_columns = True 
     193            self.genes_in_columns = True             
    232194             
    233195    def on_organism_change(self): 
     
    270232         
    271233    def on_cache_clear(self): 
    272         GENE_ATLAS_TISSUE_CACHE.clear() 
    273         GENE_ATLAS_TISSUE_CACHE.sync() 
    274          
    275     def input_genes(self): 
     234        from contextlib import closing 
     235        with closing(obiGeneAtlas._cache()) as cache: 
     236            cache.clear() 
     237         
     238    def input_genes(self, full_res=False): 
    276239        """ Extract input gene names from ``self.data``.  
    277240        """ 
     
    284247                if not ex[attr].is_special(): 
    285248                    names.append(str(ex[attr])) 
     249             
    286250        return sorted(set(names)) 
     251     
     252    def match_genes(self, genes, full_res=True): 
     253        """ Match the genes to ensembl gene ids. 
     254        """ 
     255        if self.gene_matcher and self.ensembl_info: 
     256            self.gene_matcher.set_targets(self.ensembl_info.keys()) 
     257            match_genes = map(self.gene_matcher.match, genes) 
     258            genes = map(self.gene_matcher.umatch, genes) 
     259        else: 
     260            match_genes = None 
     261        genes = sorted(set(genes) - set([None])) 
     262         
     263        if full_res: 
     264            return genes, match_genes 
     265        else: 
     266            return genes 
    287267     
    288268    def run_query(self): 
     
    291271        if self.data is not None: 
    292272            genes = self.input_genes() 
     273            matched, match_res = self.match_genes(genes, True) 
     274            all_matched, unknown = [], [] 
     275            for gene, match in zip(genes, match_res): 
     276                if len(match) == 1: 
     277                    all_matched.append(match[0]) 
     278                elif len(match) > 1: 
     279                    all_matched.append(match[0]) 
     280                else: 
     281                    unknown.append(gene) 
     282            self.unknown_genes = unknown 
     283            self.warning(2) 
     284            self.information(2) 
     285            if float(len(unknown)) / len(genes) > 0.5: 
     286                self.warning(2, "%i unknown genes" % len(unknown)) 
     287            elif unknown: 
     288                self.information(2, "%i unknown genes" % len(unknown)) 
     289                 
     290            gm = obiGene.GMDirect() 
     291            gm.set_targets(all_matched) 
     292             
    293293            # Non threaded 
    294             # self.results = self.get_atlas_summary(tuple(genes), self.selected_organism) 
     294#            self.results = self.get_atlas_summary(all_matched, self.selected_organism, gm) 
    295295            # Threaded 
    296296            self.error(0) 
    297297            self.update_info_box(query_running=True) 
    298298            self.controlArea.setEnabled(False) 
     299            self.results = None 
    299300            try: 
    300                 call = self.asyncCall(self.get_atlas_summary, (tuple(genes), 
    301                                                                self.selected_organism), 
     301                call = self.asyncCall(self.get_atlas_summary, (all_matched, 
     302                                                               self.selected_organism, 
     303                                                               gm), 
    302304                                      name="Query Gene Expression Atlas", 
    303305                                      onError=self.handle_assync_error) 
     
    307309            except obiArrayExpress.GeneAtlasError, ex: 
    308310                self.error(0, str(ex)) 
    309              
    310311            finally: 
    311312                self.controlArea.setEnabled(True) 
     
    315316         
    316317    def update_gene_matcher(self): 
    317         taxid = dict((v,k) for v,k in TAXID_TO_ORG.items()).get(self.selected_organism) 
    318         if taxid: 
    319             self.gene_matcher = self.construct_matcher(taxid) 
    320         else: 
    321             self.gene_matcher = obiGene.GMDirect() 
    322              
     318        taxid = dict((v,k) for k,v in TAXID_TO_ORG.items()).get(self.selected_organism) 
     319        self.warning(0) 
     320        if taxid != self.loaded_matcher_taxid: 
     321            if taxid: 
     322                self.ensembl_info = obiGene.EnsembleGeneInfo(taxid) 
     323                self.gene_matcher = self.construct_matcher(taxid) 
     324            else: 
     325                self.warning(0, "Cannot match gene names!") 
     326                self.ensembl_info = None 
     327                self.gene_matcher = obiGene.GMDirect() 
     328            self.loded_matcher_taxid = taxid 
    323329         
    324330    def update_ef_values_box(self): 
     
    372378        if self.data is not None: 
    373379            genes = self.input_genes() 
    374             text = "{0} gene names on input.\n".format(len(genes)) 
    375         else: 
    376             text = "No data on input.\n" 
     380#            unique, matched = self.match_genes(genes, full_res=True) 
     381            # TODO: How many genes are matched (should update after the query is run). 
     382            if self.results and not query_running: 
     383#                matched = min(max([len(r) for r in self.results]), len(genes)) 
     384                matched = len(genes) - len(self.unknown_genes) 
     385                with_results = len(reduce(set.union, [d.keys() for d in self.results], set())) 
     386                text = "{0} gene names on input.\n{1} genes matched.\n{2} genes annotated.".format(len(genes), matched, with_results) 
     387            else: 
     388                text = "{0} gene names on input.\n\n".format(len(genes)) 
     389        else: 
     390            text = "No data on input.\n\n" 
    377391        if query_running: 
    378392            text += "Querying Gene Atlas. Please wait." 
Note: See TracChangeset for help on using the changeset viewer.