def __init__(self, dataset, udf, roi=None, channel=None, title=None, min_delta=0, udfresult=None): if udfresult is None: udfresult = UDFRunner.dry_run([udf], dataset, roi) eligible_channels = get_plottable_2D_channels(udfresult.buffers[0]) if channel is None: if not eligible_channels: raise ValueError( f"No plottable 2D channel found for {udf.__class__.__name__}" ) channel = eligible_channels[0] channel_title = channel if callable(channel): extract = channel channel_title = channel.__name__ channel = None elif isinstance(channel, (tuple, list)): channel, func = channel if channel not in udfresult.buffers[0]: raise ValueError( f"channel {channel} not found, have: {udfresult.buffers[0].keys()}" ) kind = udfresult.buffers[0][channel].kind if kind == 'nav': def extract(udf_results, damage): return (func(udf_results[channel].data), damage) else: def extract(udf_results, damage): return (func(udf_results[channel].data), True) channel_title = f"{func.__name__}({channel})" else: extract = None if channel not in eligible_channels: raise ValueError( "channel {} not found or not plottable, have: {!r}".format( channel, eligible_channels)) channel_title = channel self._extract = extract self.channel = channel if title is None: title = f"{udf.__class__.__name__}: {channel_title}" self.title = title self.data, _ = self.extract(udfresult.buffers[0], udfresult.damage) self.udf = udf self.last_update = 0 self.min_delta = min_delta
def _prepare_plots(self, udfs, dataset, roi, plots): dry_results = UDFRunner.dry_run(udfs, dataset, roi) # cases to consider: # 1) plots is `True`: default plots of all eligible channels # 2) plots is List[List[str]] or List[List[(str, callable)]]: set channels from `plots` # 3) plots is List[LivePlot]: use customized plots as they are channels = None # 1) plots is `True`: default plots of all eligible channels if plots is True: channels = self._get_default_plot_chans(dry_results.buffers) for idx, udf in enumerate(udfs): if len(channels[idx]) == 0: warnings.warn( f"No plottable channels found for UDF " f"#{idx}: {udf.__class__.__name__}, not plotting.") # 2) plots is List[List[str]] or List[List[(str, callable)]]: set channels from `plots` elif (isinstance(plots, (list, tuple)) and all(isinstance(p, (list, tuple)) for p in plots) and all( all(isinstance(pp, (str, list, tuple)) for pp in p) for p in plots)): channels = plots # 3) plots is probably List[LivePlot]: use customized plots as they are else: return plots plots = [] for idx, (udf, udf_channels) in enumerate(zip(udfs, channels)): for channel in udf_channels: p0 = self.plot_class( dataset, udf=udf, roi=roi, channel=channel, # Create an UDFResult from this single UDF udfresult=UDFResults((dry_results.buffers[idx], ), dry_results.damage), ) p0.display() plots.append(p0) return plots