コード例 #1
0
ファイル: command.py プロジェクト: Tasignotas/topographica
    def __call__(self, **params):
        p = ParamOverrides(self, params)

        measured_sheets = [s for s in topo.sim.objects(CFSheet).values()
                           if hasattr(s,'measure_maps') and s.measure_maps]

        results = Layout()

        # Could easily be extended to measure CoG of all projections
        # and e.g. register them using different names (e.g. "Afferent
        # XCoG"), but then it's not clear how the PlotGroup would be
        # able to find them automatically (as it currently supports
        # only a fixed-named plot).
        requested_proj=p.proj_name
        for sheet in measured_sheets:
            for proj in sheet.in_connections:
                if (proj.name == requested_proj) or \
                   (requested_proj == '' and (proj.src != sheet)):
                    cog_data = self._update_proj_cog(p, proj)
                    for key, data in cog_data.items():
                        name = proj.name[0].upper() + proj.name[1:]
                        results.set_path((key, name), data)


        if p.measurement_storage_hook:
            p.measurement_storage_hook(results)

        return results
コード例 #2
0
    def __call__(self, **params):
        p = ParamOverrides(self, params)

        measured_sheets = [
            s for s in topo.sim.objects(CFSheet).values()
            if hasattr(s, 'measure_maps') and s.measure_maps
        ]

        results = AttrTree()

        # Could easily be extended to measure CoG of all projections
        # and e.g. register them using different names (e.g. "Afferent
        # XCoG"), but then it's not clear how the PlotGroup would be
        # able to find them automatically (as it currently supports
        # only a fixed-named plot).
        requested_proj = p.proj_name
        for sheet in measured_sheets:
            for proj in sheet.in_connections:
                if (proj.name == requested_proj) or \
                   (requested_proj == '' and (proj.src != sheet)):
                    cog_data = self._update_proj_cog(p, proj)
                    for key, data in cog_data.items():
                        name = proj.name[0].upper() + proj.name[1:]
                        results.set_path((key, name), data)

        if p.measurement_storage_hook:
            p.measurement_storage_hook(results)

        return results
コード例 #3
0
ファイル: command.py プロジェクト: ceball/featuremapper
 def __call__(self, **params):
     p = ParamOverrides(self, params, allow_extra_keywords=True)
     self._set_presenter_overrides(p)
     results = {}
     for coord in p.coords:
         p.x = p.preference_lookup_fn('x', p.outputs[0], coord,
                                      default=coord[0])
         p.y = p.preference_lookup_fn('y', p.outputs[0], coord,
                                      default=coord[1])
         results[coord] = self._compute_curves(p)
     self._restore_presenter_defaults()
     return results
コード例 #4
0
    def __call__(self, dset, **params):

        self.p = ParamOverrides(self, params)

        if self.p.vdim is None:
            vdim = dset.vdims[0].name
        else:
            vdim = self.p.vdim

        pts = hv.util.Dynamic(dset, operation=skypoints,
                              streams=[self.p.filter_stream])

        if self.p.aggregator == 'mean':
            aggregator = ds.mean(vdim)
        elif self.p.aggregator == 'std':
            aggregator = ds.std(vdim)
        elif self.p.aggregator == 'count':
            aggregator = ds.count()


        decimate_opts = dict(plot={'tools': ['hover',
                                             'box_select']},
                             style={'alpha': 0,
                                    'size': self.p.decimate_size,
                                    'nonselection_alpha': 0})

        decimated = decimate(pts).opts(**decimate_opts)
        raster_ = rasterize(pts, aggregator=aggregator)
        color_gadget = raster_.opts(cmap=Viridis[256], colorbar=True, alpha=0)
        sky_shaded = shade(raster_, cmap=viridis)

        plot = dynspread(sky_shaded) * decimated * color_gadget

        return plot.options(bgcolor="black", responsive=True, min_height=100)
コード例 #5
0
    def __call__(self, **params):
        p = ParamOverrides(self, params)

        measured_sheets = [
            s for s in topo.sim.objects(CFSheet).values()
            if hasattr(s, 'measure_maps') and s.measure_maps
        ]

        results = {}

        # Could easily be extended to measure CoG of all projections
        # and e.g. register them using different names (e.g. "Afferent
        # XCoG"), but then it's not clear how the PlotGroup would be
        # able to find them automatically (as it currently supports
        # only a fixed-named plot).
        requested_proj = p.proj_name
        for sheet in measured_sheets:
            if sheet not in results:
                results[sheet.name] = {}
            for proj in sheet.in_connections:
                if (proj.name == requested_proj) or \
                   (requested_proj == '' and (proj.src != sheet)):
                    results[sheet.name][proj.name] = self._update_proj_cog(
                        p, proj)

        return results
コード例 #6
0
 def __call__(self,**params):
     p=ParamOverrides(self,params)
     for output in p.outputs:
         s = getattr(topo.sim,output,None)
         if s is not None:
             for x,y in p.coords:
                 s.update_unit_view(x,y,'' if p.projection is None else p.projection.name)
コード例 #7
0
    def __call__(self,**params):
        p = ParamOverrides(self,params)

        command_labels,available_targets = _stuff(p.targets)
        for cmd in command_labels:
            c = available_targets[cmd]
            print c
            system(c)
コード例 #8
0
    def __call__(self, **params):
        p = ParamOverrides(self, params, allow_extra_keywords=True)
        self._set_presenter_overrides(p)
        if not p.num_orientation % 2:
            raise Exception("Use odd number of surround orientation to ensure"
                            "the orthogonal to the preferred orientation is"
                            "covered.")

        results = {}
        for coord in p.coords:
            self.or_surrounds = []
            orientation = p.preference_lookup_fn('orientation', p.outputs[0],
                                                 coord,
                                                 default=p.orientation_center)
            p.orientationcenter = orientation

            orientation_step = np.pi / (p.num_orientation - 1)
            for i in xrange(0, p.num_orientation - 1):
                self.or_surrounds.append(
                    orientation - np.pi / 2 + i * orientation_step)

            p.x = p.preference_lookup_fn('x', p.outputs[0], coord,
                                         default=coord[0])
            p.y = p.preference_lookup_fn('y', p.outputs[0], coord,
                                         default=coord[1])

            results[coord] = self._compute_curves(p)
        results = self._populate_grid(results)

        self._restore_presenter_defaults()
        return results
コード例 #9
0
 def __call__(self, pattern, pattern_label, pattern_number, master_seed,
              **params):
     p = ParamOverrides(self, params, allow_extra_keywords=True)
     new_pattern = copy.copy(pattern)
     new_pattern.orientation = pattern.get_value_generator('orientation')+\
                               numbergen.VonMisesRandom(
                                   mu = self.mu,
                                   kappa = self.kappa,
                                   seed=master_seed+21+pattern_number,
                                   name=("OrientationCoordinator" + str(pattern_number)))
     return new_pattern
コード例 #10
0
 def __call__(self, **params):
     p = ParamOverrides(self, params)
     for sheet_name in p.outputs:
         s = getattr(topo.sim, sheet_name, None)
         if s is not None:
             for conn in s.in_connections:
                 if not isinstance(conn, Projection):
                     topo.sim.debug("Skipping non-Projection " + conn.name)
                 else:
                     v = conn.projection_view(topo.sim.time())
                     key = v.metadata.proj_name + 'ProjectionActivity'
                     topo.sim[v.metadata.src_name].views.Maps[key] = v
