From 2d723ed573d715877ddd8a202cf8c19f4b7fd000 Mon Sep 17 00:00:00 2001 From: TUD278427 <TUD278427@tudelft.net> Date: Tue, 16 Jun 2020 15:32:27 +0200 Subject: [PATCH] Add RF settings to param viewer, init syntax changed a bit now, sorry --- .../GUI/param_viewer/param_viewer_GUI_main.py | 121 +++++++++++++++--- .../param_viewer/param_viewer_GUI_window.py | 27 ++-- .../param_viewer/param_viewer_GUI_window.ui | 22 +++- 3 files changed, 135 insertions(+), 35 deletions(-) diff --git a/core_tools/GUI/param_viewer/param_viewer_GUI_main.py b/core_tools/GUI/param_viewer/param_viewer_GUI_main.py index 96b7074b..7884057d 100644 --- a/core_tools/GUI/param_viewer/param_viewer_GUI_main.py +++ b/core_tools/GUI/param_viewer/param_viewer_GUI_main.py @@ -1,22 +1,34 @@ +# -*- coding: utf-8 -*- from core_tools.GUI.param_viewer.param_viewer_GUI_window import Ui_MainWindow from PyQt5 import QtCore, QtGui, QtWidgets from functools import partial - +from qcodes import Station import numpy as np from dataclasses import dataclass @dataclass -class gate_data_obj: - gate_parameter : any +class param_data_obj: + param_parameter : any gui_input_param : any + division : any class param_viewer(QtWidgets.QMainWindow, Ui_MainWindow): """docstring for virt_gate_matrix_GUI""" - def __init__(self, gates_object): + def __init__(self, station, gates_object = None): + if type(station) is not Station: + raise Exception('Syntax changed, to support RF_settings now supply station') self.real_gates = list() self.virtual_gates = list() - self.gates_object = gates_object + self.rf_settings = list() + self.station = station + if gates_object: + self.gates_object = gates_object + else: + try: + self.gates_object = self.station.gates + except: + raise ValueError('Default guess for gates object wrong, please supply manually') self._step_size = 1 #mV instance_ready = True @@ -29,22 +41,29 @@ class param_viewer(QtWidgets.QMainWindow, Ui_MainWindow): super(QtWidgets.QMainWindow, self).__init__() self.setupUi(self) + # add RF parameters + for src_name in self.gates_object.hardware.RF_source_names: + inst = getattr(station, src_name) + for RFpar in self.gates_object.hardware.RF_params: + param = getattr(inst, RFpar) + self._add_RFset(param) + # add real gates - for gate_name in gates_object.hardware.dac_gate_map.keys(): - param = getattr(gates_object, gate_name) + for gate_name in self.gates_object.hardware.dac_gate_map.keys(): + param = getattr(self.gates_object, gate_name) self._add_gate(param, False) # add virtual gates - for virt_gate_set in gates_object.hardware.virtual_gates: + for virt_gate_set in self.gates_object.hardware.virtual_gates: for gate_name in virt_gate_set.virtual_gate_names: - param = getattr(gates_object, gate_name) + param = getattr(self.gates_object, gate_name) self._add_gate(param, True) self.step_size.valueChanged.connect(partial(self._update_step, self.step_size.value)) self._finish_gates_GUI() self.timer = QtCore.QTimer() - self.timer.timeout.connect(partial(self._update_gates)) + self.timer.timeout.connect(partial(self._update_parameters)) self.timer.start(500) self.show() @@ -63,6 +82,54 @@ class param_viewer(QtWidgets.QMainWindow, Ui_MainWindow): self.step_size.setValue(value) + def _add_RFset(self, parameter): + ''' + add a new gate. + + Args: + parameter (QCoDeS parameter object) : parameter to add. + virtual (bool) : True in case this is a virtual gate. + ''' + + i = len(self.rf_settings) + layout = self.layout_RF + + name = parameter.full_name + unit = parameter.unit + step_size = 0.5 + division = 1 + + if parameter.name[0:10] == 'frequency': + division = 1e6 + step_size = 0.1 + unit = f'M{unit}' + + _translate = QtCore.QCoreApplication.translate + + set_name = QtWidgets.QLabel(self.RFsettings) + set_name.setObjectName(name) + set_name.setMinimumSize(QtCore.QSize(100, 0)) + set_name.setText(_translate("MainWindow", name)) + layout.addWidget(set_name, i, 0, 1, 1) + + set_input = QtWidgets.QDoubleSpinBox(self.RFsettings) + set_input.setObjectName(name + "_input") + set_input.setMinimumSize(QtCore.QSize(100, 0)) + + # TODO collect boundaries out of the harware + set_input.setRange(-1e9,1e9) + set_input.valueChanged.connect(partial(self._set_set, parameter, set_input.value,division)) + set_input.setKeyboardTracking(False) + set_input.setSingleStep(step_size) + + layout.addWidget(set_input, i, 1, 1, 1) + + set_unit = QtWidgets.QLabel(self.RFsettings) + set_unit.setObjectName(name + "_unit") + set_unit.setText(_translate("MainWindow", unit)) + layout.addWidget(set_unit, i, 2, 1, 1) + self.rf_settings.append(param_data_obj(parameter, set_input, division)) + def _add_gate(self, parameter, virtual): ''' add a new gate. @@ -93,6 +160,7 @@ class param_viewer(QtWidgets.QMainWindow, Ui_MainWindow): voltage_input = QtWidgets.QDoubleSpinBox(self.virtualgates) voltage_input.setObjectName( name + "_input") voltage_input.setMinimumSize(QtCore.QSize(100, 0)) + # TODO collect boundaries out of the harware voltage_input.setRange(-4000,4000.0) voltage_input.valueChanged.connect(partial(self._set_gate, parameter, voltage_input.value)) @@ -104,15 +172,22 @@ class param_viewer(QtWidgets.QMainWindow, Ui_MainWindow): gate_unit.setText(_translate("MainWindow", unit)) layout.addWidget(gate_unit, i, 2, 1, 1) if virtual == False: - self.real_gates.append(gate_data_obj(parameter, voltage_input)) + self.real_gates.append(param_data_obj(parameter, voltage_input, 1)) else: - self.virtual_gates.append(gate_data_obj(parameter, voltage_input)) + self.virtual_gates.append(param_data_obj(parameter, voltage_input, 1)) def _set_gate(self, gate, value): # TODO add support if out of range. gate.set(value()) + def _set_set(self, setting, value, division): + # TODO add support if out of range. + setting.set(value()*division) + self.gates_object.hardware.RF_settings[setting.full_name] = value()*division + self.gates_object.hardware.sync_data() + def _finish_gates_GUI(self): + # MAKE THIS INTO A FOR LOOP i = len(self.real_gates) + 1 spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) @@ -128,24 +203,34 @@ class param_viewer(QtWidgets.QMainWindow, Ui_MainWindow): spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.layout_virtual.addItem(spacerItem1, 0, 3, 1, 1) + + i = len(self.rf_settings) + 1 + + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.layout_RF.addItem(spacerItem, i, 0, 1, 1) + + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.layout_RF.addItem(spacerItem1, 0, 3, 1, 1) - def _update_gates(self): + def _update_parameters(self): ''' updates the values of all the gates in the parameterviewer periodically ''' idx = self.tab_menu.currentIndex() if idx == 0: - gates = self.real_gates + params = self.real_gates elif idx == 1: - gates = self.virtual_gates + params = self.virtual_gates + elif idx == 2: + params = self.rf_settings else: return - for gate in gates: + for param in params: # do not update when a user clicks on it. - if not gate.gui_input_param.hasFocus(): - gate.gui_input_param.setValue(gate.gate_parameter()) + if not param.gui_input_param.hasFocus(): + param.gui_input_param.setValue(param.param_parameter()/param.division) diff --git a/core_tools/GUI/param_viewer/param_viewer_GUI_window.py b/core_tools/GUI/param_viewer/param_viewer_GUI_window.py index 55feec47..c8b51163 100644 --- a/core_tools/GUI/param_viewer/param_viewer_GUI_window.py +++ b/core_tools/GUI/param_viewer/param_viewer_GUI_window.py @@ -2,14 +2,12 @@ # Form implementation generated from reading ui file 'param_viewer_GUI_window.ui' # -# Created by: PyQt5 UI code generator 5.13.1 +# Created by: PyQt5 UI code generator 5.9.2 # # WARNING! All changes made in this file will be lost! - from PyQt5 import QtCore, QtGui, QtWidgets - class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") @@ -28,7 +26,7 @@ class Ui_MainWindow(object): self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QtWidgets.QWidget() - self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 758, 491)) + self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 756, 495)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.gridLayout_6 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents) self.gridLayout_6.setObjectName("gridLayout_6") @@ -46,6 +44,15 @@ class Ui_MainWindow(object): self.layout_virtual.setObjectName("layout_virtual") self.gridLayout_5.addLayout(self.layout_virtual, 0, 0, 1, 1) self.tab_menu.addTab(self.virtualgates, "") + self.RFsettings = QtWidgets.QWidget() + self.RFsettings.setObjectName("RFsettings") + self.layoutWidget = QtWidgets.QWidget(self.RFsettings) + self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 761, 501)) + self.layoutWidget.setObjectName("layoutWidget") + self.layout_RF = QtWidgets.QGridLayout(self.layoutWidget) + self.layout_RF.setContentsMargins(0, 0, 0, 0) + self.layout_RF.setObjectName("layout_RF") + self.tab_menu.addTab(self.RFsettings, "") self.settings = QtWidgets.QWidget() self.settings.setObjectName("settings") self.gridLayout_3 = QtWidgets.QGridLayout(self.settings) @@ -80,7 +87,7 @@ class Ui_MainWindow(object): self.gridLayout.addWidget(self.tab_menu, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 20)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) @@ -96,16 +103,8 @@ class Ui_MainWindow(object): MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.tab_menu.setTabText(self.tab_menu.indexOf(self.realgates), _translate("MainWindow", "Normal gates")) self.tab_menu.setTabText(self.tab_menu.indexOf(self.virtualgates), _translate("MainWindow", "Virtual Gates")) + self.tab_menu.setTabText(self.tab_menu.indexOf(self.RFsettings), _translate("MainWindow", "RF Settings")) self.label.setText(_translate("MainWindow", "Voltage step")) self.label_2.setText(_translate("MainWindow", "mV")) self.tab_menu.setTabText(self.tab_menu.indexOf(self.settings), _translate("MainWindow", "Settings")) - -if __name__ == "__main__": - import sys - app = QtWidgets.QApplication(sys.argv) - MainWindow = QtWidgets.QMainWindow() - ui = Ui_MainWindow() - ui.setupUi(MainWindow) - MainWindow.show() - sys.exit(app.exec_()) diff --git a/core_tools/GUI/param_viewer/param_viewer_GUI_window.ui b/core_tools/GUI/param_viewer/param_viewer_GUI_window.ui index 22832334..152d0b71 100644 --- a/core_tools/GUI/param_viewer/param_viewer_GUI_window.ui +++ b/core_tools/GUI/param_viewer/param_viewer_GUI_window.ui @@ -35,8 +35,8 @@ <rect> <x>0</x> <y>0</y> - <width>758</width> - <height>491</height> + <width>756</width> + <height>495</height> </rect> </property> <layout class="QGridLayout" name="gridLayout_6"> @@ -59,6 +59,22 @@ </item> </layout> </widget> + <widget class="QWidget" name="RFsettings"> + <attribute name="title"> + <string>RF Settings</string> + </attribute> + <widget class="QWidget" name="layoutWidget"> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>761</width> + <height>501</height> + </rect> + </property> + <layout class="QGridLayout" name="layout_RF"/> + </widget> + </widget> <widget class="QWidget" name="settings"> <attribute name="title"> <string>Settings</string> @@ -154,7 +170,7 @@ <x>0</x> <y>0</y> <width>800</width> - <height>20</height> + <height>21</height> </rect> </property> </widget> -- GitLab