class MultithreadedApp:
    def __init__(self):
        #Gui bootstrap: window and progressbar
        self.builder = gtk.Builder()
        self.builder.add_from_file("polarisation_analyser.glade")
        self.builder.connect_signals(self)
        self.window = self.builder.get_object("window")

        self.main_fig = Figure()
        self.main_axes = self.main_fig.add_axes((0.1, 0.1, 0.8, 0.84))
        t = np.linspace(0, 360, 361)
        self.line, = self.main_axes.plot(
            t, 0.5 * np.sin(3 * np.pi * t / 360) + 0.5)
        self.main_axes.set_ylim(0, 1)
        self.main_canvas = FigureCanvas(self.main_fig)
        self.builder.get_object("plot_container").add(self.main_canvas)

        self.sphere_fig = Figure()
        self.sphere_axes = Axes3D(self.sphere_fig)
        u = np.linspace(0, 2 * np.pi, 100)
        v = np.linspace(0, np.pi, 100)
        x = 1 * np.outer(np.cos(u), np.sin(v))
        y = 1 * np.outer(np.sin(u), np.sin(v))
        z = 1 * np.outer(np.ones(np.size(u)), np.cos(v))
        self.sphere_axes.plot_wireframe(x,
                                        y,
                                        z,
                                        rstride=4,
                                        cstride=4,
                                        color='lightgreen',
                                        linewidth=1)
        self.sphere_canvas = FigureCanvas(self.sphere_fig)
        self.sphere_axes.mouse_init()
        self.builder.get_object("sphere_container").add(self.sphere_canvas)

        self.s1 = self.s2 = self.s3 = self.dop = self.s0p = 0

        #Creating and starting the thread
        self.pu = PlotUpdater(self)
        self.pu.start()

        gtk.idle_add(self.update_plot)

        self.window.show_all()
        gtk.main()

    def update_plot(self):
        #self.sphere_axes.plot3D([0,self.s1],[0,self.s2],[0,self.s3])
        #self.main_axes.relim() #Update axis limits
        #self.main_axes.autoscale_view() #Updat
        self.main_canvas.draw()  #Redraw main image
        #self.sphere_canvas.draw()
        return True

    def on_window_destroy(self, widget):
        self.pu.stop()
        gtk.main_quit()
class MultithreadedApp:
    def __init__(self):
        #Gui bootstrap: window and progressbar
        self.builder = gtk.Builder()
        self.builder.add_from_file("polarisation_analyser.glade")
        self.builder.connect_signals(self)
        self.window = self.builder.get_object("window")

        self.main_fig = Figure()
        self.main_axes = self.main_fig.add_axes((0.1,0.1,0.8,0.84))
        t = np.linspace(0,360,361)
        self.line, = self.main_axes.plot(t,0.5*np.sin(3*np.pi*t/360)+0.5)
        self.main_axes.set_ylim(0,1 )
        self.main_canvas = FigureCanvas(self.main_fig)
        self.builder.get_object("plot_container").add(self.main_canvas)
        
        self.sphere_fig = Figure()
        self.sphere_axes = Axes3D(self.sphere_fig)
        u = np.linspace(0, 2 * np.pi, 100)
        v = np.linspace(0, np.pi, 100)
        x = 1 * np.outer(np.cos(u), np.sin(v))
        y = 1 * np.outer(np.sin(u), np.sin(v))
        z = 1 * np.outer(np.ones(np.size(u)), np.cos(v))
        self.sphere_axes.plot_wireframe(x, y, z,  rstride=4, cstride=4, color='lightgreen',linewidth=1)
        self.sphere_canvas = FigureCanvas(self.sphere_fig)
        self.sphere_axes.mouse_init()
        self.builder.get_object("sphere_container").add(self.sphere_canvas)
        
        self.s1 = self.s2 = self.s3 = self.dop = self.s0p = 0

        #Creating and starting the thread
        self.pu = PlotUpdater(self)
        self.pu.start()
        
        gtk.idle_add(self.update_plot)

        self.window.show_all()
        gtk.main()
        
    def update_plot(self):
        #self.sphere_axes.plot3D([0,self.s1],[0,self.s2],[0,self.s3])       
        #self.main_axes.relim() #Update axis limits
        #self.main_axes.autoscale_view() #Updat
        self.main_canvas.draw() #Redraw main image
        #self.sphere_canvas.draw()
        return True

        
    def on_window_destroy(self, widget):
        self.pu.stop()
        gtk.main_quit()
