source: orange-bioinformatics/_bioinformatics/widgets/prototypes/OWCustomSets.py @ 1818:ffa449bd9709

Revision 1818:ffa449bd9709, 7.2 KB checked in by Flashpoint <vid.flashpoint@…>, 10 months ago (diff)

Version 1 of the OWCustomSet.py widget

Line 
1"""
2<name>Custom Gene Sets</name>
3<description>Manage custom geneset files</description>
4<icon></icon>
5<contact>Vid Jelen (vid.jelen1@gmail.com)</contact>
6"""
7import os
8from StringIO import StringIO
9
10import Orange
11import cPickle as pickle
12
13from OWWidget import *
14import OWGUI
15
16from Orange.bio.obiGeneSets import loadGMT, list_local, register, local_path, remove_local, modification_date, getGenesetsStats
17
18class standard_icons(object):
19    def __init__(self, qwidget=None, style=None):
20        self.qwidget = qwidget
21        if qwidget is None:
22            self.style = QApplication.instance().style()
23        else:
24            self.style = qwidget.style()
25
26    @property
27    def dir_open_icon(self):
28        return self.style.standardIcon(QStyle.SP_DirOpenIcon)
29
30    @property
31    def reload_icon(self):
32        return self.style.standardIcon(QStyle.SP_BrowserReload)
33
34
35class OWCustomSets(OWWidget):
36
37    def __init__(self, parent=None, signalManager=None,
38                 title="Custom Geneset File (*.gmt) Manager"):
39        OWWidget.__init__(self, parent, signalManager, title,
40                          wantMainArea=True)
41
42        self.inputs = []
43        self.outputs = []
44        self.new_geneset = set()
45        self.selected_file = "" 
46
47        layout = QHBoxLayout()
48        box = OWGUI.widgetBox(self.controlArea, "File", orientation=layout)
49
50        icons = standard_icons(self)
51
52        self.browse_button = QPushButton(" ...", icon=icons.dir_open_icon,
53                                         toolTip="Browse filesystem",
54                                         clicked=self.on_open_dialog)
55
56        layout.addWidget(self.browse_button)
57       
58        # The preview field       
59        box = OWGUI.widgetBox(self.controlArea, "Available Gene Sets")
60        self.preview_view = QPlainTextEdit()
61        self.preview_view.setReadOnly(True)
62        self.preview_view.setWordWrapMode(0)
63 
64        # The geneset table
65        ma = self.mainArea
66
67        self.listView = QTreeWidget(ma)
68
69        # Adding the widgets into separate layouts
70        ma.layout().addWidget(self.preview_view)
71        box.layout().addWidget(self.listView)
72
73
74        self.listView.setAllColumnsShowFocus(1)
75        self.listView.setColumnCount(2)
76        self.listView.setHeaderLabels(["Name", "Import time"])
77
78        self.listView.header().setStretchLastSection(True)
79#        self.listView.header().setClickable(True)
80#        self.listView.header().setSortIndicatorShown(True)
81#        self.listView.setSortingEnabled(True)
82
83        self.listView.setSelectionMode(QAbstractItemView.SingleSelection)
84        self.listView.setSelectionBehavior(QAbstractItemView.SelectRows)
85
86        self.populate_table()
87
88        self.resize(800, 500)
89
90        #Data Set info bar
91        info_box = OWGUI.widgetBox(self.controlArea, "Info")
92        self.info = OWGUI.widgetLabel(info_box, "No gene set selected")
93        self.connect(self.listView, SIGNAL("itemSelectionChanged()"), self.selection)
94        self.connect(self.listView, SIGNAL("itemSelectionChanged()"), self.update_preview)
95
96        info_box.layout().addWidget(self.info)       
97       
98        OWGUI.button(self.controlArea, self, "Delete", callback=self.delete_data)
99
100    def selection(self): 
101        if self.listView.selectedItems():
102            self.info.clear()
103            name = self.listView.selectedItems()[0].text(0)           
104            for geneset in os.listdir(local_path()):
105                if geneset.__contains__(str(name)):
106                    the_file = os.path.join(local_path(), geneset) 
107                    sets = pickle.load(open(the_file, "rb"))
108                    stats = getGenesetsStats(sets)
109                    num_sets, uniq_genes, avg_genes = str(stats[0]), str(stats[1]), str(stats[2])
110                    break
111            self.info.setText("Gene Sets: %d\nUnique Genes: %d\nAverage Gene Set size: %d" % (int(num_sets), int(uniq_genes), int(avg_genes)))
112        else:
113            self.info.setText("No gene set selected")
114
115
116    def populate_table(self):
117        self.listView.clear()
118        for geneset in os.listdir(local_path()):
119            item = QTreeWidgetItem(self.listView)
120            name = geneset[geneset.index("_._")+3:geneset.index(".gmt")+4]
121            the_file = os.path.join(local_path(), geneset)
122            mod_time = str(modification_date(the_file))
123            item.setText(0, name)
124            item.setText(1, mod_time[:mod_time.rfind(".")])
125
126    def on_select_recent(self, recent):
127        if isinstance(recent, int):
128            recent = self.recent_files[recent]
129
130        self.set_selected_file(recent)
131
132    def on_open_dialog(self):
133        last = os.path.expanduser("~/Documents")
134        path = QFileDialog.getOpenFileName(self, "Open File","" ,"geneset file *.gmt (*.gmt);;All files (*)", last)
135        path = unicode(path)
136        if path:
137            self.set_selected_file(path)
138
139    def set_selected_file(self, filename):
140        basedir, name = os.path.split(filename)
141        self.selected_file = filename
142        self.genesetname = name
143           
144        self.import_data()
145                                                                   
146    def update_preview(self):
147        if self.listView.selectedItems():
148            final_text = ""
149            self.preview_view.clear()
150            name = self.listView.selectedItems()[0].text(0)           
151            for geneset in os.listdir(local_path()):
152                if geneset.__contains__(str(name)):
153                    the_file = os.path.join(local_path(), geneset) 
154                    sets = pickle.load(open(the_file, "rb"))
155                    break
156            geneset_count = 0
157            for geneset in sets:
158                final_text += geneset.id + " (%d genes)\n" % len(geneset.genes)
159                final_text += ", ".join([geneset.genes.pop() for i in range(5)]) + ", ...\n\n"
160                geneset_count += 1
161                if geneset_count == 5:
162                    break
163            final_text += "..."
164            self.preview_view.setPlainText(final_text)
165        else:
166            self.preview_view.clear()
167
168    def import_data(self):   
169        self.error(0)     
170        if self.selected_file:
171            try:
172                self.new_geneset = loadGMT(open(self.selected_file, "rt").read(), self.genesetname)
173                geneset_split = self.new_geneset.split_by_hierarchy()
174                for geneset in geneset_split:
175                    register(geneset)
176                self.populate_table()
177            except Exception, ex:
178                self.error(0, "An error occurred while "
179                              "loading the file:\n\t%r" % self.selected_file
180                              )   
181
182    def delete_data(self):   
183        self.error(0)
184        if self.listView.selectedItems():
185            try:
186                unwantedGeneset = str(self.listView.selectedItems()[0].text(0))
187                remove_local(unwantedGeneset)
188                self.populate_table()
189            except Exception, ex:
190                self.error(0, "An error occurred while "
191                              "deleting the file:\n\t%r" % unwantedGeneset
192                              )   
193       
194if __name__ == "__main__":
195    import sys
196    app = QApplication(sys.argv)
197    w = OWCustomSets()
198    w.show()
199    app.exec_()
200    w.saveSettings()
Note: See TracBrowser for help on using the repository browser.