source: orange-bioinformatics/orangecontrib/bio/widgets/OWGsea.py @ 1874:b3e32cc5cf6f

Revision 1874:b3e32cc5cf6f, 26.0 KB checked in by Ales Erjavec <ales.erjavec@…>, 6 months ago (diff)

Added new style widget meta descriptions.

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