Example #3
0
class EditAtomTypeView(BaseView):
    builder = resource_filename(__name__, "glade/atoms.glade")
    top = "edit_atom_type"
    widget_format = "atom_%s"

    # ------------------------------------------------------------
    #      Initialisation and other internals
    # ------------------------------------------------------------
    def __init__(self, *args, **kwargs):
        BaseView.__init__(self, *args, **kwargs)

        self.graph_parent = self["view_graph"]
        self.setup_matplotlib_widget()

    def setup_matplotlib_widget(self):
        style = gtk.Style()
        self.figure = Figure(dpi=72,
                             edgecolor=str(style.bg[2]),
                             facecolor=str(style.bg[2]))

        self.plot = self.figure.add_subplot(111)
        self.figure.subplots_adjust(bottom=0.20)

        self.matlib_canvas = FigureCanvasGTK(self.figure)

        self.plot.autoscale_view()

        self.graph_parent.add(self.matlib_canvas)
        self.graph_parent.show_all()

    # ------------------------------------------------------------
    #      Methods & Functions
    # ------------------------------------------------------------
    def update_figure(self, x, y):
        self.plot.cla()
        self.plot.plot(x, y, 'k-', aa=True)
        self.plot.set_ylabel('Scattering factor', size=14, weight="heavy")
        self.plot.set_xlabel('2θ', size=14, weight="heavy")
        self.plot.autoscale_view()
        if self.matlib_canvas is not None:
            self.matlib_canvas.draw()
Example #4
0
class EditAtomTypeView(BaseView):
    builder = resource_filename(__name__, "glade/atoms.glade")
    top = "edit_atom_type"
    widget_format = "atom_%s"

    # ------------------------------------------------------------
    #      Initialisation and other internals
    # ------------------------------------------------------------
    def __init__(self, *args, **kwargs):
        BaseView.__init__(self, *args, **kwargs)

        self.graph_parent = self["view_graph"]
        self.setup_matplotlib_widget()

    def setup_matplotlib_widget(self):
        style = gtk.Style()
        self.figure = Figure(dpi=72, edgecolor=str(style.bg[2]), facecolor=str(style.bg[2]))

        self.plot = self.figure.add_subplot(111)
        self.figure.subplots_adjust(bottom=0.20)

        self.matlib_canvas = FigureCanvasGTK(self.figure)

        self.plot.autoscale_view()

        self.graph_parent.add(self.matlib_canvas)
        self.graph_parent.show_all()

    # ------------------------------------------------------------
    #      Methods & Functions
    # ------------------------------------------------------------
    def update_figure(self, x, y):
        self.plot.cla()
        self.plot.plot(x, y, 'k-', aa=True)
        self.plot.set_ylabel('Scattering factor', size=14, weight="heavy")
        self.plot.set_xlabel('2θ', size=14, weight="heavy")
        self.plot.autoscale_view()
        if self.matlib_canvas is not None:
            self.matlib_canvas.draw()
Example #5
0
class EditCSDSDistributionView(BaseView):
    builder = resource_filename(__name__, "glade/csds.glade")
    top = "tbl_csds_distr"

    def __init__(self, *args, **kwargs):
        BaseView.__init__(self, *args, **kwargs)

        self.graph_parent = self["distr_plot_box"]
        self.setup_matplotlib_widget()

    def setup_matplotlib_widget(self):
        style = gtk.Style()
        self.figure = Figure(dpi=72,
                             edgecolor=str(style.bg[2]),
                             facecolor=str(style.bg[2]))

        self.plot = self.figure.add_subplot(111)
        self.figure.subplots_adjust(bottom=0.20)

        self.matlib_canvas = FigureCanvasGTK(self.figure)

        self.plot.autoscale_view()

        self.graph_parent.add(self.matlib_canvas)
        self.graph_parent.show_all()

    def update_figure(self, distr):
        self.plot.cla()
        self.plot.hist(list(range(len(distr))),
                       len(distr),
                       weights=distr,
                       normed=1,
                       ec='b',
                       histtype='stepfilled')
        self.plot.set_ylabel('')
        self.plot.set_xlabel('CSDS', size=14, weight="heavy")
        self.plot.relim()
        self.plot.autoscale_view()
        if self.matlib_canvas is not None:
            self.matlib_canvas.draw()

    def reset_params(self):
        tbl = self["tbl_params"]
        for child in tbl.get_children():
            tbl.remove(child)
        tbl.resize(1, 2)

    def add_param_widget(self, name, label, minimum, maximum):
        tbl = self["tbl_params"]
        rows = tbl.get_property("n-rows") + 1
        tbl.resize(rows, 2)

        lbl = gtk.Label(label)
        lbl.set_alignment(1.0, 0.5)
        tbl.attach(lbl, 0, 1, rows - 1, rows, gtk.FILL, gtk.FILL)

        inp = ScaleEntry(minimum, maximum, enforce_range=True)
        tbl.attach(inp, 1, 2, rows - 1, rows, gtk.FILL, gtk.FILL)

        tbl.show_all()

        self[name] = inp
        inp.set_name(name)

        return inp
