source: orange-bioinformatics/orangecontrib/bio/widgets/OWGsea.py @ 1873:0810c5708cc5

Revision 1873:0810c5708cc5, 25.6 KB checked in by Ales Erjavec <ales.erjavec@…>, 6 months ago (diff)

Moved '_bioinformatics' into orangecontrib namespace.

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
[188]22def nth(l, n):
23    return [ a[n] for a in l ]
24
25def clearListView(lw):
[189]26    lw.clear()
[1108]27
28def ne(a):
29    return a if a != None else ""
[188]30
[941]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 ])
[188]45
46def comboboxItems(combobox, newitems):
47    combobox.clear()
48    if newitems:
[189]49        combobox.insertItems(0, newitems)
[188]50        #combobox.setCurrentItem(i)
51
[427]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)):
[663]60            gen1 = set(resl[i][1]['genes'])
61            gen2 = set(resl[j][1]['genes'])
[427]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
[1108]72    def collectionn(gs):
73        return ",".join(gs.hierarchy) if gs.hierarchy else ""
[427]74
[1108]75    allCollections = sorted(set(collectionn(gs) for gs,_ in resl))
[427]76
77    vars = []
78    vars.append(orange.StringVariable("Name"))
[1044]79    vars.append(orange.EnumVariable("Collection", values=map(str,allCollections )))
[427]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 = []
[1108]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'])])
[427]94
95    return orange.ExampleTable(domain, examples)
96
97
98
99
[190]100class PhenotypesSelection(QGroupBox):
[395]101    """
102    Window indices:
103    0 - left chooser
104    1 - right chooser
[188]105
[395]106    wishedState: 0 not choosen anywhere, 1 choosen in left, 2 in right
107    """
108
109    def __init__(self, parent):
[190]110        QObject.__init__(self)
111        grid = OWGUI.widgetBox(parent, "", orientation = "horizontal")
[188]112        grid.setMinimumWidth(250)
113        grid.setMinimumHeight(100)
114
[395]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)
[188]123
124        self.classes = []
125
126        def createSquarePixmap(color = Qt.black):
[395]127            return OWGUI.createAttributePixmap("", color)
[188]128
[395]129        self.whiteSq = createSquarePixmap(Qt.white)
130        self.marked = [ createSquarePixmap(Qt.red), createSquarePixmap(Qt.blue) ]
[188]131
132        self.classVals = []
133
[395]134    def selectWanted(self):
[188]135
[395]136        #prevent selection events when chenging here
137        self.disableNot = True
[188]138
[395]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
[188]192
193        self.selectWanted()
194
[395]195    def highlighted1(self): return self.highlighted(0)
196    def highlighted2(self): return self.highlighted(1)
[188]197
[395]198    def setClasses(self, input, s1=0, s2=1):
[188]199
[705]200        if input is not None:
201            self.classVals = sorted(input)
202            self.wishedState = [ 0 ] * len(self.classVals)
[188]203
[705]204            self.wishedState[s1] = 1
205            self.wishedState[s2] = 2
[188]206
[705]207            self.setupBoxes()
208            self.selectWanted()
[942]209        else:
210            self.classVals = []
211            self.setupBoxes()
212            self.selectWanted()
213 
[188]214    def getSelection(self):
[395]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
[188]218
219    def setupBoxes(self):
[395]220        for box in self.boxes:
221            self.setupBox(box)
[188]222
223    def setupBox(self, box):
[395]224        # clear and fill box
225
[188]226        box.clear()
[395]227        for i,cv in enumerate(self.classVals):
228            box.insertItem(i, cv)
229            box.item(i).setIcon(self.whiteSq)
230
[188]231        if not self.classVals:
232            box.setDisabled(True)
233        else:
234            box.setDisabled(False)
235
236class OWGsea(OWWidget):
[394]237    settingsList = ["name", 
238                    "perms", 
239                    "minSubsetSize", 
240                    "minSubsetSizeC", 
241                    "maxSubsetSize", 
242                    "maxSubsetSizeC", 
243                    "minSubsetPart", 
244                    "minSubsetPartC", 
245                    "ptype", 
[395]246                    "loadFileName",
[536]247                    "gridSels",
[516]248                    "csgm",
249                    "gsgo",
[938]250                    "gskegg",
[1042]251                    "buildDistances",
[1063]252                    "organismIndex",
253                    "atLeast"]
[1042]254
255    def UpdateOrganismComboBox(self):
256        try:
[1749]257            genome = obiKEGG.KEGGGenome()
258
259            self.allOrganismCodes = genome
260
[1042]261            essential = genome.essential_organisms()
[1749]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()
[1042]277            self.organismComboBox.addItems(items)
278        finally:
[1748]279            if self.signalManager:
280                self.signalManager.freeze(self).pop()
[1042]281
[188]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)]
[194]287        self.outputs = [("Examples with selected genes only", ExampleTable), ("Results", ExampleTable), ("Distance Matrix", orange.SymMatrix) ]
[188]288
289        self.res = None
[210]290        self.dm = None
291       
[188]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
[938]300        self.csgm = False
[516]301        self.gsgo = False
302        self.gskegg = False
[938]303        self.buildDistances = False
[939]304        self.selectedPhenVar = 0
[1042]305        self.organismIndex = 0
[1063]306        self.atLeast = 3
[188]307
308        self.permutationTypes =  [("Phenotype", "p"),("Gene", "g") ]
309        self.ptype = 0
310
311        self.correlationTypes = [ ("Signal2Noise", "s2n") ]
312        self.ctype = 0
[394]313       
[188]314        self.data = None
315        self.geneSets = {}
316
[406]317        self.tabs = OWGUI.tabWidget(self.controlArea)
[188]318
[406]319        ca = OWGUI.createTabPage(self.tabs, "Basic")
[1042]320
[395]321        box = OWGUI.widgetBox(ca, 'Organism')
[1042]322        #FROM KEGG WIDGET - organism selection
323        self.allOrganismCodes = {}
[1749]324        self.organismTaxids = []
[1042]325        self.organismComboBox = cb = OWGUI.comboBox(box, self, "organismIndex", items=[], debuggingEnabled=0) #changed
326        cb.setMaximumWidth(200)
[1748]327
328        if self.signalManager:
329            self.signalManager.freeze(self).push()
[1042]330        QTimer.singleShot(100, self.UpdateOrganismComboBox)
[939]331 
[1063]332        #OWGUI.checkBox(box, self, "csgm", "Case sensitive gene matching")
[188]333
[939]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:")
[938]337
[942]338        self.allowComboChangeCallback = False
339
[188]340        ma = self.mainArea
341
[189]342        self.listView = QTreeWidget(ma)
343        ma.layout().addWidget(self.listView)
344        self.listView.setAllColumnsShowFocus(1)
[201]345        self.listView.setColumnCount(9)
346        self.listView.setHeaderLabels(["Collection", "Geneset", "NES", "ES", "P-value", "FDR", "Size", "Matched Size", "Genes"])
[189]347       
348        self.listView.header().setStretchLastSection(True)
[200]349        self.listView.header().setClickable(True)
350        self.listView.header().setSortIndicatorShown(True)
351        self.listView.setSortingEnabled(True)
[193]352        #self.listView.header().setResizeMode(0, QHeaderView.Stretch)
[189]353       
[193]354        self.listView.setSelectionMode(QAbstractItemView.NoSelection)
[189]355        self.connect(self.listView, SIGNAL("itemSelectionChanged()"), self.newPathwaySelected)
[188]356
357        OWGUI.separator(ca)
358
[406]359        OWGUI.widgetLabel(ca, "Phenotype selection:")
360        self.psel = PhenotypesSelection(ca)
[189]361       
[188]362        self.resize(600,50)
363 
364        OWGUI.separator(ca)
[938]365
366        OWGUI.checkBox(ca, self, "buildDistances", "Compute geneset distances")
367
[188]368        self.btnApply = OWGUI.button(ca, self, "&Compute", callback = self.compute, disabled=0)
[208]369       
370        fileBox = OWGUI.widgetBox(ca, orientation='horizontal')
[1177]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)
[406]373 
374        #ca.layout().addStretch(1)
375
376        ca = OWGUI.createTabPage(self.tabs, "Gene sets")
[208]377       
[406]378        box = OWGUI.widgetBox(ca)
379
380        self.gridSel = []
[1108]381        self.geneSel = []  #FIXME temporary disabled - use the same as in new "David" widget
[406]382        self.lbgs = OWGUI.listBox(box, self, "gridSel", "geneSel", selectionMode = QListWidget.MultiSelection)
[1177]383        OWGUI.button(box, self, "From &File", callback = self.addCollection, disabled=0, debuggingEnabled=0)
[406]384
[516]385        box = OWGUI.widgetBox(box, "Additional sources:")
386        OWGUI.checkBox(box, self, "gskegg", "KEGG pathways")
387        OWGUI.checkBox(box, self, "gsgo", "GO terms")
388 
[406]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), \
[1063]395            tooltip="Permutation type.", label="Permute")
[406]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
[1063]400
[406]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
[1063]407        box = OWGUI.widgetBox(ca, 'Gene Filtering')
408
409        _ = OWGUI.spin(box, self, "atLeast", 2, 10, label="Min. Values in Group")
410
[406]411        ca.layout().addStretch(1)
412
[395]413        self.addComment("Computation was not started.")
[188]414
[395]415        if sys.platform == "darwin":
416            self.loadFileName = user.home
417        else:
418            self.loadFileName = "."
[188]419
[536]420        self.gridSels = []
[395]421        self.loadSettings()
422 
423        def cleanInvalid(maxn):
424            """
425            Removes invalid gene set selection
426            """
427            notAllOk = True
428
429            while notAllOk:
[536]430                self.gridSels = getattr(self, "gridSels")
[395]431                notAllOk = False
[536]432                for i,a in enumerate(self.gridSels):
[395]433                    if a >= maxn:
[536]434                        self.gridSels.pop(i)
[395]435                        notAllOk = True
436                        break
[536]437       
438        cleanInvalid(len(self.geneSel))
[395]439
[536]440        self.gridSel = self.gridSels
441        self.gridSels = self.gridSel
[395]442
443    def addCollection(self):
444        fname = self.chooseGeneSetsFile()
[536]445
[395]446        if fname:
447            if fname not in self.geneSel:
[536]448       
449                #add it to the list, choose it and keep
450                #all old choosen
451                gridSelc = list(self.gridSel)
452
[395]453                self.geneSel.append(fname)
[536]454                self.geneSel = self.geneSel
[395]455
[536]456                gridSelc.append(len(self.geneSel)-1)
457           
458                self.gridSel = gridSelc
459                self.gridSels = self.gridSel #for saving
460
[395]461
[208]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)
[210]474                   
475                fp = open(fn, "wb" )
[218]476                pickle.dump(self.res, fp, -1)
477                pickle.dump(self.dm, fp, -1)
[210]478                fp.close()
[208]479        else:
480            self.warning('No internal data to save.')
481   
[394]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
[208]490       
[394]491        fp = open(self.loadFileName, "rb")
[210]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)
[188]502
[193]503    def newPathwaySelected(self):
[395]504        #print "newPathwaySelected"
[188]505        qApp.processEvents()
506
507        if not self.selectable:
508            return
509
[942]510        if self.res == None:
511            return
512
[193]513        outat = set([])
514        for item in self.listView.selectedItems():
515            iname = self.lwiToGeneset[item]
[663]516            outat.update(self.res[iname]['genes'])
[941]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
[193]525           
[941]526        dataOut = selectGenes(self.data, select, self.find_genes_loc)
[188]527        self.send("Examples with selected genes only", dataOut)
528
529    def resultsOut(self, data):
530        self.send("Results", data)
531
[194]532    def genesetDistOut(self, dm):
533        self.send("Distance Matrix", dm)
534
[188]535
536    def fillResults(self, res):
537        clearListView(self.listView)
538
539        self.lwiToGeneset = {}
540
541        def writeGenes(g):
[663]542            return ", ".join(g)
[188]543
[1108]544        for gs, rdic in res.items():
545            collection = ",".join(gs.hierarchy) if gs.hierarchy else ""
546            name = ne(gs.id) + " " + ne(gs.name)
[189]547            item = QTreeWidgetItem(self.listView)
[201]548            item.setText(0, collection)
[1108]549            item.setText(1, name)
[663]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']))
[188]557
[1108]558            self.lwiToGeneset[item] = gs
[188]559
560    def addComment(self, comm):
[189]561        item = QTreeWidgetItem(self.listView)
562        item.setText(0, comm)   
[188]563
564    def setSelMode(self, bool):
565        if bool:
566            self.selectable = True
[406]567            self.listView.setSelectionMode(QAbstractItemView.ExtendedSelection)
[188]568        else:
569            self.selectable = False
570            self.listView.setSelectionMode(QListView.NoSelection)
571
[210]572    def compute(self, res=None, dm=None):
[395]573
574        collectionNames = [ self.geneSel[a] for a in self.gridSel ]
[516]575
[1749]576        organism = self.organismTaxids[self.organismIndex]
[516]577
578        if self.gsgo:
[1108]579            collectionNames.append((("GO",),organism))
[516]580        if self.gskegg:
[1108]581            collectionNames.append((("KEGG",),organism))
[516]582
[1108]583        self.geneSets = obiGeneSets.collections(*collectionNames)
[395]584
[188]585        self.resultsOut(None)
586
587        qApp.processEvents()
[210]588        self.res = res
589        self.dm = dm
[942]590
591        clearListView(self.listView)
592        self.addComment("Computing...")
593        qApp.processEvents()
594
[941]595        self.phenVar = self.phenCands[self.selectedPhenVar][0]
596        self.geneVar = self.geneCands[self.selectedGeneVar]
597
[210]598        if self.res == None and self.data:
[188]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
[705]606            kwargs = {}
607            dkwargs = {}
[395]608
[941]609            dkwargs["phenVar"] = self.phenVar
610            dkwargs["geneVar"] = self.geneVar
611
[939]612            if not obiGsea.already_have_correlations(self.data):
613
[705]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
[1063]625                dkwargs["atLeast"] = self.atLeast
626
[705]627                permtype = self.permutationTypes[self.ptype][1]
628                kwargs["permutation"] = "class" if permtype == "p" else "genes"
[188]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
[490]641
[1063]642            #create gene matcher
[1173]643            genematcher = obiGene.matcher([[obiGene.GMKEGG(organism)] + ([obiGene.GMDicty()] if organism == "352472"  else [])])
[1063]644
645            #dkwargs["caseSensitive"] = self.csgm
646
647            gso = obiGsea.GSEA(self.data, matcher=genematcher, **dkwargs)
[188]648
[1108]649           
650            for gs in self.geneSets:
651                gso.addGenesets([gs])
[188]652                qApp.processEvents()
653
654            self.res = gso.compute(n=self.perms, callback=pb.advance, **kwargs)
655           
656            pb.finish()
[208]657           
658        if self.res != None:
[188]659            if len(self.res) > 0:
660                self.fillResults(self.res)
661                self.setSelMode(True)
[194]662                resl = self.res.items()
663
[427]664                etres = exportET(resl)
[938]665                self.resultsOut(etres)
[194]666
[941]667                self.find_genes_dic, self.find_genes_loc = \
668                    find_genes_dic(self.res, self.data, self.geneVar)
669
[938]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
[194]679
[188]680            else:
681                self.setSelMode(False)
682                clearListView(self.listView)
[938]683                self.dm = None
[188]684                self.addComment("No genesets found.")
685
[938]686            self.genesetDistOut(self.dm)
687
[188]688
689    def setData(self, data):
[942]690
691        self.allowComboChangeCallback = False
692
[188]693        self.data = data
694
695        if data:
[1118]696            taxid = data_hints.get_hint(data, "taxid", None)
[1104]697            try:
[1749]698                self.organismIndex = self.organismTaxids.index(taxid)
[1104]699            except Exception, ex:
700                pass
[1749]701
[939]702            if obiGsea.already_have_correlations(data):
[705]703
[188]704                #disable correlation type
705                comboboxItems(self.corTypeF, [])
706                self.corTypeF.setDisabled(True)
707                #set permutation type to fixed
[705]708                self.ptype = 1
[188]709                self.permTypeF.setDisabled(True)
[939]710
[188]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)
[395]717                #print "set classes"
[939]718
[940]719            self.phenCombo.clear()
720            self.phenCands = obiGsea.phenotype_cands(data)
721            self.phenCombo.addItems(map(lambda x: str(x[0]), self.phenCands))
[939]722
[940]723            self.phenCombo.setDisabled(len(self.phenCands) <= 1)
[939]724
[940]725            self.selectedPhenVar = 0
[942]726
727            self.allowComboChangeCallback = True
728
[940]729            self.phenComboChange()
[939]730
731
[942]732
[939]733    def phenComboChange(self):
[942]734
735        if self.allowComboChangeCallback == False:
736            return
737
[939]738        pv = self.phenCands[self.selectedPhenVar]
[942]739
[940]740        self.psel.setClasses(pv[1] if len(pv[1]) > 0 else None)
[939]741
742        def conv(x):
743            if x == True:
744                return "Attribute names"
745            else:
746                return str(x)
747
748        self.geneCombo.clear()
[940]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)
[939]756        self.geneCombo.addItems(map(lambda x: conv(x), self.geneCands))
757        self.selectedGeneVar = 0
758
759        self.geneCombo.setDisabled(len(self.geneCands) <= 1)
[188]760
[395]761    def chooseGeneSetsFile(self):
762        """
763        Return choosen gene sets file name or None, if no file
764        was choosen.
765        """
[1095]766        filename = str(QFileDialog.getOpenFileName(self,  "Choose gene set collection", './', "Gene Collections (*.gmt)"))
[395]767        return filename
[188]768
[941]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"
[188]798
799if __name__=="__main__":
800    a=QApplication(sys.argv)
801    ow=OWGsea()
802    ow.show()
803
[938]804    #d = orange.ExampleTable('/home/marko/testData.tab')
[1108]805    d = orange.ExampleTable('/home/marko/orange/add-ons/Bioinformatics/sterolTalkHepa.tab')
806    #d = orange.ExampleTable('/home/marko/ddd.tab')
[940]807    #d = orange.ExampleTable('tmp.tab')
[1044]808    #d = orange.ExampleTable('../gene_three_lines_log.tab')
[1749]809
810    QTimer.singleShot(1000, lambda : ow.setData(d))
[395]811
812    a.exec_()
[188]813    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.