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

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

Fixing some imports. Marking widgets as prototypes.

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