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.
Files changed (82) hide show
  1. qcodespp/__init__.py +77 -0
  2. qcodespp/actions.py +237 -0
  3. qcodespp/data/__init__.py +0 -0
  4. qcodespp/data/data_array.py +555 -0
  5. qcodespp/data/data_set.py +926 -0
  6. qcodespp/data/format.py +338 -0
  7. qcodespp/data/gnuplot_format.py +425 -0
  8. qcodespp/data/hdf5_format.py +537 -0
  9. qcodespp/data/hdf5_format_hickle.py +63 -0
  10. qcodespp/data/io.py +241 -0
  11. qcodespp/data/location.py +171 -0
  12. qcodespp/instrument_drivers/Keysight/Keysight_34450A.py +9 -0
  13. qcodespp/instrument_drivers/Keysight/__init__.py +0 -0
  14. qcodespp/instrument_drivers/Keysight/private/Keysight_344xxA.py +456 -0
  15. qcodespp/instrument_drivers/Keysight/private/__init__.py +0 -0
  16. qcodespp/instrument_drivers/Lakeshore/Model_340.py +483 -0
  17. qcodespp/instrument_drivers/Lakeshore/__init__.py +0 -0
  18. qcodespp/instrument_drivers/QDevil/159fit_params_high_latest.json +386 -0
  19. qcodespp/instrument_drivers/QDevil/159fit_params_low_latest.json +386 -0
  20. qcodespp/instrument_drivers/QDevil/QDAC2.py +3229 -0
  21. qcodespp/instrument_drivers/QDevil/QDAC2_Array.py +300 -0
  22. qcodespp/instrument_drivers/QDevil/QSwitch_elab.py +652 -0
  23. qcodespp/instrument_drivers/QDevil/__init__.py +0 -0
  24. qcodespp/instrument_drivers/ZI/ZIHF2LI.py +415 -0
  25. qcodespp/instrument_drivers/ZI/ZIMFLI.py +764 -0
  26. qcodespp/instrument_drivers/ZI/ZIMFLI_sync.py +108 -0
  27. qcodespp/instrument_drivers/ZI/ZIUHFLI.py +2179 -0
  28. qcodespp/instrument_drivers/ZI/__init__.py +1 -0
  29. qcodespp/instrument_drivers/__init__.py +0 -0
  30. qcodespp/instrument_drivers/cryogenic/CryogenicSMS120C.py +599 -0
  31. qcodespp/instrument_drivers/cryogenic/__init__.py +0 -0
  32. qcodespp/instrument_drivers/instrument_mocks.py +379 -0
  33. qcodespp/instrument_drivers/multiplexer_instrument.py +287 -0
  34. qcodespp/instrument_drivers/national_instruments/PXI_4461.py +451 -0
  35. qcodespp/instrument_drivers/national_instruments/PXI_4462.py +290 -0
  36. qcodespp/instrument_drivers/national_instruments/PXI_6259.py +436 -0
  37. qcodespp/instrument_drivers/national_instruments/PXI_6733.py +230 -0
  38. qcodespp/instrument_drivers/national_instruments/PXI_6733_e.py +243 -0
  39. qcodespp/instrument_drivers/national_instruments/__init__.py +0 -0
  40. qcodespp/instrument_drivers/oxford/__init__.py +0 -0
  41. qcodespp/instrument_drivers/oxford/mercuryiPS_serial.py +658 -0
  42. qcodespp/instrument_drivers/oxford/triton.py +434 -0
  43. qcodespp/instrument_drivers/tektronix/Keithley_2000_Scan.py +65 -0
  44. qcodespp/instrument_drivers/tektronix/Keithley_2182a.py +190 -0
  45. qcodespp/instrument_drivers/tektronix/Keithley_2400.py +158 -0
  46. qcodespp/instrument_drivers/tektronix/Keithley_2450.py +242 -0
  47. qcodespp/instrument_drivers/tektronix/Keithley_2700.py +397 -0
  48. qcodespp/instrument_drivers/tektronix/Keithley_6500.py +161 -0
  49. qcodespp/instrument_drivers/tektronix/__init__.py +0 -0
  50. qcodespp/instrument_drivers/yokogawa/GS200.py +513 -0
  51. qcodespp/instrument_drivers/yokogawa/__init__.py +0 -0
  52. qcodespp/loops.py +1342 -0
  53. qcodespp/measure.py +310 -0
  54. qcodespp/parameters.py +311 -0
  55. qcodespp/plotting/RemotePlot.py +469 -0
  56. qcodespp/plotting/RemotePlotClient.py +367 -0
  57. qcodespp/plotting/RemoteQtPlotWidgets.py +871 -0
  58. qcodespp/plotting/__init__.py +0 -0
  59. qcodespp/plotting/analysis_tools.py +195 -0
  60. qcodespp/plotting/colors.py +135 -0
  61. qcodespp/plotting/offline/__init__.py +0 -0
  62. qcodespp/plotting/offline/datatypes.py +999 -0
  63. qcodespp/plotting/offline/design.py +906 -0
  64. qcodespp/plotting/offline/design.ui +1578 -0
  65. qcodespp/plotting/offline/editor.py +2966 -0
  66. qcodespp/plotting/offline/filters.py +561 -0
  67. qcodespp/plotting/offline/fits.py +1171 -0
  68. qcodespp/plotting/offline/helpers.py +288 -0
  69. qcodespp/plotting/offline/iconGadget.png +0 -0
  70. qcodespp/plotting/offline/main.py +55 -0
  71. qcodespp/plotting/offline/popupwindows.py +1848 -0
  72. qcodespp/plotting/offline/qcodes_pp_extension.py +328 -0
  73. qcodespp/plotting/offline/sidebars.py +1108 -0
  74. qcodespp/station.py +290 -0
  75. qcodespp/utils/__init__.py +0 -0
  76. qcodespp/utils/helpers.py +618 -0
  77. qcodespp/utils/visa_helpers.py +61 -0
  78. qcodespp/version.py +12 -0
  79. qcodespp-0.1.0.dist-info/METADATA +91 -0
  80. qcodespp-0.1.0.dist-info/RECORD +82 -0
  81. qcodespp-0.1.0.dist-info/WHEEL +4 -0
  82. 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