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

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

Restructuring because we will not be using namespaces.

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