From ab670c38c7e4eafdd2b9a472dbfc44b992c10c47 Mon Sep 17 00:00:00 2001 From: jupfi Date: Tue, 11 Jul 2023 13:58:55 +0200 Subject: [PATCH] Improved pulse sequence structure. --- pyproject.toml | 2 +- src/nqrduck_pulseprogrammer/model.py | 21 +++++++--------- src/nqrduck_pulseprogrammer/view.py | 36 +++++++++++++++------------- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 697d1a9..9198432 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,7 @@ classifiers = [ dependencies = [ "matplotlib", "pyqt6", - "NQRduck", + "nqrduck-spectrometer", ] [project.entry-points."nqrduck"] diff --git a/src/nqrduck_pulseprogrammer/model.py b/src/nqrduck_pulseprogrammer/model.py index abab789..1970aea 100644 --- a/src/nqrduck_pulseprogrammer/model.py +++ b/src/nqrduck_pulseprogrammer/model.py @@ -2,6 +2,7 @@ import logging from collections import OrderedDict from PyQt6.QtCore import pyqtSignal from nqrduck.module.module_model import ModuleModel +from nqrduck_spectrometer.pulse_sequence import PulseSequence logger = logging.getLogger(__name__) @@ -12,23 +13,19 @@ class PulseProgrammerModel(ModuleModel): def __init__(self, module): super().__init__(module) self.pulse_parameter_options = OrderedDict() - self.events = OrderedDict() + self.pulse_sequence = PulseSequence("Untitled pulse sequence") def add_event(self, event_name): - self.events[event_name] = OrderedDict() + self.pulse_sequence.events[event_name] = PulseSequence.Event(event_name, 0) + logger.debug("Creating event %s with object id %s", event_name, id(self.pulse_sequence.events[event_name].parameters)) + # Create a default instance of the pulse parameter options and add it to the event for name, pulse_parameter_class in self.pulse_parameter_options.items(): - self.events[event_name][name] = pulse_parameter_class("name") + logger.debug("Adding pulse parameter %s to event %s", name, event_name) + self.pulse_sequence.events[event_name].parameters[name] = pulse_parameter_class(name) + logger.debug("Created pulse parameter %s with object id %s", name, id(self.pulse_sequence.events[event_name].parameters[name])) - self.events_changed.emit() - - @property - def events(self): - return self._events - - @events.setter - def events(self, value): - self._events = value + logger.debug(self.pulse_sequence.dump_sequence_data()) self.events_changed.emit() @property diff --git a/src/nqrduck_pulseprogrammer/view.py b/src/nqrduck_pulseprogrammer/view.py index a6c0962..578185e 100644 --- a/src/nqrduck_pulseprogrammer/view.py +++ b/src/nqrduck_pulseprogrammer/view.py @@ -21,7 +21,7 @@ class PulseProgrammerView(ModuleView): def setup_ui(self): # Create pulse table - title = QLabel("Pulse Sequence:") + title = QLabel("Pulse Sequence: %s" % self.module.model.pulse_sequence.name) # Make title bold font = title.font() font.setBold(True) @@ -79,15 +79,15 @@ class PulseProgrammerView(ModuleView): @pyqtSlot() def on_events_changed(self): - logger.debug("Updating events to %s", self.module.model.events) + logger.debug("Updating events to %s", self.module.model.pulse_sequence.events) - for event in self.module.model.events: + for event in self.module.model.pulse_sequence.events: logger.debug("Adding event to pulseprogrammer view: %s", event) - # Create a label for the setting + # Create a label for the event event_name = QLabel(event) event_name.setMinimumWidth(70) - # Add an QLineEdit for the setting - line_edit = QLineEdit(str(0)) + # Add an QLineEdit for the event + line_edit = QLineEdit(str(self.module.model.pulse_sequence.events[event].duration)) line_edit.setMinimumWidth(30) # Add a label for the unit unit_label = QLabel("µs") @@ -102,24 +102,26 @@ class PulseProgrammerView(ModuleView): self.layout().addLayout(event_layout) - self.pulse_table.setColumnCount(len(self.module.model.events)) - self.pulse_table.setHorizontalHeaderLabels(self.module.model.events) + self.pulse_table.setColumnCount(len(self.module.model.pulse_sequence.events)) + self.pulse_table.setHorizontalHeaderLabels(self.module.model.pulse_sequence.events) self.set_parameter_icons() def set_parameter_icons(self): - for i, parameter in enumerate(self.module.model.pulse_parameter_options.keys()): - for j, event in enumerate(self.module.model.events): - logger.debug("Adding button for event %s and parameter %s", event, parameter) + for column_idx, event in enumerate(self.module.model.pulse_sequence.events): + for row_idx, parameter in enumerate(self.module.model.pulse_parameter_options.keys()): + logger.debug("Adding button for event %s and parameter %s with state %s", event, parameter, self.module.model.pulse_sequence.events[event].parameters[parameter].state) + logger.debug("Parameter object id: %s", id(self.module.model.pulse_sequence.events[event].parameters[parameter])) button = QPushButton() - icon = QIcon(self.module.model.events[event][parameter].get_pixmap()) + icon = QIcon(self.module.model.pulse_sequence.events[event].parameters[parameter].get_pixmap()) logger.debug("Icon size: %s", icon.availableSizes()) button.setIcon(icon) button.setIconSize(icon.availableSizes()[0]) button.setFixedSize(icon.availableSizes()[0]) - self.pulse_table.setCellWidget(i, j, button) - self.pulse_table.setRowHeight(i, icon.availableSizes()[0].height()) - self.pulse_table.setColumnWidth(j, icon.availableSizes()[0].width()) + + self.pulse_table.setCellWidget(row_idx, column_idx, button) + self.pulse_table.setRowHeight(row_idx, icon.availableSizes()[0].height()) + self.pulse_table.setColumnWidth(column_idx, icon.availableSizes()[0].width()) # Connect the button to the on_button_clicked slot func = functools.partial(self.on_button_clicked, event=event, parameter=parameter) @@ -135,7 +137,7 @@ class PulseProgrammerView(ModuleView): if result: selection = dialog.return_func() logger.debug("Setting parameter %s of event %s to %s", parameter, event, selection) - self.module.model.events[event][parameter].set_options(selection) + self.module.model.pulse_sequence.events[event].parameters[parameter].set_options(selection) self.set_parameter_icons() class OptionsDialog(QDialog): @@ -148,7 +150,7 @@ class OptionsDialog(QDialog): self.label = QLabel("Change options for the pulse parameter: %s" % parameter) self.layout.addWidget(self.label) - parameter = parent.module.model.events[event][parameter] + parameter = parent.module.model.pulse_sequence.events[event].parameters[parameter] options = parameter.get_options()