source: orange-bioinformatics/orangecontrib/bio/widgets/OWGsea.py @ 1997:f39504393979

Revision 1997:f39504393979, 25.9 KB checked in by Ales Erjavec <ales.erjavec@…>, 7 weeks ago (diff)

Replaced the use of signal manager freeze with widget blocking state.

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