source: orange-bioinformatics/_bioinformatics/widgets/prototypes/OWCustomSets.py @ 1812:6871643ec38f

Revision 1812:6871643ec38f, 6.7 KB checked in by Flashpoint <vid.flashpoint@…>, 11 months ago (diff)

Custom genesets now use Custom Genesets hierarchy in obiGeneSets.py. Renamed OWtest.py to OWCustomSets.py and renamed the widget from test to Custom Gene Sets. Added a preview window to quickly view geneset files before importing them.

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
11
12from OWWidget import *
13import OWGUI
14
15from Orange.bio.obiGeneSets import loadGMT, list_local, register, local_path, remove_local, modification_date
16
17class standard_icons(object):
18    def __init__(self, qwidget=None, style=None):
19        self.qwidget = qwidget
20        if qwidget is None:
21            self.style = QApplication.instance().style()
22        else:
23            self.style = qwidget.style()
24
25    @property
26    def dir_open_icon(self):
27        return self.style.standardIcon(QStyle.SP_DirOpenIcon)
28
29    @property
30    def reload_icon(self):
31        return self.style.standardIcon(QStyle.SP_BrowserReload)
32
33
34class OWCustomSets(OWWidget):
35    settingsList = ["recent_files"]
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
46        # List of recent opened files.
47        self.recent_files = []
48        self.loadSettings()
49        self.recent_files = filter(os.path.exists, self.recent_files)
50
51        layout = QHBoxLayout()
52        box = OWGUI.widgetBox(self.controlArea, "File", orientation=layout)
53
54        icons = standard_icons(self)
55
56        self.recent_combo = QComboBox(self, objectName="recent_combo",
57                                      toolTip="Recent files",
58                                      activated=self.on_select_recent)
59        self.recent_combo.addItems([os.path.basename(p) \
60                                    for p in self.recent_files])
61
62        self.browse_button = QPushButton("...", icon=icons.dir_open_icon,
63                                         toolTip="Browse filesystem",
64                                         clicked=self.on_open_dialog)
65
66        layout.addWidget(self.recent_combo, 2)
67        layout.addWidget(self.browse_button)
68       
69        # The preview field
70        form = QFormLayout()
71       
72        box = OWGUI.widgetBox(self.controlArea, "Preview")
73        self.preview_view = QPlainTextEdit()
74        self.preview_view.setReadOnly(True)
75        self.preview_view.setWordWrapMode(0)
76
77        box.layout().addWidget(self.preview_view)
78
79        OWGUI.button(self.controlArea, self, "Import", callback=self.import_data)
80
81        # The geneset table
82        ma = self.mainArea
83
84        self.listView = QTreeWidget(ma)
85        ma.layout().addWidget(self.listView)
86        self.listView.setAllColumnsShowFocus(1)
87        self.listView.setColumnCount(2)
88        self.listView.setHeaderLabels(["Genesets name", "Import time"])
89
90        self.listView.header().setStretchLastSection(True)
91        self.listView.header().setClickable(True)
92        self.listView.header().setSortIndicatorShown(True)
93        self.listView.setSortingEnabled(True)
94
95        self.listView.setSelectionMode(QAbstractItemView.SingleSelection)
96        self.listView.setSelectionBehavior(QAbstractItemView.SelectRows)
97
98        self.populate_table()
99
100        OWGUI.button(self.controlArea, self, "Delete", callback=self.delete_data)
101
102        self.selected_file = None 
103
104        self.resize(450, 500)
105        if self.recent_files:
106            QTimer.singleShot(1,
107                    lambda: self.set_selected_file(self.recent_files[0])
108                    )
109
110    def populate_table(self):
111        self.listView.clear()
112        for geneset in os.listdir(local_path()):
113            item = QTreeWidgetItem(self.listView)
114            name = geneset[geneset.index("_._")+3:geneset.index(".gmt")+4]
115            the_file = os.path.join(local_path(), geneset)
116            mod_time = str(modification_date(the_file))
117            item.setText(0, name)
118            item.setText(1, mod_time[:mod_time.rfind(".")])
119
120        print list_local()
121
122    def on_select_recent(self, recent):
123        if isinstance(recent, int):
124            recent = self.recent_files[recent]
125
126        self.set_selected_file(recent)
127
128    def on_open_dialog(self):
129        last = os.path.expanduser("~/Documents")
130        path = QFileDialog.getOpenFileName(self, "Open File","" ,"geneset file *.gmt (*.gmt);;All files (*)", last)
131        path = unicode(path)
132        if path:
133            self.set_selected_file(path)
134
135    def on_reload_file(self):
136        if self.recent_files:
137            self.set_selected_file(self.recent_files[0])
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        index_to_remove = None
144        if filename in self.recent_files:
145            index_to_remove = self.recent_files.index(filename)
146        elif self.recent_combo.count() > 6:
147            # Always keep 6 latest files in the list.
148            index_to_remove = self.recent_combo.count() - 1
149        self.recent_combo.insertItem(0, name)
150        self.recent_combo.setCurrentIndex(0)
151        self.recent_files.insert(0, filename)
152
153        if index_to_remove is not None:
154            self.recent_combo.removeItem(index_to_remove + 1)
155            self.recent_files.pop(index_to_remove + 1)
156 
157        self.update_preview()
158   
159    def update_preview(self):
160        try:
161            text = open(self.selected_file).read()
162            self.preview_view.setPlainText(text)
163        except:
164            text = None
165           
166    def import_data(self):   
167        self.error(0)     
168        if self.selected_file:
169            try:
170                self.new_geneset = loadGMT(open(self.selected_file, "rt").read(), self.genesetname)
171                geneset_split = self.new_geneset.split_by_hierarchy()
172                for geneset in geneset_split:
173                    register(geneset)
174                self.populate_table()
175            except Exception, ex:
176                self.error(0, "An error occurred while "
177                              "loading the file:\n\t%r" % self.selected_file
178                              )   
179
180    def delete_data(self):   
181        self.error(0)
182        if self.listView.selectedItems():
183            try:
184                unwantedGeneset = str(self.listView.selectedItems()[0].text(0))
185                remove_local(unwantedGeneset)
186                self.populate_table()
187            except Exception, ex:
188                self.error(0, "An error occurred while "
189                              "deleting the file:\n\t%r" % unwantedGeneset
190                              )   
191       
192if __name__ == "__main__":
193    import sys
194    app = QApplication(sys.argv)
195    w = OWCustomSets()
196    w.show()
197    app.exec_()
198    w.saveSettings()
Note: See TracBrowser for help on using the repository browser.