source: orange-bioinformatics/_bioinformatics/widgets/OWGsea.py @ 1726:6778e0225b86

Revision 1726:6778e0225b86, 25.7 KB checked in by Ales Erjavec <ales.erjavec@…>, 17 months ago (diff)

Added new icons by Peter Cuhalev and replaced existing ones with expanded paths.

RevLine 
[188]1"""
2<name>GSEA</name>
[764]3<description>Gene set enrichment analysis.</description>
[188]4<contact>Marko Toplak (marko.toplak(@at@)gmail.com)</contact>
[1052]5<priority>2025</priority>
[1726]6<icon>icons/GSEA.svg</icon>
[188]7"""
8
[1632]9from __future__ import absolute_import, with_statement
10
[188]11from exceptions import Exception
[208]12import cPickle as pickle
[941]13from collections import defaultdict
[188]14
[1632]15from Orange.orng import orngServerFiles
16from Orange.orng.orngDataCaching import data_hints
17from Orange.OrangeWidgets import OWGUI
18from Orange.OrangeWidgets.OWWidget import *
19
20from .. import obiGene, obiGeneSets, obiGsea, obiKEGG
[1118]21
[188]22def nth(l, n):
23    return [ a[n] for a in l ]
24
25def clearListView(lw):
[189]26    lw.clear()
[1108]27
28def ne(a):
29    return a if a != None else ""
[188]30
[941]31def selectGenes(data, positions, how):
32    """ Select genes on given positions.
33    Parameter how specifies whether
34    examples or attributes should be selected. """
35    if how == "attributes":
36        newatts = [ data.domain.attributes[i] for i in positions ]
37        if data.domain.classVar:
38            domain = orange.Domain(newatts, data.domain.classVar)
39        else:
40            domain = orange.Domain(newatts, False)
41        domain.addmetas(data.domain.getmetas()) 
42        return orange.ExampleTable(domain, data)
43    elif how == "examples":
44        return orange.ExampleTable(data.domain, [data[i] for i in positions ])
[188]45
46def comboboxItems(combobox, newitems):
47    combobox.clear()
48    if newitems:
[189]49        combobox.insertItems(0, newitems)
[188]50        #combobox.setCurrentItem(i)
51
[427]52def exportDistanceMatrix(resl):
53    """
54    Input: results as a list of tuples
55    """
56    dm = orange.SymMatrix(len(resl))
57
58    for i in range(len(resl)-1):
59        for j in range(i+1, len(resl)):
[663]60            gen1 = set(resl[i][1]['genes'])
61            gen2 = set(resl[j][1]['genes'])
[427]62            dm[i,j] = float(len(gen1 & gen2)) / len(gen1 | gen2)
63
64    return dm
65
66def exportET(resl):
67    #do not sort them inside
68   
69    if len(resl) <= 0:
70        return None
71
[1108]72    def collectionn(gs):
73        return ",".join(gs.hierarchy) if gs.hierarchy else ""
[427]74
[1108]75    allCollections = sorted(set(collectionn(gs) for gs,_ in resl))
[427]76
77    vars = []
78    vars.append(orange.StringVariable("Name"))
[1044]79    vars.append(orange.EnumVariable("Collection", values=map(str,allCollections )))
[427]80    vars.append(orange.FloatVariable("NES"))
81    vars.append(orange.FloatVariable("ES"))
82    vars.append(orange.FloatVariable("P-value"))
83    vars.append(orange.FloatVariable("FDR"))
84    vars.append(orange.StringVariable("Geneset size"))
85    vars.append(orange.StringVariable("Matched size"))
86    vars.append(orange.StringVariable("Genes"))
87
88    domain = orange.Domain(vars, False)
89
90    examples = []
[1108]91    for gs, dicr in resl:
92        examples.append([str(ne(gs.id) + " " + ne(gs.name)), str(ne(collectionn(gs))), dicr['nes'], 
93        dicr['es'], dicr['p'], min(dicr['fdr'],1.0), str(dicr['size']), str(dicr['matched_size']),  ", ".join(dicr['genes'])])
[427]94
95    return orange.ExampleTable(domain, examples)
96
97
98
99
[190]100class PhenotypesSelection(QGroupBox):
[395]101    """
102    Window indices:
103    0 - left chooser
104    1 - right chooser
[188]105
[395]106    wishedState: 0 not choosen anywhere, 1 choosen in left, 2 in right
107    """
108
109    def __init__(self, parent):
[190]110        QObject.__init__(self)
111        grid = OWGUI.widgetBox(parent, "", orientation = "horizontal")
[188]112        grid.setMinimumWidth(250)
113        grid.setMinimumHeight(100)
114
[395]115        self.boxes = [ OWGUI.listBox(grid, self) for a in range(2) ]
116
117        for box in self.boxes: 
118            #box.setSelectionMode(QListWidget.SingleSelection)
119            box.setSelectionMode(QListWidget.MultiSelection)
120
121        self.connect(self.boxes[0], SIGNAL("itemSelectionChanged ()"), self.highlighted1)
122        self.connect(self.boxes[1], SIGNAL("itemSelectionChanged ()"), self.highlighted2)
[188]123
124        self.classes = []
125
126        def createSquarePixmap(color = Qt.black):
[395]127            return OWGUI.createAttributePixmap("", color)
[188]128
[395]129        self.whiteSq = createSquarePixmap(Qt.white)
130        self.marked = [ createSquarePixmap(Qt.red), createSquarePixmap(Qt.blue) ]
[188]131
132        self.classVals = []
133
[395]134    def selectWanted(self):
[188]135
[395]136        #prevent selection events when chenging here
137        self.disableNot = True
[188]138
[395]139        """
140        Changes have to be calculated. Apply only changes because of potential
141        troubles with flickering.
142        """
143
144        def disable(n, i):
145            self.boxes[n].item(i).setIcon(self.whiteSq)
146            if self.boxes[n].item(i) in self.boxes[n].selectedItems():
147                modind = self.boxes[n].model().index(i, 0)
148                self.boxes[n].selectionModel().select(modind, QItemSelectionModel.Deselect)
149
150        def enable(n, i):
151            self.boxes[n].item(i).setIcon(self.marked[n])
152            if self.boxes[n].item(i) not in self.boxes[n].selectedItems():
153                modind = self.boxes[n].model().index(i, 0)
154                self.boxes[n].selectionModel().select(modind, QItemSelectionModel.Select)
155
156        for boxi in range(2):
157
158            toDisable = [ i for i in range(len(self.classVals)) \
159                if self.wishedState[i] != boxi+1 ]
160
161            for i in toDisable:
162                disable(boxi, i)
163
164            #enable every not choosen one that is wished
165            toEnable = [ i for i in range(len(self.classVals)) \
166                if self.wishedState[i] == boxi+1 ]
167
168            for i in toEnable:
169                enable(boxi, i)
170
171        #allow selection events
172        self.disableNot = False
173
174        #print self.getSelection(), self.wishedState
175
176    def highlighted(self, n):
177        """
178        Clicked on a i-th item of box n
179        """
180
181        selected = [ self.boxes[n].row(a) for a in self.boxes[n].selectedItems() ]
182
183        if self.disableNot:
184            return
185
186        for i in range(len(self.classVals)):
187            #print i, selected
188            if i in selected:
189                self.wishedState[i] = n+1 
190            elif self.wishedState[i] == n+1:
191                self.wishedState[i] = 0
[188]192
193        self.selectWanted()
194
[395]195    def highlighted1(self): return self.highlighted(0)
196    def highlighted2(self): return self.highlighted(1)
[188]197
[395]198    def setClasses(self, input, s1=0, s2=1):
[188]199
[705]200        if input is not None:
201            self.classVals = sorted(input)
202            self.wishedState = [ 0 ] * len(self.classVals)
[188]203
[705]204            self.wishedState[s1] = 1
205            self.wishedState[s2] = 2
[188]206
[705]207            self.setupBoxes()
208            self.selectWanted()
[942]209        else:
210            self.classVals = []
211            self.setupBoxes()
212            self.selectWanted()
213 
[188]214    def getSelection(self):
[395]215        sels = [ [ self.classVals[i] for i,a in enumerate(self.wishedState) if a == n+1 ]
216            for n in range(2) ]
217        return sels
[188]218
219    def setupBoxes(self):
[395]220        for box in self.boxes:
221            self.setupBox(box)
[188]222
223    def setupBox(self, box):
[395]224        # clear and fill box
225
[188]226        box.clear()
[395]227        for i,cv in enumerate(self.classVals):
228            box.insertItem(i, cv)
229            box.item(i).setIcon(self.whiteSq)
230
[188]231        if not self.classVals:
232            box.setDisabled(True)
233        else:
234            box.setDisabled(False)
235
236class OWGsea(OWWidget):
[394]237    settingsList = ["name", 
238                    "perms", 
239                    "minSubsetSize", 
240                    "minSubsetSizeC", 
241                    "maxSubsetSize", 
242                    "maxSubsetSizeC", 
243                    "minSubsetPart", 
244                    "minSubsetPartC", 
245                    "ptype", 
[395]246                    "loadFileName",
[536]247                    "gridSels",
[516]248                    "csgm",
249                    "gsgo",
[938]250                    "gskegg",
[1042]251                    "buildDistances",
[1063]252                    "organismIndex",
253                    "atLeast"]
[1042]254
255    def UpdateOrganismComboBox(self):
256        try:
257            self.progressBarInit()
258            with orngServerFiles.DownloadProgress.setredirect(self.progressBarSet):
259                genome = obiKEGG.KEGGGenome()
260            self.progressBarFinished()
261           
262            self.allOrganismCodes = genome
263   
264            essential = genome.essential_organisms()
265           
266            local = [name.split(".")[0].split("_")[-1] for name in orngServerFiles.listfiles("KEGG") if "kegg_genes" in name]
267            self.organismCodes = [(code, organism.definition) for code, organism in self.allOrganismCodes.items() if code in local or code in essential]
268            self.organismCodes.sort()
269            items = [desc for code, desc in self.organismCodes]
[1108]270            self.organismCodes = [obiKEGG.to_taxid(code) for code, desc in self.organismCodes]
[1042]271           
272            self.organismComboBox.addItems(items)
273        finally:
[1272]274            self.signalManager.freeze(self).pop() #setFreeze(0)
[1042]275
[188]276
277    def __init__(self, parent=None, signalManager = None, name='GSEA'):
278        OWWidget.__init__(self, parent, signalManager, name)
279
280        self.inputs = [("Examples", ExampleTable, self.setData)]
[194]281        self.outputs = [("Examples with selected genes only", ExampleTable), ("Results", ExampleTable), ("Distance Matrix", orange.SymMatrix) ]
[188]282
283        self.res = None
[210]284        self.dm = None
285       
[188]286        self.name = 'GSEA'
287        self.minSubsetSize = 3
288        self.minSubsetSizeC = True
289        self.maxSubsetSize = 1000
290        self.maxSubsetSizeC = True
291        self.minSubsetPart = 10
292        self.minSubsetPartC = True
293        self.perms = 100
[938]294        self.csgm = False
[516]295        self.gsgo = False
296        self.gskegg = False
[938]297        self.buildDistances = False
[939]298        self.selectedPhenVar = 0
[1042]299        self.organismIndex = 0
[1063]300        self.atLeast = 3
[188]301
302        self.permutationTypes =  [("Phenotype", "p"),("Gene", "g") ]
303        self.ptype = 0
304
305        self.correlationTypes = [ ("Signal2Noise", "s2n") ]
306        self.ctype = 0
[394]307       
[188]308        self.data = None
309        self.geneSets = {}
310
[406]311        self.tabs = OWGUI.tabWidget(self.controlArea)
[188]312
[406]313        ca = OWGUI.createTabPage(self.tabs, "Basic")
[1042]314
[395]315        box = OWGUI.widgetBox(ca, 'Organism')
[1042]316        #FROM KEGG WIDGET - organism selection
317        self.allOrganismCodes = {}
318        self.organismCodes = []
319        self.organismComboBox = cb = OWGUI.comboBox(box, self, "organismIndex", items=[], debuggingEnabled=0) #changed
320        cb.setMaximumWidth(200)
[1272]321        self.signalManager.freeze(self).push() #setFreeze(1)
[1042]322        QTimer.singleShot(100, self.UpdateOrganismComboBox)
[939]323 
[1063]324        #OWGUI.checkBox(box, self, "csgm", "Case sensitive gene matching")
[188]325
[939]326        box2 = OWGUI.widgetBox(ca, "Descriptors")
327        self.phenCombo = OWGUI.comboBox(box2, self, "selectedPhenVar", items=[], callback=self.phenComboChange, label="Phenotype:")
328        self.geneCombo = OWGUI.comboBox(box2, self, "selectedGeneVar", items=[], label = "Gene:")
[938]329
[942]330        self.allowComboChangeCallback = False
331
[188]332        ma = self.mainArea
333
[189]334        self.listView = QTreeWidget(ma)
335        ma.layout().addWidget(self.listView)
336        self.listView.setAllColumnsShowFocus(1)
[201]337        self.listView.setColumnCount(9)
338        self.listView.setHeaderLabels(["Collection", "Geneset", "NES", "ES", "P-value", "FDR", "Size", "Matched Size", "Genes"])
[189]339       
340        self.listView.header().setStretchLastSection(True)
[200]341        self.listView.header().setClickable(True)
342        self.listView.header().setSortIndicatorShown(True)
343        self.listView.setSortingEnabled(True)
[193]344        #self.listView.header().setResizeMode(0, QHeaderView.Stretch)
[189]345       
[193]346        self.listView.setSelectionMode(QAbstractItemView.NoSelection)
[189]347        self.connect(self.listView, SIGNAL("itemSelectionChanged()"), self.newPathwaySelected)
[188]348
349        OWGUI.separator(ca)
350
[406]351        OWGUI.widgetLabel(ca, "Phenotype selection:")
352        self.psel = PhenotypesSelection(ca)
[189]353       
[188]354        self.resize(600,50)
355 
356        OWGUI.separator(ca)
[938]357
358        OWGUI.checkBox(ca, self, "buildDistances", "Compute geneset distances")
359
[188]360        self.btnApply = OWGUI.button(ca, self, "&Compute", callback = self.compute, disabled=0)
[208]361       
362        fileBox = OWGUI.widgetBox(ca, orientation='horizontal')
[1177]363        OWGUI.button(fileBox, self, "Load", callback = self.loadData, disabled=0, debuggingEnabled=0)
364        OWGUI.button(fileBox, self, "Save", callback = self.saveData, disabled=0, debuggingEnabled=0)
[406]365 
366        #ca.layout().addStretch(1)
367
368        ca = OWGUI.createTabPage(self.tabs, "Gene sets")
[208]369       
[406]370        box = OWGUI.widgetBox(ca)
371
372        self.gridSel = []
[1108]373        self.geneSel = []  #FIXME temporary disabled - use the same as in new "David" widget
[406]374        self.lbgs = OWGUI.listBox(box, self, "gridSel", "geneSel", selectionMode = QListWidget.MultiSelection)
[1177]375        OWGUI.button(box, self, "From &File", callback = self.addCollection, disabled=0, debuggingEnabled=0)
[406]376
[516]377        box = OWGUI.widgetBox(box, "Additional sources:")
378        OWGUI.checkBox(box, self, "gskegg", "KEGG pathways")
379        OWGUI.checkBox(box, self, "gsgo", "GO terms")
380 
[406]381        #ca.layout().addStretch(1)
382
383        ca = OWGUI.createTabPage(self.tabs, "Settings")
384        box = OWGUI.widgetBox(ca, 'Properties')
385
386        self.permTypeF = OWGUI.comboBoxWithCaption(box, self, "ptype", items=nth(self.permutationTypes, 0), \
[1063]387            tooltip="Permutation type.", label="Permute")
[406]388        _ = OWGUI.spin(box, self, "perms", 50, 1000, orientation="horizontal", label="Times")
389        self.corTypeF = OWGUI.comboBoxWithCaption(box, self, "ctype", items=nth(self.correlationTypes, 0), \
390            tooltip="Correlation type.", label="Correlation")
391
[1063]392
[406]393        box = OWGUI.widgetBox(ca, 'Subset Filtering')
394
395        _,_ = OWGUI.checkWithSpin(box, self, "Min. Subset Size", 1, 10000, "minSubsetSizeC", "minSubsetSize", "") #TODO check sizes
396        _,_ = OWGUI.checkWithSpin(box, self, "Max. Subset Size", 1, 10000, "maxSubsetSizeC", "maxSubsetSize", "")
397        _,_ = OWGUI.checkWithSpin(box, self, "Min. Subset Part (%)", 1, 100, "minSubsetPartC", "minSubsetPart", "")
398
[1063]399        box = OWGUI.widgetBox(ca, 'Gene Filtering')
400
401        _ = OWGUI.spin(box, self, "atLeast", 2, 10, label="Min. Values in Group")
402
[406]403        ca.layout().addStretch(1)
404
[395]405        self.addComment("Computation was not started.")
[188]406
[395]407        if sys.platform == "darwin":
408            self.loadFileName = user.home
409        else:
410            self.loadFileName = "."
[188]411
[536]412        self.gridSels = []
[395]413        self.loadSettings()
414 
415        def cleanInvalid(maxn):
416            """
417            Removes invalid gene set selection
418            """
419            notAllOk = True
420
421            while notAllOk:
[536]422                self.gridSels = getattr(self, "gridSels")
[395]423                notAllOk = False
[536]424                for i,a in enumerate(self.gridSels):
[395]425                    if a >= maxn:
[536]426                        self.gridSels.pop(i)
[395]427                        notAllOk = True
428                        break
[536]429       
430        cleanInvalid(len(self.geneSel))
[395]431
[536]432        self.gridSel = self.gridSels
433        self.gridSels = self.gridSel
[395]434
435    def addCollection(self):
436        fname = self.chooseGeneSetsFile()
[536]437
[395]438        if fname:
439            if fname not in self.geneSel:
[536]440       
441                #add it to the list, choose it and keep
442                #all old choosen
443                gridSelc = list(self.gridSel)
444
[395]445                self.geneSel.append(fname)
[536]446                self.geneSel = self.geneSel
[395]447
[536]448                gridSelc.append(len(self.geneSel)-1)
449           
450                self.gridSel = gridSelc
451                self.gridSels = self.gridSel #for saving
452
[395]453
[208]454    def saveData(self):
455        self.warning('')
456       
457        if self.res != None:
458            filename = QFileDialog.getSaveFileName(self, 'Save GSEA data', '', 'GSEA files (*.gsea)')
459            if filename:
460                fn = ""
461                head, tail = os.path.splitext(str(filename))
462                if not tail:
463                    fn = head + ".gsea"
464                else:
465                    fn = str(filename)
[210]466                   
467                fp = open(fn, "wb" )
[218]468                pickle.dump(self.res, fp, -1)
469                pickle.dump(self.dm, fp, -1)
[210]470                fp.close()
[208]471        else:
472            self.warning('No internal data to save.')
473   
[394]474    def loadData(self):               
475        self.loadFileName = str(QFileDialog.getOpenFileName(self, 'Open GSEA data', self.loadFileName, "GSEA files (*.gsea)"))
476        if self.loadFileName == "": 
477            if sys.platform == "darwin":
478                self.loadFileName = user.home
479            else:
480                self.loadFileName = "."
481            return
[208]482       
[394]483        fp = open(self.loadFileName, "rb")
[210]484        res = pickle.load(fp)
485       
486        try:
487            dm = pickle.load(fp)
488        except:
489            dm = None
490       
491        fp.close()
492       
493        self.compute(res, dm)
[188]494
[193]495    def newPathwaySelected(self):
[395]496        #print "newPathwaySelected"
[188]497        qApp.processEvents()
498
499        if not self.selectable:
500            return
501
[942]502        if self.res == None:
503            return
504
[193]505        outat = set([])
506        for item in self.listView.selectedItems():
507            iname = self.lwiToGeneset[item]
[663]508            outat.update(self.res[iname]['genes'])
[941]509
510        #print "OUTGENES",  outat
511
512        select = sorted(set(reduce(lambda x,y: x | y, 
513            [ set(self.find_genes_dic[name]) for name in outat ],
514            set())))
515
516        #print "SELECT", select
[193]517           
[941]518        dataOut = selectGenes(self.data, select, self.find_genes_loc)
[188]519        self.send("Examples with selected genes only", dataOut)
520
521    def resultsOut(self, data):
522        self.send("Results", data)
523
[194]524    def genesetDistOut(self, dm):
525        self.send("Distance Matrix", dm)
526
[188]527
528    def fillResults(self, res):
529        clearListView(self.listView)
530
531        self.lwiToGeneset = {}
532
533        def writeGenes(g):
[663]534            return ", ".join(g)
[188]535
[1108]536        for gs, rdic in res.items():
537            collection = ",".join(gs.hierarchy) if gs.hierarchy else ""
538            name = ne(gs.id) + " " + ne(gs.name)
[189]539            item = QTreeWidgetItem(self.listView)
[201]540            item.setText(0, collection)
[1108]541            item.setText(1, name)
[663]542            item.setText(2, "%0.3f" % rdic['nes'])
543            item.setText(3, "%0.3f" % rdic['es'])
544            item.setText(4, "%0.3f" % rdic['p'])
545            item.setText(5, "%0.3f" % min(rdic['fdr'],1.0))
546            item.setText(6, str(rdic['size']))
547            item.setText(7, str(rdic['matched_size']))
548            item.setText(8, writeGenes(rdic['genes']))
[188]549
[1108]550            self.lwiToGeneset[item] = gs
[188]551
552    def addComment(self, comm):
[189]553        item = QTreeWidgetItem(self.listView)
554        item.setText(0, comm)   
[188]555
556    def setSelMode(self, bool):
557        if bool:
558            self.selectable = True
[406]559            self.listView.setSelectionMode(QAbstractItemView.ExtendedSelection)
[188]560        else:
561            self.selectable = False
562            self.listView.setSelectionMode(QListView.NoSelection)
563
[210]564    def compute(self, res=None, dm=None):
[395]565
566        collectionNames = [ self.geneSel[a] for a in self.gridSel ]
[516]567
[1042]568        organism = self.organismCodes[self.organismIndex]
[516]569
570        if self.gsgo:
[1108]571            collectionNames.append((("GO",),organism))
[516]572        if self.gskegg:
[1108]573            collectionNames.append((("KEGG",),organism))
[516]574
[1108]575        self.geneSets = obiGeneSets.collections(*collectionNames)
[395]576
[188]577        self.resultsOut(None)
578
579        qApp.processEvents()
[210]580        self.res = res
581        self.dm = dm
[942]582
583        clearListView(self.listView)
584        self.addComment("Computing...")
585        qApp.processEvents()
586
[941]587        self.phenVar = self.phenCands[self.selectedPhenVar][0]
588        self.geneVar = self.geneCands[self.selectedGeneVar]
589
[210]590        if self.res == None and self.data:
[188]591            self.setSelMode(False)
592
593            pb = OWGUI.ProgressBar(self, iterations=self.perms+2)
594
595            if hasattr(self, "btnApply"):
596                self.btnApply.setFocus()
597
[705]598            kwargs = {}
599            dkwargs = {}
[395]600
[941]601            dkwargs["phenVar"] = self.phenVar
602            dkwargs["geneVar"] = self.geneVar
603
[939]604            if not obiGsea.already_have_correlations(self.data):
605
[705]606                selectedClasses = self.psel.getSelection()
607                fc = "Phenotype group empty. Stopped."
608                if len(selectedClasses[0]) == 0:
609                    self.addComment(fc)
610                    return
611                elif len(selectedClasses[1]) == 0:
612                    self.addComment(fc)
613                    return
614
615                dkwargs["classValues"] = selectedClasses
616
[1063]617                dkwargs["atLeast"] = self.atLeast
618
[705]619                permtype = self.permutationTypes[self.ptype][1]
620                kwargs["permutation"] = "class" if permtype == "p" else "genes"
[188]621
622            def ifr(case, t, f):
623                if case: return t
624                else: return f
625
626            kwargs["minSize"] = \
627                ifr(self.minSubsetSizeC, self.minSubsetSize, 1)
628            kwargs["maxSize"] = \
629                ifr(self.maxSubsetSizeC, self.maxSubsetSize, 1000000)
630            kwargs["minPart"] = \
631                ifr(self.minSubsetPartC, self.minSubsetPart/100.0, 0.0)
632
[490]633
[1063]634            #create gene matcher
[1173]635            genematcher = obiGene.matcher([[obiGene.GMKEGG(organism)] + ([obiGene.GMDicty()] if organism == "352472"  else [])])
[1063]636
637            #dkwargs["caseSensitive"] = self.csgm
638
639            gso = obiGsea.GSEA(self.data, matcher=genematcher, **dkwargs)
[188]640
[1108]641           
642            for gs in self.geneSets:
643                gso.addGenesets([gs])
[188]644                qApp.processEvents()
645
646            self.res = gso.compute(n=self.perms, callback=pb.advance, **kwargs)
647           
648            pb.finish()
[208]649           
650        if self.res != None:
[188]651            if len(self.res) > 0:
652                self.fillResults(self.res)
653                self.setSelMode(True)
[194]654                resl = self.res.items()
655
[427]656                etres = exportET(resl)
[938]657                self.resultsOut(etres)
[194]658
[941]659                self.find_genes_dic, self.find_genes_loc = \
660                    find_genes_dic(self.res, self.data, self.geneVar)
661
[938]662                if self.buildDistances:
663                    if self.dm == None:
664                        self.dm = exportDistanceMatrix(resl)
665                       
666                        for ex in etres:
667                            ex.name = str(ex[0])
668                        self.dm.setattr("items", etres)
669                else:
670                    self.dm = None
[194]671
[188]672            else:
673                self.setSelMode(False)
674                clearListView(self.listView)
[938]675                self.dm = None
[188]676                self.addComment("No genesets found.")
677
[938]678            self.genesetDistOut(self.dm)
679
[188]680
681    def setData(self, data):
[942]682
683        self.allowComboChangeCallback = False
684
[188]685        self.data = data
686
687        if data:
[1118]688            taxid = data_hints.get_hint(data, "taxid", None)
[1104]689            try:
[1118]690                code = obiKEGG.from_taxid(taxid)
[1104]691                self.organismIndex = self.organismCodes.index(code)
692            except Exception, ex:
693                pass
694           
[939]695            if obiGsea.already_have_correlations(data):
[705]696
[188]697                #disable correlation type
698                comboboxItems(self.corTypeF, [])
699                self.corTypeF.setDisabled(True)
700                #set permutation type to fixed
[705]701                self.ptype = 1
[188]702                self.permTypeF.setDisabled(True)
[939]703
[188]704            else:
705                #enable correlation type
706                comboboxItems(self.corTypeF, nth(self.correlationTypes, 0))
707                self.corTypeF.setDisabled(False)
708                #allow change of permutation type
709                self.permTypeF.setDisabled(False)
[395]710                #print "set classes"
[939]711
[940]712            self.phenCombo.clear()
713            self.phenCands = obiGsea.phenotype_cands(data)
714            self.phenCombo.addItems(map(lambda x: str(x[0]), self.phenCands))
[939]715
[940]716            self.phenCombo.setDisabled(len(self.phenCands) <= 1)
[939]717
[940]718            self.selectedPhenVar = 0
[942]719
720            self.allowComboChangeCallback = True
721
[940]722            self.phenComboChange()
[939]723
724
[942]725
[939]726    def phenComboChange(self):
[942]727
728        if self.allowComboChangeCallback == False:
729            return
730
[939]731        pv = self.phenCands[self.selectedPhenVar]
[942]732
[940]733        self.psel.setClasses(pv[1] if len(pv[1]) > 0 else None)
[939]734
735        def conv(x):
736            if x == True:
737                return "Attribute names"
738            else:
739                return str(x)
740
741        self.geneCombo.clear()
[940]742
743        look_cols = obiGsea.is_variable(pv[0])
744
745        if obiGsea.already_have_correlations(self.data):
746            look_cols = not obiGsea.need_to_transpose_single(self.data)
747
748        self.geneCands = obiGsea.gene_cands(self.data, look_cols)
[939]749        self.geneCombo.addItems(map(lambda x: conv(x), self.geneCands))
750        self.selectedGeneVar = 0
751
752        self.geneCombo.setDisabled(len(self.geneCands) <= 1)
[188]753
[395]754    def chooseGeneSetsFile(self):
755        """
756        Return choosen gene sets file name or None, if no file
757        was choosen.
758        """
[1095]759        filename = str(QFileDialog.getOpenFileName(self,  "Choose gene set collection", './', "Gene Collections (*.gmt)"))
[395]760        return filename
[188]761
[941]762def find_genes_dic(res, data, geneVar):
763    """
764    Builds a dictionary of where to find the genes to
765    avoid delay with choosing them.
766
767    If geneVar is True or it is a group parameter, then
768    use columns as genes: out of genes select only
769    those contained in selected pathways.
770    """
771
772    def rorq(a, name):
773        """ Group annatation or question mark. """
774        try: 
775            return a.attributes[name]
776        except: 
777            return '?'
778
779    d = defaultdict(list)
780    if geneVar == True or geneVar in obiGsea.allgroups(data):
781        for i,a in enumerate(data.domain.attributes):
782            if geneVar == True:
783                d[a.name].append(i)
784            else:
785                d[rorq(a, geneVar)].append(i)
786        return d, "attributes"
787    else:
788        for i,ex in enumerate(data):
789            d[ex[geneVar].value].append(i)
790        return d, "examples"
[188]791
792if __name__=="__main__":
793    a=QApplication(sys.argv)
794    ow=OWGsea()
795    ow.show()
796
[938]797    #d = orange.ExampleTable('/home/marko/testData.tab')
[1108]798    d = orange.ExampleTable('/home/marko/orange/add-ons/Bioinformatics/sterolTalkHepa.tab')
799    #d = orange.ExampleTable('/home/marko/ddd.tab')
[940]800    #d = orange.ExampleTable('tmp.tab')
[1044]801    #d = orange.ExampleTable('../gene_three_lines_log.tab')
[395]802    ow.setData(d)
803
804    a.exec_()
[188]805    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.