Plotting with Bokeh

Because the framework runs in a thread, it might be difficult to plot directly with Matplotlib.

A solution is to use Bokeh, which is thread-safe.

An implementation of this solution is offered by the framework using the bokeh_plotting module. In this implementation, we will run a bokeh server, started up by the initialization script, and then connect to it.

To plot with bokeh, start by adding a special event to your pipeline event table:

from ..primitives.start_bokeh import start_bokeh

class mypipeline(BasePipeline):
   Generic pipeline


   event_table = {
       "start_bokeh": ("start_bokeh", None, None)

The special event is described in a primitive that we will call

from keckdrpframework.primitives.base_primitive import BasePrimitive

from bokeh.client import push_session
from import curdoc
from bokeh.plotting.figure import figure
from bokeh.layouts import column

class start_bokeh(BasePrimitive):

    def __init__(self, action, context):
        BasePrimitive.__init__(self, action, context)

    def _perform(self):"Enabling BOKEH plots")

        self.context.bokeh_session = push_session(curdoc())
        p = figure()
        c = column(children=[p])

This special event can be then triggered immediately by your startup script and added to the high priority queue:

subprocess.Popen('bokeh serve', shell=True)
framework.append_event('start_bokeh', None)


The actual plotting is performed by the primitives as needed.

As an example: