Fork PyRPL on GitHub

Source code for pyrpl.test.test_pyqtgraph_benchmark

import logging
logger = logging.getLogger(name=__name__)
import pyqtgraph as pg
import numpy as np
import time
from qtpy import QtCore
from .test_redpitaya import TestRedpitaya
from .. import APP
from ..async_utils import sleep as async_sleep


[docs]class TestPyqtgraph(TestRedpitaya): """ This test case creates a maximally simplistic scope gui that continuously plots the data of both scope channels, and checks the obtainable frame rate. Frame rates down to 20 Hz are accepted """ N = 2 ** 14 cycles = 50 # cycles to average frame rate over frequency = 10.0 duration = 1.0 dt = 0.01 # maximum frame rate is 100 Hz REDPITAYA = False # REDPITAYA=True tests the speed with Red Pitaya Scope timeout = 10.0 # timeout if the gui never plots anything
[docs] def setup(self): self.t0 = np.linspace(0, self.duration, self.N) self.plotWidget = pg.plot(title="Realtime plotting benchmark") self.cycle = 0 self.starttime = time.time() # not yet the actual starttime, but needed for timeout if self.REDPITAYA: self.r.scope.setup(trigger_source='immediately', duration=self.duration) self.timer = QtCore.QTimer() self.timer.setInterval(1000*self.dt) self.timer.timeout.connect(self.update_plot) self.timer.start()
[docs] def teardown(self): self.timer.stop() APP.processEvents() self.plotWidget.close() APP.processEvents()
[docs] def update_plot(self): self.cycle += 1 if self.cycle == 1: self.starttime = time.time() if self.cycle == self.cycles: self.endtime = time.time() if self.REDPITAYA: t = self.r.scope.times #y1 = self.r.scope.curve(ch=1, timeout=0) #y2 = self.r.scope.curve(ch=2, timeout=0) #self.r.scope.setup() y1 = self.r.scope._data_ch1_current y2 = self.r.scope._data_ch2_current else: t = self.t0 + (time.time()-self.starttime) phi = 2.0*np.pi*self.frequency*t y1 = np.sin(phi) y2 = np.cos(phi) if self.cycle == 1: self.c1 = self.plotWidget.plot(t, y1, pen='g') self.c2 = self.plotWidget.plot(t, y2, pen='r') else: self.c1.setData(t, y1) self.c2.setData(t, y2)
[docs] def test_speed(self): # for now, this test is a cause of hangup # return # wait for the gui to display all required curves while self.cycle < self.cycles or (time.time() > self.timeout + self.starttime): # this is needed such that the test GUI actually plots something async_sleep(0.01) if self.cycle < self.cycles: assert False, "Must complete %d cycles before testing for speed!"%self.cycles else: # time per frame dt = (self.endtime - self.starttime) / self.cycles print("Frame rate: %f Hz"%(1.0/dt)) dt *= 1e3 print("Update period: %f ms" %(dt)) # require at least 20 fps assert (dt < 50.0), \ "Frame update time of %f ms with%s redpitaya scope is above specification of 50 ms!" \ % ('out' if self.REDPITAYA else '', dt)