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

Last change on this file since 446 was 446, checked in by ajj, 14 years ago
  • Property svn:executable set to *
File size: 10.1 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.filelistview.enable_model_drag_source( gtk.gdk.BUTTON1_MASK,
86                #                                  self.TARGETS,
87                #                                   gtk.gdk.ACTION_COPY)
88
89        #self.filelistview.connect("drag_data_get", self.dnd_data_getdata)
90       
91       
92    def AddFileListColumns(self):
93        """This function adds a column to the list view.
94        First it create the gtk.TreeViewColumn and then set
95        some needed properties"""
96                       
97        column = gtk.TreeViewColumn('Filename', gtk.CellRendererText()
98            , text=0)
99        column.set_resizable(True)       
100        column.set_sort_column_id(0)
101        self.filelistview.append_column(column)
102
103        column = gtk.TreeViewColumn('', self.cellrenderertoggle, active=1)
104        self.filelistview.append_column(column)
105        return
106       
107    def GetDirList(self):
108        dirlist = os.listdir(os.getcwd())
109       
110        bt5list = [ x for x in dirlist if x.find('.bt5') > 0]
111       
112        return bt5list
113       
114   
115    def FillFileList(self, filenames):
116        self.filelist.clear()
117        for filename in filenames:
118            data,metadata = usans.getBT5DataFromFile(filename)
119            if data != 0:
120                self.filelist.append([filename, 0, (data,metadata), 0, 0])
121        return
122           
123
124    def setdatadir(self, widget):
125        chooser = gtk.FileChooserDialog(title="Select Data Directory", action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
126                                  buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
127        chooser.set_default_response(gtk.RESPONSE_OK)
128        chooser.set_current_folder(os.getcwd())
129        response = chooser.run()
130        if response == gtk.RESPONSE_OK:
131            os.chdir(chooser.get_filename())
132            self.FillFileList(self.GetDirList())
133        chooser.destroy()
134
135    def handle_plot_toggle(self, cell, path, model):
136        model[path][1] = not model[path][1]
137
138        if model[path][1]:
139            #add plot
140            self.add_plot(model, path)
141        else:
142            #remove plot
143            self.remove_plot(model, path)
144        return
145
146    def add_plot(self, model, path):
147       
148        self.make_plottable_dataset(model, path, self.plottype)
149
150        if self.plottype == 'split':
151                model[path][4] = self.axis.plot(model[path][3][0],model[path][3][1], 'o',
152                                                                                         model[path][3][0],model[path][3][2], 'o',
153                                                                                         model[path][3][0],model[path][3][3], 'o',
154                                                                                         model[path][3][0],model[path][3][4], 'o',
155                                                                                         model[path][3][0],model[path][3][5], 'o')
156        else:
157            model[path][4] = self.axis.plot(model[path][3][0],model[path][3][1], 'bo')
158       
159        self.rescale_and_redraw()
160        #self.canvas.draw()
161        return
162
163    def make_plottable_dataset(self, model, path, type):
164         
165         data,metadata = model[path][2]
166         
167         if type == 'total':
168             #generate totals
169             xdata = []
170             ydata = []     
171             
172             mvals = data.keys()
173             mvals.sort(usans.numeric_compare)
174             for mval in mvals:
175                 xdata.append(mval)
176                 ydata.append(data[mval][1] + data[mval][2] + data[mval][4] + data[mval][5] + data[mval][6])
177             
178             model[path][3] = [xdata, ydata]
179             
180         elif type == 'rate':
181             # generate countrate
182             xdata = []
183             ydata = []
184             
185             mvals = data.keys()
186             mvals.sort(usans.numeric_compare)
187             for mval in mvals:
188                 xdata.append(mval)
189             
190             if metadata['base'] == 'TIME':
191                #Counting in TIME base, so normalize by seconds
192                cnttime = metadata['mon']
193                for mval in mvals:
194                        ydata.append((data[mval][1] + data[mval][2] + data[mval][4] + data[mval][5] + data[mval][6])/cnttime)
195             else:
196                #Must be counting in monitor base so normalize by monitor
197                moncts = metadata['mon']
198                for mval in mvals:
199                        ydata.append((data[mval][1] + data[mval][2] + data[mval][4] + data[mval][5] + data[mval][6])/cnttime)
200             
201             model[path][3] = [xdata, ydata]
202             
203         elif type == 'trans':
204             xdata = []
205             ydata = []
206             
207             mvals = data.keys()
208             mvals.sort(usans.numeric_compare)
209             for mval in mvals:
210                 xdata.append(mval)
211                 ydata.append(data[mval][3])
212             
213             model[path][3] = [xdata, ydata]             
214         
215         elif type == 'mon':
216             xdata = []
217             ydata = []
218             
219             mvals = data.keys()
220             mvals.sort(usans.numeric_compare)
221             for mval in mvals:
222                 xdata.append(mval)
223                 ydata.append(data[mval][0])
224             
225             model[path][3] = [xdata, ydata]             
226             
227         elif type == 'split':
228             xdata = []
229             ydata1 = []
230             ydata2 = []
231             ydata3 = []
232             ydata4 = []
233             ydata5 = []
234             
235             mvals = data.keys()
236             mvals.sort(usans.numeric_compare)
237             for mval in mvals:
238                 xdata.append(mval)
239                 ydata1.append(data[mval][1])   
240                 ydata2.append(data[mval][2])   
241                 ydata3.append(data[mval][4])   
242                 ydata4.append(data[mval][5])   
243                 ydata5.append(data[mval][6])   
244
245             model[path][3] = [xdata,ydata1,ydata2,ydata3,ydata4,ydata5]
246         else:
247                pass
248             
249         return
250
251    def remove_plot(self, model, path):
252
253        for line in model[path][4]:
254                self.axis.lines.remove(line)
255       
256       
257       
258        #self.canvas.draw()     
259        self.rescale_and_redraw()
260        return
261
262    def handle_xaxis_loglin(self, widget):
263
264
265        if (self.axis.get_xscale() == "log"):
266            self.axis.set_xscale('linear')
267        else:
268            self.axis.set_xscale('log')       
269
270
271        self.rescale_and_redraw()
272       
273        return   
274
275    def handle_yaxis_loglin(self, widget):
276
277
278        if (self.axis.get_yscale() == "log"):
279            self.axis.set_yscale('linear')
280        else:
281            self.axis.set_yscale('log')       
282
283        self.rescale_and_redraw()
284        return
285       
286    def handle_plot_type_change(self,widget):
287               
288        if widget.get_active():
289                self.plottype = widget.get_name().split('_')[1]
290                print self.plottype
291               
292        return
293       
294    def rescale_and_redraw(self):
295
296        xdata = []
297        ydata = []
298
299        for line in self.axis.lines:
300                if self.axis.get_xscale() == 'log':
301                        xdata.extend([xval for xval in line.get_xdata() if xval > 0])
302                else:
303                        xdata.extend(line.get_xdata())
304                if self.axis.get_yscale() == 'log':
305                        ydata.extend([xval for xval in line.get_ydata() if xval > 0])
306                else:
307                        ydata.extend(line.get_ydata())
308     
309        #set limits
310        xmin = float(min(xdata))
311        xmax = float(max(xdata))
312        ymin = float(min(ydata))
313        ymax = float(max(ydata))       
314
315        #adjust for size of markers (sort of)
316        xmin = xmin - 0.1*abs(xmin)
317        xmax = xmax + 0.1*abs(xmax)
318        ymin = ymin - 0.1*abs(ymin)
319        ymax = ymax + 0.1*abs(ymax)
320               
321        self.axis.set_xlim(xmin,xmax)
322        self.axis.set_ylim(ymin,ymax)
323       
324        #self.axis.autoscale_view()
325        self.canvas.draw()
326
327        return
328
329app = appGui()
330gtk.main()
Note: See TracBrowser for help on using the repository browser.