source: orange-bioinformatics/widgets/prototypes/OWProcessChipData.py @ 975:97fc10762082

Revision 975:97fc10762082, 6.0 KB checked in by markotoplak, 5 years ago (diff)

Moved some Bioinformatics widgets to prototypes.

Line 
1"""
2<name>Process Chip Data</name>
3<description>Pre- and post-processing of chip data.</description>
4<icon>icons/ProcessChipData.png</icon>
5<priority>1060</priority>
6<contact>Peter Juvan (peter.juvan@fri.uni-lj.si)</contact>
7"""
8
9from OWWidget import *
10import OWGUI
11from OWDataFiles import DataFiles
12import chipstat
13
14class OWProcessChipData(OWWidget):
15    settingsList  = ["preStdMethod", "postStdMethod", "preStdRob", "postStdRob", "mergeType", "commitOnChange"]
16
17    def __init__(self, parent=None, signalManager = None):
18        OWWidget.__init__(self, parent, signalManager, 'Process Chip Data')
19        self.callbackDeposit = []
20
21        self.inputs = [("Structured Data", DataFiles, self.chipdata)]
22        self.outputs = [("Structured Data", DataFiles)]
23
24        self.chipdata = None; self.datasets = None
25        self.std = [("No preprocessing", None),
26                    ("Array-based standardization", chipstat.standardize_arrays),
27                    ("Gene-based standardization", chipstat.standardize_genes),
28                    ("First array-, then gene-based standardization", lambda e,r: chipstat.standardize_genes(chipstat.standardize_arrays(e,r),r)),
29                    ("First gene-, then array-based standardization", lambda e,r: chipstat.standardize_arrays(chipstat.standardize_genes(e,r),r))]
30        # Settings
31        self.data = None
32        self.preStdMethod = 0; self.preStdRob = 1
33        self.postStdMethod = 0; self.postStdRob = 1
34       
35        self.mergeType = 0
36        self.commitOnChange = 0
37        self.loadSettings()
38
39        # GUI
40        # info
41        box = QVGroupBox("Info", self.controlArea)
42        self.infoa = QLabel('No data on input.', box)
43        self.infob = QLabel('', box)
44       
45        # preprocessing
46        OWGUI.separator(self.controlArea)
47        box = QVGroupBox("Preprocessing", self.controlArea)
48        labels = [x[0] for x in self.std]
49        OWGUI.comboBox(box, self, 'preStdMethod', label=None, labelWidth=None, orientation='vertical', items=labels, callback=self.selectionChange)
50        self.preRobBtn = OWGUI.checkBox(box, self, "preStdRob", "Robust standardization", callback=self.selectionChange)
51       
52        # merge
53        OWGUI.separator(self.controlArea)
54        self.mergeTypes = [(0, "No merging"), ('mean', 'Mean'), ('median', 'Median'), ('min', 'Minimum expression'), ('max', 'Maximum expression')]
55        labels = [x[1] for x in self.mergeTypes]
56        OWGUI.radioButtonsInBox(self.controlArea, self, 'mergeType', labels, box='Merge Replicas', tooltips=None, callback=self.selectionChange)
57
58        # postprocessing
59        OWGUI.separator(self.controlArea)
60        self.boxPostproc = QVGroupBox("Postprocessing", self.controlArea)
61        labels = [x[0] for x in self.std]
62        OWGUI.comboBox(self.boxPostproc, self, 'postStdMethod', label=None, labelWidth=None, orientation='vertical', items=labels, callback=self.selectionChange)
63        self.postRobBtn = OWGUI.checkBox(self.boxPostproc, self, "postStdRob", "Robust standardization", callback=self.selectionChange)
64
65        # output
66        OWGUI.separator(self.controlArea)
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.selectionChange, disabled=1)
70
71        self.setBtnsState()
72        self.resize(100,100)
73
74    def selectionChange(self):
75        self.setBtnsState()
76        if self.commitOnChange:
77            self.sendData()
78
79    def chipdata(self, data):
80        print data
81        self.commitBtn.setEnabled(data <> None)
82        if data:
83            self.data = data
84            nfiles = 0
85            for (n, d) in data:
86                nfiles += len(d)
87            self.infoa.setText("Structured data, %d sets, total of %d data files" % (len(data), nfiles))
88            d = data[0][1][0]
89            self.infob.setText("Each file contains %d attributes and %d examples" % (len(d.domain.attributes), len(d)))
90
91            self.sendData()
92        else:
93            self.send("Structured Data", None)
94
95    # process arrays in the structure, returns new structure
96    def processArrays(self, datastructure, method, *arg):
97        pbStep = 30. / sum([len(data) for (dummy, data) in datastructure])
98        newdata = []
99        for (strainname, data) in datastructure:
100            if data:
101                new = []
102                for e in data:
103                    new.append(apply(method, (e,)+arg))
104                    self.progressBarAdvance(pbStep)
105                newdata.append([strainname, new])
106        return newdata
107
108    def sendData(self):
109        if not self.data:
110            return
111        self.send('Structured Data', None) # this is required for other widgets not to mess up with two different datasets
112        self.progressBarInit()
113        data = self.data
114        # preprocessing
115        if self.preStdMethod: # 0 means no preprocessing
116            data = self.processArrays(data, self.std[self.preStdMethod][1], self.preStdRob)
117        self.progressBarSet(30)
118        # merging
119        if self.mergeType: data = chipstat.merge_replicas(data, self.mergeTypes[self.mergeType][0])
120        self.progressBarSet(70)
121        # postprocessing
122        if self.postStdMethod: # 0 means no preprocessing
123            data = self.processArrays(data, self.std[self.postStdMethod][1], self.preStdRob)
124        for i,(strain, etList) in enumerate(data):
125            if len(etList) == len(self.data[i][1]):
126                for j,et in enumerate(etList):
127                    et.name = self.data[i][1][j].name
128            else:
129                for et in etList:
130                    et.name = strain
131        self.progressBarFinished()
132        self.send('Structured Data', data)
133           
134    def setBtnsState(self):
135        self.preRobBtn.setEnabled(self.preStdMethod > 0)
136        self.postRobBtn.setEnabled(self.postStdMethod > 0)
137        self.boxPostproc.setEnabled(self.mergeType > 0)
138
139if __name__=="__main__":
140    a=QApplication(sys.argv)
141    ow=OWProcessChipData()
142    a.setMainWidget(ow)
143
144    ow.show()
145    a.exec_loop()
146    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.