Example #6
0
class Plot(Figure):
    def __init__(self, x_name, y_name, *args, **kwargs):
        Figure.__init__(self, *args, **kwargs)
        self.plot_axes = self.add_subplot(111, xlabel=x_name,
                                          ylabel=y_name.upper())
        self.plot_line = None
        self.canvas = FigureCanvas(self)
        self.plot_xname = x_name
        self.plot_yname = y_name
        self.plot_xdata = []
        self.plot_ydata = []
        self.plot_line, = self.plot_axes.plot(self.plot_xdata, self.plot_ydata)
        self.plot_max_points = 200

    def get_plot_line(self):
        return self.plot_line

    def get_canvas(self):
        return self.canvas

    def get_plot_var(self):
        return self.plot_yname

    def get_max_points(self):
        return self.plot_max_points

    def set_max_points(self, max_points):
        self.plot_max_points = max_points

    def __update_canvas(self):
        self.plot_axes.relim()
        self.plot_axes.autoscale_view(tight=False)
        if self.canvas is not None:
            self.canvas.draw()
        return False

    def update_plot(self, simThread, acquireLock=True):
        self.plot_xdata.append(simThread.var(self.plot_xname))
        self.plot_ydata.append(simThread.var(self.plot_yname))

        if len(self.plot_xdata) > self.plot_max_points:
            offset = len(self.plot_xdata) - self.plot_max_points
            self.plot_xdata = self.plot_xdata[offset:]
        if len(self.plot_ydata) > self.plot_max_points:
            offset = len(self.plot_ydata) - self.plot_max_points
            self.plot_ydata = self.plot_ydata[offset:]

        self.redraw_plot(acquireLock)

    def clear_plot(self, acquireLock=True):
        self.plot_xdata = []
        self.plot_ydata = []
        self.redraw_plot(acquireLock)

    def redraw_plot(self, acquireLock=True):
        self.plot_line.set_xdata(self.plot_xdata)
        self.plot_line.set_ydata(self.plot_ydata)
        if self.canvas is not None:
            if acquireLock:
                gtk.gdk.threads_enter()
                gobject.idle_add(self.__update_canvas)
                gtk.gdk.threads_leave()
            else:
                gobject.idle_add(self.__update_canvas)