コード例 #11
0
ファイル: command.py プロジェクト: ceball/featuremapper
    def __call__(self, **params):
        p = ParamOverrides(self, params, allow_extra_keywords=True)
        self._apply_cmd_overrides(p)
        for fn in p.metadata_fns:
            self.metadata = AttrDict(p.metadata, **fn(p.inputs, p.outputs))

        output_names = self.metadata['outputs'].keys()
        input_names = self.metadata.inputs.keys()
        inputs = dict.fromkeys(input_names)
        for k in inputs.keys():
            inputs[k] = copy.deepcopy(p.pattern_generator)

        responses = p.pattern_response_fn(inputs, output_names,
                                          durations=p.durations)

        results = self._collate_results(responses)

        if p.measurement_storage_hook:
            p.measurement_storage_hook(results)

        return results
コード例 #12
0
    def __call__(self, **params):
        p = ParamOverrides(self, params, allow_extra_keywords=True)
        self._apply_cmd_overrides(p)
        self.metadata = AttrDict(p.metadata)
        for fn in p.metadata_fns:
            self.metadata.update(fn(p.inputs, p.outputs))

        output_names = self.metadata.outputs.keys()
        input_names = self.metadata.inputs.keys()
        inputs = dict.fromkeys(input_names)
        if p.input_patterns:
            for k, ip in p.input_patterns.items():
                inputs[k] = ip
            for name in [k for k, ip in inputs.items() if ip is None]:
                self.warning("No pattern specified for input %s, defaulting"
                             "to blank Constant pattern." % name)
                inputs[name] = imagen.Constant(scale=0)
        else:
            for k in inputs.keys():
                inputs[k] = copy.deepcopy(p.pattern_generator)


        for f in p.pre_presentation_hooks: f()

        responses = p.pattern_response_fn(inputs, output_names,
                                          durations=p.durations)

        for f in p.post_presentation_hooks: f()

        label = inputs.values()[0].__class__.__name__
        results = self._collate_results(responses, label)

        if p.measurement_storage_hook:
            p.measurement_storage_hook(results)

        return results
コード例 #13
0
ファイル: command.py プロジェクト: ioam/featuremapper
    def __call__(self, **params):
        p = ParamOverrides(self, params, allow_extra_keywords=True)
        self._set_presenter_overrides(p)

        results = {}
        for coord in p.coords:
            orientation = p.preference_lookup_fn('orientation', p.outputs[0],
                                                 coord, default=p.orientation_center)
            p.orientationcenter = orientation
            p.phase = p.preference_lookup_fn('phase', p.outputs[0],
                                             coord, default=p.orientation_center)
            p.x = p.preference_lookup_fn('x', p.outputs[0], coord,
                                         default=coord[0])
            p.y = p.preference_lookup_fn('y', p.outputs[0], coord,
                                         default=coord[1])

            self.or_surrounds = list(np.linspace(-np.pi/2, np.pi/2, p.num_orientation))
            results[coord] = self._compute_curves(p)
        results = self._populate_grid(results)

        self._restore_presenter_defaults()
        return results
コード例 #14
0
ファイル: command.py プロジェクト: ceball/featuremapper
 def __call__(self, **params):
     p = ParamOverrides(self, params, allow_extra_keywords=True)
     self._set_presenter_overrides(p)
     results = {}
     for coord in p.coords:
         # Orientations are stored as a normalized value beween 0
         # and 1, so we scale them by pi to get the true orientations.
         p.orientation = p.preference_lookup_fn('orientation', p.outputs[0],
                                                coord)
         p.x = p.preference_lookup_fn('x', p.outputs[0], coord,
                                      default=coord[0])
         p.y = p.preference_lookup_fn('y', p.outputs[0], coord,
                                      default=coord[1])
         results[coord] = self._compute_curves(p)
     self._restore_presenter_defaults()
     return results
