From 4b89719f67195ef28a3375968449169ceae2b82f Mon Sep 17 00:00:00 2001 From: jupfi Date: Wed, 19 Jul 2023 08:36:20 +0200 Subject: [PATCH] Added setting of frequency and averages. --- .../base_spectrometer_controller.py | 6 ++ .../base_spectrometer_model.py | 56 ++++++++++++++----- .../base_spectrometer_view.py | 4 +- src/nqrduck_spectrometer/controller.py | 4 ++ src/nqrduck_spectrometer/measurement.py | 5 +- 5 files changed, 56 insertions(+), 19 deletions(-) diff --git a/src/nqrduck_spectrometer/base_spectrometer_controller.py b/src/nqrduck_spectrometer/base_spectrometer_controller.py index c628345..53240c9 100644 --- a/src/nqrduck_spectrometer/base_spectrometer_controller.py +++ b/src/nqrduck_spectrometer/base_spectrometer_controller.py @@ -8,4 +8,10 @@ class BaseSpectrometerController(ModuleController): def start_measurement(self): """Starts the measurement. """ + raise NotImplementedError + + def set_frequency(self, value): + raise NotImplementedError + + def set_averages(self, value): raise NotImplementedError \ No newline at end of file diff --git a/src/nqrduck_spectrometer/base_spectrometer_model.py b/src/nqrduck_spectrometer/base_spectrometer_model.py index 1325745..702f214 100644 --- a/src/nqrduck_spectrometer/base_spectrometer_model.py +++ b/src/nqrduck_spectrometer/base_spectrometer_model.py @@ -1,29 +1,21 @@ import logging from collections import OrderedDict -from PyQt6.QtCore import pyqtSlot +from PyQt6.QtCore import pyqtSlot, pyqtSignal, QObject from nqrduck.module.module_model import ModuleModel logger = logging.getLogger(__name__) class BaseSpectrometerModel(ModuleModel): - def __init__(self, module): - super().__init__(module) - self.settings = OrderedDict() - self.pulse_parameter_options = OrderedDict() + settings : OrderedDict + pulse_parameter_options : OrderedDict - def add_setting(self, name, value, description, category) -> None: - if category not in self.settings.keys(): - self.settings[category] = [] - self.settings[category].append(self.Setting(name, value, description)) - - def add_pulse_parameter_option(self, name, pulse_parameter_class) -> None: - self.pulse_parameter_options[name] = pulse_parameter_class - - class Setting: + class Setting(QObject): """A setting for the spectrometer is a value that is the same for all events in a pulse sequence. E.g. the number of averages or the number of points in a spectrum.""" + settings_changed = pyqtSignal() def __init__(self, name, default, description) -> None: + super().__init__() self.name = name self.value = default self.description = description @@ -32,6 +24,7 @@ class BaseSpectrometerModel(ModuleModel): def on_value_changed(self, value): logger.debug("Setting %s changed to %s", self.name, value) self.value = value + self.settings_changed.emit() def get_setting(self): return float(self.value) @@ -50,6 +43,39 @@ class BaseSpectrometerModel(ModuleModel): def get_options(self): return self.options - + def __init__(self, module): + super().__init__(module) + self.settings = OrderedDict() + self.pulse_parameter_options = OrderedDict() + def add_setting(self, name, value, description, category) -> None: + if category not in self.settings.keys(): + self.settings[category] = [] + self.settings[category].append(self.Setting(name, value, description)) + + def get_setting_by_name(self, name : str) -> Setting: + for category in self.settings.keys(): + for setting in self.settings[category]: + if setting.name == name: + return setting + raise ValueError("Setting with name %s not found" % name) + + def add_pulse_parameter_option(self, name, pulse_parameter_class) -> None: + self.pulse_parameter_options[name] = pulse_parameter_class + + @property + def target_frequency(self): + raise NotImplementedError + + @target_frequency.setter + def target_frequency(self, value): + raise NotImplementedError + + @property + def averages(self): + raise NotImplementedError + + @averages.setter + def averages(self, value): + raise NotImplementedError diff --git a/src/nqrduck_spectrometer/base_spectrometer_view.py b/src/nqrduck_spectrometer/base_spectrometer_view.py index a72d063..460865b 100644 --- a/src/nqrduck_spectrometer/base_spectrometer_view.py +++ b/src/nqrduck_spectrometer/base_spectrometer_view.py @@ -1,6 +1,6 @@ import logging from PyQt6.QtWidgets import QWidget, QLabel, QLineEdit, QHBoxLayout, QSizePolicy, QSpacerItem, QVBoxLayout -from PyQt6.QtCore import Qt +from PyQt6.QtCore import Qt, pyqtSlot from nqrduck.module.module_view import ModuleView logger = logging.getLogger(__name__) @@ -12,7 +12,7 @@ class BaseSpectrometerView(ModuleView): super().__init__(module) def load_settings_ui(self): - """This method automaticall generates a view for the settings of the module. + """This method automatically generates a view for the settings of the module. If there is a widget file that has been generated by Qt Designer, it will be used. Otherwise, a default view will be generated.""" from .base_spectrometer_widget import Ui_Form diff --git a/src/nqrduck_spectrometer/controller.py b/src/nqrduck_spectrometer/controller.py index 3834d87..cd0f659 100644 --- a/src/nqrduck_spectrometer/controller.py +++ b/src/nqrduck_spectrometer/controller.py @@ -43,6 +43,10 @@ class SpectrometerController(ModuleController): def process_signals(self, key: str, value: None): if key == "start_measurement": self.on_measurement_start() + elif key == "set_frequency": + self.module.model.active_spectrometer.controller.set_frequency(value) + elif key == "set_averages": + self.module.model.active_spectrometer.controller.set_averages(value) def on_loading(self): """This method is called when the module is loaded. diff --git a/src/nqrduck_spectrometer/measurement.py b/src/nqrduck_spectrometer/measurement.py index c522473..dd1b36c 100644 --- a/src/nqrduck_spectrometer/measurement.py +++ b/src/nqrduck_spectrometer/measurement.py @@ -9,15 +9,16 @@ class Measurement(): tdx (np.array): Time axis for the x axis of the measurement data. tdy (np.array): Time axis for the y axis of the measurement data. target_frequency (float): Target frequency of the measurement. + frequency_shift (float): Frequency shift of the measurement. xf (np.array): Frequency axis for the x axis of the measurement data. yf (np.array): Frequency axis for the y axis of the measurement data. """ - def __init__(self, tdx, tdy, target_frequency) -> None: + def __init__(self, tdx, tdy, target_frequency, frequency_shift : float = 0) -> None: self.tdx = tdx self.tdy = tdy self.target_frequency = target_frequency - self.fdx, self.fdy = sp.fft(tdx, tdy) + self.fdx, self.fdy = sp.fft(tdx, tdy, frequency_shift) # Measurement data @property