Example #7
0
class Backend( backend.Backend ):

    def init(self):
        
        self.layer_to_axes = {}
        self.axes_to_layer = {}
        self.layers_cache = [] # copy of self.plot.layers
        self.layer_cblists = {}

        self.line_caches = {}
        self.omaps = {}
        
        
    def connect(self):
        logger.debug("Opening matplotlib session.")        

        self.figure = Figure(dpi=100, facecolor="white")  # figsize=(5,4), dpi=100)        
        self.canvas = FigureCanvas(self.figure)
        self.canvas.show()

        self.line_caches = {}
        self.layer_to_axes.clear()
        self.axes_to_layer.clear()

        backend.Backend.connect(self)
        logger.debug("Init finished")


    def set(self, project,plot):
        backend.Backend.set(self, project, plot)
        if self.project is not None:
            # TODO: connect to notify::layers of Plot
            pass

    def disconnect(self):
        logger.debug("Closing matplotlib session.")

        if not self.canvas is None:
            self.canvas.destroy()
            self.canvas = None
        if not self.figure is None:
            self.figure = None
        
        backend.Backend.disconnect(self)

        

    #----------------------------------------------------------------------

    def arrange(self, rows=1, cols=1):

        layers = self.plot.layers
        n = len(layers)

        if n > (rows*cols):
            rows = int((rows*cols) / n) + 1
            cols = rows * n
            #raise ValueError("Not enough rows and cols for all layers!")

        self.figure.clear()
        self.figure.axes = []
        
        self.layer_to_axes.clear()
        self.axes_to_layer.clear()
        self.layers_cache = []

        for cblist in self.layer_cblists.itervalues():
            for cb in cblist:
                cb.disconnect()
        self.layer_cblists = {}
        
        j = 1
        for layer in layers:
            print "Setting up layer", layer
            axes = self.figure.add_subplot("%d%d%d" % (rows,cols,j))
            self.layer_to_axes[layer] = axes
            self.axes_to_layer[axes] = layer
            self.layers_cache.append(layer)

            print "Connecting to notify of ", layer
            self.layer_cblists[layer] = \
              [layer.sig_connect('notify', self.on_update_layer),
               layer.sig_connect('notify::labels', self.on_update_labels)
               ]

            j += 1


    def draw(self):
        self.check_connection()
        logger.debug("Matplotlib: draw()")                
             
        if self.plot.layers != self.layers_cache:
            self.arrange()

        self.omaps = {}
        for layer in self.plot.layers:            
            self.update_layer(layer)
        self.draw_canvas()
        
    def draw_canvas(self):
        self.canvas.draw()        


    #----------------------------------------------------------------------
    # Layer
    #
    
    def on_update_layer(self, sender, updateinfo={}):
        # updateinfo is ignored
        self.update_layer(sender)
        self.canvas.draw()
    
    def update_layer(self, layer, updateinfo={}):
        # updateinfo is ignored

        self.omaps[layer] = {}
        self.line_caches[layer] = {}

        axes = self.layer_to_axes[layer]        
        axes.lines = []
        line_cache = self.line_caches[layer] = []        

        #:layer.lines:OK
        for line in layer.lines:
            self.update_line(line, layer, axes=axes)

        #:layer.axes
        for (key, axis) in layer.axes.iteritems():
            #:axis.label
            #:axis.scale
            #:axis.start
            #:axis.end
            label = axis.label
            scale = axis.scale
            start = axis.start
            end = axis.end

            #logger.debug("start = %s; end = %s" % (start, end))
            
            if key == 'x':
                set_label = axes.set_xlabel
                set_scale = axes.set_xscale
                set_start = (lambda l: axes.set_xlim(xmin=l))
                set_end = (lambda l: axes.set_xlim(xmax=l))
            elif key == 'y':
                set_label = axes.set_ylabel
                set_scale = axes.set_yscale
                set_start = (lambda l: axes.set_ylim(ymin=l))
                set_end = (lambda l: axes.set_ylim(ymax=l))
            else:
                raise RuntimeError("Invalid axis key '%s'" % key)

            if label is not None: set_label(label)
            if scale is not None: set_scale(scale)
            if start is not None: set_start(start)
            if end is not None: set_end(end)
            
        #:layer.visible
        if layer.visible is False:
            return

        # TODO
        #:layer.title
        title = layer.title
        if title is not None:
            axes.set_title(title)

        #:layer.grid
        axes.grid(layer.grid)
                    
        #:layer.legend:OK
        self.update_legend(layer)

        #:layer.labels:OK
        axes.texts = []
        for label in layer.labels:
            self.update_textlabel(label, layer)

        
    #----------------------------------------------------------------------
    # Line
    #
    
    def update_line(self, line, layer, axes=None, updateinfo={}):
        # updateinfo is ignored
        
        axes = axes or self.layer_to_axes[layer]
        omap = self.omaps[layer]
        line_cache = self.line_caches[layer]

        data_to_plot = []

        #:line.visible
        if line.visible is False:
            if line in axes.lines:
                axes.lines.remove(line)
                line_cache.remove(line)
            omap[line] = None                    
            return

        ds = self.get_line_source(line)
        cx, cy = self.get_column_indices(line)
        try:
            xdata, ydata = self.get_dataset_data(ds, cx, cy)
        except backend.BackendError, msg:            
            logger.error(msg)
            omap[line] = None
            return
            

        #:line.row_first
        #:line.row_last
        start, end = line.row_first, line.row_last        
        try:
            xdata = self.limit_data(xdata, start, end)
            ydata = self.limit_data(ydata, start, end)
        except BackendError, msg:
            logger.error("Error when plotting line #%d: %s" % (line_index, msg))
            omap[line] = None
            return