source: orange-bioinformatics/_bioinformatics/widgets/OWPIPA.py @ 1726:6778e0225b86

Revision 1726:6778e0225b86, 28.5 KB checked in by Ales Erjavec <ales.erjavec@…>, 17 months ago (diff)

Added new icons by Peter Cuhalev and replaced existing ones with expanded paths.

RevLine 
[1022]1"""
[1462]2<name>PIPA</name>
[1051]3<description>Access data from PIPA RNA-Seq database.</description>
[1726]4<icon>icons/PIPA.svg</icon>
[1051]5<priority>30</priority>
[1022]6"""
7
[1632]8from __future__ import absolute_import
9
[1121]10import sys, os
[1022]11from collections import defaultdict
[1148]12import math
[1121]13
[1632]14from Orange.orng import orngEnviron
15from Orange.OrangeWidgets import OWGUI
16from Orange.OrangeWidgets.OWWidget import *
17
18from .. import obiDicty
[1121]19
20#def pyqtConfigure(object, **kwargs):
21#    if hasattr(object, "pyqtConfigure"):
22#        object.pyqtConfigure(**kwargs)
23#    else:
24#        for name, value in kwargs.items():
25#            if object.metaObject().indexOfProperty(name) != -1:
26#                object.setProperty(name, value)
27#            elif object.metaObject().indexOfSignal(name) != -1:
28#                object.connect(object.
29
[1069]30def tfloat(s):
31    try:
32        return float(s)
33    except:
34        return None
35
[1022]36class MyTreeWidgetItem(QTreeWidgetItem):
[1069]37
38    def __init__(self, parent, *args):
39        QTreeWidgetItem.__init__(self, parent, *args)
40        self.par = parent
41
[1022]42    def __contains__(self, text):
43        return any(text.upper() in str(self.text(i)).upper() for i in range(self.columnCount()))   
[1069]44 
45    def __lt__(self, o1):
46        col = self.par.sortColumn()
[1521]47        if col in [8,9,10]: #WARNING: hardcoded column numbers
[1069]48            return tfloat(self.text(col)) < tfloat(o1.text(col))
49        else:
50            return QTreeWidgetItem.__lt__(self, o1)
51
[1022]52
53#set buffer file
54bufferpath = os.path.join(orngEnviron.directoryNames["bufferDir"], "pipa")
55try:
56    os.makedirs(bufferpath)
57except:
58    pass
59bufferfile = os.path.join(bufferpath, "database.sq3")
60
[1121]61class ListItemDelegate(QStyledItemDelegate):
62    def sizeHint(self, option, index):
63        size = QStyledItemDelegate.sizeHint(self, option, index)
64        size = QSize(size.width(), size.height() + 4)
65        return size
66
67    def createEditor(self, parent, option, index):
68        return QLineEdit(parent)
69   
70    def setEditorData(self, editor, index):
71        editor.setText(index.data(Qt.DisplayRole).toString())
72       
73    def setModelData(self, editor, model, index):
74#        print index
75        model.setData(index, QVariant(editor.text()), Qt.EditRole)
76
77class SelectionSetsWidget(QFrame):
78    """ Widget for managing multiple stored item selections
79    """
80    def __init__(self, parent):
81        QFrame.__init__(self, parent)
82        self.setContentsMargins(0, 0, 0, 0)
83        layout = QVBoxLayout()
[1123]84        layout.setContentsMargins(0, 0, 0, 0)
[1121]85        layout.setSpacing(1)
86#        self._titleLabel = QLabel(self)
87#        self._titleLabel
88#        layout.addWidget(self._titleLabel)
89        self._setNameLineEdit = QLineEdit(self)
90        layout.addWidget(self._setNameLineEdit)
91       
92        self._setListView = QListView(self)
93        self._listModel = QStandardItemModel(self)
94        self._proxyModel = QSortFilterProxyModel(self)
95        self._proxyModel.setSourceModel(self._listModel)
96       
97        self._setListView.setModel(self._proxyModel)
98        self._setListView.setItemDelegate(ListItemDelegate(self))
99       
100        self.connect(self._setNameLineEdit, SIGNAL("textChanged(QString)"), self._proxyModel.setFilterFixedString)
101       
102        self._completer = QCompleter(self._listModel, self)
103       
104        self._setNameLineEdit.setCompleter(self._completer)
105       
106        self.connect(self._listModel, SIGNAL("itemChanged(QStandardItem *)"), self._onSetNameChange)
107        layout.addWidget(self._setListView)
108        buttonLayout = QHBoxLayout()
109       
110        self._addAction = QAction("+", self)
111        self._updateAction = QAction("Update", self)
112        self._removeAction = QAction("-", self)
113       
114        self._addToolButton = QToolButton(self)
115        self._updateToolButton = QToolButton(self)
116        self._removeToolButton = QToolButton(self)
117        self._updateToolButton.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Minimum)
118       
119        self._addToolButton.setDefaultAction(self._addAction)
120        self._updateToolButton.setDefaultAction(self._updateAction)
121        self._removeToolButton.setDefaultAction(self._removeAction)
122         
123        buttonLayout.addWidget(self._addToolButton)
124        buttonLayout.addWidget(self._updateToolButton)
125        buttonLayout.addWidget(self._removeToolButton)
126       
127        layout.addLayout(buttonLayout)
128        self.setLayout(layout)
129       
130        self.connect(self._addAction, SIGNAL("triggered()"), self.addCurrentSelection)
131        self.connect(self._updateAction, SIGNAL("triggered()"), self.updateSelectedSelection)
132        self.connect(self._removeAction, SIGNAL("triggered()"), self.removeSelectedSelection)
133       
134        self.connect(self._setListView.selectionModel(), SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self._onListViewSelectionChanged)
135        self.selectionModel = None
136        self._selections = []
137       
138    def sizeHint(self):
139        size = QFrame.sizeHint(self)
140        return QSize(size.width(), 200)
141       
142    def _onSelectionChanged(self, selected, deselected):
143        self.setSelectionModified(True)
144       
145    def _onListViewSelectionChanged(self, selected, deselected):
146        try:
147            index= self._setListView.selectedIndexes()[0]
148        except IndexError:
149            return 
[1122]150        self.commitSelection(self._proxyModel.mapToSource(index).row())
[1121]151
152    def _onSetNameChange(self, item):
153        self.selections[item.row()].name = str(item.text())
154               
155    def _setButtonStates(self, val):
156        self._updateToolButton.setEnabled(val)
157       
158    def setSelectionModel(self, selectionModel):
159        if self.selectionModel:
160            self.disconnect(self.selectionModel, SIGNAL("selectionChanged(QItemSelection, QItemSelection)", self._onSelectionChanged))
161        self.selectionModel = selectionModel
162        self.connect(self.selectionModel, SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self._onSelectionChanged)
163       
164    def addCurrentSelection(self):
[1521]165        item = self.addSelection(SelectionByKey(self.selectionModel.selection(), name="New selection", key=(1, 2, 3 ,10)))
[1121]166        index = self._proxyModel.mapFromSource(item.index())
167        self._setListView.setCurrentIndex(index)
168        self._setListView.edit(index)
169        self.setSelectionModified(False)
170   
171    def removeSelectedSelection(self):
[1122]172        i = self._proxyModel.mapToSource(self._setListView.currentIndex()).row()
[1121]173        self._listModel.takeRow(i)
174        del self.selections[i]
175   
176    def updateCurentSelection(self):
[1122]177        i = self._proxyModel.mapToSource(self._setListView.selectedIndex()).row()
[1121]178        self.selections[i].setSelection(self.selectionModel.selection())
179        self.setSelectionModified(False)
180       
181    def addSelection(self, selection, name=""):
182        self._selections.append(selection)
183        item = QStandardItem(selection.name)
[1151]184        item.setFlags(item.flags() ^ Qt.ItemIsDropEnabled)
[1121]185        self._listModel.appendRow(item)
186        self.setSelectionModified(False)
187        return item
188       
189    def updateSelectedSelection(self):
[1122]190        i = self._proxyModel.mapToSource(self._setListView.currentIndex()).row()
[1121]191        self.selections[i].setSelection(self.selectionModel.selection())
192        self.setSelectionModified(False)
193       
194    def setSelectionModified(self, val):
195        self._selectionModified = val
196        self._setButtonStates(val)
197        self.emit(SIGNAL("selectionModified(bool)"), bool(val))
198       
199    def commitSelection(self, index):
200        selection = self.selections[index]
201        selection.select(self.selectionModel)
202       
203    def setSelections(self, selections):
204        self._listModel.clear()
205#        print selections
206        for selection in selections:
207            self.addSelection(selection)
208           
209    def selections(self):
210        return self._selections
211   
212    selections = property(selections, setSelections)
213   
214class SelectionByKey(object):
215    """ An object stores item selection by unique key values
216    (works only for row selections in list and table models)
217    Example::
218        ## Save selection by unique tuple pairs (DisplayRole of column 1 and 2)
219        selection = SelectionsByKey(itemView.selectionModel().selection(), key = (1,2))
220        ...
221        ## restore selection (Possibly omitting rows not present in the model) 
222        selection.select(itemView.selectionModel())
223    """
224   
225    def __init__(self, itemSelection, name="", key=(0,)):
226        self._key = key
227        self.name = name
228        self._selected_keys = []
229        if itemSelection:
230            self.setSelection(itemSelection)
231       
232    def _row_key(self, model, row):
233        val = lambda row, col: str(model.data(model.index(row, col), Qt.DisplayRole).toString())
234        return tuple(val(row, col) for col in self._key)
235   
236    def setSelection(self, itemSelection):
237        self._selected_keys = [self._row_key(ind.model(), ind.row()) for ind in itemSelection.indexes() if ind.column() == 0]
238   
239    def select(self, selectionModel):
240        model = selectionModel.model()
241        selected = []
242        selectionModel.clear()
243        for i in range(model.rowCount()):
244            if self._row_key(model, i) in self._selected_keys:
245                selectionModel.select(model.index(i, 0), QItemSelectionModel.Select | QItemSelectionModel.Rows)
[1371]246
247    def __len__(self):
248        return len(self._selected_keys)
[1121]249               
250class SortedListWidget(QWidget):
251    class _MyItemDelegate(QStyledItemDelegate):
252        def __init__(self, sortingModel, parent):
253            QStyledItemDelegate.__init__(self, parent)
254            self.sortingModel = sortingModel
255           
256        def sizeHint(self, option, index):
257            size = QStyledItemDelegate.sizeHint(self, option, index)
258            return QSize(size.width(), size.height() + 4)
259           
260        def createEditor(self, parent, option, index):
261            cb = QComboBox(parent)
262            cb.setModel(self.sortingModel)
263            cb.showPopup()
264            return cb
265       
266        def setEditorData(self, editor, index):
267            pass # TODO: sensible default
268       
269        def setModelData(self, editor, model, index):
270            text = editor.currentText()
271            model.setData(index, QVariant(text))
272   
273    def __init__(self, *args):
274        QWidget.__init__(self, *args)
275        self.setContentsMargins(0, 0, 0, 0)
276        gridLayout = QGridLayout()
[1123]277        gridLayout.setContentsMargins(0, 0, 0, 0)
[1121]278        gridLayout.setSpacing(1)
279        self._listView = QListView(self)
280        self._listView.setModel(QStandardItemModel(self))
281#        self._listView.setDragEnabled(True)
282        self._listView.setDropIndicatorShown(True)
283        self._listView.viewport().setAcceptDrops(True)
284        self._listView.setDragDropMode(QAbstractItemView.InternalMove)
285        self._listView.setMinimumHeight(100)
286       
287        gridLayout.addWidget(self._listView, 0, 0, 2, 2)
288       
289        vButtonLayout = QVBoxLayout()
290       
291        self._upAction = QAction(QIcon(os.path.join(orngEnviron.widgetDir, "icons/Dlg_up3.png")), "Up", self)
292       
293        self._upButton = QToolButton(self)
294        self._upButton.setDefaultAction(self._upAction)
295        self._upButton.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.MinimumExpanding)
296
297        self._downAction = QAction(QIcon(os.path.join(orngEnviron.widgetDir, "icons/Dlg_down3.png")), "Down", self)
298        self._downButton = QToolButton(self)
299        self._downButton.setDefaultAction(self._downAction)
300        self._downButton.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.MinimumExpanding)
301       
302        vButtonLayout.addWidget(self._upButton)
303        vButtonLayout.addWidget(self._downButton)
304       
305        gridLayout.addLayout(vButtonLayout, 0, 2, 2, 1)
306       
307        hButtonLayout = QHBoxLayout()
308       
309        self._addAction = QAction("+", self)
310        self._addButton = QToolButton(self)
311        self._addButton.setDefaultAction(self._addAction)
[1124]312       
[1121]313        self._removeAction = QAction("-", self)
314        self._removeButton = QToolButton(self)
315        self._removeButton.setDefaultAction(self._removeAction)
316        hButtonLayout.addWidget(self._addButton)
317        hButtonLayout.addWidget(self._removeButton)
318        hButtonLayout.addStretch(10)
319        gridLayout.addLayout(hButtonLayout, 2, 0, 1, 2)
320       
321        self.setLayout(gridLayout)
322       
323        self.connect(self._addAction, SIGNAL("triggered()"), self._onAddAction)
324        self.connect(self._removeAction, SIGNAL("triggered()"), self._onRemoveAction)
325        self.connect(self._upAction, SIGNAL("triggered()"), self._onUpAction)
326        self.connect(self._downAction, SIGNAL("triggered()"), self._onDownAction)
327       
328    def sizeHint(self):
329        size = QWidget.sizeHint(self)
330        return QSize(size.width(), 100)
331       
332    def _onAddAction(self):
333        item = QStandardItem("")
[1151]334        item.setFlags(item.flags() ^ Qt.ItemIsDropEnabled)
[1121]335        self._listView.model().appendRow(item)
336        self._listView.setCurrentIndex(item.index())
337        self._listView.edit(item.index()) 
338   
339    def _onRemoveAction(self):
340        current = self._listView.currentIndex()
341        self._listView.model().takeRow(current.row())
342   
343    def _onUpAction(self):
344        row = self._listView.currentIndex().row()
345        model = self._listView.model()
[1124]346        if row > 0:
347            items = model.takeRow(row)
348            model.insertRow(row - 1, items)
349            self._listView.setCurrentIndex(model.index(row - 1, 0))
[1121]350   
351    def _onDownAction(self):
352        row = self._listView.currentIndex().row()
353        model = self._listView.model()
[1124]354        if row < model.rowCount() and row >= 0:
355            items = model.takeRow(row)
356            if row == model.rowCount():
357                model.appendRow(items)
358            else:
359                model.insertRow(row + 1, items)
360            self._listView.setCurrentIndex(model.index(row + 1, 0))
[1121]361   
362    def setModel(self, model):
363        """ Set a model to select items from
364        """
365        self._model  = model
366        self._listView.setItemDelegate(self._MyItemDelegate(self._model, self))
367       
368    def addItem(self, *args):
369        """ Add a new entry in the list
370        """
371        item = QStandardItem(*args)
[1151]372        item.setFlags(item.flags() ^ Qt.ItemIsDropEnabled)
[1121]373        self._listView.model().appendRow(item)
374       
375    def setItems(self, items):
376        self._listView.model().clear()
377        for item in items:
378            self.addItem(item)
379         
380    def items(self):
381        order = []
382        for row in range(self._listView.model().rowCount()):
383             order.append(str(self._listView.model().item(row ,0).text()))
384        return order
385   
386    sortingOrder = property(items, setItems)
387       
388   
[1022]389class OWPIPA(OWWidget):
[1121]390    settingsList = [ "platform", "selectedExperiments", "server", "buffertime", "excludeconstant", "username", "password","joinreplicates",
[1234]391                     "selectionSetsWidget.selections", "columnsSortingWidget.sortingOrder", "currentSelection", "log2", "raw", "experimentsHeaderState", "ctypei"]
[1462]392    def __init__(self, parent=None, signalManager=None, name="PIPA"):
[1022]393        OWWidget.__init__(self, parent, signalManager, name)
394        self.outputs = [("Example table", ExampleTable)]
395
396        self.platform = None
[1029]397        self.username = ""
398        self.password = ""
[1148]399        self.log2 = False
[1234]400        self.ctypei = 0
[1022]401
402        self.selectedExperiments = []
403        self.buffer = obiDicty.BufferSQLite(bufferfile)
404
405        self.searchString = ""
406        self.excludeconstant = False
[1037]407        self.joinreplicates = False
[1121]408        self.currentSelection = None
[1156]409       
[1521]410        self.experimentsHeaderState = {"": False, "Name":False, "Species": False, "Strain": False, "Experiment":False, "Genotype": False, "Treatment": False,
[1156]411                                       "Growth": False, "Timepoint": False, "Replicate": False, "ID": False}
[1049]412
[1234]413        self.exTypes  = []
414        self.annots = {}
[1049]415
[1055]416        self.controlArea.setMaximumWidth(250)
417        self.controlArea.setMinimumWidth(250)
418
[1049]419        OWGUI.button(self.controlArea, self, "Reload", callback=self.Reload)
420        OWGUI.button(self.controlArea, self, "Clear cache", callback=self.clear_cache)
[1121]421       
422        b = OWGUI.widgetBox(self.controlArea, "Experiment Sets")
423        self.selectionSetsWidget = SelectionSetsWidget(self)
424        self.selectionSetsWidget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
425#        self.controlArea.layout().addWidget(self.selectionSetsWidget)
426        b.layout().addWidget(self.selectionSetsWidget)
427       
428        b = OWGUI.widgetBox(self.controlArea, "Sort output columns")
429        self.columnsSortingWidget = SortedListWidget(self)
430        self.columnsSortingWidget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
431#        self.controlArea.layout().addWidget(self.columnsSortingWidget)
432        b.layout().addWidget(self.columnsSortingWidget)
[1521]433        self.columnsSortingWidget.setModel(QStringListModel(["Strain", "Experiment", "Genotype", "Timepoint", "Growth", "Species", "Id", "Name"]))
434        self.columnsSortingWidget.sortingOrder = ["Strain", "Experiment", "Genotype", "Timepoint"]
[1049]435        OWGUI.rubber(self.controlArea)
[1022]436
[1236]437        box = OWGUI.widgetBox(self.controlArea, 'Expression Type')
438        self.expressionTypesCB = cb = OWGUI.comboBox(box, self, "ctypei", items=[], debuggingEnabled=0, callback=self.UpdateCached)
439
440
[1022]441        OWGUI.checkBox(self.controlArea, self, "excludeconstant", "Exclude labels with constant values" )
[1049]442        OWGUI.checkBox(self.controlArea, self, "joinreplicates", "Average replicates (use median)" )
[1148]443        OWGUI.checkBox(self.controlArea, self, "log2", "Logarithmic (base 2) transformation" )
[1234]444
[1371]445        self.commit_button = OWGUI.button(self.controlArea, self, "&Commit", callback=self.Commit)
446        self.commit_button.setDisabled(True)
[1049]447
448        OWGUI.rubber(self.controlArea)
449        OWGUI.rubber(self.controlArea)
450        OWGUI.rubber(self.controlArea)
451        OWGUI.rubber(self.controlArea)
452
[1030]453        box  = OWGUI.widgetBox(self.controlArea, "Authentication")
[1055]454
[1059]455        OWGUI.lineEdit(box, self, "username", "Username:", labelWidth=100, orientation='horizontal', callback=self.AuthChanged)
456        self.passf = OWGUI.lineEdit(box, self, "password", "Password:", labelWidth=100, orientation='horizontal', callback=self.AuthChanged)
457        self.passf.setEchoMode(QLineEdit.Password)
[1022]458
459        OWGUI.lineEdit(self.mainArea, self, "searchString", "Search", callbackOnType=True, callback=self.SearchUpdate)
[1521]460        self.headerLabels = ["", "Name", "Species", "Strain", "Experiment", "Genotype", "Treatment", "Growth", "Timepoint", "Replicate", "ID",
[1156]461                             "Date RNA", "Adapter", "Who", "Date Rep", "Band", "Amount", "Experimenter","Polya", "Primer", "Shearing", "Unit"]
[1022]462        self.experimentsWidget = QTreeWidget()
[1170]463        self.experimentsWidget.setHeaderLabels(self.headerLabels)
[1022]464        self.experimentsWidget.setSelectionMode(QTreeWidget.ExtendedSelection)
465        self.experimentsWidget.setRootIsDecorated(False)
466        self.experimentsWidget.setSortingEnabled(True)
[1156]467        contextEventFilter = OWGUI.VisibleHeaderSectionContextEventFilter(self.experimentsWidget, self.experimentsWidget)
[1065]468        self.experimentsWidget.header().installEventFilter(contextEventFilter)
[1121]469        self.experimentsWidget.setItemDelegateForColumn(0, OWGUI.IndicatorItemDelegate(self, role=Qt.DisplayRole))
470        self.experimentsWidget.setAlternatingRowColors(True)
471       
472        self.connect(self.experimentsWidget.selectionModel(),
473                     SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
474                     self.onSelectionChanged)
475
476        self.selectionSetsWidget.setSelectionModel(self.experimentsWidget.selectionModel())
[1022]477
478        self.mainArea.layout().addWidget(self.experimentsWidget)
479
480        self.loadSettings()
[1121]481       
[1170]482        self.restoreHeaderState()
[1156]483       
484        self.connect(self.experimentsWidget.header(), SIGNAL("geometriesChanged()"), self.saveHeaderState)
485       
[1121]486        self.dbc = None
[1022]487
[1059]488        self.AuthSet()
489
[1121]490        QTimer.singleShot(100, self.UpdateExperiments)
[1022]491
[1121]492        self.resize(800, 600)       
[1022]493
494    def __updateSelectionList(self, oldList, oldSelection, newList):
495        oldList = [oldList[i] for i in oldSelection]
496        return [ i for i, new in enumerate(newList) if new in oldList]
497   
[1059]498    def AuthSet(self):
499        if len(self.username):
500            self.passf.setDisabled(False)
501        else:
502            self.passf.setDisabled(True)
503
504    def AuthChanged(self):
505        self.AuthSet()
506        self.ConnectAndUpdate()
507
[1029]508    def ConnectAndUpdate(self):
509        self.Connect()
[1049]510        self.UpdateExperiments(reload=True)
[1029]511
[1022]512    def Connect(self):
[1059]513
514        self.error(1)
515        self.warning(1)
516
517        def en(x):
518            return x if len(x) else None
519
520        self.dbc = obiDicty.PIPA(buffer=self.buffer, username=en(self.username), password=self.password)
521
522        #check password
523        if en(self.username) != None:
524            try:
[1234]525                self.dbc.annotations(reload=True)
[1059]526            except obiDicty.AuthenticationError:
527                self.error(1, "Wrong username or password")
528                self.dbc = None
529            except Exception, ex:
[1376]530                print "Error when contacting the PIPA database", ex
531                import traceback
532                print traceback.format_exc()
[1059]533                try: #mable cached?
[1234]534                    self.dbc.annotations()
[1059]535                    self.warning(1, "Can not access database - using cached data.")
536                except Exception,ex:
537                    self.dbc = None
538                    self.error(1, "Can not access database.")
[1022]539
[1049]540    def Reload(self):
541        #self.buffer.clear()
542        self.UpdateExperiments(reload=True)
543
544    def clear_cache(self):
[1022]545        self.buffer.clear()
[1049]546        self.Reload()
[1022]547
[1234]548    def ctype(self):
549        """ Returns selected experiment type """
[1236]550        if self.exTypes:
551            return self.exTypes[self.ctypei][0]
552        else:
553            return "-1"
[1234]554
555    def UpdateExperimentTypes(self):
[1272]556        self.signalManager.freeze(self).push() #setFreeze(1)
[1234]557        try:
558            self.expressionTypesCB.clear()
559            items = [desc for _,desc,_ in self.exTypes]
560            self.expressionTypesCB.addItems(items)
561        except IOError:
562            pass
563        finally:
[1272]564            self.signalManager.freeze(self).pop() #setFreeze(0)
[1234]565        self.ctypei = max(0, min(self.ctypei, len(self.exTypes)-1))
566
[1049]567    def UpdateExperiments(self, reload=False):
[1234]568
[1022]569        self.chipsl = []
570        self.experimentsWidget.clear()
571        self.items = []
572
573        self.progressBarInit()
574
575        if not self.dbc:
576            self.Connect()
577 
[1234]578        annots = {}
579        exTypes = []
[1049]580       
581        sucind = False #success indicator for database index
582
583        try:
584            annots = self.dbc.annotations(chips, reload=reload)
[1234]585            exTypes = self.dbc.gene_expression_types(reload=reload)
[1049]586            sucind = True
587        except Exception, ex:
588            try:
[1234]589                annots = self.dbc.annotations()
590                exTypes = self.dbc.gene_expression_types()
[1049]591                self.warning(0, "Can not access database - using cached data.")
592                sucind = True
593            except Exception,ex:
594                self.error(0, "Can not access database.")
595
[1059]596        if sucind:
597            self.warning(0)
598            self.error(0)
599
[1234]600        self.annots = annots
601        self.exTypes = exTypes
602
603        self.UpdateExperimentTypes() 
[1057]604
[1022]605        elements = []
606        pos = 0
607
[1234]608        for chip,annot in self.annots.items():
[1022]609            pos += 1
610            d = defaultdict(lambda: "?", annot)
[1521]611            elements.append(["", d["name"], d["species"], d["strain"], d["Experiment"], d["genotype"], d["treatment"], d["growth"], d["tp"], d["replicate"], chip] + \
[1156]612                             [d[label.lower().replace(" ", "_")] for label in ["Date RNA", "Adapter", "Who", "Date Rep", "Band", "Amount", "Experimenter", "Polya", "Primer", "Shearing", "Unit"]])
613           
[1121]614#            self.progressBarSet((100.0 * pos) / len(chips))
[1069]615           
616            el = elements[-1]
617            ci = MyTreeWidgetItem(self.experimentsWidget, el)
618
619            self.items.append(ci)
[1022]620
[1156]621        for i in range(len(self.headerLabels)):
[1022]622            self.experimentsWidget.resizeColumnToContents(i)
623
[1049]624        #which is the ok buffer version
[1238]625        self.wantbufver = lambda x,ad=self.annots: defaultdict(lambda: "?", ad[x])["date"] #FIXME what attribute to use for version?
[1049]626
627        self.UpdateCached()
628
[1022]629        self.progressBarFinished()
[1121]630       
631        if self.currentSelection:
632            self.currentSelection.select(self.experimentsWidget.selectionModel())
[1022]633
[1371]634        self.handle_commit_button()
635
[1049]636    def UpdateCached(self):
[1059]637        if self.wantbufver and self.dbc:
[1234]638            fn = self.dbc.chips_keynaming(self.ctype())
639
[1049]640            for item in self.items:
[1521]641                c = str(item.text(10))
[1121]642                item.setData(0, Qt.DisplayRole, QVariant(" " if self.dbc.inBuffer(fn(c)) == self.wantbufver(c) else ""))
[1049]643
[1022]644    def SearchUpdate(self, string=""):
645        for item in self.items:
646            item.setHidden(not all(s in item for s in self.searchString.split()))
647
648    def Commit(self):
649        if not self.dbc:
650            self.Connect()
651        allTables = []
652
653        import time
654        start = time.time()
655
656        pb = OWGUI.ProgressBar(self, iterations=1000)
657
658        table = None
659
660        ids = []
661        for item in self.experimentsWidget.selectedItems():
[1521]662            ids += [ str(item.text(10)) ]
[1022]663
[1148]664        transfn = None
665        if self.log2:
666            transfn = lambda x: math.log(x+1.0, 2)
[1156]667       
[1158]668        keys = {"Strain": "strain", "Genotype": "genotype", "Treatment": "treatment", "Timepoint": "tp", "Growth": "growth", "Replicate": "replicate", 
669                "Species": "species", "Name": "name", "Date RNA": "date_rna", "Adapter":"adapter",
[1156]670                "Who": "who", "Date Rep": "date_rep", "Band": "band", "Amount": "amount", "Experimenter":"experimenter",
[1521]671                "Polya": "polya", "Primer": "primer", "Shearing": "shearing", "Unit": "unit", "Experiment":"Experiment"}
[1156]672       
673        hview = self.experimentsWidget.header()
674        shownHeaders = [label for i, label in list(enumerate(self.headerLabels))[1:] if not hview.isSectionHidden(i)]
675        allowed_labels = [keys.get(label, label) for label in shownHeaders]
[1157]676       
[1194]677        if self.joinreplicates and "id" not in allowed_labels:
678            # need 'id' labels in join_replicates for attribute names
679            allowed_labels.append("id")
680       
[1371]681        if len(ids):
682            table = self.dbc.get_data(ids=ids, callback=pb.advance, exclude_constant_labels=self.excludeconstant, bufver=self.wantbufver, transform=transfn, allowed_labels=allowed_labels, ctype=self.ctype())
[1022]683
[1371]684            if self.joinreplicates:
[1480]685                table = obiDicty.join_replicates(table, ignorenames=["replicate", "id", "name", "map_stop1"], namefn=None, avg=obiDicty.median)
[1037]686
[1371]687            end = int(time.time()-start)
688           
689
690            # Sort attributes
691            sortOrder = self.columnsSortingWidget.sortingOrder
692            # print sortOrder
693           
694            attributes = sorted(table.domain.attributes, key=lambda attr: tuple([attr.attributes.get(keys[name], "") for name in sortOrder]))
695            domain = orange.Domain(attributes, table.domain.classVar)
696            domain.addmetas(table.domain.getmetas())
697            table = orange.ExampleTable(domain, table)
698           
[1632]699            from Orange.orng.orngDataCaching import data_hints
[1371]700            data_hints.set_hint(table, "taxid", "352472") 
701            data_hints.set_hint(table, "genesinrows", False)
702           
703            self.send("Example table", table)
704
705            self.UpdateCached()
706
[1022]707        pb.finish()
708
[1371]709    def onSelectionChanged(self, selected, deselected):
710        self.handle_commit_button()
[1156]711       
[1371]712    def handle_commit_button(self):
[1121]713        self.currentSelection = SelectionByKey(self.experimentsWidget.selectionModel().selection(),
[1521]714                                               key=(1, 2, 3, 10))
[1371]715        self.commit_button.setDisabled(not len(self.currentSelection))
716
[1156]717    def saveHeaderState(self):
718        hview = self.experimentsWidget.header()
[1170]719        for i, label in enumerate(self.headerLabels):
720            self.experimentsHeaderState[label] = hview.isSectionHidden(i)
[1156]721           
722    def restoreHeaderState(self):
723        hview = self.experimentsWidget.header()
724        for i, label in enumerate(self.headerLabels): 
725            hview.setSectionHidden(i, self.experimentsHeaderState.get(label, True))
726            self.experimentsWidget.resizeColumnToContents(i)
727           
[1022]728if __name__ == "__main__":
729    app  = QApplication(sys.argv)
730##    from pywin.debugger import set_trace
731##    set_trace()
[1234]732    obiDicty.verbose = True
[1029]733    w = OWPIPA()
[1022]734    w.show()
735    app.exec_()
736    w.saveSettings()
737           
738       
Note: See TracBrowser for help on using the repository browser.