source: orange-bioinformatics/Orange/bioinformatics/widgets/OWGsea.py @ 1625:cefeb35cbfc9

Revision 1625:cefeb35cbfc9, 25.7 KB checked in by mitar, 2 years ago (diff)

Moving files around.

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