source: orange-bioinformatics/widgets/prototypes/OWApproxProfiles.py @ 475:fa4d22895ef2

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