qcodespp 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qcodespp/__init__.py +77 -0
- qcodespp/actions.py +237 -0
- qcodespp/data/__init__.py +0 -0
- qcodespp/data/data_array.py +555 -0
- qcodespp/data/data_set.py +926 -0
- qcodespp/data/format.py +338 -0
- qcodespp/data/gnuplot_format.py +425 -0
- qcodespp/data/hdf5_format.py +537 -0
- qcodespp/data/hdf5_format_hickle.py +63 -0
- qcodespp/data/io.py +241 -0
- qcodespp/data/location.py +171 -0
- qcodespp/instrument_drivers/Keysight/Keysight_34450A.py +9 -0
- qcodespp/instrument_drivers/Keysight/__init__.py +0 -0
- qcodespp/instrument_drivers/Keysight/private/Keysight_344xxA.py +456 -0
- qcodespp/instrument_drivers/Keysight/private/__init__.py +0 -0
- qcodespp/instrument_drivers/Lakeshore/Model_340.py +483 -0
- qcodespp/instrument_drivers/Lakeshore/__init__.py +0 -0
- qcodespp/instrument_drivers/QDevil/159fit_params_high_latest.json +386 -0
- qcodespp/instrument_drivers/QDevil/159fit_params_low_latest.json +386 -0
- qcodespp/instrument_drivers/QDevil/QDAC2.py +3229 -0
- qcodespp/instrument_drivers/QDevil/QDAC2_Array.py +300 -0
- qcodespp/instrument_drivers/QDevil/QSwitch_elab.py +652 -0
- qcodespp/instrument_drivers/QDevil/__init__.py +0 -0
- qcodespp/instrument_drivers/ZI/ZIHF2LI.py +415 -0
- qcodespp/instrument_drivers/ZI/ZIMFLI.py +764 -0
- qcodespp/instrument_drivers/ZI/ZIMFLI_sync.py +108 -0
- qcodespp/instrument_drivers/ZI/ZIUHFLI.py +2179 -0
- qcodespp/instrument_drivers/ZI/__init__.py +1 -0
- qcodespp/instrument_drivers/__init__.py +0 -0
- qcodespp/instrument_drivers/cryogenic/CryogenicSMS120C.py +599 -0
- qcodespp/instrument_drivers/cryogenic/__init__.py +0 -0
- qcodespp/instrument_drivers/instrument_mocks.py +379 -0
- qcodespp/instrument_drivers/multiplexer_instrument.py +287 -0
- qcodespp/instrument_drivers/national_instruments/PXI_4461.py +451 -0
- qcodespp/instrument_drivers/national_instruments/PXI_4462.py +290 -0
- qcodespp/instrument_drivers/national_instruments/PXI_6259.py +436 -0
- qcodespp/instrument_drivers/national_instruments/PXI_6733.py +230 -0
- qcodespp/instrument_drivers/national_instruments/PXI_6733_e.py +243 -0
- qcodespp/instrument_drivers/national_instruments/__init__.py +0 -0
- qcodespp/instrument_drivers/oxford/__init__.py +0 -0
- qcodespp/instrument_drivers/oxford/mercuryiPS_serial.py +658 -0
- qcodespp/instrument_drivers/oxford/triton.py +434 -0
- qcodespp/instrument_drivers/tektronix/Keithley_2000_Scan.py +65 -0
- qcodespp/instrument_drivers/tektronix/Keithley_2182a.py +190 -0
- qcodespp/instrument_drivers/tektronix/Keithley_2400.py +158 -0
- qcodespp/instrument_drivers/tektronix/Keithley_2450.py +242 -0
- qcodespp/instrument_drivers/tektronix/Keithley_2700.py +397 -0
- qcodespp/instrument_drivers/tektronix/Keithley_6500.py +161 -0
- qcodespp/instrument_drivers/tektronix/__init__.py +0 -0
- qcodespp/instrument_drivers/yokogawa/GS200.py +513 -0
- qcodespp/instrument_drivers/yokogawa/__init__.py +0 -0
- qcodespp/loops.py +1342 -0
- qcodespp/measure.py +310 -0
- qcodespp/parameters.py +311 -0
- qcodespp/plotting/RemotePlot.py +469 -0
- qcodespp/plotting/RemotePlotClient.py +367 -0
- qcodespp/plotting/RemoteQtPlotWidgets.py +871 -0
- qcodespp/plotting/__init__.py +0 -0
- qcodespp/plotting/analysis_tools.py +195 -0
- qcodespp/plotting/colors.py +135 -0
- qcodespp/plotting/offline/__init__.py +0 -0
- qcodespp/plotting/offline/datatypes.py +999 -0
- qcodespp/plotting/offline/design.py +906 -0
- qcodespp/plotting/offline/design.ui +1578 -0
- qcodespp/plotting/offline/editor.py +2966 -0
- qcodespp/plotting/offline/filters.py +561 -0
- qcodespp/plotting/offline/fits.py +1171 -0
- qcodespp/plotting/offline/helpers.py +288 -0
- qcodespp/plotting/offline/iconGadget.png +0 -0
- qcodespp/plotting/offline/main.py +55 -0
- qcodespp/plotting/offline/popupwindows.py +1848 -0
- qcodespp/plotting/offline/qcodes_pp_extension.py +328 -0
- qcodespp/plotting/offline/sidebars.py +1108 -0
- qcodespp/station.py +290 -0
- qcodespp/utils/__init__.py +0 -0
- qcodespp/utils/helpers.py +618 -0
- qcodespp/utils/visa_helpers.py +61 -0
- qcodespp/version.py +12 -0
- qcodespp-0.1.0.dist-info/METADATA +91 -0
- qcodespp-0.1.0.dist-info/RECORD +82 -0
- qcodespp-0.1.0.dist-info/WHEEL +4 -0
- qcodespp-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import os
|
|
3
|
+
import json
|
|
4
|
+
from qcodespp.data.data_set import load_data
|
|
5
|
+
from qcodespp.plotting.offline.datatypes import BaseClassData
|
|
6
|
+
|
|
7
|
+
class qcodesppData(BaseClassData):
|
|
8
|
+
|
|
9
|
+
def __init__(self, filepath, canvas, metapath, load_the_data=True):
|
|
10
|
+
super().__init__(filepath, canvas)
|
|
11
|
+
# Open meta file and set label
|
|
12
|
+
self.filepath = filepath
|
|
13
|
+
with open(metapath) as f:
|
|
14
|
+
self.meta = json.load(f)
|
|
15
|
+
dirname = os.path.basename(os.path.dirname(metapath))
|
|
16
|
+
# timestamp = self.meta['timestamp'].split(' ')[1]
|
|
17
|
+
|
|
18
|
+
self.label = f'{dirname.split('#')[1]}'
|
|
19
|
+
# self.raw_data = None
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
self.independent_parameters = []
|
|
23
|
+
self.independent_parameter_names = []
|
|
24
|
+
self.dependent_parameters = []
|
|
25
|
+
self.dependent_parameter_names = []
|
|
26
|
+
self.all_parameters = []
|
|
27
|
+
self.all_parameter_names = []
|
|
28
|
+
|
|
29
|
+
self.channels = self.meta['arrays']
|
|
30
|
+
|
|
31
|
+
self.plot_type=None
|
|
32
|
+
|
|
33
|
+
if load_the_data:
|
|
34
|
+
if '.dat' in filepath:
|
|
35
|
+
self.dataset=load_data(os.path.dirname(filepath))
|
|
36
|
+
else:
|
|
37
|
+
self.dataset=load_data(filepath)
|
|
38
|
+
self.data_dict = self.dataset.arrays.copy()
|
|
39
|
+
|
|
40
|
+
self.identify_independent_vars()
|
|
41
|
+
|
|
42
|
+
self.prepare_dataset()
|
|
43
|
+
|
|
44
|
+
self.data_loaded=True
|
|
45
|
+
|
|
46
|
+
else:
|
|
47
|
+
self.data_loaded=False
|
|
48
|
+
self.dataset=None
|
|
49
|
+
|
|
50
|
+
self.index_x = 0
|
|
51
|
+
self.index_y = 1
|
|
52
|
+
|
|
53
|
+
#self.dataset_id = "#" + self.dataset.location.split("#", 1)[1].split("_", 1)[0]
|
|
54
|
+
self.dataset_id = "#" + dirname.split("#", 1)[1].split("_", 1)[0]
|
|
55
|
+
self.settings["title"] = '#'+self.label#[:120]#self.dataset_id
|
|
56
|
+
self.DEFAULT_PLOT_SETTINGS['title']= '#'+self.label#[:120]#self.dataset_id
|
|
57
|
+
|
|
58
|
+
def prepare_dataset(self):
|
|
59
|
+
pars = list(self.data_dict.keys())
|
|
60
|
+
self.dims = self.data_dict[pars[1]].shape
|
|
61
|
+
|
|
62
|
+
if len(self.independent_parameters) > 1:
|
|
63
|
+
pars = list(self.data_dict.keys())
|
|
64
|
+
self.dims = self.data_dict[pars[1]].shape
|
|
65
|
+
if len(self.data_dict[self.all_parameters[0]["array_id"]]) < self.dims[0]*self.dims[1]:
|
|
66
|
+
self.data_dict[self.all_parameters[0]["array_id"]] = np.repeat(self.data_dict[self.all_parameters[0]["array_id"]], self.dims[1])
|
|
67
|
+
self.dim=3
|
|
68
|
+
|
|
69
|
+
else:
|
|
70
|
+
self.dim=2
|
|
71
|
+
|
|
72
|
+
def isFinished(self):
|
|
73
|
+
self.set_x = self.data_dict[self.all_parameters[0]["array_id"]]
|
|
74
|
+
self.set_x = np.unique(self.set_x[~np.isnan(self.set_x)])
|
|
75
|
+
return len(self.set_x) == self.dims[0]
|
|
76
|
+
|
|
77
|
+
def finished_dimensions(self):
|
|
78
|
+
self.dims = [len(self.set_x)-1, self.dims[1]]
|
|
79
|
+
|
|
80
|
+
def get_column_data(self, line=None):
|
|
81
|
+
if line is not None:
|
|
82
|
+
Xdataname = self.plotted_lines[line]['X data']
|
|
83
|
+
Ydataname = self.plotted_lines[line]['Y data']
|
|
84
|
+
else:
|
|
85
|
+
Xdataname = self.settings['X data']
|
|
86
|
+
Ydataname = self.settings['Y data']
|
|
87
|
+
self.prepare_dataset()
|
|
88
|
+
# If user has selected X data, use that, otherwise use the first independent parameter
|
|
89
|
+
# X data is the same no matter the data dimension
|
|
90
|
+
|
|
91
|
+
xdata = self.data_dict[Xdataname]
|
|
92
|
+
try:
|
|
93
|
+
self.settings['xlabel'] = f'{self.channels[Xdataname]['label']} ({self.channels[Xdataname]['unit']})'
|
|
94
|
+
except KeyError:
|
|
95
|
+
self.settings['xlabel'] = Xdataname
|
|
96
|
+
|
|
97
|
+
if len(self.independent_parameters) == 1: # data is 1D
|
|
98
|
+
ydata = self.data_dict[Ydataname]
|
|
99
|
+
try:
|
|
100
|
+
self.settings['ylabel'] = f'{self.channels[Ydataname]['label']} ({self.channels[Ydataname]['unit']})'
|
|
101
|
+
except KeyError:
|
|
102
|
+
self.settings['ylabel'] = Ydataname
|
|
103
|
+
|
|
104
|
+
if not self.isFinished():
|
|
105
|
+
# Delete unfinished rows to enable plotting
|
|
106
|
+
xdata = xdata[:len(self.set_x)-1]
|
|
107
|
+
ydata = ydata[:len(self.set_x)-1]
|
|
108
|
+
if len(xdata)==len(ydata):
|
|
109
|
+
column_data = np.column_stack((xdata, ydata))
|
|
110
|
+
else:
|
|
111
|
+
column_data = np.zeros((2,2))
|
|
112
|
+
# This can happen if the user has run statistics, and is trying to plot the result; if they change only
|
|
113
|
+
# the X data, the length of the data won't match the Y data until they then select the correct thing.
|
|
114
|
+
# So, just plot nothing until the user selects something sensible.
|
|
115
|
+
|
|
116
|
+
self.settings['default_xlabel'] = self.settings['xlabel']
|
|
117
|
+
self.settings['default_ylabel'] = self.settings['ylabel']
|
|
118
|
+
self.settings['default_histlabel'] = self.settings['default_ylabel']
|
|
119
|
+
self.settings['default_fftxlabel'] = f'1/{self.settings['default_xlabel']}'
|
|
120
|
+
|
|
121
|
+
elif len(self.independent_parameters) > 1: # data is 2D
|
|
122
|
+
ydata = self.data_dict[self.settings['Y data']]
|
|
123
|
+
self.settings['ylabel'] = f'{self.channels[self.settings['Y data']]['label']} ({self.channels[self.settings['Y data']]['unit']})'
|
|
124
|
+
zdata = self.data_dict[self.settings['Z data']]
|
|
125
|
+
self.settings['clabel'] = f'{self.channels[self.settings['Z data']]['label']} ({self.channels[self.settings['Z data']]['unit']})'
|
|
126
|
+
|
|
127
|
+
column_data = np.column_stack((xdata.flatten(),
|
|
128
|
+
ydata.flatten(),
|
|
129
|
+
zdata.flatten()
|
|
130
|
+
))
|
|
131
|
+
|
|
132
|
+
self.settings['default_xlabel'] = self.settings['xlabel']
|
|
133
|
+
self.settings['default_ylabel'] = self.settings['ylabel']
|
|
134
|
+
self.settings['default_clabel'] = self.settings['clabel']
|
|
135
|
+
self.settings['default_histlabel'] = self.settings['default_clabel']
|
|
136
|
+
self.settings['default_fftxlabel'] = f'1/{self.settings['default_xlabel']}'
|
|
137
|
+
self.settings['default_fftylabel'] = f'1/{self.settings['default_ylabel']}'
|
|
138
|
+
|
|
139
|
+
# # Delete unfinished rows to enable plotting
|
|
140
|
+
if not self.isFinished():
|
|
141
|
+
self.finished_dimensions()
|
|
142
|
+
|
|
143
|
+
column_data = column_data[~np.isnan(column_data).any(axis=1)]
|
|
144
|
+
column_data = column_data[~np.isnan(column_data[:,0])]
|
|
145
|
+
column_data = column_data[:self.dims[0]*self.dims[1]]
|
|
146
|
+
|
|
147
|
+
else:
|
|
148
|
+
return np.empty((1,1))
|
|
149
|
+
|
|
150
|
+
self.measured_data_points = column_data.shape[0]
|
|
151
|
+
|
|
152
|
+
return column_data
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def load_and_reshape_data(self, reload_data=False,reload_from_file=True,linefrompopup=None):
|
|
156
|
+
if not self.data_loaded or reload_data and reload_from_file:
|
|
157
|
+
if '.dat' in self.filepath:
|
|
158
|
+
self.dataset=load_data(os.path.dirname(self.filepath))
|
|
159
|
+
else:
|
|
160
|
+
self.dataset=load_data(self.filepath)
|
|
161
|
+
self.data_dict = self.dataset.arrays.copy()
|
|
162
|
+
|
|
163
|
+
self.identify_independent_vars()
|
|
164
|
+
|
|
165
|
+
self.prepare_dataset()
|
|
166
|
+
|
|
167
|
+
self.data_loaded=True
|
|
168
|
+
|
|
169
|
+
column_data = self.get_column_data(line=linefrompopup)
|
|
170
|
+
if column_data.ndim == 1: # if empty array or single-row array
|
|
171
|
+
self.raw_data = None
|
|
172
|
+
else:
|
|
173
|
+
# # Determine the number of unique values in the first column to determine the shape of the data
|
|
174
|
+
columns = self.get_columns()
|
|
175
|
+
data_shape = self.dims
|
|
176
|
+
|
|
177
|
+
if data_shape[0] > 1: # If two or more sweeps are finished
|
|
178
|
+
|
|
179
|
+
# Determine if file is 1D or 2D by checking if first two values in first column are repeated
|
|
180
|
+
if len(data_shape) == 1:
|
|
181
|
+
self.raw_data = [column_data[:,x] for x in range(column_data.shape[1])]
|
|
182
|
+
columns = columns[:2]
|
|
183
|
+
else:
|
|
184
|
+
# flip if first column is sorted from high to low
|
|
185
|
+
if column_data[:,columns[0]][-1] < column_data[:,columns[0]][0]:
|
|
186
|
+
column_data = np.flipud(column_data)
|
|
187
|
+
self.udflipped=True
|
|
188
|
+
self.raw_data = [np.reshape(column_data[:,x], data_shape)
|
|
189
|
+
for x in range(column_data.shape[1])]
|
|
190
|
+
# flip if second column is sorted from high to low
|
|
191
|
+
if self.raw_data[1][0,0] > self.raw_data[1][0,1]:
|
|
192
|
+
self.raw_data = [np.fliplr(self.raw_data[x]) for x in range(column_data.shape[1])]
|
|
193
|
+
self.lrflipped=True
|
|
194
|
+
|
|
195
|
+
elif data_shape[0] == 1: # if first two sweeps are not finished -> duplicate data of first sweep to enable 3D plotting
|
|
196
|
+
self.raw_data = [np.tile(column_data[:data_shape[1],x], (2,1)) for x in range(column_data.shape[1])]
|
|
197
|
+
|
|
198
|
+
self.raw_data[columns[0]][0,:] = columns[0]-1
|
|
199
|
+
self.raw_data[columns[0]][1,:] = columns[0]+1
|
|
200
|
+
else:
|
|
201
|
+
self.raw_data = None
|
|
202
|
+
|
|
203
|
+
self.settings['columns'] = ','.join([str(i) for i in columns])
|
|
204
|
+
|
|
205
|
+
def identify_independent_vars(self):
|
|
206
|
+
for chan in self.channels.keys():
|
|
207
|
+
if self.channels[chan]["array_id"] not in self.all_parameter_names:
|
|
208
|
+
if self.channels[chan]["is_setpoint"] and self.channels[chan]["array_id"] in list(self.dataset.arrays.keys()):
|
|
209
|
+
self.independent_parameters.append(self.channels[chan])
|
|
210
|
+
self.independent_parameter_names.append(self.channels[chan]["array_id"])
|
|
211
|
+
elif self.channels[chan]["array_id"] in list(self.dataset.arrays.keys()):
|
|
212
|
+
self.dependent_parameters.append(self.channels[chan])
|
|
213
|
+
self.dependent_parameter_names.append(self.channels[chan]["array_id"])
|
|
214
|
+
self.all_parameters = self.independent_parameters + self.dependent_parameters
|
|
215
|
+
self.all_parameter_names = self.independent_parameter_names + self.dependent_parameter_names
|
|
216
|
+
|
|
217
|
+
# Default to conductance as dependent variable if present.
|
|
218
|
+
defnamefound=False
|
|
219
|
+
for paramname in ['onductance','esistance', 'urr', 'olt']:
|
|
220
|
+
for name in self.dependent_parameter_names:
|
|
221
|
+
if not defnamefound:
|
|
222
|
+
if paramname in name:
|
|
223
|
+
self.index_dependent_parameter = self.dependent_parameter_names.index(name)
|
|
224
|
+
defnamefound=True
|
|
225
|
+
if not defnamefound:
|
|
226
|
+
self.index_dependent_parameter = 0
|
|
227
|
+
|
|
228
|
+
if 'X data' not in self.settings.keys() or self.settings['X data'] == '':
|
|
229
|
+
self.settings['X data'] = self.independent_parameter_names[0]
|
|
230
|
+
|
|
231
|
+
if len(self.independent_parameters) > 1:
|
|
232
|
+
if 'Y data' not in self.settings.keys() or self.settings['Y data'] == '':
|
|
233
|
+
self.settings['Y data'] = self.independent_parameter_names[1]
|
|
234
|
+
if 'Z data' not in self.settings.keys() or self.settings['Z data'] == '':
|
|
235
|
+
self.settings['Z data'] = self.dependent_parameter_names[self.index_dependent_parameter]
|
|
236
|
+
|
|
237
|
+
else:
|
|
238
|
+
if 'Y data' not in self.settings.keys() or self.settings['Y data'] == '':
|
|
239
|
+
self.settings['Y data'] = self.dependent_parameter_names[self.index_dependent_parameter]
|
|
240
|
+
|
|
241
|
+
self.settings.pop('Z data', None)
|
|
242
|
+
|
|
243
|
+
self.settings_menu_options = {'X data': self.all_parameter_names,
|
|
244
|
+
'Y data': self.all_parameter_names,
|
|
245
|
+
'Z data': self.all_parameter_names}
|
|
246
|
+
|
|
247
|
+
negparamnames=[f'-{name}' for name in self.all_parameter_names]
|
|
248
|
+
allnames=np.hstack((self.all_parameter_names,negparamnames))
|
|
249
|
+
self.filter_menu_options = {'Multiply': allnames,
|
|
250
|
+
'Divide': allnames,
|
|
251
|
+
'Add/Subtract': allnames}
|
|
252
|
+
|
|
253
|
+
def init_plotted_lines(self):
|
|
254
|
+
self.plotted_lines = {0: {'checkstate': 2,
|
|
255
|
+
'X data': self.independent_parameter_names[0],
|
|
256
|
+
'Y data': self.dependent_parameter_names[1],
|
|
257
|
+
'Bins': 100,
|
|
258
|
+
'Xerr': 0,
|
|
259
|
+
'Yerr': 0,
|
|
260
|
+
'raw_data': self.raw_data,
|
|
261
|
+
'processed_data': self.processed_data,
|
|
262
|
+
'linecolor': (0.1, 0.5, 0.8, 1),
|
|
263
|
+
'linewidth': 1.5,
|
|
264
|
+
'linestyle': '-',
|
|
265
|
+
'filters': []}}
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def apply_single_filter(self, processed_data, filt):
|
|
269
|
+
if filt.name in ['Multiply', 'Divide', 'Add/Subtract']:
|
|
270
|
+
if filt.settings[0][0]=='-':
|
|
271
|
+
arrayname=filt.settings[0][1:]
|
|
272
|
+
setting2='-'
|
|
273
|
+
else:
|
|
274
|
+
arrayname=filt.settings[0]
|
|
275
|
+
setting2='+'
|
|
276
|
+
if arrayname in self.all_parameter_names:
|
|
277
|
+
if self.dim==3:
|
|
278
|
+
array=self.data_dict[arrayname][:self.dims[0]][:self.dims[1]]
|
|
279
|
+
else:
|
|
280
|
+
array=self.data_dict[arrayname][:self.dims[0]]
|
|
281
|
+
if hasattr(self,'udflipped'):
|
|
282
|
+
array=np.flipud(array)
|
|
283
|
+
if hasattr(self,'lrflipped'):
|
|
284
|
+
array=np.fliplr(array)
|
|
285
|
+
else:
|
|
286
|
+
array=None
|
|
287
|
+
processed_data = filt.function(processed_data,
|
|
288
|
+
filt.method,
|
|
289
|
+
filt.settings[0],
|
|
290
|
+
setting2,
|
|
291
|
+
array)
|
|
292
|
+
else:
|
|
293
|
+
processed_data = filt.function(processed_data,
|
|
294
|
+
filt.method,
|
|
295
|
+
filt.settings[0],
|
|
296
|
+
filt.settings[1])
|
|
297
|
+
|
|
298
|
+
return processed_data
|
|
299
|
+
|
|
300
|
+
def filttocol(self, axis):
|
|
301
|
+
axes={'X': 0, 'Y': 1, 'Z': 2}
|
|
302
|
+
if hasattr(self, 'sidebar1D'):
|
|
303
|
+
current_1D_row = self.sidebar1D.trace_table.currentRow()
|
|
304
|
+
current_line = int(self.sidebar1D.trace_table.item(current_1D_row,0).text())
|
|
305
|
+
processed_data = self.plotted_lines[current_line]['processed_data'][axes[axis]]
|
|
306
|
+
paramname = self.plotted_lines[current_line][f'{axis} data']
|
|
307
|
+
self.all_parameter_names.append(f'Filtered: {paramname}')
|
|
308
|
+
self.data_dict[f'Filtered: {paramname}'] = processed_data
|
|
309
|
+
self.channels[f'Filtered: {paramname}'] = {'label': f'Filtered: {paramname}',
|
|
310
|
+
'unit': self.channels[paramname]['unit'],
|
|
311
|
+
'array_id': f'Filtered: {paramname}',
|
|
312
|
+
'is_setpoint': False}
|
|
313
|
+
else:
|
|
314
|
+
processed_data = self.processed_data[axes[axis]]
|
|
315
|
+
paramname = self.settings[f'{axis} data']
|
|
316
|
+
self.all_parameter_names.append(f'Filtered: {paramname}')
|
|
317
|
+
self.data_dict[f'Filtered: {paramname}'] = processed_data
|
|
318
|
+
self.channels[f'Filtered: {paramname}'] = {'label': f'Filtered: {paramname}',
|
|
319
|
+
'unit': self.channels[paramname]['unit'],
|
|
320
|
+
'array_id': f'Filtered: {paramname}',
|
|
321
|
+
'is_setpoint': False}
|
|
322
|
+
|
|
323
|
+
for label in ['X data', 'Y data', 'Z data']:
|
|
324
|
+
self.settings_menu_options[label]= self.all_parameter_names
|
|
325
|
+
negparamnames=[f'-{name}' for name in self.all_parameter_names]
|
|
326
|
+
allnames=np.hstack((self.all_parameter_names,negparamnames))
|
|
327
|
+
for filtname in ['Multiply', 'Divide', 'Add/Subtract']:
|
|
328
|
+
self.filter_menu_options[filtname]=allnames
|