コード例 #15
0
    def __call__(self, dset, **params):
        self.p = ParamOverrides(self, params)

        if self.p.vdim is None:
            vdim = dset.vdims[0].name
        else:
            vdim = self.p.vdim

        pts = hv.util.Dynamic(dset,
                              operation=skypoints,
                              streams=[self.p.filter_stream])

        if self.p.aggregator == 'mean':
            aggregator = ds.mean(vdim)
        elif self.p.aggregator == 'std':
            aggregator = ds.std(vdim)
        elif self.p.aggregator == 'count':
            aggregator = ds.count()

        kwargs = dict(cmap=cc.palette[self.p.cmap], aggregator=aggregator)
        if self.p.width is not None:
            kwargs.update(width=self.p.width, height=self.p.height)


#                          streams=[hv.streams.RangeXY])

        decimate_opts = dict(plot={'tools': ['hover', 'box_select']},
                             style={
                                 'alpha': 0,
                                 'size': self.p.decimate_size,
                                 'nonselection_alpha': 0
                             })

        decimated = decimate(pts).opts(**decimate_opts)
        sky_shaded = datashade(pts, **kwargs)

        return dynspread(sky_shaded) * decimated
コード例 #16
0
ファイル: command.py プロジェクト: ceball/featuremapper
    def __call__(self, **params):
        p = ParamOverrides(self, params, allow_extra_keywords=True)
        self._set_presenter_overrides(p)
        results = {}
        for coord in p.coords:
            orientation = p.preference_lookup_fn('orientation', p.outputs[0],
                                                 coord)
            self.curve_parameters = [{"orientation": orientation + ro}
                                     for ro in p.relative_orientations]

            p.x = p.preference_lookup_fn('x', p.outputs[0], coord,
                                         default=coord[0])
            p.y = p.preference_lookup_fn('y', p.outputs[0], coord,
                                         default=coord[1])

            results[coord] = self._compute_curves(p, val_format="%.4f")
        self._restore_presenter_defaults()
        return results
コード例 #17
0
ファイル: command.py プロジェクト: ceball/featuremapper
    def __call__(self, **params):
        p = ParamOverrides(self, params, allow_extra_keywords=True)
        self._set_presenter_overrides(p)
        results = {}
        for coord in p.coords:
            self.or_surrounds = []
            orientation = p.preference_lookup_fn('orientation', p.outputs[0],
                                                 coord,
                                                 default=p.orientation_center)
            p.orientationcenter = orientation

            orientation_step = np.pi / (p.num_orientation - 1)
            for i in xrange(0, p.num_orientation - 1):
                self.or_surrounds.append(
                    orientation - np.pi / 2 + i * orientation_step)

            p.x = p.preference_lookup_fn('x', p.outputs[0], coord,
                                         default=coord[0])
            p.y = p.preference_lookup_fn('y', p.outputs[0], coord,
                                         default=coord[1])

            results[coord] = self._compute_curves(p)
        self._restore_presenter_defaults()
        return results
コード例 #18
0
 def __call__(self, **params):
     p = ParamOverrides(self, params)
     return p.projection.grid(p.rows, p.cols)
