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

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

Restructuring because we will not be using namespaces.

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