source: orange-bioinformatics/_bioinformatics/widgets/OWGsea.py @ 1636:10d234fdadb9

Revision 1636:10d234fdadb9, 25.7 KB checked in by mitar, 2 years ago (diff)

Restructuring because we will not be using namespaces.

Line 
1"""
2<name>GSEA</name>
3<description>Gene set enrichment analysis.</description>
4<contact>Marko Toplak (marko.toplak(@at@)gmail.com)</contact>
5<priority>2025</priority>
6<icon>icons/GSEA.png</icon>
7"""
8
9from __future__ import absolute_import, with_statement
10
11from exceptions import Exception
12import cPickle as pickle
13from collections import defaultdict
14
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
21
22def nth(l, n):
23    return [ a[n] for a in l ]
24
25def clearListView(lw):
26    lw.clear()
27
28def ne(a):
29    return a if a != None else ""
30
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 ])
45
46def comboboxItems(combobox, newitems):
47    combobox.clear()
48    if newitems:
49        combobox.insertItems(0, newitems)
50        #combobox.setCurrentItem(i)
51
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)):
60            gen1 = set(resl[i][1]['genes'])
61            gen2 = set(resl[j][1]['genes'])
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
72    def collectionn(gs):
73        return ",".join(gs.hierarchy) if gs.hierarchy else ""
74
75    allCollections = sorted(set(collectionn(gs) for gs,_ in resl))
76
77    vars = []
78    vars.append(orange.StringVariable("Name"))
79    vars.append(orange.EnumVariable("Collection", values=map(str,allCollections )))
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 = []
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'])])
94
95    return orange.ExampleTable(domain, examples)
96
97
98
99
100class PhenotypesSelection(QGroupBox):
101    """
102    Window indices:
103    0 - left chooser
104    1 - right chooser
105
106    wishedState: 0 not choosen anywhere, 1 choosen in left, 2 in right
107    """
108
109    def __init__(self, parent):
110        QObject.__init__(self)
111        grid = OWGUI.widgetBox(parent, "", orientation = "horizontal")
112        grid.setMinimumWidth(250)
113        grid.setMinimumHeight(100)
114
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)
123
124        self.classes = []
125
126        def createSquarePixmap(color = Qt.black):
127            return OWGUI.createAttributePixmap("", color)
128
129        self.whiteSq = createSquarePixmap(Qt.white)
130        self.marked = [ createSquarePixmap(Qt.red), createSquarePixmap(Qt.blue) ]
131
132        self.classVals = []
133
134    def selectWanted(self):
135
136        #prevent selection events when chenging here
137        self.disableNot = True
138
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
192
193        self.selectWanted()
194
195    def highlighted1(self): return self.highlighted(0)
196    def highlighted2(self): return self.highlighted(1)
197
198    def setClasses(self, input, s1=0, s2=1):
199
200        if input is not None:
201            self.classVals = sorted(input)
202            self.wishedState = [ 0 ] * len(self.classVals)
203
204            self.wishedState[s1] = 1
205            self.wishedState[s2] = 2
206
207            self.setupBoxes()
208            self.selectWanted()
209        else:
210            self.classVals = []
211            self.setupBoxes()
212            self.selectWanted()
213 
214    def getSelection(self):
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
218
219    def setupBoxes(self):
220        for box in self.boxes:
221            self.setupBox(box)
222
223    def setupBox(self, box):
224        # clear and fill box
225
226        box.clear()
227        for i,cv in enumerate(self.classVals):
228            box.insertItem(i, cv)
229            box.item(i).setIcon(self.whiteSq)
230
231        if not self.classVals:
232            box.setDisabled(True)
233        else:
234            box.setDisabled(False)
235
236class OWGsea(OWWidget):
237    settingsList = ["name", 
238                    "perms", 
239                    "minSubsetSize", 
240                    "minSubsetSizeC", 
241                    "maxSubsetSize", 
242                    "maxSubsetSizeC", 
243                    "minSubsetPart", 
244                    "minSubsetPartC", 
245                    "ptype", 
246                    "loadFileName",
247                    "gridSels",
248                    "csgm",
249                    "gsgo",
250                    "gskegg",
251                    "buildDistances",
252                    "organismIndex",
253                    "atLeast"]
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]
270            self.organismCodes = [obiKEGG.to_taxid(code) for code, desc in self.organismCodes]
271           
272            self.organismComboBox.addItems(items)
273        finally:
274            self.signalManager.freeze(self).pop() #setFreeze(0)
275
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)]
281        self.outputs = [("Examples with selected genes only", ExampleTable), ("Results", ExampleTable), ("Distance Matrix", orange.SymMatrix) ]
282
283        self.res = None
284        self.dm = None
285       
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
294        self.csgm = False
295        self.gsgo = False
296        self.gskegg = False
297        self.buildDistances = False
298        self.selectedPhenVar = 0
299        self.organismIndex = 0
300        self.atLeast = 3
301
302        self.permutationTypes =  [("Phenotype", "p"),("Gene", "g") ]
303        self.ptype = 0
304
305        self.correlationTypes = [ ("Signal2Noise", "s2n") ]
306        self.ctype = 0
307       
308        self.data = None
309        self.geneSets = {}
310
311        self.tabs = OWGUI.tabWidget(self.controlArea)
312
313        ca = OWGUI.createTabPage(self.tabs, "Basic")
314
315        box = OWGUI.widgetBox(ca, 'Organism')
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)
321        self.signalManager.freeze(self).push() #setFreeze(1)
322        QTimer.singleShot(100, self.UpdateOrganismComboBox)
323 
324        #OWGUI.checkBox(box, self, "csgm", "Case sensitive gene matching")
325
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:")
329
330        self.allowComboChangeCallback = False
331
332        ma = self.mainArea
333
334        self.listView = QTreeWidget(ma)
335        ma.layout().addWidget(self.listView)
336        self.listView.setAllColumnsShowFocus(1)
337        self.listView.setColumnCount(9)
338        self.listView.setHeaderLabels(["Collection", "Geneset", "NES", "ES", "P-value", "FDR", "Size", "Matched Size", "Genes"])
339       
340        self.listView.header().setStretchLastSection(True)
341        self.listView.header().setClickable(True)
342        self.listView.header().setSortIndicatorShown(True)
343        self.listView.setSortingEnabled(True)
344        #self.listView.header().setResizeMode(0, QHeaderView.Stretch)
345       
346        self.listView.setSelectionMode(QAbstractItemView.NoSelection)
347        self.connect(self.listView, SIGNAL("itemSelectionChanged()"), self.newPathwaySelected)
348
349        OWGUI.separator(ca)
350
351        OWGUI.widgetLabel(ca, "Phenotype selection:")
352        self.psel = PhenotypesSelection(ca)
353       
354        self.resize(600,50)
355 
356        OWGUI.separator(ca)
357
358        OWGUI.checkBox(ca, self, "buildDistances", "Compute geneset distances")
359
360        self.btnApply = OWGUI.button(ca, self, "&Compute", callback = self.compute, disabled=0)
361       
362        fileBox = OWGUI.widgetBox(ca, orientation='horizontal')
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)
365 
366        #ca.layout().addStretch(1)
367
368        ca = OWGUI.createTabPage(self.tabs, "Gene sets")
369       
370        box = OWGUI.widgetBox(ca)
371
372        self.gridSel = []
373        self.geneSel = []  #FIXME temporary disabled - use the same as in new "David" widget
374        self.lbgs = OWGUI.listBox(box, self, "gridSel", "geneSel", selectionMode = QListWidget.MultiSelection)
375        OWGUI.button(box, self, "From &File", callback = self.addCollection, disabled=0, debuggingEnabled=0)
376
377        box = OWGUI.widgetBox(box, "Additional sources:")
378        OWGUI.checkBox(box, self, "gskegg", "KEGG pathways")
379        OWGUI.checkBox(box, self, "gsgo", "GO terms")
380 
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), \
387            tooltip="Permutation type.", label="Permute")
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
392
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
399        box = OWGUI.widgetBox(ca, 'Gene Filtering')
400
401        _ = OWGUI.spin(box, self, "atLeast", 2, 10, label="Min. Values in Group")
402
403        ca.layout().addStretch(1)
404
405        self.addComment("Computation was not started.")
406
407        if sys.platform == "darwin":
408            self.loadFileName = user.home
409        else:
410            self.loadFileName = "."
411
412        self.gridSels = []
413        self.loadSettings()
414 
415        def cleanInvalid(maxn):
416            """
417            Removes invalid gene set selection
418            """
419            notAllOk = True
420
421            while notAllOk:
422                self.gridSels = getattr(self, "gridSels")
423                notAllOk = False
424                for i,a in enumerate(self.gridSels):
425                    if a >= maxn:
426                        self.gridSels.pop(i)
427                        notAllOk = True
428                        break
429       
430        cleanInvalid(len(self.geneSel))
431
432        self.gridSel = self.gridSels
433        self.gridSels = self.gridSel
434
435    def addCollection(self):
436        fname = self.chooseGeneSetsFile()
437
438        if fname:
439            if fname not in self.geneSel:
440       
441                #add it to the list, choose it and keep
442                #all old choosen
443                gridSelc = list(self.gridSel)
444
445                self.geneSel.append(fname)
446                self.geneSel = self.geneSel
447
448                gridSelc.append(len(self.geneSel)-1)
449           
450                self.gridSel = gridSelc
451                self.gridSels = self.gridSel #for saving
452
453
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)
466                   
467                fp = open(fn, "wb" )
468                pickle.dump(self.res, fp, -1)
469                pickle.dump(self.dm, fp, -1)
470                fp.close()
471        else:
472            self.warning('No internal data to save.')
473   
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
482       
483        fp = open(self.loadFileName, "rb")
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)
494
495    def newPathwaySelected(self):
496        #print "newPathwaySelected"
497        qApp.processEvents()
498
499        if not self.selectable:
500            return
501
502        if self.res == None:
503            return
504
505        outat = set([])
506        for item in self.listView.selectedItems():
507            iname = self.lwiToGeneset[item]
508            outat.update(self.res[iname]['genes'])
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
517           
518        dataOut = selectGenes(self.data, select, self.find_genes_loc)
519        self.send("Examples with selected genes only", dataOut)
520
521    def resultsOut(self, data):
522        self.send("Results", data)
523
524    def genesetDistOut(self, dm):
525        self.send("Distance Matrix", dm)
526
527
528    def fillResults(self, res):
529        clearListView(self.listView)
530
531        self.lwiToGeneset = {}
532
533        def writeGenes(g):
534            return ", ".join(g)
535
536        for gs, rdic in res.items():
537            collection = ",".join(gs.hierarchy) if gs.hierarchy else ""
538            name = ne(gs.id) + " " + ne(gs.name)
539            item = QTreeWidgetItem(self.listView)
540            item.setText(0, collection)
541            item.setText(1, name)
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']))
549
550            self.lwiToGeneset[item] = gs
551
552    def addComment(self, comm):
553        item = QTreeWidgetItem(self.listView)
554        item.setText(0, comm)   
555
556    def setSelMode(self, bool):
557        if bool:
558            self.selectable = True
559            self.listView.setSelectionMode(QAbstractItemView.ExtendedSelection)
560        else:
561            self.selectable = False
562            self.listView.setSelectionMode(QListView.NoSelection)
563
564    def compute(self, res=None, dm=None):
565
566        collectionNames = [ self.geneSel[a] for a in self.gridSel ]
567
568        organism = self.organismCodes[self.organismIndex]
569
570        if self.gsgo:
571            collectionNames.append((("GO",),organism))
572        if self.gskegg:
573            collectionNames.append((("KEGG",),organism))
574
575        self.geneSets = obiGeneSets.collections(*collectionNames)
576
577        self.resultsOut(None)
578
579        qApp.processEvents()
580        self.res = res
581        self.dm = dm
582
583        clearListView(self.listView)
584        self.addComment("Computing...")
585        qApp.processEvents()
586
587        self.phenVar = self.phenCands[self.selectedPhenVar][0]
588        self.geneVar = self.geneCands[self.selectedGeneVar]
589
590        if self.res == None and self.data:
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
598            kwargs = {}
599            dkwargs = {}
600
601            dkwargs["phenVar"] = self.phenVar
602            dkwargs["geneVar"] = self.geneVar
603
604            if not obiGsea.already_have_correlations(self.data):
605
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
617                dkwargs["atLeast"] = self.atLeast
618
619                permtype = self.permutationTypes[self.ptype][1]
620                kwargs["permutation"] = "class" if permtype == "p" else "genes"
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
633
634            #create gene matcher
635            genematcher = obiGene.matcher([[obiGene.GMKEGG(organism)] + ([obiGene.GMDicty()] if organism == "352472"  else [])])
636
637            #dkwargs["caseSensitive"] = self.csgm
638
639            gso = obiGsea.GSEA(self.data, matcher=genematcher, **dkwargs)
640
641           
642            for gs in self.geneSets:
643                gso.addGenesets([gs])
644                qApp.processEvents()
645
646            self.res = gso.compute(n=self.perms, callback=pb.advance, **kwargs)
647           
648            pb.finish()
649           
650        if self.res != None:
651            if len(self.res) > 0:
652                self.fillResults(self.res)
653                self.setSelMode(True)
654                resl = self.res.items()
655
656                etres = exportET(resl)
657                self.resultsOut(etres)
658
659                self.find_genes_dic, self.find_genes_loc = \
660                    find_genes_dic(self.res, self.data, self.geneVar)
661
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
671
672            else:
673                self.setSelMode(False)
674                clearListView(self.listView)
675                self.dm = None
676                self.addComment("No genesets found.")
677
678            self.genesetDistOut(self.dm)
679
680
681    def setData(self, data):
682
683        self.allowComboChangeCallback = False
684
685        self.data = data
686
687        if data:
688            taxid = data_hints.get_hint(data, "taxid", None)
689            try:
690                code = obiKEGG.from_taxid(taxid)
691                self.organismIndex = self.organismCodes.index(code)
692            except Exception, ex:
693                pass
694           
695            if obiGsea.already_have_correlations(data):
696
697                #disable correlation type
698                comboboxItems(self.corTypeF, [])
699                self.corTypeF.setDisabled(True)
700                #set permutation type to fixed
701                self.ptype = 1
702                self.permTypeF.setDisabled(True)
703
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)
710                #print "set classes"
711
712            self.phenCombo.clear()
713            self.phenCands = obiGsea.phenotype_cands(data)
714            self.phenCombo.addItems(map(lambda x: str(x[0]), self.phenCands))
715
716            self.phenCombo.setDisabled(len(self.phenCands) <= 1)
717
718            self.selectedPhenVar = 0
719
720            self.allowComboChangeCallback = True
721
722            self.phenComboChange()
723
724
725
726    def phenComboChange(self):
727
728        if self.allowComboChangeCallback == False:
729            return
730
731        pv = self.phenCands[self.selectedPhenVar]
732
733        self.psel.setClasses(pv[1] if len(pv[1]) > 0 else None)
734
735        def conv(x):
736            if x == True:
737                return "Attribute names"
738            else:
739                return str(x)
740
741        self.geneCombo.clear()
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)
749        self.geneCombo.addItems(map(lambda x: conv(x), self.geneCands))
750        self.selectedGeneVar = 0
751
752        self.geneCombo.setDisabled(len(self.geneCands) <= 1)
753
754    def chooseGeneSetsFile(self):
755        """
756        Return choosen gene sets file name or None, if no file
757        was choosen.
758        """
759        filename = str(QFileDialog.getOpenFileName(self,  "Choose gene set collection", './', "Gene Collections (*.gmt)"))
760        return filename
761
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"
791
792if __name__=="__main__":
793    a=QApplication(sys.argv)
794    ow=OWGsea()
795    ow.show()
796
797    #d = orange.ExampleTable('/home/marko/testData.tab')
798    d = orange.ExampleTable('/home/marko/orange/add-ons/Bioinformatics/sterolTalkHepa.tab')
799    #d = orange.ExampleTable('/home/marko/ddd.tab')
800    #d = orange.ExampleTable('tmp.tab')
801    #d = orange.ExampleTable('../gene_three_lines_log.tab')
802    ow.setData(d)
803
804    a.exec_()
805    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.