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

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

Fixing some imports. Marking widgets as prototypes.

RevLine 
[475]1## Automatically adapted for numpy.oldnumeric Oct 04, 2007 by
2
3"""
4<name>Approximate Profiles</name>
5<description>Approximation of expression profiles by various kernel functions.</description>
6<icon>icons/ApproximateProfiles.png</icon>
7<priority>310</priority>
8<contact>Peter Juvan (peter.juvan@fri.uni-lj.si)</contact>
[1643]9<prototype>1</prototype>
[475]10"""
11
[1633]12from __future__ import absolute_import
13
[475]14import numpy.oldnumeric as Numeric
15
[1633]16from Orange.OrangeWidgets import OWGUI
17from Orange.OrangeWidgets.OWWidget import *
18
19from .. import chipappx, chipstat
20from .OWDataFiles import DataFiles
[475]21
22class OWApproxProfiles(OWWidget):
23    settingsList  = ['kernel', 'kernelSize', 'useSignificance', 'alpha', 'commitOnChange']
24
25    def __init__(self, parent=None, signalManager = None, name='Approximate Profiles'):
26        self.callbackDeposit = [] # deposit for OWGUI callback functions
27        OWWidget.__init__(self, parent, signalManager, name)
28
29        self._data = None       # exampleTable
30        self._dataN = None      # 2d numeric array
31        self._chipdata = None       # [(dirname0, [et0, et1, ...]), ...]
32        self._chipdataN = None      # 3d numeric array
33        self.kernel = 0
34        self.kernels = ["Orthogonal polynomials", "Trigonometric functions"]
35        self.kernelSize = None
36        self.kernelSizes = [    ["Const"] + map(lambda x: "degree <= %i"%x, range(1,99)),
37                                ["Const", "cos x", "sin x"] + reduce(lambda x,y: x+[y[0],y[1]], map(lambda i: ("cos %ix"%i, "sin %ix"%i), range(2,99)), [])
38                            ]
39        self.useSignificance = 0
40        self.alpha = 3
41        self.alphas = [0.0001, 0.001, 0.01, 0.05, 0.1, 0.2, 0.5]
42        self.commitOnChange = 1
43               
44        # Settings
45        self.loadSettings()
46
47        # GUI: info, comboKernelSize, cbUseSignificance, vboxSignificance, commitBtn
48        # info
49        box = QVGroupBox("Info", self.controlArea)
50        self.infoa = QLabel("No examples on input", box)
51        OWGUI.separator(box,250)
52        self.infob = QLabel("No structured data on input", box)
53        OWGUI.separator(self.controlArea)
54
55        # kernel selection
56        box = QVGroupBox("Kernel functions", self.controlArea)
57        OWGUI.comboBox(box, self, "kernel", items=self.kernels, callback=self.kernelChange)
58        OWGUI.separator(self.controlArea)
59
60        # kernel settings
61        box = QVGroupBox("Kernel settings", self.controlArea)
62        self.comboKernelSize = OWGUI.comboBox(box, self, "kernelSize", callback=self.kernelSizeChange, label="Number of kernel functions", labelWidth=135, orientation="horizontal", valueType=int)
63        self.comboKernelSize.setDisabled(1)
64        self.cbUseSignificance = OWGUI.checkBox(box, self, "useSignificance", "Significance of coefficients (F-statistics)", callback=self.useSignificanceChange, tooltip="Use kernels with coefficients significantly different from 0.")
65        self.vboxSignificance = QVBox(box)
66        OWGUI.comboBox(self.vboxSignificance, self, "alpha", items = self.alphas, callback=self.alphaChange, label="p <", labelWidth=20, orientation="horizontal")
67        OWGUI.separator(self.controlArea)
68
69        # output
70        box = QVGroupBox("Output", self.controlArea)
71        OWGUI.checkBox(box, self, 'commitOnChange', 'Commit data on selection change')
72        self.commitBtn = OWGUI.button(box, self, "Commit", callback=self.senddata, disabled=1)
73
74        self.inputs = [("Examples", ExampleTable, self.data), ("Structured Data", DataFiles, self.chipdata)]
75        self.outputs = [("Approximated Examples", ExampleTable, Default), ("Approximation Coefficients", ExampleTable), ("Approximated Structured Data", DataFiles, Default), ("Structured Approximation Coefficients", DataFiles)]
76        self.resize(200,100)
77
78    def kernelChange(self):
79        numPoints = self._getMinDataShape1()
80        if self.kernel == 0 and self.kernelSize < numPoints-1:
81            self.cbUseSignificance.setEnabled(1)
82            self.vboxSignificance.setEnabled(1)
83        else:
84            self.cbUseSignificance.setDisabled(1)
85            self.vboxSignificance.setDisabled(1)
86        self.setGuiCommonExpChip()
87        if self.commitOnChange:
88            self.senddata()
89
90    def kernelSizeChange(self):
91        numPoints = self._getMinDataShape1()
92        if self.kernel == 0:
93            if self.kernelSize in [0, numPoints-1]:
94                self.cbUseSignificance.setDisabled(1)
95                self.vboxSignificance.setDisabled(1)
96            else:
97                self.cbUseSignificance.setEnabled(1)
98                self.vboxSignificance.setEnabled(1)
99        if self.commitOnChange:
100            self.senddata()
101
102    def alphaChange(self):
103        if self.commitOnChange:
104            self.senddata()
105
106    def useSignificanceChange(self):
107        if self.useSignificance:
108            self.vboxSignificance.setEnabled(1)
109        else:
110            self.vboxSignificance.setDisabled(1)
111        if self.commitOnChange:
112            self.senddata()
113
114    def _getMinDataShape1(self):           
115        numPoints = 1e9 # number of attributes (if both inputs present: take min.)
116        if self._dataN != None: numPoints = min(numPoints, self._dataN.shape[1])
117        if self._chipdataN != None: numPoints = min(numPoints, self._chipdataN.shape[1])
118        if numPoints == 1e9: numPoints = 0
119        return numPoints
120
121    def setGuiCommonExpChip(self):
122        """Sets GUI features that depend on both inputs, e.g. max. values of sliders, commit button.
123        """
124        numPoints = self._getMinDataShape1()
125        # set up comboKernelSize
126        self.comboKernelSize.clear()
127        # print "numPoints:", numPoints
128        if numPoints > 0:
129            for i in range(0,numPoints):
130                self.comboKernelSize.insertItem(self.kernelSizes[self.kernel][i])
131            if self.kernelSize==None or self.kernelSize >= numPoints:
132                self.kernelSize = max([int((numPoints)/2)-2,0])
133            self.comboKernelSize.setCurrentItem(self.kernelSize)
134            self.comboKernelSize.setEnabled(1)
135            self.commitBtn.setEnabled(1)
136        else:
137            self.comboKernelSize.setDisabled(1)
138            #self.kernelSize = None
139            self.commitBtn.setDisabled(1)
140
141    def data(self, data):
142        if data != None:
143            self._data = data
144            self._dataN = chipstat.orng2ma(data)
145            self.infoa.setText("Examples: %i profiles on %i points" % (self._dataN.shape[0], self._dataN.shape[1]))
146        else:
147            self._data = None
148            self._dataN = None
149            self.infoa.setText("No examples on input")
150        self.setGuiCommonExpChip()
151        if self.commitOnChange:
152            self.senddata(1)
153
154    def chipdata(self, data):
155        if data != None:
156            self._chipdata = data
157            shp = [0,0,0]
158            shp[0] = len(data[0][1][0])
159            shp[1] = len(data[0][1][0].domain.attributes)
160            shp[2] = reduce(lambda x,y: x+len(y[1]), data, 0)
161            self._chipdataN = Numeric.zeros(shp, Numeric.Float)
162            idx = 0
163            for (name, etList) in data:
164                for et in etList:
165                    self._chipdataN[:,:,idx] = Numeric.asarray(chipstat.orng2ma(et))
166                    idx += 1
167            self.infob.setText("Structured Data: %i data files with %i profiles on %i points" % (shp[2], shp[0], shp[1]))
168        else:
169            self._chipdata = None
170            self._chipdataN = None
171            self.infob.setText("No structured data on input")
172        self.setGuiCommonExpChip()
173        if self.commitOnChange:
174            self.senddata(2)
175
176    def senddata(self, outputSelector=0):
177        """outputSelector = [0: examples + chip data | 1: examples | 2: chip data]
178        """
179        assert outputSelector in [0,1,2]
180        # progress bar settings: 1: examples, 2: chip data
181        steps = 0
182        if outputSelector in [0,1] and self._dataN != None:
183            steps += 3                                  # 1 step for approximator, 1 step for coefficients, 1 step for curves
184        if outputSelector in [0,2] and self._chipdataN != None:
185            steps += (1 + 2*self._chipdataN.shape[2])   # 1 step for approximator, for each dataset 2 steps for coeficients and curves
186        if steps == 0: steps = 1
187        pbStep = 100./steps
188        self.progressBarInit()
189        if outputSelector in [0,1]:
190            self._sendexampledata(pbStep)
191        if outputSelector in [0,2]:
192            self._sendchipdata(pbStep)
193        self.progressBarFinished()
194
195    def _sendexampledata(self, pbStep):
196        if self._dataN != None:
197            # approximation
198            if self.kernel == 0:
199                appx = chipappx.ApproxOrthPolyBasis(range(self._dataN.shape[1]), self.kernelSize+1)
200                self.progressBarAdvance(pbStep)
201                if self.useSignificance and self.cbUseSignificance.isEnabled():
202                    coef = appx.getAppxCoef2d_significant(self._dataN, self.kernelSize+1, self.alphas[self.alpha])
203                else:
204                    coef = appx.getAppxCoef(self._dataN)
205                self.progressBarAdvance(pbStep)
206                curve = appx.getAppxCurve(coef)
207                self.progressBarAdvance(pbStep)
208            elif self.kernel == 1:
209                appx = chipappx.TrigonomerticBasis(self._dataN.shape[1], self.kernelSize+1)
210                self.progressBarAdvance(pbStep)
211                # 2007-10-11: trigonometric functions do not use getAppxCoef2d_significant
212                #if self.useSignificance and self.cbUseSignificance.isEnabled():
213                #    coef = appx.getAppxCoef2d_significant(self._dataN, self.kernelSize+1, self.alphas[self.alpha])
214                #else:
215                coef = appx.getAppxCoef(self._dataN)
216##                print self._dataN
217##                print "coef", coef
218                self.progressBarAdvance(pbStep)
219                curve = appx.getAppxCurve(coef)
220##                print "curve", curve
221                self.progressBarAdvance(pbStep)
222            # domain with class and metas
223            if self._data.domain.classVar != None:
224                domainClassMetas = orange.Domain([self._data.domain.classVar])
225            else:
226                domainClassMetas = orange.Domain([])
227            domainClassMetas.addmetas(self._data.domain.getmetas())
228            # exampleTable with class and metas
229            etClassMetas = orange.ExampleTable(domainClassMetas, self._data)
230            # appx. curve
231            etCurve = orange.ExampleTable(orange.Domain(self._data.domain.attributes, None), curve.tolist())
232            etCurve = orange.ExampleTable([etCurve, etClassMetas])
233            self.send("Approximated Examples", etCurve)
234            # appx. coefficients
235            domainCoef = orange.Domain(map(lambda x: orange.FloatVariable("C%i" % x), range(coef.shape[1])), None)
236            etCoef = orange.ExampleTable(domainCoef, coef.tolist())
237            etCoef = orange.ExampleTable([etCoef, etClassMetas])
238            self.send("Approximation Coefficients", etCoef)
239        else:
240            self.send("Approximated Examples", None)
241            self.send("Approximation Coefficients", None)
242
243    def _sendchipdata(self, pbStep):
244        if self._chipdataN != None:
245            # approximation
246            coefs = Numeric.zeros((self._chipdataN.shape[0], self.kernelSize+1, self._chipdataN.shape[2]), Numeric.Float)
247            curves = Numeric.zeros(self._chipdataN.shape, Numeric.Float)
248            if self.kernel == 0:
249                appx = chipappx.ApproxOrthPolyBasis(range(self._chipdataN.shape[1]), self.kernelSize+1)
250                self.progressBarAdvance(pbStep)
251                for idx2 in range(self._chipdataN.shape[2]):
252                    if self.useSignificance and self.cbUseSignificance.isEnabled():
253                        coefs[:,:,idx2] = appx.getAppxCoef2d_significant(self._chipdataN[:,:,idx2], self.kernelSize+1, self.alphas[self.alpha])
254                    else:
255                        coefs[:,:,idx2] = appx.getAppxCoef(self._chipdataN[:,:,idx2])
256                    self.progressBarAdvance(pbStep)
257                    curves[:,:,idx2] = appx.getAppxCurve(coefs[:,:,idx2])
258                    self.progressBarAdvance(pbStep)
259            elif self.kernel == 1:
260                appx = chipappx.TrigonomerticBasis(self._chipdataN.shape[1], self.kernelSize+1)
261                self.progressBarAdvance(pbStep)
262                for idx2 in range(self._chipdataN.shape[2]):
263                    # 2007-10-11: trigonometric functions do not use getAppxCoef2d_significant
264                    #if self.useSignificance and self.cbUseSignificance.isEnabled():
265                    #    coefs[:,:,idx2] = appx.getAppxCoef2d_significant(self._chipdataN[:,:,idx2], self.kernelSize+1, self.alphas[self.alpha])
266                    #else:
267                    coefs[:,:,idx2] = appx.getAppxCoef(self._chipdataN[:,:,idx2])
268                    self.progressBarAdvance(pbStep)
269                    curves[:,:,idx2] = appx.getAppxCurve(coefs[:,:,idx2])
270                    self.progressBarAdvance(pbStep)
271            chipcoefNew = []    # [(dirname0, [etCoef0, etCoef1, ...]), ...]
272            chipcurvesNew = []  # [(dirname0, [etCurves0, etCurves1, ...]), ...]
273            idxTotal = 0
274            for (dirname, etList) in self._chipdata:
275                etCoefListNew = []
276                etCurvesListNew = []
277                for et in etList:
278                    # domain with class and metas
279                    if et.domain.classVar != None:
280                        domainClassMetas = orange.Domain([et.domain.classVar])
281                    else:
282                        domainClassMetas = orange.Domain([])
283                    domainClassMetas.addmetas(et.domain.getmetas())
284                    # exampleTable with class and metas
285                    etClassMetas = orange.ExampleTable(domainClassMetas, et)
286                    # appx. coefficients
287                    domainCoef = orange.Domain(map(lambda x: orange.FloatVariable("C%i" % x), range(coefs.shape[1])), None)
288                    etCoef = orange.ExampleTable(domainCoef, coefs[:,:,idxTotal].tolist())
289                    etCoefListNew.append(orange.ExampleTable([etCoef, etClassMetas]))
290                    etCoefListNew[-1].name = et.name
291                    # appx. curve
292                    etCurve = orange.ExampleTable(orange.Domain(et.domain.attributes, None), curves[:,:,idxTotal].tolist())
293                    etCurvesListNew.append(orange.ExampleTable([etCurve, etClassMetas]))
294                    etCurvesListNew[-1].name = et.name
295                    idxTotal += 1
296                chipcoefNew.append((dirname, etCoefListNew))
297                chipcurvesNew.append((dirname, etCurvesListNew))
298            self.send("Approximated Structured Data", chipcurvesNew)
299            self.send("Structured Approximation Coefficients", chipcoefNew)
300        else:
301            self.send("Approximated Structured Data", None)
302            self.send("Structured Approximation Coefficients", None)
303
304
305if __name__=="__main__":
306    a=QApplication(sys.argv)
307    ow=OWApproxProfiles()
308    a.setMainWidget(ow)
309    ow.show()
310    ow.data(orange.ExampleTable("meanExpr_ann_pkaC.tab"))
311    a.exec_loop()
312    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.