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.

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
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            if self.signalManager:
275                self.signalManager.freeze(self).pop()
276
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)]
282        self.outputs = [("Examples with selected genes only", ExampleTable), ("Results", ExampleTable), ("Distance Matrix", orange.SymMatrix) ]
283
284        self.res = None
285        self.dm = None
286       
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
295        self.csgm = False
296        self.gsgo = False
297        self.gskegg = False
298        self.buildDistances = False
299        self.selectedPhenVar = 0
300        self.organismIndex = 0
301        self.atLeast = 3
302
303        self.permutationTypes =  [("Phenotype", "p"),("Gene", "g") ]
304        self.ptype = 0
305
306        self.correlationTypes = [ ("Signal2Noise", "s2n") ]
307        self.ctype = 0
308       
309        self.data = None
310        self.geneSets = {}
311
312        self.tabs = OWGUI.tabWidget(self.controlArea)
313
314        ca = OWGUI.createTabPage(self.tabs, "Basic")
315
316        box = OWGUI.widgetBox(ca, 'Organism')
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)
322
323        if self.signalManager:
324            self.signalManager.freeze(self).push()
325        QTimer.singleShot(100, self.UpdateOrganismComboBox)
326 
327        #OWGUI.checkBox(box, self, "csgm", "Case sensitive gene matching")
328
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:")
332
333        self.allowComboChangeCallback = False
334
335        ma = self.mainArea
336
337        self.listView = QTreeWidget(ma)
338        ma.layout().addWidget(self.listView)
339        self.listView.setAllColumnsShowFocus(1)
340        self.listView.setColumnCount(9)
341        self.listView.setHeaderLabels(["Collection", "Geneset", "NES", "ES", "P-value", "FDR", "Size", "Matched Size", "Genes"])
342       
343        self.listView.header().setStretchLastSection(True)
344        self.listView.header().setClickable(True)
345        self.listView.header().setSortIndicatorShown(True)
346        self.listView.setSortingEnabled(True)
347        #self.listView.header().setResizeMode(0, QHeaderView.Stretch)
348       
349        self.listView.setSelectionMode(QAbstractItemView.NoSelection)
350        self.connect(self.listView, SIGNAL("itemSelectionChanged()"), self.newPathwaySelected)
351
352        OWGUI.separator(ca)
353
354        OWGUI.widgetLabel(ca, "Phenotype selection:")
355        self.psel = PhenotypesSelection(ca)
356       
357        self.resize(600,50)
358 
359        OWGUI.separator(ca)
360
361        OWGUI.checkBox(ca, self, "buildDistances", "Compute geneset distances")
362
363        self.btnApply = OWGUI.button(ca, self, "&Compute", callback = self.compute, disabled=0)
364       
365        fileBox = OWGUI.widgetBox(ca, orientation='horizontal')
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)
368 
369        #ca.layout().addStretch(1)
370
371        ca = OWGUI.createTabPage(self.tabs, "Gene sets")
372       
373        box = OWGUI.widgetBox(ca)
374
375        self.gridSel = []
376        self.geneSel = []  #FIXME temporary disabled - use the same as in new "David" widget
377        self.lbgs = OWGUI.listBox(box, self, "gridSel", "geneSel", selectionMode = QListWidget.MultiSelection)
378        OWGUI.button(box, self, "From &File", callback = self.addCollection, disabled=0, debuggingEnabled=0)
379
380        box = OWGUI.widgetBox(box, "Additional sources:")
381        OWGUI.checkBox(box, self, "gskegg", "KEGG pathways")
382        OWGUI.checkBox(box, self, "gsgo", "GO terms")
383 
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), \
390            tooltip="Permutation type.", label="Permute")
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
395
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
402        box = OWGUI.widgetBox(ca, 'Gene Filtering')
403
404        _ = OWGUI.spin(box, self, "atLeast", 2, 10, label="Min. Values in Group")
405
406        ca.layout().addStretch(1)
407
408        self.addComment("Computation was not started.")
409
410        if sys.platform == "darwin":
411            self.loadFileName = user.home
412        else:
413            self.loadFileName = "."
414
415        self.gridSels = []
416        self.loadSettings()
417 
418        def cleanInvalid(maxn):
419            """
420            Removes invalid gene set selection
421            """
422            notAllOk = True
423
424            while notAllOk:
425                self.gridSels = getattr(self, "gridSels")
426                notAllOk = False
427                for i,a in enumerate(self.gridSels):
428                    if a >= maxn:
429                        self.gridSels.pop(i)
430                        notAllOk = True
431                        break
432       
433        cleanInvalid(len(self.geneSel))
434
435        self.gridSel = self.gridSels
436        self.gridSels = self.gridSel
437
438    def addCollection(self):
439        fname = self.chooseGeneSetsFile()
440
441        if fname:
442            if fname not in self.geneSel:
443       
444                #add it to the list, choose it and keep
445                #all old choosen
446                gridSelc = list(self.gridSel)
447
448                self.geneSel.append(fname)
449                self.geneSel = self.geneSel
450
451                gridSelc.append(len(self.geneSel)-1)
452           
453                self.gridSel = gridSelc
454                self.gridSels = self.gridSel #for saving
455
456
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)
469                   
470                fp = open(fn, "wb" )
471                pickle.dump(self.res, fp, -1)
472                pickle.dump(self.dm, fp, -1)
473                fp.close()
474        else:
475            self.warning('No internal data to save.')
476   
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
485       
486        fp = open(self.loadFileName, "rb")
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)
497
498    def newPathwaySelected(self):
499        #print "newPathwaySelected"
500        qApp.processEvents()
501
502        if not self.selectable:
503            return
504
505        if self.res == None:
506            return
507
508        outat = set([])
509        for item in self.listView.selectedItems():
510            iname = self.lwiToGeneset[item]
511            outat.update(self.res[iname]['genes'])
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
520           
521        dataOut = selectGenes(self.data, select, self.find_genes_loc)
522        self.send("Examples with selected genes only", dataOut)
523
524    def resultsOut(self, data):
525        self.send("Results", data)
526
527    def genesetDistOut(self, dm):
528        self.send("Distance Matrix", dm)
529
530
531    def fillResults(self, res):
532        clearListView(self.listView)
533
534        self.lwiToGeneset = {}
535
536        def writeGenes(g):
537            return ", ".join(g)
538
539        for gs, rdic in res.items():
540            collection = ",".join(gs.hierarchy) if gs.hierarchy else ""
541            name = ne(gs.id) + " " + ne(gs.name)
542            item = QTreeWidgetItem(self.listView)
543            item.setText(0, collection)
544            item.setText(1, name)
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']))
552
553            self.lwiToGeneset[item] = gs
554
555    def addComment(self, comm):
556        item = QTreeWidgetItem(self.listView)
557        item.setText(0, comm)   
558
559    def setSelMode(self, bool):
560        if bool:
561            self.selectable = True
562            self.listView.setSelectionMode(QAbstractItemView.ExtendedSelection)
563        else:
564            self.selectable = False
565            self.listView.setSelectionMode(QListView.NoSelection)
566
567    def compute(self, res=None, dm=None):
568
569        collectionNames = [ self.geneSel[a] for a in self.gridSel ]
570
571        organism = self.organismCodes[self.organismIndex]
572
573        if self.gsgo:
574            collectionNames.append((("GO",),organism))
575        if self.gskegg:
576            collectionNames.append((("KEGG",),organism))
577
578        self.geneSets = obiGeneSets.collections(*collectionNames)
579
580        self.resultsOut(None)
581
582        qApp.processEvents()
583        self.res = res
584        self.dm = dm
585
586        clearListView(self.listView)
587        self.addComment("Computing...")
588        qApp.processEvents()
589
590        self.phenVar = self.phenCands[self.selectedPhenVar][0]
591        self.geneVar = self.geneCands[self.selectedGeneVar]
592
593        if self.res == None and self.data:
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
601            kwargs = {}
602            dkwargs = {}
603
604            dkwargs["phenVar"] = self.phenVar
605            dkwargs["geneVar"] = self.geneVar
606
607            if not obiGsea.already_have_correlations(self.data):
608
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
620                dkwargs["atLeast"] = self.atLeast
621
622                permtype = self.permutationTypes[self.ptype][1]
623                kwargs["permutation"] = "class" if permtype == "p" else "genes"
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
636
637            #create gene matcher
638            genematcher = obiGene.matcher([[obiGene.GMKEGG(organism)] + ([obiGene.GMDicty()] if organism == "352472"  else [])])
639
640            #dkwargs["caseSensitive"] = self.csgm
641
642            gso = obiGsea.GSEA(self.data, matcher=genematcher, **dkwargs)
643
644           
645            for gs in self.geneSets:
646                gso.addGenesets([gs])
647                qApp.processEvents()
648
649            self.res = gso.compute(n=self.perms, callback=pb.advance, **kwargs)
650           
651            pb.finish()
652           
653        if self.res != None:
654            if len(self.res) > 0:
655                self.fillResults(self.res)
656                self.setSelMode(True)
657                resl = self.res.items()
658
659                etres = exportET(resl)
660                self.resultsOut(etres)
661
662                self.find_genes_dic, self.find_genes_loc = \
663                    find_genes_dic(self.res, self.data, self.geneVar)
664
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
674
675            else:
676                self.setSelMode(False)
677                clearListView(self.listView)
678                self.dm = None
679                self.addComment("No genesets found.")
680
681            self.genesetDistOut(self.dm)
682
683
684    def setData(self, data):
685
686        self.allowComboChangeCallback = False
687
688        self.data = data
689
690        if data:
691            taxid = data_hints.get_hint(data, "taxid", None)
692            try:
693                code = obiKEGG.from_taxid(taxid)
694                self.organismIndex = self.organismCodes.index(code)
695            except Exception, ex:
696                pass
697           
698            if obiGsea.already_have_correlations(data):
699
700                #disable correlation type
701                comboboxItems(self.corTypeF, [])
702                self.corTypeF.setDisabled(True)
703                #set permutation type to fixed
704                self.ptype = 1
705                self.permTypeF.setDisabled(True)
706
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)
713                #print "set classes"
714
715            self.phenCombo.clear()
716            self.phenCands = obiGsea.phenotype_cands(data)
717            self.phenCombo.addItems(map(lambda x: str(x[0]), self.phenCands))
718
719            self.phenCombo.setDisabled(len(self.phenCands) <= 1)
720
721            self.selectedPhenVar = 0
722
723            self.allowComboChangeCallback = True
724
725            self.phenComboChange()
726
727
728
729    def phenComboChange(self):
730
731        if self.allowComboChangeCallback == False:
732            return
733
734        pv = self.phenCands[self.selectedPhenVar]
735
736        self.psel.setClasses(pv[1] if len(pv[1]) > 0 else None)
737
738        def conv(x):
739            if x == True:
740                return "Attribute names"
741            else:
742                return str(x)
743
744        self.geneCombo.clear()
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)
752        self.geneCombo.addItems(map(lambda x: conv(x), self.geneCands))
753        self.selectedGeneVar = 0
754
755        self.geneCombo.setDisabled(len(self.geneCands) <= 1)
756
757    def chooseGeneSetsFile(self):
758        """
759        Return choosen gene sets file name or None, if no file
760        was choosen.
761        """
762        filename = str(QFileDialog.getOpenFileName(self,  "Choose gene set collection", './', "Gene Collections (*.gmt)"))
763        return filename
764
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"
794
795if __name__=="__main__":
796    a=QApplication(sys.argv)
797    ow=OWGsea()
798    ow.show()
799
800    #d = orange.ExampleTable('/home/marko/testData.tab')
801    d = orange.ExampleTable('/home/marko/orange/add-ons/Bioinformatics/sterolTalkHepa.tab')
802    #d = orange.ExampleTable('/home/marko/ddd.tab')
803    #d = orange.ExampleTable('tmp.tab')
804    #d = orange.ExampleTable('../gene_three_lines_log.tab')
805    ow.setData(d)
806
807    a.exec_()
808    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.