From e1e3afb49522e8a8013d56f6ed312a0c9e8be533 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Wed, 18 Jan 2023 14:52:07 -0500 Subject: [PATCH] Support read-slice input to `Viz.maxmin()` Acts as short cut when pipe-lining from `Viz.update_graphics()` (which now returns the needed in-view array-relative-read-slice as output) such that `Viz.read()` and `.datums_range()` doesn't need to be called internally multiple times. In this case where `i_read_range` is provided we of course skip doing time index translations and consequently lookup the appropriate (epoch-time) index indices for caching. --- piker/ui/_dataviz.py | 99 +++++++++++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 38 deletions(-) diff --git a/piker/ui/_dataviz.py b/piker/ui/_dataviz.py index 9e1dc4df..458c6699 100644 --- a/piker/ui/_dataviz.py +++ b/piker/ui/_dataviz.py @@ -330,6 +330,7 @@ class Viz(msgspec.Struct): # , frozen=True): self, x_range: slice | tuple[int, int] | None = None, + i_read_range: tuple[int, int] | None = None, use_caching: bool = True, ) -> tuple[float, float] | None: @@ -343,7 +344,7 @@ class Viz(msgspec.Struct): # , frozen=True): profiler = Profiler( msg=f'{name} -> `{str(self)}.maxmin()`', disabled=not pg_profile_enabled(), - ms_threshold=ms_slower_then, + ms_threshold=4, delayed=True, ) @@ -351,26 +352,34 @@ class Viz(msgspec.Struct): # , frozen=True): if shm is None: return None + do_print: bool = False arr = shm.array - if x_range is None: - ( - l, - _, - lbar, - rbar, - _, - r, - ) = self.datums_range() + if i_read_range is not None: + read_slc = slice(*i_read_range) + index = arr[read_slc][self.index_field] + if not index.size: + return None + ixrng = (index[0], index[-1]) - profiler(f'{self.name} got bars range') - x_range = lbar, rbar + else: + if x_range is None: + ( + l, + _, + lbar, + rbar, + _, + r, + ) = self.datums_range() - # TODO: hash the slice instead maybe? - # https://stackoverflow.com/a/29980872 - ixrng = (round(lbar), round(rbar)) + profiler(f'{self.name} got bars range') + x_range = lbar, rbar + + # TODO: hash the slice instead maybe? + # https://stackoverflow.com/a/29980872 + lbar, rbar = ixrng = round(x_range[0]), round(x_range[1]) - do_print: bool = False if use_caching: cached_result = self._mxmns.get(ixrng) if cached_result: @@ -386,21 +395,22 @@ class Viz(msgspec.Struct): # , frozen=True): mxmn, ) - # get relative slice indexes into array - if self.index_field == 'time': - read_slc = slice_from_time( - arr, - start_t=lbar, - stop_t=rbar, - step=self.index_step(), - ) + if i_read_range is None: + # get relative slice indexes into array + if self.index_field == 'time': + read_slc = slice_from_time( + arr, + start_t=lbar, + stop_t=rbar, + step=self.index_step(), + ) - else: - ifirst = arr[0]['index'] - read_slc = slice( - lbar - ifirst, - (rbar - ifirst) + 1 - ) + else: + ifirst = arr[0]['index'] + read_slc = slice( + lbar - ifirst, + (rbar - ifirst) + 1 + ) slice_view = arr[read_slc] @@ -657,13 +667,17 @@ class Viz(msgspec.Struct): # , frozen=True): profiler = Profiler( msg=f'Viz.update_graphics() for {self.name}', disabled=not pg_profile_enabled(), - ms_threshold=4, - # ms_threshold=ms_slower_then, + ms_threshold=ms_slower_then, + # ms_threshold=4, ) # shm read and slice to view read = ( - xfirst, xlast, src_array, - ivl, ivr, in_view, + xfirst, + xlast, + src_array, + ivl, + ivr, + in_view, ) = self.read(profiler=profiler) profiler('read src shm data') @@ -675,7 +689,10 @@ class Viz(msgspec.Struct): # , frozen=True): or not render ): # print('exiting early') - return graphics + return ( + (ivl, ivr), + graphics, + ) should_redraw: bool = False ds_allowed: bool = True # guard for m4 activation @@ -792,7 +809,10 @@ class Viz(msgspec.Struct): # , frozen=True): if not out: log.warning(f'{self.name} failed to render!?') - return graphics + return ( + (ivl, ivr), + graphics, + ) path, reset_cache = out @@ -843,7 +863,10 @@ class Viz(msgspec.Struct): # , frozen=True): # track downsampled state self._in_ds = r._in_ds - return graphics + return ( + (ivl, ivr), + graphics, + ) def draw_last( self, @@ -1054,7 +1077,7 @@ class Viz(msgspec.Struct): # , frozen=True): if do_ds: # view.interaction_graphics_cycle() view.maybe_downsample_graphics() - view._set_yrange() + view._set_yrange(viz=self) def incr_info( self,