source: orange-bioinformatics/widgets/prototypes/OWDisplayMotifs.py @ 1312:c459a70fa8c8

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