diff --git a/src/nqrduck_spectrometer/base_spectrometer_model.py b/src/nqrduck_spectrometer/base_spectrometer_model.py index 359eeb3..3a7062d 100644 --- a/src/nqrduck_spectrometer/base_spectrometer_model.py +++ b/src/nqrduck_spectrometer/base_spectrometer_model.py @@ -28,8 +28,6 @@ class BaseSpectrometerModel(ModuleModel): def get_setting(self): return float(self.value) - - class PulseParameter: """A pulse parameter is a value that can be different for each event in a pulse sequence. E.g. the transmit pulse power or the phase of the transmit pulse. diff --git a/src/nqrduck_spectrometer/measurement.py b/src/nqrduck_spectrometer/measurement.py index 4c4ec38..ce60173 100644 --- a/src/nqrduck_spectrometer/measurement.py +++ b/src/nqrduck_spectrometer/measurement.py @@ -1,4 +1,5 @@ import logging +import numpy as np from nqrduck.helpers.signalprocessing import SignalProcessing as sp logger = logging.getLogger(__name__) @@ -13,15 +14,39 @@ class Measurement(): 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. + IF_frequency (float): Intermediate frequency 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, frequency_shift : float = 0) -> None: + def __init__(self, tdx, tdy, target_frequency, frequency_shift : float = 0, IF_frequency : float = 0) -> None: self.tdx = tdx self.tdy = tdy self.target_frequency = target_frequency self.fdx, self.fdy = sp.fft(tdx, tdy, frequency_shift) + self.IF_frequency = IF_frequency + + # Data saving and loading + + def to_json(self): + """Converts the measurement to a json-compatible format.""" + return { + "tdx": self.tdx.tolist(), + "tdy": [[x.real, x.imag] for x in self.tdy], # Convert complex numbers to list + "target_frequency": self.target_frequency, + "IF_frequency": self.IF_frequency + } + + @classmethod + def from_json(cls, json): + """Converts the json format to a measurement.""" + tdy = np.array([complex(y[0], y[1]) for y in json["tdy"]]) + return cls( + np.array(json["tdx"]), + tdy, + target_frequency = json["target_frequency"], + IF_frequency = json["IF_frequency"] + ) # Measurement data @property diff --git a/src/nqrduck_spectrometer/model.py b/src/nqrduck_spectrometer/model.py index 73977d7..7e7fc31 100644 --- a/src/nqrduck_spectrometer/model.py +++ b/src/nqrduck_spectrometer/model.py @@ -24,6 +24,9 @@ class SpectrometerModel(ModuleModel): def active_spectrometer(self, value): self._active_spectrometer = value self.active_spectrometer_changed.emit(value) + spectrometer_module_name = value.model.toolbar_name + logger.debug("Active spectrometer changed to %s", spectrometer_module_name) + self.module.nqrduck_signal.emit("active_spectrometer_changed", spectrometer_module_name) @property def available_spectrometers(self): diff --git a/src/nqrduck_spectrometer/pulseparameters.py b/src/nqrduck_spectrometer/pulseparameters.py index 260dbb5..b6dfb1a 100644 --- a/src/nqrduck_spectrometer/pulseparameters.py +++ b/src/nqrduck_spectrometer/pulseparameters.py @@ -98,7 +98,7 @@ class Function: td = self.get_time_points(pulse_length) yd = self.evaluate(pulse_length) xdf, ydf = sp.fft(td, yd) - mpl_widget.canvas.ax.plot(xdf, ydf) + mpl_widget.canvas.ax.plot(xdf, abs(ydf)) mpl_widget.canvas.ax.set_xlabel("Frequency in Hz") mpl_widget.canvas.ax.set_ylabel("Magnitude") mpl_widget.canvas.ax.grid(True) diff --git a/src/nqrduck_spectrometer/pulsesequence.py b/src/nqrduck_spectrometer/pulsesequence.py index c84372a..40b74c7 100644 --- a/src/nqrduck_spectrometer/pulsesequence.py +++ b/src/nqrduck_spectrometer/pulsesequence.py @@ -127,9 +127,47 @@ class PulseSequence: On execution of the pulse sequence the event duration will be set to the first value in the list. Then the pulse sequence will be executed with the second value of the list. This is repeated until the pulse sequence has been executed with all values in the list.""" - pass + + @property + def name(self): + return self._name + + @name.setter + def name(self, name : str): + if not isinstance(name, str): + raise TypeError("Name needs to be a string") + self._name = name + + @property + def values(self): + return self._values + + @values.setter + def values(self, values : list): + if not isinstance(values, list): + raise TypeError("Values needs to be a list") + self._values = values class VariableGroup: """ Variables can be grouped together. If we have groups a and b the pulse sequence will be executed for all combinations of variables in a and b.""" - pass \ No newline at end of file + + @property + def name(self): + return self._name + + @name.setter + def name(self, name : str): + if not isinstance(name, str): + raise TypeError("Name needs to be a string") + self._name = name + + @property + def variables(self): + return self._variables + + @variables.setter + def variables(self, variables : list): + if not isinstance(variables, list): + raise TypeError("Variables needs to be a list") + self._variables = variables \ No newline at end of file