source: orange-bioinformatics/_bioinformatics/widgets/prototypes/OWDisplayMotifs.py @ 1643:2cfa80dac3d3

Revision 1643:2cfa80dac3d3, 10.9 KB checked in by mitar, 2 years ago (diff)

Fixing some imports. Marking widgets as prototypes.

RevLine 
[475]1"""
2<name>Display Motifs</name>
3<description>None.</description>
4<contact>Tomaz Curk</contact>
5<icon>icons\GenomeMap.png</icon>
[1643]6<prototype>1</prototype>
[475]7"""
8
[1633]9from collections import defaultdict
10
[475]11import orange
[1633]12from Orange.OrangeWidgets import OWGUI
13from Orange.OrangeWidgets.OWGraph import *
14from Orange.OrangeWidgets.OWTools import *
15from Orange.OrangeWidgets.OWWidget import *
[1312]16
17class subBarQwtPlotCurve(QwtPlotCurve):
18    def __init__(self, text = None):
19        QwtPlotCurve.__init__(self, text or "")
[475]20        self.color = Qt.black
21
[1312]22    def draw(self, p, xMap, yMap, f, t=-1):
[475]23        p.setBackgroundMode(Qt.OpaqueMode)
24        p.setBrush(self.color)
25        p.setPen(self.color)
[1312]26       
27        if t < 0:
28            t = self.dataSize() - 1
29            f = 0
30        if divmod(f, 2)[1] != 0:
31            f -= 1
32        if divmod(t, 2)[1] == 0:
33            t += 1
34           
[475]35        for i in range(f, t+1, 2):
36            px1 = xMap.transform(self.x(i))
37            py1 = yMap.transform(self.y(i))
38            px2 = xMap.transform(self.x(i+1))
39            py2 = yMap.transform(self.y(i+1))
40            p.drawRect(px1, py1, (px2 - px1), (py2 - py1))
41
42
43class OWDisplayMotifs(OWWidget):
44    settingsList = []
45    def __init__(self,parent=None, signalManager = None):
46        OWWidget.__init__(self, parent, signalManager, "&Display Motifs", 0)
47
48        # set default settings
49        self.colorBy = None
50        self.pvalThresholdIndex = None
51        self.pvalThreshold = None
52
53        #load settings
54        self.loadSettings()
55
56        # GUI
57        self.graph = OWGraph(self.mainArea)
58        self.graph.setYRlabels(None)
59        self.graph.enableGridXB(0)
60        self.graph.enableGridYL(1)
61        self.graph.setAxisMaxMinor(QwtPlot.xBottom, 10)
62        self.graph.setAxisMaxMajor(QwtPlot.xBottom, 10)
63        self.graph.setAxisAutoScale(QwtPlot.xBottom)
64        self.graph.setAxisScale(QwtPlot.xBottom, -1020, 0, 0)
[1312]65        self.mainArea.layout().addWidget(self.graph)
66       
[475]67        # inputs
68        # data and graph temp variables
69        self.inputs = [("Examples", ExampleTable, self.cdata, Default), ("Genes", list, self.newGeneList, Default), ("Motifs", list, self.newMotifList, Default)]
70
71        self.data = None
72        self.motifLines = []
73        self.visibleValues = []
[1312]74        self.valueToCurve = {}
[475]75        self.allGenes = [] ## genes displayed always in same order
76        self.geneList = [] ## selected genes
77        self.motifList = [] ## selected motifs
78        self.valuesPresentInData = []
79
80        self.clusterPostProbThreshold = 0
81
[1312]82        # GUI
83        self.selValues = OWGUI.widgetBox(self.controlArea, "Values")
84        self.selcolorBy = OWGUI.widgetBox(self.controlArea, "Color By")
[475]85
[1312]86        self.colorByCombo = OWGUI.comboBox(self.selcolorBy, self, "colorBy",
87                                           items=[],
88                                           callback=self.colorByChanged)
[475]89       
[1312]90        self.pvalThresholdCombo = OWGUI.comboBox(self.selValues, self, "pvalThresholdIndex",
91                                                 items=[],
92                                                 callback=self.pvalThresholdChanged)
93       
94        self.valuesQLB = QListWidget(self.selValues)
95        self.valuesQLB.setSelectionMode(QListWidget.MultiSelection)
96        self.connect(self.valuesQLB, SIGNAL("itemSelectionChanged()"), self.valuesSelectionChange)
97        self.selValues.layout().addWidget(self.valuesQLB)
98       
99        self.unselectAllQLB = OWGUI.button(self.selValues, self, "Unselect all",
100                                           callback = self.unselAll)
[475]101
102    def unselAll(self):
103        self.valuesQLB.clearSelection()
104
105    def pvalThresholdChanged(self):
106        print self.pvalThresholdIndex
107        if self.pvalThresholdIndex:
108            self.pvalThreshold = float(self.pvalThresholdCombo.text(self.pvalThresholdIndex))
109        else:
110            self.pvalThreshold = None
111        self.calcMotifsGraph()
112        self.updateMotifsGraph()
113
114    def valuesSelectionChange(self):
115        visibleOutcomes = []
[1312]116        for i in range(self.valuesQLB.count()):
117            item = self.valuesQLB.item(i)
118            if item.isSelected():
119                visibleOutcomes.append(str(item.text()))
[475]120        self.visibleValues = visibleOutcomes
121        self.updateMotifsGraph()
122
123    def updateSelectionChange(self):
124        ## make new colors only for those colorBy values present in data
[1312]125        colors = ColorPaletteHSV(len(self.valuesPresentInData))
[475]126        for (i, v) in enumerate(self.valuesPresentInData):
[1312]127            curve = self.valueToCurve[v]
128            curve.color = colors[i]
[475]129
130        self.setValuesNames(self.valuesPresentInData) 
[1312]131        for i in range(self.valuesQLB.count()):
132            item = self.valuesQLB.item(i)
133            item.setSelected(str(item.text()) in self.visibleValues)
134#            else:
135#                self.valuesQLB.setSelected(i, 0)
[475]136
137    def colorByChanged(self):
[1312]138#        self.graph.removeCurves()
139        self.graph.removeDrawingCurves()
140        self.valueToCurve = {}
[475]141
142        if self.colorBy == None:
143            self.setValuesNames(None)
144            return
145           
[1312]146        if self.potentialColorVariables:
147            var = self.potentialColorVariables[self.colorBy]
148            values = sorted(var.values)
149#        values.sort()
[475]150
151        ## generate colors for each colorby value (each color on its own curve)
[1312]152        colors = ColorPaletteHSV(len(values))
[475]153        for (i, v) in enumerate(values):
154            ## create curve in graph
[1312]155            curve = subBarQwtPlotCurve()
[475]156            curve.color = colors[i]
[1312]157            curve.attach(self.graph)
158#            ckey = self.graph.insertCurve(curve)
159            curve.setStyle(QwtPlotCurve.UserCurve)
160            self.valueToCurve[v] = curve
[475]161
162        self.setValuesNames(values)
163        self.calcMotifsGraph()
164
165    def setValuesNames(self, values):
166        self.valuesQLB.clear()
167        if values == None:
168            return
169        for v in values:
[1312]170            self.valuesQLB.addItem(QListWidgetItem(QIcon(ColorPixmap(self.valueToCurve[v].color)), v))
171            self.valuesQLB.item(self.valuesQLB.count() - 1).setSelected(True)
172       
[475]173
174    ## signal processing
175    def newGeneList(self, list):
[1312]176        self.geneList = []
177       
178        if list is not None:
179            self.geneList = list
180            self.calcMotifsGraph()
181            self.updateMotifsGraph()
[475]182 
183    def newMotifList(self, list):
[1312]184        self.motifList = []
185       
186        if list is not None:
187            self.motifList = list
188            self.calcMotifsGraph()
189            self.updateMotifsGraph()
190       
[475]191    def cdata(self, data):
192        self.data = data
193        self.motifLines = []
194        self.colorByCombo.clear()
[1312]195   
[475]196        if self.data == None:
[1312]197            self.colorBy = None
198            self.potentialColorVariables = []
[475]199            self.colorByChanged()
200            self.graph.setYLlabels(None)
201        else:
[1312]202            self.potentialColorVariables = [v for v in self.data.domain.variables + self.data.domain.getmetas().values() \
203                                            if v.varType == orange.VarTypes.Discrete]
204            for var in self.potentialColorVariables:
205                self.colorByCombo.addItem(str(var.name))
206   
[475]207            ## break motif info according to gene (sequenceID)
[1312]208            self.motifLines = defaultdict(list)
[475]209            for e in self.data:
[1312]210                geneID = str(e['sequenceID'])
211                self.motifLines[geneID].append(e)
212               
213            self.allGenes = sorted(self.motifLines.keys())
214            if self.potentialColorVariables:
215                self.colorBy = min(len(self.potentialColorVariables) - 1, self.colorBy or 0)
216            else:
217                self.colorBy = None
218               
[475]219            self.colorByChanged()
[1312]220   
221        if len(self.potentialColorVariables) > 0:
222            self.colorByCombo.setCurrentIndex(0)
[475]223
224    ## update graph
225    def calcMotifsGraph(self):
226        graphData = {}
[1312]227        for (colorKey, curve) in self.valueToCurve.iteritems():
[475]228            graphData[colorKey] = [[], []]
229
230        lineCn = 0
231        yVals = []
232        self.colorByValuesPresentInData = []
233        self.valuesPresentInData = []
234        for lineKey in self.geneList:
235##            if (self.geneList <> None) and (self.geneList <> []) and (lineKey not in self.geneList): continue
236            yVals.append( lineKey)
237            for e in self.motifLines[lineKey]:
[1312]238                motifName = str(e['motifName'])#.value
239                if self.motifList is not None and self.motifList != [] and motifName not in self.motifList:
240                    continue
[475]241
[1312]242                motifDistToEnd = -int(e['distToEnd']) #.value)
243                postProb = int(round(float(e['pvalue']) * 100))
[475]244                dir = str(e['direction'])
245
[1312]246                if 1 or (postProb >= self.clusterPostProbThreshold): ## and (chiSquare >= self.motifChiSquareThreshold):
247                    colorAttr = self.potentialColorVariables[self.colorBy]
248                    colorKey = str(e[colorAttr])
[475]249                    if colorKey not in self.valuesPresentInData:
[1312]250                        self.valuesPresentInData.append(colorKey)
[475]251                    # print motifNumber, colorKey
252                    # set the point x values
253                    graphData[colorKey][0].append(motifDistToEnd)
254                    graphData[colorKey][0].append(motifDistToEnd + 5.0)
255                    # set the point y values
256                    if dir == "1":
257                        graphData[colorKey][1].append(lineCn + 0.0)
258                        graphData[colorKey][1].append(lineCn + 0.30)
259                    elif dir == "-1":
260                        graphData[colorKey][1].append(lineCn - 0.30)
261                        graphData[colorKey][1].append(lineCn + 0.0)
262                    else:
263                        graphData[colorKey][1].append(lineCn - 0.30)
264                        graphData[colorKey][1].append(lineCn + 0.30)
265            lineCn += 1
266
[1312]267        vals = reduce(list.__add__, [val[0] for val in graphData.itervalues()], [])
268        minX = min(vals or [0]) - 5.0
269        maxX = max(vals or [0]) + 5.0
270       
[475]271        self.graph.setYLlabels(yVals)
272        self.graph.setAxisScale(QwtPlot.yLeft, -0.5, len(yVals) - 0.5, 1)
[1312]273        self.graph.setAxisScale(QwtPlot.xBottom, minX, maxX)
[475]274
[1312]275        for (colorKey, curve) in self.valueToCurve.iteritems():
276            curve.setData(graphData[colorKey][0], graphData[colorKey][1])
277            curve.setVisible(colorKey in self.visibleValues)
278        self.graph.replot()
[475]279        self.valuesPresentInData.sort()
280        self.visibleValues = [v for v in self.valuesPresentInData]
281        self.updateSelectionChange()
282       
283    def updateMotifsGraph(self):
[1312]284        for (colorKey, curve) in self.valueToCurve.items():
285            curve.setVisible(colorKey in self.visibleValues)
286        self.graph.replot()
[475]287
288if __name__ == "__main__":
289    a = QApplication(sys.argv)
290    owdm = OWDisplayMotifs()
[1312]291    owdm.cdata(orange.ExampleTable(os.path.expanduser("~/Desktop/motif.tab")))
292    owdm.newGeneList(["1", "2"])
[475]293    owdm.show()
[1312]294    a.exec_()
[475]295    owdm.saveSettings()
Note: See TracBrowser for help on using the repository browser.