source: orange-bioinformatics/Orange/bioinformatics/widgets/prototypes/OWImputeProfiles.py @ 1625:cefeb35cbfc9

Revision 1625:cefeb35cbfc9, 13.7 KB checked in by mitar, 2 years ago (diff)

Moving files around.

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