forked from M-Labs/artiq
applets: add length warning message on plot for `plot_xy_hist` and fix bug (#1725)
This commit is contained in:
parent
943a95e07a
commit
ebb67eaeee
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from PyQt5 import QtWidgets
|
from PyQt5 import QtWidgets
|
||||||
|
from PyQt5.QtCore import QTimer
|
||||||
import pyqtgraph
|
import pyqtgraph
|
||||||
|
|
||||||
from artiq.applets.simple import SimpleApplet
|
from artiq.applets.simple import SimpleApplet
|
||||||
|
@ -37,6 +38,10 @@ class XYHistPlot(QtWidgets.QSplitter):
|
||||||
self.hist_plot_data = None
|
self.hist_plot_data = None
|
||||||
|
|
||||||
self.args = args
|
self.args = args
|
||||||
|
self.timer = QTimer()
|
||||||
|
self.timer.setSingleShot(True)
|
||||||
|
self.timer.timeout.connect(self.length_warning)
|
||||||
|
self.mismatch = {'bins': False, 'xs': False}
|
||||||
|
|
||||||
def _set_full_data(self, xs, histogram_bins, histograms_counts):
|
def _set_full_data(self, xs, histogram_bins, histograms_counts):
|
||||||
self.xy_plot.clear()
|
self.xy_plot.clear()
|
||||||
|
@ -59,9 +64,9 @@ class XYHistPlot(QtWidgets.QSplitter):
|
||||||
point.histogram_index = index
|
point.histogram_index = index
|
||||||
point.histogram_counts = counts
|
point.histogram_counts = counts
|
||||||
|
|
||||||
self.hist_plot_data = self.hist_plot.plot(
|
text = "click on a data point at the left\n"\
|
||||||
stepMode=True, fillLevel=0,
|
"to see the corresponding histogram"
|
||||||
brush=(0, 0, 255, 150))
|
self.hist_plot.addItem(pyqtgraph.TextItem(text))
|
||||||
|
|
||||||
def _set_partial_data(self, xs, histograms_counts):
|
def _set_partial_data(self, xs, histograms_counts):
|
||||||
ys = _compute_ys(self.histogram_bins, histograms_counts)
|
ys = _compute_ys(self.histogram_bins, histograms_counts)
|
||||||
|
@ -87,6 +92,15 @@ class XYHistPlot(QtWidgets.QSplitter):
|
||||||
else:
|
else:
|
||||||
self.arrow.setPos(position)
|
self.arrow.setPos(position)
|
||||||
self.selected_index = spot_item.histogram_index
|
self.selected_index = spot_item.histogram_index
|
||||||
|
|
||||||
|
if self.hist_plot_data is None:
|
||||||
|
self.hist_plot.clear()
|
||||||
|
self.hist_plot_data = self.hist_plot.plot(
|
||||||
|
x=self.histogram_bins,
|
||||||
|
y=spot_item.histogram_counts,
|
||||||
|
stepMode=True, fillLevel=0,
|
||||||
|
brush=(0, 0, 255, 150))
|
||||||
|
else:
|
||||||
self.hist_plot_data.setData(x=self.histogram_bins,
|
self.hist_plot_data.setData(x=self.histogram_bins,
|
||||||
y=spot_item.histogram_counts)
|
y=spot_item.histogram_counts)
|
||||||
|
|
||||||
|
@ -117,11 +131,41 @@ class XYHistPlot(QtWidgets.QSplitter):
|
||||||
histograms_counts = data[self.args.histograms_counts][1]
|
histograms_counts = data[self.args.histograms_counts][1]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return
|
return
|
||||||
|
if len(xs) != histograms_counts.shape[0]:
|
||||||
|
self.mismatch['xs'] = True
|
||||||
|
else:
|
||||||
|
self.mismatch['xs'] = False
|
||||||
|
if histograms_counts.shape[1] != len(histogram_bins) - 1:
|
||||||
|
self.mismatch['bins'] = True
|
||||||
|
else:
|
||||||
|
self.mismatch['bins'] = False
|
||||||
|
if any(self.mismatch.values()):
|
||||||
|
if not self.timer.isActive():
|
||||||
|
self.timer.start(1000)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self.timer.stop()
|
||||||
if self._can_use_partial(mods):
|
if self._can_use_partial(mods):
|
||||||
self._set_partial_data(xs, histograms_counts)
|
self._set_partial_data(xs, histograms_counts)
|
||||||
else:
|
else:
|
||||||
self._set_full_data(xs, histogram_bins, histograms_counts)
|
self._set_full_data(xs, histogram_bins, histograms_counts)
|
||||||
|
|
||||||
|
def length_warning(self):
|
||||||
|
self.xy_plot.clear()
|
||||||
|
self.hist_plot.clear()
|
||||||
|
text = "⚠️ dataset lengths mismatch:\n\n"
|
||||||
|
if self.mismatch['bins']:
|
||||||
|
text = ''.join([text,
|
||||||
|
"bin boundaries should have the same length\n"
|
||||||
|
"as the first dimension of histogram counts."])
|
||||||
|
if self.mismatch['bins'] and self.mismatch['xs']:
|
||||||
|
text = ''.join([text, '\n\n'])
|
||||||
|
if self.mismatch['xs']:
|
||||||
|
text = ''.join([text,
|
||||||
|
"point abscissas should have the same length\n"
|
||||||
|
"as the second dimension of histogram counts."])
|
||||||
|
self.xy_plot.addItem(pyqtgraph.TextItem(text))
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
applet = SimpleApplet(XYHistPlot)
|
applet = SimpleApplet(XYHistPlot)
|
||||||
|
|
Loading…
Reference in New Issue