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

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

Fixing some imports. Marking widgets as prototypes.

Line 
1## Automatically adapted for numpy.oldnumeric Oct 04, 2007 by
2
3"""
4<name>Impute Profiles</name>
5<description>Imputation and non-parametric smoothing of expression profiles.</description>
6<icon>icons/ImputeProfiles.png</icon>
7<priority>1065</priority>
8<contact>Peter Juvan (peter.juvan@fri.uni-lj.si)</contact>
9<prototype>1</prototype>
10"""
11
12import math
13
14import numpy.oldnumeric as Numeric, numpy.oldnumeric.ma as MA
15
16from Orange.OrangeWidgets import OWGUI
17from Orange.OrangeWidgets.OWWidget import *
18
19from .. import chipimpute, chipstat
20from .OWDataFiles import DataFiles
21
22class OWImputeProfiles(OWWidget):
23    settingsList  = ['impute', 'imputeK', 'smooth', 'windowSize', 'commitOnChange']
24
25    def __init__(self, parent=None, signalManager = None):
26        self.callbackDeposit = [] # deposit for OWGUI callback functions
27        OWWidget.__init__(self, parent, signalManager, 'Impute & Loess Profiles')
28
29        self._data = None       # exampleTable
30        self._dataMA = None     # input 2d masked array
31        self._chipdata = None   # [(dirname0, [et0, et1, ...]), ...]
32        self._chipdataMA = []   # [(dirname0, [m2d0, m2d1, ...]), ...]
33        self.impute = 1
34        self.imputeK = 20
35        self.smooth = 1
36        self.windowSize = 3
37        self.commitOnChange = 1
38               
39        # Settings
40        self.loadSettings()
41
42        # GUI
43        self.mainArea.setFixedWidth(0)
44        ca=QFrame(self.controlArea)
45        gl=QGridLayout(ca,4,1,5)
46        # info
47        box = QVGroupBox("Info", ca)
48        gl.addWidget(box, 0,0)
49        self.infoa = QLabel("No examples on input", box)
50        self.infob = QLabel("", box)
51        QLabel("", box)
52        self.infoc = QLabel("No structured data on input", box)
53        self.infod = QLabel("", box)
54        # KNN impute
55        self.boxImpute = QVGroupBox("Impute missing values", ca)
56        gl.addWidget(self.boxImpute, 1,0)
57        OWGUI.checkBox(self.boxImpute, self, "impute", "KNN impute", tooltip="Impute missing values from values of K nearest neighbours.", callback=self.change)
58##        self.sliderK = OWGUI.hSlider(self.boxImpute, self, "imputeK", box=None, minValue=1, maxValue=7744, step=1, callback=self.imputeChange, labelFormat=" K = %i", ticks=0)
59##        self.sliderK = OWGUI.qwtHSlider(self.boxImpute, self, "imputeK", box=None, label="K", labelWidth=12, minValue=1, maxValue=7744, step=0.02, precision=0, callback=self.imputeChange, logarithmic=1, ticks=0, maxWidth=200)
60##        self.sliderK = OWGUI.qwtHSlider(self.boxImpute, self, "imputeK", box=None, label="K", labelWidth=12, minValue=1, maxValue=100, step=1, precision=0, callback=self.imputeKChange, logarithmic=0, ticks=0, maxWidth=200)
61        self.sliderK = OWGUI.qwtHSlider(self.boxImpute, self, "imputeK", box=None, label="K", labelWidth=15, minValue=1, maxValue=999, step=1, precision=0, callback=self.imputeKChange, logarithmic=0, ticks=0, maxWidth=None)
62        self.boxImpute.setDisabled(1)
63        # loess
64        self.boxLoess = QVGroupBox("Smoothing", ca)
65        gl.addWidget(self.boxLoess, 2,0)
66        OWGUI.checkBox(self.boxLoess, self, "smooth", "Loess smoothing", tooltip="Loess profiles, impute missing columns.", callback=self.change)
67        lbl = QLabel("Window size (number of points)", self.boxLoess)
68        lbl.setAlignment(Qt.AlignHCenter)
69        self.sliderW = OWGUI.qwtHSlider(self.boxLoess, self, "windowSize", box=None, label="W", labelWidth=15, minValue=1, maxValue=999, step=1, precision=0, callback=self.smoothWChange, logarithmic=0, ticks=0, maxWidth=None)
70        self.boxLoess.setDisabled(1)
71        # output
72        box = QVGroupBox("Output", ca)
73        gl.addWidget(box, 3,0)
74        OWGUI.checkBox(box, self, 'commitOnChange', 'Commit data on selection change')
75        self.commitBtn = OWGUI.button(box, self, "Commit", callback=self.senddata, disabled=1)
76
77        self.inputs = [("Examples", ExampleTable, self.data), ("Structured Data", DataFiles, self.chipdata)]
78        self.outputs = [("Examples", ExampleTable), ("Structured Data", DataFiles)]
79
80        # data dependent variables
81        self.numRowsMissing = 0
82        self.numRowsMissingChipData = 0
83        self.resize(100,100)
84
85    def change(self):
86        if self.commitOnChange:
87            self.senddata(0)
88
89    def imputeKChange(self):
90        if self.commitOnChange and self.impute:
91            self.senddata(0)
92
93    def smoothWChange(self):
94        if self.commitOnChange and self.smooth:
95            self.senddata(0)
96
97    def setGuiCommonExpChip(self):
98        """Sets GUI features that depend on both inputs, e.g. max. values of sliders, commit button.
99        """
100        # calculate maxK, maxW
101        maxK = 1e9
102        maxW = 1e9
103        if self._dataMA != None:
104            maxK = min(max(self._dataMA.shape[0]/50, 50), self._dataMA.shape[0], maxK)
105            maxW = min(self._dataMA.shape[1], maxW)
106        if self._chipdataMA:
107            maxK = min(max(self._chipdataMA[0][1][0].shape[0]/50., 50), self._chipdataMA[0][1][0].shape[0], maxK)
108            maxW = min(self._chipdataMA[0][1][0].shape[1], maxW)
109        if maxK == 1e9: maxK = 1
110        if maxW == 1e9: maxW = 1
111        # enable sliders and commit button
112        if self._dataMA != None or self._chipdataMA:
113            # set up sliders (only if data present)
114            self.sliderK.setRange(1, maxK, 1)
115            if self.imputeK > maxK:
116                self.sliderK.setValue(maxK)
117                self.imputeK = maxK
118            self.sliderW.setRange(1, maxW, 1)
119            if self.windowSize > maxW:
120                self.sliderW.setValue(maxW)
121                self.windowSize = maxW
122            self.boxImpute.setEnabled(1)
123            self.boxLoess.setEnabled(1)
124            self.commitBtn.setEnabled(1)
125        else:
126            self.boxImpute.setDisabled(1)
127            self.boxLoess.setDisabled(1)
128            self.commitBtn.setDisabled(1)
129
130    def data(self, data):
131        if data != None:
132            self._data = data
133##            self._dataMA = chipstat.orng2ma(data)
134            self._dataMA = data.toNumpyMA("a")[0]
135            # info text
136            self.infoa.setText("Examples: %i profiles on %i points" % (self._dataMA.shape[0], self._dataMA.shape[1]))
137            numTotalMissing = int(Numeric.multiply.reduce(self._dataMA.shape) - MA.count(self._dataMA))
138            if numTotalMissing > 0:
139                numValsByCol = MA.count(self._dataMA, 0)
140                numEmptyCol = Numeric.add.reduce(Numeric.where(numValsByCol==0, 1, 0))
141                colNonEmpty = Numeric.compress(numValsByCol!=0, Numeric.arange(self._dataMA.shape[1]))
142                dataRemEmptyCol = self._dataMA.take(colNonEmpty, 1)
143                self.numRowsMissing = Numeric.add.reduce(Numeric.where(MA.count(dataRemEmptyCol, 1) < dataRemEmptyCol.shape[1], 1, 0))
144                s1 = ""
145                s2 = ""
146                if numEmptyCol > 0: s1 = "s"
147                if self.numRowsMissing > 0: s2 = "s"
148                self.infob.setText("missing %i values, %i column%s completely, %i row%s partially" % (numTotalMissing, numEmptyCol, s1, self.numRowsMissing, s2))
149            else:
150                self.infob.setText("")
151        else:
152            self._data = None
153            self._dataMA = None
154            self.infoa.setText("No examples on input")
155            self.infob.setText("")
156            self.numRowsMissing = 0
157        self.setGuiCommonExpChip()
158        if self.commitOnChange:
159            self.senddata(1)
160
161
162    def chipdata(self, data):
163        """Input data: [(dirname0, [et0, et1, ...]), ...]
164        """
165        self.numRowsMissingChipData = 0
166        self._chipdataMA = []
167        if data != None:
168            self._chipdata = data
169            numValsAll = 0
170            numValsNonMasked = 0
171            numFiles = 0
172            numExamplesList = []
173            attribDict = {}
174            numColMissing = 0
175            for (name, etList) in data:
176                numFiles += len(etList)
177                self._chipdataMA.append((name,[]))
178                for et in etList:
179                    attribDict.update(dict(zip(map(lambda x: x.name, et.domain.attributes), et.domain.attributes)))
180                    numExamplesList.append(len(et))
181                    etm = et.toNumpyMA("a")[0]
182                    colNonMissingInd = Numeric.compress(Numeric.not_equal(MA.count(etm, 0), 0), Numeric.arange(etm.shape[1])) # indices of columns that are not completely missing
183                    numColMissing += etm.shape[1] - colNonMissingInd.shape[0]
184                    self.numRowsMissingChipData += int(Numeric.add.reduce(Numeric.less(MA.count(etm.take(colNonMissingInd, 1), 1), etm.shape[1])))
185                    numValsAll += int(Numeric.multiply.reduce(etm.shape))
186                    numValsNonMasked += int(MA.count(etm))
187                    self._chipdataMA[-1][1].append(etm)
188            # info text
189            self.infoc.setText("Structured Data: %i data files with %i profiles on %i points" % (numFiles, numExamplesList[0], len(attribDict)))
190            numTotalMissing = numValsAll-numValsNonMasked
191            if numTotalMissing > 0:
192                print numTotalMissing, numColMissing, self.numRowsMissingChipData
193                print type(numTotalMissing), type(numColMissing), type(self.numRowsMissingChipData)
194                self.infod.setText("missing %i values, %i column%s completely, %i row%s partially" % (numTotalMissing, numColMissing, ["","s"][numColMissing!=1], self.numRowsMissingChipData, ["","s"][self.numRowsMissingChipData!=1]))
195            else:
196                self.infod.setText("")               
197        else:
198            self._chipdata = None
199            self.infoc.setText("No structured data on input")
200            self.infod.setText("")
201        self.setGuiCommonExpChip()
202        if self.commitOnChange:
203            self.senddata(2)
204
205
206    def senddata(self, outputSelector=0):
207        """outputSelector = [0: examples + chip data | 1: examples | 2: chip data]
208        """
209        assert outputSelector in [0,1,2]
210        # progress bar settings: 1: examples, 2: chip data
211        steps = 0
212        if outputSelector in [0,1]:
213            if self.impute:
214                steps += self.numRowsMissing
215            if self.smooth and self._dataMA != None:
216                steps += self._dataMA.shape[0]
217        if outputSelector in [0,2]:
218            if self.impute:
219                steps += self.numRowsMissingChipData
220            if self.smooth and self._chipdataMA:
221                steps += len(self._chipdataMA[0][1][0]) * reduce(lambda x,y: x+len(y[1]), self._chipdataMA, 0) #self._chipdataMA.shape[2]
222        if steps == 0: steps = 1
223        pbStep = 100./steps
224        self.progressBarInit()
225        if outputSelector in [0,1]:
226            self._sendexampledata(pbStep)
227        if outputSelector in [0,2]:
228            self._sendchipdata(pbStep)
229        self.progressBarFinished()
230
231    def _sendexampledata(self, pbStep):
232        if self._dataMA != None:
233            ma2d = self._dataMA
234            if self.impute:
235                ma2d = chipimpute.kNNimputeMA(ma2d, int(self.imputeK), callback=lambda: self.progressBarAdvance(pbStep))
236            if self.smooth:
237                ws = max(1.1, int(self.windowSize)) # fixes bug in statc.loess
238                ma2d = chipimpute.loessMA(ma2d, ws, 1, callback=lambda: self.progressBarAdvance(pbStep))
239            et = chipstat.ma2orng_keepClassMetas(ma2d, self._data)
240            et.name = self._data.name
241            self.send("Examples", et)
242        else:
243            self.send("Examples", None)
244
245
246    def _sendchipdata(self, pbStep):
247        if self._chipdataMA:
248            chipdataNew = []    # [(dirname0, [et0, et1, ...]), ...]
249            ws = max(1.1, int(self.windowSize)) # fixes bug in statc.loess
250            for sIdx, (name, etmList) in enumerate(self._chipdataMA):
251                chipdataNew.append((name,[]))
252                for eIdx, etm in enumerate(etmList):
253                    if self.impute:
254                        etm = chipimpute.kNNimputeMA(etm, int(self.imputeK), callback=lambda: self.progressBarAdvance(pbStep))
255                    if self.smooth:
256                        etm = chipimpute.loessMA(etm, ws, 1, callback=lambda: self.progressBarAdvance(pbStep))
257##                   chipdataNew[-1][1].append(orange.ExampleTable(et.domain, etm))
258                    etNew = chipstat.ma2orng_keepClassMetas(etm, self._chipdata[sIdx][1][eIdx])
259                    etNew.name = self._chipdata[sIdx][1][eIdx].name
260                    chipdataNew[-1][1].append(etNew)
261            self.send("Structured Data", chipdataNew)
262        else:
263            self.send("Structured Data", None)
264
265
266
267if __name__=="__main__":
268    a=QApplication(sys.argv)
269    ow=OWImputeProfiles()
270    a.setMainWidget(ow)
271    ow.show()
272##    ow.data(orange.ExampleTable("meanExpr_ann_pkaC.tab"))
273##    ow.data(orange.ExampleTable(r"C:\Documents and Settings\peterjuv\My Documents\Orange\ANOVA\DictyChipData_BR_ACS_100_yakApufA\pufA\pufA1.1.xls.tab"))
274##    ow.data(orange.ExampleTable(r"C:\Documents and Settings\peterjuv\My Documents\Orange\ANOVA\potato\I\I_30m_1_1042_teh1.tab"))
275    ow.data(orange.ExampleTable(r"c:\Documents and Settings\peterjuv\My Documents\STEROLTALK\Data Hs\2007-08-29 Banjo\- data\untr maxAbsDiff.tab"))
276    a.exec_loop()
277    ow.saveSettings()
278
279##    from . import OWDataFiles
280##    from Orange.orng import orngSignalManager
281##    signalManager = orngSignalManager.SignalManager(0)
282##    a=QApplication(sys.argv)
283##    ow=OWImputeProfiles(signalManager = signalManager)
284##    a.setMainWidget(ow)
285##    ow.show()
286##    ds = OWDataFiles.OWDataFiles(signalManager = signalManager)
287####    ds.loadData(r"C:\Documents and Settings\peterjuv\My Documents\2005-08 NIB Potato\potato.attrib")
288##    ds.loadData(r"C:\Documents and Settings\peterjuv\My Documents\2005-08 NIB Potato\potato.sub100.avg")
289##    signalManager.addWidget(ow)
290##    signalManager.addWidget(ds)
291##    signalManager.setFreeze(1)
292##    signalManager.addLink(ds, ow, 'Structured Data', 'Structured Data', 1)
293##    signalManager.setFreeze(0)
294##    a.exec_loop()
295##    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.