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

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

Added new style widget meta descriptions.

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