source: sans/utils/bt5/bt5plot2/bt5plot2 @ 447

Last change on this file since 447 was 447, checked in by ajj, 14 years ago
  • Property svn:executable set to *
File size: 10.2 KB
Line 
1#!/usr/bin/env python
2
3import sys
4import os
5import matplotlib
6matplotlib.use('GTK')
7
8from matplotlib.figure import Figure
9from matplotlib.axes import Subplot
10from matplotlib.backends.backend_gtk import FigureCanvasGTK, NavigationToolbar
11
12import usans
13
14try:
15    import pygtk
16    pygtk.require("2.0")
17   
18except:
19    pass
20
21try:
22    import gtk
23    import gtk.glade
24except:
25    sys.exit(1)
26
27
28
29class appGui:
30   
31    TARGETS = [('STRING', gtk.TARGET_SAME_APP, 0)]
32   
33    def __init__(self):
34       
35        gladefile = "bt5plot2.glade"
36        self.windowname = "win_Main"
37        self.wTree = gtk.glade.XML(gladefile, self.windowname)
38
39        event_dic = {"on_win_Main_destroy" : gtk.main_quit,
40                     "on_quit1_activate" : gtk.main_quit,
41                     "on_set_data_dir1_activate" : self.setdatadir,
42                     "on_xaxis_loglin_activate" : self.handle_xaxis_loglin,
43                     "on_yaxis_loglin_activate" : self.handle_yaxis_loglin,
44                     "on_plot_type_activate" : self.handle_plot_type_change}
45    #                 "on_tv_plotlist_key_press_event" : self.handle_plotlist_keypress}
46
47        #This is a bit clunky, but never mind.
48        #Set default plottype to rate. Glade definition sets that as default active button in menu
49        self.plottype = 'rate'
50       
51        self.wTree.signal_autoconnect(event_dic)
52
53        # Set up file list
54        self.filelistview = self.wTree.get_widget("tv_filelist")
55       
56        self.filelist = gtk.ListStore(str, 'gboolean', object, object, object)
57        self.filelist.set_sort_column_id(0, gtk.SORT_ASCENDING)
58        self.filelistview.set_model(self.filelist)
59
60        self.cellrenderertoggle = gtk.CellRendererToggle()
61        self.cellrenderertoggle.set_property('activatable', True)
62        self.cellrenderertoggle.connect("toggled", self.handle_plot_toggle, self.filelist)
63   
64        self.AddFileListColumns()
65
66        #fill the file list
67        self.FillFileList(self.GetDirList())
68
69        # Set up graphing widget to display xpeek data
70        self.figure = Figure(figsize=(4, 4), dpi=72)
71        self.axis = self.figure.add_subplot(111)
72        self.axis.set_yscale('log')
73        self.axis.set_aspect('auto')
74        self.axis.set_autoscale_on('True')
75        self.axis.set_xlabel('Motor position')
76        self.axis.set_ylabel('Counts')
77        self.axis.grid(True)
78       
79        self.canvas = FigureCanvasGTK(self.figure)
80        self.canvas.show()
81       
82        self.plotView = self.wTree.get_widget("hbox1")
83        self.plotView.pack_start(self.canvas, True, True)   
84       
85        self.metadataView = self.wTree.get_widget("tv_metadata")
86        self.mdlist = gtk.ListStore(str,str)
87       
88       
89        #self.filelistview.enable_model_drag_source( gtk.gdk.BUTTON1_MASK,
90                #                                  self.TARGETS,
91                #                                   gtk.gdk.ACTION_COPY)
92
93        #self.filelistview.connect("drag_data_get", self.dnd_data_getdata)
94       
95       
96    def AddFileListColumns(self):
97        """This function adds a column to the list view.
98        First it create the gtk.TreeViewColumn and then set
99        some needed properties"""
100                       
101        column = gtk.TreeViewColumn('Filename', gtk.CellRendererText()
102            , text=0)
103        column.set_resizable(True)       
104        column.set_sort_column_id(0)
105        self.filelistview.append_column(column)
106
107        column = gtk.TreeViewColumn('', self.cellrenderertoggle, active=1)
108        self.filelistview.append_column(column)
109        return
110       
111    def GetDirList(self):
112        dirlist = os.listdir(os.getcwd())
113       
114        bt5list = [ x for x in dirlist if x.find('.bt5') > 0]
115       
116        return bt5list
117       
118   
119    def FillFileList(self, filenames):
120        self.filelist.clear()
121        for filename in filenames:
122            data,metadata = usans.getBT5DataFromFile(filename)
123            if data != 0:
124                self.filelist.append([filename, 0, (data,metadata), 0, 0])
125        return
126           
127
128    def setdatadir(self, widget):
129        chooser = gtk.FileChooserDialog(title="Select Data Directory", action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
130                                  buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
131        chooser.set_default_response(gtk.RESPONSE_OK)
132        chooser.set_current_folder(os.getcwd())
133        response = chooser.run()
134        if response == gtk.RESPONSE_OK:
135            os.chdir(chooser.get_filename())
136            self.FillFileList(self.GetDirList())
137        chooser.destroy()
138
139    def handle_plot_toggle(self, cell, path, model):
140        model[path][1] = not model[path][1]
141
142        if model[path][1]:
143            #add plot
144            self.add_plot(model, path)
145        else:
146            #remove plot
147            self.remove_plot(model, path)
148        return
149
150    def add_plot(self, model, path):
151       
152        self.make_plottable_dataset(model, path, self.plottype)
153
154        if self.plottype == 'split':
155                model[path][4] = self.axis.plot(model[path][3][0],model[path][3][1], 'o',
156                                                                                         model[path][3][0],model[path][3][2], 'o',
157                                                                                         model[path][3][0],model[path][3][3], 'o',
158                                                                                         model[path][3][0],model[path][3][4], 'o',
159                                                                                         model[path][3][0],model[path][3][5], 'o')
160        else:
161            model[path][4] = self.axis.plot(model[path][3][0],model[path][3][1], 'bo')
162       
163        self.rescale_and_redraw()
164        #self.canvas.draw()
165        return
166
167    def make_plottable_dataset(self, model, path, type):
168         
169         data,metadata = model[path][2]
170         
171         if type == 'total':
172             #generate totals
173             xdata = []
174             ydata = []     
175             
176             mvals = data.keys()
177             mvals.sort(usans.numeric_compare)
178             for mval in mvals:
179                 xdata.append(mval)
180                 ydata.append(data[mval][1] + data[mval][2] + data[mval][4] + data[mval][5] + data[mval][6])
181             
182             model[path][3] = [xdata, ydata]
183             
184         elif type == 'rate':
185             # generate countrate
186             xdata = []
187             ydata = []
188             
189             mvals = data.keys()
190             mvals.sort(usans.numeric_compare)
191             for mval in mvals:
192                 xdata.append(mval)
193             
194             if metadata['base'] == 'TIME':
195                #Counting in TIME base, so normalize by seconds
196                cnttime = metadata['mon']
197                for mval in mvals:
198                        ydata.append((data[mval][1] + data[mval][2] + data[mval][4] + data[mval][5] + data[mval][6])/cnttime)
199             else:
200                #Must be counting in monitor base so normalize by monitor
201                moncts = metadata['mon']
202                for mval in mvals:
203                        ydata.append((data[mval][1] + data[mval][2] + data[mval][4] + data[mval][5] + data[mval][6])/cnttime)
204             
205             model[path][3] = [xdata, ydata]
206             
207         elif type == 'trans':
208             xdata = []
209             ydata = []
210             
211             mvals = data.keys()
212             mvals.sort(usans.numeric_compare)
213             for mval in mvals:
214                 xdata.append(mval)
215                 ydata.append(data[mval][3])
216             
217             model[path][3] = [xdata, ydata]             
218         
219         elif type == 'mon':
220             xdata = []
221             ydata = []
222             
223             mvals = data.keys()
224             mvals.sort(usans.numeric_compare)
225             for mval in mvals:
226                 xdata.append(mval)
227                 ydata.append(data[mval][0])
228             
229             model[path][3] = [xdata, ydata]             
230             
231         elif type == 'split':
232             xdata = []
233             ydata1 = []
234             ydata2 = []
235             ydata3 = []
236             ydata4 = []
237             ydata5 = []
238             
239             mvals = data.keys()
240             mvals.sort(usans.numeric_compare)
241             for mval in mvals:
242                 xdata.append(mval)
243                 ydata1.append(data[mval][1])   
244                 ydata2.append(data[mval][2])   
245                 ydata3.append(data[mval][4])   
246                 ydata4.append(data[mval][5])   
247                 ydata5.append(data[mval][6])   
248
249             model[path][3] = [xdata,ydata1,ydata2,ydata3,ydata4,ydata5]
250         else:
251                pass
252             
253         return
254
255    def remove_plot(self, model, path):
256
257        for line in model[path][4]:
258                self.axis.lines.remove(line)
259       
260       
261       
262        #self.canvas.draw()     
263        self.rescale_and_redraw()
264        return
265
266    def handle_xaxis_loglin(self, widget):
267
268
269        if (self.axis.get_xscale() == "log"):
270            self.axis.set_xscale('linear')
271        else:
272            self.axis.set_xscale('log')       
273
274
275        self.rescale_and_redraw()
276       
277        return   
278
279    def handle_yaxis_loglin(self, widget):
280
281
282        if (self.axis.get_yscale() == "log"):
283            self.axis.set_yscale('linear')
284        else:
285            self.axis.set_yscale('log')       
286
287        self.rescale_and_redraw()
288        return
289       
290    def handle_plot_type_change(self,widget):
291               
292        if widget.get_active():
293                self.plottype = widget.get_name().split('_')[1]
294                print self.plottype
295               
296        return
297       
298    def rescale_and_redraw(self):
299
300        xdata = []
301        ydata = []
302
303        for line in self.axis.lines:
304                if self.axis.get_xscale() == 'log':
305                        xdata.extend([xval for xval in line.get_xdata() if xval > 0])
306                else:
307                        xdata.extend(line.get_xdata())
308                if self.axis.get_yscale() == 'log':
309                        ydata.extend([xval for xval in line.get_ydata() if xval > 0])
310                else:
311                        ydata.extend(line.get_ydata())
312     
313        #set limits
314        xmin = float(min(xdata))
315        xmax = float(max(xdata))
316        ymin = float(min(ydata))
317        ymax = float(max(ydata))       
318
319        #adjust for size of markers (sort of)
320        xmin = xmin - 0.1*abs(xmin)
321        xmax = xmax + 0.1*abs(xmax)
322        ymin = ymin - 0.1*abs(ymin)
323        ymax = ymax + 0.1*abs(ymax)
324               
325        self.axis.set_xlim(xmin,xmax)
326        self.axis.set_ylim(ymin,ymax)
327       
328        #self.axis.autoscale_view()
329        self.canvas.draw()
330
331        return
332
333app = appGui()
334gtk.main()
Note: See TracBrowser for help on using the repository browser.