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

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

Restructuring because we will not be using namespaces.

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