source: orange-bioinformatics/_bioinformatics/widgets/OWSetEnrichment.py @ 1636:10d234fdadb9

Revision 1636:10d234fdadb9, 26.9 KB checked in by mitar, 2 years ago (diff)

Restructuring because we will not be using namespaces.

RevLine 
[1478]1"""<name>Gene Set Enrichment</name>
2"""
3
[1632]4from __future__ import absolute_import, with_statement
[1478]5
6import math
7from collections import defaultdict
8
[1632]9from Orange.orng import orngEnviron, orngServerFiles
10from Orange.orng.orngDataCaching import data_hints
11from Orange.OrangeWidgets import OWGUI
12from Orange.OrangeWidgets.OWGUI import LinkStyledItemDelegate, LinkRole
13from Orange.OrangeWidgets.OWGUI import BarItemDelegate
14from Orange.OrangeWidgets.OWWidget import *
15
16from .. import obiGene, obiGeneSets, obiProb, obiTaxonomy
[1478]17
[1498]18def _toPyObject(variant):
19    val = variant.toPyObject()
20    if isinstance(val, type(NotImplemented)): # PyQt 4.4 converts python int, floats ... to C types
21        qtype = variant.type()
22        if qtype == QVariant.Double:
23            val, ok = variant.toDouble()
24        elif qtype == QVariant.Int:
25            val, ok = variant.toInt()
26        elif qtype == QVariant.LongLong:
27            val, ok = variant.toLongLong()
28        elif qtype == QVariant.String:
29            val = variant.toString()
30    return val
[1478]31
32class MyTreeWidget(QTreeWidget):
33    def paintEvent(self, event):
34        QTreeWidget.paintEvent(self, event)
35        if getattr(self, "_userMessage", None):
36            painter = QPainter(self.viewport())
37            font = QFont(self.font())
38            font.setPointSize(15)
39            painter.setFont(font)
40            painter.drawText(self.viewport().geometry(), Qt.AlignCenter, self._userMessage)
41            painter.end()
42           
[1498]43class MyTreeWidgetItem(QTreeWidgetItem):
44    def __lt__(self, other):
45        if not self.treeWidget():
46            return id(self) < id(other)
47        column = self.treeWidget().sortColumn()
48        lhs = _toPyObject(self.data(column, Qt.DisplayRole))
49        rhs = _toPyObject(other.data(column, Qt.DisplayRole))
50        return lhs < rhs
[1574]51   
52def name_or_none(id):
53    """Return organism name for ncbi taxid or None if not found.
54    """
55    try:
56        return obiTaxonomy.name(id)
57    except obiTaxonomy.UnknownSpeciesIdentifier:
58        return None
[1478]59           
60class OWSetEnrichment(OWWidget):
61    settingsList = ["speciesIndex", "genesinrows", "geneattr", "categoriesCheckState"]
62    contextHandlers = {"":DomainContextHandler("", ["speciesIndex", "genesinrows", "geneattr", "categoriesCheckState"])}
63   
[1498]64    def __init__(self, parent=None, signalManager=None, name="Gene Set Enrichment Analysis", **kwargs):
[1478]65        OWWidget.__init__(self, parent, signalManager, name, **kwargs)
66        self.inputs = [("Example Table", ExampleTable, self.setData, Default), ("Reference", ExampleTable, self.setReference)]
67        self.outputs = [("Selected Examples", ExampleTable)]
68       
69        self.speciesIndex = 0
70        self.genesinrows = False
71        self.geneattr = 0
72        self.geneMatcherSettings = [False, False, True, False]
73        self.useReferenceData = False
74        self.useMinCountFilter = True
75        self.useMaxPValFilter = True
76        self.minClusterCount = 0
77        self.maxPValue = 0.01
78       
79        self.useFDR = True
80       
81        self.categoriesCheckState = {}
82       
83        self.loadSettings()
84       
85        self.signalManager.freeze(self).push()
86        QTimer.singleShot(50, self.updateHierarchy)
87       
88        box = OWGUI.widgetBox(self.controlArea, "Info")
89        self.infoBox = OWGUI.widgetLabel(box, "Info")
90        self.infoBox.setText("No data on input")
91       
92        self.speciesComboBox = OWGUI.comboBox(self.controlArea, self,
93                      "speciesIndex", "Species",
94                      callback=lambda :self.data and self.updateAnnotations(),
95                      debuggingEnabled=0)
96       
97        box = OWGUI.widgetBox(self.controlArea, "Gene names")
98        self.geneAttrComboBox = OWGUI.comboBox(box, self, "geneattr",
99                                "Gene attribute",
100                                sendSelectedValue=0,
101                                callback=self.updateAnnotations)
102       
103        cb = OWGUI.checkBox(box, self, "genesinrows", "Use attribute names",
104                            callback=lambda :self.data and self.updateAnnotations(),
105                            disables=[(-1, self.geneAttrComboBox)])
106        cb.makeConsistent()
107       
108        OWGUI.button(box, self, "Gene matcher settings",
109                     callback=self.updateGeneMatcherSettings,
110                     tooltip="Open gene matching settings dialog",
111                     debuggingEnabled=0)
112       
113        self.referenceRadioBox = OWGUI.radioButtonsInBox(self.controlArea,
114                    self, "useReferenceData", ["Entire genome", "Reference set (input)"],
115                    tooltips=["Use entire genome for reference",
116                              "Use genes from Referece Examples input signal as reference"],
117                    box="Reference", callback=self.updateAnnotations)
118       
119        box = OWGUI.widgetBox(self.controlArea, "Annotation Summary")
120        self.groupsWidget = QTreeWidget(self)
121        self.groupsWidget.setHeaderLabels(["Category"])
122        box.layout().addWidget(self.groupsWidget)
123
124        hLayout = QHBoxLayout()
125        hLayout.setSpacing(10)
[1498]126        hWidget = OWGUI.widgetBox(self.mainArea, orientation=hLayout)
127        sb, sbcb = OWGUI.spin(hWidget, self, "minClusterCount",
[1478]128                              0, 100, label="Min. Count",
129                              tooltip="Minimum gene count",
130                              callback=self.filterAnnotationsChartView,
131                              callbackOnReturn=True,
132                              checked="useMinCountFilter",
133                              checkCallback=self.filterAnnotationsChartView)
134       
[1498]135        dsp, dspcb = OWGUI.doubleSpin(hWidget, self,
[1478]136                        "maxPValue", 0.0, 1.0, 0.0001,
137                        label="Max. P-Value",
138                        tooltip="Maximum (FDR corrected) P-Value",
139                        callback=self.filterAnnotationsChartView,
140                        callbackOnReturn=True,
141                        checked="useMaxPValFilter",
142                        checkCallback=self.filterAnnotationsChartView)
143       
[1632]144        from Orange.OrangeWidgets import OWGUIEx
[1478]145        self.filterLineEdit = OWGUIEx.QLineEditWithActions(self)
146        self.filterLineEdit.setPlaceholderText("Filter ...")
147        action = QAction(QIcon(os.path.join(orngEnviron.canvasDir,
148                        "icons", "delete_gray.png")), "Clear", self)
149       
150        self.filterLineEdit.addAction(action, 0, Qt.AlignHCenter)
151        self.connect(action, SIGNAL("triggered()"), self.filterLineEdit.clear)
152       
153        self.filterCompleter = QCompleter(self.filterLineEdit)
154        self.filterCompleter.setCaseSensitivity(Qt.CaseInsensitive)
155        self.filterLineEdit.setCompleter(self.filterCompleter)
156       
157        hLayout.addWidget(self.filterLineEdit)
[1498]158        self.mainArea.layout().addWidget(hWidget)
[1478]159       
160        self.connect(self.filterLineEdit, SIGNAL("textChanged(QString)"),
161                     self.filterAnnotationsChartView)
162       
163        self.annotationsChartView = MyTreeWidget(self)
164        self.annotationsChartView.setHeaderLabels(["Category", "Term",
165                            "Count", "Reference count", "P-Value", "Enrichment"])
166        self.annotationsChartView.setAlternatingRowColors(True)
167        self.annotationsChartView.setSortingEnabled(True)
168        self.annotationsChartView.setSelectionMode(QAbstractItemView.ExtendedSelection)
169        self.annotationsChartView.setRootIsDecorated(False)
170        self.annotationsChartView.viewport().setMouseTracking(True)
171#        self.annotationsChartView.viewport().setAttribute(Qt.WA_Hover)
172        self.mainArea.layout().addWidget(self.annotationsChartView)
173       
174        contextEventFilter = OWGUI.VisibleHeaderSectionContextEventFilter(self.annotationsChartView)
175        self.annotationsChartView.header().installEventFilter(contextEventFilter)
176       
177        self.taxid_list = []
178       
179        self.connect(self.groupsWidget, SIGNAL("itemClicked(QTreeWidgetItem *, int)"), self.subsetSelectionChanged)
180       
181        OWGUI.button(self.controlArea, self, "Commit", callback=self.commit)
182       
183        self.loadedGenematcher = "None"
184        self.referenceData = None
185        self.data = None
186       
187        self.treeItems = []
188       
189        self.resize(1024, 600)
190       
191        self.connect(self, SIGNAL("widgetStateChanged(QString, int, QString)"), self.onStateChange)
192       
[1498]193        self.updatingAnnotationsFlag = False
194       
[1478]195    def updateHierarchy(self):
196        try:
197            self.progressBarInit()
198            with orngServerFiles.DownloadProgress.setredirect(self.progressBarSet):
199                all, local = obiGeneSets.list_all(), obiGeneSets.list_local()
200                organisms = set(obiTaxonomy.essential_taxids() + [t[1] for t in all])
201            self.progressBarFinished()
[1574]202           
203            organism_names = map(name_or_none, organisms)
204            organisms = [taxid for taxid, name in zip(organisms, organism_names) \
205                         if name is not None]
206           
[1478]207            self.taxid_list = list(organisms)
208            self.speciesComboBox.clear()
209            self.speciesComboBox.addItems([obiTaxonomy.name(id) for id in self.taxid_list])
210            self.genesets = all
211        finally:
212            self.signalManager.freeze(self).pop() #setFreeze(self.signalManager.freezing - 1)
213       
214    def setData(self, data=None):
215        self.data = data
216        self.error(0)
217        self.closeContext("")
218        self.geneAttrComboBox.clear()
219        self.groupsWidget.clear()
220        self.annotationsChartView.clear()
221       
222        if not getattr(self,"taxid_list", None):
223            QTimer.singleShot(100, lambda data=data: self.setData(data))
224            return 
225        if data:
226            self.geneAttrs = [attr for attr in data.domain.variables + data.domain.getmetas().values() \
227                              if attr.varType != orange.VarTypes.Continuous]
228           
229            self.geneAttrComboBox.addItems([attr.name for attr in self.geneAttrs])
230            self.geneattr = min(self.geneattr, len(self.geneAttrs) - 1)
231             
232            taxid = data_hints.get_hint(data, "taxid", "")
233            try:
234                self.speciesIndex = self.taxid_list.index(taxid)
235            except ValueError, ex:
236                pass
237            self.genesinrows = data_hints.get_hint(data, "genesinrows", self.genesinrows)
238           
239            self.openContext("", data)
240           
241#            print self.speciesIndex
242           
243            self.setHierarchy(self.getHierarchy(taxid=self.taxid_list[self.speciesIndex]))
244           
245            self.loadedGenematcher = "None"
246            self.updateAnnotations()
247           
248    def setReference(self, data=None):
249        self.referenceData = data
250        self.referenceRadioBox.setEnabled(bool(data))
251       
252    def getHierarchy(self, taxid):
253        def recursive_dict():
254            return defaultdict(recursive_dict)
255        collection = recursive_dict()
256       
257        def collect(col, hier):
258            if hier:
259                collect(col[hier[0]], hier[1:])
260               
261        for hierarchy, t_id, _ in self.genesets:
262            collect(collection[t_id], hierarchy)
263        return collection[taxid]
264       
265    def setHierarchy(self, hierarchy):
266        self.groupsWidgetItems = {}
267        def fill(col, parent, full=()):
268            for key, value in sorted(col.items()):
269                full_cat = full + (key,)
270                item = QTreeWidgetItem(parent, [key])
271                item.setFlags(item.flags() | Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled)
272                if value:
273                    item.setFlags(item.flags() | Qt.ItemIsTristate)
274                   
275                item.setData(0, Qt.CheckStateRole, QVariant(self.categoriesCheckState.get(full_cat, Qt.Checked)))
276                item.setExpanded(True)
277                item.category = full_cat
278                self.groupsWidgetItems[full_cat] = item
279                fill(value, item, full_cat)
280               
281        fill(hierarchy, self.groupsWidget)
282       
283#    def updateCategoryCounts(self):
284#        for cat, item in self.groupWidgetItem:
285#            item.setData(1, QVariant(), Qt.DisplayRole)
286       
287    def selectedCategories(self):
288        taxid = self.taxid_list[self.speciesIndex]
289        return [(key, taxid) for key, check in self.getHierarchyCheckState().items() if check == Qt.Checked]
290
291    def getHierarchyCheckState(self):
292        def collect(item, full=()):
293            checked = item.checkState(0)
294            name = str(item.data(0, Qt.DisplayRole).toString())
295            full_cat = full + (name,)
296            result = [(full_cat, checked)]
297            for i in range(item.childCount()):
298                result.extend(collect(item.child(i), full_cat))
299            return result
300           
301        items = [self.groupsWidget.topLevelItem(i) for i in range(self.groupsWidget.topLevelItemCount())]
302        states = reduce(list.__add__, [collect(item) for item in items], [])
303        return dict(states)
304           
305    def subsetSelectionChanged(self, item, column):
306        self.categoriesCheckState = self.getHierarchyCheckState()
307       
308        categories = self.selectedCategories()
309        if not set(categories) <= set(self.currentAnnotatedCategories):
310            self.updateAnnotations()
311        else:
312            self.filterAnnotationsChartView()
313       
314    def updateGeneMatcherSettings(self):
[1632]315        from .OWGOEnrichmentAnalysis import GeneMatcherDialog
[1478]316        dialog = GeneMatcherDialog(self, defaults=self.geneMatcherSettings, enabled=[True] * 4, modal=True)
317        if dialog.exec_():
318            self.geneMatcherSettings = [getattr(dialog, item[0]) for item in dialog.items]
319            self.loadedGenematcher = "None"
320            if self.data:
321                self.updateAnnotations()
322               
323    def updateGenematcher(self):
324        taxid = self.taxid_list[self.speciesIndex]
325        if taxid != self.loadedGenematcher:
326            self.progressBarInit()
327            call = self.asyncCall(obiGene.matcher, name="Gene Matcher", blocking=True, thread=self.thread())
328            call.connect(call, SIGNAL("progressChanged(float)"), self.progressBarSet)
329            with orngServerFiles.DownloadProgress.setredirect(call.emitProgressChanged):
330#            with orngServerFiles.DownloadProgress.setredirect(self.progressBarSet):
331                matchers = [obiGene.GMGO, obiGene.GMKEGG, obiGene.GMNCBI, obiGene.GMAffy]
332                if any(self.geneMatcherSettings):
333                    call.__call__([gm(taxid) for gm, use in zip(matchers, self.geneMatcherSettings) if use])
334                    self.genematcher = call.get_result()
335#                    self.genematcher = obiGene.matcher([gm(taxid) for gm, use in zip(matchers, self.geneMatcherSettings) if use])
336                else:
337                    self.genematcher = obiGene.GMDirect()
338#                self.genematcher.set_targets(self.referenceGenes())
339                self.loadedGenematcher = taxid
340            self.progressBarFinished()
341           
342    def genesFromExampleTable(self, table):
343        if self.genesinrows:
344            genes = [attr.name for attr in table.domain.attributes]
345        else:
346            geneattr = self.geneAttrs[self.geneattr]
347            genes = [str(ex[geneattr]) for ex in table]
348        return genes
349   
350    def clusterGenes(self):
351        return self.genesFromExampleTable(self.data)
352   
353    def referenceGenes(self):
354        if self.referenceData and self.useReferenceData:
355            return self.genesFromExampleTable(self.referenceData)
356        else:
357            taxid = self.taxid_list[self.speciesIndex]
358            call = self.asyncCall(obiGene.NCBIGeneInfo, (taxid,), name="Load reference genes", blocking=True, thread=self.thread())
359            call.connect(call, SIGNAL("progressChanged(float)"), self.progressBarSet)
360            with orngServerFiles.DownloadProgress.setredirect(call.emitProgressChanged):
361                call.__call__()
362                return call.get_result()
363   
364    def _cached_name_lookup(self, func, cache):
365        def f(name, cache=cache):
366            if name not in cache:
367                cache[name] = func(name)
368            return cache[name]
369        return f
370   
371    def mapGeneNames(self, names, cache=None, passUnknown=False):
372        if cache is not None:
373            umatch = self._cached_name_lookup(self.genematcher.umatch, cache)
374        else:
375            umatch = self.genematcher.umatch
376        if passUnknown:
377            return [umatch(name) or name for name in names]
378#            return [(mapped_name or name, mapped_name is not None) for mapped_name, name in zip(mapped, names)]
379        return [n for n in [umatch(name) for name in names] if n is not None]
380   
381    def enrichment(self, geneset, cluster, reference, pval=obiProb.Hypergeometric(), cache=None):
382        genes = set(self.mapGeneNames(geneset.genes, cache, passUnknown=False))
383       
384        cmapped = genes.intersection(cluster)
385        rmapped = genes.intersection(reference)
386        return (cmapped, rmapped, pval.p_value(len(cmapped), len(reference), len(rmapped), len(cluster)), float(len(cmapped)) / (len(cluster) or 1) / (float(len(rmapped) or 1) / (len(reference) or 1))) # TODO: compute all statistics here
387   
388    def updateAnnotations(self):
389        self.updatingAnnotationsFlag = True
390        self.annotationsChartView.clear()
391        self.error([0, 1])
392        if not self.genesinrows and len(self.geneAttrs) == 0:
393            self.error(0, "Input data contains no attributes with gene names")
394            return
395       
396        self.progressBarInit()
397        self.updateGenematcher()
398        self.currentAnnotatedCategories = categories = self.selectedCategories()
399       
400        ## Load collections in a worker thread
401        call = self.asyncCall(obiGeneSets.collections, categories, name="Loading collections", blocking=True, thread=self.thread())
402        call.connect(call, SIGNAL("progressChanged(float)"), self.progressBarSet)
403        with orngServerFiles.DownloadProgress.setredirect(call.emitProgressChanged):
404            call.__call__()
405            collections = list(call.get_result())
406           
407#        with orngServerFiles.DownloadProgress.setredirect(self.progressBarSet):
408#            collections = list(obiGeneSets.collections(*categories))
409        clusterGenes, referenceGenes = self.clusterGenes(), self.referenceGenes()
410        cache = {}
411
412        self.genematcher.set_targets(referenceGenes)
413       
414        countAll = len(set(clusterGenes))
415        infoText = "%i unique gene names on input\n" % countAll
416        referenceGenes = set(self.mapGeneNames(referenceGenes, cache, passUnknown=False))
417        self.progressBarSet(1)
418        clusterGenes = set(self.mapGeneNames(clusterGenes, cache, passUnknown=False))
419        self.progressBarSet(2)
420        infoText += "%i (%.1f) gene names matched" % (len(clusterGenes), 100.0 * len(clusterGenes) / countAll)
421        self.infoBox.setText(infoText)
422       
423        results = []
[1632]424        from Orange.orng.orngMisc import progressBarMilestones
[1478]425       
426        milestones = progressBarMilestones(len(collections), 100)
427        for i, geneset in enumerate(collections):
428            results.append((geneset, self.enrichment(geneset, clusterGenes, referenceGenes, cache=cache)))
429            if i in milestones:
430                self.progressBarSet(100.0 * i / len(collections))
431               
432        if self.useFDR:
433            results = sorted(results, key=lambda a:a[1][2])
434            pvals = obiProb.FDR([pval for _, (_, _, pval, _) in results])
435            results = [(geneset, (cmapped, rmapped, pvals[i], es)) for i, (geneset, (cmapped, rmapped, _, es)) in enumerate(results)]
436       
437        fmt = lambda score, max_decimals=10: "%%.%if" % min(int(abs(math.log(max(score, 1e-10)))) + 2, max_decimals) if score > math.pow(10, -max_decimals) and score < 1 else "%.1f"
438        self.annotationsChartView.clear()
439       
440        maxCount = max([len(cm) for _, (cm, _, _, _) in results] + [1])
441        maxRefCount = max([len(rc) for _, (_, rc, _, _) in results] + [1])
442        countSpaces = int(math.ceil(math.log10(maxCount)))
443        refSpaces = int(math.ceil(math.log(maxRefCount)))
444        countFmt = "%"+str(countSpaces) + "s  (%.2f%%)"
445        refFmt = "%"+str(refSpaces) + "s  (%.2f%%)"
446           
447        self.filterCompleter.setModel(None)
448        linkFont = QFont(self.annotationsChartView.viewOptions().font)
449        linkFont.setUnderline(True)
450        self.treeItems = []
451        for i, (geneset, (cmapped, rmapped, p_val, enrichment)) in enumerate(results):
452            if len(cmapped) > 0:
[1498]453                item = MyTreeWidgetItem(self.annotationsChartView, [" ".join(geneset.hierarchy), geneset.name])
[1478]454                item.setData(2, Qt.DisplayRole, QVariant(countFmt % (len(cmapped), 100.0*len(cmapped)/countAll)))
[1498]455                item.setData(2, Qt.ToolTipRole, QVariant(len(cmapped))) # For filtering
[1478]456                item.setData(3, Qt.DisplayRole, QVariant(refFmt % (len(rmapped), 100.0*len(rmapped)/len(referenceGenes))))
457                item.setData(4, Qt.DisplayRole, QVariant(p_val))
458                item.setData(5, Qt.DisplayRole, QVariant(enrichment))
459                item.setData(5, Qt.ToolTipRole, QVariant("%.3f" % enrichment))
460                item.geneset= geneset
461                self.treeItems.append(item)
462                if geneset.link:
463                    item.setData(1, LinkRole, QVariant(geneset.link))
464                    item.setToolTip(1, geneset.link)
465                    item.setFont(1, linkFont)
466                    item.setForeground(1, QColor(Qt.blue))
467                   
468        if not self.treeItems:
469            self.warning(0, "No enriched sets found.")
470        else:
471            self.warning(0)
472               
473        replace = lambda s:s.replace(",", " ").replace("(", " ").replace(")", " ")
474        self._completerModel = completerModel = QStringListModel(sorted(reduce(set.union, [[geneset.name] + replace(geneset.name).split() for geneset, (c, _, _, _) in results if c], set())))
475        self.filterCompleter.setModel(completerModel)
476       
477        self.annotationsChartView.setItemDelegateForColumn(5, BarItemDelegate(self, scale=(0.0, max(t[1][3] for t in results))))
478        self.annotationsChartView.setItemDelegateForColumn(1, LinkStyledItemDelegate(self.annotationsChartView))
479               
480        for i in range(self.annotationsChartView.columnCount()):
481            self.annotationsChartView.resizeColumnToContents(i)
482           
483        self.annotationsChartView.setColumnWidth(1, min(self.annotationsChartView.columnWidth(1), 300))
484        self.progressBarFinished()
485        QTimer.singleShot(10, self.filterAnnotationsChartView)
486        self.updatingAnnotationsFlag = False
487   
488    def filterAnnotationsChartView(self, filterString=""):
489        if self.updatingAnnotationsFlag:
490            return
491        categories = set(" ".join(cat) for cat, taxid in self.selectedCategories())
492        filterString = str(self.filterLineEdit.text()).lower()
493        itemsHidden = []
494        for item in self.treeItems:
495            item_cat = str(item.data(0, Qt.EditRole).toString())
[1498]496            count, pval = _toPyObject(item.data(2, Qt.ToolTipRole)), _toPyObject(item.data(4, Qt.DisplayRole))
[1478]497            geneset = item.geneset.name.lower()
498            hidden = item_cat not in categories or (self.useMinCountFilter and count < self.minClusterCount) or \
499                     (self.useMaxPValFilter and pval > self.maxPValue) or filterString not in geneset
500            item.setHidden(hidden)
501            itemsHidden.append(hidden)
502           
503        if self.treeItems and all(itemsHidden):
504            self.information(0, "All sets were filtered out.")
505        else:
506            self.information(0)
507           
508       
509    def commit(self):
510        selected = self.annotationsChartView.selectedItems()
511        genesets = [item.geneset for item in selected]
512        cache = {}
513        mappedNames = set(self.mapGeneNames(reduce(set.union, [geneset.genes for geneset in genesets], set()), cache))
514        if self.genesinrows:
515            mapped = [attr for attr in self.data.domain.attributes if self.genematcher.umatch(attr.name) in mappedNames]
516            newdomain = orange.Domain(mapped, self.data.domain.classVar)
517            newdomain.addmetas(self.data.domain.getmetas())
518            data = orange.ExampleTable(newdomain, self.data)
519        else:
520            geneattr = self.geneAttrs[self.geneattr]
521            selected = [1 if self.genematcher.umatch(str(ex[geneattr])) in mappedNames else 0 for ex in self.data]               
522            data = self.data.select(selected)
523           
524#            if self.appendAnnotations:
525#                meta = orange.StringVariable("Annotations")
526#                data.domain.addmeta(orange.newmetaid(), meta)
527#                for ex in data:
528#                    geneattr = self.geneAttrs[self.geneattr]
529#                    gene = str(ex[geneattr])
530#                    annotations = getgene
531       
532        self.send("Selected Examples", data)
533       
534    def sendReport(self):
535        self.reportSettings("Settings", [("Organism", obiTaxonomy.name(self.taxid_list[self.speciesIndex]))])
536        self.reportSettings("Filter", [("Min cluster size", self.minClusterCount if self.useMinCountFilter else 0),
537                                       ("Max p-value", self.maxPValue if self.useMaxPValFilter else 1.0)])
538   
539        self.reportSubsection("Annotations")
540        self.reportRaw(reportItemView(self.annotationsChartView))
541       
542    def onStateChange(self, stateType, id, text):
543        if stateType == "Warning" or stateType == "Info":
544            self.annotationsChartView._userMessage = text
545            self.annotationsChartView.viewport().update()
546       
547       
548def reportItemView(view):
549    model = view.model()
550    return reportItemModel(view, model)
551   
552def reportItemModel(view, model, index=QModelIndex()):
553    if not index.isValid() or model.hasChildren(index):
554        columnCount, rowCount = model.columnCount(index), model.rowCount(index)
555        if not index.isValid():
556            text = '<table>\n<tr>' + ''.join('<th>%s</th>' % model.headerData(i, Qt.Horizontal, Qt.DisplayRole).toString() for i in range(columnCount)) +'</tr>\n'
557        else:
558#            variant = model.data(index, Qt.DisplayRole)
559#            text = '<table' + (' caption="%s"' % variant.toString() if variant.isValid() else '') + '>\n'
560            pass
561        text += ''.join('<tr>' + ''.join('<td>' + reportItemModel(view, model, model.index(row, column, index)) + '</td>' for column in range(columnCount)) + '</tr>\n' for row in range(rowCount) if not view.isRowHidden(row, index))
562        text += '</table>'
563        return text
564    else:
565        variant = model.data(index, Qt.DisplayRole)
566        return str(variant.toString()) if variant.isValid() else ""
567
568   
569if __name__ == "__main__":
570    import cProfile
571   
572    app = QApplication(sys.argv)
573    w = OWSetEnrichment()
574    w.updateHierarchy()
575    data = orange.ExampleTable("../../../doc/datasets/brown-selected")
576#    data = orange.ExampleTable("../human")
577#    print cProfile.runctx("w.setData(data)", globals(), locals())
578    w.setData(data)
579    w.show()
580    app.exec_()
581    w.saveSettings()
582   
Note: See TracBrowser for help on using the repository browser.