Skip to content

Commit

Permalink
Breakpoint bad (-ve or too large) x-ranges to m4
Browse files Browse the repository at this point in the history
This should never really happen but when it does it appears to be a race
with writing startup pre-graphics-formatter array data where we get
`x_end` epoch value subtracting some really small offset value (like
`-/+0.5`) or the opposite where the `x_start` is epoch and `x_end` is
small.

This adds a warning msg and `breakpoint()` as well as guards around the
entire code downsampling code path so that when resumed the downsampling
cycle should just be skipped and avoid a crash.
  • Loading branch information
goodboy committed Jan 13, 2023
1 parent f1adad9 commit edca7b2
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 16 deletions.
8 changes: 8 additions & 0 deletions piker/data/_m4.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,14 @@ def ds_m4(
x_end = x[-1] # x end value/highest in domain
xrange = (x_end - x_start)

if xrange < 0:
log.error(f'-VE M4 X-RANGE: {x_start} -> {x_end}')
# XXX: broken x-range calc-case, likely the x-end points
# are wrong and have some default value set (such as
# x_end -> <some epoch float> while x_start -> 0.5).
breakpoint()
return None

# XXX: always round up on the input pixels
# lnx = len(x)
# uppx *= max(4 / (1 + math.log(uppx, 2)), 1)
Expand Down
25 changes: 16 additions & 9 deletions piker/data/_pathops.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,20 +63,27 @@ def xy_downsample(
# downsample whenever more then 1 pixels per datum can be shown.
# always refresh data bounds until we get diffing
# working properly, see above..
bins, x, y, ymn, ymx = ds_m4(
m4_out = ds_m4(
x,
y,
uppx,
)

# flatten output to 1d arrays suitable for path-graphics generation.
x = np.broadcast_to(x[:, None], y.shape)
x = (x + np.array(
[-x_spacer, 0, 0, x_spacer]
)).flatten()
y = y.flatten()

return x, y, ymn, ymx
if m4_out is not None:
bins, x, y, ymn, ymx = m4_out
# flatten output to 1d arrays suitable for path-graphics generation.
x = np.broadcast_to(x[:, None], y.shape)
x = (x + np.array(
[-x_spacer, 0, 0, x_spacer]
)).flatten()
y = y.flatten()

return x, y, ymn, ymx

# XXX: we accept a None output for the case where the input range
# to ``ds_m4()`` is bad (-ve) and we want to catch and debug
# that (seemingly super rare) circumstance..
return None


@njit(
Expand Down
16 changes: 9 additions & 7 deletions piker/ui/_render.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,17 +211,19 @@ def render(

elif should_ds and uppx > 1:

x_1d, y_1d, ymn, ymx = xy_downsample(
ds_out = xy_downsample(
x_1d,
y_1d,
uppx,
)
self.viz.yrange = ymn, ymx
# print(f'{self.viz.name} post ds: ymn, ymx: {ymn},{ymx}')

reset = True
profiler(f'FULL PATH downsample redraw={should_ds}')
self._in_ds = True
if ds_out is not None:
x_1d, y_1d, ymn, ymx = ds_out
self.viz.yrange = ymn, ymx
# print(f'{self.viz.name} post ds: ymn, ymx: {ymn},{ymx}')

reset = True
profiler(f'FULL PATH downsample redraw={should_ds}')
self._in_ds = True

path = self.draw_path(
x=x_1d,
Expand Down

0 comments on commit edca7b2

Please sign in to comment.