コード例 #19
0
    def __call__(self, dset, **params):
        self.p = ParamOverrides(self, params)
        if self.p.xdim not in dset.dimensions():
            raise ValueError('{} not in Dataset.'.format(self.p.xdim))
        if self.p.ydim not in dset.dimensions():
            raise ValueError('{} not in Dataset.'.format(self.p.ydim))
        if ('ra' not in dset.dimensions()) or ('dec' not in dset.dimensions()):
            raise ValueError('ra and/or dec not in Dataset.')

        # Set up scatter plot
        scatter_filterpoints = filterpoints.instance(xdim=self.p.xdim, ydim=self.p.ydim)
        scatter_pts = hv.util.Dynamic(dset, operation=scatter_filterpoints,
                                      streams=[self.p.filter_stream])
        scatter_opts = dict(plot={'height': self.p.height, 'responsive':True},
                            norm=dict(axiswise=True))
        scatter_shaded = datashade(scatter_pts,
                                    # cmap=cc.palette[self.p.scatter_cmap])
                                    cmap=viridis)
        scatter = dynspread(scatter_shaded).opts(**scatter_opts)

        # Set up sky plot
        sky_filterpoints = filterpoints.instance(xdim='ra', ydim='dec', set_title=False)
        sky_pts = hv.util.Dynamic(dset, operation=sky_filterpoints,
                                  streams=[self.p.filter_stream])
        sky_opts = dict(plot={'height': self.p.height, 'responsive': True},  # cmap width?
                        norm=dict(axiswise=True))
        sky_shaded = rasterize(sky_pts,
                               aggregator=ds.mean(self.p.ydim)).options(colorbar=True,
                                                           responsive=True,
                                                           # cmap=cc.palette[self.p.sky_cmap])
                                                           cmap=Viridis[256])
        sky = sky_shaded.opts(**sky_opts)
        # sky = dynspread(sky_shaded).opts(**sky_opts)

        # Set up summary table
        table = hv.util.Dynamic(dset, operation=summary_table.instance(ydim=self.p.ydim),
                                streams=[self.p.filter_stream])
        table = table.opts(plot={'width': 200})

        # Set up BoundsXY streams to listen to box_select events and notify FilterStream
        scatter_select = BoundsXY(source=scatter)
        scatter_notifier = partial(notify_stream, filter_stream=self.p.filter_stream,
                                   xdim=self.p.xdim, ydim=self.p.ydim)
        scatter_select.add_subscriber(scatter_notifier)

        sky_select = BoundsXY(source=sky)
        sky_notifier = partial(notify_stream, filter_stream=self.p.filter_stream,
                               xdim='ra', ydim='dec')
        sky_select.add_subscriber(sky_notifier)

        # Reset
        reset = Reset(source=scatter)
        reset.add_subscriber(partial(reset_stream, self.p.filter_stream))

        raw_scatter = datashade(scatter_filterpoints(dset), cmap=Greys9[::-1][:5])

        scatter_p = (raw_scatter*scatter).options(bgcolor="black")

        if self.p.show_rawsky:
            raw_sky = datashade(sky_filterpoints(dset), cmap=Greys9[::-1][:5])
            sky_p = raw_sky*sky
        else:
            sky_p = sky
        sky_p = sky_p.options(bgcolor="black")

        if self.p.show_table:
            return (table + scatter_p + sky_p)
        else:
            return (scatter_p + sky_p).options(sizing_mode='stretch_width')
コード例 #20
0
    def __call__(self, dset, **params):
        self.p = ParamOverrides(self, params)

        if self.p.vdim is None:
            vdim = dset.vdims[0].name
        else:
            vdim = self.p.vdim

        ra_range = (ra0, ra1) = dset.range("ra")
        if self.p.ra_sampling:
            xsampling = (ra1 - ra0) / self.p.ra_sampling
        else:
            xsampling = None

        dec_range = (dec0, dec1) = dset.range("dec")
        if self.p.dec_sampling:
            ysampling = (dec1 - dec0) / self.p.dec_sampling
        else:
            ysampling = None

        if self.p.aggregator == "mean":
            aggregator = ds.mean(vdim)
        elif self.p.aggregator == "std":
            aggregator = ds.std(vdim)
        elif self.p.aggregator == "count":
            aggregator = ds.count()

        sky_range = RangeXY()
        if self.p.range_stream:

            def redim(dset, x_range, y_range):
                ranges = {}
                if x_range and all(isfinite(v) for v in x_range):
                    ranges["ra"] = x_range
                if y_range and all(isfinite(v) for v in x_range):
                    ranges["dec"] = y_range
                return dset.redim.range(**ranges) if ranges else dset

            dset = dset.apply(redim, streams=[self.p.range_stream])
            link_streams(self.p.range_stream, sky_range)
        streams = [sky_range, PlotSize()]

        pts = dset.apply(skypoints, streams=[self.p.filter_stream])

        reset = PlotReset(source=pts)
        reset.add_subscriber(partial(reset_stream, None,
                                     [self.p.range_stream]))

        rasterize_inst = rasterize.instance(aggregator=aggregator,
                                            streams=streams,
                                            x_sampling=xsampling,
                                            y_sampling=ysampling)
        raster_pts = apply_when(
            pts,
            operation=rasterize_inst,
            predicate=lambda pts: len(pts) > self.p.max_points)
        return raster_pts.opts(
            opts.Image(
                bgcolor="black",
                colorbar=True,
                cmap=self.p.cmap,
                min_height=100,
                responsive=True,
                tools=["hover"],
                symmetric=True,
            ),
            opts.Points(
                color=vdim,
                cmap=self.p.cmap,
                framewise=True,
                size=self.p.decimate_size,
                tools=["hover"],
                symmetric=True,
            ),
            opts.Overlay(hooks=[
                partial(reset_hook, x_range=ra_range, y_range=dec_range)
            ]),
        )
