forked from M-Labs/artiq
gui/rt_results: support raw view
This commit is contained in:
parent
526887140d
commit
0ebe56f595
|
@ -0,0 +1,79 @@
|
||||||
|
from gi.repository import Gtk
|
||||||
|
import cairoplot
|
||||||
|
|
||||||
|
from artiq.gui.tools import Window
|
||||||
|
|
||||||
|
|
||||||
|
class RawWindow(Window):
|
||||||
|
def __init__(self, set_names):
|
||||||
|
self.labels = dict()
|
||||||
|
|
||||||
|
Window.__init__(self, title="Raw values",
|
||||||
|
default_size=(200, 150))
|
||||||
|
|
||||||
|
grid = Gtk.Grid(row_spacing=6, column_spacing=6)
|
||||||
|
self.add(grid)
|
||||||
|
for i, name in enumerate(set_names):
|
||||||
|
grid.attach(Gtk.Label(name), 0, i, 1, 1)
|
||||||
|
label = Gtk.Label("-")
|
||||||
|
self.labels[name] = label
|
||||||
|
grid.attach(label, 1, i, 1, 1)
|
||||||
|
|
||||||
|
def delete(self):
|
||||||
|
self.close()
|
||||||
|
|
||||||
|
def set_data(self, data):
|
||||||
|
for name, label in self.labels.items():
|
||||||
|
if name in data:
|
||||||
|
label.set_text(str(data[name]))
|
||||||
|
|
||||||
|
|
||||||
|
class PlotWindow(Window):
|
||||||
|
def __init__(self, set_names):
|
||||||
|
self.set_names = set_names
|
||||||
|
self.data = None
|
||||||
|
|
||||||
|
Window.__init__(self, title="/".join(set_names),
|
||||||
|
default_size=(700, 500))
|
||||||
|
|
||||||
|
self.darea = Gtk.DrawingArea()
|
||||||
|
self.darea.set_size_request(100, 100)
|
||||||
|
self.darea.connect("draw", self.on_draw)
|
||||||
|
self.add(self.darea)
|
||||||
|
|
||||||
|
def delete(self):
|
||||||
|
self.close()
|
||||||
|
|
||||||
|
|
||||||
|
class XYWindow(PlotWindow):
|
||||||
|
def on_draw(self, widget, ctx):
|
||||||
|
if self.data is not None:
|
||||||
|
data = self.filter_data()
|
||||||
|
cairoplot.scatter_plot(
|
||||||
|
ctx,
|
||||||
|
data=data,
|
||||||
|
width=widget.get_allocated_width(),
|
||||||
|
height=widget.get_allocated_height(),
|
||||||
|
x_bounds=(min(data[0])*0.98, max(data[0])*1.02),
|
||||||
|
y_bounds=(min(data[1])*0.98, max(data[1])*1.02),
|
||||||
|
border=20, axis=True, grid=True,
|
||||||
|
dots=1, discrete=True,
|
||||||
|
series_colors=[(0.0, 0.0, 0.0)],
|
||||||
|
background="white"
|
||||||
|
)
|
||||||
|
|
||||||
|
def filter_data(self):
|
||||||
|
return [
|
||||||
|
self.data[self.set_names[0]],
|
||||||
|
self.data[self.set_names[1]],
|
||||||
|
]
|
||||||
|
|
||||||
|
def set_data(self, data):
|
||||||
|
self.data = data
|
||||||
|
if not self.data:
|
||||||
|
return
|
||||||
|
# The two axes are not updated simultaneously.
|
||||||
|
# Redraw only after receiving a new point for each.
|
||||||
|
x, y = self.filter_data()
|
||||||
|
if len(x) == len(y):
|
||||||
|
self.darea.queue_draw()
|
|
@ -1,66 +1,17 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
|
||||||
from gi.repository import Gtk
|
|
||||||
import cairoplot
|
|
||||||
|
|
||||||
from artiq.protocols.sync_struct import Subscriber
|
from artiq.protocols.sync_struct import Subscriber
|
||||||
from artiq.gui.tools import Window
|
from artiq.gui.rt_result_views import RawWindow, XYWindow
|
||||||
|
|
||||||
|
|
||||||
class _PlotWindow(Window):
|
|
||||||
def __init__(self, set_names):
|
|
||||||
self.set_names = set_names
|
|
||||||
self.data = None
|
|
||||||
|
|
||||||
Window.__init__(self, title="/".join(set_names),
|
|
||||||
default_size=(700, 500))
|
|
||||||
|
|
||||||
self.darea = Gtk.DrawingArea()
|
|
||||||
self.darea.set_size_request(100, 100)
|
|
||||||
self.darea.connect("draw", self.on_draw)
|
|
||||||
self.add(self.darea)
|
|
||||||
|
|
||||||
def delete(self):
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
|
|
||||||
class XYWindow(_PlotWindow):
|
|
||||||
def on_draw(self, widget, ctx):
|
|
||||||
if self.data is not None:
|
|
||||||
data = self.filter_data()
|
|
||||||
cairoplot.scatter_plot(
|
|
||||||
ctx,
|
|
||||||
data=data,
|
|
||||||
width=widget.get_allocated_width(),
|
|
||||||
height=widget.get_allocated_height(),
|
|
||||||
x_bounds=(min(data[0])*0.98, max(data[0])*1.02),
|
|
||||||
y_bounds=(min(data[1])*0.98, max(data[1])*1.02),
|
|
||||||
border=20, axis=True, grid=True,
|
|
||||||
dots=1, discrete=True,
|
|
||||||
series_colors=[(0.0, 0.0, 0.0)],
|
|
||||||
background="white"
|
|
||||||
)
|
|
||||||
|
|
||||||
def filter_data(self):
|
|
||||||
return [
|
|
||||||
self.data[self.set_names[0]],
|
|
||||||
self.data[self.set_names[1]],
|
|
||||||
]
|
|
||||||
|
|
||||||
def set_data(self, data):
|
|
||||||
self.data = data
|
|
||||||
if not self.data:
|
|
||||||
return
|
|
||||||
# The two axes are not updated simultaneously.
|
|
||||||
# Redraw only after receiving a new point for each.
|
|
||||||
x, y = self.filter_data()
|
|
||||||
if len(x) == len(y):
|
|
||||||
self.darea.queue_draw()
|
|
||||||
|
|
||||||
|
|
||||||
def _create_view(set_names, view_description):
|
def _create_view(set_names, view_description):
|
||||||
|
if view_description == "raw":
|
||||||
|
r = RawWindow(set_names)
|
||||||
|
elif view_description == "xy":
|
||||||
r = XYWindow(set_names)
|
r = XYWindow(set_names)
|
||||||
|
else:
|
||||||
|
raise ValueError("Unknown view description: " + view_description)
|
||||||
r.show_all()
|
r.show_all()
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
@ -158,8 +109,11 @@ class RTResults:
|
||||||
return self.current_groups
|
return self.current_groups
|
||||||
|
|
||||||
def on_mod(self, mod):
|
def on_mod(self, mod):
|
||||||
if mod["action"] != "init" and len(mod["path"]) >= 3:
|
if mod["action"] != "init" and len(mod["path"]) >= 2:
|
||||||
path = mod["path"]
|
path = mod["path"]
|
||||||
group = self.current_groups[path[0]]
|
group = self.current_groups[path[0]]
|
||||||
if path[1] == "data":
|
if path[1] == "data":
|
||||||
|
if len(mod["path"]) >= 3:
|
||||||
group.on_data_modified(path[2])
|
group.on_data_modified(path[2])
|
||||||
|
else:
|
||||||
|
group.on_data_modified(mod["key"])
|
||||||
|
|
Loading…
Reference in New Issue