source: orange-bioinformatics/_bioinformatics/widgets/OWGsea.py @ 1749:29a979e9bf4d

Revision 1749:29a979e9bf4d, 25.6 KB checked in by Ales Erjavec <ales.erjavec@…>, 12 months ago (diff)

Optimized Gsea widget organism list initialization.

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