From 16c586f817700bb4c22ebc7d5b3dc325fb08b9d2 Mon Sep 17 00:00:00 2001 From: Martin Killenberg <martin.killenberg@desy.de> Date: Tue, 24 Oct 2023 16:08:34 +0200 Subject: [PATCH] feat: add DeviceAccessMeasurement --- Python_script/MeasurementPlot.py | 40 +++++++++-------- Python_script/PostPlot.py | 23 +++++----- Python_script/analysis.py | 42 +++++++++--------- Python_script/climate-lab-gui.py | 11 +++-- Python_script/delay_stage.map | 3 ++ Python_script/deviceaccess_measurement.py | 44 +++++++++++++++++++ Python_script/devices.dmap | 3 ++ Python_script/prototype.py | 18 +++++--- Python_script/test_stand_parameter.json | 1 + .../test_stand_parameters_deviceaccess.json | 25 +++++++++++ Python_script/vna_measurement.py | 3 +- 11 files changed, 152 insertions(+), 61 deletions(-) create mode 100644 Python_script/delay_stage.map create mode 100644 Python_script/deviceaccess_measurement.py create mode 100644 Python_script/devices.dmap create mode 100644 Python_script/test_stand_parameters_deviceaccess.json diff --git a/Python_script/MeasurementPlot.py b/Python_script/MeasurementPlot.py index fd9fb2e..4a8dd66 100644 --- a/Python_script/MeasurementPlot.py +++ b/Python_script/MeasurementPlot.py @@ -11,8 +11,10 @@ class PlottingError(Exception): pass class MeasurementPlot: - def __init__(self, title='', trace_subplot5 ='', legend_loc = 'upper left',\ + def __init__(self, reference_signal_names, title='', trace_subplot5 ='', legend_loc = 'upper left',\ legend_bbox_to_anchor = (1.09, 1)): + self.reference_signal_names = reference_signal_names + # set python for opening an separate plot window when starting from anaconda if 'ipykernel' in sys.modules: from IPython import get_ipython @@ -29,28 +31,28 @@ class MeasurementPlot: self.fig.subplots_adjust(bottom= 0.1, right=0.8, hspace = 0.4) self.fig.suptitle("Measurement "+title, color="red") - # First plot: Phase and magnitude - self.path_collection_phase = self.ax1[0].scatter([], [], c='red', marker='<', label='DUT Phase') + # First plot: signal0 and signal1 + self.path_collection_signal0 = self.ax1[0].scatter([], [], c='red', marker='<', label=reference_signal_names[0]) self.path_collection_fit = self.ax1[0].scatter([], [], c='green', marker='.', label = ' ') - self.magnitude_axis = self.ax1[0].twinx() + self.signal1_axis = self.ax1[0].twinx() - self.path_collection_mag = self.magnitude_axis.scatter([], [], c='#3120E0', marker='4', label='DUT Magnitude') + self.path_collection_signal1 = self.signal1_axis.scatter([], [], c='#3120E0', marker='4', label=reference_signal_names[1]) self.equi_axis0 = self.ax1[0].twinx() self.equi_axis0.spines['right'].set_position(('outward', 75)) self.path_collection_equi0 = self.equi_axis0.scatter([], [], c='black', marker=".", label='Equilibrium_Indicator') self.ax1[0].set_xlabel("TIMESTAMP") - self.ax1[0].set_ylabel("PHASE [°]", color='red') - self.magnitude_axis.set_ylabel("MAGNITUDE [dB]", color='#3120E0') + self.ax1[0].set_ylabel(reference_signal_names[0], color='red') + self.signal1_axis.set_ylabel(reference_signal_names[1], color='#3120E0') self.equi_axis0.set_ylabel("INDICATOR VALUE", color='black') # fix range to 0..31 with some extra margin for plotting self.equi_axis0.set_ylim(-1, 32) self.ax1[0].grid(True, linestyle=":") - all_path_collections = [self.path_collection_phase, self.path_collection_mag, + all_path_collections = [self.path_collection_signal0, self.path_collection_signal1, self.path_collection_equi0, self.path_collection_fit] labels = [pc.get_label() for pc in all_path_collections] - self.phase_legend = self.ax1[0].legend(all_path_collections, labels, loc=self.legend_loc, + self.signal0_legend = self.ax1[0].legend(all_path_collections, labels, loc=self.legend_loc, bbox_to_anchor=self.legend_bbox_to_anchor) ax = self.fig.axes @@ -150,18 +152,18 @@ class MeasurementPlot: self.ax1[3].set_xlim(minimum, maximum) self.ax1[4].set_xlim(minimum, maximum) - # refresh data for phase in subplot for phase and magnitude - phases = data_frame.S21_PHASE - minimum, maximum = self.get_extended_min_max(phases) + # refresh data for signal0 in subplot for signal0 and signal1 + signal0 = data_frame[self.reference_signal_names[0]] + minimum, maximum = self.get_extended_min_max(signal0) self.ax1[0].set_ylim(minimum, maximum) - self.path_collection_phase.set_offsets(np.c_[timestamps, phases]) + self.path_collection_signal0.set_offsets(np.c_[timestamps, signal0]) self.path_collection_fit.set_offsets(np.c_[[], []]) - # refresh data for magnitude in subplot for phase and magnitude - magnitudes = data_frame.S21_MAGNITUDE - minimum, maximum = self.get_extended_min_max(magnitudes) - self.magnitude_axis.set_ylim(minimum, maximum) - self.path_collection_mag.set_offsets(np.c_[timestamps, magnitudes]) + # refresh data for signal1 in subplot for signal0 and signal1 + signal1s = data_frame[self.reference_signal_names[0]] + minimum, maximum = self.get_extended_min_max(signal1s) + self.signal1_axis.set_ylim(minimum, maximum) + self.path_collection_signal1.set_offsets(np.c_[timestamps, signal1s]) # refresh data for chamber temperature in subplot for chamber temperature and humidity temperatures = data_frame.READBACK_TEMPERATURE @@ -296,7 +298,7 @@ if __name__ == '__main__': # logger_sens # heater_dut_chamber - m = MeasurementPlot(trace_subplot5="chamber_sens") + m = MeasurementPlot(['S21_PHASE', 'S21_MAGNITUDE'], trace_subplot5="chamber_sens") plt.ion() measurements = [] diff --git a/Python_script/PostPlot.py b/Python_script/PostPlot.py index 3c185ad..5ff91d6 100644 --- a/Python_script/PostPlot.py +++ b/Python_script/PostPlot.py @@ -11,20 +11,22 @@ class PostPlot: data taking sequence. Optionally, correlation and regression can be calculated and plotted. """ - def __init__(self, trace_subplot5='', legend_loc='upper left', legend_bbox_to_anchor=(1.09, 1)): + def __init__(self, reference_signal_names, trace_subplot5='', legend_loc='upper left', legend_bbox_to_anchor=(1.09, 1)): # set python for opening an separate plot window if 'ipykernel' in sys.modules: from IPython import get_ipython get_ipython().run_line_magic('matplotlib', 'qt') - self.measplot = MeasurementPlot(trace_subplot5=trace_subplot5, + self.measplot = MeasurementPlot(reference_signal_names, trace_subplot5=trace_subplot5, legend_loc=legend_loc, legend_bbox_to_anchor=legend_bbox_to_anchor) self.legend_loc = legend_loc self.legend_bbox_to_anchor = legend_bbox_to_anchor # set parameter figure of class to object parameter figure - self.fig = self.measplot.fig + self.fig = self.measplot.fig + + self.reference_signal_names = reference_signal_names # read csv-file and import data to data frame def import_csv(self, csv_file): @@ -65,7 +67,7 @@ class PostPlot: self.measplot.draw(postplot_data_frame, pdf_name='') # cal PK2PK values of magnitude and phase - PK2PK = self.calc_mag_phase_pkpk_values(postplot_data_frame) + PK2PK = self.calc_pkpk_values(postplot_data_frame) self.edit_annotation_in_plot(annotate_string=PK2PK) @@ -74,15 +76,16 @@ class PostPlot: self.measplot.annotation.set_text(annotate_string) self.measplot.annotation.set_fontsize(anno_fontsize) - def calc_mag_phase_pkpk_values(self, data_frame): + def calc_pkpk_values(self, data_frame): - # calc PK2PK values of magnitude and phase - delta_phase = max(data_frame.S21_PHASE) - min(data_frame.S21_PHASE) - delta_magnitude = max(data_frame.S21_MAGNITUDE) - min(data_frame.S21_MAGNITUDE) + # calc PK2PK values of the two reference signals + delta0 = max(data_frame[self.reference_signal_names[0]]) - min(data_frame[self.reference_signal_names[0]]) + delta1 = max(data_frame[self.reference_signal_names[1]]) - min(data_frame[self.reference_signal_names[1]]) # generate text for annotation in first subplot - delta_vals_string = "$\Delta\phi$($S_{21PkPk}$): %.3f °\n$\Delta$|$S_{21PkPk}$|: %.3f dB" \ - % (delta_phase, delta_magnitude) + # FIXME: This used to contain units. We will need some 'pretty printing' values for the nanes + delta_vals_string = ('$\Delta_{PkPk}$'+self.reference_signal_names[0]+': '+str(delta0)+'\n$\Delta_{PkPk}$'+ + self.reference_signal_names[1]+': '+str(delta1)) return delta_vals_string diff --git a/Python_script/analysis.py b/Python_script/analysis.py index 1bfdd9a..21249a1 100644 --- a/Python_script/analysis.py +++ b/Python_script/analysis.py @@ -3,21 +3,23 @@ import matplotlib.pyplot as plt import numpy as np from matplotlib import gridspec -def extract_stable_data(datafile, measurement_set): +def extract_stable_data(datafile, measurement_set, reference_signal_names): datapoint = {} # df is a pandas data frame df = pd.read_csv(datafile) # extract phase mean and variance for stable measurements (don't ask what loc means) - phases = df.loc[(df['EQUILIBRIUM_INDICATOR'] == 31) & (df['SET_NAME'] == measurement_set), 'S21_PHASE'] - if phases.size == 0: + signal0 = df.loc[(df['EQUILIBRIUM_INDICATOR'] == 31) & (df['SET_NAME'] == measurement_set), + reference_signal_names[0]] + if signal0.size == 0: return None - datapoint['phase_mean']=phases.mean() - datapoint['phase_var']=phases.var() + datapoint['signal0_mean']=signal0.mean() + datapoint['signal0_var']=signal0.var() - magnitudes = df.loc[(df['EQUILIBRIUM_INDICATOR'] == 31) & (df['SET_NAME'] == measurement_set), 'S21_MAGNITUDE'] - datapoint['magnitude_mean'] = magnitudes.mean() - datapoint['magnitude_var'] = magnitudes.var() + signal1 = df.loc[(df['EQUILIBRIUM_INDICATOR'] == 31) & (df['SET_NAME'] == measurement_set), + reference_signal_names[1]] + datapoint['signal1_mean'] = signal1.mean() + datapoint['signal1_var'] = signal1.var() temperatures = df.loc[(df['EQUILIBRIUM_INDICATOR'] == 31) & (df['SET_NAME'] == measurement_set), 'READBACK_TEMPERATURE'] datapoint['temperature_mean'] = temperatures.mean() @@ -31,17 +33,17 @@ def extract_stable_data(datafile, measurement_set): # sweep_type is either 'temperature' or 'humidity' -def plot_sweep(temperatures, humidities, basename, sweep_type, measurement_sets): +def plot_sweep(temperatures, humidities, basename, sweep_type, measurement_sets, reference_signal_names): set_data = {} for measurement_set in measurement_sets: - set_data[measurement_set] = {'phases': [], 'phase_vars': [], 'magnitudes': [], 'magnitude_vars': [], + set_data[measurement_set] = {'signal0_means': [], 'signal0_vars': [], 'signal1_means': [], 'signal1_vars': [], 'x_data': []} for temp, hum in zip(temperatures, humidities): datafile = basename+'_'+str(temp)+'deg_'+str(hum)+'rh.csv' print(datafile) for measurement_set in measurement_sets: - datapoint = extract_stable_data(datafile, measurement_set) + datapoint = extract_stable_data(datafile, measurement_set, reference_signal_names) if datapoint is None: continue @@ -53,10 +55,10 @@ def plot_sweep(temperatures, humidities, basename, sweep_type, measurement_sets) else: raise Exception('Unknown sweep_type:'+str(sweep_type)) - data['phases'].append(datapoint['phase_mean']) - data['phase_vars'].append(datapoint['phase_var']) - data['magnitudes'].append(datapoint['magnitude_mean']) - data['magnitude_vars'].append(datapoint['magnitude_var']) + data['signal0_means'].append(datapoint['signal0_mean']) + data['signal0_vars'].append(datapoint['signal0_var']) + data['signal1_means'].append(datapoint['signal1_mean']) + data['signal1_vars'].append(datapoint['signal1_var']) #fig = plt.figure() #gs = fig.add_gridspec(2, 1, hspace=0) @@ -76,15 +78,15 @@ def plot_sweep(temperatures, humidities, basename, sweep_type, measurement_sets) for measurement_set in measurement_sets: ax1.errorbar(set_data[measurement_set]['x_data'], - set_data[measurement_set]['phases'], set_data[measurement_set]['phase_vars'], + set_data[measurement_set]['signal0_means'], set_data[measurement_set]['signal0_vars'], label=measurement_set, marker='+', linewidth=0) - ax1.set_ylabel('S21 phase [deg]') + ax1.set_ylabel(reference_signal_names[0]) for measurement_set in measurement_sets: ax2.errorbar(set_data[measurement_set]['x_data'], - set_data[measurement_set]['magnitudes'], set_data[measurement_set]['magnitude_vars'], + set_data[measurement_set]['signal1_means'], set_data[measurement_set]['signal1_vars'], label=measurement_set, marker='+', linewidth=0) - ax2.set_ylabel('S21 magnitude [dB]') + ax2.set_ylabel(reference_signal_names[1]) # Remove the highest tick label from the lower subplot. It probably overlaps with the lowest one of the upper plot. yticks = ax2.yaxis.get_major_ticks() @@ -103,4 +105,4 @@ def plot_sweep(temperatures, humidities, basename, sweep_type, measurement_sets) if __name__ == '__main__': print('run \'./prototype.py -t first_tempsweep.txt -p -o tempsweep1\' to get the data needed for this plot.' ) plot_sweep(np.arange(25., 31.+1.), [35.]*7, 'tempsweep1', 'temperature', - ['1.3GHz', '1.0GHz', '3.0GHz', '6.0GHz', '10.0GHz']) + ['1.3GHz', '1.0GHz', '3.0GHz', '6.0GHz', '10.0GHz'], ['S21_PHASE', 'S21_MAGNITUDE']) diff --git a/Python_script/climate-lab-gui.py b/Python_script/climate-lab-gui.py index 3f58f3e..8027d24 100755 --- a/Python_script/climate-lab-gui.py +++ b/Python_script/climate-lab-gui.py @@ -85,10 +85,11 @@ class TestStandMainWindow(QMainWindow): for t in temperatures: temp_extensions.append(str(t) + 'deg_' + str(self.fixedParameter.value()) + 'rh') analysis.plot_sweep(temperatures, [self.fixedParameter.value()] * len(temperatures), output_basename, - 'temperature', meas.dut.get_measurement_set_names()) + 'temperature', meas.dut.get_measurement_set_names(), + meas.dut.get_dut_reference_signal_names()) prototype.plot_output(output_basename, temp_extensions, True, config_data, ext_sensor_channels, - meas.dut.get_measurement_set_names(), + meas.dut.get_measurement_set_names(), meas.dut.get_dut_reference_signal_names(), output_basename + ': Temperature sweep ' + str(temperatures[0]) + '--' + str(temperatures[-1]) + ' degC @ ' + str(self.fixedParameter.value()) + ' % r.h.') @@ -101,10 +102,11 @@ class TestStandMainWindow(QMainWindow): for h in humidities: hum_extensions.append(str(self.fixedParameter.value()) + 'deg_' + str(h) + 'rh') analysis.plot_sweep([self.fixedParameter.value()] * len(humidities), humidities, output_basename, - 'humidity', meas.dut.get_measurement_set_names()) + 'humidity', meas.dut.get_measurement_set_names(), + meas.dut.get_dut_reference_signal_names()) prototype.plot_output(output_basename, hum_extensions, True, config_data, ext_sensor_channels, - meas.dut.get_measurement_set_names(), + meas.dut.get_measurement_set_names(), meas.dut.get_dut_reference_signal_names(), output_basename + ': Humidity sweep ' + str(humidities[0]) + '--' + str(humidities[-1]) + ' % r.h. @ ' + str(self.fixedParameter.value()) + ' degC') @@ -114,6 +116,7 @@ class TestStandMainWindow(QMainWindow): self.measurementFile.text())) prototype.plot_output(output_basename, range(n_measurements), True, config_data, ext_sensor_channels, meas.dut.get_measurement_set_names(), + meas.dut.get_dut_reference_signal_names(), output_basename) except FileNotFoundError as e: QtWidgets.QMessageBox.warning(self, 'Warning', str(e)) diff --git a/Python_script/delay_stage.map b/Python_script/delay_stage.map new file mode 100644 index 0000000..68daa88 --- /dev/null +++ b/Python_script/delay_stage.map @@ -0,0 +1,3 @@ +RB_ENCODER 1 0 4 0 +POSITION_SP 1 4 4 0 +SPEED 1 8 4 0 diff --git a/Python_script/deviceaccess_measurement.py b/Python_script/deviceaccess_measurement.py new file mode 100644 index 0000000..31493e7 --- /dev/null +++ b/Python_script/deviceaccess_measurement.py @@ -0,0 +1,44 @@ + +import dut_measurement +import deviceaccess +import numpy + + +class DeviceAccessMeasurement(dut_measurement.DutMeasurement): + def __init__(self, config_data): + + self.deltas = config_data['deltas'] + + deviceaccess.setDMapFilePath(config_data['dmap_file']) + self.device = deviceaccess.Device(config_data['device_alias']) + self.device.open() + + self.reference_signal_names = config_data['reference_signals'] + + self.accessors = {} + for signal_name, register_path in config_data['signals'].items(): + self.accessors[signal_name] = self.device.getScalarRegisterAccessor(numpy.double, register_path) + + def get_dut_measurements(self, set_name): + retval = {} + + for name, accessor in self.accessors.items(): + accessor.read() + retval[name] = accessor[0] + retval['SET_NAME'] = 'default' + return retval + + def get_dut_signal_names(self): + retval = list(self.accessors.keys()) + retval.append('SET_NAME') + return retval + + + def get_dut_reference_signal_names(self): + return self.reference_signal_names + + def get_dut_max_delta_signals(self): + return self.deltas + + def get_measurement_set_names(self): + return ['default'] diff --git a/Python_script/devices.dmap b/Python_script/devices.dmap new file mode 100644 index 0000000..7ebc868 --- /dev/null +++ b/Python_script/devices.dmap @@ -0,0 +1,3 @@ +@LOAD_LIB /usr/lib/x86_64-linux-gnu/libChimeraTK-DeviceAccess-DoocsBackend.so +delay_stage (sharedMemoryDummy?map=delay_stage.map) +#delay_stage (doocs?/MY_FACILITY/MY_DEVICE/MY_LOCATION) diff --git a/Python_script/prototype.py b/Python_script/prototype.py index 13354cd..7f0faf8 100755 --- a/Python_script/prototype.py +++ b/Python_script/prototype.py @@ -7,6 +7,7 @@ import pandas as pd import matplotlib.pyplot as plt import climate_chamber import vna_measurement +import deviceaccess_measurement import virtual_time import json import MeasurementPlot @@ -62,6 +63,8 @@ class Measurements: # FIXME: Do we want a factory function for the DUTs? if config_data['dut']['type'] == 'VNA': self.dut = vna_measurement.VnaMeasurement(config_data['dut'], target_accuracy) + elif config_data['dut']['type'] == 'DeviceAccess': + self.dut = deviceaccess_measurement.DeviceAccessMeasurement(config_data['dut']) else: raise Exception('Unknown DUT type: '+config_data['dut']['type']) @@ -80,7 +83,8 @@ class Measurements: self.postplot_obj = None - self.measurement_plot = MeasurementPlot.MeasurementPlot(trace_subplot5=config_data['trace_subplot5']) + self.measurement_plot = MeasurementPlot.MeasurementPlot(self.dut.get_dut_reference_signal_names(), + trace_subplot5=config_data['trace_subplot5']) self.data_collection_for_online_plot = [] def perform_measurements(self, sweep_file): @@ -373,14 +377,14 @@ class Measurements: def plot_output(output_basename, measurements_appendices, show_blocking_plot, config_data, ext_sens_data, - measurement_set_names, title=''): + measurement_set_names, reference_signal_names, title=''): time_unit = str(config_data['time_unit']) list_of_frames = [] storepath = os.path.join(os.getcwd(), 'PostPlots') - post_plot = PostPlot.PostPlot(trace_subplot5=config_data['trace_subplot5']) + post_plot = PostPlot.PostPlot(reference_signal_names, trace_subplot5=config_data['trace_subplot5']) for index, m in enumerate(measurements_appendices): measurement_name = output_basename+'_'+str(m) list_of_frames.append(pd.read_csv(measurement_name+'.csv')) @@ -398,7 +402,7 @@ def plot_output(output_basename, measurements_appendices, show_blocking_plot, co if show_blocking_plot: plt.ioff() - plot = MeasurementPlot.MeasurementPlot(title = title, trace_subplot5 = \ + plot = MeasurementPlot.MeasurementPlot(reference_signal_names, title = title, trace_subplot5 = \ config_data['trace_subplot5'] ) plot.draw(combined_data_frame, output_basename + '_graph.pdf') @@ -466,7 +470,7 @@ if __name__ == '__main__': if args.file: n_measurements = mes.perform_measurements(args.file) plot_output(output_basename, range(n_measurements), args.plot, config_data, ext_sensor_channels, - mes.dut.get_measurement_set_names(), output_basename) + mes.dut.get_measurement_set_names(), mes.dut.get_dut_reference_signal_names(), output_basename) if args.temperaturesweepfile: temperatures, humidity = run_temperature_sweep_from_file(args.temperaturesweepfile, mes) # run analysis here @@ -474,9 +478,9 @@ if __name__ == '__main__': for t in temperatures: temp_extensions.append(str(t)+'deg_'+str(humidity)+'rh') analysis.plot_sweep(temperatures, [humidity]*len(temperatures), output_basename, 'temperature', - mes.dut.get_measurement_set_names()) + mes.dut.get_measurement_set_names(), mes.dut.get_dut_reference_signal_names()) plot_output(output_basename, temp_extensions, args.plot, config_data, ext_sensor_channels, - mes.dut.get_measurement_set_names(), + mes.dut.get_measurement_set_names(), mes.dut.get_dut_reference_signal_names(), output_basename + ': Temperature sweep ' + str(temperatures[0]) + ' degC to ' + str(temperatures[-1]) + ' degC') finally: diff --git a/Python_script/test_stand_parameter.json b/Python_script/test_stand_parameter.json index 56a0a24..dc0e5a7 100644 --- a/Python_script/test_stand_parameter.json +++ b/Python_script/test_stand_parameter.json @@ -5,6 +5,7 @@ "type": "VNA", "delta_mag": 0.13, "delta_phase": 1.5, + "reference_signals" : ["S21_PHASE", "S21_MAGNITUDE"], "frequencies": [1300000000, 1000000000, 3000000000, 6000000000, 10000000000], "vna_ip": "mskzna43-lab", "vna_config_file": "CalSetup2.znxml" diff --git a/Python_script/test_stand_parameters_deviceaccess.json b/Python_script/test_stand_parameters_deviceaccess.json new file mode 100644 index 0000000..1e43ea3 --- /dev/null +++ b/Python_script/test_stand_parameters_deviceaccess.json @@ -0,0 +1,25 @@ +{ + "delta_temp": 0.1, + "delta_hum": 1, + "dut": { + "type": "DeviceAccess", + "deltas": [0.13, 1.5], + "reference_signals" : ["encoder_position","target_position"], + "FIXME_dmap_file" : "FIXME has to be absolute path at the moment FIXME", + "dmap_file" : "/home/killenb/climate-lab-test-stand/Python_script/devices.dmap", + "device_alias": "delay_stage", + "signals" : { + "encoder_position" : "RB_ENCODER", + "target_position" : "POSITION_SP", + "speed": "SPEED" + } + }, + "sleep_time": 10, + "chamber_ip": "localhost", + "instr_chamber_ip": "localhost", + "data_folder": "measurements", + "logger_ip": "localhost", + "time_unit": "min", + "trace_subplot5": "logger_sens", + "logger_model": "710" +} diff --git a/Python_script/vna_measurement.py b/Python_script/vna_measurement.py index f6be599..3a80d11 100644 --- a/Python_script/vna_measurement.py +++ b/Python_script/vna_measurement.py @@ -12,6 +12,7 @@ class VnaMeasurement(dut_measurement.DutMeasurement): def __init__(self, config_data, target_accuracy): self.delta_mag = config_data['delta_mag'] self.delta_phase = config_data['delta_phase'] + self.reference_signal_names = config_data['reference_signals'] self.vna = VNA.create_vna(config_data['vna_ip'], target_accuracy) @@ -68,7 +69,7 @@ class VnaMeasurement(dut_measurement.DutMeasurement): 'S12_PHASE', 'S21_MAGNITUDE', 'S21_PHASE', 'S22_MAGNITUDE', 'S22_PHASE', 'SET_NAME'] def get_dut_reference_signal_names(self): - return ['S21_MAGNITUDE', 'S21_PHASE'] + return self.reference_signal_names def get_dut_max_delta_signals(self): return [self.delta_mag, self.delta_phase] -- GitLab