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

Last change on this file since 464 was 464, checked in by ajj, 14 years ago

added buttons

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