コード例 #21
0
    def __call__(self, dset, **params):
        self.p = ParamOverrides(self, params)
        if self.p.xdim not in dset.dimensions():
            raise ValueError("{} not in Dataset.".format(self.p.xdim))
        if self.p.ydim not in dset.dimensions():
            raise ValueError("{} not in Dataset.".format(self.p.ydim))
        if ("ra" not in dset.dimensions()) or ("dec" not in dset.dimensions()):
            raise ValueError("ra and/or dec not in Dataset.")

        # Compute sampling
        ra_range = (ra0, ra1) = dset.range("ra")
        if self.p.ra_sampling:
            ra_sampling = (ra1 - ra0) / self.p.x_sampling
        else:
            ra_sampling = None

        dec_range = (dec0, dec1) = dset.range("dec")
        if self.p.dec_sampling:
            dec_sampling = (dec1 - dec0) / self.p.y_sampling
        else:
            dec_sampling = None

        x_range = (x0, x1) = dset.range(self.p.xdim)
        if self.p.x_sampling:
            x_sampling = (x1 - x0) / self.p.x_sampling
        else:
            x_sampling = None

        y_range = (y0, y1) = dset.range(self.p.ydim)
        if self.p.y_sampling:
            y_sampling = (y1 - y0) / self.p.y_sampling
        else:
            y_sampling = None

        # Set up scatter plot
        scatter_range = RangeXY()
        if self.p.scatter_range_stream:

            def redim_scatter(dset, x_range, y_range):
                ranges = {}
                if x_range and all(isfinite(v) for v in x_range):
                    ranges[self.p.xdim] = x_range
                if y_range and all(isfinite(v) for v in x_range):
                    ranges[self.p.ydim] = y_range
                return dset.redim.range(**ranges) if ranges else dset

            dset_scatter = dset.apply(redim_scatter,
                                      streams=[self.p.scatter_range_stream])
            link_streams(self.p.scatter_range_stream, scatter_range)
        else:
            dset_scatter = dset
        scatter_pts = dset_scatter.apply(filterpoints,
                                         streams=[self.p.filter_stream],
                                         xdim=self.p.xdim,
                                         ydim=self.p.ydim)
        scatter_streams = [scatter_range, PlotSize()]
        scatter_rasterize = rasterize.instance(streams=scatter_streams,
                                               x_sampling=x_sampling,
                                               y_sampling=y_sampling)
        cmap = (process_cmap(self.p.scatter_cmap)[:250]
                if self.p.scatter_cmap == "fire" else self.p.scatter_cmap)
        scatter_rasterized = apply_when(
            scatter_pts,
            operation=scatter_rasterize,
            predicate=lambda pts: len(pts) > self.p.max_points
        ).opts(
            opts.Image(clim=(1, np.nan),
                       clipping_colors={"min": "transparent"},
                       cmap=cmap),
            opts.Points(clim=(1, np.nan),
                        clipping_colors={"min": "transparent"},
                        cmap=cmap),
            opts.Overlay(
                hooks=[partial(reset_hook, x_range=x_range, y_range=y_range)]),
        )

        # Set up sky plot
        sky_range = RangeXY()
        if self.p.sky_range_stream:

            def redim_sky(dset, x_range, y_range):
                ranges = {}
                if x_range and all(isfinite(v) for v in x_range):
                    ranges["ra"] = x_range
                if y_range and all(isfinite(v) for v in x_range):
                    ranges["dec"] = y_range
                return dset.redim.range(**ranges) if ranges else dset

            dset_sky = dset.apply(redim_sky, streams=[self.p.sky_range_stream])
            link_streams(self.p.sky_range_stream, sky_range)
        else:
            dset_sky = dset
        sky_pts = dset_sky.apply(filterpoints,
                                 xdim="ra",
                                 ydim="dec",
                                 set_title=False,
                                 streams=[self.p.filter_stream])
        skyplot_streams = [sky_range, PlotSize()]
        sky_rasterize = rasterize.instance(
            aggregator=ds.mean(self.p.ydim),
            streams=skyplot_streams,
            x_sampling=ra_sampling,
            y_sampling=dec_sampling,
        )
        sky_rasterized = apply_when(
            sky_pts,
            operation=sky_rasterize,
            predicate=lambda pts: len(pts) > self.p.max_points).opts(
                opts.Image(bgcolor="black",
                           cmap=self.p.sky_cmap,
                           symmetric=True),
                opts.Points(bgcolor="black",
                            cmap=self.p.sky_cmap,
                            symmetric=True),
                opts.Overlay(hooks=[
                    partial(reset_hook, x_range=ra_range, y_range=dec_range)
                ]),
            )

        # Set up BoundsXY streams to listen to box_select events and notify FilterStream
        scatter_select = BoundsXY(source=scatter_pts)
        scatter_notifier = partial(notify_stream,
                                   filter_stream=self.p.filter_stream,
                                   xdim=self.p.xdim,
                                   ydim=self.p.ydim)
        scatter_select.add_subscriber(scatter_notifier)

        sky_select = BoundsXY(source=sky_pts)
        sky_notifier = partial(notify_stream,
                               filter_stream=self.p.filter_stream,
                               xdim="ra",
                               ydim="dec")
        sky_select.add_subscriber(sky_notifier)

        # Reset
        reset = PlotReset(source=sky_pts)
        reset.add_subscriber(
            partial(reset_stream, self.p.filter_stream,
                    [self.p.sky_range_stream, self.p.scatter_range_stream]))

        raw_scatterpts = filterpoints(dset, xdim=self.p.xdim, ydim=self.p.ydim)
        raw_scatter = datashade(
            raw_scatterpts,
            cmap=list(Greys9[::-1][:5]),
            streams=scatter_streams,
            x_sampling=x_sampling,
            y_sampling=y_sampling,
        )
        scatter_p = raw_scatter * scatter_rasterized

        if self.p.show_rawsky:
            raw_skypts = filterpoints(dset, xdim=self.p.xdim, ydim=self.p.ydim)
            raw_sky = datashade(
                rawskypts,
                cmap=list(Greys9[::-1][:5]),
                streams=skyplot_streams,
                x_sampling=ra_sampling,
                y_sampling=dec_sampling,
            )
            sky_p = raw_sky * sky_rasterized
        else:
            sky_p = sky_rasterized

        if self.p.show_table:
            table = dset.apply(summary_table,
                               ydim=self.p.ydim,
                               streams=[self.p.filter_stream])
            table = table.opts()
            layout = table + scatter_p + sky_p
        else:
            layout = (scatter_p + sky_p).opts(sizing_mode="stretch_width")

        return layout.opts(
            opts.Image(colorbar=True,
                       responsive=True,
                       tools=["box_select", "hover"]),
            opts.Layout(sizing_mode="stretch_width"),
            opts.Points(color=self.p.ydim, tools=["hover"]),
            opts.RGB(alpha=0.5),
            opts.Table(width=200),
        )