Ignore:
Timestamp:
03/05/13 19:48:00 (14 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Porting obiKEGG to use the new REST KEGG API.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _bioinformatics/widgets/OWKEGGPathwayBrowser.py

    r1726 r1733  
    66""" 
    77 
    8 from __future__ import absolute_import, with_statement  
    9  
    10 if __name__ == "__main__":  
    11     __package__ = "Orange.bio.widgets" 
     8from __future__ import absolute_import, with_statement 
    129 
    1310import sys 
     11import gc 
    1412from collections import defaultdict 
    1513import webbrowser 
     
    310308        self.setEnabled(False) 
    311309        QTimer.singleShot(100, self.UpdateOrganismComboBox) 
    312          
    313          
     310 
    314311    def UpdateOrganismComboBox(self): 
    315312        # First try to import suds 
    316313        try: 
    317             import suds 
     314            import slumber 
    318315        except ImportError: 
    319316            QMessageBox.warning(self, 
    320                 "'suds' library required.", 
    321                 '<p>Please install \ 
    322 <a href="http://pypi.python.org/pypi/suds">suds</a> library \ 
    323 to use KEGG Pathways widget.</p>' 
    324                 ) 
    325              
     317                "'slumber' library required.", 
     318                '<p>Please install ' 
     319                '<a href="http://pypi.python.org/pypi/slumber">slumber</a> ' 
     320                'library to use KEGG Pathways widget.</p>' 
     321            ) 
     322 
    326323        try: 
    327324            genome = obiKEGG.KEGGGenome() 
    328             all_codes = list(genome) 
    329              
    330             self.allOrganismCodes = genome  
    331      
     325 
     326            self.allOrganismCodes = genome 
     327 
    332328            essential = genome.essential_organisms() 
    333329            common = genome.common_organisms() 
    334330            common = [c for c in common if c not in essential] 
    335              
     331 
     332            # TODO: Add option to specify additional organisms not 
     333            # in the common list. 
     334 
    336335            self.infoLabel.setText("Fetching organism definitions\n") 
    337              
    338             pb = OWGUI.ProgressBar(self, len(essential + common)) 
     336 
     337            keys = map(genome.org_code_to_entry_key, essential + common) 
     338 
     339            self.progressBarInit() 
     340            genome.pre_cache(keys, progress_callback=self.progressBarSet) 
     341            self.progressBarFinished() 
     342 
    339343            codes = [] 
    340             for i, code in enumerate(essential + common): 
    341                 codes.append((code, genome[code].definition)) 
    342                 pb.advance() 
    343             pb.finish() 
    344             self.organismCodes = codes 
    345              
    346             items = [desc for code, desc in self.organismCodes] 
    347              
    348             self.organismCodes = [code for code, desc in self.organismCodes] 
    349  
    350             # TODO: Add option to specify additional organisms not  
    351             # in the common list. 
    352  
     344            for code, key in zip(essential + common, keys): 
     345                codes.append((code, genome[key].definition)) 
     346 
     347            items = [desc for code, desc in codes] 
     348 
     349            self.organismCodes = [code for code, desc in codes] 
    353350            self.organismComboBox.addItems(items) 
     351 
    354352        finally: 
    355353            self.setEnabled(True) 
    356354            self.infoLabel.setText("No data on input\n") 
    357             self.signalManager.freeze(self).pop() #setFreeze(0) 
     355            self.signalManager.freeze(self).pop() 
    358356 
    359357    def Clear(self): 
     358        """ 
     359        Clear the widget state. 
     360        """ 
    360361        self.infoLabel.setText("No data on input\n") 
    361362        self.listView.clear() 
    362363        self.ClearPathway() 
    363          
     364 
    364365        self.send("Selected Examples", None) 
    365366        self.send("Unselected Examples", None) 
    366          
     367 
    367368    def ClearPathway(self): 
    368369        self.pathwayView.SetPathway(None) 
     
    419420         
    420421        self.geneAttrCombo.addItems([var.name for var in self.geneAttrCandidates]) 
    421              
     422 
    422423    def UpdateListView(self): 
    423424        self.bestPValueItem = None 
     
    425426        if not self.data: 
    426427            return 
     428 
    427429        allPathways = self.org.pathways() 
    428430        allRefPathways = obiKEGG.pathways("map") 
    429 #        self.progressBarFinished() 
     431 
    430432        items = [] 
    431433        self.progressBarInit() 
     
    434436                                progress_callback=self.progressBarSet) 
    435437        self.progressBarFinished() 
     438 
     439        org_code = self.organismCodes[min(self.organismIndex, 
     440                                          len(self.organismCodes)-1)] 
     441 
    436442        if self.showOrthology: 
    437443            self.koOrthology = obiKEGG.KEGGBrite("ko00001") 
    438444            self.listView.setRootIsDecorated(True) 
    439445            path_ids = set([s[-5:] for s in self.pathways.keys()]) 
     446 
    440447            def _walkCollect(koEntry): 
    441448                num = koEntry.title[:5] if koEntry.title else None 
    442                 if num  in path_ids: 
    443                     return [koEntry] + reduce(lambda li,c:li+_walkCollect(c), [child for child in koEntry.entries], []) 
     449                if num in path_ids: 
     450                    return [koEntry] + reduce(lambda li, c:li + _walkCollect(c), [child for child in koEntry.entries], []) 
    444451                else: 
    445                     c = reduce(lambda li,c:li+_walkCollect(c), [child for child in koEntry.entries], []) 
     452                    c = reduce(lambda li, c: li + _walkCollect(c), 
     453                               [child for child in koEntry.entries], []) 
    446454                    return c + (c and [koEntry] or []) 
    447             allClasses = reduce(lambda li1, li2: li1+li2, [_walkCollect(c) for c in self.koOrthology], []) 
     455 
     456            allClasses = reduce(lambda li1, li2: li1 + li2, 
     457                                [_walkCollect(c) for c in self.koOrthology], []) 
     458 
    448459            def _walkCreate(koEntry, lvItem): 
    449460                item = QTreeWidgetItem(lvItem) 
    450                 id = "path:"+self.organismCodes[min(self.organismIndex, len(self.organismCodes)-1)] + koEntry.title[:5] 
    451                 p = kegg_pathways.get_entry(id) 
     461                id = "path:" + org_code + koEntry.title[:5] 
     462 
    452463                if koEntry.title[:5] in path_ids: 
     464                    p = kegg_pathways.get_entry(id) 
    453465                    if p is None: 
    454                         # In case the genesets still have obsolete entries  
     466                        # In case the genesets still have obsolete entries 
    455467                        name = koEntry.title 
    456468                    else: 
     
    459471                    item.setText(0, name) 
    460472                    item.setText(1, "%.5f" % p_value) 
    461                     item.setText(2, "%i of %i" %(len(genes), len(self.genes))) 
    462                     item.setText(3, "%i of %i" %(ref, len(self.referenceGenes))) 
     473                    item.setText(2, "%i of %i" % (len(genes), len(self.genes))) 
     474                    item.setText(3, "%i of %i" % (ref, len(self.referenceGenes))) 
    463475                    item.pathway_id = id if p is not None else None 
    464476                else: 
    465                     item.setText(0, p.name if id in allPathways else koEntry.title) 
     477                    if id in allPathways: 
     478                        text = kegg_pathways.get_entry(id).name 
     479                    else: 
     480                        text = koEntry.title 
     481                    item.setText(0, text) 
     482 
    466483                    if id in allPathways: 
    467484                        item.pathway_id = id 
     
    470487                    else: 
    471488                        item.pathway_id = None 
    472                  
     489 
    473490                for child in koEntry.entries: 
    474491                    if child in allClasses: 
    475492                        _walkCreate(child, item) 
    476              
     493 
    477494            for koEntry in self.koOrthology: 
    478495                if koEntry in allClasses: 
    479496                    _walkCreate(koEntry, self.listView) 
    480                      
     497 
    481498            self.listView.update() 
    482499        else: 
    483500            self.listView.setRootIsDecorated(False) 
    484501            pathways = self.pathways.items() 
    485             pathways.sort(lambda a,b:cmp(a[1][1], b[1][1])) 
     502            pathways.sort(lambda a, b: cmp(a[1][1], b[1][1])) 
     503 
    486504            for id, (genes, p_value, ref) in pathways: 
    487505                item = QTreeWidgetItem(self.listView) 
    488506                item.setText(0, kegg_pathways.get_entry(id).name) 
    489507                item.setText(1, "%.5f" % p_value) 
    490                 item.setText(2, "%i of %i" %(len(genes), len(self.genes))) 
    491                 item.setText(3, "%i of %i" %(ref, len(self.referenceGenes))) 
     508                item.setText(2, "%i of %i" % (len(genes), len(self.genes))) 
     509                item.setText(3, "%i of %i" % (ref, len(self.referenceGenes))) 
    492510                item.pathway_id = id 
    493511                items.append(item) 
    494                  
     512 
    495513        self.bestPValueItem = items and items[0] or None 
    496514        self.listView.expandAll() 
     
    760778    def queuedInvoke(self, func): 
    761779        func() 
    762          
     780 
    763781    def progressBarSet(self, value): 
    764 #        print "Enter" 
    765782        if not getattr(self, "_in_progress_update", False): 
    766783            self._in_progress_update = True 
     
    769786            finally: 
    770787                self._in_progress_update = False 
    771 #        else: 
    772 #            print "=====" 
    773          
    774 #        print "Exit" 
    775      
     788 
    776789    def onDeleteWidget(self): 
    777790        """ Called before the widget is removed from the canvas. 
    778791        """ 
    779792        self.org = None 
    780         import gc 
    781         gc.collect() # Force collection 
     793        gc.collect()  # Force collection 
    782794         
    783795    def UpdateToLatestPathways(self): 
     
    812824                 for (id, genes, ref), p_val in zip(result_sets, p_values)] 
    813825                ) 
    814      
    815 if __name__=="__main__": 
     826 
     827if __name__ == "__main__": 
    816828    app = QApplication(sys.argv) 
    817829    data = orange.ExampleTable("brown-selected.tab") 
    818830    w = OWKEGGPathwayBrowser() 
    819831    w.UpdateOrganismComboBox() 
    820 ##    app.setMainWidget(w) 
    821832    w.show() 
    822833    w.SetData(orange.ExampleTable(data[:])) 
    823834    QTimer.singleShot(10, w.handleNewSignals) 
     835 
    824836    app.exec_() 
    825837    w.saveSettings() 
Note: See TracChangeset for help on using the changeset viewer.