Ignore:
Timestamp:
Oct 26, 2009 10:56:01 PM (13 years ago)
Author:
ajj
Message:

Adding support for errorbars

Location:
sans/utils/bt5/bt5plot2
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • sans/utils/bt5/bt5plot2/BT5DataSet.py

    r579 r580  
    11import usans 
     2import math 
     3 
    24 
    35class BT5DataSet: 
     
    132134        return result  
    133135     
    134     def plot_dataset(self,axes,plottype=None): 
     136    def plot_dataset(self,axes,plottype=None,yerrorbars=True): 
    135137        ''' 
    136138        Takes a matplotlib axes object and plots bt5 dataset on it. 
     
    145147            #generate totals 
    146148            xdata = [] 
    147             ydata = []      
     149            ydata = []  
     150            yerror = []     
    148151              
    149152            mvals = data.keys() 
     
    152155                xdata.append(mval) 
    153156                ydata.append(data[mval][1] + data[mval][2] + data[mval][4] + data[mval][5] + data[mval][6]) 
    154               
    155             self.plot = axes.plot(xdata,ydata, 'bo', picker=5) 
    156               
     157                yerror.append(math.sqrt(ydata[len(ydata)-1])) 
     158             
     159            axes.set_ylabel("Counts") 
     160            if yerrorbars == True: 
     161                self.plot = axes.errorbar(xdata,ydata,yerror,None,'bo', picker=5) 
     162            else: 
     163                self.plot = axes.plot(xdata,ydata,'bo',picker=5) 
     164                 
    157165        elif plottype == 'rate': 
    158166            # generate countrate 
    159167            xdata = [] 
    160168            ydata = [] 
     169            yerror = [] 
    161170             
    162171            mvals = data.keys() 
     
    170179                for mval in mvals: 
    171180                    ydata.append((data[mval][1] + data[mval][2] + data[mval][4] + data[mval][5] + data[mval][6]) / cnttime) 
     181                    yerror.append(math.sqrt(ydata[len(ydata)-1])/math.sqrt(cnttime)) 
     182                    axes.set_ylabel("Counts/second") 
    172183            else: 
    173184                #Must be counting in monitor base so normalize by monitor 
     
    175186                for mval in mvals: 
    176187                    ydata.append((data[mval][1] + data[mval][2] + data[mval][4] + data[mval][5] + data[mval][6]) / cnttime) 
    177              
    178             self.plot = axes.plot(xdata,ydata, 'bo', picker=5) 
    179   
     188                    yerror.append(math.sqrt(ydata[len(ydata)-1])/math.sqrt(cnttime)) 
     189                    axes.set_ylabel("Counts/Monitor Count") 
     190             
     191            if yerrorbars == True: 
     192                self.plot = axes.errorbar(xdata,ydata,yerror,None,'bo', picker=5) 
     193            else: 
     194                self.plot = axes.plot(xdata,ydata,'bo',picker=5)  
    180195                 
    181196        elif plottype == 'trans': 
    182197            xdata = [] 
    183198            ydata = [] 
     199            yerror = [] 
    184200              
    185201            mvals = data.keys() 
     
    188204                xdata.append(mval) 
    189205                ydata.append(data[mval][3]) 
    190  
    191             self.plot = axes.plot(xdata,ydata, 'bo', picker=5) 
    192  
     206                yerror.append(math.sqrt(ydata[len(ydata)-1])) 
     207 
     208            axes.set_ylabel("Transmission Detector Counts") 
     209            if yerrorbars == True: 
     210                self.plot = axes.errorbar(xdata,ydata,yerror,None,'bo', picker=5) 
     211            else: 
     212                self.plot = axes.plot(xdata,ydata,'bo',picker=5)  
    193213             
    194214          
     
    196216            xdata = [] 
    197217            ydata = [] 
     218            yerror = [] 
    198219             
    199220            mvals = data.keys() 
     
    202223                xdata.append(mval) 
    203224                ydata.append(data[mval][0]) 
    204  
    205             self.plot = axes.plot(xdata,ydata, 'bo', picker=5) 
    206              
     225                yerror.append(math.sqrt(ydata[len(ydata)-1])) 
     226                 
     227            axes.set_ylabel("Monitor Counts") 
     228            if yerrorbars == True: 
     229                self.plot = axes.errorbar(xdata,ydata,yerror,None,'bo', picker=5) 
     230            else: 
     231                self.plot = axes.plot(xdata,ydata,'bo',picker=5)              
    207232              
    208233        elif plottype == 'split': 
     
    213238            ydata4 = [] 
    214239            ydata5 = [] 
     240            yerror1 = [] 
     241            yerror2 = [] 
     242            yerror3 = [] 
     243            yerror4 = [] 
     244            yerror5 = [] 
    215245              
    216246            mvals = data.keys() 
     
    219249                xdata.append(mval) 
    220250                ydata1.append(data[mval][1])    
     251                yerror1.append(math.sqrt(ydata1[len(ydata1)-1])) 
    221252                ydata2.append(data[mval][2])    
    222                 ydata3.append(data[mval][4])    
    223                 ydata4.append(data[mval][5])    
     253                yerror2.append(math.sqrt(ydata2[len(ydata2)-1])) 
     254                ydata3.append(data[mval][4]) 
     255                yerror3.append(math.sqrt(ydata3[len(ydata3)-1])) 
     256                ydata4.append(data[mval][5])   
     257                yerror4.append(math.sqrt(ydata4[len(ydata4)-1])) 
    224258                ydata5.append(data[mval][6])   
    225                  
    226             self.plot = axes.plot(xdata,ydata1, 'o', 
    227                                   xdata,ydata2, 'o', 
    228                                   xdata,ydata3, 'o', 
    229                                   xdata,ydata4, 'o', 
    230                                   xdata,ydata5, 'o')     
     259                yerror5.append(math.sqrt(ydata5[len(ydata5)-1])) 
     260             
     261            axes.set_ylabel("Counts")     
     262            if yerrorbars == True: 
     263                self.plot = (axes.errorbar(xdata,ydata1,yerror1,None, 'o'), 
     264                             axes.errorbar(xdata,ydata2,yerror2,None, 'o'), 
     265                             axes.errorbar(xdata,ydata3,yerror3,None, 'o'), 
     266                             axes.errorbar(xdata,ydata4,yerror4,None, 'o'), 
     267                             axes.errorbar(xdata,ydata5,yerror5,None, 'o'))  
     268            else: 
     269                 self.plot = axes.plot(xdata,ydata1, 'o', 
     270                                      xdata,ydata2, 'o', 
     271                                      xdata,ydata3, 'o', 
     272                                      xdata,ydata4, 'o', 
     273                                      xdata,ydata5, 'o')    
     274             
    231275        elif plottype == 'nrate': 
    232276            # generate countrate 
     
    234278            xdata = [] 
    235279            ydata = [] 
    236              
    237             mvals = data.keys() 
    238             mvals.sort(usans.numeric_compare) 
    239             for mval in mvals: 
    240                 xdata.append(mval) 
    241               
    242             if metadata['base'] == 'TIME': 
    243                 #Counting in TIME base, so normalize by seconds and monitor 
    244                 cnttime = metadata['mon'] 
    245                 for mval in mvals: 
    246                     ydata.append((data[mval][1] + data[mval][2] + data[mval][4] + data[mval][5] + data[mval][6]) / cnttime / data[mval][0]) 
    247             else: 
    248                 #Must be counting in monitor base so normalize by monitor 
    249                 moncts = metadata['mon'] 
    250                 for mval in mvals: 
    251                     ydata.append((data[mval][1] + data[mval][2] + data[mval][4] + data[mval][5] + data[mval][6]) / moncts) 
    252              
    253             self.plot = axes.plot(xdata,ydata, 'bo', picker=5) 
     280            yerror = [] 
     281             
     282            mvals = data.keys() 
     283            mvals.sort(usans.numeric_compare) 
     284            for mval in mvals: 
     285                xdata.append(mval) 
     286              
     287            #Always normalize by appropriate monitor counts 
     288            for mval in mvals: 
     289                 ydata.append((data[mval][1] + data[mval][2] + data[mval][4] + data[mval][5] + data[mval][6]) / (data[mval][0]/1e6)) 
     290                 yerror.append(math.sqrt(ydata[len(ydata)-1])/math.sqrt(data[mval][0]/1e6)) 
     291 
     292            axes.set_ylabel("Counts / (10^6 Monitor Counts)") 
     293            if yerrorbars == True: 
     294                self.plot = axes.errorbar(xdata,ydata,yerror,None,'bo', picker=5) 
     295            else: 
     296                self.plot = axes.plot(xdata,ydata,'bo',picker=5)                
    254297  
    255298  
     
    257300             
    258301    def remove_plot(self): 
    259          
    260         for line in self.plot: 
    261             axes = line.get_axes() 
    262             axes.lines.remove(line) 
     302 
     303        #AJJ 10/26/09 
     304        #This is frankly hideous. Surely there is a better way for me  
     305        #to iterate through the contents of self.plot 
     306        #Is it a plot with errorbars? 
     307        if type(self.plot[0]) is tuple: 
     308            #print "Split plot with errorbars" 
     309            for splot in self.plot: 
     310                splot[0].remove() 
     311                for linec in splot[1]: 
     312                    linec.remove() 
     313                for linec in splot[2]: 
     314                    linec.remove() 
     315        elif type(self.plot[0]).__name__ == 'Line2D' and type(self.plot[1]).__name__ == 'Line2D': 
     316            #print "Split plot without errorbars" 
     317            for splot in self.plot: 
     318                splot.remove() 
     319        elif type(self.plot[0]).__name__ == 'Line2D': 
     320            #print "Plot with errorbars" 
     321            for line in self.plot[0:1]: 
     322                axes = line.get_axes() 
     323                axes.lines.remove(line) 
     324            for linec in self.plot[1]: 
     325                linec.remove() 
     326            for linec in self.plot[2]: 
     327                linec.remove() 
     328        else: 
     329            for line in self.plot: 
     330                axes = line.get_axes() 
     331                axes.lines.remove(line) 
  • sans/utils/bt5/bt5plot2/bt5plot2

    r514 r580  
    4343                     "on_xaxis_loglin_activate" : self.handle_xaxis_loglin, 
    4444                     "on_yaxis_loglin_activate" : self.handle_yaxis_loglin, 
     45                     "on_yaxis_errorbars_activate" : self.handle_yaxis_errorbars, 
    4546                     "on_plot_type_activate" : self.handle_plot_type_change, 
    4647                     "on_btn_ClearPlot_clicked" : self.handle_clearplot, 
     
    5253        #Set default plottype to rate. Glade definition sets that as default active button in menu 
    5354        self.plottype = 'rate' 
     55        self.yerrorbars = True 
    5456         
    5557        self.wTree.signal_autoconnect(event_dic) 
     
    6668        self.filter_string.append(self.filter_entry.get_text()) 
    6769        self.filelistfilter = self.filelist.filter_new() 
    68         self.filelistfilter.set_visible_func(self.filter_filelist,self.filter_string) 
     70        self.filelistfilter.set_visible_func(self.filter_filelist, self.filter_string) 
    6971 
    7072        self.filelistview.set_model(self.filelistfilter) 
     
    9294         
    9395        self.canvas = FigureCanvasGTK(self.figure) 
    94         self.figure.canvas.mpl_connect('pick_event',self.handle_plot_click) 
     96        self.figure.canvas.mpl_connect('pick_event', self.handle_plot_click) 
    9597        self.canvas.show() 
    9698         
     
    99101         
    100102        self.metadataView = self.wTree.get_widget("tv_metadata") 
    101         self.mdlist = gtk.ListStore(str,str) 
     103        self.mdlist = gtk.ListStore(str, str) 
    102104         
    103105         
     
    123125        return 
    124126             
    125     def RefreshFileList(self,filenames):         
     127    def RefreshFileList(self, filenames):         
    126128        #print len(filenames) 
    127129         
     
    133135         
    134136        treestore = self.filelistview.get_model() 
    135         treestore.foreach(self.filelist_match_filename, (filenames,deletelist)) 
     137        treestore.foreach(self.filelist_match_filename, (filenames, deletelist)) 
    136138           
    137139        for filename in filenames: 
     
    149151    def filelist_match_filename(self, model, path, iter, data): 
    150152         
    151         mval = model.get_value(iter,0) 
     153        mval = model.get_value(iter, 0) 
    152154         
    153155        if mval in data[0]: 
     
    158160        return False 
    159161     
    160     def handle_refreshlist(self,widget): 
     162    def handle_refreshlist(self, widget): 
    161163 
    162164        self.RefreshFileList(usans.GetBT5DirList()) 
     
    166168    def filter_filelist(self, model, iter, data): 
    167169         
    168         if model.get_value(iter,0):         
    169             match = re.match(data[0],model.get_value(iter,0)) 
     170        if model.get_value(iter, 0):         
     171            match = re.match(data[0], model.get_value(iter, 0)) 
    170172        else: 
    171173            match = None 
     
    176178            return True 
    177179         
    178     def handle_filter(self,widget): 
     180    def handle_filter(self, widget): 
    179181         
    180182        del self.filter_string[:] 
     
    211213            model[path][2] = BT5DataSet(model[path][0]) 
    212214            #add plot 
    213             model[path][2].plot_dataset(self.axis,self.plottype) 
     215            model[path][2].plot_dataset(self.axis, self.plottype, self.yerrorbars) 
    214216            self.rescale_and_redraw() 
    215217        else: 
     
    243245        self.rescale_and_redraw() 
    244246        return 
    245         
    246     def handle_plot_type_change(self,widget): 
    247                  
    248         if widget.get_active(): 
    249                 self.plottype = widget.get_name().split('_')[1] 
    250  
    251         model = self.filelistview.get_model().get_model() 
     247  
     248    def handle_yaxis_errorbars(self, widget): 
     249         
     250        if (self.yerrorbars == True): 
     251            self.yerrorbars = False 
     252        else: 
     253            self.yerrorbars = True 
     254 
     255        model = self.filelistview.get_model().get_model() 
    252256        iter = model.iter_children(None) 
    253257        while iter: 
     
    255259            if model[path][1] != 0: 
    256260                model[path][2].remove_plot() 
    257                 model[path][2].plot_dataset(self.axis,self.plottype) 
     261                model[path][2].plot_dataset(self.axis, self.plottype, self.yerrorbars) 
    258262            iter = model.iter_next(iter) 
    259263 
    260         self.rescale_and_redraw() 
     264        self.rescale_and_redraw() 
     265        return 
     266        
     267    def handle_plot_type_change(self, widget): 
     268                 
     269        if widget.get_active(): 
     270                self.plottype = widget.get_name().split('_')[1] 
     271 
     272        model = self.filelistview.get_model().get_model() 
     273        iter = model.iter_children(None) 
     274        while iter: 
     275            path = model.get_path(iter) 
     276            if model[path][1] != 0: 
     277                model[path][2].remove_plot() 
     278                model[path][2].plot_dataset(self.axis, self.plottype, self.yerrorbars) 
     279            iter = model.iter_next(iter) 
     280 
     281        self.rescale_and_redraw() 
    261282                 
    262283        return 
    263284         
    264     def handle_clearplot(self,widget): 
     285    def handle_clearplot(self, widget): 
    265286         
    266287        self.clearplot() 
     
    276297            if model[path][1] != 0: 
    277298                model[path][2].remove_plot() 
    278                 model[path][1] = not model[path][1] 
     299                model[path][1] = not model[path][1] 
    279300            iter = model.iter_next(iter) 
    280301         
     
    306327     
    307328            #adjust for size of markers (sort of) 
    308             xmin = xmin - 0.1*abs(xmin) 
    309             xmax = xmax + 0.1*abs(xmax) 
    310             ymin = ymin - 0.1*abs(ymin) 
    311             ymax = ymax + 0.1*abs(ymax) 
     329            xmin = xmin - 0.1 * abs(xmin) 
     330            xmax = xmax + 0.1 * abs(xmax) 
     331            ymin = ymin - 0.1 * abs(ymin) 
     332            ymax = ymax + 0.1 * abs(ymax) 
    312333                     
    313             self.axis.set_xlim(xmin,xmax) 
    314             self.axis.set_ylim(ymin,ymax) 
     334            self.axis.set_xlim(xmin, xmax) 
     335            self.axis.set_ylim(ymin, ymax) 
    315336         
    316337        #self.axis.autoscale_view() 
     
    319340        return 
    320341 
    321     def handle_plot_click(self,event): 
     342    def handle_plot_click(self, event): 
    322343        model = self.filelistview.get_model().get_model() 
    323344        iter = model.iter_children(None) 
     
    325346 
    326347        if isinstance(event.artist, matplotlib.lines.Line2D): 
    327             print "Clicked..." 
     348            #print "Clicked..." 
    328349            pickedline = event.artist 
    329350            ind = event.ind 
  • sans/utils/bt5/bt5plot2/bt5plot2.glade

    r579 r580  
    164164                            <widget class="GtkRadioMenuItem" id="rmi_nrate"> 
    165165                              <property name="visible">True</property> 
    166                               <property name="label" translatable="yes">Monitor Normalized Rate</property> 
     166                              <property name="label" translatable="yes">Counts/10^6 Monitor Counts</property> 
    167167                              <property name="use_underline">True</property> 
    168168                              <property name="active">False</property> 
     
    249249                            </widget> 
    250250                          </child> 
     251              <child> 
     252                <widget class="GtkMenuItem" id="yerrbars1"> 
     253                  <property name="visible">True</property> 
     254                  <property name="label" translatable="yes">_Error Bars</property> 
     255                  <property name="use_underline">True</property> 
     256                  <signal name="activate" handler="on_yaxis_errorbars_activate"/> 
     257                </widget> 
     258              </child> 
     259 
    251260                        </widget> 
    252261                      </child> 
Note: See TracChangeset for help on using the changeset viewer.