source: orange-bioinformatics/_bioinformatics/widgets/OWGsea.py @ 1748:3a6c3d41aaee

Revision 1748:3a6c3d41aaee, 25.8 KB checked in by Ales Erjavec <ales.erjavec@…>, 12 months ago (diff)

Test for the presence of 'self.signalManager'.

A default global signalManager is no longer provided by OWBaseWidget.

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:
[1748]274            if self.signalManager:
275                self.signalManager.freeze(self).pop()
[1042]276
[188]277
278    def __init__(self, parent=None, signalManager = None, name='GSEA'):
279        OWWidget.__init__(self, parent, signalManager, name)
280
281        self.inputs = [("Examples", ExampleTable, self.setData)]
[194]282        self.outputs = [("Examples with selected genes only", ExampleTable), ("Results", ExampleTable), ("Distance Matrix", orange.SymMatrix) ]
[188]283
284        self.res = None
[210]285        self.dm = None
286       
[188]287        self.name = 'GSEA'
288        self.minSubsetSize = 3
289        self.minSubsetSizeC = True
290        self.maxSubsetSize = 1000
291        self.maxSubsetSizeC = True
292        self.minSubsetPart = 10
293        self.minSubsetPartC = True
294        self.perms = 100
[938]295        self.csgm = False
[516]296        self.gsgo = False
297        self.gskegg = False
[938]298        self.buildDistances = False
[939]299        self.selectedPhenVar = 0
[1042]300        self.organismIndex = 0
[1063]301        self.atLeast = 3
[188]302
303        self.permutationTypes =  [("Phenotype", "p"),("Gene", "g") ]
304        self.ptype = 0
305
306        self.correlationTypes = [ ("Signal2Noise", "s2n") ]
307        self.ctype = 0
[394]308       
[188]309        self.data = None
310        self.geneSets = {}
311
[406]312        self.tabs = OWGUI.tabWidget(self.controlArea)
[188]313
[406]314        ca = OWGUI.createTabPage(self.tabs, "Basic")
[1042]315
[395]316        box = OWGUI.widgetBox(ca, 'Organism')
[1042]317        #FROM KEGG WIDGET - organism selection
318        self.allOrganismCodes = {}
319        self.organismCodes = []
320        self.organismComboBox = cb = OWGUI.comboBox(box, self, "organismIndex", items=[], debuggingEnabled=0) #changed
321        cb.setMaximumWidth(200)
[1748]322
323        if self.signalManager:
324            self.signalManager.freeze(self).push()
[1042]325        QTimer.singleShot(100, self.UpdateOrganismComboBox)
[939]326 
[1063]327        #OWGUI.checkBox(box, self, "csgm", "Case sensitive gene matching")
[188]328
[939]329        box2 = OWGUI.widgetBox(ca, "Descriptors")
330        self.phenCombo = OWGUI.comboBox(box2, self, "selectedPhenVar", items=[], callback=self.phenComboChange, label="Phenotype:")
331        self.geneCombo = OWGUI.comboBox(box2, self, "selectedGeneVar", items=[], label = "Gene:")
[938]332
[942]333        self.allowComboChangeCallback = False
334
[188]335        ma = self.mainArea
336
[189]337        self.listView = QTreeWidget(ma)
338        ma.layout().addWidget(self.listView)
339        self.listView.setAllColumnsShowFocus(1)
[201]340        self.listView.setColumnCount(9)
341        self.listView.setHeaderLabels(["Collection", "Geneset", "NES", "ES", "P-value", "FDR", "Size", "Matched Size", "Genes"])
[189]342       
343        self.listView.header().setStretchLastSection(True)
[200]344        self.listView.header().setClickable(True)
345        self.listView.header().setSortIndicatorShown(True)
346        self.listView.setSortingEnabled(True)
[193]347        #self.listView.header().setResizeMode(0, QHeaderView.Stretch)
[189]348       
[193]349        self.listView.setSelectionMode(QAbstractItemView.NoSelection)
[189]350        self.connect(self.listView, SIGNAL("itemSelectionChanged()"), self.newPathwaySelected)
[188]351
352        OWGUI.separator(ca)
353
[406]354        OWGUI.widgetLabel(ca, "Phenotype selection:")
355        self.psel = PhenotypesSelection(ca)
[189]356       
[188]357        self.resize(600,50)
358 
359        OWGUI.separator(ca)
[938]360
361        OWGUI.checkBox(ca, self, "buildDistances", "Compute geneset distances")
362
[188]363        self.btnApply = OWGUI.button(ca, self, "&Compute", callback = self.compute, disabled=0)
[208]364       
365        fileBox = OWGUI.widgetBox(ca, orientation='horizontal')
[1177]366        OWGUI.button(fileBox, self, "Load", callback = self.loadData, disabled=0, debuggingEnabled=0)
367        OWGUI.button(fileBox, self, "Save", callback = self.saveData, disabled=0, debuggingEnabled=0)
[406]368 
369        #ca.layout().addStretch(1)
370
371        ca = OWGUI.createTabPage(self.tabs, "Gene sets")
[208]372       
[406]373        box = OWGUI.widgetBox(ca)
374
375        self.gridSel = []
[1108]376        self.geneSel = []  #FIXME temporary disabled - use the same as in new "David" widget
[406]377        self.lbgs = OWGUI.listBox(box, self, "gridSel", "geneSel", selectionMode = QListWidget.MultiSelection)
[1177]378        OWGUI.button(box, self, "From &File", callback = self.addCollection, disabled=0, debuggingEnabled=0)
[406]379
[516]380        box = OWGUI.widgetBox(box, "Additional sources:")
381        OWGUI.checkBox(box, self, "gskegg", "KEGG pathways")
382        OWGUI.checkBox(box, self, "gsgo", "GO terms")
383 
[406]384        #ca.layout().addStretch(1)
385
386        ca = OWGUI.createTabPage(self.tabs, "Settings")
387        box = OWGUI.widgetBox(ca, 'Properties')
388
389        self.permTypeF = OWGUI.comboBoxWithCaption(box, self, "ptype", items=nth(self.permutationTypes, 0), \
[1063]390            tooltip="Permutation type.", label="Permute")
[406]391        _ = OWGUI.spin(box, self, "perms", 50, 1000, orientation="horizontal", label="Times")
392        self.corTypeF = OWGUI.comboBoxWithCaption(box, self, "ctype", items=nth(self.correlationTypes, 0), \
393            tooltip="Correlation type.", label="Correlation")
394
[1063]395
[406]396        box = OWGUI.widgetBox(ca, 'Subset Filtering')
397
398        _,_ = OWGUI.checkWithSpin(box, self, "Min. Subset Size", 1, 10000, "minSubsetSizeC", "minSubsetSize", "") #TODO check sizes
399        _,_ = OWGUI.checkWithSpin(box, self, "Max. Subset Size", 1, 10000, "maxSubsetSizeC", "maxSubsetSize", "")
400        _,_ = OWGUI.checkWithSpin(box, self, "Min. Subset Part (%)", 1, 100, "minSubsetPartC", "minSubsetPart", "")
401
[1063]402        box = OWGUI.widgetBox(ca, 'Gene Filtering')
403
404        _ = OWGUI.spin(box, self, "atLeast", 2, 10, label="Min. Values in Group")
405
[406]406        ca.layout().addStretch(1)
407
[395]408        self.addComment("Computation was not started.")
[188]409
[395]410        if sys.platform == "darwin":
411            self.loadFileName = user.home
412        else:
413            self.loadFileName = "."
[188]414
[536]415        self.gridSels = []
[395]416        self.loadSettings()
417 
418        def cleanInvalid(maxn):
419            """
420            Removes invalid gene set selection
421            """
422            notAllOk = True
423
424            while notAllOk:
[536]425                self.gridSels = getattr(self, "gridSels")
[395]426                notAllOk = False
[536]427                for i,a in enumerate(self.gridSels):
[395]428                    if a >= maxn:
[536]429                        self.gridSels.pop(i)
[395]430                        notAllOk = True
431                        break
[536]432       
433        cleanInvalid(len(self.geneSel))
[395]434
[536]435        self.gridSel = self.gridSels
436        self.gridSels = self.gridSel
[395]437
438    def addCollection(self):
439        fname = self.chooseGeneSetsFile()
[536]440
[395]441        if fname:
442            if fname not in self.geneSel:
[536]443       
444                #add it to the list, choose it and keep
445                #all old choosen
446                gridSelc = list(self.gridSel)
447
[395]448                self.geneSel.append(fname)
[536]449                self.geneSel = self.geneSel
[395]450
[536]451                gridSelc.append(len(self.geneSel)-1)
452           
453                self.gridSel = gridSelc
454                self.gridSels = self.gridSel #for saving
455
[395]456
[208]457    def saveData(self):
458        self.warning('')
459       
460        if self.res != None:
461            filename = QFileDialog.getSaveFileName(self, 'Save GSEA data', '', 'GSEA files (*.gsea)')
462            if filename:
463                fn = ""
464                head, tail = os.path.splitext(str(filename))
465                if not tail:
466                    fn = head + ".gsea"
467                else:
468                    fn = str(filename)
[210]469                   
470                fp = open(fn, "wb" )
[218]471                pickle.dump(self.res, fp, -1)
472                pickle.dump(self.dm, fp, -1)
[210]473                fp.close()
[208]474        else:
475            self.warning('No internal data to save.')
476   
[394]477    def loadData(self):               
478        self.loadFileName = str(QFileDialog.getOpenFileName(self, 'Open GSEA data', self.loadFileName, "GSEA files (*.gsea)"))
479        if self.loadFileName == "": 
480            if sys.platform == "darwin":
481                self.loadFileName = user.home
482            else:
483                self.loadFileName = "."
484            return
[208]485       
[394]486        fp = open(self.loadFileName, "rb")
[210]487        res = pickle.load(fp)
488       
489        try:
490            dm = pickle.load(fp)
491        except:
492            dm = None
493       
494        fp.close()
495       
496        self.compute(res, dm)
[188]497
[193]498    def newPathwaySelected(self):
[395]499        #print "newPathwaySelected"
[188]500        qApp.processEvents()
501
502        if not self.selectable:
503            return
504
[942]505        if self.res == None:
506            return
507
[193]508        outat = set([])
509        for item in self.listView.selectedItems():
510            iname = self.lwiToGeneset[item]
[663]511            outat.update(self.res[iname]['genes'])
[941]512
513        #print "OUTGENES",  outat
514
515        select = sorted(set(reduce(lambda x,y: x | y, 
516            [ set(self.find_genes_dic[name]) for name in outat ],
517            set())))
518
519        #print "SELECT", select
[193]520           
[941]521        dataOut = selectGenes(self.data, select, self.find_genes_loc)
[188]522        self.send("Examples with selected genes only", dataOut)
523
524    def resultsOut(self, data):
525        self.send("Results", data)
526
[194]527    def genesetDistOut(self, dm):
528        self.send("Distance Matrix", dm)
529
[188]530
531    def fillResults(self, res):
532        clearListView(self.listView)
533
534        self.lwiToGeneset = {}
535
536        def writeGenes(g):
[663]537            return ", ".join(g)
[188]538
[1108]539        for gs, rdic in res.items():
540            collection = ",".join(gs.hierarchy) if gs.hierarchy else ""
541            name = ne(gs.id) + " " + ne(gs.name)
[189]542            item = QTreeWidgetItem(self.listView)
[201]543            item.setText(0, collection)
[1108]544            item.setText(1, name)
[663]545            item.setText(2, "%0.3f" % rdic['nes'])
546            item.setText(3, "%0.3f" % rdic['es'])
547            item.setText(4, "%0.3f" % rdic['p'])
548            item.setText(5, "%0.3f" % min(rdic['fdr'],1.0))
549            item.setText(6, str(rdic['size']))
550            item.setText(7, str(rdic['matched_size']))
551            item.setText(8, writeGenes(rdic['genes']))
[188]552
[1108]553            self.lwiToGeneset[item] = gs
[188]554
555    def addComment(self, comm):
[189]556        item = QTreeWidgetItem(self.listView)
557        item.setText(0, comm)   
[188]558
559    def setSelMode(self, bool):
560        if bool:
561            self.selectable = True
[406]562            self.listView.setSelectionMode(QAbstractItemView.ExtendedSelection)
[188]563        else:
564            self.selectable = False
565            self.listView.setSelectionMode(QListView.NoSelection)
566
[210]567    def compute(self, res=None, dm=None):
[395]568
569        collectionNames = [ self.geneSel[a] for a in self.gridSel ]
[516]570
[1042]571        organism = self.organismCodes[self.organismIndex]
[516]572
573        if self.gsgo:
[1108]574            collectionNames.append((("GO",),organism))
[516]575        if self.gskegg:
[1108]576            collectionNames.append((("KEGG",),organism))
[516]577
[1108]578        self.geneSets = obiGeneSets.collections(*collectionNames)
[395]579
[188]580        self.resultsOut(None)
581
582        qApp.processEvents()
[210]583        self.res = res
584        self.dm = dm
[942]585
586        clearListView(self.listView)
587        self.addComment("Computing...")
588        qApp.processEvents()
589
[941]590        self.phenVar = self.phenCands[self.selectedPhenVar][0]
591        self.geneVar = self.geneCands[self.selectedGeneVar]
592
[210]593        if self.res == None and self.data:
[188]594            self.setSelMode(False)
595
596            pb = OWGUI.ProgressBar(self, iterations=self.perms+2)
597
598            if hasattr(self, "btnApply"):
599                self.btnApply.setFocus()
600
[705]601            kwargs = {}
602            dkwargs = {}
[395]603
[941]604            dkwargs["phenVar"] = self.phenVar
605            dkwargs["geneVar"] = self.geneVar
606
[939]607            if not obiGsea.already_have_correlations(self.data):
608
[705]609                selectedClasses = self.psel.getSelection()
610                fc = "Phenotype group empty. Stopped."
611                if len(selectedClasses[0]) == 0:
612                    self.addComment(fc)
613                    return
614                elif len(selectedClasses[1]) == 0:
615                    self.addComment(fc)
616                    return
617
618                dkwargs["classValues"] = selectedClasses
619
[1063]620                dkwargs["atLeast"] = self.atLeast
621
[705]622                permtype = self.permutationTypes[self.ptype][1]
623                kwargs["permutation"] = "class" if permtype == "p" else "genes"
[188]624
625            def ifr(case, t, f):
626                if case: return t
627                else: return f
628
629            kwargs["minSize"] = \
630                ifr(self.minSubsetSizeC, self.minSubsetSize, 1)
631            kwargs["maxSize"] = \
632                ifr(self.maxSubsetSizeC, self.maxSubsetSize, 1000000)
633            kwargs["minPart"] = \
634                ifr(self.minSubsetPartC, self.minSubsetPart/100.0, 0.0)
635
[490]636
[1063]637            #create gene matcher
[1173]638            genematcher = obiGene.matcher([[obiGene.GMKEGG(organism)] + ([obiGene.GMDicty()] if organism == "352472"  else [])])
[1063]639
640            #dkwargs["caseSensitive"] = self.csgm
641
642            gso = obiGsea.GSEA(self.data, matcher=genematcher, **dkwargs)
[188]643
[1108]644           
645            for gs in self.geneSets:
646                gso.addGenesets([gs])
[188]647                qApp.processEvents()
648
649            self.res = gso.compute(n=self.perms, callback=pb.advance, **kwargs)
650           
651            pb.finish()
[208]652           
653        if self.res != None:
[188]654            if len(self.res) > 0:
655                self.fillResults(self.res)
656                self.setSelMode(True)
[194]657                resl = self.res.items()
658
[427]659                etres = exportET(resl)
[938]660                self.resultsOut(etres)
[194]661
[941]662                self.find_genes_dic, self.find_genes_loc = \
663                    find_genes_dic(self.res, self.data, self.geneVar)
664
[938]665                if self.buildDistances:
666                    if self.dm == None:
667                        self.dm = exportDistanceMatrix(resl)
668                       
669                        for ex in etres:
670                            ex.name = str(ex[0])
671                        self.dm.setattr("items", etres)
672                else:
673                    self.dm = None
[194]674
[188]675            else:
676                self.setSelMode(False)
677                clearListView(self.listView)
[938]678                self.dm = None
[188]679                self.addComment("No genesets found.")
680
[938]681            self.genesetDistOut(self.dm)
682
[188]683
684    def setData(self, data):
[942]685
686        self.allowComboChangeCallback = False
687
[188]688        self.data = data
689
690        if data:
[1118]691            taxid = data_hints.get_hint(data, "taxid", None)
[1104]692            try:
[1118]693                code = obiKEGG.from_taxid(taxid)
[1104]694                self.organismIndex = self.organismCodes.index(code)
695            except Exception, ex:
696                pass
697           
[939]698            if obiGsea.already_have_correlations(data):
[705]699
[188]700                #disable correlation type
701                comboboxItems(self.corTypeF, [])
702                self.corTypeF.setDisabled(True)
703                #set permutation type to fixed
[705]704                self.ptype = 1
[188]705                self.permTypeF.setDisabled(True)
[939]706
[188]707            else:
708                #enable correlation type
709                comboboxItems(self.corTypeF, nth(self.correlationTypes, 0))
710                self.corTypeF.setDisabled(False)
711                #allow change of permutation type
712                self.permTypeF.setDisabled(False)
[395]713                #print "set classes"
[939]714
[940]715            self.phenCombo.clear()
716            self.phenCands = obiGsea.phenotype_cands(data)
717            self.phenCombo.addItems(map(lambda x: str(x[0]), self.phenCands))
[939]718
[940]719            self.phenCombo.setDisabled(len(self.phenCands) <= 1)
[939]720
[940]721            self.selectedPhenVar = 0
[942]722
723            self.allowComboChangeCallback = True
724
[940]725            self.phenComboChange()
[939]726
727
[942]728
[939]729    def phenComboChange(self):
[942]730
731        if self.allowComboChangeCallback == False:
732            return
733
[939]734        pv = self.phenCands[self.selectedPhenVar]
[942]735
[940]736        self.psel.setClasses(pv[1] if len(pv[1]) > 0 else None)
[939]737
738        def conv(x):
739            if x == True:
740                return "Attribute names"
741            else:
742                return str(x)
743
744        self.geneCombo.clear()
[940]745
746        look_cols = obiGsea.is_variable(pv[0])
747
748        if obiGsea.already_have_correlations(self.data):
749            look_cols = not obiGsea.need_to_transpose_single(self.data)
750
751        self.geneCands = obiGsea.gene_cands(self.data, look_cols)
[939]752        self.geneCombo.addItems(map(lambda x: conv(x), self.geneCands))
753        self.selectedGeneVar = 0
754
755        self.geneCombo.setDisabled(len(self.geneCands) <= 1)
[188]756
[395]757    def chooseGeneSetsFile(self):
758        """
759        Return choosen gene sets file name or None, if no file
760        was choosen.
761        """
[1095]762        filename = str(QFileDialog.getOpenFileName(self,  "Choose gene set collection", './', "Gene Collections (*.gmt)"))
[395]763        return filename
[188]764
[941]765def find_genes_dic(res, data, geneVar):
766    """
767    Builds a dictionary of where to find the genes to
768    avoid delay with choosing them.
769
770    If geneVar is True or it is a group parameter, then
771    use columns as genes: out of genes select only
772    those contained in selected pathways.
773    """
774
775    def rorq(a, name):
776        """ Group annatation or question mark. """
777        try: 
778            return a.attributes[name]
779        except: 
780            return '?'
781
782    d = defaultdict(list)
783    if geneVar == True or geneVar in obiGsea.allgroups(data):
784        for i,a in enumerate(data.domain.attributes):
785            if geneVar == True:
786                d[a.name].append(i)
787            else:
788                d[rorq(a, geneVar)].append(i)
789        return d, "attributes"
790    else:
791        for i,ex in enumerate(data):
792            d[ex[geneVar].value].append(i)
793        return d, "examples"
[188]794
795if __name__=="__main__":
796    a=QApplication(sys.argv)
797    ow=OWGsea()
798    ow.show()
799
[938]800    #d = orange.ExampleTable('/home/marko/testData.tab')
[1108]801    d = orange.ExampleTable('/home/marko/orange/add-ons/Bioinformatics/sterolTalkHepa.tab')
802    #d = orange.ExampleTable('/home/marko/ddd.tab')
[940]803    #d = orange.ExampleTable('tmp.tab')
[1044]804    #d = orange.ExampleTable('../gene_three_lines_log.tab')
[395]805    ow.setData(d)
806
807    a.exec_()
[188]808    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.