From e312668b13690c8194cdc8de72900e2ed463ca54 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Mon, 18 Nov 2024 17:07:21 +0100 Subject: [PATCH 01/20] Added Keysight Device Initialization Only: --- .../KeysightScope/KeysightScope.py | 317 ++++++++++++++++++ labscript_devices/KeysightScope/__init__.py | 0 labscript_devices/KeysightScope/blacs_tabs.py | 15 + .../KeysightScope/blacs_workers.py | 85 +++++ .../KeysightScope/labscript_devices.py | 34 ++ labscript_devices/KeysightScope/playground.py | 8 + .../KeysightScope/register_classes.py | 7 + 7 files changed, 466 insertions(+) create mode 100644 labscript_devices/KeysightScope/KeysightScope.py create mode 100644 labscript_devices/KeysightScope/__init__.py create mode 100644 labscript_devices/KeysightScope/blacs_tabs.py create mode 100644 labscript_devices/KeysightScope/blacs_workers.py create mode 100644 labscript_devices/KeysightScope/labscript_devices.py create mode 100644 labscript_devices/KeysightScope/playground.py create mode 100644 labscript_devices/KeysightScope/register_classes.py diff --git a/labscript_devices/KeysightScope/KeysightScope.py b/labscript_devices/KeysightScope/KeysightScope.py new file mode 100644 index 00000000..236c6875 --- /dev/null +++ b/labscript_devices/KeysightScope/KeysightScope.py @@ -0,0 +1,317 @@ +import pyvisa +import numpy as np +import time + +""" + --init- -- yes + channels() -- no + rest -- (to test) +""" + + +""" + zu verbessern, CASE HAndling for other aquiring and acquisation modes + +""" + +class KeysightScope: + def __init__(self, addr='USB?*::INSTR', + timeout =3, termination='\n'): + rm = pyvisa.ResourceManager() + devs = rm.list_resources(addr) + + assert len(devs), "PyVisa didn't find any connected devices matching " + addr + + self.dev = rm.open_resource(devs[0]) + self.dev.timeout = 1000 * timeout + self.dev.read_termination = termination + self.idn = self.dev.query('*IDN?') + self.read = self.dev.read # class method + self.write = self.dev.write # class method + self.query = self.dev.query # class method + print(f"The scope {self.idn} was successfully initialized") + + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + + def channels_old(self, all=True): + """Return a dictionary of the channels supported by this scope and whether they are currently displayed. + Includes REF and MATH channels if applicable. If "all" is False, only visible channels are returned""" + # want to enable HEAD to get channel names as well + prev = self.dev.query('HEAD?') + self.dev.write('HEAD 1') + # determine the device capabilities and enabled status + resp = self.dev.query('SEL?').rsplit(':',1)[1] + # reset HEAD + self.dev.write('HEAD '+prev) + # create a dict from the response + vals = {} + for x in resp.split(';'): + name, val = x.rsplit(' ',1) + if name[0] == ':': + name = name.rsplit(':',1)[1] + try: + visible = bool(int(val)) + except: + continue + if all or visible: + vals[name] = visible + return vals + + +##################################################################################################### +##################################################################################################### +##################################################################################################### +##################################################################################################### +##################################################################################################### + + # ------------------------------------- NEW FOR KEYSIGHT + def channels(self, all=True): + """Return a dictionary of the channels supported by this scope and whether they are currently displayed. + If "all" is False, only visible channels are returned""" + + all_channels = self.dev.query(":MEASure:SOURce?").rstrip().split(",") # List with all Channels + vals = {} + for index , chan in enumerate(all_channels): + try: + visible = bool(int(self.dev.query(f":CHANnel{index + 1 }:DISPlay?"))) + except: + continue + if all or visible: + vals[chan] = visible + return vals + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + + def waveform_old(self, channel='CH1', preamble_string='WFMO', int16=False): + """Download the waveform of the specified channel from the oscilloscope. All + acquired points are downloaded, as set by the 'Record length' setting in the + 'Acquisition' menu. A dictionary of waveform formatting parameters is returned + in addition to the times and values. + """ + # configure the data transfer + self.dev.write('DAT:SOU ' + channel) # set the location of the data transferred by CURVe? + self.dev.write('DAT:ENC RIB') # tranfer the waveform in binary format (signed, MSB) + if int16: + self.dev.write(preamble_string + ':BYT_N 2') # use 16-bit integers (but only return every second pt) + else: + self.dev.write(preamble_string + ':BYT_N 1') # use 8-bit integers + record_length = int(self.dev.query('HOR:RECO?')) # determine how many points exist + self.dev.write('DAT:START ' + '1') # set the first data point to transfer + self.dev.write('DAT:STOP ' + str(record_length)) # set the last data point to transfer + + # transfer the data and format into a sequence of strings + raw = self.dev.query_binary_values('CURV?', + datatype='i' if int16 else 'b', + is_big_endian=True, + container=np.array + ) + + # create a dictionary for the header information + keys = [ + 'BYT_NR', # data width for the outgoing waveform + 'BIT_NR', # number of bits per waveform point (8 or 16) + 'ENCDG', # type of encoding (ASCII or binary) + 'BN_FMT', # format of binary data (redundant for ASCII transfer) + 'BYT_OR', # first transmitted byte of binray data (LSB or MSB) + 'NR_PT', # number of points transmitted in response to a CURVe? query + 'WFID', # acquisition parameters + 'PT_FMT', # point format: {ENV: min/max pairs, Y: single points} + 'XINCR', # horizontal increment + 'PT_OFF', # trigger offset + 'XZERO', # time coordinate of the first point + 'XUNIT', # horizontal units + 'YMULT', # vertical scale factor per digitizing level + 'YZERO', # vertical offset + 'YOFF', # vertical position in digitizing levels + 'YUNIT' # vertical units + ] + + # wfstr = self.dev.query(preamble_string + '?').split(';') # waveform transmission and formatting parameters + self.dev.write(';:'.join([preamble_string + ':' + k + '?' for k in keys])) + wfstr = self.dev.read().split(';') + + # create a dictionary of the waveform preamble + wfmp = {} + for key, x in zip(keys, wfstr): + x = str(x) + if x[0] == '"': # is it an enclosed string? + x = x.split('"')[1] + elif str.isdigit(x): # is it an integer + x = int(x) + else: + try: x = float(x) # try floating point number + except: pass + wfmp[key] = x + + # return the times and voltages + n = np.arange(0, wfmp['NR_PT'] / wfmp['BYT_NR']) + t = wfmp['BYT_NR'] * wfmp['XINCR'] * (n - wfmp['PT_OFF']) + wfmp['XZERO'] + y = wfmp['YMULT'] * (raw - wfmp['YOFF']) + wfmp['YZERO'] + return wfmp, t, y + +##################################################################################################### +##################################################################################################### +##################################################################################################### +##################################################################################################### +##################################################################################################### + + + def waveform(self, channel='CHANnel1', int16=False): + """ as set by the 'Record length' setting in the + 'Acquisition' menu. + Return: Dictionary : waveform formatting parameters , times, values. + + TO TEST = int16 True --> :WAVeform:FORMat WORD + """ + + # configure the data transfer + self.dev.write(':WAVeform:SOURce ' + channel) # set the location of the data transferred by WAVeform? + + if int16: + self.dev.write(':WAVeform:FORMat WORD') # use 16-bit integers + # To TEST: + # --- Tekscope : but only return every second pt , KEysight too ?? + # --- gpt sagt das ist besser aslbinary + else: + self.dev.write(':WAVeform:FORMat BYTE') # use 8 -bit integers + + + + record_length = int(self.dev.query(':WAVeform:POINts?')) # determine how many points exist + + # transfer the data and format into a sequence of strings + raw = self.dev.query_binary_values(':WAVeform:DATA?', # TO TEST INT 16 ---> WORD + datatype='i' if int16 else 'b', + is_big_endian=True, + container=np.array + ) + + # Create a dictionary for the preamble + keys = [ + " format", # for BYTE format, 1 for WORD format, 4 for ASCii format; an integer in NR1 format (format set by :WAVeform:FORMat) + " type", # 2 for AVERage type, 0 for NORMal type, 1 for PEAK detect type; an integer in NR1 format (type set by :ACQuire:TYPE). + " points", # points 32-bit NR1 + " count", # Average count or 1 if PEAK or NORMal; an integer in NR1 format (count set by :ACQuire:COUNt) + " xincrement", # 64-bit floating point NR3>, + " xorigin" , # 64-bit floating point NR3>, + " xreference", # 32-bit NR1>, + " yincrement", # 32-bit floating point NR3>, + " yorigin" , # 32-bit floating point NR3>, + " yreference", # 32-bit NR1. + ] + + + # Get the Preamble + preamble = scope.query(":WAVeform:PREamble?") + wfstr = [float(i) for i in preamble.split(",")] + + # create a dictionary of the waveform preamble + wfmp = dict(zip(keys, wfstr)) + + # return the times and voltages + n = np.arange(0, wfmp['NR_PT'] / wfmp['BYT_NR']) + t = wfmp['BYT_NR'] * wfmp['XINCR'] * (n - wfmp['PT_OFF']) + wfmp['XZERO'] # time = [(data point number - xreference) * xincrement] + xorigin + y = wfmp['YMULT'] * (raw - wfmp['YOFF']) + wfmp['YZERO'] # voltage = [(data value - yreference) * yincrement] + yorigin (see Page 667 , Keysight manual for programmer ) + return wfmp, t, y + + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + + def get_screenshot(self, verbose=False): + if verbose: + print('Downloading screen image...') + self.dev.write('SAVE:IMAG:FILEF PNG') + self.dev.write('HARDCOPY START') + return self.dev.read_raw(None) + + def save_screenshot(self, filepath, verbose=False): + if verbose: + print('Saving screen image...') + data = self.get_screenshot() + with open(filepath, 'wb') as f: + f.write(data) + + def set_date_time(self, verbose=False): + if verbose: + print('Setting date and time...') + self.sendrecv('DATE "' + time.strftime('%Y-%m-%d',time.localtime()) + '"') # set the date + self.sendrecv('TIME "' + time.strftime('%H:%M:%S',time.localtime()) + '"') # set the time + + def lock(self, verbose=False): + if verbose: + print('Locking front panel') + self.dev.write('LOCk ALL') + + def unlock(self, verbose=False): + if verbose: + print('Unlocking front panel') + self.dev.write('LOCk NONE') + + def get_acquire_state(self): + reponse = self.dev.query('ACQ:STATE?') + return int(response) + + def set_acquire_state(self, running=True): + self.dev.write('ACQ:STATE ' + 'START' if running else 'STOP') + + def close(self): + self.dev.close() + + + + +if __name__ == '__main__': + # scope = KeysightScope(addr='TCP?*::INSTR', timeout=10) + scope = KeysightScope(addr='USB?*::INSTR', timeout=10) + + print( scope.channels() ) + + # Testings + # print("channels ", scope.channels()) + + def transition_to_manual(): + chans = scope.channels() + + wfmp = {} + vals = {} + wtype = [('t', 'float')] + + print('Downloading...') + + for ch, enabled in channs.items(): + if enabled: + wfmp[ch], t, vals[ch] = self.scope.waveform( + ch, + int16=self.scope_params.get('int16', False), + preamble_string=self.preamble_string, + ) + wtype.append((ch, 'float')) + print(wfmp[ch]['WFID']) + + # Collate all data in a structured array + data = np.empty(len(t), dtype=wtype) + data['t'] = t + for ch in vals: + data[ch] = vals[ch] diff --git a/labscript_devices/KeysightScope/__init__.py b/labscript_devices/KeysightScope/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/labscript_devices/KeysightScope/blacs_tabs.py b/labscript_devices/KeysightScope/blacs_tabs.py new file mode 100644 index 00000000..d3290c72 --- /dev/null +++ b/labscript_devices/KeysightScope/blacs_tabs.py @@ -0,0 +1,15 @@ +from blacs.device_base_class import DeviceTab + +class KeysightScopeTab(DeviceTab): + def initialise_GUI(self): + pass + + def initialise_workers(self): + worker_initialisation_kwargs = self.connection_table.find_by_name(self.device_name).properties + worker_initialisation_kwargs['addr'] = self.BLACS_connection + self.create_worker( + 'main_worker', + 'labscript_devices.KeysightScope.blacs_workers.KeysightScopeWorker', + worker_initialisation_kwargs, + ) + self.primary_worker = 'main_worker' \ No newline at end of file diff --git a/labscript_devices/KeysightScope/blacs_workers.py b/labscript_devices/KeysightScope/blacs_workers.py new file mode 100644 index 00000000..4fb6b919 --- /dev/null +++ b/labscript_devices/KeysightScope/blacs_workers.py @@ -0,0 +1,85 @@ +import numpy as np +import labscript_utils.h5_lock +import h5py + +from blacs.tab_base_classes import Worker +import labscript_utils.properties + + +class KeysightScopeWorker(Worker): + def init(self): + global KeysightScope + from .KeysightScope import KeysightScope + + self.scope = KeysightScope(self.addr, termination=self.termination) + manufacturer, model, sn, revision = self.scope.idn.split(',') + #assert manufacturer.lower() == 'tektronix' + #"Device is made by {:s}, not by Tektronix, and is actually a {:s}".format( + # manufacturer, model + #) + print('Connected to {} (SN: {})'.format(model, sn)) + + def transition_to_buffered(self, device_name, h5file, front_panel_values, refresh): + self.h5file = h5file # We'll need this in transition_to_manual + self.device_name = device_name + with h5py.File(h5file, 'r') as hdf5_file: + print('\n' + h5file) + self.scope_params = labscript_utils.properties.get( + hdf5_file, device_name, 'device_properties' + ) + self.scope.dev.timeout = 1000 * self.scope_params.get('timeout', 5) + + self.scope.unlock() + self.scope.set_acquire_state(True) + # TODO: Make per-shot acquisition parameters and channels configurable here + self.scope.write('ACQUIRE:MODE SAMPLE') + self.scope.write('ACQUIRE:STOPAFTER SEQUENCE') + self.scope.write('ACQUIRE:STATE RUN') + return {} + + def transition_to_manual(self): + channels = self.scope.channels() + wfmp = {} + vals = {} + wtype = [('t', 'float')] + print('Downloading...') + for ch, enabled in channels.items(): + if enabled: + wfmp[ch], t, vals[ch] = self.scope.waveform( + ch, + int16=self.scope_params.get('int16', False), + preamble_string=self.preamble_string, + ) + wtype.append((ch, 'float')) + print(wfmp[ch]['WFID']) + + # Collate all data in a structured array + data = np.empty(len(t), dtype=wtype) + data['t'] = t + for ch in vals: + data[ch] = vals[ch] + + # Open the file after download so as not to hog the file lock + with h5py.File(self.h5file, 'r+') as hdf_file: + grp = hdf_file.create_group('/data/traces') + print('Saving traces...') + dset = grp.create_dataset(self.device_name, data=data) + dset.attrs.update(wfmp[ch]) + print('Done!') + return True + + def program_manual(self, values): + return values + + def abort(self): + print('aborting!') + # self.scope.write('*RST') + return True + + def abort_buffered(self): + print('abort_buffered: ...') + return self.abort() + + def abort_transition_to_buffered(self): + print('abort_transition_to_buffered: ...') + return self.abort() diff --git a/labscript_devices/KeysightScope/labscript_devices.py b/labscript_devices/KeysightScope/labscript_devices.py new file mode 100644 index 00000000..7176157f --- /dev/null +++ b/labscript_devices/KeysightScope/labscript_devices.py @@ -0,0 +1,34 @@ +from labscript import Device, LabscriptError, set_passed_properties + +class KeysightScope(Device): + """A labscript_device for Keysight oscilloscopes (DSOX1202G) using a visa interface. + connection_table_properties (set once) + termination: character signalling end of response + preamble_string: base command for waveform preamble ('WFMO' or 'WFMP') + + device_properties (set per shot) + timeout: in seconds for response to queries over visa interface + int16: download waveform pts as 16 bit integers (returns 1/2 as many pts) + """ + #description = 'Tekstronix oscilloscope' + description = "KeysightScope" + + @set_passed_properties( + property_names = { + 'connection_table_properties': ['termination', 'preamble_string'], + 'device_properties': ['timeout', 'int16']} + ) + def __init__(self, name, addr, + termination='\n', preamble_string='WFMP', + timeout=5, int16=False, + **kwargs): + Device.__init__(self, name, None, addr, **kwargs) + self.name = name + self.BLACS_connection = addr + self.termination = termination + self.preamble_string = preamble_string + assert preamble_string in ['WFMO', 'WFMP'], "preamble_string must be one of 'WFMO' or 'WFMP'" + + def generate_code(self, hdf5_file): + # group = self.init_device_name(hdf5_file) + Device.generate_code(self, hdf5_file) diff --git a/labscript_devices/KeysightScope/playground.py b/labscript_devices/KeysightScope/playground.py new file mode 100644 index 00000000..56ade2ef --- /dev/null +++ b/labscript_devices/KeysightScope/playground.py @@ -0,0 +1,8 @@ +import pyvisa + + +rm = pyvisa.ResourceManager() + +a = rm.list_resources('USB?*::INSTR') +scope = rm.open_resource(a[0]) +print(scope.read('*IDN?')) \ No newline at end of file diff --git a/labscript_devices/KeysightScope/register_classes.py b/labscript_devices/KeysightScope/register_classes.py new file mode 100644 index 00000000..cadc8cf9 --- /dev/null +++ b/labscript_devices/KeysightScope/register_classes.py @@ -0,0 +1,7 @@ +import labscript_devices + +labscript_devices.register_classes( + 'KeysightScope', + BLACS_tab='labscript_devices.KeysightScope.blacs_tabs.KeysightScopeTab', + runviewer_parser=None +) From 7eb3ac5beb6c64763bed7de5cab4224af13024c9 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Mon, 18 Nov 2024 17:12:36 +0100 Subject: [PATCH 02/20] Some Devices implementation Need later to compare with own Oscilloscope implementation --- .../KeysightDCSupply/__init__.py | 13 + .../KeysightDCSupply/blacs_tab.py | 71 +++ .../KeysightDCSupply/blacs_worker.py | 172 ++++++ .../KeysightDCSupply/labscript_device.py | 154 ++++++ .../KeysightDCSupply/register_classes.py | 18 + .../KeysightXSeries/__init__.py | 13 + .../KeysightXSeries/blacs_tab.py | 38 ++ .../KeysightXSeries/blacs_worker.py | 296 +++++++++++ .../KeysightXSeries/labscript_device.py | 112 ++++ .../KeysightXSeries/register_classes.py | 18 + .../naqslab_devices/NovaTechDDS/__init__.py | 24 + .../naqslab_devices/NovaTechDDS/blacs_tab.py | 157 ++++++ .../NovaTechDDS/blacs_worker.py | 453 ++++++++++++++++ .../NovaTechDDS/labscript_device.py | 492 ++++++++++++++++++ .../NovaTechDDS/register_classes.py | 30 ++ .../NovaTechDDS/runviewer_parser.py | 85 +++ .../PulseBlasterESRPro300/__init__.py | 12 + .../PulseBlasterESRPro300/blacs_tab.py | 32 ++ .../PulseBlasterESRPro300/blacs_worker.py | 31 ++ .../PulseBlasterESRPro300/labscript_device.py | 33 ++ .../PulseBlasterESRPro300/register_classes.py | 13 + .../PulseBlasterESRPro300/runviewer_parser.py | 28 + .../PulseBlaster_No_DDS_200/__init__.py | 8 + .../PulseBlaster_No_DDS_200/blacs_tab.py | 20 + .../PulseBlaster_No_DDS_200/blacs_worker.py | 18 + .../labscript_device.py | 27 + .../register_classes.py | 13 + .../runviewer_parser.py | 16 + labscript_devices/naqslab_devices/README.md | 235 +++++++++ .../naqslab_devices/SR865/__init__.py | 17 + .../naqslab_devices/SR865/blacs_tab.py | 88 ++++ .../naqslab_devices/SR865/blacs_worker.py | 136 +++++ .../naqslab_devices/SR865/labscript_device.py | 107 ++++ .../naqslab_devices/SR865/register_classes.py | 18 + .../SignalGenerator/BLACS/HP_8642A.py | 94 ++++ .../SignalGenerator/BLACS/HP_8643A.py | 91 ++++ .../SignalGenerator/BLACS/HP_8648.py | 115 ++++ .../SignalGenerator/BLACS/KeysightSigGens.py | 123 +++++ .../SignalGenerator/BLACS/RS_SMA100B.py | 70 +++ .../SignalGenerator/BLACS/RS_SMF100A.py | 68 +++ .../SignalGenerator/BLACS/RS_SMHU.py | 101 ++++ .../SignalGenerator/BLACS/__init__.py | 13 + .../naqslab_devices/SignalGenerator/Models.py | 113 ++++ .../SignalGenerator/__init__.py | 22 + .../SignalGenerator/blacs_tab.py | 70 +++ .../SignalGenerator/blacs_worker.py | 225 ++++++++ .../SignalGenerator/labscript_device.py | 133 +++++ .../SignalGenerator/register_classes.py | 65 +++ .../naqslab_devices/TektronixTDS/__init__.py | 17 + .../naqslab_devices/TektronixTDS/blacs_tab.py | 40 ++ .../TektronixTDS/blacs_worker.py | 105 ++++ .../TektronixTDS/labscript_device.py | 64 +++ .../TektronixTDS/register_classes.py | 18 + .../naqslab_devices/VISA/STBstatus.ui | 423 +++++++++++++++ .../naqslab_devices/VISA/__init__.py | 18 + .../naqslab_devices/VISA/blacs_tab.py | 107 ++++ .../naqslab_devices/VISA/blacs_worker.py | 137 +++++ .../naqslab_devices/VISA/labscript_device.py | 47 ++ .../naqslab_devices/VISA/register_classes.py | 23 + labscript_devices/naqslab_devices/__init__.py | 148 ++++++ .../naqslab_devices/doc/KeysightDCSupply.rst | 21 + .../naqslab_devices/doc/KeysightXSeries.rst | 11 + .../naqslab_devices/doc/Makefile | 26 + .../naqslab_devices/doc/NovaTechDDS.rst | 11 + .../doc/PulseBlasterESRPro300.rst | 10 + .../doc/PulseBlaster_No_DDS_200.rst | 10 + .../naqslab_devices/doc/SR865.rst | 11 + .../naqslab_devices/doc/SignalGenerator.rst | 116 +++++ .../naqslab_devices/doc/TektronixTDS.rst | 9 + .../naqslab_devices/doc/VISA.rst | 11 + .../doc/_build/latex/naqslab_devices.pdf | Bin 0 -> 1411612 bytes .../doc/_inv/pyvisa-objects.inv | Bin 0 -> 6530 bytes .../doc/_inv/sphinx-objects.inv | Bin 0 -> 11632 bytes .../doc/_templates/package.rst_t | 53 ++ labscript_devices/naqslab_devices/doc/conf.py | 162 ++++++ .../naqslab_devices/doc/devices.rst | 29 ++ .../naqslab_devices/doc/doc_build.rst | 65 +++ .../naqslab_devices/doc/index.rst | 36 ++ .../naqslab_devices/doc/make.bat | 45 ++ .../naqslab_devices/doc/primitives.rst | 25 + .../naqslab_devices/doc/usage.rst | 25 + 81 files changed, 6124 insertions(+) create mode 100644 labscript_devices/naqslab_devices/KeysightDCSupply/__init__.py create mode 100644 labscript_devices/naqslab_devices/KeysightDCSupply/blacs_tab.py create mode 100644 labscript_devices/naqslab_devices/KeysightDCSupply/blacs_worker.py create mode 100644 labscript_devices/naqslab_devices/KeysightDCSupply/labscript_device.py create mode 100644 labscript_devices/naqslab_devices/KeysightDCSupply/register_classes.py create mode 100644 labscript_devices/naqslab_devices/KeysightXSeries/__init__.py create mode 100644 labscript_devices/naqslab_devices/KeysightXSeries/blacs_tab.py create mode 100644 labscript_devices/naqslab_devices/KeysightXSeries/blacs_worker.py create mode 100644 labscript_devices/naqslab_devices/KeysightXSeries/labscript_device.py create mode 100644 labscript_devices/naqslab_devices/KeysightXSeries/register_classes.py create mode 100644 labscript_devices/naqslab_devices/NovaTechDDS/__init__.py create mode 100644 labscript_devices/naqslab_devices/NovaTechDDS/blacs_tab.py create mode 100644 labscript_devices/naqslab_devices/NovaTechDDS/blacs_worker.py create mode 100644 labscript_devices/naqslab_devices/NovaTechDDS/labscript_device.py create mode 100644 labscript_devices/naqslab_devices/NovaTechDDS/register_classes.py create mode 100644 labscript_devices/naqslab_devices/NovaTechDDS/runviewer_parser.py create mode 100644 labscript_devices/naqslab_devices/PulseBlasterESRPro300/__init__.py create mode 100644 labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_tab.py create mode 100644 labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_worker.py create mode 100644 labscript_devices/naqslab_devices/PulseBlasterESRPro300/labscript_device.py create mode 100644 labscript_devices/naqslab_devices/PulseBlasterESRPro300/register_classes.py create mode 100644 labscript_devices/naqslab_devices/PulseBlasterESRPro300/runviewer_parser.py create mode 100644 labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/__init__.py create mode 100644 labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_tab.py create mode 100644 labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_worker.py create mode 100644 labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/labscript_device.py create mode 100644 labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/register_classes.py create mode 100644 labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/runviewer_parser.py create mode 100644 labscript_devices/naqslab_devices/README.md create mode 100644 labscript_devices/naqslab_devices/SR865/__init__.py create mode 100644 labscript_devices/naqslab_devices/SR865/blacs_tab.py create mode 100644 labscript_devices/naqslab_devices/SR865/blacs_worker.py create mode 100644 labscript_devices/naqslab_devices/SR865/labscript_device.py create mode 100644 labscript_devices/naqslab_devices/SR865/register_classes.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8642A.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8643A.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8648.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/KeysightSigGens.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMA100B.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMF100A.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMHU.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/__init__.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/Models.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/__init__.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/blacs_tab.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/blacs_worker.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/labscript_device.py create mode 100644 labscript_devices/naqslab_devices/SignalGenerator/register_classes.py create mode 100644 labscript_devices/naqslab_devices/TektronixTDS/__init__.py create mode 100644 labscript_devices/naqslab_devices/TektronixTDS/blacs_tab.py create mode 100644 labscript_devices/naqslab_devices/TektronixTDS/blacs_worker.py create mode 100644 labscript_devices/naqslab_devices/TektronixTDS/labscript_device.py create mode 100644 labscript_devices/naqslab_devices/TektronixTDS/register_classes.py create mode 100644 labscript_devices/naqslab_devices/VISA/STBstatus.ui create mode 100644 labscript_devices/naqslab_devices/VISA/__init__.py create mode 100644 labscript_devices/naqslab_devices/VISA/blacs_tab.py create mode 100644 labscript_devices/naqslab_devices/VISA/blacs_worker.py create mode 100644 labscript_devices/naqslab_devices/VISA/labscript_device.py create mode 100644 labscript_devices/naqslab_devices/VISA/register_classes.py create mode 100644 labscript_devices/naqslab_devices/__init__.py create mode 100644 labscript_devices/naqslab_devices/doc/KeysightDCSupply.rst create mode 100644 labscript_devices/naqslab_devices/doc/KeysightXSeries.rst create mode 100644 labscript_devices/naqslab_devices/doc/Makefile create mode 100644 labscript_devices/naqslab_devices/doc/NovaTechDDS.rst create mode 100644 labscript_devices/naqslab_devices/doc/PulseBlasterESRPro300.rst create mode 100644 labscript_devices/naqslab_devices/doc/PulseBlaster_No_DDS_200.rst create mode 100644 labscript_devices/naqslab_devices/doc/SR865.rst create mode 100644 labscript_devices/naqslab_devices/doc/SignalGenerator.rst create mode 100644 labscript_devices/naqslab_devices/doc/TektronixTDS.rst create mode 100644 labscript_devices/naqslab_devices/doc/VISA.rst create mode 100644 labscript_devices/naqslab_devices/doc/_build/latex/naqslab_devices.pdf create mode 100644 labscript_devices/naqslab_devices/doc/_inv/pyvisa-objects.inv create mode 100644 labscript_devices/naqslab_devices/doc/_inv/sphinx-objects.inv create mode 100644 labscript_devices/naqslab_devices/doc/_templates/package.rst_t create mode 100644 labscript_devices/naqslab_devices/doc/conf.py create mode 100644 labscript_devices/naqslab_devices/doc/devices.rst create mode 100644 labscript_devices/naqslab_devices/doc/doc_build.rst create mode 100644 labscript_devices/naqslab_devices/doc/index.rst create mode 100644 labscript_devices/naqslab_devices/doc/make.bat create mode 100644 labscript_devices/naqslab_devices/doc/primitives.rst create mode 100644 labscript_devices/naqslab_devices/doc/usage.rst diff --git a/labscript_devices/naqslab_devices/KeysightDCSupply/__init__.py b/labscript_devices/naqslab_devices/KeysightDCSupply/__init__.py new file mode 100644 index 00000000..d5abe5ef --- /dev/null +++ b/labscript_devices/naqslab_devices/KeysightDCSupply/__init__.py @@ -0,0 +1,13 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/__init__.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### + diff --git a/labscript_devices/naqslab_devices/KeysightDCSupply/blacs_tab.py b/labscript_devices/naqslab_devices/KeysightDCSupply/blacs_tab.py new file mode 100644 index 00000000..93dce347 --- /dev/null +++ b/labscript_devices/naqslab_devices/KeysightDCSupply/blacs_tab.py @@ -0,0 +1,71 @@ +##################################################################### +# # +# /naqslab_devices/KeysightDCSupply/blacs_tab.py # +# # +# Copyright 2020, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from naqslab_devices.VISA.blacs_tab import VISATab + +# note, when adding a new model, put the labscript_device inheritor class +# into Models.py and the BLACS classes into a file named for the device +# in the BLACS subfolder. Update register_classes.py and __init__.py +# accordingly. + +class KeysightDCSupplyTab(VISATab): + + status_byte_labels = {'bit 7':'Unregulated', + 'bit 6':'Over-Voltage', + 'bit 5':'Command Error', + 'bit 4':'Execution Error', + 'bit 3':'Device Error', + 'bit 2':'Query Error', + 'bit 1':'Constant Voltage Mode', + 'bit 0':'Constant Current Mode'} + + + def __init__(self,*args,**kwargs): + self.device_worker_class = 'naqslab_devices.KeysightDCSupply.blacs_worker.KeysightDCSupplyWorker' + VISATab.__init__(self,*args,**kwargs) + + def initialise_GUI(self): + # configure outputs based on output limiting type + properties = self.settings['connection_table'].find_by_name(self.device_name).properties + + if properties['limited'] == 'volt': + base_units = 'V' + base_min = properties['volt_limits'][0] + base_max = properties['volt_limits'][1] + else: + base_units = 'A' + base_min = properties['current_limits'][0] + base_max = properties['current_limits'][1] + + AO_prop = {} + for i in properties['allowed_outputs']: + AO_prop['channel %d'%i] = { + 'base_unit':base_units, + 'min':base_min, + 'max':base_max, + 'step':1, + 'decimals':5 + } + + # Create the output objects + self.create_analog_outputs(AO_prop) + # Create widgets for output objects + dds_widgets,ao_widgets,do_widgets = self.auto_create_widgets() + # and auto place the widgets in the UI + self.auto_place_widgets(("DC Outputs",ao_widgets)) + + # call VISATab.initialise to create STB widget + VISATab.initialise_GUI(self) + + # Set the capabilities of this device + self.supports_remote_value_check(True) + self.supports_smart_programming(True) + self.statemachine_timeout_add(10000, self.status_monitor) diff --git a/labscript_devices/naqslab_devices/KeysightDCSupply/blacs_worker.py b/labscript_devices/naqslab_devices/KeysightDCSupply/blacs_worker.py new file mode 100644 index 00000000..27391283 --- /dev/null +++ b/labscript_devices/naqslab_devices/KeysightDCSupply/blacs_worker.py @@ -0,0 +1,172 @@ +##################################################################### +# # +# /naqslab_devices/KeysightDCSupply/blacs_worker.py # +# # +# Copyright 2020, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +import numpy as np + +from naqslab_devices.VISA.blacs_worker import VISAWorker +from labscript import LabscriptError + +import labscript_utils.h5_lock, h5py + +class KeysightDCSupplyWorker(VISAWorker): + + # define the status masks + esr_mask = 60 + qsr_mask = 1539 + + # define the initialisation string + init_string = f'*ESE {esr_mask};STAT:QUES:ENAB {qsr_mask};*CLS' + ident_string = 'E364' + + # define instrument specific read and write strings + write_both_string = 'APPL %.5f, %.5f' + write_volt_string = 'VOLT %.5f' + write_current_string = 'CURR %.5f' + read_string = 'APPL?' + + def read_parser(self,response): + '''Parses the Voltage & Amplitude response string + + Args: + response (str): Instrument response to current voltage/current query. + Has format of "d.ddddd, d.ddddd" + + Returns: + (tuple): containing + + V (float): Current Voltage Setting + A (float): Current Current Setting + ''' + V, A = response[1:-3].split(',') + return float(V), float(A) + + def init(self): + # Call the VISA init to initialise the VISA connection + VISAWorker.init(self) + + response = self.connection.query('*IDN?') + if self.ident_string not in response: + msg = f'''KeysightDCSupply does not support:\t{response}''' + raise LabscriptError(msg) + + self.connection.write(self.init_string) + + if self.limited == 'volt': + self.write_string = self.write_volt_string + else: + self.write_string = self.write_current_string + + # set voltage range + self.connection.write('VOLT:RANG '+self.range) + + # initialize the smart cache + self.smart_cache = {'CURRENT_DATA': + {'channel %d'%i:None for i in self.allowed_outputs} + } + + def check_remote_values(self): + # Get the currently output values: + results = {} + + # these query strings and parsers depend heavily on device + for i in self.allowed_outputs: + response = self.connection.query(self.read_string) + V, A = self.read_parser(response) + results['channel %d'%i] = V if self.limited == 'volt' else A + + return results + + def program_manual(self,front_panel_values): + + for output, val in front_panel_values.items(): + self.connection.write(self.write_string%(val)) + # invalidate smart cache after manual update + self.smart_cache['CURRENT_DATA'][output] = None + + return self.check_remote_values() + + def transition_to_buffered(self,device_name,h5file,initial_values,fresh): + # call parent method to do basic preamble + VISAWorker.transition_to_buffered(self,device_name,h5file,initial_values,fresh) + data = None + final_values = initial_values + # Program static values + with h5py.File(h5file,'r') as hdf5_file: + group = hdf5_file['/devices/'+device_name] + # If there are values to set the unbuffered outputs to, set them now: + if 'STATIC_DATA' in group: + data = group['STATIC_DATA'][:][0] + + if data is not None: + if fresh or data != self.smart_cache['CURRENT_DATA']: + + # only program channels as needed + channels = [int(name[-1]) for name in data.dtype.names] + for i in channels: + if data[i] != self.smart_cache['CURRENT_DATA']['channel %d'%i]: + self.connection.write(self.write_string%(data[i])) + final_values['channel %d'%i] = data[i] + self.smart_cache['CURRENT_DATA']['channel %d'%i] = data[i] + + else: + final_values = self.initial_values + + return final_values + + def check_status(self): + '''Customised check status for Keysight DC supplies. + + This method combines flags from the event status register and the + questionable status register.''' + + response = self.connection.query_ascii_values('*ESR?;STAT:QUES?;QUES:COND?',separator=';') + [esr, qsr, cond] = [int(i) for i in response] + + if (esr & self.esr_mask) != 0: + err_list = [] + while True: + err_string = self.connection.query('SYST:ERR?') + err,description = err_string.split(',') + if int(err) != 0: + err_list.append(err_string) + else: + break + msg = f'{self.VISA_name} has errors\n\t{err_list}' + raise LabscriptError(dedent(msg)) + + return self.merge_registers(esr,qsr,cond) + + def merge_registers(self, esr, qsr,cond): + '''Merges the ESR & QSR registers with the condition into a hybrid register + and converts to a dictionary for display on the BLACStab. + + Args: + esr (int): Value of the Event Status Register + qsr (int): Value of the Questionable Status Register + cond (int): Response of STATus:QUEStionable:CONDition? + + Returns: + return_vals (dict): Dictionary of values from the esr and qsr registers. + ''' + + return_vals = self.convert_register(esr) + # qsr register is more than 8 bits, so need to do convert_register by hand + qsr_status = f'{qsr:11b}'[::-1] + + # note cond == 0 is output off/unregulated and cond == 3 is supply failure + return_vals['bit 0'] = cond == 1 + return_vals['bit 1'] = cond == 2 + return_vals['bit 6'] = bool(int(qsr_status[9])) if qsr_status[9]!=' ' else False + current_unregulated = bool(int(qsr_status[1])) if qsr_status[1]!=' ' else False + volt_unregulated = bool(int(qsr_status[0])) if qsr_status[0]!=' ' else False + return_vals['bit 7'] = current_unregulated | volt_unregulated + + return return_vals \ No newline at end of file diff --git a/labscript_devices/naqslab_devices/KeysightDCSupply/labscript_device.py b/labscript_devices/naqslab_devices/KeysightDCSupply/labscript_device.py new file mode 100644 index 00000000..7eae4165 --- /dev/null +++ b/labscript_devices/naqslab_devices/KeysightDCSupply/labscript_device.py @@ -0,0 +1,154 @@ +##################################################################### +# # +# /naqslab_devices/KeysightDCSupply/labscript_device.py # +# # +# Copyright 2020, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +import numpy as np + +from naqslab_devices.VISA.labscript_device import VISA +from labscript import StaticAnalogOut, LabscriptError, set_passed_properties, config + +__version__ = '0.1.0' +__author__ = ['dihm'] + +# note, when adding a new model, put the labscript_device inheritor class +# into Models.py and the BLACS classes into a file named for the device +# in the BLACS subfolder. Update register_classes.py and __init__.py +# accordingly. + +class KeysightDCSupply(VISA): + description = 'DC Power Supply' + allowed_children = [StaticAnalogOut] + allowed_outputs = [0] + + + @set_passed_properties(property_names = {'connection_table_properties': + ['volt_limits','current_limits','range','limited','allowed_outputs']}) + def __init__(self, name, VISA_name, + range='LOW', volt_limits=(0,1), current_limits=(0,1), limited='volt'): + '''Keysight DC Power Supply + + The labscript_device for Keysight DC Power supplies. Currently only tested + for E364xA single output series devices. + + Args: + name (str): labscript name to assign to device. Must be an allowed python variable name. + VISA_name (str): VISA connection string to device. Can be alias configured in NI-MAX. + range (str): configures which voltage range to use. Default is 'LOW'. + volt_limits (iterable): voltage limits, in volts + current_limits (iterable): current limits, in amps + limited (str): Sets whether output is configured to be voltage or current limited. Default is 'volt' + ''' + + # validate and save configuration parameters + if range in ('LOW','HIGH'): + self.range = range + else: + msg = f'''Invalid value {range} for range. + Must be either \'LOW\' or \'HIGH\'.''' + raise LabscriptError(msg) + + try: + iter(volt_limits) + except TypeError: + msg = f'''volt_limits must be of iterable type, not {str(type(volt_limits))}''' + raise LabscriptError(msg) + else: + if len(volt_limits) != 2: + msg = f'''volt_limits must have two elements: (lower,upper), not {volt_limits}''' + raise LabscriptError(msg) + + try: + iter(current_limits) + except TypeError: + msg = f'''current_limits must be of iterable type, not {str(type(current_limits))}''' + raise LabscriptError(msg) + else: + if len(current_limits) != 2: + msg = f'''current_limits must have two elements: (lower,upper), not {current_limits}''' + raise LabscriptError(msg) + + self.volt_limits = volt_limits + self.current_limits = current_limits + + if limited in ('volt','current'): + self.limited = limited + else: + msg = f'''Invalid value {limited} for limited. + Must be either \'volt\' or \'current\'.''' + raise LabscriptError(dedent(msg)) + # DC Power Supplies do not have a parent device + VISA.__init__(self,name,None,VISA_name) + + def quantise_volt(self,data,output): + '''Quantize the currents in units of V and check it's within bounds''' + + # Ensure that amplitudes are within bounds: + if data < self.volt_limits[0] or data > self.volt_limits[1]: + msg = '''{:s} {:s} can only have volts between + {:.5f} V and {:.5f} V, {} given'''.format(output.description, + output.name,*self.amp_limits, + data) + raise LabscriptError(dedent(msg)) + return data + + def quantise_current(self,data,output): + '''Quantize the currents in units of A and check it's within bounds''' + + # Ensure that amplitudes are within bounds: + if data < self.current_limits[0] or data > self.current_limits[1]: + msg = '''{:s} {:s} can only have currents between + {:.5f} A and {:.5f} A, {} given'''.format(output.description, + output.name,*self.current_limits, + data) + raise LabscriptError(dedent(msg)) + return data + + def generate_code(self, hdf5_file): + + chan_num = len(self.child_devices) + if not chan_num: + print(f'No outputs attached to {self.name:s}') + return + + outputs = {} + for output in self.child_devices: + try: + prefix, channel = output.connection.split(' ') + channel = int(channel) + outputs[channel] = output + except : + msg = '''{:s} {:s} has invalid connection string: \'{!s}\'. + Format must be \'channel n\' with n an integer.''' + raise LabscriptError(dedent(msg.format(output.description, + output.name,output.connection))) + + # create static table and populate + static_dtypes = np.dtype({'names':['channel %d'%i for i in outputs.keys()], + 'formats':[np.float16 for i in outputs.keys()]}) + static_table = np.zeros(1, dtype=static_dtypes) + for channel, output in outputs.items(): + if channel not in self.allowed_outputs: + msg = '''channel {} not in {}.''' + raise LabscriptError(dedent(msg.format(channel,self.allowed_outputs))) + + _ = output.get_change_times() + _ = output.make_timeseries([]) + _ = output.expand_timeseries() + + if self.limited == 'volt': + raw_output = self.quantise_volt(output.static_value,output) + else: + raw_output = self.quantise_current(output.static_value,output) + + static_table['channel %d'%channel] = raw_output + + grp = hdf5_file.create_group('/devices/'+self.name) + grp.create_dataset('STATIC_DATA',compression=config.compression,data=static_table) + diff --git a/labscript_devices/naqslab_devices/KeysightDCSupply/register_classes.py b/labscript_devices/naqslab_devices/KeysightDCSupply/register_classes.py new file mode 100644 index 00000000..e2da213d --- /dev/null +++ b/labscript_devices/naqslab_devices/KeysightDCSupply/register_classes.py @@ -0,0 +1,18 @@ +##################################################################### +# # +# /naqslab_devices/KeysightDCSupply/register_classes.py # +# # +# Copyright 2020, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +import labscript_devices + +labscript_devices.register_classes( + 'KeysightDCSupply', + BLACS_tab='naqslab_devices.KeysightDCSupply.blacs_tab.KeysightDCSupplyTab', + runviewer_parser='') \ No newline at end of file diff --git a/labscript_devices/naqslab_devices/KeysightXSeries/__init__.py b/labscript_devices/naqslab_devices/KeysightXSeries/__init__.py new file mode 100644 index 00000000..f6e386cd --- /dev/null +++ b/labscript_devices/naqslab_devices/KeysightXSeries/__init__.py @@ -0,0 +1,13 @@ +##################################################################### +# # +# /naqslab_devices/KeysightXSeries/__init__.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### + diff --git a/labscript_devices/naqslab_devices/KeysightXSeries/blacs_tab.py b/labscript_devices/naqslab_devices/KeysightXSeries/blacs_tab.py new file mode 100644 index 00000000..b99c621b --- /dev/null +++ b/labscript_devices/naqslab_devices/KeysightXSeries/blacs_tab.py @@ -0,0 +1,38 @@ +##################################################################### +# # +# /naqslab_devices/KeysightXSeries/blacs_tab.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from naqslab_devices.VISA.blacs_tab import VISATab + +class KeysightXScopeTab(VISATab): + # Event Byte Label Definitions for X series scopes + # Used bits set by '*ESE' command in setup string of worker class + status_byte_labels = {'bit 7':'Powered On', + 'bit 6':'Button Pressed', + 'bit 5':'Command Error', + 'bit 4':'Execution Error', + 'bit 3':'Device Error', + 'bit 2':'Query Error', + 'bit 1':'Unused', + 'bit 0':'Operation Complete'} + + def __init__(self,*args,**kwargs): + if not hasattr(self,'device_worker_class'): + self.device_worker_class = 'naqslab_devices.KeysightXSeries.blacs_worker.KeysightXScopeWorker' + VISATab.__init__(self,*args,**kwargs) + + def initialise_GUI(self): + # Call the VISATab parent to initialise the STB ui and set the worker + VISATab.initialise_GUI(self) + + # Set the capabilities of this device + self.supports_remote_value_check(False) + self.supports_smart_programming(True) + self.statemachine_timeout_add(5000, self.status_monitor) diff --git a/labscript_devices/naqslab_devices/KeysightXSeries/blacs_worker.py b/labscript_devices/naqslab_devices/KeysightXSeries/blacs_worker.py new file mode 100644 index 00000000..0617d838 --- /dev/null +++ b/labscript_devices/naqslab_devices/KeysightXSeries/blacs_worker.py @@ -0,0 +1,296 @@ +##################################################################### +# # +# /naqslab_devices/KeysightXSeries/blacs_worker.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +import numpy as np +from naqslab_devices.VISA.blacs_worker import VISAWorker +from labscript import LabscriptError +import labscript_utils.properties + +import labscript_utils.h5_lock, h5py + +class KeysightXScopeWorker(VISAWorker): + # define instrument specific read and write strings + setup_string = '*ESE 60;*SRE 32;*CLS;:WAV:BYT MSBF;UNS ON;POIN:MODE RAW' + # *ESE does not disable bits in ESR, just their reporting to STB + # need to use our own mask + esr_mask = 60 + # note that analog & digital channels require different :WAV:FORM commands + read_analog_parameters_string = ':WAV:FORM WORD;SOUR CHAN{0:d};PRE?' + read_dig_parameters_string = ':WAV:FORM BYTE;SOUR POD{0:d};PRE?' + read_waveform_string = ':WAV:DATA?' + read_counter_string = ':MEAS:{0:s}{1:s}? CHAN{2:d}' + model_ident = ['SO-X','SOX'] + # some devices need the alternative :SING command, checked for in init() + dig_command = ':DIG' + + def analog_waveform_parser(self,raw_waveform_array,y0,dy,yoffset): + '''Parses the numpy array from the analog waveform query.''' + return (raw_waveform_array - yoffset)*dy + y0 + + def digital_pod_parser(self,raw_pod_array): + '''Unpacks the bits for a pod array + Columns returned are in bit order [7,6,5,4,3,2,1,0]''' + return np.unpackbits(raw_pod_array.astype(np.uint8),axis=0).reshape((-1,8),order='C') + + def error_parser(self,error_return_string): + '''Parses the strings returned by :SYST:ERR? + Returns int_code, err_string''' + return int(error_return_string.split(',')[0]), error_return_string + + def init(self): + # Call the VISA init to initialise the VISA connection + VISAWorker.init(self) + # Override the timeout for longer scope waits + self.connection.timeout = 10000 + + # Query device name to ensure supported scope + ident_string = self.connection.query('*IDN?') + if ('KEYSIGHT' in ident_string) and any(sub in ident_string for sub in self.model_ident): + # Scope supported! + # If scope is a DSO-X 1000 series, need to use alternate digitize_command for some reason + if 'DSO-X 1' in ident_string: + self.dig_command = ':SING' + else: + raise LabscriptError('Device {0:s} with VISA name {0:s} not supported!'.format(ident_string,self.VISA_name)) + + # initialization stuff + self.connection.write(self.setup_string) + # initialize smart cache + self.smart_cache = {'COUNTERS': None} + + def transition_to_buffered(self,device_name,h5file,initial_values,fresh): + '''This configures counters, if any are defined, + as well as optional compression options for saved data traces.''' + VISAWorker.transition_to_buffered(self,device_name,h5file,initial_values,fresh) + + data = None + refresh = False + send_trigger = False + with h5py.File(h5file,'r') as hdf5_file: + group = hdf5_file['/devices/'+device_name] + device_props = labscript_utils.properties.get(hdf5_file,device_name,'device_properties') + if 'COUNTERS' in group: + data = group['COUNTERS'][:] + if len(group): + send_trigger = True + # get trace compression options + self.comp_settings = {'compression':device_props['compression'], + 'compression_opts':device_props['compression_opts'], + 'shuffle':device_props['shuffle']} + + if data is not None: + #check if refresh needed + if not fresh: + try: + refresh = not np.all(np.equal(data,self.smart_cache['COUNTERS'])) + except ValueError: + # arrays not of same size + refresh = True + if fresh or refresh: + for connection,typ,pol in data: + chan_num = int(connection.split(' ')[-1]) + self.connection.write(':MEAS:{0:s}{1:s} CHAN{2:d}'.format(pol,typ,chan_num)) + + self.smart_cache['COUNTERS'] = data + + if send_trigger: + # put scope into single mode + # necessary since :WAV:DATA? clears data and wait for fresh data + # when in continuous run mode + self.connection.write(self.dig_command) + + return self.final_values + + def transition_to_manual(self,abort = False): + if not abort: + with h5py.File(self.h5_file,'r') as hdf5_file: + # get acquisitions table values so we can close the file + try: + location = '/devices/'+self.device_name+'/ANALOG_ACQUISITIONS' + analog_acquisitions = hdf5_file[location][()] + trigger_time = hdf5_file[location].attrs['trigger_time'] + except: + # No analog acquisitions! + analog_acquisitions = np.empty(0) + try: + location = '/devices/'+self.device_name+'/POD1_ACQUISITIONS' + pod1_acquisitions = hdf5_file[location][()] + trigger_time = hdf5_file[location].attrs['trigger_time'] + except: + # No acquisitions in first digital Pod + pod1_acquisitions = np.empty(0) + try: + location = '/devices/'+self.device_name+'/POD2_ACQUISITIONS' + pod2_acquisitions = hdf5_file[location][()] + trigger_time = hdf5_file[location].attrs['trigger_time'] + except: + # No acquisitions in second digital Pod + pod2_acquisitions = np.empty(0) + try: + location = '/devices/'+self.device_name+'/COUNTERS' + counters = hdf5_file[location][()] + trigger_time = hdf5_file[location].attrs['trigger_time'] + except: + # no counters + counters = np.empty(0) + # return if no acquisitions at all + if not len(analog_acquisitions) and not len(pod1_acquisitions) and not len(pod2_acquisitions) and not len(counters): + return True + # close lock on h5 to read from scope, it takes a while + + data = {} + # read analog channels if they exist + if len(analog_acquisitions): + for connection,label in analog_acquisitions: + channel_num = int(connection.decode('UTF-8').split(' ')[-1]) + # read an analog channel + # use larger chunk size for faster large data reads + [form,typ,Apts,cnt,Axinc,Axor,Axref,yinc,yor,yref] = self.connection.query_ascii_values(self.read_analog_parameters_string.format(channel_num)) + if Apts*2+11 >= 400000: # Note that +11 accounts for IEEE488.2 waveform header, not true in unicode (ie Python 3+) + default_chunk = self.connection.chunk_size + self.connection.chunk_size = int(Apts*2+11) + raw_data = self.connection.query_binary_values(self.read_waveform_string,datatype='H', is_big_endian=True, container=np.array) + if Apts*2+11 >= 400000: + self.connection.chunk_size = default_chunk + data[connection] = self.analog_waveform_parser(raw_data,yor,yinc,yref) + # create the time array + data['Analog Time'] = np.arange(Axref,Axref+Apts,1,dtype=np.float64)*Axinc + Axor + + # read pod 1 channels if necessary + if len(pod1_acquisitions): + # use larger chunk size for faster large data reads + [form,typ,Dpts,cnt,Dxinc,Dxor,Dxref,yinc,yor,yref] = self.connection.query_ascii_values(self.read_dig_parameters_string.format(1)) + if Dpts+11 >= 400000: + default_chunk = self.connection.chunk_size + self.connection.chunk_size = int(Dpts+11) + raw_data = self.connection.query_binary_values(self.read_waveform_string,datatype='B',is_big_endian=True,container=np.array) + if Dpts+11 >= 400000: + self.connection.chunk_size = default_chunk + conv_data = self.digital_pod_parser(raw_data) + # parse out desired channels + for connection,label in pod1_acquisitions: + channel_num = int(connection.split(' ')[-1]) + data[connection] = conv_data[:,(7-channel_num)%8] + + # read pod 2 channels if necessary + if len(pod2_acquisitions): + # use larger chunk size for faster large data reads + [form,typ,Dpts,cnt,Dxinc,Dxor,Dxref,yinc,yor,yref] = self.connection.query_ascii_values(self.read_dig_parameters_string.format(2)) + if Dpts+11 >= 400000: + default_chunk = self.connection.chunk_size + self.connection.chunk_size = int(Dpts+11) + raw_data = self.connection.query_binary_values(self.read_waveform_string,datatype='B',is_big_endian=True,container=np.array) + if Dpts+11 >= 400000: + self.connection.chunk_size = default_chunk + conv_data = self.digital_pod_parser(raw_data) + # parse out desired channels + for connection,label in pod2_acquisitions: + channel_num = int(connection.split(' ')[-1]) + data[connection] = conv_data[:,(15-channel_num)%8] + + if len(pod1_acquisitions) or len(pod2_acquisitions): + # create the digital time array if needed + # Note that digital traces always have fewer pts than analog + data['Digital Time'] = np.arange(Dxref,Dxref+Dpts,1,dtype=np.float64)*Dxinc + Dxor + + # read counters if necesary + count_data = {} + if len(counters): + for connection,typ,pol in counters: + chan_num = int(connection.decode('UTF-8').split(' ')[-1]) + count_data[connection] = float(self.connection.query(self.read_counter_string.format(pol,typ,chan_num))) + + # define the dtypes for the h5 arrays + dtypes_analog = np.dtype({'names':['t','values'],'formats':[np.float64,np.float32]}) + dtypes_digital = np.dtype({'names':['t','values'],'formats':[np.float64,np.uint8]}) + + # re-open lock on h5file to save data + with h5py.File(self.h5_file,'r+') as hdf5_file: + try: + measurements = hdf5_file['/data/traces'] + except: + # Group doesn't exist yet, create it + measurements = hdf5_file.create_group('/data/traces') + # write out the data to the h5file + for connection,label in analog_acquisitions: + values = np.empty(len(data[connection]),dtype=dtypes_analog) + values['t'] = data['Analog Time'] + values['values'] = data[connection] + measurements.create_dataset(label, data=values, + **self.comp_settings) + # and save some timing info for reference to labscript time + measurements[label].attrs['trigger_time'] = trigger_time + for connection,label in pod1_acquisitions: + values = np.empty(len(data[connection]),dtype=dtypes_digital) + values['t'] = data['Digital Time'] + values['values'] = data[connection] + measurements.create_dataset(label, data=values, + **self.comp_settings) + # and save some timing info for reference to labscript time + measurements[label].attrs['trigger_time'] = trigger_time + for connection,label in pod2_acquisitions: + values = np.empty(len(data[connection]),dtype=dtypes_digital) + values['t'] = data['Digital Time'] + values['values'] = data[connection] + measurements.create_dataset(label, data=values, + **self.comp_settings) + # and save some timing info for reference to labscript time + measurements[label].attrs['trigger_time'] = trigger_time + + # Now read out the counters if they exist + if len(counters): + try: + counts = hdf5_file['/data/'+self.device_name] + except: + counts = hdf5_file.create_group('/data/'+self.device_name) + + for connection,typ,pol in counters: + counts.attrs['{0:s}:{1:s}{2:s}'.format(connection,pol,typ)] = count_data[connection] + counts.attrs['trigger_time'] = trigger_time + + return True + + def check_status(self): + '''Periodically called by BLACS to check to status of the scope.''' + # Scope don't say anything useful in the stb, + # using the event register instead + esr = int(self.connection.query('*ESR?')) + + # if esr is non-zero, read out the error message and report + if (esr & self.esr_mask) != 0: + # read out errors from queue until response == 0 + err_string = '' + while True: + code, return_string = self.error_parser(self.connection.query(':SYST:ERR?')) + if code != 0: + err_string += return_string + else: + break + + raise LabscriptError('Keysight Scope VISA device {0:s} has Errors in Queue: \n{1:s}'.format(self.VISA_name,err_string)) + return self.convert_register(esr) + + + # Added this from Tekcscope + def abort(self): + print('aborting!') + self.scope.write('*RST') + return True + + def abort_buffered(self): + print('abort_buffered: ...') + return self.abort() + + def abort_transition_to_buffered(self): + print('abort_transition_to_buffered: ...') + return self.abort() + + diff --git a/labscript_devices/naqslab_devices/KeysightXSeries/labscript_device.py b/labscript_devices/naqslab_devices/KeysightXSeries/labscript_device.py new file mode 100644 index 00000000..66888f35 --- /dev/null +++ b/labscript_devices/naqslab_devices/KeysightXSeries/labscript_device.py @@ -0,0 +1,112 @@ +##################################################################### +# # +# /naqslab_devices/KeysightXSeries/labscript_device.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +import numpy as np + +from labscript_devices.naqslab_devices import ScopeChannel, CounterScopeChannel +from labscript import Device, TriggerableDevice, config, LabscriptError, set_passed_properties + +__version__ = '0.1.0' +__author__ = ['dihm'] + +class KeysightXScope(TriggerableDevice): + description = 'Keysight X Series Digital Oscilliscope' + allowed_children = [ScopeChannel] + + @set_passed_properties(property_names = { + "device_properties":["VISA_name", + "compression","compression_opts","shuffle"]} + ) + def __init__(self, name, VISA_name, trigger_device, trigger_connection, + num_AI=4, DI=True, trigger_duration=1e-3, + compression=None, compression_opts=None, shuffle=False, **kwargs): + '''VISA_name can be full VISA connection string or NI-MAX alias. + Trigger Device should be fast clocked device. + num_AI sets number of analog input channels, default 4 + DI sets if DI are present, default True + trigger_duration set scope trigger duration, default 1ms + Compression of traces in h5 file controlled by: + compression: \'lzf\', \'gzip\', None + compression_opts: 0-9 for gzip + shuffle: True/False ''' + self.VISA_name = VISA_name + self.BLACS_connection = VISA_name + TriggerableDevice.__init__(self,name,trigger_device,trigger_connection,**kwargs) + + self.compression = compression + if (compression == 'gzip') and (compression_opts == None): + # set default compression level if needed + self.compression_opts = 4 + else: + self.compression_opts = compression_opts + self.shuffle = shuffle + + self.trigger_duration = trigger_duration + self.allowed_analog_chan = ['Channel {0:d}'.format(i) for i in range(1,num_AI+1)] + if DI: + self.allowed_pod1_chan = ['Digital {0:d}'.format(i) for i in range(0,8)] + self.allowed_pod2_chan = ['Digital {0:d}'.format(i) for i in range(8,16)] + + def generate_code(self, hdf5_file): + '''Automatically called by compiler to write acquisition instructions + to h5 file. Configures counters, analog and digital acquisitions.''' + Device.generate_code(self, hdf5_file) + trans = {'pulse':'PUL','edge':'EDG','pos':'P','neg':'N'} + + acqs = {'ANALOG':[],'POD1':[],'POD2':[]} + for channel in self.child_devices: + if channel.acquisitions: + # make sure channel is allowed + if channel.connection in self.allowed_analog_chan: + acqs['ANALOG'].append((channel.connection,channel.acquisitions[0]['label'])) + elif channel.connection in self.allowed_pod1_chan: + acqs['POD1'].append((channel.connection,channel.acquisitions[0]['label'])) + elif channel.connection in self.allowed_pod2_chan: + acqs['POD2'].append((channel.connection,channel.acquisitions[0]['label'])) + else: + raise LabscriptError('{0:s} is not a valid channel.'.format(channel.connection)) + + acquisition_table_dtypes = np.dtype({'names':['connection','label'],'formats':['a256','a256']}) + + grp = self.init_device_group(hdf5_file) + # write tables if non-empty to h5_file + for acq_group, acq_chan in acqs.items(): + if len(acq_chan): + table = np.empty(len(acq_chan),dtype=acquisition_table_dtypes) + for i, acq in enumerate(acq_chan): + table[i] = acq + grp.create_dataset(acq_group+'_ACQUISITIONS',compression=config.compression, + data=table) + grp[acq_group+'_ACQUISITIONS'].attrs['trigger_time'] = self.trigger_time + + # now do the counters + counts = [] + for channel in self.child_devices: + if hasattr(channel, 'counts'): + for counter in channel.counts: + counts.append((channel.connection, + trans[counter['type']], + trans[counter['polarity']])) + counts_table_dtypes = np.dtype({'names':['connection','type','polarity'],'formats':['a256','a256','a256']}) + counts_table = np.empty(len(counts),dtype=counts_table_dtypes) + for i,count in enumerate(counts): + counts_table[i] = count + if len(counts_table): + grp.create_dataset('COUNTERS',compression=config.compression,data=counts_table) + grp['COUNTERS'].attrs['trigger_time'] = self.trigger_time + + def acquire(self,start_time): + '''Call to define time when trigger will happen for scope.''' + if not self.child_devices: + raise LabscriptError('No channels acquiring for trigger {0:s}'.format(self.name)) + else: + self.parent_device.trigger(start_time,self.trigger_duration) + self.trigger_time = start_time diff --git a/labscript_devices/naqslab_devices/KeysightXSeries/register_classes.py b/labscript_devices/naqslab_devices/KeysightXSeries/register_classes.py new file mode 100644 index 00000000..7a3ea4f9 --- /dev/null +++ b/labscript_devices/naqslab_devices/KeysightXSeries/register_classes.py @@ -0,0 +1,18 @@ +##################################################################### +# # +# /naqslab_devices/KeysightXSeries/register_classes.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +import labscript_devices + +labscript_devices.register_classes( + 'KeysightXScope', + BLACS_tab='naqslab_devices.KeysightXSeries.blacs_tab.KeysightXScopeTab', + runviewer_parser='') diff --git a/labscript_devices/naqslab_devices/NovaTechDDS/__init__.py b/labscript_devices/naqslab_devices/NovaTechDDS/__init__.py new file mode 100644 index 00000000..cece8fad --- /dev/null +++ b/labscript_devices/naqslab_devices/NovaTechDDS/__init__.py @@ -0,0 +1,24 @@ +##################################################################### +# # +# /naqslab_devices/NovaTechDDS/__init__.py # +# # +# Copyright 2017, Christopher Billington, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +from labscript_devices import deprecated_import_alias + + +# For backwards compatibility with old experiment scripts: +NovaTech409B = deprecated_import_alias( + "naqslab_devices.NovaTechDDS.labscript_device.NovaTech409B") + +NovaTech409B_AC = deprecated_import_alias( + "naqslab_devices.NovaTechDDS.labscript_device.NovaTech409B_AC") + +NovaTech440A = deprecated_import_alias( + "naqslab_devices.NovaTechDDS.labscript_device.NovaTech440A") diff --git a/labscript_devices/naqslab_devices/NovaTechDDS/blacs_tab.py b/labscript_devices/naqslab_devices/NovaTechDDS/blacs_tab.py new file mode 100644 index 00000000..e0a2abfa --- /dev/null +++ b/labscript_devices/naqslab_devices/NovaTechDDS/blacs_tab.py @@ -0,0 +1,157 @@ +##################################################################### +# # +# /naqslab_devices/NovaTechDDS/blacs_tab.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# Source borrows heavily from labscript_devices/NovaTechDDS9m # +# # +##################################################################### +from blacs.device_base_class import DeviceTab + +class NovaTech409B_ACTab(DeviceTab): + + def __init__(self,*args,**kwargs): + if not hasattr(self,'device_worker_class'): + self.device_worker_class = "naqslab_devices.NovaTechDDS.blacs_worker.NovaTech409B_ACWorker" + DeviceTab.__init__(self,*args,**kwargs) + + def initialise_GUI(self): + # Capabilities + self.base_units = {'freq':'Hz', 'amp':'Arb', 'phase':'Degrees'} + self.base_min = {'freq':0.0, 'amp':0, 'phase':0} + self.base_max = {'freq':170.0*10.0**6, 'amp':1, 'phase':360} + self.base_step = {'freq':10**6, 'amp':1/1023., 'phase':1} + self.base_decimals = {'freq':1, 'amp':4, 'phase':3} # TODO: find out what the phase precision is! + self.num_DDS = 4 + + # Create DDS Output objects + dds_prop = {} + for i in range(self.num_DDS): # 4 is the number of DDS outputs on this device + dds_prop['channel %d' % i] = {} + for subchnl in ['freq', 'amp', 'phase']: + dds_prop['channel %d' % i][subchnl] = {'base_unit':self.base_units[subchnl], + 'min':self.base_min[subchnl], + 'max':self.base_max[subchnl], + 'step':self.base_step[subchnl], + 'decimals':self.base_decimals[subchnl] + } + # Create the output objects + self.create_dds_outputs(dds_prop) + # Create widgets for output objects + dds_widgets,ao_widgets,do_widgets = self.auto_create_widgets() + # and auto place the widgets in the UI + self.auto_place_widgets(("DDS Outputs",dds_widgets)) + + connection_object = self.settings['connection_table'].find_by_name(self.device_name) + conn_properties = connection_object.properties + + # Store the COM port to be used + blacs_connection = str(connection_object.BLACS_connection) + if ',' in blacs_connection: + self.com_port, baud_rate = blacs_connection.split(',') + self.baud_rate = int(baud_rate) + else: + self.com_port = blacs_connection + self.baud_rate = 19200 + + self.update_mode = conn_properties.get('update_mode', 'synchronous') + self.phase_mode = conn_properties.get('phase_mode', 'default') + # clocking properties + self.R_option = conn_properties.get('R_option',False) + self.ext_clk = conn_properties.get('ext_clk',False) + self.kp = conn_properties.get('kp',None) + self.clk_scale = conn_properties.get('clk_scale',1) + + # Create and set the primary worker + worker_init_kwargs = {'com_port': self.com_port, + 'baud_rate': self.baud_rate, + 'update_mode': self.update_mode, + 'phase_mode': self.phase_mode, + 'R_option': self.R_option, + 'ext_clk': self.ext_clk, + 'kp': self.kp, + 'clk_scale': self.clk_scale} + self.create_worker("main_worker", + self.device_worker_class, + worker_init_kwargs) + self.primary_worker = "main_worker" + + # Set the capabilities of this device + self.supports_remote_value_check(True) + self.supports_smart_programming(True) + + +class NovaTech409BTab(NovaTech409B_ACTab): + + def __init__(self,*args,**kwargs): + self.device_worker_class = "naqslab_devices.NovaTechDDS.blacs_worker.NovaTech409BWorker" + NovaTech409B_ACTab.__init__(self,*args,**kwargs) + +class NovaTech440ATab(NovaTech409B_ACTab): + + def __init__(self,*args,**kwargs): + if not hasattr(self,'device_worker_class'): + self.device_worker_class = "naqslab_devices.NovaTechDDS.blacs_worker.NovaTech440AWorker" + DeviceTab.__init__(self,*args,**kwargs) + + def initialise_GUI(self): + # Capabilities + self.base_units = {'freq':'Hz', 'phase':'Degrees'} + self.base_min = {'freq':200e3, 'phase':0} + self.base_max = {'freq':402.653183*10.0**6, 'phase':360} + self.base_step = {'freq':10**6, 'phase':1} + self.base_decimals = {'freq':0, 'phase':3} # TODO: find out what the phase precision is! + self.num_DDS = 1 + + # Create DDS Output objects + dds_prop = {} + for i in range(self.num_DDS): # only 1 DDS output + dds_prop['channel %d' % i] = {} + for subchnl in ['freq', 'phase']: + dds_prop['channel %d' % i][subchnl] = {'base_unit':self.base_units[subchnl], + 'min':self.base_min[subchnl], + 'max':self.base_max[subchnl], + 'step':self.base_step[subchnl], + 'decimals':self.base_decimals[subchnl] + } + # Create the output objects + self.create_dds_outputs(dds_prop) + # Create widgets for output objects + dds_widgets,ao_widgets,do_widgets = self.auto_create_widgets() + # and auto place the widgets in the UI + self.auto_place_widgets(("DDS Outputs",dds_widgets)) + + connection_object = self.settings['connection_table'].find_by_name(self.device_name) + conn_properties = connection_object.properties + + # Store the COM port to be used + blacs_connection = str(connection_object.BLACS_connection) + if ',' in blacs_connection: + self.com_port, baud_rate = blacs_connection.split(',') + self.baud_rate = int(baud_rate) + else: + self.com_port = blacs_connection + self.baud_rate = 19200 + + self.ext_clk = conn_properties.get('ext_clk',False) + self.clk_freq = conn_properties.get('clk_freq', None) + self.clk_scale = conn_properties.get('clk_scale',1) + + # Create and set the primary worker + self.create_worker("main_worker",self.device_worker_class, + {'com_port':self.com_port, + 'baud_rate': self.baud_rate, + 'ext_clk': self.ext_clk, + 'clk_freq': self.clk_freq, + 'clk_scale': self.clk_scale + }) + self.primary_worker = "main_worker" + + # Set the capabilities of this device + self.supports_remote_value_check(True) + self.supports_smart_programming(True) diff --git a/labscript_devices/naqslab_devices/NovaTechDDS/blacs_worker.py b/labscript_devices/naqslab_devices/NovaTechDDS/blacs_worker.py new file mode 100644 index 00000000..1515ca3b --- /dev/null +++ b/labscript_devices/naqslab_devices/NovaTechDDS/blacs_worker.py @@ -0,0 +1,453 @@ +##################################################################### +# # +# /naqslab_devices/NovaTechDDS/blacs_worker.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# Source borrows heavily from labscript_devices/NovaTechDDS9m # +# # +##################################################################### +from labscript import LabscriptError +from blacs.tab_base_classes import Worker + +import time +import numpy as np +import serial +import socket +import labscript_utils.h5_lock, h5py + + +class NovaTech409B_ACWorker(Worker): + def init(self): + """Initialization command run automatically by the BLACS tab on + startup. It establishes communication and sends initial default + configuration commands""" + self.smart_cache = {'STATIC_DATA': None, 'TABLE_DATA': '', + 'CURRENT_DATA':None} + self.baud_dict = {9600:b'78', 19200:b'3c', 38400:b'1e',57600:b'14',115200:b'0a'} + + self.err_codes = {b'?0':'Unrecognized Command', + b'?1':'Bad Frequency', + b'?2':'Bad AM Command', + b'?3':'Input Line Too Long', + b'?4':'Bad Phase', + b'?5':'Bad Time', + b'?6':'Bad Mode', + b'?7':'Bad Amp', + b'?8':'Bad Constant', + b'?f':'Bad Byte'} + + # total number of DDS channels on device & channel properties + self.N_chan = 4 + self.subchnls = ['freq','amp','phase'] + + # conversion dictionaries for program_static from + # program_manual + self.conv = {'freq':self.clk_scale*10**(-6),'amp':1023.0,'phase':16384.0/360.0}## check if things break 2019-02-22 + # and from transition_to_buffered + self.conv_buffered = {'freq':10**(-7),'amp':1,'phase':1} + # read from device conversion, basically conv_buffered/conv + self.read_conv = {'freq':1/(self.clk_scale*10.0),'amp':1/1023.0,'phase':360.0/16384.0} ## check if things break 2019-02-22 + + # set phase mode method + phase_mode_commands = { + 'aligned': b'm a', + 'continuous': b'm n'} + self.phase_mode_command = phase_mode_commands[self.phase_mode] + + self.connection = serial.Serial(self.com_port, baudrate = self.baud_rate, timeout=0.1) + self.connection.readlines() + + # to configure baud rate, must determine current device baud rate + # first check desired, since it's most likely + connected, response = self.check_connection() + if not connected: + # not already set + bauds = list(self.baud_dict) + if self.baud_rate in bauds: + bauds.remove(self.baud_rate) + else: + raise LabscriptError('%d baud rate not supported by Novatech 409B' % self.baud_rate) + + # iterate through other baud-rates to find current + for rate in bauds: + self.connection.baudrate = rate + connected, response = self.check_connection() + if connected: + # found it! + break + else: + raise LabscriptError('Error: Baud rate not found! Is Novatech DDS connected?') + + # now we can set the desired baud rate + baud_string = b'Kb %s\r\n' % (self.baud_dict[self.baud_rate]) + self.connection.write(baud_string) + # ensure command finishes before switching rates in pyserial + time.sleep(0.1) + self.connection.baudrate = self.baud_rate + connected, response = self.check_connection() + if not connected: + raise LabscriptError('Error: Failed to execute command "%s"' % baud_string.decode('utf8')) + + self.connection.write(b'e d\r\n') + response = self.connection.readline() + if response == b'e d\r\n': + # if echo was enabled, then the command to disable it echos back at us! + response = self.connection.readline() + if response != b'OK\r\n': + raise Exception('Error: Failed to execute command: "e d". Cannot connect to the device.') + + # set automatic updates and phase mode + self.write_check(b'M 0\r\n') + self.write_check(b'I a\r\n') + self.write_check(b'%s\r\n'%self.phase_mode_command) + + # Set clock parameters + if self.R_option: + # Using R option. Do not send C or Kp serial commands + pass + else: + # Pass kp value + self.write_check(b'Kp %02x\r\n'%self.kp) + # Pass clock setting + if self.ext_clk: + # Enable external clock + clk_command = b'C E\r\n' + else: + # Or enable internal clock + clk_command = b'C I\r\n' + self.write_check(clk_command) + + # populate the 'CURRENT_DATA' dictionary + self.check_remote_values() + + def check_connection(self): + '''Sends non-command and tests for correct response + returns tuple of connection state and reponse string''' + # check twice since false positive possible on first check + # use readlines in case echo is on + self.connection.write(b'\r\n') + self.connection.readlines() + self.connection.write(b'\r\n') + try: + response = self.connection.readlines()[-1] + connected = response == b'OK\r\n' + except IndexError: + # empty response, probably not connected + connected = False + response = b'' + + return connected, response + + def write_check(self,command): + '''Sends command and checks and confirms proper execution + by reading 'OK' from device.''' + self.connection.write(command) + response = self.check_error(self.connection.readline()) + if response != b'OK\r\n': + msg = '''Command "%s" did not execute properly.'''%command.decode('utf8') + raise Exception(dedent(msg)) + + def check_error(self,response): + '''Parse response for errors and raise appropriate error. + If no error, returns response unaltered.''' + if b'?' in response: + # there is an error in the response, + # get code number after ? + code = response.split(b'?',1)[-1][0] + try: + msg = 'NovaTech DDS at %s has error %s\n'%( + self.com_port,self.err_codes[b'?'+code]) + except KeyError: + msg = 'NovaTech DDS at %s has unrecognized error %s\n'%( + self.com_port,response.decode('utf8')) + # clear the read buffer before breaking + self.connection.readlines() + raise Exception(dedent(msg)) + + # if we didn't break, no error so return response + return response + + def check_remote_values(self): + """Queries device for current output settings. Return results as a + dictionary to update the BLACS tab.""" + self.connection.write(b'QUE\r\n') + try: + response = [self.connection.readline() for i in range(self.N_chan+1)] + except socket.timeout: + raise Exception('Failed to execute command "QUE". Cannot connect to device.') + results = {} + for i, line in enumerate(response[:self.N_chan]): + results['channel %d' % i] = {} + freq, phase, amp, ignore, ignore, ignore, ignore = line.split() + # Convert hex multiple of 0.1 Hz to Hz: + # Limit precision after converstion to 0.1 Hz + results['channel %d' % i]['freq'] = round(float(int(freq,16))*self.read_conv['freq'],1) + # Convert hex to int: + results['channel %d' % i]['amp'] = int(amp,16)*self.read_conv['amp'] + # Convert hex fraction of 16384 to degrees: + results['channel %d' % i]['phase'] = int(phase,16)*self.read_conv['phase'] + + self.smart_cache['CURRENT_DATA'] = results + return results + + def program_manual(self,front_panel_values): + """Called within the BLACS worker during transitions. This calls + program_static for each setting if it isn't already set.""" + for i in range(self.N_chan): + # and for each subchnl in the DDS, + for subchnl in self.subchnls: + # don't program if setting is the same + if self.smart_cache['CURRENT_DATA']['channel %d' % i][subchnl] == front_panel_values['channel %d' % i][subchnl]: + continue + # Program the sub channel + self.program_static(i,subchnl, + front_panel_values['channel %d' % i][subchnl]*self.conv[subchnl]) + # Now that a static update has been done, + # we'd better invalidate the saved STATIC_DATA for the channel: + self.smart_cache['STATIC_DATA'] = None + return self.check_remote_values() + + def program_static(self,channel,type,value): + """General output parameter programming function. + Only sends one command per use.""" + if type == 'freq': + command = b'F%d %.7f\r\n' % (channel,value) + elif type == 'amp': + command = b'V%d %d\r\n' % (channel,int(value)) + elif type == 'phase': + command = b'P%d %d\r\n' % (channel,int(value)) + else: + raise TypeError(type) + + self.write_check(command) + + def transition_to_buffered(self,device_name,h5file,initial_values,fresh): + + # Store the initial values in case we have to abort and restore them: + self.initial_values = initial_values + # Store the final values for use during transition_to_static: + self.final_values = initial_values + static_data = None + table_data = None + with h5py.File(h5file,'r') as hdf5_file: + group = hdf5_file['/devices/'+device_name] + # If there are values to set the unbuffered outputs to, set them now: + if 'STATIC_DATA' in group: + static_data = group['STATIC_DATA'][:][0] + # Now program the buffered outputs: + if 'TABLE_DATA' in group: + table_data = group['TABLE_DATA'][:] + # using table mode, need to reset memory pointer to zero + # Transition to table mode: + self.connection.write(b'M t\r\n') + self.connection.readline() + # And back to manual mode + self.connection.write(b'M 0\r\n') + if self.connection.readline() != b"OK\r\n": + raise Exception('Error: Failed to execute command: "%s"' % self.phase_mode_command.decode('utf8')) + + if static_data is not None: + data = static_data + if fresh or data != self.smart_cache['STATIC_DATA']: + self.smart_cache['STATIC_DATA'] = data + + # need to infer which channels to program + num_chan = len(data)//len(self.subchnls) + channels = [int(name[-1]) for name in data.dtype.names[0:num_chan]] + + for i in channels: + for subchnl in self.subchnls: + curr_value = self.smart_cache['CURRENT_DATA']['channel %d' % i][subchnl]*self.conv[subchnl] + value = data[subchnl+str(i)]*self.conv_buffered[subchnl] + if value == curr_value: + continue + else: + self.program_static(i,subchnl,value) + if subchnl == 'freq': + self.final_values['channel %d'%i][subchnl] = round(value/self.conv[subchnl],1) + self.smart_cache['CURRENT_DATA']['channel %d'%i][subchnl] = round(value*self.read_conv[subchnl],1) + else: + self.final_values['channel %d'%i][subchnl] = value/self.conv[subchnl] + self.smart_cache['CURRENT_DATA']['channel %d'%i][subchnl] = value*self.read_conv[subchnl] + + # Now program the buffered outputs: + if table_data is not None: + data = table_data + for i, line in enumerate(data): + st = time.time() + oldtable = self.smart_cache['TABLE_DATA'] + for ddsno in range(2): + if fresh or i >= len(oldtable) or (line['freq%d'%ddsno],line['phase%d'%ddsno],line['amp%d'%ddsno]) != (oldtable[i]['freq%d'%ddsno],oldtable[i]['phase%d'%ddsno],oldtable[i]['amp%d'%ddsno]): + self.connection.write(b't%d %04x %08x,%04x,%04x,ff\r\n'%(ddsno, i,line['freq%d'%ddsno],line['phase%d'%ddsno],line['amp%d'%ddsno])) + self.check_error(self.connection.readline()) # speed this up by block writing and reading and don't check errors + et = time.time() + tt=et-st + self.logger.debug('Time spent on line %s: %s' % (i,tt)) + # Store the table for future smart programming comparisons: + try: + self.smart_cache['TABLE_DATA'][:len(data)] = data + self.logger.debug('Stored new table as subset of old table') + except: # new table is longer than old table + self.smart_cache['TABLE_DATA'] = data + self.logger.debug('New table is longer than old table and has replaced it.') + + # Get the final values of table mode so that the GUI can + # reflect them after the run: + self.final_values['channel 0'] = {} + self.final_values['channel 1'] = {} + self.final_values['channel 0']['freq'] = round(data[-1]['freq0']*self.read_conv['freq'],1) + self.final_values['channel 1']['freq'] = round(data[-1]['freq1']*self.read_conv['freq'],1) + self.final_values['channel 0']['amp'] = data[-1]['amp0']*self.read_conv['amp'] + self.final_values['channel 1']['amp'] = data[-1]['amp1']*self.read_conv['amp'] + self.final_values['channel 0']['phase'] = data[-1]['phase0']*self.read_conv['phase'] + self.final_values['channel 1']['phase'] = data[-1]['phase1']*self.read_conv['phase'] + + # Transition to table mode: + self.write_check(b'm t\r\n') + if self.update_mode == 'synchronous': + # Transition to hardware synchronous updates: + self.write_check(b'I e\r\n') + # We are now waiting for a rising edge to trigger the output + # of the second table pair (first of the experiment) + elif self.update_mode == 'asynchronous': + # Output will now be updated on falling edges. + pass + else: + raise ValueError('invalid update mode %s'%self.update_mode.decode('utf8')) + + + return self.final_values + + def abort_transition_to_buffered(self): + return self.transition_to_manual(True) + + def abort_buffered(self): + # TODO: untested + return self.transition_to_manual(True) + + def transition_to_manual(self,abort = False): + self.write_check(b'M 0\r\n') + self.write_check(b'I a\r\n') + + if abort: + # If we're aborting the run, then we need to reset DDSs 2 and 3 to their initial values. + # 0 and 1 will already be in their initial values. We also need to invalidate the smart + # programming cache for them. + values = self.initial_values + DDSs = [2,3] + self.smart_cache['STATIC_DATA'] = None + else: + # If we're not aborting the run, then we need to set DDSs 0 and 1 to their final values. + # 2 and 3 will already be in their final values. + values = self.final_values + DDSs = [0,1] + + # only program the channels that we need to + for channel in values: + ddsnum = int(channel.split(' ')[-1]) + if ddsnum not in DDSs: + continue + for subchnl in self.subchnls: + self.program_static(ddsnum,subchnl,values[channel][subchnl]*self.conv[subchnl]) + + # return True to indicate we successfully transitioned back to manual mode + return True + + def shutdown(self): + self.connection.close() + +class NovaTech409BWorker(NovaTech409B_ACWorker): + + def transition_to_manual(self,abort = False): + if abort: + # If we're aborting the run, then we need to reset DDSs to their initial values. + # We also need to invalidate the smart programming cache for them. + self.smart_cache['STATIC_DATA'] = None + for channel in self.initial_values: + ddsnum = int(channel.split(' ')[-1]) + for subchnl in self.subchnls: + self.program_static(ddsnum,subchnl,self.initial_values[channel][subchnl]*self.conv[subchnl]) + else: + # if not aborting, final values already set so do nothing + pass + # return True to indicate we successfully transitioned back to manual mode + return True + +class NovaTech440AWorker(NovaTech409BWorker): + + def init(self): + """Modified init from 409B-AC. The 440A only supports one baud rate + and does not support output mode commands.""" + self.smart_cache = {'STATIC_DATA': None,'CURRENT_DATA':None} + + self.N_chan = 1 + self.subchnls = ['freq','phase'] + + # conversion dictionaries for program_static from + # program_manual + self.conv = {'freq':10**(-6),'phase':16384.0/360.0} + # and from transition_to_buffered + self.conv_buffered = {'freq':10**(-6),'phase':1} + # read from device conversion, nominally conv_buffered/conv + self.read_conv = {'freq':1/4.0,'phase':360.0/16384.0} + + self.connection = serial.Serial(self.com_port, baudrate = self.baud_rate, timeout=0.1) + self.connection.readlines() + + self.connection.write(b'e d\r\n') + response = self.connection.readline() + + if response == b'e d\r\n': + # if echo was enabled, then the command to disable it echos back at us! + response = self.connection.readline() + if response != b'OK\r\n': + raise Exception('Error: Failed to execute command: "e d". Cannot connect to the device.') + + # configure external clocking + if self.ext_clk: + self.write_check(b'Fr %.3f\r\n' % self.clk_freq) + self.write_check(b'C E\r\n') + else: + self.write_check(b'C D\r\n') + + # populate the 'CURRENT_DATA' dictionary + self.check_remote_values() + + def program_static(self,channel,type,value): + """General output parameter programming function. Only sends one command + per use.""" + if type == 'freq': + command = b'F%d %.6f\r\n' % (channel,value) #only 6 decimal places for 440A + elif type == 'phase': + command = b'P%d %d\r\n' % (channel,int(value)) + else: + raise TypeError(type) + self.write_check(command) + + def check_remote_values(self): + """The 440A Query command returns values in a different order and does + not tell the amplitude.""" + # Get the currently output values: + self.connection.write(b'QUE\r\n') + try: + response = self.check_error(self.connection.readline()) + except socket.timeout: + raise Exception('Failed to execute command "QUE". Cannot connect to device.') + + results = {} + results['channel 0'] = {} + phase, freq, ignore, ignore, ignore, ignore = response.split() + # Convert hex multiple in 0.25 Hz units to Hz: + results['channel 0']['freq'] = float(int(freq,16))*self.read_conv['freq'] + + # Convert hex fraction of 16384 to degrees: + results['channel 0']['phase'] = int(phase,16)*self.read_conv['phase'] + + self.smart_cache['CURRENT_DATA'] = results + + return results diff --git a/labscript_devices/naqslab_devices/NovaTechDDS/labscript_device.py b/labscript_devices/naqslab_devices/NovaTechDDS/labscript_device.py new file mode 100644 index 00000000..9ea81cca --- /dev/null +++ b/labscript_devices/naqslab_devices/NovaTechDDS/labscript_device.py @@ -0,0 +1,492 @@ +##################################################################### +# # +# /naqslab_devices/NovaTechDDS/labscript_device.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# Source borrows heavily from labscript_devices/NovaTechDDS9m # +# # +##################################################################### +from labscript import IntermediateDevice, DDS, StaticDDS, Device, config, LabscriptError, set_passed_properties +from labscript_utils.unitconversions import NovaTechDDS9mFreqConversion, NovaTechDDS9mAmpConversion + +import numpy as np +import warnings +import labscript_utils.h5_lock, h5py + +__version__ = '1.0.0' +__author__ = ['dihm'] + + +class NovaTech409B_AC(IntermediateDevice): + description = 'NT-DDS409B-AC' + allowed_children = [DDS, StaticDDS] + clock_limit = 9990 # This is a realistic estimate of the max clock rate + # (100us for TS/pin10 processing to load next value into buffer and + # 100ns pipeline delay on pin 14 edge to update output values) + + @set_passed_properties( + property_names = {'connection_table_properties': ['update_mode', + 'synchronous_first_line_repeat', + 'phase_mode', 'ext_clk', 'clk_freq', 'kp', + 'R_option', 'clk_scale']} + ) + def __init__(self, name, parent_device, + com_port = "", baud_rate=19200, + update_mode='synchronous', synchronous_first_line_repeat=False, + phase_mode='continuous', + ext_clk=False, clk_freq=None, clk_mult=None, + R_option=False, + **kwargs): + '''Labscript device class for NovaTech 409B-AC variant DDS. + This device has two dynamic channels (0,1) and two static + channels (2,3). If an external clock frequency is enabled, + and /R option is not being used, clk_freq (in MHz) + and clk_mult (int) must also be defined.''' + + IntermediateDevice.__init__(self, name, parent_device, **kwargs) + self.BLACS_connection = '%s,%s' % (com_port, str(baud_rate)) + if not update_mode in ['synchronous', 'asynchronous']: + raise LabscriptError('update_mode must be \'synchronous\' or \'asynchronous\'') + + if not phase_mode in ['aligned', 'continuous']: + raise LabscriptError('phase_mode must be \'aligned\' or \'continuous\'') + + self.update_mode = update_mode + self.phase_mode = phase_mode + self.synchronous_first_line_repeat = synchronous_first_line_repeat + self.ext_clk = ext_clk + self.clk_freq = clk_freq + self.R_option = R_option + self.clk_mult = clk_mult + + # validate clocking parameters and get frequency scaling factor + self.clk_scale = self.clock_check() + # save dds reference frequency, defined as clk_freq*clk_mult + self.set_property('reference_frequency', self.ref_freq, location='device_properties') + + def clock_check(self): + """Checks to make sure clk_mult and clk_freq have valid values, + as determined by the Novatech documentation. + Returns the correct frequency scaling factor to + account for different clocking options.""" + # hard-coded default values when using the internal clock + int_clock = 28.6331153067 + int_ref = 429.4967296 + + # Check R option. If true, then exit method + if self.R_option: + # Using 409b with /R option. Do nothing else + # Requires 10 MHz external clock. + clk_scale = 1 + return clk_scale + + # R option not used. Check external clock + if not self.ext_clk: + # using internal clock or R option + # set default values for kp, clk_freq, and clk_scale + self.clk_freq = int_clock + if self.clk_mult == None: + # use default value of kp + self.kp = 15 + self.ref_freq = int_ref + clk_scale = 1 + return clk_scale + else: + msg = '''Novatech DDS at %s is attempting to use the internal + clock with non-default clock multiplier %d. Are you sure?''' + msg = dedent(msg) % (self.BLACS_connection, self.clk_mult) + warnings.warn(msg, stacklevel=2) + + # Check that kp and clk_freq were supplied + try: + f = self.clk_mult*self.clk_freq + except TypeError: + msg = '''Must supply external clock frequency and clock + multiplier when using external clock!''' + raise LabscriptError(dedent(msg)) + + self.kp = self.clk_mult + self.ref_freq = f + + # Check that self.kp is valid, then frequency is valid. Also return modified clock multiplier + if self.clk_mult == 1: + # Check frequency range for kp = 1 + if f < 1 or 500 < f: + msg = '''Supplied clock frequency (%f MHz) + with clk_mult = 1 must be between 1 and 500 MHz.''' + msg = dedent(msg) % f + raise LabscriptError(msg) + # No need to change fre + elif self.clk_mult in range(4,21): + # Check if f is a good value and modify kp if so + if 100 <= f and f <= 160 : + # Must add 64 to decimal value. See 4.10 Range bit in the documentation + self.kp += 64 + elif 255 <= f and f <= 500: + # Must add 128 to decimal value. See 4.10 Range bit in the documentation + self.kp += 128 + else: + msg = '''Derived system clock frequency + (clk_mult*clk_freq = %f MHz) using the clock multiplier + must be between (100,160) or (255,500) MHz.''' + msg = dedent(msg) % f + raise LabscriptError(msg) + clk_scale = int_ref/(self.clk_mult*self.clk_freq) + return clk_scale + + def add_device(self, device): + Device.add_device(self, device) + # The Novatech doesn't support 0Hz output; set the default frequency of the DDS to 0.1 Hz: + device.frequency.default_value = 0.1 + + def get_default_unit_conversion_classes(self, device): + """Child devices call this during their __init__ (with themselves + as the argument) to check if there are certain unit calibration + classes that they should apply to their outputs, if the user has + not otherwise specified a calibration class""" + if device.connection in ['channel 0', 'channel 1', 'channel 2', 'channel 3']: + # Default calibration classes for the non-static channels: + return NovaTechDDS9mFreqConversion, NovaTechDDS9mAmpConversion, None + else: + return None, None, None + + + def quantise_freq(self, data, device): + """Provides bounds error checking and scales input values to instrument + units (0.1 Hz) before ensuring uint32 integer type.""" + if not isinstance(data, np.ndarray): + data = np.array(data) + # Ensure that frequencies are within bounds: + if np.any(data > 171.1276031e6 ) or np.any(data < 0.1 ): + raise LabscriptError('%s %s ' % (device.description, device.name) + + 'can only have frequencies between 0.1Hz and 171MHz, ' + + 'the limit imposed by %s.' % self.name) + # Factor of 10 is to convert to units of 0.1 Hz. + scale_factor = 10*self.clk_scale # Need to multiply by clk scale factor + + # It's faster to add 0.5 then typecast than to round to integers first: + data = np.array((scale_factor*data)+0.5,dtype=np.uint32) + return data, scale_factor + + def quantise_phase(self, data, device): + """Ensures phase is wrapped about 360 degrees and scales to instrument + units before type casting to uint16.""" + if not isinstance(data, np.ndarray): + data = np.array(data) + # ensure that phase wraps around: + data %= 360 + # It's faster to add 0.5 then typecast than to round to integers first: + scale_factor = 16384/360.0 + data = np.array((scale_factor*data)+0.5,dtype=np.uint16) + return data, scale_factor + + def quantise_amp(self,data,device): + """Ensures amplitude is within bounds and scales to instrument units + (between 0 and 1023) before typecasting to uint16""" + if not isinstance(data, np.ndarray): + data = np.array(data) + # ensure that amplitudes are within bounds: + if np.any(data > 1 ) or np.any(data < 0): + raise LabscriptError('%s %s ' % (device.description, device.name) + + 'can only have amplitudes between 0 and 1 (Volts peak to peak approx), ' + + 'the limit imposed by %s.' % self.name) + # It's faster to add 0.5 then typecast than to round to integers first: + data = np.array((1023*data)+0.5,dtype=np.uint16) + scale_factor = 1023 + return data, scale_factor + + def generate_code(self, hdf5_file): + DDSs = {} + for output in self.child_devices: + # Check that the instructions will fit into RAM: + if isinstance(output, DDS) and len(output.frequency.raw_output) > 16384 - 2: # -2 to include space for dummy instructions + raise LabscriptError('%s can only support 16383 instructions. ' % self.name + + 'Please decrease the sample rates of devices on the same clock, ' + + 'or connect %s to a different pseudoclock.' % self.name) + try: + prefix, channel = output.connection.split() + channel = int(channel) + except: + raise LabscriptError('%s %s has invalid connection string: \'%s\'. ' % (output.description,output.name,str(output.connection)) + + 'Format must be \'channel n\' with n from 0 to 4.') + DDSs[channel] = output + + if not DDSs: + # if no channels are being used, no need to continue + return + + for connection in DDSs: + if connection in range(4): + dds = DDSs[connection] + dds.frequency.raw_output, dds.frequency.scale_factor = self.quantise_freq(dds.frequency.raw_output, dds) + dds.phase.raw_output, dds.phase.scale_factor = self.quantise_phase(dds.phase.raw_output, dds) + dds.amplitude.raw_output, dds.amplitude.scale_factor = self.quantise_amp(dds.amplitude.raw_output, dds) + else: + raise LabscriptError('%s %s has invalid connection string: \'%s\'. ' % (dds.description,dds.name,str(dds.connection)) + + 'Format must be \'channel n\' with n from 0 to 4.') + + # determine what types of channels are needed + stat_DDSs = set(DDSs)&set(range(2,4)) + if set(DDSs)&set(range(2)): + dyn_DDSs = range(2) + else: + dyn_DDSs = [] + + if dyn_DDSs: + # only do dynamic channels if needed + dtypes = {'names':['freq%d' % i for i in dyn_DDSs] + + ['amp%d' % i for i in dyn_DDSs] + + ['phase%d' % i for i in dyn_DDSs], + 'formats':[np.uint32 for i in dyn_DDSs] + + [np.uint16 for i in dyn_DDSs] + + [np.uint16 for i in dyn_DDSs]} + + clockline = self.parent_clock_line + pseudoclock = clockline.parent_device + times = pseudoclock.times[clockline] + + out_table = np.zeros(len(times),dtype=dtypes) + out_table['freq0'].fill(1) + out_table['freq1'].fill(1) + + for connection in range(2): + if not connection in DDSs: + continue + dds = DDSs[connection] + # The last two instructions are left blank, for BLACS + # to fill in at program time. + out_table['freq%d' % connection][:] = dds.frequency.raw_output + out_table['amp%d' % connection][:] = dds.amplitude.raw_output + out_table['phase%d' % connection][:] = dds.phase.raw_output + + if self.update_mode == 'asynchronous' or self.synchronous_first_line_repeat: + # Duplicate the first line of the table. Otherwise, we are one step + # ahead in the table from the start of a run. In asynchronous + # updating mode, this is necessary since the first line of the + # table is already being output before the first trigger from + # the master clock. When using a simple delay line for synchronous + # output, this also seems to be required, in which case + # synchronous_first_line_repeat should be set to True. + # However, when a tristate driver is used as described at + # http://labscriptsuite.org/blog/implementation-of-the-novatech-dds9m/ + # then is is not neccesary to duplicate the first line. Use of a + # tristate driver in this way is the correct way to use + # the novatech DDS, as per its instruction manual, and so is likely + # to be the most reliable. However, through trial and error we've + # determined that duplicating the first line like this gives correct + # output in asynchronous mode and in synchronous mode when using a + # simple delay line, at least for the specific device we tested. + # Your milage may vary. + out_table = np.concatenate([out_table[0:1], out_table]) + + if stat_DDSs: + # only do static channels if needed + static_dtypes = {'names':['freq%d' % i for i in stat_DDSs] + + ['amp%d' % i for i in stat_DDSs] + + ['phase%d' % i for i in stat_DDSs], + 'formats':[np.uint32 for i in stat_DDSs] + + [np.uint16 for i in stat_DDSs] + + [np.uint16 for i in stat_DDSs]} + + static_table = np.zeros(1, dtype=static_dtypes) + + for connection in range(2,4): + if not connection in DDSs: + continue + dds = DDSs[connection] + static_table['freq%d' % connection] = dds.frequency.raw_output[0] + static_table['amp%d' % connection] = dds.amplitude.raw_output[0] + static_table['phase%d' % connection] = dds.phase.raw_output[0] + + # write out data tables + grp = self.init_device_group(hdf5_file) + if dyn_DDSs: + grp.create_dataset('TABLE_DATA',compression=config.compression,data=out_table) + if stat_DDSs: + grp.create_dataset('STATIC_DATA',compression=config.compression,data=static_table) + self.set_property('frequency_scale_factor', dds.frequency.scale_factor, location='device_properties') + self.set_property('amplitude_scale_factor', dds.amplitude.scale_factor, location='device_properties') + self.set_property('phase_scale_factor', dds.phase.scale_factor, location='device_properties') + + +class NovaTech409B(NovaTech409B_AC): + description = 'NT-DDS409B' + allowed_children = [StaticDDS] + clock_limit = 1 + # this is not a triggerable device + + @set_passed_properties( + property_names = {'connection_table_properties': ['phase_mode', + 'ext_clk', 'clk_freq', 'kp', + 'R_option', 'clk_scale']}) + def __init__(self, name, + com_port = "", baud_rate=19200, + phase_mode='default', R_option=False, + ext_clk=False, clk_freq=None, clk_mult=None, **kwargs): + '''Labscript class for NovaTech 409B DDS. + This device has four static DDS output channels.''' + + Device.__init__(self, name, None, com_port, **kwargs) + self.BLACS_connection = '{:s},{:s}'.format(com_port, str(baud_rate)) + + if not phase_mode in ['default', 'aligned', 'continuous']: + raise LabscriptError('phase_mode must be \'default\', \'aligned\' or \'continuous\'') + + self.phase_mode = phase_mode + self.R_option = R_option + self.ext_clk = ext_clk + self.clk_mult = clk_mult + self.clk_freq = clk_freq + + self.clk_scale = self.clock_check() + + def generate_code(self, hdf5_file): + """Modified version of 409B-AC generate_code that only handles static + DDS outputs""" + DDSs = {} + for output in self.child_devices: + try: + prefix, channel = output.connection.split() + channel = int(channel) + except: + raise LabscriptError('{:s} {:s} has invalid connection string: \'{:s}\'. '.format(output.description,output.name,str(output.connection)) + + 'Format must be \'channel n\' with n from 0 to 3.') + DDSs[channel] = output + + if not DDSs: + # if no channels are being used, no need to continue + return + + for connection in DDSs: + if connection in range(4): + # Static DDS + dds = DDSs[connection] + dds.frequency.raw_output, dds.frequency.scale_factor = self.quantise_freq(dds.frequency.static_value, dds) + dds.phase.raw_output, dds.phase.scale_factor = self.quantise_phase(dds.phase.static_value, dds) + dds.amplitude.raw_output, dds.amplitude.scale_factor = self.quantise_amp(dds.amplitude.static_value, dds) + else: + raise LabscriptError('{:s} {:s} has invalid connection string: \'{:s}\'. '.format(dds.description,dds.name,str(dds.connection)) + + 'Format must be \'channel n\' with n from 0 to 3.') + + static_dtypes = {'names':['freq{:d}'.format(i) for i in DDSs] + + ['amp{:d}'.format(i) for i in DDSs] + + ['phase{:d}'.format(i) for i in DDSs], + 'formats':[np.uint32 for i in DDSs] + + [np.uint16 for i in DDSs] + + [np.uint16 for i in DDSs]} + + static_table = np.zeros(1, dtype=static_dtypes) + + for connection in DDSs: + dds = DDSs[connection] + static_table['freq{:d}'.format(connection)] = dds.frequency.raw_output + static_table['amp{:d}'.format(connection)] = dds.amplitude.raw_output + static_table['phase{:d}'.format(connection)] = dds.phase.raw_output + + grp = self.init_device_group(hdf5_file) + grp.create_dataset('STATIC_DATA',compression=config.compression,data=static_table) + self.set_property('frequency_scale_factor', dds.frequency.scale_factor, location='device_properties') + self.set_property('amplitude_scale_factor', dds.amplitude.scale_factor, location='device_properties') + self.set_property('phase_scale_factor', dds.phase.scale_factor, location='device_properties') + +class NovaTech440A(NovaTech409B_AC): + description = 'NT-DDS440A' + allowed_children = [StaticDDS] + clock_limit = 1 + # this is not a triggerable device + @set_passed_properties( + property_names = {'connection_table_properties': [ + 'ext_clk', 'clk_freq','clk_scale']}) + def __init__(self, name, + com_port = "", baud_rate=19200, + ext_clk=False, clk_freq=None, **kwargs): + """Labscript class for Novatech 440A DDS. This is a high frequency + DDS with single channel output that does not support amplitude control""" + + Device.__init__(self, name, None, com_port, **kwargs) + self.BLACS_connection = '{:s},{:s}'.format(com_port, str(baud_rate)) + + if ext_clk and (clk_freq >= 1 and clk_freq <= 25): + msg = '''Must define clk_freq (in MHz) if using an external clock. + Supplied frequency must be between 1 and 25 MHz. Device + rounds down to nearest 8 kHz multiple.''' + raise LabscriptError(dedent(msg)) + self.ext_clk = ext_clk + self.clk_freq = clk_freq + + self.clk_scale = 1 + + def add_device(self, device): + Device.add_device(self, device) + # The Novatech doesn't support 0Hz output; + # set the default frequency of the DDS to 200 kHz: + device.frequency.default_value = 200e3 + + def quantise_freq(self, data, device): + if not isinstance(data, np.ndarray): + data = np.array(data) + # Ensure that frequencies are within bounds: + if np.any(data > 402.653183e6 ) or np.any(data < 0.2e3 ): + msg = """%s %s + can only have frequencies between 200kHz and 402MHz, + this limit imposed by %s.""" + msg = dedent(msg) % (device.description, device.name, self.name) + raise LabscriptError(msg) + # It's faster to add 0.5 then typecast than to round to integers first: + data = np.array((data)+0.5,dtype=np.uint32) + scale_factor = 1 + return data, scale_factor + + def generate_code(self, hdf5_file): + """Modified generate code from 409B to only accept one channel and + ignore amplitude commands which are not supported by the device.""" + DDSs = {} + for output in self.child_devices: + try: + prefix, channel = output.connection.split() + channel = int(channel) + except: + raise LabscriptError('{:s} {:s} has invalid connection string: \'{:s}\'. '.format(output.description,output.name,str(output.connection)) + + 'Format must be \'channel 0\'.') + DDSs[channel] = output + + if not DDSs: + # if no channels are being used, no need to continue + return + + for connection in DDSs: + if connection in range(1): + # Static DDS + dds = DDSs[connection] + dds.frequency.raw_output, dds.frequency.scale_factor = self.quantise_freq(dds.frequency.static_value, dds) + dds.phase.raw_output, dds.phase.scale_factor = self.quantise_phase(dds.phase.static_value, dds) + else: + raise LabscriptError('{:s} {:s} has invalid connection string: \'{:s}\'. '.format(dds.description,dds.name,str(dds.connection)) + + 'Format must be \'channel 0\'.') + + if dds.amplitude.static_value != 0.0: + # user has tried to set amplitude away from default + raise LabscriptError('{:s}:{:s} does not have controllable amplitude'.format(self.name, dds.name)) + + static_dtypes = {'names':['freq{:d}'.format(i) for i in DDSs] + + ['phase{:d}'.format(i) for i in DDSs], + 'formats':[np.uint32 for i in DDSs] + + [np.uint16 for i in DDSs] + + [np.uint16 for i in DDSs]} + + static_table = np.zeros(1, dtype=static_dtypes) + + for connection in DDSs: + dds = DDSs[connection] + static_table['freq{:d}'.format(connection)] = dds.frequency.raw_output + static_table['phase{:d}'.format(connection)] = dds.phase.raw_output + + grp = self.init_device_group(hdf5_file) + grp.create_dataset('STATIC_DATA',compression=config.compression,data=static_table) + self.set_property('frequency_scale_factor', dds.frequency.scale_factor, location='device_properties') + self.set_property('phase_scale_factor', dds.phase.scale_factor, location='device_properties') diff --git a/labscript_devices/naqslab_devices/NovaTechDDS/register_classes.py b/labscript_devices/naqslab_devices/NovaTechDDS/register_classes.py new file mode 100644 index 00000000..c667fca9 --- /dev/null +++ b/labscript_devices/naqslab_devices/NovaTechDDS/register_classes.py @@ -0,0 +1,30 @@ +##################################################################### +# # +# /naqslab_devices/NovaTechDDS/register_classes.py # +# # +# Copyright 2017, Christopher Billington, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +import labscript_devices + +labscript_devices.register_classes( + 'NovaTech409B', + BLACS_tab='naqslab_devices.NovaTechDDS.blacs_tab.NovaTech409BTab', + runviewer_parser='naqslab_devices.NovaTechDDS.runviewer_parser.NovaTech409BParser', +) + +labscript_devices.register_classes( + 'NovaTech409B_AC', + BLACS_tab='naqslab_devices.NovaTechDDS.blacs_tab.NovaTech409B_ACTab', + runviewer_parser='naqslab_devices.NovaTechDDS.runviewer_parser.NovaTech409B_ACParser', +) + +labscript_devices.register_classes( + 'NovaTech440A', + BLACS_tab='naqslab_devices.NovaTechDDS.blacs_tab.NovaTech440ATab', + runviewer_parser='naqslab_devices.NovaTechDDS.runviewer_parser.NovaTech440AParser') diff --git a/labscript_devices/naqslab_devices/NovaTechDDS/runviewer_parser.py b/labscript_devices/naqslab_devices/NovaTechDDS/runviewer_parser.py new file mode 100644 index 00000000..355404ad --- /dev/null +++ b/labscript_devices/naqslab_devices/NovaTechDDS/runviewer_parser.py @@ -0,0 +1,85 @@ +##################################################################### +# # +# /naqslab_devices/NovaTechDDS/runviewer_parser.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# Source borrows heavily from labscript_devices/NovaTechDDS9m # +# # +##################################################################### +import numpy as np +import labscript_utils.h5_lock, h5py + + +class NovaTech409B_ACParser(object): + def __init__(self, path, device): + self.path = path + self.name = device.name + self.device = device + self.dyn_chan = [0,1] + self.static_chan = [2,3] + + def get_traces(self, add_trace, clock=None): + if clock is None: + # we're the master pseudoclock, software triggered. So we don't have to worry about trigger delays, etc + raise Exception('No clock passed to %s. A NovaTechDDS must be clocked by another device.' % self.name) + + times, clock_value = clock[0], clock[1] + + clock_indices = np.where((clock_value[1:]-clock_value[:-1])==1)[0]+1 + # If initial clock value is 1, then this counts as a rising edge (clock should be 0 before experiment) + # but this is not picked up by the above code. So we insert it! + if clock_value[0] == 1: + clock_indices = np.insert(clock_indices, 0, 0) + clock_ticks = times[clock_indices] + + # get the data out of the H5 file + data = {} + with h5py.File(self.path, 'r') as hdf5_file: + if 'TABLE_DATA' in hdf5_file['devices/%s' % self.name]: + table_data = hdf5_file['devices/%s/TABLE_DATA' % self.name][:] + connection_table_properties = labscript_utils.properties.get(hdf5_file, self.name, 'connection_table_properties') + update_mode = getattr(connection_table_properties, 'update_mode', 'synchronous') + synchronous_first_line_repeat = getattr(connection_table_properties, 'synchronous_first_line_repeat', False) + if update_mode == 'asynchronous' or synchronous_first_line_repeat: + table_data = table_data[1:] + for i in self.dyn_chan: + for sub_chnl in ['freq', 'amp', 'phase']: + data['channel %d_%s' % (i,sub_chnl)] = table_data['%s%d' % (sub_chnl,i)][:] + + if 'STATIC_DATA' in hdf5_file['devices/%s' % self.name]: + static_data = hdf5_file['devices/%s/STATIC_DATA' % self.name][:] + num_chan = len(static_data)//3 + channels = [int(name[-1]) for name in static_data.dtype.names[0:num_chan]] + for i in channels: + for sub_chnl in ['freq', 'amp', 'phase']: + data['channel %d_%s' % (i,sub_chnl)] = np.empty((len(clock_ticks),)) + data['channel %d_%s' % (i,sub_chnl)].fill(static_data['%s%d' % (sub_chnl,i)][0]) + + + for channel, channel_data in data.items(): + data[channel] = (clock_ticks, channel_data) + + for channel_name, channel in self.device.child_list.items(): + for subchnl_name, subchnl in channel.child_list.items(): + connection = '%s_%s' % (channel.parent_port, subchnl.parent_port) + if connection in data: + add_trace(subchnl.name, data[connection], self.name, connection) + + return {} + +class NovaTech409BParser(NovaTech409B_ACParser): + def __init__(self, path, device): + NovaTech409B_ACParser.__init__(self,path,device) + self.dyn_chan = [] + self.static_chan = [0,1,2,3] + +class NovaTech440AParser(NovaTech409B_ACParser): + def __init__(self, path, device): + NovaTech409B_ACParser.__init__(self,path,device) + self.dyn_chan = [] + self.static_chan = [0] diff --git a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/__init__.py b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/__init__.py new file mode 100644 index 00000000..f5726129 --- /dev/null +++ b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/__init__.py @@ -0,0 +1,12 @@ +##################################################################### +# # +# /naqslab_devices/PulseBlasterESRPro300/__init__.py # +# # +# # +##################################################################### +from labscript_devices import deprecated_import_alias + + +# For backwards compatibility with old experiment scripts: +PulseBlasterESRPro300 = deprecated_import_alias( + "naqslab_devices.PulseBlasterESRPro300.labscript_device.PulseBlasterESRPro300") diff --git a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_tab.py b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_tab.py new file mode 100644 index 00000000..c6029353 --- /dev/null +++ b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_tab.py @@ -0,0 +1,32 @@ +##################################################################### +# # +# /naqslab_devices/PulseblasterESRpro300/blacs_tab.py # +# # +# Copyright 2013, Monash University # +# # +# This file is part of labscript_devices, in the labscript suite # +# (see http://labscriptsuite.org), and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +from labscript_devices.PulseBlaster_No_DDS import Pulseblaster_No_DDS_Tab + +# note that ESR-Pro boards only have 21 channels +# bits 21-23 are short pulse control bits +# STATE | 23 22 21 +# OFF | 000 +# ONE_PERIOD | 001 +# TWO_PERIOD | 010 +# THREE_PERIOD | 011 +# FOUR_PERIOD | 100 +# FIVE_PERIOD | 101 +# SIX_PERIOD | 110 not defined in manual, defined in spinapi.h +# ON | 111 + +class PulseBlasterESRPro300Tab(Pulseblaster_No_DDS_Tab): + # Capabilities + num_DO = 24 + def __init__(self,*args,**kwargs): + self.device_worker_class = "naqslab_devices.PulseBlasterESRPro300.blacs_worker.PulseBlasterESRPro300Worker" + Pulseblaster_No_DDS_Tab.__init__(self,*args,**kwargs) diff --git a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_worker.py b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_worker.py new file mode 100644 index 00000000..695151da --- /dev/null +++ b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_worker.py @@ -0,0 +1,31 @@ +##################################################################### +# # +# /naqslab_devices/PulseblasterESRpro300/blacs_worker.py # +# # +# Copyright 2013, Monash University # +# # +# This file is part of labscript_devices, in the labscript suite # +# (see http://labscriptsuite.org), and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +from labscript_devices.PulseBlaster_No_DDS import PulseblasterNoDDSWorker + +# note that ESR-Pro boards only have 21 channels +# bits 21-23 are short pulse control bits +# STATE | 23 22 21 +# OFF | 000 +# ONE_PERIOD | 001 +# TWO_PERIOD | 010 +# THREE_PERIOD | 011 +# FOUR_PERIOD | 100 +# FIVE_PERIOD | 101 +# SIX_PERIOD | 110 not defined in manual, defined in spinapi.h +# ON | 111 + +class PulseBlasterESRPro300Worker(PulseblasterNoDDSWorker): + core_clock_freq = 300.0 + ESRPro = True + + diff --git a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/labscript_device.py b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/labscript_device.py new file mode 100644 index 00000000..538cc5eb --- /dev/null +++ b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/labscript_device.py @@ -0,0 +1,33 @@ +##################################################################### +# # +# /naqslab_devices/PulseblasterESRpro300/labscript_device.py # +# # +# Copyright 2013, Monash University # +# # +# This file is part of labscript_devices, in the labscript suite # +# (see http://labscriptsuite.org), and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +from labscript_devices.PulseBlaster_No_DDS import PulseBlaster_No_DDS + +# note that ESR-Pro boards only have 21 channels +# bits 21-23 are short pulse control bits +# STATE | 23 22 21 +# OFF | 000 +# ONE_PERIOD | 001 +# TWO_PERIOD | 010 +# THREE_PERIOD | 011 +# FOUR_PERIOD | 100 +# FIVE_PERIOD | 101 +# SIX_PERIOD | 110 not defined in manual, defined in spinapi.h +# ON | 111 + +class PulseBlasterESRPro300(PulseBlaster_No_DDS): + description = 'SpinCore PulseBlaster ESR-PRO-300' + clock_limit = 30.0e6 # can probably go faster + clock_resolution = 4e-9 + n_flags = 24 + + diff --git a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/register_classes.py b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/register_classes.py new file mode 100644 index 00000000..b9a3f139 --- /dev/null +++ b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/register_classes.py @@ -0,0 +1,13 @@ +##################################################################### +# # +# /naqslab_devices/PulseBlasterESRPro300/register_classes.py # +# # +# # +##################################################################### +import labscript_devices + +labscript_devices.register_classes( + 'PulseBlasterESRPro300', + BLACS_tab='naqslab_devices.PulseBlasterESRPro300.blacs_tab.PulseBlasterESRPro300Tab', + runviewer_parser='naqslab_devices.PulseBlasterESRPro300.runviewer_parser.PulseBlasterESRProParser', +) diff --git a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/runviewer_parser.py b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/runviewer_parser.py new file mode 100644 index 00000000..257a53bc --- /dev/null +++ b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/runviewer_parser.py @@ -0,0 +1,28 @@ +##################################################################### +# # +# /naqslab_devices/PulseblasterESRpro300/runviewer_parser.py # +# # +# Copyright 2013, Monash University # +# # +# This file is part of labscript_devices, in the labscript suite # +# (see http://labscriptsuite.org), and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +from labscript_devices.PulseBlaster_No_DDS import PulseBlaster_No_DDS_Parser + +# note that ESR-Pro boards only have 21 channels +# bits 21-23 are short pulse control bits +# STATE | 23 22 21 +# OFF | 000 +# ONE_PERIOD | 001 +# TWO_PERIOD | 010 +# THREE_PERIOD | 011 +# FOUR_PERIOD | 100 +# FIVE_PERIOD | 101 +# SIX_PERIOD | 110 not defined in manual, defined in spinapi.h +# ON | 111 + +class PulseBlasterESRPro300Parser(PulseBlaster_No_DDS_Parser): + num_flags = 24 # only 21 usable, flags 21-23 used for short pulses diff --git a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/__init__.py b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/__init__.py new file mode 100644 index 00000000..a7ec61da --- /dev/null +++ b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/__init__.py @@ -0,0 +1,8 @@ +##################################################################### +# # +# /naqslab_devices/PulseBlaster_No_DDS_200/__init__.py # +# # +# # +##################################################################### + + diff --git a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_tab.py b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_tab.py new file mode 100644 index 00000000..0004bb96 --- /dev/null +++ b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_tab.py @@ -0,0 +1,20 @@ +##################################################################### +# # +# /naqslab_devices/Pulseblaster_No_DDS_200/blacs_tab.py # +# # +# Copyright 2013, Monash University # +# # +# This file is part of labscript_devices, in the labscript suite # +# (see http://labscriptsuite.org), and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +from labscript_devices.PulseBlaster_No_DDS import Pulseblaster_No_DDS_Tab + +class PulseBlaster_No_DDS_200_Tab(Pulseblaster_No_DDS_Tab): + # Capabilities + num_DO = 24 + def __init__(self,*args,**kwargs): + self.device_worker_class = "naqslab_devices.PulseBlaster_No_DDS_200.blacs_worker.PulseblasterNoDDS200Worker" + Pulseblaster_No_DDS_Tab.__init__(self,*args,**kwargs) diff --git a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_worker.py b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_worker.py new file mode 100644 index 00000000..02266d32 --- /dev/null +++ b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_worker.py @@ -0,0 +1,18 @@ +##################################################################### +# # +# /naqslab_devices/Pulseblaster_No_DDS_200/blacs_worker.py # +# # +# Copyright 2013, Monash University # +# # +# This file is part of labscript_devices, in the labscript suite # +# (see http://labscriptsuite.org), and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +from labscript_devices.PulseBlaster_No_DDS import PulseblasterNoDDSWorker + +class PulseblasterNoDDS200Worker(PulseblasterNoDDSWorker): + core_clock_freq = 200.0 + + diff --git a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/labscript_device.py b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/labscript_device.py new file mode 100644 index 00000000..c991790c --- /dev/null +++ b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/labscript_device.py @@ -0,0 +1,27 @@ +##################################################################### +# # +# /naqslab_devices/Pulseblaster_No_DDS_200/labscript_device.py # +# # +# Copyright 2013, Monash University # +# # +# This file is part of labscript_devices, in the labscript suite # +# (see http://labscriptsuite.org), and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +from labscript_devices.PulseBlaster_No_DDS import PulseBlaster_No_DDS + +class PulseBlaster_No_DDS_200(PulseBlaster_No_DDS): + """A thin subclass of labscript_devices.PulseBlaster_No_DDS. + + It's only purpose is to set the core clock frequency to 200 MHz for + our one custom USB pulseblaster device.""" + + description = 'SpinCore PulseBlaster USB with 200 MHz clock' + clock_limit = 17.2e6 # can probably go faster + clock_resolution = 10e-9 + core_clock_freq = 200 + n_flags = 24 + + diff --git a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/register_classes.py b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/register_classes.py new file mode 100644 index 00000000..2d94945a --- /dev/null +++ b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/register_classes.py @@ -0,0 +1,13 @@ +##################################################################### +# # +# /naqslab_devices/PulseBlaster_No_DDS_200/register_classes.py # +# # +# # +##################################################################### +import labscript_devices + +labscript_devices.register_classes( + 'PulseBlaster_No_DDS_200', + BLACS_tab='naqslab_devices.PulseBlaster_No_DDS_200.blacs_tab.PulseBlaster_No_DDS_200_Tab', + runviewer_parser='naqslab_devices.PulseBlaster_No_DDS_200.runviewer_parser.PulseBlaster_No_DDS_200_Parser', +) diff --git a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/runviewer_parser.py b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/runviewer_parser.py new file mode 100644 index 00000000..e71e5aa8 --- /dev/null +++ b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/runviewer_parser.py @@ -0,0 +1,16 @@ +##################################################################### +# # +# /naqslab_devices/Pulseblaster_No_DDS_200/runviewer_parser.py # +# # +# Copyright 2013, Monash University # +# # +# This file is part of labscript_devices, in the labscript suite # +# (see http://labscriptsuite.org), and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +from labscript_devices.PulseBlaster_No_DDS import PulseBlaster_No_DDS_Parser + +class PulseBlaster_No_DDS_200_Parser(PulseBlaster_No_DDS_Parser): + num_flags = 24 diff --git a/labscript_devices/naqslab_devices/README.md b/labscript_devices/naqslab_devices/README.md new file mode 100644 index 00000000..fb999653 --- /dev/null +++ b/labscript_devices/naqslab_devices/README.md @@ -0,0 +1,235 @@ +# README # + +This repository contains various 3rd-party device implementations for use with +the python-based [labscript suite](https://bitbucket.org/labscript_suite) +experiment control system. + +Devices include: + +* Novatech 409B, 409B-AC, & 440A DDS +* Stanford Research 865 Lockin Amplifier +* Tektronix TDS series oscilloscopes +* Keysight MSO/DSO X series oscilloscopes +* Various CW RF Signal Generators + * Rohde & Schwarz SMF 100A + * Rohde & Schwarz SMA 100B + * Rohde & Schwarz SMHU + * HP 8642A + * HP 8643A + * HP 8648A/B/C/D + * Keysight E8257N + * Keysight/Agilent DC Power Supplies + * E364x series tested + +The above code is designed to be modular allowing for easy addition of other +models, particularly oscilloscopes and CW Signal Generators. + +### How do I get set up? ### + +Clone this repository into the labscript suite directory. + +#### Valid since labscript\_devices version 2.6.0 #### + +Add the following line to the labconfig.ini file under the `[DEFAULT]` section. +``` +user_devices = naqslab_devices +``` + +#### For labscript\_devices post version 2.2.0. #### + +As of now BLACS will only look in the labscript\_devices repository for +device classes. +A quick workaround for this until a more permanant solution is implemented +is this diff applied to \_\_init\_\_.py in labscript\_devices + +```diff +@@ -68,6 +68,9 @@ + The old method may be deprecated in the future. + """ + ++lab_repo = 'naqslab_devices' ++lab_repo_dir = os.path.join(labscript_suite_install_dir,lab_repo) ++ + + class ClassRegister(object): + """A register for looking up classes by module name. Provides a +@@ -105,18 +108,21 @@ + # Ensure the module's code has run (this does not re-import it if it is already in sys.modules) + importlib.import_module('.' + name, __name__) + except ImportError: +- msg = """No %s registered for a device named %s. Ensure that there is a file +- 'register_classes.py' with a call to +- labscript_devices.register_classes() for this device, with the device +- name passed to register_classes() matching the name of the device class. ++ try: # hack to use local repo ++ importlib.import_module('.' + name, lab_repo) ++ except ImportError: ++ msg = """No %s registered for a device named %s. Ensure that there is a file ++ 'register_classes.py' with a call to ++ labscript_devices.register_classes() for this device, with the device ++ name passed to register_classes() matching the name of the device class. + +- Fallback method of looking for and importing a module in +- labscript_devices with the same name as the device also failed. If using +- this method, check that the module exists, has the same name as the +- device class, and can be imported with no errors. Import error +- was:\n\n""" +- msg = dedent(msg) % (self.instancename, name) + traceback.format_exc() +- raise ImportError(msg) ++ Fallback method of looking for and importing a module in ++ labscript_devices with the same name as the device also failed. If using ++ this method, check that the module exists, has the same name as the ++ device class, and can be imported with no errors. Import error ++ was:\n\n""" ++ msg = dedent(msg) % (self.instancename, name) + traceback.format_exc() ++ raise ImportError(msg) + # Class definitions in that module have executed now, check to see if class is in our register: + try: + return self.registered_classes[name] +@@ -250,6 +256,17 @@ + module_name = 'labscript_devices._register_classes_script_%d' % module_num + _ = imp.load_module(module_name, fp, pathname, desc) + module_num += 1 ++ ++ # hack for lab repo to use new arbitrary subfolders ++ for folder, _, filenames in os.walk(lab_repo_dir): ++ if 'register_classes.py' in filenames: ++ # The module name is the path to the file, relative to the labscript suite ++ # install directory: ++ # Open the file using the import machinery, and import it as module_name. ++ fp, pathname, desc = imp.find_module('register_classes', [folder]) ++ module_name = 'naqslab_devices._register_classes_script_%d' % module_num ++ _ = imp.load_module(module_name, fp, pathname, desc) ++ module_num += 1 + + + if __name__ == '__main__': + + +``` + +#### Usage #### + +Invoke in labscript scripts like other labscript\_devices +```python +from naqslab_devices import ScopeChannel +from naqslab_devices.KeysightXSeries.labscript_device import KeysightXScope +``` + +Usage of individual devices varies somewhat. +Here is an example connectiontable showing some of their instantiation with +labscript_devices > 2.2.0. +```python +from labscript import * +from naqslab_devices.PulseBlasterESRPro300.labscript_device import PulseBlasterESRPro300 +from naqslab_devices.NovaTechDDS.labscript_device import NovaTech409B, NovaTech409B_AC, NovaTech440A +from labscript_devices.NI_DAQmx import NI_DAQmx +from naqslab_devices.SignalGenerator.Models import RS_SMF100A, RS_SMHU +from naqslab_devices.SR865.labscript_device import SR865 +from naqslab_devices import ScopeChannel, StaticFreqAmp +from naqslab_devices.KeysightXSeries.labscript_device import KeysightXScope + +PulseBlasterESRPro300(name='pulseblaster_0', board_number=0, programming_scheme='pb_start/BRANCH') +ClockLine(name='pulseblaster_0_clockline_fast', pseudoclock=pulseblaster_0.pseudoclock, connection='flag 0') +ClockLine(name='pulseblaster_0_clockline_slow', pseudoclock=pulseblaster_0.pseudoclock, connection='flag 1') + +NI_DAQmx(name='ni_6343', parent_device=pulseblaster_0_clockline_fast, clock_terminal='/ni_usb_6343/PFI0', + MAX_name='ni_usb_6343', + num_AO = 4, + sample_rate_AO = 700e3, + num_DO = 32, + sample_rate_DO = 1e6, + num_AI = 32, + clock_terminal_AI = '/ni_usb_6343/PFI0', + mode_AI = 'labscript', + sample_rate_AI = 250e3, # 500 kS/s max aggregate + num_PFI=16, + DAQmx_waits_counter_bug_workaround=False) + +NovaTech409B(name='novatech_static', com_port="com4", baud_rate = 115200, phase_mode='aligned') +NovaTech409B_AC(name='novatech', parent_device=pulseblaster_0_clockline_slow, com_port="com3", update_mode='asynchronous', phase_mode='aligned', baud_rate = 115200) +NovaTech440A(name='HFnovatech', com_port='com6', baud_rate = 19200) +StaticDDS('HFDDS', HFnovatech, 'channel 0') + +# using NI-MAX alias instead of full VISA name +RS_SMHU(name='SMHU',VISA_name='SMHU58') +RS_SMF100A(name='SMF100A', VISA_name='SMF100A') + +# add Lock-In Amplifier +SR865(name='LockIn', VISA_name='SR865') + +# call the scope, use NI-MAX alias instead of full name +KeysightXScope(name='Scope',VISA_name='DSOX3024T', + trigger_device=pulseblaster_0.direct_outputs,trigger_connection='flag 3', + num_AI=4,DI=False) +ScopeChannel('Heterodyne',Scope,'Channel 1') +#ScopeChannel('Absorption',Scope,'Channel 2') +#ScopeChannel('Modulation',Scope,'Channel 4') + +# Define the Wait Monitor for the AC-Line Triggering +# note that connections used here cannot be used elsewhere +# 'connection' needs to be physically connected to 'acquisition_connection' +# for M-Series DAQs, ctr0 gate is on PFI9 +WaitMonitor(name='wait_monitor', parent_device=ni_6343, connection='port0/line0', acquisition_device=ni_6343, acquisition_connection='ctr0', timeout_device=ni_6343, timeout_connection='PFI1') + +DigitalOut( 'AC_trigger_arm', pulseblaster_0.direct_outputs, 'flag 2') + +# define the PB digital outputs +DigitalOut( 'probe_AOM', pulseblaster_0.direct_outputs, 'flag 4') +DigitalOut( 'blue_AOM', pulseblaster_0.direct_outputs, 'flag 5') +#DigitalOut( 'PB_6', pulseblaster_0.direct_outputs, 'flag 6') +#DigitalOut( 'PB_7', pulseblaster_0.direct_outputs, 'flag 7') +#DigitalOut( 'PB_8', pulseblaster_0.direct_outputs, 'flag 8') +DigitalOut( 'PB_9', pulseblaster_0.direct_outputs, 'flag 9') +DigitalOut( 'PB_10', pulseblaster_0.direct_outputs, 'flag 10') +DigitalOut( 'PB_11', pulseblaster_0.direct_outputs, 'flag 11') +DigitalOut( 'PB_12', pulseblaster_0.direct_outputs, 'flag 12') +DigitalOut( 'PB_13', pulseblaster_0.direct_outputs, 'flag 13') +DigitalOut( 'PB_14', pulseblaster_0.direct_outputs, 'flag 14') +DigitalOut( 'PB_15', pulseblaster_0.direct_outputs, 'flag 15') +DigitalOut( 'PB_16', pulseblaster_0.direct_outputs, 'flag 16') +DigitalOut( 'PB_17', pulseblaster_0.direct_outputs, 'flag 17') +DigitalOut( 'PB_18', pulseblaster_0.direct_outputs, 'flag 18') +DigitalOut( 'PB_19', pulseblaster_0.direct_outputs, 'flag 19') +DigitalOut( 'PB_20', pulseblaster_0.direct_outputs, 'flag 20') + +# short pulse control channels +DigitalOut( 'bit21', pulseblaster_0.direct_outputs, 'flag 21') +DigitalOut( 'bit22', pulseblaster_0.direct_outputs, 'flag 22') +DigitalOut( 'bit23', pulseblaster_0.direct_outputs, 'flag 23') + +AnalogOut( 'ProbeAmpLock', ni_6343, 'ao0') +AnalogOut( 'PSK', ni_6343, 'ao1') +AnalogOut( 'BlueAmpLock', ni_6343, 'ao2') +AnalogOut( 'ni_6343_ao3', ni_6343, 'ao3') + +AnalogIn( 'LockIn_X', ni_6343, 'ai0') +AnalogIn( 'LockIn_Y', ni_6343, 'ai1') +AnalogIn( 'PSK_Phase', ni_6343, 'ai2') +AnalogIn( 'AI3', ni_6343, 'ai3') + +# this dummy line necessary to balance the digital out for the wait monitor +DigitalOut( 'P0_1', ni_6343, 'port0/line1') + +StaticDDS( 'blueAOM', novatech_static, 'channel 0') +StaticDDS( 'ProbeBeatNote', novatech_static, 'channel 1') +StaticDDS( 'ProbeAOM', novatech_static, 'channel 2') +StaticDDS( 'LO', novatech_static, 'channel 3') + +DDS( 'dds0', novatech, 'channel 0') +DDS( 'dds1', novatech, 'channel 1') +StaticDDS( 'dds2', novatech, 'channel 2') +StaticDDS( 'dds3', novatech, 'channel 3') + +StaticFreqAmp( 'blueEOM', SMHU, 'channel 0', freq_limits=(0.1,4320), amp_limits=(-140,13)) +StaticFreqAmp( 'uWaves', SMF100A, 'channel 0', freq_limits=(100e-6,22), amp_limits=(-26,18)) + +start() + +stop(1) +``` + +### Contribution guidelines ### + +* Submitted code should follow labscript\_suite style and guidelines +* Submitted code should also be backwards compatible where possible diff --git a/labscript_devices/naqslab_devices/SR865/__init__.py b/labscript_devices/naqslab_devices/SR865/__init__.py new file mode 100644 index 00000000..79190854 --- /dev/null +++ b/labscript_devices/naqslab_devices/SR865/__init__.py @@ -0,0 +1,17 @@ +##################################################################### +# # +# /naqslab_devices/SR865/__init__.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +from labscript_devices import deprecated_import_alias + + +# For backwards compatibility with old experiment scripts: +SR865 = deprecated_import_alias("naqslab_devices.SR865.labscript_device.SR865") diff --git a/labscript_devices/naqslab_devices/SR865/blacs_tab.py b/labscript_devices/naqslab_devices/SR865/blacs_tab.py new file mode 100644 index 00000000..9853e68a --- /dev/null +++ b/labscript_devices/naqslab_devices/SR865/blacs_tab.py @@ -0,0 +1,88 @@ +##################################################################### +# # +# /naqslab_devices/SR865/blacs_tab.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from naqslab_devices.VISA.blacs_tab import VISATab + +from blacs.tab_base_classes import define_state +from blacs.tab_base_classes import MODE_MANUAL, MODE_TRANSITION_TO_BUFFERED, MODE_TRANSITION_TO_MANUAL, MODE_BUFFERED + +class SR865Tab(VISATab): + # Capabilities + + status_byte_labels = {'bit 7':'Power On', + 'bit 6':'Button Pressed', + 'bit 5':'Illegal Command', + 'bit 4':'Execution Error', + 'bit 3':'Query Queue Overflow', + 'bit 2':'unused', + 'bit 1':'Input Queue Overflow', + 'bit 0':'OPC'} + + def __init__(self,*args,**kwargs): + # set the worker + self.device_worker_class = 'naqslab_devices.SR865.blacs_worker.SR865Worker' + VISATab.__init__(self,*args,**kwargs) + + def initialise_GUI(self): + + # use AO widgets to mimick functionality + ao_prop = {'tau':{'base_unit':'s', + 'min':1e-6, + 'max':30e3, + 'step':1, + 'decimals':6}, + 'sens':{'base_unit':'V', + 'min':1e-9, + 'max':1, + 'step':1e-3, + 'decimals':9}, + 'phase':{'base_unit':'deg', + 'min':-180, + 'max':180, + 'step':1, + 'decimals':6}} + + self.create_analog_outputs(ao_prop) + ao_widgets = self.create_analog_widgets(ao_prop) + self.auto_place_widgets(('Settings',ao_widgets)) + + # call VISATab.initialise to create SR865 widget + VISATab.initialise_GUI(self) + + # Set the capabilities of this device + self.supports_remote_value_check(True) + self.supports_smart_programming(True) + self.statemachine_timeout_add(5000, self.status_monitor) + + @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) + def tau_changed(self,widget=None): + value = self.status_ui.tau_comboBox.currentIndex() + new_value = yield(self.queue_work(self._primary_worker,'set_tau',value)) + + # only update if value is different + if new_value != value: + # block signals for update + self.status_ui.tau_comboBox.blockSignals(True) + self.status_ui.tau_comboBox.setCurrentIndex(new_value) + self.status_ui.tau_comboBox.blockSignals(False) + + @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) + def sens_changed(self,widget=None): + value = self.status_ui.sens_comboBox.currentIndex() + new_value = yield(self.queue_work(self._primary_worker,'set_sens',value)) + + # only update if value is different + if new_value != value: + # block signals for update + self.status_ui.tau_comboBox.blockSignals(True) + self.status_ui.tau_comboBox.setCurrentIndex(new_value) + self.status_ui.tau_comboBox.blockSignals(False) + diff --git a/labscript_devices/naqslab_devices/SR865/blacs_worker.py b/labscript_devices/naqslab_devices/SR865/blacs_worker.py new file mode 100644 index 00000000..99fe0fbd --- /dev/null +++ b/labscript_devices/naqslab_devices/SR865/blacs_worker.py @@ -0,0 +1,136 @@ +##################################################################### +# # +# /naqslab_devices/SR865/blacs_worker.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +import numpy as np +from naqslab_devices.VISA.blacs_worker import VISAWorker +from labscript import LabscriptError + +import labscript_utils.h5_lock, h5py + +# import sensitivity and tau settings from labscript device +from naqslab_devices.SR865.labscript_device import sens, tau + +class SR865Worker(VISAWorker): + program_string = 'OFLT {:d};SCAL {:d};PHAS {:.6f}' + read_string = 'OFLT?;SCAL?;PHAS?' + + def phase_parser(self,phase_string): + '''Phase Query string parser''' + phase = float(phase_string) + return phase + + def coerce_tau(self,tau_constant): + '''Returns coerced, valid integer setting. + Tau value rounds up. + Returns max or min valid setting if out of bound.''' + coerced_i = int(np.digitize(tau_constant,tau,right=True)) + if coerced_i >= len(tau): + coerced_i -= 1 + return coerced_i + + def coerce_sens(self,sensitivity): + '''Returns coerced, valid integer setting. + Sens value rounds down. + Returns max or min valid setting if out of bound.''' + coerced_i = int(np.digitize(sensitivity,sens)) + if coerced_i >= len(sens): + coerced_i -= 1 + return coerced_i + + def init(self): + # Call the VISA init to initialise the VISA connection + VISAWorker.init(self) + + # initial configure of the instrument + self.connection.write('*ESE 122;*CLS;') + + def check_remote_values(self): + '''Queries the current settings for all three parameters. + Parses results to actual numbers and returns.''' + results = {} + + [tau_i, sens_i, phase] = self.connection.query_ascii_values(self.read_string,separator=';') + + # convert to proper numbers + results['tau'] = tau[int(tau_i)] + results['sens'] = sens[int(sens_i)] + results['phase'] = self.phase_parser(phase) + + return results + + def program_manual(self,front_panel_values): + '''Performans manual updates from BLACS front panel. + Tau and Sensitivity settings are coerced to nearest allowed value''' + tau_i = self.coerce_tau(front_panel_values['tau']) + sens_i = self.coerce_sens(front_panel_values['sens']) + phase = front_panel_values['phase'] + + self.connection.write(self.program_string.format(tau_i,sens_i,phase)) + + return self.check_remote_values() + + def transition_to_buffered(self,device_name,h5file,initial_values,fresh): + # call parent method to do basic preamble + VISAWorker.transition_to_buffered(self,device_name,h5file,initial_values,fresh) + + data = None + with h5py.File(h5file,'r') as hdf5_file: + group = hdf5_file['/devices/'+device_name] + # If there are values to set the unbuffered outputs to, set them now: + if 'STATIC_DATA' in group: + data = group['STATIC_DATA'][:][0] + + # Save these values into final_values so the GUI can + # be updated at the end of the run to reflect them: + # assume initial values in case something isn't programmed + self.final_values = initial_values + + if data is not None: + # since static instrument, smart_cache replaced with initial vals + cur = self.initial_values + if (data['tau_i'] != -1) and (fresh or (data['tau'] != cur['tau'])): + self.connection.write('OFLT {:d}'.format(data['tau_i'])) + self.final_values['tau'] = tau[data['tau_i']] + else: + self.final_values['tau'] = initial_values['tau'] + if (data['sens_i'] != -1) and (fresh or (data['tau'] != cur['tau'])): + self.connection.write('SCAL {:d}'.format(data['sens_i'])) + self.final_values['sens'] = sens[data['sens_i']] + else: + self.final_values['sens'] = initial_values['sens'] + if not np.isnan(data['phase']) and (fresh or (data['phase'] != cur['phase'])): + self.connection.write('PHAS {:.6f}'.format(data['phase'])) + self.final_values['phase'] = data['phase'] + else: + self.final_values['phase'] = initial_values['phase'] + + # write the final_values to h5file for later lookup + with h5py.File(h5file, 'r+') as hdf5_file: + group = hdf5_file['/devices/'+device_name] + group.attrs.create('sensitivity',self.final_values['sens']) + group.attrs.create('tau',self.final_values['tau']) + group.attrs.create('phase',round(self.final_values['phase'],6)) + + return self.final_values + + def check_status(self): + '''Queries device state using the ESR register. + Bit definitions defined in blacs_tab''' + esr = int(self.connection.query('*ESR?')) + mask = 122 + error_code = esr & mask + + if error_code: + # error exists, but nothing to report beyond register value + print('{:s} has ESR = {:d}'.format(self.VISA_name,error_code)) + + return self.convert_register(esr) + diff --git a/labscript_devices/naqslab_devices/SR865/labscript_device.py b/labscript_devices/naqslab_devices/SR865/labscript_device.py new file mode 100644 index 00000000..b5f544cc --- /dev/null +++ b/labscript_devices/naqslab_devices/SR865/labscript_device.py @@ -0,0 +1,107 @@ +##################################################################### +# # +# /naqslab_devices/SR865/labscript_device.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +import numpy as np + +from naqslab_devices.VISA.labscript_device import VISA +from labscript import Device, AnalogOut, config, LabscriptError, set_passed_properties + +__version__ = '0.1.1' +__author__ = ['dihm'] + +sens = np.array([1,500e-3,200e-3,100e-3,50e-3,20e-3,10e-3,5e-3,2e-3,1e-3, + 500e-6,200e-6,100e-6,50e-6,20e-6,10e-6,5e-6,2e-6,1e-6, + 500e-9,200e-9,100e-9,50e-9,20e-9,10e-9,5e-9,2e-9,1e-9]) + +tau = np.array([1e-6,3e-6,10e-6,30e-6,100e-6,300e-6, + 1e-3,3e-3,10e-3,30e-3,100e-3,300e-3, + 1,3,10,30,100,300,1e3,3e3,10e3,30e3]) + +class SR865(VISA): + description = 'SR865 Lock-In Amplifier' + allowed_children = None + + # initialize these parameters to None + tau = None + sens = None + phase = None + + @set_passed_properties() + def __init__(self, name, VISA_name): + '''VISA_name can be full VISA connection string or NI-MAX alias''' + # does not have a parent device + VISA.__init__(self,name,None,VISA_name) + + def set_tau(self, tau_constant): + '''Set the time constant in seconds. + Uses numpy digitize to translate to int values. + Using digitize corrects for round-off errors and coerces input to + nearest allowed setting.''' + self.tau = tau_constant + # check that setting is valid + if tau_constant in tau: + self.tau_i = np.digitize(tau_constant,tau,right=True) + else: + raise LabscriptError('{:s}: tau cannot be set to {:f}'.format(self.VISA_name,self.tau)) + + def set_sens(self, sensitivity): + '''Set the sensitivity in Volts + Uses numpy digitize to translate to int values. + Using digitize corrects for round-off errors and coerces input to + nearest allowed setting.''' + self.sens = sensitivity + # check that setting is valid + if sensitivity in sens: + self.sens_i = np.digitize(sensitivity,sens) + else: + raise LabscriptError('{:s}: sensitivity cannot be set to {:f}'.format(self.VISA_name,self.sens)) + + def set_phase(self, phase): + '''Set the phase reference in degrees + Device auto-converts to -180,180 range''' + self.phase = phase + + + def generate_code(self, hdf5_file): + '''Generates the transition to buffered code in the h5 file. + If parameter is not specified in shot, NaN and -1 values are set + to tell worker not to change the value when programming.''' + # type the static_table + static_dtypes = np.dtype({'names':['tau','tau_i','sens','sens_i','phase'], + 'formats':[np.float16,np.int8,np.float16,np.int8,np.float32]}) + static_table = np.zeros(1,dtype=static_dtypes) + + # if tau is set, add tau value to table, else add NaN + if self.tau: + static_table['tau'] = self.tau + static_table['tau_i'] = self.tau_i + else: + static_table['tau'] = np.NaN + static_table['tau_i'] = -1 + # if sensitivity is set, add sens to table, else add NaN + if self.sens: + static_table['sens'] = self.sens + static_table['sens_i'] = self.sens_i + else: + static_table['sens'] = np.NaN + static_table['sens_i'] = -1 + # if phase set, add to table, else NaN + if self.phase: + static_table['phase'] = self.phase + else: + static_table['phase'] = np.NaN + + grp = hdf5_file.create_group('/devices/'+self.name) + grp.create_dataset('STATIC_DATA',compression=config.compression,data=static_table) + # add these values to device properties for easy lookup + if self.tau: self.set_property('tau', self.tau, location='device_properties') + if self.sens: self.set_property('sensitivity', self.sens, location='device_properties') + if self.phase: self.set_property('phase',self.phase,location='device_properties') diff --git a/labscript_devices/naqslab_devices/SR865/register_classes.py b/labscript_devices/naqslab_devices/SR865/register_classes.py new file mode 100644 index 00000000..bab8be57 --- /dev/null +++ b/labscript_devices/naqslab_devices/SR865/register_classes.py @@ -0,0 +1,18 @@ +##################################################################### +# # +# /naqslab_devices/SR865/register_classes.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +import labscript_devices + +labscript_devices.register_classes( + 'SR865', + BLACS_tab='naqslab_devices.SR865.blacs_tab.SR865Tab', + runviewer_parser='') diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8642A.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8642A.py new file mode 100644 index 00000000..4598cd7a --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8642A.py @@ -0,0 +1,94 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/BLACS/HP_8642A.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab +from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker +from labscript import LabscriptError +import numpy as np + + +class enable_on_off_formatter(str): + '''Class overload that converts input bools to ON or OFF string''' + + def format(self, state): + if state == 0: + s = 'OF' + elif state == 1: + s = 'ON' + else: + raise ValueError('Argument must be 0 or 1 equivalent.') + + return super().format(s) + +class HP_8642ATab(SignalGeneratorTab): + # Capabilities + base_units = {'freq':'MHz', 'amp':'dBm'} + base_min = {'freq':0.1, 'amp':-140} + base_max = {'freq':1057.5, 'amp':20} + base_step = {'freq':1, 'amp':0.1} + base_decimals = {'freq':6, 'amp':1} + # Status Byte Label Definitions for HP8642A + status_byte_labels = {'bit 7':'Parameter Changed', + 'bit 6':'RQS', + 'bit 5':'Error', + 'bit 4':'Ready', + 'bit 3':'Local/Remote', + 'bit 2':'Execution Error', + 'bit 1':'Hardware Error', + 'bit 0':'End of Sweep'} + + def __init__(self,*args,**kwargs): + self.device_worker_class = HP_8642AWorker + SignalGeneratorTab.__init__(self,*args,**kwargs) + +class HP_8642AWorker(SignalGeneratorWorker): + # define the scale factor + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e6 + amp_scale_factor = 1.0 + + # define instrument specific read and write strings for Freq & Amp control + freq_write_string = 'FR {:.0f} HZ' #HP8642A can only accept 10 digits, in Hz + freq_query_string = 'FROA' #HP8642A returns 'FR sdddddddddd.0 HZ', in Hz + def freq_parser(self,freq_string): + '''Frequency Query string parser for HP8642A + freq_string format is FR sdddddddddd.0 HZ + Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' + return float(freq_string.split()[1]) + amp_write_string = 'AP {:.1f} DM' #HP8642A accepts one decimal, in dBm + amp_query_string = 'APOA' #HP8642A returns 'AP sddd.d DM' + def amp_parser(self,amp_string): + '''Amplitude Query string parser for HP8642A + amp_string format is AP sddd.d DM + Returns float in instrument units, dBm''' + # values less than -200 indicate instrument errors + # -201: RF OFF + # -202: reverse power is tripped + amp = float(amp_string.split()[1]) + if amp == -201: + return np.nan + elif amp <= -200: + raise LabscriptError('HP8642A error code {:d} for VISA device: {:s}'.format(amp,self.VISA_name)) + else: + # No error on amp read + return amp + enable_write_string = enable_on_off_formatter('AP{:s}') + enable_query_string = 'APOA' + def enable_parser(self, enable_string): + '''Query output status by checking for error codes.''' + amp = float(enable_string.split()[1]) + if amp == -201: + return False + elif amp <= -200: + raise LabscriptError('HP8642A error code {:d} for VISA device: {:s}'.format(amp,self.VISA_name)) + else: + # No error on amp read, output enabled + return True \ No newline at end of file diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8643A.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8643A.py new file mode 100644 index 00000000..b3f8248e --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8643A.py @@ -0,0 +1,91 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/BLACS/HP_8643A.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab +from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker, enable_on_off_formatter +from labscript import LabscriptError + +class HP_8643ATab(SignalGeneratorTab): + # Capabilities + base_units = {'freq':'MHz', 'amp':'dBm'} + base_min = {'freq':0.26, 'amp':-137} + base_max = {'freq':1030, 'amp':13} + base_step = {'freq':1, 'amp':0.1} + base_decimals = {'freq':8, 'amp':2} + # Event Status Byte Label Definitions for HP8643A + status_byte_labels = {'bit 7':'Power On', + 'bit 6':'URQ', + 'bit 5':'Command Error', + 'bit 4':'Execution Error', + 'bit 3':'Device Error', + 'bit 2':'Query Error', + 'bit 1':'RQC', + 'bit 0':'Operation Complete'} + + def __init__(self,*args,**kwargs): + self.device_worker_class = HP_8643AWorker + SignalGeneratorTab.__init__(self,*args,**kwargs) + +class HP_8643AWorker(SignalGeneratorWorker): + # define the scale factor + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e6 + amp_scale_factor = 1.0 + + def init(self): + '''Calls parent init and sends device specific initialization commands''' + SignalGeneratorWorker.init(self) + + # enables ESR status reading + self.connection.write('*ESE 60;*SRE 32;*CLS') + self.esr_mask = 60 + + # define instrument specific read and write strings for Freq & Amp control + freq_write_string = 'FREQ:CW {:.2f} HZ' #HP8643A has 0.01 Hz resolution, in Hz + freq_query_string = 'FREQ:CW?' #HP8643A returns float, in Hz + def freq_parser(self,freq_string): + '''Frequency Query string parser for HP8643A + freq_string format is float, in Hz + Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' + return float(freq_string) + amp_write_string = 'AMPL:LEV {:.2f} DBM' #HP8643A accepts two decimal, in dBm + amp_query_string = 'AMPL:LEV?' #HP8643A returns float in dBm + def amp_parser(self,amp_string): + '''Amplitude Query string parser for HP8643A + amp_string format is float in configured units (dBm by default) + Returns float in instrument units, dBm''' + return float(amp_string) + enable_write_string = enable_on_off_formatter('AMPL:STAT {:s}') + enable_query_string = 'AMPL:STAT?' + def enable_parser(self,enable_string): + '''Output Enable Query for HP 8643.''' + return 'ON' in enable_string + + def check_status(self): + # no real info in stb in these older sig gens, use esr instead + esr = int(self.connection.query('*ESR?')) + + # if esr is non-zero, read out the error message and report + # use mask to ignore non-error messages + if (esr & self.esr_mask) != 0: + err_string = self.connection.query('SYST:ERR? STR') + # some error conditions do not persist to query + # Still need to inform user of issue + if err_string.endswith('0'): + err_string = 'Event Status Register: {0:d}'.format(esr) + + msg = 'HP 8643A device {0:s} has \n{1:s}' + raise LabscriptError(dedent(msg.format(self.VISA_name,err_string))) + + # note: HP 8643A has 16 bits in ESR, + # so need to ensure future use bits not present when passed + return self.convert_register(esr & 255) + diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8648.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8648.py new file mode 100644 index 00000000..596eeb03 --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8648.py @@ -0,0 +1,115 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/BLACS/HP_8648.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab +from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker, enable_on_off_formatter +from labscript import LabscriptError +from labscript_utils import dedent + +class HP_8648ATab(SignalGeneratorTab): + # Capabilities + base_units = {'freq':'MHz', 'amp':'dBm'} + base_min = {'freq':0.1, 'amp':-136} + base_max = {'freq':1000, 'amp':20}#max output depends on options/frequency + base_step = {'freq':1, 'amp':1} + base_decimals = {'freq':9, 'amp':1} + # Event Status Byte Label Definitions for HP8648 + status_byte_labels = {'bit 7':'Power On', + 'bit 6':'URQ', + 'bit 5':'Command Error', + 'bit 4':'Execution Error', + 'bit 3':'Device Error', + 'bit 2':'Query Error', + 'bit 1':'RQC', + 'bit 0':'Operation Complete'} + + def __init__(self,*args,**kwargs): + self.device_worker_class = HP_8648Worker + SignalGeneratorTab.__init__(self,*args,**kwargs) + +class HP_8648BTab(HP_8648ATab): + # Capabilities + base_min = {'freq':0.009, 'amp':-136} + base_max = {'freq':2000, 'amp':20}#max output depends on options/frequency + +class HP_8648CTab(HP_8648ATab): + # Capabilities + base_min = {'freq':0.009, 'amp':-136} + base_max = {'freq':3200, 'amp':20}#max output depends on options/frequency + +class HP_8648DTab(HP_8648ATab): + # Capabilities + base_min = {'freq':0.009, 'amp':-136} + base_max = {'freq':4000, 'amp':20}#max output depends on options/frequency + +class HP_8648Worker(SignalGeneratorWorker): + # define the scale factor + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e6 + amp_scale_factor = 1.0 + + def init(self): + '''Calls parent init and sends device specific initialization commands''' + SignalGeneratorWorker.init(self) + try: + ident_string = self.connection.query('*IDN?') + except: + msg = '\'*IDN?\' command did not complete. Is %s connected?' + raise LabscriptError(dedent(msg%self.VISA_name)) from None + + if '8648' not in ident_string: + msg = '%s is not supported by the HP_8648 class.' + raise LabscriptError(dedent(msg%ident_string)) + + # enables ESR status reading + self.connection.write('*ESE 60;*SRE 32;*CLS') + self.esr_mask = 60 + + # define instrument specific read and write strings for Freq & Amp control + # Note that insturment display does not have as much resolution as device + freq_write_string = 'FREQ:CW {:.3f} HZ' #HP8648 has 0.001 Hz resolution, in Hz + freq_query_string = 'FREQ:CW?' #HP8648 returns float, in Hz + def freq_parser(self,freq_string): + '''Frequency Query string parser for HP8648 + freq_string format is float, in Hz + Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' + return float(freq_string) + amp_write_string = 'POW:AMPL {:.1f} DBM' #HP8648 accepts one decimal, in dBm + amp_query_string = 'POW:AMPL?' #HP8648 returns float in dBm + def amp_parser(self,amp_string): + '''Amplitude Query string parser for HP8648 + amp_string format is float in configured units (dBm by default) + Returns float in instrument units, dBm''' + return float(amp_string) + enable_write_string = enable_on_off_formatter('OUTP:STAT {:s}') + enable_query_string = 'OUTP:STAT?' + def enable_parser(self,enable_string): + '''Output Enable Query for HP 8648.''' + return 'ON' in enable_string + + def check_status(self): + # no real info in stb in these older sig gens, use esr instead + esr = int(self.connection.query('*ESR?')) + + # if esr is non-zero, read out the error message and report + # use mask to ignore non-error messages + if (esr & self.esr_mask) != 0: + err_string = self.connection.query('SYST:ERR?') + # some error conditions do not persist to query + # Still need to inform user of issue + if 'No error' in err_string: + err_string = 'Event Status Register: {0:d}'.format(esr) + + msg = '{0:s} has \n{1:s}' + raise LabscriptError(dedent(msg.format(self.VISA_name,err_string))) + + return self.convert_register(esr) + diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/KeysightSigGens.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/KeysightSigGens.py new file mode 100644 index 00000000..f0b42153 --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/KeysightSigGens.py @@ -0,0 +1,123 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/BLACS/KeysightSigGens.py # +# # +# Copyright 2019, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab +from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker + +from labscript_utils import check_version, dedent +from labscript import LabscriptError + +# need this version to ensure labscript device properties are auto-passed to worker +check_version('blacs','2.8.0','4') + + +class KeysightSigGenTab(SignalGeneratorTab): + """BLACS Tab for Modern Keysight/Agilent/HP CW Signal Generators + + Specific devices should subclass this class and define + `base_units` + `base_min` + `base_max` + `base_step` + `base_decimals` + for the frequency output 'channel 0'. Definitions are given is the base units. + """ + # Event Status Byte Label Definitions for Keysight Sig Gens + status_byte_labels = {'bit 7':'Power On', + 'bit 6':'URQ', + 'bit 5':'Command Error', + 'bit 4':'Execution Error', + 'bit 3':'Device Error', + 'bit 2':'Query Error', + 'bit 1':'RQC', + 'bit 0':'Operation Complete'} + + def __init__(self,*args,**kwargs): + self.device_worker_class = KeysightSigGenWorker + SignalGeneratorTab.__init__(self,*args,**kwargs) + + +class E8257NTab(KeysightSigGenTab): + # Capabilities + base_units = {'freq':'GHz', 'amp':'dBm'} + base_min = {'freq':0.010, 'amp':-105} + base_max = {'freq':40.0, 'amp':20}#max output depends on options/frequency + base_step = {'freq':1, 'amp':1} + base_decimals = {'freq':12, 'amp':1} + + +class KeysightSigGenWorker(SignalGeneratorWorker): + """Generic BLACS worker for Modern Keysight/Agilent/HP CW Signal Generators + + This class defines the common frequency/amplitude read/write commands as well + as general device configuration and communication. It uses the ESR byte + instead of the standard STB byte for intstrument communications. + + The `scale_factor` and `amp_scale_factor` are taken from the labscript + device specification. + + """ + # scale factors defined in labscript device specification + # Writing: scale*desired_freq // Reading:desired_freq/scale + + def init(self): + '''Calls parent init and sends device specific initialization commands''' + SignalGeneratorWorker.init(self) + try: + ident_string = self.connection.query('*IDN?') + except: + msg = '\'*IDN?\' command did not complete. Is %s connected?' + raise LabscriptError(dedent(msg%self.VISA_name)) from None + + # log which device connected to worker terminal + print('Connected to \n',ident_string) + + # enables ESR status reading + self.connection.write('*ESE 60;*SRE 32;*CLS') + self.esr_mask = 60 + + # define instrument specific read and write strings for Freq & Amp control + # Note that insturment display does not have as much resolution as device + freq_write_string = 'FREQ:CW {:.3f} HZ' #assume 0.001 Hz resolution, in Hz + freq_query_string = 'FREQ:CW?' # returns float, in Hz + def freq_parser(self,freq_string): + '''Frequency Query string parser for Keysight Sig Gens + freq_string format is float, in Hz + Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' + return float(freq_string) + amp_write_string = 'POW:AMPL {:.1f} DBM' #assume accepts one decimal, in dBm + amp_query_string = 'POW:AMPL?' #returns float in dBm + def amp_parser(self,amp_string): + '''Amplitude Query string parser for Keysight Sig Gens + amp_string format is float in configured units (dBm by default) + Returns float in instrument units, dBm''' + return float(amp_string) + enable_write_string = 'OUTP:STAT {:d}' + enable_query_string = 'OUTP:STAT?' + + def check_status(self): + # no real info in stb use esr instead + esr = int(self.connection.query('*ESR?')) + + # if esr is non-zero, read out the error message and report + # use mask to ignore non-error messages + if (esr & self.esr_mask) != 0: + err_string = self.connection.query('SYST:ERR?') + # some error conditions do not persist to query + # Still need to inform user of issue + if 'No error' in err_string: + err_string = 'Event Status Register: {0:d}'.format(esr) + + msg = '{0:s} has \n{1:s}' + raise LabscriptError(dedent(msg.format(self.VISA_name,err_string))) + + return self.convert_register(esr) + diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMA100B.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMA100B.py new file mode 100644 index 00000000..60e82c5c --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMA100B.py @@ -0,0 +1,70 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/BLACS/RS_SMA100B.py # +# # +# Copyright 2019, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab +from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker +from labscript import LabscriptError + + +class RS_SMA100BTab(SignalGeneratorTab): + # Capabilities + base_units = {'freq':'GHz', 'amp':'dBm'} + base_min = {'freq':8e-6, 'amp':-145} + base_max = {'freq':20, 'amp':35} # only 30 if f<=1 MHz + base_step = {'freq':0.1, 'amp':1} + base_decimals = {'freq':9, 'amp':2} + # Status Byte Label Definitions for SMA100B + status_byte_labels = {'bit 7':'Operation', + 'bit 6':'SRQ', + 'bit 5':'ESB', + 'bit 4':'Message Available', + 'bit 3':'Questionable Status', + 'bit 2':'Error Queue Not Empty', + 'bit 1':'Unused', + 'bit 0':'Unused'} + + def __init__(self,*args,**kwargs): + self.device_worker_class = RS_SMA100BWorker + SignalGeneratorTab.__init__(self,*args,**kwargs) + + +class RS_SMA100BWorker(SignalGeneratorWorker): + # define the scale factor + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e9 + amp_scale_factor = 1.0 + + # define instrument specific read and write strings for Freq & Amp control + freq_write_string = 'FREQ:CW {:.0f}HZ' + freq_query_string = 'FREQ:CW?' # SMA100B returns 'ddddddddddd', in Hz + def freq_parser(self,freq_string): + '''Frequency Query string parser for SMF100B + freq_string format is ddddddddddd + Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' + return float(freq_string) + amp_write_string = 'POW:POW {:.2f}dBm' # SMA100B accepts two decimals, in dBm + amp_query_string = 'POW?' # SMA100B returns 'sdd.dd' + def amp_parser(self,amp_string): + '''Amplitude Query string parser for SMF100B + Returns float in instrument units, dBm''' + return float(amp_string) + enable_write_string = 'OUTP:STAT {:d}' # take a bool value + enable_query_string = 'OUTP:STAT?' # returns 0 or 1 + + def check_status(self): + # call parent method to read status byte register + results = SignalGeneratorWorker.check_status(self) + # do some device specific error handling with status byte information + if results['bit 2'] == True: + errors = self.connection.query('SYST:ERR:ALL?') + raise LabscriptError('SMA100B VISA device {:s} has Errors in Queue: \n{:s}'.format(self.VISA_name,errors)) + + return results diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMF100A.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMF100A.py new file mode 100644 index 00000000..ab0685f0 --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMF100A.py @@ -0,0 +1,68 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/BLACS/RS_SMF100A.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab +from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker +from labscript import LabscriptError + +class RS_SMF100ATab(SignalGeneratorTab): + # Capabilities + base_units = {'freq':'GHz', 'amp':'dBm'} + base_min = {'freq':1e-6, 'amp':-26} + base_max = {'freq':22, 'amp':18} + base_step = {'freq':0.1, 'amp':1} + base_decimals = {'freq':6, 'amp':1} + # Status Byte Label Definitions for SMF100A + status_byte_labels = {'bit 7':'Operation', + 'bit 6':'SRQ', + 'bit 5':'ESB', + 'bit 4':'Message Available', + 'bit 3':'Questionable Status', + 'bit 2':'Error Queue Not Empty', + 'bit 1':'Unused', + 'bit 0':'Unused'} + + def __init__(self,*args,**kwargs): + self.device_worker_class = RS_SMF100AWorker + SignalGeneratorTab.__init__(self,*args,**kwargs) + +class RS_SMF100AWorker(SignalGeneratorWorker): + # define the scale factor + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e9 + amp_scale_factor = 1.0 + + # define instrument specific read and write strings for Freq & Amp control + freq_write_string = 'FREQ:CW {:.0f}HZ' + freq_query_string = 'FREQ?' #SMF100A returns 'ddddddddddd', in Hz + def freq_parser(self,freq_string): + '''Frequency Query string parser for SMF100A + freq_string format is ddddddddddd + Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' + return float(freq_string) + amp_write_string = 'POW:POW {:.2f}dBm' #SMF100A accepts two decimals, in dBm + amp_query_string = 'POW?' #SMF100A returns 'sdd.dd' + def amp_parser(self,amp_string): + '''Amplitude Query string parser for SMF100A + Returns float in instrument units, dBm''' + return float(amp_string) + enable_write_string = 'OUTP:STAT {:d}' # take a bool value + enable_query_string = 'OUTP:STAT?' # returns 0 or 1 + + def check_status(self): + # call parent method to read status byte register + results = SignalGeneratorWorker.check_status(self) + # do some device specific error handling with status byte information + if results['bit 2'] == True: + errors = self.connection.query('SYST:ERR:ALL?') + raise LabscriptError('SMF100A VISA device {:s} has Errors in Queue: \n{:s}'.format(self.VISA_name,errors)) + + return results diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMHU.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMHU.py new file mode 100644 index 00000000..78d55d0f --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMHU.py @@ -0,0 +1,101 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/BLACS/RS_SMHU.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab +from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker, enable_on_off_formatter +from labscript import LabscriptError +from labscript_utils import dedent + + +class RS_SMHUTab(SignalGeneratorTab): + # Capabilities + base_units = {'freq':'MHz', 'amp':'dBm'} + base_min = {'freq':0.1, 'amp':-140} + base_max = {'freq':4320, 'amp':13} + base_step = {'freq':1, 'amp':0.1} + base_decimals = {'freq':7, 'amp':1} + # Event Byte Label Definitions for RS SMHU + status_byte_labels = {'bit 7':'Power On', + 'bit 6':'URQ', + 'bit 5':'Command Error', + 'bit 4':'Execution Error', + 'bit 3':'Device-Dependent Error', + 'bit 2':'Query Error', + 'bit 1':'SRQ', + 'bit 0':'OPC'} + + def __init__(self,*args,**kwargs): + self.device_worker_class = RS_SMHUWorker + SignalGeneratorTab.__init__(self,*args,**kwargs) + + +class RS_SMHUWorker(SignalGeneratorWorker): + # define the scale factor + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e6 + amp_scale_factor = 1.0 + + def init(self): + '''Calls parent init and sends device specific initialization commands''' + SignalGeneratorWorker.init(self) + + # enables ESR status reading + try: + # this is first command to device, + # if failure then it probably isn't connected + self.connection.write('HEADER:OFF;*ESE 60;*SRE 32;*CLS') + except: + msg = 'Initial command to %s did not succeed. Is it connected?' + raise LabscriptError(dedent(msg%self.VISA_name)) from None + self.esr_mask = 60 + + # define instrument specific read and write strings for Freq & Amp control + freq_write_string = 'RF {:.1f}HZ' + freq_query_string = 'RF?' + def freq_parser(self,freq_string): + '''Frequency Query string parser for RS SMHU + freq_string format is sdddddddddd.d + Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' + return float(freq_string) + amp_write_string = 'LEVEL:RF {:.1f}DBM' + amp_query_string = 'LEVEL:RF?' + def amp_parser(self,amp_string): + '''Amplitude Query string parser for RS SMHU + amp_string format is sddd.d + Returns float in instrument units, dBm''' + if amp_string == '\n': + raise LabscriptError('RS SMHU device {0:s} has RF OFF!'.format(self.VISA_name)) + return float(amp_string) + enable_write_string = enable_on_off_formatter('LEV:RF {:s}') + enable_query_string = 'LEV:RF?' + def enable_parser(self,enable_string): + '''Output Enable Query for RS SMHU.''' + return 'ON' in enable_string + + def check_status(self): + # no real info in stb in these older sig gens, use esr instead + esr = int(self.connection.query('*ESR?')) + + # if esr is non-zero, read out the error message and report + # use mask to ignore non-error messages + if (esr & self.esr_mask) != 0: + err_string = self.connection.query('ERRORS?') + # some error conditions do not persist to ERRORS? query (ie query errors) + # Still need to inform user of issue + if err_string.endswith('0'): + err_string = 'Event Status Register: {0:d}'.format(esr) + else: + raise LabscriptError('RS SMHU device {0:s} has \n{1:s}'.format(self.VISA_name,err_string)) + + # note: SMHU has 9 bits in ESR, + # so need to ensure last bit (Sweep End) not present when passed + return self.convert_register(esr & 255) + diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/__init__.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/__init__.py new file mode 100644 index 00000000..3648fd3d --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/__init__.py @@ -0,0 +1,13 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/BLACS/__init__.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### + diff --git a/labscript_devices/naqslab_devices/SignalGenerator/Models.py b/labscript_devices/naqslab_devices/SignalGenerator/Models.py new file mode 100644 index 00000000..8535c3d2 --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/Models.py @@ -0,0 +1,113 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/Models.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from naqslab_devices.SignalGenerator.labscript_device import SignalGenerator + +__version__ = '0.1.0' +__author__ = ['dihm'] + +class RS_SMF100A(SignalGenerator): + description = 'Rhode & Schwarz SMF100A Signal Generator' + # define the scale factor - converts between BLACS front panel and + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e9 # ensure that the BLACS worker class has same scale_factor + freq_limits = (100e3, 22e9) # set in scaled unit (Hz) + amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor + amp_limits = (-26, 18) # set in scaled unit (dBm) + +class RS_SMA100B(SignalGenerator): + description = 'Rhode & Schwarz SMA100B Signal Generator' + # define the scale factor - converts between BLACS front panel and + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e9 # ensure that the BLACS worker class has same scale_factor + freq_limits = (8e3, 20e9) # set in scaled unit (Hz) + amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor + amp_limits = (-145, 35) # set in scaled unit (dBm) + +class RS_SMHU(SignalGenerator): + description = 'RS SMHU Signal Generator' + # define the scale factor - converts between BLACS front panel and + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor + freq_limits = (100e3, 4320e6) # set in scaled unit (Hz) + amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor + amp_limits = (-140, 13) # set in scaled unit (dBm) + # Output high can be adjusted up to 19dBm without spec guarantee + # above 13 will generate error warnings + +class HP_8643A(SignalGenerator): + description = 'HP 8643A Signal Generator' + # define the scale factor - converts between BLACS front panel and + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor + freq_limits = (260e3, 1030e6) # set in scaled unit (Hz) + amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor + amp_limits = (-137, 13) # set in scaled unit (dBm) + +class HP_8642A(SignalGenerator): + description = 'HP 8642A Signal Generator' + # define the scale factor - converts between BLACS front panel and + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor + freq_limits = (100e3, 1057.5e6) # set in scaled unit (Hz) + amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor + amp_limits = (-140, 20) # set in scaled unit (dBm) + # Output limits depend on frequency. Can be as low as 17 dBm + +class HP_8648A(SignalGenerator): + description = 'HP 8648A Signal Generator' + # define the scale factor - converts between BLACS front panel and + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor + freq_limits = (100e3, 1000e6) # set in scaled unit (Hz) + amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor + amp_limits = (-136, 20) # set in scaled unit (dBm) + # Output limits depend on frequency. Can be as low as 10 dBm + +class HP_8648B(SignalGenerator): + description = 'HP 8648B Signal Generator' + # define the scale factor - converts between BLACS front panel and + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor + freq_limits = (9e3, 2000e6) # set in scaled unit (Hz) + amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor + amp_limits = (-136, 20) # set in scaled unit (dBm) + # Output limits depend on frequency. Can be as low as 10 dBm + +class HP_8648C(SignalGenerator): + description = 'HP 8648C Signal Generator' + # define the scale factor - converts between BLACS front panel and + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor + freq_limits = (9e3, 3200e6) # set in scaled unit (Hz) + amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor + amp_limits = (-136, 20) # set in scaled unit (dBm) + # Output limits depend on frequency. Can be as low as 10 dBm + +class HP_8648D(SignalGenerator): + description = 'HP 8648D Signal Generator' + # define the scale factor - converts between BLACS front panel and + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor + freq_limits = (9e3, 4000e6) # set in scaled unit (Hz) + amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor + amp_limits = (-136, 20) # set in scaled unit (dBm) + # Output limits depend on frequency. Can be as low as 10 dBm + +class E8257N(SignalGenerator): + description = 'Keysight E8257N Signal Generator' + # define the scale factor - converts between BLACS front panel and + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e9 # ensure that the BLACS worker class has same scale_factor + freq_limits = (10e6, 40e9) # set in scaled unit (Hz) + amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor + amp_limits = (-105, 20) # set in scaled unit (dBm) + # Output limits depend heavily on frequency diff --git a/labscript_devices/naqslab_devices/SignalGenerator/__init__.py b/labscript_devices/naqslab_devices/SignalGenerator/__init__.py new file mode 100644 index 00000000..a3771047 --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/__init__.py @@ -0,0 +1,22 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/__init__.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +from labscript_devices import deprecated_import_alias + +# For backwards compatibility with old experiment scripts: +RS_SMF100A = deprecated_import_alias("naqslab_devices.SignalGenerator.Models.RS_SMF100A") + +RS_SMHU = deprecated_import_alias("naqslab_devices.SignalGenerator.Models.RS_SMHU") + +HP8643A = deprecated_import_alias("naqslab_devices.SignalGenerator.Models.HP8643A") + +HP8642A = deprecated_import_alias("naqslab_devices.SignalGenerator.Models.HP8642A") diff --git a/labscript_devices/naqslab_devices/SignalGenerator/blacs_tab.py b/labscript_devices/naqslab_devices/SignalGenerator/blacs_tab.py new file mode 100644 index 00000000..b1b40a18 --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/blacs_tab.py @@ -0,0 +1,70 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/blacs_tab.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from naqslab_devices.VISA.blacs_tab import VISATab + +# note, when adding a new model, put the labscript_device inheritor class +# into Models.py and the BLACS classes into a file named for the device +# in the BLACS subfolder. Update register_classes.py and __init__.py +# accordingly. + + +class SignalGeneratorTab(VISATab): + # Capabilities + base_units = {'freq':'MHz', 'amp':'dBm'} + base_min = {'freq':0.1, 'amp':-140} + base_max = {'freq':1057.5, 'amp':20} + base_step = {'freq':1, 'amp':0.1} + base_decimals = {'freq':6, 'amp':1} + + status_byte_labels = {'bit 7':'bit 7 label', + 'bit 6':'bit 6 label', + 'bit 5':'bit 5 label', + 'bit 4':'bit 4 label', + 'bit 3':'bit 3 label', + 'bit 2':'bit 2 label', + 'bit 1':'bit 1 label', + 'bit 0':'bit 0 label'} + + def __init__(self,*args,**kwargs): + if not hasattr(self,'device_worker_class'): + #raise LabscriptError('%s __init__ method not overridden!'%self) + self.device_worker_class = 'naqslab_devices.SignalGenerator.blacs_worker.SignalGeneratorWorker' + VISATab.__init__(self,*args,**kwargs) + + def initialise_GUI(self): + # Create the dds channel + dds_prop = {} + dds_prop['channel 0'] = {} #HP signal generators only have one output + for subchnl in ['freq', 'amp']: + dds_prop['channel 0'][subchnl] = {'base_unit':self.base_units[subchnl], + 'min':self.base_min[subchnl], + 'max':self.base_max[subchnl], + 'step':self.base_step[subchnl], + 'decimals':self.base_decimals[subchnl] + } + dds_prop['channel 0']['gate'] = {} + + + # Create the output objects + self.create_dds_outputs(dds_prop) + # Create widgets for output objects + dds_widgets,ao_widgets,do_widgets = self.auto_create_widgets() + # and auto place the widgets in the UI + self.auto_place_widgets(("Frequency Output",dds_widgets)) + + # call VISATab.initialise to create STB widget + VISATab.initialise_GUI(self) + + # Set the capabilities of this device + self.supports_remote_value_check(True) + self.supports_smart_programming(True) + self.statemachine_timeout_add(10000, self.status_monitor) diff --git a/labscript_devices/naqslab_devices/SignalGenerator/blacs_worker.py b/labscript_devices/naqslab_devices/SignalGenerator/blacs_worker.py new file mode 100644 index 00000000..b63e968b --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/blacs_worker.py @@ -0,0 +1,225 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/blacs_worker.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +import numpy as np + +from naqslab_devices.VISA.blacs_worker import VISAWorker +from labscript import LabscriptError + +import labscript_utils.h5_lock, h5py + +# note, when adding a new model, put the labscript_device inheritor class +# into Models.py and the BLACS classes into a file named for the device +# in the BLACS subfolder. Update register_classes.py and __init__.py +# accordingly. + + +class enable_on_off_formatter(str): + '''Class overload that converts input bools to ON or OFF string''' + + def format(self, state): + if state == 0: + s = 'OFF' + elif state == 1: + s = 'ON' + else: + raise ValueError('Argument must be 0 or 1 equivalent.') + + return super().format(s) + + +class SignalGeneratorWorker(VISAWorker): + + # define instrument specific read and write strings for Freq & Amp control + freq_write_string = '' + freq_query_string = '' + def freq_parser(self,freq_string): + '''Frequency Query string parser + + Converts string to float; should be be over-ridden + if that is insufficient. + + Args: + freq_string (str): String result from query. + + Returns: + float: Frequency as a float. + ''' + freq = float(freq_string) + return freq + amp_write_string = '' + amp_query_string = '' + def amp_parser(self,amp_string): + '''Amplitude Query string parser + + Converts string to float; should be be over-ridden + if that is insufficient. + + Args: + amp_string (str): String result from query. + + Returns: + float: Amplitude as a float. + ''' + amp = float(amp_string) + return amp + enable_write_string = '' + enable_query_string = '' + def enable_parser(self,enable_string): + '''Output Enable Query string parser. + + Converts the string to bool; should be over-ridden + if that is insufficient. + + Args: + enable_string (str): String result from query. + + Returns: + bool: Boolean that indicates if output is enabled or not. + ''' + enable = bool(int(enable_string)) + return enable + + def update_cache_from_dict(self, front_panel): + '''Update the STATIC smart cache from a front_panel dictionary''' + + for chan, d in front_panel.items(): + chan_n = chan.split(' ')[-1] + self.smart_cache['STATIC_DATA']['freq'+chan_n] = d['freq']*self.scale_factor + self.smart_cache['STATIC_DATA']['amp'+chan_n] = d['amp']*self.amp_scale_factor + self.smart_cache['STATIC_DATA']['gate'+chan_n] = d['gate'] + + def init(self): + # Call the VISA init to initialise the VISA connection + VISAWorker.init(self) + + # initialize the smart cache + static_dtypes = np.dtype({'names':['freq0','amp0','gate0'], + 'formats':[np.uint64,np.float16,bool]}) + self.smart_cache = {'STATIC_DATA': np.zeros(1, dtype=static_dtypes)[0]} + + # set static smart cache to current state + current_state = self.check_remote_values() + self.update_cache_from_dict(current_state) + + def check_remote_values(self): + # Get the currently output values: + + results = {'channel 0':{}} + + # these query strings and parsers depend heavily on device + freq = self.connection.query(self.freq_query_string) + amp = self.connection.query(self.amp_query_string) + enable = self.connection.query(self.enable_query_string) + + # Convert string to MHz: + results['channel 0']['freq'] = self.freq_parser(freq)/self.scale_factor + + results['channel 0']['amp'] = self.amp_parser(amp)/self.amp_scale_factor + + results['channel 0']['gate'] = self.enable_parser(enable) + + return results + + def program_manual(self,front_panel_values): + freq = front_panel_values['channel 0']['freq'] + amp = front_panel_values['channel 0']['amp'] + enable = front_panel_values['channel 0']['gate'] + + # program with scale factor + fcommand = self.freq_write_string.format(freq*self.scale_factor) + self.connection.write(fcommand) + + # program with scale factor + acommand = self.amp_write_string.format(amp*self.amp_scale_factor) + self.connection.write(acommand) + + # set output state + ecommand = self.enable_write_string.format(enable) + self.connection.write(ecommand) + + # update smart_cache after manual update + updated_state = self.check_remote_values() + self.update_cache_from_dict(updated_state) + + return self.check_remote_values() + + def transition_to_buffered(self,device_name,h5file,initial_values,fresh): + # call parent method to do basic preamble + VISAWorker.transition_to_buffered(self,device_name,h5file,initial_values,fresh) + data = None + # Program static values + with h5py.File(h5file,'r') as hdf5_file: + group = hdf5_file['/devices/'+device_name] + # If there are values to set the unbuffered outputs to, set them now: + if 'STATIC_DATA' in group: + data = group['STATIC_DATA'][0] + + if data is not None: + + if fresh or data != self.smart_cache['STATIC_DATA']: + + # program freq and amplitude as necessary + if data['freq0'] != self.smart_cache['STATIC_DATA']['freq0']: + self.connection.write(self.freq_write_string.format(data['freq0'])) + if data['amp0'] != self.smart_cache['STATIC_DATA']['amp0']: + self.connection.write(self.amp_write_string.format(data['amp0'])) + if data['gate0'] != self.smart_cache['STATIC_DATA']['gate0']: + self.connection.write(self.enable_write_string.format(data['gate0'])) + + # update smart_cache + self.smart_cache['STATIC_DATA'] = data + + # Save these values into final_values so the GUI can + # be updated at the end of the run to reflect them: + final_values = {'channel 0':{}} + + final_values['channel 0']['freq'] = data['freq0']/self.scale_factor + final_values['channel 0']['amp'] = data['amp0']/self.amp_scale_factor + final_values['channel 0']['gate'] = data['gate0'] + + else: + final_values = self.initial_values + + return final_values + + +class MockSignalGeneratorWorker(SignalGeneratorWorker): + """Mock Signal Generator Class + + Mock class for testing Signal Generator Tab functionality. + It does not communicate with any hardware. + """ + + def init(self): + # initialize the smart cache + self.smart_cache = {'STATIC_DATA': {'freq0':0,'amp0':1,'gate0':False}} + + def check_remote_values(self): + return {'channel 0':self.smart_cache['STATIC_DATA']} + + def check_status(self): + stb = 128 + + return self.convert_register(stb) + + def program_manual(self,front_panel_values): + self.smart_cache['STATIC_DATA'] = front_panel_values['channel 0'] + return self.check_remote_values() + + def transition_to_buffered(self,device_name,h5file,initial_values,fresh): + VISAWorker.transition_to_buffered(self,device_name,h5file,initial_values,fresh) + + def clear(self,value): + pass + + def shutdown(self): + pass diff --git a/labscript_devices/naqslab_devices/SignalGenerator/labscript_device.py b/labscript_devices/naqslab_devices/SignalGenerator/labscript_device.py new file mode 100644 index 00000000..55b3da4b --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/labscript_device.py @@ -0,0 +1,133 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/labscript_device.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +import numpy as np + +from naqslab_devices.VISA.labscript_device import VISA +from labscript import LabscriptError, set_passed_properties, config +from labscript_utils import dedent + +from naqslab_devices import StaticFreqAmp + +__version__ = '0.2.0' +__author__ = ['dihm'] + +# note, when adding a new model, put the labscript_device inheritor class +# into Models.py and the BLACS classes into a file named for the device +# in the BLACS subfolder. Update register_classes.py and __init__.py +# accordingly. + + +class SignalGenerator(VISA): + description = 'Signal Generator' + allowed_children = [StaticFreqAmp] + allowed_chans = [0] + enabled_chans = [] + # define the scale factor - converts between BLACS front panel and instr + # Writing: scale*desired_freq // Reading:desired_freq/scale + scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor + freq_limits = (0,1) # set in scaled unit + amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor + amp_limits = (0,1) # set in scaled unit + + @set_passed_properties() + def __init__(self, name, VISA_name): + '''VISA_name can be full VISA connection string or NI-MAX alias''' + # Signal Generators do not have a parent device + VISA.__init__(self,name,None,VISA_name) + + def quantise_freq(self,data, device): + '''Quantize the frequency in units of Hz and check it's within bounds''' + # It's faster to add 0.5 then typecast than to round to integers first (device is programmed in Hz): + data = np.array((self.scale_factor*data)+0.5, dtype=np.uint64) + + # Ensure that frequencies are within bounds: + if any(data < self.freq_limits[0] ) or any(data > self.freq_limits[1] ): + msg = '''{:s} {:s} can only have frequencies between + {:E}Hz and {:E}Hz, {} given'''.format(device.description, + device.name, *self.freq_limits, + data) + raise LabscriptError(dedent(msg)) + return data, self.scale_factor + + def quantise_amp(self,data, device): + '''Quantize the amplitude in units of dBm and check it's within bounds''' + # Keep as float since programming often done down to 0.1dBm (device is programmed in dBm): + data = np.array((self.amp_scale_factor*data), dtype=np.float16) + + # Ensure that amplitudes are within bounds: + if any(data < self.amp_limits[0] ) or any(data > self.amp_limits[1] ): + msg = '''{:s} {:s} can only have amplitudes between + {:.1f} dBm and {:.1f} dBm, {} given'''.format(device.description, + device.name,*self.amp_limits, + data) + raise LabscriptError(dedent(msg)) + return data, self.amp_scale_factor + + def enable_output(self, channel=0): + """Enable the output at the device level. + + This is a software enable only, it cannot be hardware timed. + + Args: + channel (int, optional): Channel to enable. Defaults to 0, which + is expected for single output devices. + """ + + if channel in self.allowed_chans: + if channel not in self.enabled_chans: + self.enabled_chans.append(channel) + else: + raise LabscriptError(f'Channel {channel} is not a valid option for {self.device.name}') + + def generate_code(self, hdf5_file): + if not len(self.child_devices): + print(f'No outputs attached to {self.name:s}') + return + for output in self.child_devices: + try: + prefix, channel = output.connection.split() + channel = int(channel) + except: + msg = '''{:s} {:s} has invalid connection string: \'{!s}\'. + Format must be \'channel n\' with n equal 0.''' + raise LabscriptError(dedent(msg.format(output.description, + output.name,output.connection))) + if channel != 0: + msg = '''{:s} {:s} has invalid connection string: \'{!s}\'. + Format must be \'channel n\' with n equal 0.''' + raise LabscriptError(dedent(msg.format(output.description, + output.name,output.connection))) + dds = output + # Call these functions to finalise stuff: + ignore = dds.frequency.get_change_times() + dds.frequency.make_timeseries([]) + dds.frequency.expand_timeseries() + + ignore = dds.amplitude.get_change_times() + dds.amplitude.make_timeseries([]) + dds.amplitude.expand_timeseries() + + dds.frequency.raw_output, dds.frequency.scale_factor = self.quantise_freq(dds.frequency.raw_output, dds) + dds.amplitude.raw_output, dds.amplitude.scale_factor = self.quantise_amp(dds.amplitude.raw_output, dds) + static_dtypes = np.dtype({'names':['freq0','amp0','gate0'],'formats':[np.uint64,np.float16,bool]}) + static_table = np.zeros(1, dtype=static_dtypes) + static_table['freq0'].fill(1) + static_table['freq0'] = dds.frequency.raw_output[0] + static_table['amp0'].fill(1) + static_table['amp0'] = dds.amplitude.raw_output[0] + static_table['gate0'].fill(0) + static_table['gate0'] = 0 in self.enabled_chans # returns True if channel 0 enabled + grp = hdf5_file.create_group('/devices/'+self.name) + grp.create_dataset('STATIC_DATA',compression=config.compression,data=static_table) + self.set_property('frequency_scale_factor', self.scale_factor, location='device_properties') + self.set_property('amplitude_scale_factor', self.amp_scale_factor, location='device_properties') + diff --git a/labscript_devices/naqslab_devices/SignalGenerator/register_classes.py b/labscript_devices/naqslab_devices/SignalGenerator/register_classes.py new file mode 100644 index 00000000..1655a75f --- /dev/null +++ b/labscript_devices/naqslab_devices/SignalGenerator/register_classes.py @@ -0,0 +1,65 @@ +##################################################################### +# # +# /naqslab_devices/SignalGenerator/register_classes.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +"""Configures which BLACS_tab goes to which labscript_device.""" + +import labscript_devices + +labscript_devices.register_classes( + 'RS_SMF100A', + BLACS_tab='naqslab_devices.SignalGenerator.BLACS.RS_SMF100A.RS_SMF100ATab', + runviewer_parser='') + +labscript_devices.register_classes( + 'RS_SMA100B', + BLACS_tab='naqslab_devices.SignalGenerator.BLACS.RS_SMA100B.RS_SMA100BTab', + runviewer_parser='') + +labscript_devices.register_classes( + 'RS_SMHU', + BLACS_tab='naqslab_devices.SignalGenerator.BLACS.RS_SMHU.RS_SMHUTab', + runviewer_parser='') + +labscript_devices.register_classes( + 'HP_8643A', + BLACS_tab='naqslab_devices.SignalGenerator.BLACS.HP_8643A.HP_8643ATab', + runviewer_parser='') + +labscript_devices.register_classes( + 'HP_8642A', + BLACS_tab='naqslab_devices.SignalGenerator.BLACS.HP_8642A.HP_8642ATab', + runviewer_parser='') + +labscript_devices.register_classes( + 'HP_8648A', + BLACS_tab='naqslab_devices.SignalGenerator.BLACS.HP_8648.HP_8648ATab', + runviewer_parser='') + +labscript_devices.register_classes( + 'HP_8648B', + BLACS_tab='naqslab_devices.SignalGenerator.BLACS.HP_8648.HP_8648BTab', + runviewer_parser='') + +labscript_devices.register_classes( + 'HP_8648C', + BLACS_tab='naqslab_devices.SignalGenerator.BLACS.HP_8648.HP_8648CTab', + runviewer_parser='') + +labscript_devices.register_classes( + 'HP_8648D', + BLACS_tab='naqslab_devices.SignalGenerator.BLACS.HP_8648.HP_8648DTab', + runviewer_parser='') + +labscript_devices.register_classes( + 'E8257N', + BLACS_tab='naqslab_devices.SignalGenerator.BLACS.KeysightSigGens.E8257NTab', + runviewer_parser='') diff --git a/labscript_devices/naqslab_devices/TektronixTDS/__init__.py b/labscript_devices/naqslab_devices/TektronixTDS/__init__.py new file mode 100644 index 00000000..6d734b18 --- /dev/null +++ b/labscript_devices/naqslab_devices/TektronixTDS/__init__.py @@ -0,0 +1,17 @@ +##################################################################### +# # +# /naqslab_devices/TektronixTDS/__init__.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +from labscript_devices import deprecated_import_alias + + +# For backwards compatibility with old experiment scripts: +TekScope = deprecated_import_alias("naqslab_devices.TektronixTDS.labscript_device.TDS_Scope") diff --git a/labscript_devices/naqslab_devices/TektronixTDS/blacs_tab.py b/labscript_devices/naqslab_devices/TektronixTDS/blacs_tab.py new file mode 100644 index 00000000..a6f0573a --- /dev/null +++ b/labscript_devices/naqslab_devices/TektronixTDS/blacs_tab.py @@ -0,0 +1,40 @@ +##################################################################### +# # +# /naqslab_devices/TektronixTDS/blacs_tab.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from naqslab_devices.VISA.blacs_tab import VISATab + + +class TDS_ScopeTab(VISATab): + # Event Byte Label Definitions for TDS200/1000/2000 series scopes + # Used bits set by '*ESE' command in setup string of worker class + status_byte_labels = {'bit 7':'Unused', + 'bit 6':'Unused', + 'bit 5':'Command Error', + 'bit 4':'Execution Error', + 'bit 3':'Device Error', + 'bit 2':'Query Error', + 'bit 1':'Unused', + 'bit 0':'Unused'} + + def __init__(self,*args,**kwargs): + if not hasattr(self,'device_worker_class'): + self.device_worker_class = 'naqslab_devices.TektronixTDS.blacs_worker.TDS_ScopeWorker' + VISATab.__init__(self,*args,**kwargs) + + def initialise_GUI(self): + # Call the VISATab parent to initialise the STB ui and set the worker + VISATab.initialise_GUI(self) + + # Set the capabilities of this device + self.supports_remote_value_check(False) + self.supports_smart_programming(False) + self.statemachine_timeout_add(5000, self.status_monitor) + diff --git a/labscript_devices/naqslab_devices/TektronixTDS/blacs_worker.py b/labscript_devices/naqslab_devices/TektronixTDS/blacs_worker.py new file mode 100644 index 00000000..24ba1cfb --- /dev/null +++ b/labscript_devices/naqslab_devices/TektronixTDS/blacs_worker.py @@ -0,0 +1,105 @@ +##################################################################### +# # +# /naqslab_devices/TektronixTDS/blacs_worker.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +import numpy as np + +from naqslab_devices.VISA.blacs_worker import VISAWorker +from labscript import LabscriptError + +import labscript_utils.h5_lock, h5py + + +class TDS_ScopeWorker(VISAWorker): + # define instrument specific read and write strings + setup_string = ':HEADER OFF;*ESE 60;*SRE 32;*CLS;:DAT:ENC RIB;WID 2;' + read_y_parameters_string = ':DAT:SOU CH%d;:WFMPRE:YZE?;YMU?;YOFF?' + read_x_parameters_string = ':WFMPRE:XZE?;XIN?' + read_waveform_string = 'CURV?' + + def waveform_parser(self,raw_waveform_array,y0,dy,yoffset): + '''Parses the numpy array from the CURV? query.''' + return (raw_waveform_array - yoffset)*dy + y0 + + def init(self): + + # Call the VISA init to initialise the VISA connection + VISAWorker.init(self) + # Override the timeout for longer scope waits + self.connection.timeout = 10000 + + # Query device name to ensure supported scope + ident_string = self.connection.query('*IDN?') + if ('TEKTRONIX,TDS 2' in ident_string) or ('TEKTRONIX,TDS 1' in ident_string): + # Scope supported! + pass + else: + raise LabscriptError('Device {0:s} with VISA name {1:s} not supported!'.format(ident_string,self.VISA_name)) + + # initialization stuff + self.connection.write(self.setup_string) + + def transition_to_manual(self,abort = False): + if not abort: + with h5py.File(self.h5_file,'r') as hdf5_file: + try: + # get acquisitions table values so we can close the file + acquisitions = hdf5_file['/devices/'+self.device_name+'/ACQUISITIONS'].value + trigger_time = hdf5_file['/devices/'+self.device_name+'/ACQUISITIONS'].attrs['trigger_time'] + except: + # No acquisitions! + return True + # close lock on h5 to read from scope, it takes a while + data = {} + for connection,label in acquisitions: + channel_num = int(connection.split(' ')[-1]) + [y0,dy,yoffset] = self.connection.query_ascii_values(self.read_y_parameters_string % channel_num, container=np.array, separator=';') + raw_data = self.connection.query_binary_values(self.read_waveform_string, + datatype='h', is_big_endian=True, container=np.array) + data[connection] = self.waveform_parser(raw_data,y0,dy,yoffset) + # Need to calculate the time array + num_points = len(raw_data) + # read out the time parameters once outside the loop to save time + [t0, dt] = self.connection.query_ascii_values(self.read_x_parameters_string, + container=np.array, separator=';') + data['time'] = np.arange(0,num_points,1,dtype=np.float64)*dt + t0 + # define the dtypes for the h5 arrays + dtypes = np.dtype({'names':['t','values'],'formats':[np.float64,np.float32]}) + + # re-open lock on h5file to save data + with h5py.File(self.h5_file,'r+') as hdf5_file: + try: + measurements = hdf5_file['/data/traces'] + except: + # Group doesn't exist yet, create it + measurements = hdf5_file.create_group('/data/traces') + # write out the data to the h5file + for connection,label in acquisitions: + values = np.empty(num_points,dtype=dtypes) + values['t'] = data['time'] + values['values'] = data[connection] + measurements.create_dataset(label, data=values) + # and save some timing info for reference to labscript time + measurements[label].attrs['trigger_time'] = trigger_time + + + return True + + def check_status(self): + '''Uses the more informative ESR register.''' + esr = int(self.connection.query('*ESR?')) + + # if esr is non-zero, read out the error message and report + if esr != 0: + errors = self.connection.query('ALLEV?') + raise LabscriptError('Tek Scope VISA device {0:s} has Errors in Queue: \n{1:s}'.format(self.VISA_name,errors)) + + return self.convert_register(esr) + diff --git a/labscript_devices/naqslab_devices/TektronixTDS/labscript_device.py b/labscript_devices/naqslab_devices/TektronixTDS/labscript_device.py new file mode 100644 index 00000000..0b39c635 --- /dev/null +++ b/labscript_devices/naqslab_devices/TektronixTDS/labscript_device.py @@ -0,0 +1,64 @@ +##################################################################### +# # +# /naqslab_devices/TektronixTDS/labscript_device.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +from labscript import TriggerableDevice, config, LabscriptError, set_passed_properties +from naqslab_devices import ScopeChannel + +__version__ = '0.1.0' +__author__ = ['dihm'] + +class TDS_Scope(TriggerableDevice): + description = 'Tektronics TDS Series Digital Oscilliscope' + allowed_children = [ScopeChannel] + trigger_duration = 1e-3 + + @set_passed_properties(property_names = { + "device_properties":["VISA_name"]} + ) + def __init__(self, name,VISA_name, trigger_device, trigger_connection, **kwargs): + '''VISA_name can be full VISA connection string or NI-MAX alias. + Trigger Device should be fast clocked device. ''' + self.VISA_name = VISA_name + self.BLACS_connection = VISA_name + TriggerableDevice.__init__(self,name,trigger_device,trigger_connection,**kwargs) + + # initialize start_time variable + self.trigger_time = None + + + def generate_code(self, hdf5_file): + + Device.generate_code(self, hdf5_file) + + acquisitions = [] + for channel in self.child_devices: + if channel.acquisitions: + acquisitions.append((channel.connection,channel.acquisitions[0]['label'])) + acquisition_table_dtypes = np.dtype({'names':['connection','label'],'formats':['a256','a256']}) + acquisition_table = np.empty(len(acquisitions),dtype=acquisition_table_dtypes) + for i, acq in enumerate(acquisitions): + acquisition_table[i] = acq + + grp = self.init_device_group(hdf5_file) + # write table to h5file if non-empty + if len(acquisition_table): + grp.create_dataset('ACQUISITIONS',compression=config.compression, + data=acquisition_table) + grp['ACQUISITIONS'].attrs['trigger_time'] = self.trigger_time + + def acquire(self,start_time): + '''Call to define time when trigger will happen for scope.''' + if not self.child_devices: + raise LabscriptError('No channels acquiring for trigger {0:s}'.format(self.name)) + else: + self.parent_device.trigger(start_time,self.trigger_duration) + self.trigger_time = start_time + diff --git a/labscript_devices/naqslab_devices/TektronixTDS/register_classes.py b/labscript_devices/naqslab_devices/TektronixTDS/register_classes.py new file mode 100644 index 00000000..3c97a928 --- /dev/null +++ b/labscript_devices/naqslab_devices/TektronixTDS/register_classes.py @@ -0,0 +1,18 @@ +##################################################################### +# # +# /naqslab_devices/TektronixTDS/register_classes.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +import labscript_devices + +labscript_devices.register_classes( + 'TDS_Scope', + BLACS_tab='naqslab_devices.TektronixTDS.blacs_tab.TDS_ScopeTab', + runviewer_parser='') diff --git a/labscript_devices/naqslab_devices/VISA/STBstatus.ui b/labscript_devices/naqslab_devices/VISA/STBstatus.ui new file mode 100644 index 00000000..1e52973f --- /dev/null +++ b/labscript_devices/naqslab_devices/VISA/STBstatus.ui @@ -0,0 +1,423 @@ + + + Form + + + + 0 + 0 + 307 + 218 + + + + Form + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 10 + 75 + true + true + + + + STATUS BYTE + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 40 + 20 + + + + + + + + Clear + + + + + + + :/qtutils/fugue/arrow-circle.png:/qtutils/fugue/arrow-circle.png + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + + + + + + + + 75 + true + true + + + + false + + + Bit 7 + + + Qt::AlignCenter + + + + + + + + 75 + true + true + + + + false + + + Bit 6 + + + Qt::AlignCenter + + + + + + + + 75 + true + true + + + + false + + + Bit 5 + + + Qt::AlignCenter + + + + + + + + 75 + true + true + + + + false + + + Bit 4 + + + Qt::AlignCenter + + + + + + + false + + + ???? + + + Qt::AlignCenter + + + + + + + false + + + ???? + + + Qt::AlignCenter + + + + + + + false + + + ???? + + + Qt::AlignCenter + + + + + + + false + + + ???? + + + Qt::AlignCenter + + + + + + + + 75 + true + true + + + + false + + + Bit 3 + + + Qt::AlignCenter + + + + + + + + 75 + true + true + + + + false + + + Bit 2 + + + Qt::AlignCenter + + + + + + + + 75 + true + true + + + + false + + + Bit 1 + + + Qt::AlignCenter + + + + + + + + 75 + true + true + + + + false + + + Bit 0 + + + Qt::AlignCenter + + + + + + + false + + + ???? + + + Qt::AlignCenter + + + + + + + false + + + ???? + + + Qt::AlignCenter + + + + + + + false + + + ???? + + + Qt::AlignCenter + + + + + + + false + + + ???? + + + Qt::AlignCenter + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 268 + 75 + + + + + + + + + + + diff --git a/labscript_devices/naqslab_devices/VISA/__init__.py b/labscript_devices/naqslab_devices/VISA/__init__.py new file mode 100644 index 00000000..6eb29dca --- /dev/null +++ b/labscript_devices/naqslab_devices/VISA/__init__.py @@ -0,0 +1,18 @@ +##################################################################### +# # +# /naqslab_devices/VISA/__init__.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### + +from labscript_devices import deprecated_import_alias + + +# For backwards compatibility with old experiment scripts: +VISA = deprecated_import_alias("naqslab_devices.VISA.labscript_device.VISA") diff --git a/labscript_devices/naqslab_devices/VISA/blacs_tab.py b/labscript_devices/naqslab_devices/VISA/blacs_tab.py new file mode 100644 index 00000000..1a4211f6 --- /dev/null +++ b/labscript_devices/naqslab_devices/VISA/blacs_tab.py @@ -0,0 +1,107 @@ +##################################################################### +# # +# /naqslab_devices/VISA/blacs_tab.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +""" +Boiler plate blacs_tab for VISA instruments. + +Defines the common STBstatus.ui widget all devices use to report their current status. +""" +from labscript import LabscriptError + +from blacs.tab_base_classes import define_state +from blacs.tab_base_classes import MODE_MANUAL, MODE_TRANSITION_TO_BUFFERED, MODE_TRANSITION_TO_MANUAL, MODE_BUFFERED +from blacs.device_base_class import DeviceTab +from qtutils import UiLoader +import os + +# Imports for handling icons in STBstatus.ui +from qtutils.qt import QtCore +from qtutils.qt import QtGui + +class VISATab(DeviceTab): + # Define the Status Byte labels with this dictionary structure + status_byte_labels = {'bit 7':'bit 7 label', + 'bit 6':'bit 6 label', + 'bit 5':'bit 5 label', + 'bit 4':'bit 4 label', + 'bit 3':'bit 3 label', + 'bit 2':'bit 2 label', + 'bit 1':'bit 1 label', + 'bit 0':'bit 0 label'} + status_widget = 'STBstatus.ui' + + STBui_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),status_widget) + + def __init__(self,*args,**kwargs): + """You MUST override this method in order to define the device worker. + You then call this parent method to finish initialization. + """ + if not hasattr(self,'device_worker_class'): + raise LabscriptError('BLACS worker not set for device: {0:s}'.format(self)) + DeviceTab.__init__(self,*args,**kwargs) + + def initialise_GUI(self): + """Loads the standard STBstatus.ui widget and sets the worker defined in __init__""" + # load the status_ui for the STB register + self.status_ui = UiLoader().load(self.STBui_path) + self.get_tab_layout().addWidget(self.status_ui) + + # generate the dictionaries + self.status_bits = ['bit 0', 'bit 1', 'bit 2', 'bit 3', 'bit 4', 'bit 5', 'bit 6', 'bit 7'] + self.bit_labels_widgets = {} + self.bit_values_widgets = {} + self.status = {} + for bit in self.status_bits: + self.status[bit] = False + self.bit_values_widgets[bit] = getattr(self.status_ui, 'status_{0:s}'.format(bit.split()[1])) + self.bit_labels_widgets[bit] = getattr(self.status_ui, 'status_label_{0:s}'.format(bit.split()[1])) + + # Dynamically update status bits with correct names + for key in self.status_bits: + self.bit_labels_widgets[key].setText(self.status_byte_labels[key]) + self.status_ui.clear_button.clicked.connect(self.send_clear) + + + # Store the VISA name to be used + self.address = str(self.settings['connection_table'].find_by_name(self.settings["device_name"]).BLACS_connection) + #self.device_name = str(self.settings['device_name']) + + # Create and set the primary worker + self.create_worker("main_worker", + self.device_worker_class, + {'address':self.address, + }) + self.primary_worker = "main_worker" + + + # This function gets the status, + # and updates the front panel widgets! + @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True) + def status_monitor(self): + # When called with a queue, this function writes to the queue + # when the pulseblaster is waiting. This indicates the end of + # an experimental run. + self.status = yield(self.queue_work(self._primary_worker,'check_status')) + + for key in self.status_bits: + if self.status[key]: + icon = QtGui.QIcon(':/qtutils/fugue/tick') + else: + icon = QtGui.QIcon(':/qtutils/fugue/cross') + pixmap = icon.pixmap(QtCore.QSize(16,16)) + self.bit_values_widgets[key].setPixmap(pixmap) + + + @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) + def send_clear(self,widget=None): + value = self.status_ui.clear_button.isChecked() + yield(self.queue_work(self._primary_worker,'clear',value)) + diff --git a/labscript_devices/naqslab_devices/VISA/blacs_worker.py b/labscript_devices/naqslab_devices/VISA/blacs_worker.py new file mode 100644 index 00000000..513a54a1 --- /dev/null +++ b/labscript_devices/naqslab_devices/VISA/blacs_worker.py @@ -0,0 +1,137 @@ +##################################################################### +# # +# /naqslab_devices/VISA/blacs_worker.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +""" +Boiler plate BLACS_worker for VISA instruments. + +Inheritors use the same communication protocol, but override the command syntax. +""" +from blacs.tab_base_classes import Worker + +from labscript import LabscriptError +from labscript_utils import dedent + +import pyvisa as visa + +class VISAWorker(Worker): + def init(self): + """Initializes basic worker and opens VISA connection to device. + + Default connection timeout is 2 seconds""" + self.VISA_name = self.address + self.resourceMan = visa.ResourceManager() + try: + self.connection = self.resourceMan.open_resource(self.VISA_name) + except visa.VisaIOError: + msg = '''{:s} not found! Is it connected?'''.format(self.VISA_name) + raise LabscriptError(dedent(msg)) from None + self.connection.timeout = 2000 + + def check_remote_values(self): + # over-ride this method if remote value check is supported + return None + + def convert_register(self,register): + """Converts returned register value to dict of bools + + Args: + register (int): Status register value returned from + :obj:`read_stb ` + + Returns: + dict: Status byte dictionary as formatted in :obj:`VISATab` + """ + results = {} + #get the status and convert to binary, and take off the '0b' header: + status = bin(register)[2:] + # if the status is less than 8 bits long, pad the start with zeros! + while len(status)<8: + status = '0'+status + # reverse the status string so bit 0 is first indexed + status = status[::-1] + # fill the status byte dictionary + for i in range(0,8): + results['bit '+str(i)] = bool(int(status[i])) + + return results + + def check_status(self): + """Reads the Status Byte Register of the VISA device. + + Returns: + dict: Status byte dictionary as formatted in :obj:`VISATab` + """ + results = {} + stb = self.connection.read_stb() + + return self.convert_register(stb) + + def program_manual(self,front_panel_values): + """Over-ride this method if remote programming is supported. + + Returns: + :obj:`VISAWorker.check_remote_values()` + """ + + return self.check_remote_values() + + def clear(self,value): + """Sends standard \*CLR to clear registers of device. + + Args: + value (bool): value of Clear button in STBstatus.ui widget + """ + self.connection.clear() + + def transition_to_buffered(self,device_name,h5file,initial_values,fresh): + """Stores various device handles for use in transition_to_manual method. + + Automatically called by BLACS. Should be over-ridden by inheritors. + + Args: + device_name (str): Name of device from connectiontable + h5file (str): path to shot h5_file + initial_values (dict): Contains the start of shot values + fresh (bool): Indicates if smart_programming should be refreshed this shot + """ + # Store the initial values in case we have to abort and restore them: + self.initial_values = initial_values + # Store the final values to for use during transition_to_static: + self.final_values = {} + # Store some parameters for saving data later + self.h5_file = h5file + self.device_name = device_name + + return self.final_values + + def abort_transition_to_buffered(self): + """Special abort shot configuration code belongs here. + """ + return self.transition_to_manual(True) + + def abort_buffered(self): + """Special abort shot code belongs here. + """ + return self.transition_to_manual(True) + + def transition_to_manual(self,abort = False): + """Simple transition_to_manual method where no data is saved.""" + if abort: + # If we're aborting the run, reset to original value + self.program_manual(self.initial_values) + # If we're not aborting the run, stick with buffered value. Nothing to do really! + # return the current values in the device + return True + + def shutdown(self): + """Closes VISA connection to device.""" + self.connection.close() + diff --git a/labscript_devices/naqslab_devices/VISA/labscript_device.py b/labscript_devices/naqslab_devices/VISA/labscript_device.py new file mode 100644 index 00000000..6792a0b1 --- /dev/null +++ b/labscript_devices/naqslab_devices/VISA/labscript_device.py @@ -0,0 +1,47 @@ +##################################################################### +# # +# /naqslab_devices/VISA/labscript_device.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### +""" +Boiler plate labscript_device for VISA instruments. +""" +from labscript import Device, LabscriptError, set_passed_properties + +__version__ = '0.1.1' +__author__ = ['dihm'] + +class VISA(Device): + description = 'VISA Compatible Instrument' + allowed_children = [] + + @set_passed_properties(property_names = { + "device_properties":["VISA_name"]} + ) + def __init__(self, name, parent_device, VISA_name, **kwargs): + """Base VISA labscript_device class. + + Inheritors should call VISA.__init__() in their own __init__() method. + Generate_code must be overridden. + + Args: + name (str): name of device in connectiontable + parent_device (obj): Handle to any parent device. + VISA_name (str): Can be full VISA connection string or NI-MAX alias. + """ + self.VISA_name = VISA_name + self.BLACS_connection = VISA_name + Device.__init__(self, name, parent_device, VISA_name) + + def generate_code(self, hdf5_file): + """Method to generate instructions for blacs_worker to program device. + + Must be over-ridden.""" + raise LabscriptError('generate_code() must be overridden for {0:s}'.format(self.name)) + diff --git a/labscript_devices/naqslab_devices/VISA/register_classes.py b/labscript_devices/naqslab_devices/VISA/register_classes.py new file mode 100644 index 00000000..6cdf5c78 --- /dev/null +++ b/labscript_devices/naqslab_devices/VISA/register_classes.py @@ -0,0 +1,23 @@ +##################################################################### +# # +# /naqslab_devices/VISA/register_classes.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of naqslab_devices, # +# and is licensed under the # +# Simplified BSD License. See the license.txt file in the root of # +# the project for the full license. # +# # +##################################################################### +""" +Sets which BLACS_tab belongs to each labscript device. +""" + +import labscript_devices + +labscript_devices.register_classes( + 'VISA', + BLACS_tab='naqslab_devices.VISA.blacs_tab.VISATab', + runviewer_parser='' +) diff --git a/labscript_devices/naqslab_devices/__init__.py b/labscript_devices/naqslab_devices/__init__.py new file mode 100644 index 00000000..5ed9b672 --- /dev/null +++ b/labscript_devices/naqslab_devices/__init__.py @@ -0,0 +1,148 @@ +##################################################################### +# # +# /naqslab_devices/__init__.py # +# # +# Copyright 2018, David Meyer # +# # +# This file is part of the naqslab devices extension to the # +# labscript_suite. It is licensed under the Simplified BSD License. # +# # +# # +##################################################################### + +# basic init for naqslab_devices +# defines a version and author + + +# import sys +# import os + +# sys.path +# sys.path.append(os.getcwd()) + +# import sys +# import os + + + + +import labscript_devices + +__version__ = '0.4.0' +__author__ = ['dihm'] + +############################################# +# define helper sub-classes of labscript defined channels +# Working constellation from hier is labscript * 3 + +from labscript import Device, AnalogIn, StaticDDS, LabscriptError +#from labscript.labscript import * + + +class ScopeChannel(AnalogIn): + """Subclass of labscript.AnalogIn that marks an acquiring scope channel. + """ + description = 'Scope Acquisition Channel Class' + + def __init__(self, name, parent_device, connection): + """This instantiates a scope channel to acquire during a buffered shot. + + Args: + name (str): Name to assign channel + parent_device (obj): Handle to parent device + connection (str): Which physical scope channel is acquiring. + Generally of the form \'Channel n\' where n is + the channel label. + """ + Device.__init__(self,name,parent_device,connection) + self.acquisitions = [] + + def acquire(self): + """Inform BLACS to save data from this channel. + + Note that the parent_device controls when the acquisition trigger is sent. + """ + if self.acquisitions: + raise LabscriptError('Scope Channel {0:s}:{1:s} can only have one acquisition!'.format(self.parent_device.name,self.name)) + else: + self.acquisitions.append({'label': self.name}) + + +class CounterScopeChannel(ScopeChannel): + """Subclass of :obj:`ScopeChannel` that allows for pulse counting.""" + description = 'Scope Acquisition Channel Class with Pulse Counting' + + def __init__(self, name, parent_device, connection): + """This instantiates a counter scope channel to acquire during a buffered shot. + + Args: + name (str): Name to assign channel + parent_device (obj): Handle to parent device + connection (str): Which physical scope channel is acquiring. + Generally of the form \'Channel n\' where n is + the channel label. + """ + ScopeChannel.__init__(self,name,parent_device,connection) + self.counts = [] + + def count(self,typ,pol): + """Register a pulse counter operation for this channel. + + Args: + typ (str): count 'pulse' or 'edge' + pol (str): reference to 'pos' or 'neg' edges + """ + # guess we can allow multiple types of counters per channel + if (typ in ['pulse', 'edge']) and (pol in ['pos', 'neg']): + self.counts.append({'type':typ,'polarity':pol}) + else: + raise LabscriptError('Invalid counting parameters for {0:s}:{1:s}'.format(self.parent_name,self.name)) + + +class StaticFreqAmp(StaticDDS): + """A Static Frequency that supports frequency and amplitude control. + + If phase control is needed, use labscript.StaticDDS""" + description = 'Frequency Source class for Signal Generators' + + def __init__(self, *args, **kwargs): + """This instatiates a static frequency output channel. + + Frequency and amplitude limits set here will supercede those dictated + by the device class, but only when compiling a shot with runmanager. + Static update limits are enforced by the BLACS Tab for the parent device. + + Args: + *args: Passed to parent init. + **kwargs: Passed to parent init. + + Raises: + LabscriptError: If **kwargs contains phase settings, which are not supported. + """ + + if not {'phase_limits','phase_conv_class','phase_conv_params'}.isdisjoint(kwargs.keys()): + raise LabscriptError(f'{self.device.name} does not support any phase configurations.') + + super().__init__(*args,**kwargs) + # set default values within limits specified + # if not specified, use limits from parent device + parent_device = args[1] + freq_limits = kwargs.get('freq_limits') + amp_limits = kwargs.get('amp_limits') + if freq_limits is not None: + self.frequency.default_value = freq_limits[0] + else: + self.frequency.default_value = parent_device.freq_limits[0]/parent_device.scale_factor + if amp_limits is not None: + self.amplitude.default_value = amp_limits[0] + else: + self.amplitude.default_value = parent_device.amp_limits[0]/parent_device.amp_scale_factor + + def setphase(self,value,units=None): + """Overridden from StaticDDS so as not to provide phase control, which + is generally not supported by :obj:`SignalGenerator` devices. + """ + raise LabscriptError('StaticFreqAmp does not support phase control') + +def pleasework(): + print("I am working chill !!!") diff --git a/labscript_devices/naqslab_devices/doc/KeysightDCSupply.rst b/labscript_devices/naqslab_devices/doc/KeysightDCSupply.rst new file mode 100644 index 00000000..3866d176 --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/KeysightDCSupply.rst @@ -0,0 +1,21 @@ +KeysightDCSupply +================ + +Overview +-------- + +This device class controls Keysight/Agilent DC Power Supplies. + +The underlying implementation is to use the outputs as StaticAnalogOut. +The type of analog quantity (voltage or current source) is configured at the +device level based on whether the outputs are voltage limited or current limited. + +At present, this driver is fairly limited in its control. Most importantly, +the driver does not set both voltage and current limits (i.e. setting a max +current limit when in constant voltage mode). A modified StaticAnalogOut will +be necessary. +It is also only tested for the E364x series single output supplies. +It is written such that multiple outputs could be supported easily, +but that functionality is untested. + +.. include:: _apidoc\naqslab_devices.KeysightDCSupply.inc diff --git a/labscript_devices/naqslab_devices/doc/KeysightXSeries.rst b/labscript_devices/naqslab_devices/doc/KeysightXSeries.rst new file mode 100644 index 00000000..c4969be3 --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/KeysightXSeries.rst @@ -0,0 +1,11 @@ +KeysightXSeries +=============== + +Overview +-------- + +This devices covers Keysight X-series oscilloscopes. It has been +explicitely tested with 1000 and 3000 series 'scopes. Other series +should be simple to implement. + +.. include:: _apidoc\naqslab_devices.KeysightXSeries.inc diff --git a/labscript_devices/naqslab_devices/doc/Makefile b/labscript_devices/naqslab_devices/doc/Makefile new file mode 100644 index 00000000..8d760f8c --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/Makefile @@ -0,0 +1,26 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile apidoc + +apidoc: + sphinx-apidoc .. -TMEf --templatedir=_templates -s inc -o .\_apidoc + +clean: + rm -rf ./_build + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/labscript_devices/naqslab_devices/doc/NovaTechDDS.rst b/labscript_devices/naqslab_devices/doc/NovaTechDDS.rst new file mode 100644 index 00000000..dfe0d2e9 --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/NovaTechDDS.rst @@ -0,0 +1,11 @@ +NovaTechDDS +=========== + +Overview +-------- + +This modules covers the 409B-AC, 409B, and 440A DDS frequency synthesizers from Novatech. + +Note that the 409B-AC class is largely interchangable with the DDS9m labscript_devices class. + +.. include:: _apidoc\naqslab_devices.NovaTechDDS.inc diff --git a/labscript_devices/naqslab_devices/doc/PulseBlasterESRPro300.rst b/labscript_devices/naqslab_devices/doc/PulseBlasterESRPro300.rst new file mode 100644 index 00000000..9affb560 --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/PulseBlasterESRPro300.rst @@ -0,0 +1,10 @@ +PulseBlasterESRPro300 +===================== + +Overview +-------- + +This is a thin subclass of the PulseBlaster_No_DDS labscript_device. It merely +configures the correct clock speed, digital output number, and clock resolution limits. + +.. include:: _apidoc\naqslab_devices.PulseBlasterESRPro300.inc diff --git a/labscript_devices/naqslab_devices/doc/PulseBlaster_No_DDS_200.rst b/labscript_devices/naqslab_devices/doc/PulseBlaster_No_DDS_200.rst new file mode 100644 index 00000000..4ee0f8c6 --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/PulseBlaster_No_DDS_200.rst @@ -0,0 +1,10 @@ +PulseBlaster_No_DDS_200 +======================= + +Overview +-------- + +This is a thin subclass of the PulseBlaster_No_DDS labscript_device. It merely +configures the correct clock speed and clock resolution limits for our custom 200 MHz clocked USB PulseBlaster board. + +.. include:: _apidoc\naqslab_devices.PulseBlaster_No_DDS_200.inc diff --git a/labscript_devices/naqslab_devices/doc/SR865.rst b/labscript_devices/naqslab_devices/doc/SR865.rst new file mode 100644 index 00000000..83917291 --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/SR865.rst @@ -0,0 +1,11 @@ +SR865 +===== + +Overview +-------- + +This device class controls the Stanford Research Systems 865 series Lock-in Amplifier. +It only implements control functions. Data acquisition is not directly supported at this time. +To get buffered data, please use a DAQ connected to the analog outputs of the 865. + +.. include:: _apidoc\naqslab_devices.SR865.inc diff --git a/labscript_devices/naqslab_devices/doc/SignalGenerator.rst b/labscript_devices/naqslab_devices/doc/SignalGenerator.rst new file mode 100644 index 00000000..dde99d01 --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/SignalGenerator.rst @@ -0,0 +1,116 @@ +SignalGenerator +=============== + +Overview +-------- + +This is a parent class for static RF Signal Generators with frequency and amplitude control and +use the IEEE 488 or SCPI command protocols. Device communication is handled using the VISA +communication protocol. + +.. autosummary:: + naqslab_devices.SignalGenerator.Models + naqslab_devices.SignalGenerator.blacs_tab + naqslab_devices.SignalGenerator.blacs_worker + naqslab_devices.SignalGenerator.labscript_device + naqslab_devices.SignalGenerator.register_classes + +Models +------ + +Currently covered models include: + +.. currentmodule:: naqslab_devices.SignalGenerator.BLACS + +.. autosummary:: + HP_8642A + HP_8643A + HP_8648 + RS_SMA100B + RS_SMF100A + RS_SMHU + KeysightSigGens + +Adding a Signal Generator +------------------------- + +In order to add a new model of signal generator one must: + +#. Add a subclass :obj:`SignalGenerator.labscript_device` in :obj:`SignalGenerator.Models` + which provides the operational limits. +#. Subclass :obj:`SignalGenerator.blacs_tab` + and :obj:`SignalGenerator.blacs_worker` with the operational details for communicating + with the device (namely command syntax and status byte definitions). +#. Add an entry in :obj:`SignalGenerator.register_classes` that links the labscript_device to + the correct blacs_tab. Note that multiple labscript_devices can use the same blacs_tab/blacs_worker. + +Detailed Documentation +---------------------- + +.. automodule:: naqslab_devices.SignalGenerator.BLACS.HP_8642A + :members: + :undoc-members: + :show-inheritance: + + +.. automodule:: naqslab_devices.SignalGenerator.BLACS.HP_8643A + :members: + :undoc-members: + :show-inheritance: + + +.. automodule:: naqslab_devices.SignalGenerator.BLACS.HP_8648 + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: naqslab_devices.SignalGenerator.BLACS.RS_SMA100B + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: naqslab_devices.SignalGenerator.BLACS.RS_SMF100A + :members: + :undoc-members: + :show-inheritance: + + +.. automodule:: naqslab_devices.SignalGenerator.BLACS.RS_SMHU + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: naqslab_devices.SignalGenerator.BLACS.KeysightSigGens + :members: + :undoc-members: + :show-inheritance: + + +.. automodule:: naqslab_devices.SignalGenerator.Models + :members: + :undoc-members: + :show-inheritance: + + +.. automodule:: naqslab_devices.SignalGenerator.blacs_tab + :members: + :undoc-members: + :show-inheritance: + + +.. automodule:: naqslab_devices.SignalGenerator.blacs_worker + :members: + :undoc-members: + :show-inheritance: + + +.. automodule:: naqslab_devices.SignalGenerator.labscript_device + :members: + :undoc-members: + :show-inheritance: + + +.. automodule:: naqslab_devices.SignalGenerator.register_classes + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/labscript_devices/naqslab_devices/doc/TektronixTDS.rst b/labscript_devices/naqslab_devices/doc/TektronixTDS.rst new file mode 100644 index 00000000..6110294e --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/TektronixTDS.rst @@ -0,0 +1,9 @@ +TektronixTDS +============ + +Overview +-------- + +This covers the TDS series of Tektronix oscilloscopes. + +.. include:: _apidoc\naqslab_devices.TektronixTDS.inc diff --git a/labscript_devices/naqslab_devices/doc/VISA.rst b/labscript_devices/naqslab_devices/doc/VISA.rst new file mode 100644 index 00000000..c464ed39 --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/VISA.rst @@ -0,0 +1,11 @@ +VISA +==== + +Overview +-------- + +This parent class establishes the standard communication protocol for +all devices that use the VISA communication library. It relies on the +:std:doc:`PyVISA python wrapper `. + +.. include:: _apidoc\naqslab_devices.VISA.inc diff --git a/labscript_devices/naqslab_devices/doc/_build/latex/naqslab_devices.pdf b/labscript_devices/naqslab_devices/doc/_build/latex/naqslab_devices.pdf new file mode 100644 index 0000000000000000000000000000000000000000..97b70941f11be2293238800ebce151587ae2f749 GIT binary patch literal 1411612 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
%9O5zap%;d_5}BF+>t-;X@K7pHocV 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 z

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 z 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%0A9_xk@sOI%c4KbE2>;CAfgQ>VACY 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%0DZ6y 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�ZPNFAZO))Ks$xSCV-tQrGssz$O&9*>ctpOx z5;%LdL=SBo)QPOQLvgj}`_g+iLU2*yG!706VXNtesAC0H4i?U;1n;(zMXS>&sJi)?|X?g z1rwQ(zKP4w4nx>>oR!%Rj>PQ8B_*YAVx1*u_rA1kvBOc1awl`4<^C17R2p(^Wxc6U z23J=weCMp%L2$s&lszJsbd2)93w2o@D+fO`Boi-q=Gh6J<>hbO14(}C=Ws?Tgu8MW z^)h#Wsvo)Y9FN>@!kX7_AX`m>=-|)0U*RRRysnK0bI-@cUuDi`QQR?3;}5L1(zj3S zge0ll71GqhOD+_mbJ<*Ec&5~4F3JxDFY@k|*0_2@S2#)JU6BUe%X>_BaX>H*t#J!w zF3A(N4#HmWe8J8cV{2nv-|D8kIJwKP&aTZ6%U>>BKD43MWY(s%SM~^l?)S>;NJ!yz z)Uu5iV0=zII@s1+h689>9-*#5@%Kdc6E$31HO9sm4>{0Zzx?w1KY#u5^6uTM*MIx{ zzrVh^_o`lA|NQy$*Zb41zxw&*^-S`S;gfzI^@9mtTK-fdT39KfHYR-N(OvdifvV CN8jlH literal 0 HcmV?d00001 diff --git a/labscript_devices/naqslab_devices/doc/_inv/pyvisa-objects.inv b/labscript_devices/naqslab_devices/doc/_inv/pyvisa-objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..448cd9901880752218dc9fdc0c8a2e047bc099ff GIT binary patch literal 6530 zcmV-|8GYs>AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkVc~(hN zK?)-vR%LQ?X>V>iATcg6F)lDJWMy_R3L_v?Xk{RBWo=<;Ze(S0Aa78b#rNMXCQiPX<{x4c-pm{U5}(VnuYJ{SA;Zsn^D_6y`xfV zZ@NnARZ3m6sj8lyxkC!$W5~?dU%xikfQ?ON`aN8flobIF#u)pYgK;#sr(CdO zT34cDRVNP3?dP)2`hp++^T3+?{D~(;ojxiW>$)~S^&O8SRy7PIuB_!54VPuDiJdE~NBq#gWNvi6aPsOpLn5p|Xk38ImWHJ0(6w>c|* z=WUr+tjp^v=9;V^M+xYXQ{KUfMXKsGt(*T&PAzAT`=C>)PNT{4KI_F7sdA$($+Y*8 zw{6`f>{PcMy)1@SNX0$17Yx!s5_vtcq^^n^jD6}wGW-Q2rbR9C>XMvUUc~pOYiwOr zJRRDOJOJ)`onxC{+Y4Rlt`f^0 zZF52!WJ7ehNylG0I5*?6o#TtEL>IoW{H0M9^0^% zmAvCEp1cS(p16;Hmll;fwm5XUHxGr#FlI)Ux(AXsUDFR~e98 zaV0o=fve7vrB{VjrDadjcCb?cr1P@YRWUwNfsxh2p5dVgZv_(CD4&g$4OLy`WmE7{ z${a5HGIebdw`gPRTS&iF)_5E6e7u)wm|lPB2+57jId8LtFvJW>u=Wboka zVJC7#xKt(5M%YK$_m+K;>RbQ=%LBEr$npVtBHVoTc&F0jpYe+gE68Gd))XQ3ruJTsCl%5bd7>wocQ&Me1$c zlVZE0E-$(4NO8P2zg%>jU9zSDp1<^5>VePs3>-tA^D3*KrFc<&=M7zAO^4Qn=ur=Q zG%3mWQ?7e3mDgeIW>+#aMb{0G1(7{f2wixe-tJcc>~5L|JgRN*uU6OV@Z z{fS#kkJ9ofCQn&W2o;A&Ta;J81C1hSx~OFX>H2N@Ab7!KajVj{uIe6nf4cJySlSJb zD4?y;^xN>B@R_xha#rTq=6D|CxXUu=A^3~bV11QNM_6P&z{Bhu#&{0{8}=r8Ulh1U z1%?VYHwLU{r45x#xw-1*bKZ%#c{k&}N6K`i1tXDtXu@PyTAaza?)jbB`8B^>3psKY z$8Xxe+*jw?trlZ$N>(x1H@t!Jb=(pLI;zpYS3dAo)P386${Uq`r z`k{Tp^b;8DX{c9!(z=u#II@q>*x}iRyt>t1=$6CLjqH^TAI%nAirf600=YVK@XEG$ zsvL<_prLIBu(>_N(Fi5sbsOrhy1;P6H9zo(3YcLDi2Oj00a4 zMZ{heMZ{heMMPc|a5_3nHr!3z4fIjuqN$=gp^;rZyfY2Ou18Fq+Y>uQk%~J%sYXG^ z+%e-KZSw}~qs-h2WG(cS$r#+6LF{rAe26i#cS=e63Y-h{)jr9<$i-&^y_mCIsE1vG zvA*l+B{u=On&$!Sn4ekRC3OXVhJ$`~H_m?FZPXj_=e91<i5bvTKPyDQM`0eQ)?_~NPv_`{#CEI?)8V}uiz8Xp0e7G9PR8RYcfhDX# zBFV2j&WWX(X@uk4#V0wCzcNkay$5(@B#*}0Ys^4PY|x=~93sJQoS^kys!weYSj+WY zU`#a=910B1NR5Ps5_byDr%@t#-UKs}wdFsfkr(y0{5&}l1Jyop9D{M!dNs!m&6PT` zmmNsgx9V-7z)Bj_gMhhjm>~FW;$B0cXn4BAP_^;CSS0avBO47ycKh~K65|cWk+gyWZQv32Hve)|;!QcvigldNPY-u67&2qM`YIlT1RSC7F( zfntEsUTXzHo#Mu%JOZxe5FFhBu7Ond=Mc%x&(CXl!&zsdy1)zQ@%ZWY5Rl}w&Tu&Y zyy6HD$VNLHr+lL z$#6TsXgBL{Hm7;V@Y=jo)ASe5S^#J3f1nTxN|;FVJb7Y8&jpTp$}4r|Xl%v{c0<-9 zu!P=81Cbo~RT-f0i!xGg9gxU7$m024&x&FRpqv-Gcp5|& z>LR-nh(t_O9U3N0T|rSAe(b(CR+o)oVv|{iKBTheaa}h=4bW3w7wDbi5(|Qhw2=x| zX(JXStVS4K4UJs#N$cDoK6}@IWq>nddFK)JcWQB&@j11b+B<92DZ zh}+Om3HO4B3Ahaqly4gxHP$s8XsSCw+q!QO{=!qWQW^chl;Og{;t9AzRy?s`!e}NU zlj1d%9u!YZR8Bkr#bQZsy#!=?;V}4{mJNSD8J2EOK$5@HXPhKs2T5t1z#7&2O#nV6y(}+4$Int9Nm-Z;LnW-|Odn9Kwt` zFD`ywofij~4d>;Oy}g%8pBd-JMkfaW9Q35=UOj}RT6Qm&?A!xX+B7dOG(HvZ;y~em zmksdpelFC~`wsyamjYmn!G8r#@%dgfz~=h7v4eGxMl!u&YP9zaBT1Iki;Z@!URwMV zsxXfJG-!iOeS79RHvE!TI z_@0(JAu9l-W?TU*B9_`lQ_`tzGAyLpJ`9{p%v=J@{WLHlf$@Xmrwe&`#9+tE#N;~x zG*&r6rV;tc*c{1wjD6xH!bG4jZYME;niRAFhYtO)2|^omLNz@6>z?+Ct_7ga>9KL- zpw7m{M`7N zE)f%9g{YM5%4PyWD+d^>Io24GdGg?*^C=ID6inGX%V*@-4p554aIkg83wd2KC=Xe_ z_|=j;q}YX$Y*cjQXk)0$Be^uH<#%}quODDiOnv~l(+vW#^)`~|=Uvziqy2Q1ph66h z3)n=Wfwy58=k78=!zb8L+i<#-c6ij~k|gfyw0DFJ8+V3yCXFKbrHMf=2ihkYEW#tr zEPy}KFoZYKD4Z|SK#V6cFti^sTuh%f(O^DkMI?G4&BOQ~10!_a3k22oEKwBCv*b|y zj%E?{`I17=<{CrMTkMFBF~`qg6MkNkB!&fAs)7TbnzVIQiZf1OcvFC zEJ$Gc;Q+B607Hd$;23}oFGR)&^4I7TaqedWgn9rRI~s&>BmuvHjTZA8Op>tob15Q! zgBUCL{m5wX@5fP%K!{2;1tBiNAiTn+n1xr+FyrvbaqwuOp$I{D97z$jz)vPx1V0pG z7eZ|CU;(xf{)5mhMSx4U7ZgWPY+)+4UwIWI$q7@-j1fp~wSn46v-ClwYrs2NxHfIHG z#=6TOEP}B@#V>%dLXoG^2Z&wEDpBSg4ohF9W5qnNUcG`DKfJ7oRE51JwwygC1+OmM z6<5pwN*Y<$O!a!KT4?XopU?49YsIB6c(O)DyB7}%cBM1cvE-C@0(PEsf8;|_eNvEF z^+f?Ycd`ld5NYeLcz~I_Uz#4*NuE{LyI3O-1dUxHW`zRz*%cSyYu8Muzg^=2a?At8 z_}vXK#rLkU^i^M1On|3eGh@ZBmqhZ|eqyxO_T#Y1AliGcNDXWA?glGZ{E9Sw6#Zr7 z0GIwEasW(Pg(kp6mNI(v882yv>jPSKCcuqeamLS!edXLwi(P5PPXoNW{wf&T@lscp z@c^j_qX*d(YSdPXp98BE5nqO}lo&Hig~gfSLqMt2b&5Se0adVKCozx6PuI}+^=&+? zy1^QCV#>SXVbWd?7AJ%uE99)H*i3oF$7jogRdM{N9YhXlHJkt#CQD$e-~`CXQ-7(? zXY8>2QdcD4?_VD7A7~Ff90cK+hf9ioq5{%cJM#9wIe9cah|vdkv)J+%7LZKXyr=_}Ik)(&H5p8Xm9c0CBfwVxr?Pmy#U2 zR6xkPLdHs4ABdDRc!ALgua`y&cwJ(2zUzYG^H?v5u7v$qx)AnrNnxxX2`poD6zc=w zFAXS&^<$%RST8Qt?|5OcDXbR;uuiXWp*mzz!jjV95s*-7 zPP*m^q*fFAXjVi>x?;v>q%MjWXu3E|p1G#NG#@0*TtTs6ri-U%nJZ#+l<6hmMFJ|w z^m9?;IxNQYgQ@5JUEVZ2J{}x*r$&RCLW~791(o1w945WfFi>)5XtdOBq9D!;l&;M* zNV2AJm{e_o0TMOMBBp7Yf=tph5|yGE96muaWR#Scc);Xr#U!U@hDe`kxx}FYID;bz zu?2)~FPAV{=(Z%$12;{hg>4!_4BD0ykVvzTAc1Bv>EW7%1C@;ysx2Vc%YY2iEF>*R zTcSu}dkG>1XiE@Eum_m1o(&S3O)N-YHql^VnM))GWiAjKlDTvg5D{igD7a*Vg;<71 z46rl?5ngE&Fu0nC5Uqp@tPF66uu7vrL6xD=LaHSNJLp2gDT|31E3u)J1tpy8KfZsa z%~-Plgiy-n#K%%L2M|ozKyox?C=zWILa%Qv-oxIZ7d-AbAYjec8wvKWDhPn0Q9g(5unWj{S4v;lwv?#>`PwuWis3{ zZQpc2y+HqoMIR4$?$KebjfszIJsi4e@j>af#YZKDwmu-Ne9^(}8iT$dpzziQjgD_U zuvk;-LB&S69u&afZc~9H6g9|oY1Am!3z5wRW$l9M|~Y*KE+=~=nMi%!cu z9JJCwCFVXVMxMY@b03y=#^1&hj0nu-p0uP~0Z0+K0${RnMM8w)iUUc*2M{F&9|6Qu zf#ks&1PFo^36TJg9CGxlFr>^^0dQfjqG3|rfrO5C2Pj5`j3`*3YvYJX?f`>CxQc`c zSqBn9teO3(rgh>_^3(}J4N?^dm!Pg_M58zIz?ta)MTDg@2ymK|cvS6A%0(vtM3v4o zh#Z}9)ChDY(Mv=LJ7gab7EjzhYyDs4glfhhykRQBM1~% zS}HYNiDxfw?sPmvMa%p;uKAOE`l%+klEU{%!5c`o;-XIB<2K6r94 zkkZgYC>KYKqAVUckg{l?ILKlGLLr+6jfQMAU@UTgn3yO4rG!Nm5)ky*yx4JgMIovD zH7z>&S))h+kcEp*AS?>qgg7{a74ah}hQv>V*%Cho=5VnZ?dbhlSi95$u{+~L)f5S6G=v9G2$K-8-#HWnkM5wE7KF;qDXdo{(wq6%vK zt0@~$q9TO8KH}ry%13c0(3#yX59CkKGrI%Gomvmdq5x-hyEK6t{=^;vV7lf|Z3c2u zxH;K24CbXUbFys^-c3O#CrjQ}Ue@ERj|eL@?hLU}8ilY>8bz{C6N6q3v~4n2gk_pp z0K24N2&<$~IGdz_7>i_JXnSP1nEq^{!EDirNVG(nhp`z3M(DT~2&%nUqA1p4$)VZ` z%_{3B9=imKLy3LOXvR=9xke0ApUP<%Bar~geqw=Cy~`sidKZUO^DY~MqwDSo1RhO* zdfN~&T3gfTI$MKa8hhdax@o+&)?lEn*3(!%ZCkEjO8Xi_d1*iKUOyLyG{&d_6%9=T;4!(sfHE ze<=H+%cV>@nC(7zi!i{mI^8a#zl0yH61otpeD5gTP}5%Gd=1uDpvj$Tl2_TjW)Jsj ztB+D%$Qw$D?d2hsUyMiiGHqAZSzquE6VcsqSuA}J)4pUM&(uqO&K}O!fR{wQ_I@hi3#o^oUcdFAM(S)Z{w#5lGycS)vsM+e~};E&0G8G zFY(ojh4j_T0CxBE)mCEHmKQA6Na3x$#8-P3(pP^2*xl2r(=+?iM#&HCmilYU|LkQ4 zSlkXwJjymM|0k5u5o+hV;Z1YZ$0{GSA}zl)z%R=^y87^N`{VxmF9Xb58u`!c`c?W< zUZ`itwe$#fL8M1i#Jeh2C%ne!@00O+L;U;wojUsAejL{Z2RGo#{L(W2NljnP#WLH< zUZvD0bolSX56A!d;MT&j*?VhfqkcY``dRF6YG(o|*~P%ev388_X-s<)dA# z3xr*%n^k(@)m)0{%9u~b{qNPEA6A83Y%wB#9;>@94mWwv9r7tv6Nl%#yUMNPI9*AQ z+{QlM@KM&M>fG!*<{v`#2$w$3__&|EN6J!4r*xbr8>U#>&9}?+p{$LeP)<>&qg3bo z(zmNN>l|a+YH>qOJ9gJ;5Y$-RIyR7c3xl(o%*Zf(+nsU(VgogNZ$QH(H@hB&uN>YM zY9*>nw>m-eWaACQxWx=$!yC?0`X2r%^_=>9+(Hw@Ro;Lbyy1I8(@pxj`s_ov8Q86N zv$4Fnsd(DL#$oLCvfWzDUi^irP%KE*-y1O|Rk0lH)I)1|yXx;g_}W+yxNL)-7HHk4 zLCB(aaPMKOfd&C{^9?uNRr?Im0;0<0ESj;GvS`GwHesu!29a|+wp($jRsdLa%+2l2 ze4+dHL4oNmT3z}(ed+I(&BlKVEgR0@GQ3SkaOD|n%=p<@g74$^4^pbhZPTBJB_{3) zUR}ED+q)FG=bg3Z7xkaR_@9B>j@5lPzPfRjv5vj9yHRl8?&b=PpP7rN4yNA4NUy9F o?>mEex8D~pbEr>PD!&sSlqk4UPWnBa?a(S_Q~u%q0Strr3YxcT>i_@% literal 0 HcmV?d00001 diff --git a/labscript_devices/naqslab_devices/doc/_inv/sphinx-objects.inv b/labscript_devices/naqslab_devices/doc/_inv/sphinx-objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..93b32886aa7737282cfe05c6ddce629d367497ce GIT binary patch literal 11632 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. The second is the :doc:`SignalGenerator` class that uses the :doc:`VISA` class to template CW frequency generators. + +There are two thin subclasses of the labscript_devices.PulseBlaster_No_DDS class: :doc:`PulseBlasterESRPro300` and :doc:`PulseBlaster_No_DDS_200`. They exist simply to enforce the correct core clock frequency and clock limits without any other change in functionality from the parent. + +Other device classes control particular series of devices and implement functional control of their hardward to varying degrees. In general, the design philosophy is that if the device class does not set an option, it will not be interfered with when using the device class to control the instrument. This means that custom settings and configurations of each device can be used by setting them manually at the device front panel without the device class interfering. + +.. toctree:: + :maxdepth: 3 + + primitives + + VISA + SignalGenerator + + PulseBlasterESRPro300 + PulseBlaster_No_DDS_200 + + KeysightXSeries + NovaTechDDS + SR865 + TektronixTDS + KeysightDCSupply diff --git a/labscript_devices/naqslab_devices/doc/doc_build.rst b/labscript_devices/naqslab_devices/doc/doc_build.rst new file mode 100644 index 00000000..d92e2ea5 --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/doc_build.rst @@ -0,0 +1,65 @@ +Building Documentation +====================== + +The API documentation for this library leverages the +`Sphinx `_ automatic python documenation generator. +The general structure is to use the :std:doc:`Sphinx-apidoc` infrastucture to read +source code docstrings to automatically build the function/class reference documentation for each device. +Hand-written ReStructedText files (`quick syntax guide `_) +are then used to provide high-level documentation that imports +the auto-generated documentation. A makefile is provided to run the correct ``apidoc`` and +``sphinx-build`` commands. + +Sphinx Environment +------------------ + +In order to build the documentation from scratch, a functioning ``labscript`` +environment is needed with sphinx also installed. Because sphinx requires a large +amount of dependencies, it is recommended to copy your local ``labscript`` environment +then install and use sphinx from there. + +Sphinx can be installed into the ``labscript`` environment by installing the packages: +``sphinx>=2.2`` and ``sphinx_rtd_theme``. This will allow building of the html documentation. + +If you also wish to build the pdf documentation, you must also install ``perl`` +and a latex environment (such as MikTeX for windows). The latex build is controlled +using the ``latexmk`` latex package and requires a great many other latex packages. +A partial list of required latex packages is: cmap, fncychap, tabulary, parskip, capt-of. + +Sphinx Build +------------ + +The documentation build is automated through makefiles. All commands are run from +the :file:`doc` subfolder. + +The automated documentation build is perfomed using + +.. code-block:: bash + + make apidoc + +The auto-generated files are placed in the :file:`_apidoc` subfolder of :file:`doc` +and are given the import name of the module with the file suffix ``.inc``. + +The complete documentation is built using ``sphinx-build`` and currently supports +two targets: html and latexpdf. They are run using + +.. code-block:: bash + + make html + #or + make latexpdf + +Adding Documentation +-------------------- + +The main documentation tree is found in :file:`index.rst`. New devices should be +added using :file:`devices.rst`. Each device should have it's own rst file that +provides some high-level documentation and includes the auto-generated apidoc file. +All modules and submodules in the top-level directory of the library will have +documentation auto-generated using apidoc. It is up to the user to include those +files where appropriate in the documenation. The include statement is of the form: + +.. code:: rst + + .. include:: _apidoc\naqslab_devices.NovaTechDDS.inc diff --git a/labscript_devices/naqslab_devices/doc/index.rst b/labscript_devices/naqslab_devices/doc/index.rst new file mode 100644 index 00000000..a48cb05a --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/index.rst @@ -0,0 +1,36 @@ +.. naqslab_devices documentation master file, created by + sphinx-quickstart on Fri Sep 6 14:11:37 2019. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to naqslab_devices's documentation! +=========================================== + +This library is a collection of third-party devices for the labscript_suite experimental control system. + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + usage + devices + doc_build + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +Credits +======= + +:Authors: + David Meyer + Zac Castillo + +:Licence: Simplified BSD License + +:Version: |release| diff --git a/labscript_devices/naqslab_devices/doc/make.bat b/labscript_devices/naqslab_devices/doc/make.bat new file mode 100644 index 00000000..b8fcd4e1 --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/make.bat @@ -0,0 +1,45 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +if "%1" == "apidoc" goto apidoc + +if "%1" == "clean" goto clean + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:apidoc +sphinx-apidoc .. -TMEf --templatedir=_templates -s inc -o .\_apidoc + +:clean +rmdir /s /q _build + +:end +popd diff --git a/labscript_devices/naqslab_devices/doc/primitives.rst b/labscript_devices/naqslab_devices/doc/primitives.rst new file mode 100644 index 00000000..feec0b1c --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/primitives.rst @@ -0,0 +1,25 @@ +:code:`labscript` Primitive Subclasses +====================================== + +Overview +-------- + +.. currentmodule:: naqslab_devices + +These are subclasses of labscript primitive objects for specific use with the devices in this module. + +:obj:`StaticFreqAmp` is used by the :obj:`NovaTechDDS` devices. :obj:`ScopeChannel` is used by the KeysightXSeries and TektronixTDS oscilloscope classes. :obj:`CounterScopeChannel` is used exclusively by the KeysightXSeries oscilloscopes. + +.. autosummary:: + :nosignatures: + + StaticFreqAmp + ScopeChannel + CounterScopeChannel + + +Detailed Documentation +---------------------- + +.. automodule:: naqslab_devices + :members: StaticFreqAmp, ScopeChannel, CounterScopeChannel diff --git a/labscript_devices/naqslab_devices/doc/usage.rst b/labscript_devices/naqslab_devices/doc/usage.rst new file mode 100644 index 00000000..5208fb94 --- /dev/null +++ b/labscript_devices/naqslab_devices/doc/usage.rst @@ -0,0 +1,25 @@ +Installation +============ + +Prerequiste: labscript_devices >= 2.2.0 + +Clone this repository into the labscript_suite directory. Typically into +:file:`userlib` or the main directory level. + +Next, modify your labconfig.ini file to recognize the module by adding the following entry to the :file:`[DEFAULT]` block:: + + user_devices = naqslab_devices + +If more than one module of 3rd party devices are used, put all module names +as a comma separated list. + + +Usage +===== + +Invoke in labscript scripts just like other labscript devices:: + + from naqslab_devices import ScopeChannel + from naqslab_devices.KeysightXSeries.labscript_device import KeysightXScope + +Details for how to use each device are contained in the :doc:`detailed documentation ` listings. \ No newline at end of file From fc5ff67b15b768531f638d2fb9803871476bc746 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Mon, 3 Feb 2025 08:24:40 +0100 Subject: [PATCH 03/20] milestone (not working yet) on the implementation of the oscilloscope in labscript --- .../KeysightScope/KeysightScope.py | 527 +++++++++++------- labscript_devices/KeysightScope/__init__.py | 29 + labscript_devices/KeysightScope/blacs_tabs.py | 65 ++- .../KeysightScope/blacs_workers.py | 151 +++-- .../KeysightScope/labscript_devices.py | 46 +- labscript_devices/KeysightScope/playground.py | 20 +- labscript_devices/NI_DAQmx/blacs_workers.py | 4 +- .../KeysightXSeries/blacs_worker.py | 14 - .../naqslab_devices/VISA/blacs_tab.py | 2 + .../naqslab_devices/VISA/blacs_worker.py | 12 +- .../naqslab_devices/VISA/tests.py | 0 labscript_devices/naqslab_devices/__init__.py | 14 +- 12 files changed, 566 insertions(+), 318 deletions(-) create mode 100644 labscript_devices/naqslab_devices/VISA/tests.py diff --git a/labscript_devices/KeysightScope/KeysightScope.py b/labscript_devices/KeysightScope/KeysightScope.py index 236c6875..6472e501 100644 --- a/labscript_devices/KeysightScope/KeysightScope.py +++ b/labscript_devices/KeysightScope/KeysightScope.py @@ -3,81 +3,110 @@ import time """ - --init- -- yes - channels() -- no - rest -- (to test) -""" +Using the Oscilloscope requires 3 important steps + * Initialsiation : which is setting up the osci for the desired measure + * Acquiring : the osci aquires the measurement and saves them in its memory + * Analysing : after finishing the measurement, we can display or transfer the data to the Pc -""" - zu verbessern, CASE HAndling for other aquiring and acquisation modes + ===== > This code is therfore organized after the above mentionned three blocks + + To Improve: + - connecting to the oscilloscope should not be implemented here + - passing the properties should be more flexible (example NI_DAQmx) + - Implemente other aquiring modes -- Average . Normal , Peak + - Investigate what is better signed or unsigned bits """ +# Model DS01202G class KeysightScope: def __init__(self, addr='USB?*::INSTR', - timeout =3, termination='\n'): + timeout =5): + # Connecting to the osci rm = pyvisa.ResourceManager() devs = rm.list_resources(addr) - assert len(devs), "PyVisa didn't find any connected devices matching " + addr - self.dev = rm.open_resource(devs[0]) - self.dev.timeout = 1000 * timeout - self.dev.read_termination = termination self.idn = self.dev.query('*IDN?') - self.read = self.dev.read # class method - self.write = self.dev.write # class method - self.query = self.dev.query # class method print(f"The scope {self.idn} was successfully initialized") + # Basic Visa commands (if Visa works on the osci, then these will work) + self.read = self.dev.read # class method + self.write = self.dev.write # class method + self.query = self.dev.query # class method -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # - - def channels_old(self, all=True): - """Return a dictionary of the channels supported by this scope and whether they are currently displayed. - Includes REF and MATH channels if applicable. If "all" is False, only visible channels are returned""" - # want to enable HEAD to get channel names as well - prev = self.dev.query('HEAD?') - self.dev.write('HEAD 1') - # determine the device capabilities and enabled status - resp = self.dev.query('SEL?').rsplit(':',1)[1] - # reset HEAD - self.dev.write('HEAD '+prev) - # create a dict from the response - vals = {} - for x in resp.split(';'): - name, val = x.rsplit(' ',1) - if name[0] == ':': - name = name.rsplit(':',1)[1] - try: - visible = bool(int(val)) - except: - continue - if all or visible: - vals[name] = visible - return vals - + # Setting the osci properties + # --------------------------------- Device properties (Fix) + self.band_width = 70e6 # 70 MHz + self.sampling_rate = 2*10e9 # 2GSa/s + self.max_memory = 1e6 # 1Mpts + self.max_update_rate = 5e4 # 50,000 waveforms/second update rate. -##################################################################################################### -##################################################################################################### -##################################################################################################### -##################################################################################################### -##################################################################################################### + # Setting the osci configurations + self.dev.timeout = 1000 * timeout # convert in seconds + + # INIT: Preset and wait for operations to complete + self.dev.write("*RST") # An instrument control script should start with a *RST command. + self.dev.query("*OPC?") # Synchronization: Waits until previous commands is done before moving forward in the script + self.autoscale() + + # ############################################################# in progress + # Measurement setup variablees + vRange = 2 + tRange = 500e-9 + trigerLevel = 0 + ch = 1 + + GENERAL_TIMEOUT = 5000 # General I/O timeout (ms) + TRIGGER_TIMEOUT = 60000 # Max time to wait for a trigger (ms) for *OPC? method + + # Prevent excessive queries by adding a delay in seconds: + POLLING_INTERVAL = 0.1 # (seconds) + + + + ####################################################################################### + # Initialisation # + ####################################################################################### + def set_acquire_state(self, running=True): + '''RUN / STOP ''' + self.dev.write(':RUN' if running else 'STOP') + + def abort(self): + self.dev.write(':STOP') + return True + + def get_acquire_state(self): # In other words , is it running ? + """Determine if the oscilloscope is running. + Returns: ``True`` if running, ``False`` otherwise + """ + reg = int(self.dev.query(':OPERegister:CONDition?')) # The third bit of the operation register is 1 if the instrument is running + return int((reg & 8) == 8) + + def digitize(self): + ''' Specialized RUN command. + acquires a single waveforms according to the settings of the :ACQuire commands subsystem. + When the acquisition is complete, the instrument is stopped. + ''' + self.dev.query(":DIGitize") + + def autoscale(self): + self.dev.write(":AUToscale") - # ------------------------------------- NEW FOR KEYSIGHT def channels(self, all=True): - """Return a dictionary of the channels supported by this scope and whether they are currently displayed. - If "all" is False, only visible channels are returned""" + ''' + Returns: dictionary {str supported channels : bool currently displayed } + If "all" is False, only visible channels are returned + ''' + + # List with all Channels + all_channels = self.dev.query(":MEASure:SOURce?").rstrip().split(",") - all_channels = self.dev.query(":MEASure:SOURce?").rstrip().split(",") # List with all Channels + # We have to change all_channels a little bit for the oscii (e.g CHAN1 -> CHANnel1) + all_channels = [ch.replace("CHAN", "CHANnel") for ch in all_channels] + + # Create a dictionary {channel : visibility} vals = {} for index , chan in enumerate(all_channels): try: @@ -87,231 +116,299 @@ def channels(self, all=True): if all or visible: vals[chan] = visible return vals + + def shutdown(self): + """Closes VISA connection to device.""" + self.dev.close() -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # - - def waveform_old(self, channel='CH1', preamble_string='WFMO', int16=False): - """Download the waveform of the specified channel from the oscilloscope. All - acquired points are downloaded, as set by the 'Record length' setting in the - 'Acquisition' menu. A dictionary of waveform formatting parameters is returned - in addition to the times and values. + def get_trigger_event(self): """ - # configure the data transfer - self.dev.write('DAT:SOU ' + channel) # set the location of the data transferred by CURVe? - self.dev.write('DAT:ENC RIB') # tranfer the waveform in binary format (signed, MSB) - if int16: - self.dev.write(preamble_string + ':BYT_N 2') # use 16-bit integers (but only return every second pt) - else: - self.dev.write(preamble_string + ':BYT_N 1') # use 8-bit integers - record_length = int(self.dev.query('HOR:RECO?')) # determine how many points exist - self.dev.write('DAT:START ' + '1') # set the first data point to transfer - self.dev.write('DAT:STOP ' + str(record_length)) # set the last data point to transfer + whether the osci was triggered or not + return: + 0 : No trigger event was registred + 1 : trigger event was registred + """ + return int(self.dev.query(':TER?')) + + def clear_status(self): + """ + clears: the status data structures, + the device-defined error queue, + and the Request-for-OPC flag + """ + self.dev.write("*CLS") + + # ------------------------------------- TRiggering (IN PROGRESS) - # transfer the data and format into a sequence of strings - raw = self.dev.query_binary_values('CURV?', - datatype='i' if int16 else 'b', - is_big_endian=True, - container=np.array - ) + def single(self): + ''' Single Button ''' + self.dev.query(":SINGle") - # create a dictionary for the header information - keys = [ - 'BYT_NR', # data width for the outgoing waveform - 'BIT_NR', # number of bits per waveform point (8 or 16) - 'ENCDG', # type of encoding (ASCII or binary) - 'BN_FMT', # format of binary data (redundant for ASCII transfer) - 'BYT_OR', # first transmitted byte of binray data (LSB or MSB) - 'NR_PT', # number of points transmitted in response to a CURVe? query - 'WFID', # acquisition parameters - 'PT_FMT', # point format: {ENV: min/max pairs, Y: single points} - 'XINCR', # horizontal increment - 'PT_OFF', # trigger offset - 'XZERO', # time coordinate of the first point - 'XUNIT', # horizontal units - 'YMULT', # vertical scale factor per digitizing level - 'YZERO', # vertical offset - 'YOFF', # vertical position in digitizing levels - 'YUNIT' # vertical units - ] + def set_trigger_mode(self): # (FUTUR) add more trigger types + self.dev.write("trigger:mode edge") # change capitalizations for commands for the next 2 functions - # wfstr = self.dev.query(preamble_string + '?').split(';') # waveform transmission and formatting parameters - self.dev.write(';:'.join([preamble_string + ':' + k + '?' for k in keys])) - wfstr = self.dev.read().split(';') + def set_trigger_level(self,channel, triggerLevel): + self.dev.write(f"trigger:level channel{channel}, {triggerLevel}") - # create a dictionary of the waveform preamble - wfmp = {} - for key, x in zip(keys, wfstr): - x = str(x) - if x[0] == '"': # is it an enclosed string? - x = x.split('"')[1] - elif str.isdigit(x): # is it an integer - x = int(x) - else: - try: x = float(x) # try floating point number - except: pass - wfmp[key] = x - - # return the times and voltages - n = np.arange(0, wfmp['NR_PT'] / wfmp['BYT_NR']) - t = wfmp['BYT_NR'] * wfmp['XINCR'] * (n - wfmp['PT_OFF']) + wfmp['XZERO'] - y = wfmp['YMULT'] * (raw - wfmp['YOFF']) + wfmp['YZERO'] - return wfmp, t, y - -##################################################################################################### -##################################################################################################### -##################################################################################################### -##################################################################################################### -##################################################################################################### + # ----------------------------------------------- Voltage # (TDOO) Here Error Hanedling + def set_t_range(self,channel,tRange): + """ for all 10 div """ + self.dev.write(f"timebase:range{tRange}") - def waveform(self, channel='CHANnel1', int16=False): - """ as set by the 'Record length' setting in the - 'Acquisition' menu. - Return: Dictionary : waveform formatting parameters , times, values. + def set_v_square(self,channel, volt_square, unit="V"): + if unit =="V": + self.dev.write(f":CHANnel{channel}:RANGe {volt_square*8}") + elif unit =="mV": + self.dev.write(f":CHANnel{channel}:RANGe {volt_square*8}mV") + + def set_v_scale(self, scale_value): + """ scale_value ::= voltage/div in volt in NR3 format """ + self.dev.write(f":CHANnel1:SCALe {scale_value}") + + + # ----------------------------------------------- Time # (TDOO) Here Error Hanedling - TO TEST = int16 True --> :WAVeform:FORMat WORD + def set_t_square(self, time_square): + """in seconds """ + self.dev.write(f":TIMebase:RANGe {time_square*10}") + + def get_t_scale(self): + self.dev.write(":TIMebase:SCALe?") + + def set_t_scale(self,scale_value): + """ + scale_value ::= time/div in seconds in NR3 format """ + self.dev.write(f":TIMebase:SCALe {scale_value}") - # configure the data transfer + + ####################################################################################### + # Acquiring # + ####################################################################################### + # + def set_aquire_type(self,type="NORMal"): + ''' + There are 4 aquire types for this: + * NORMal : + * AVERage : You can set the count by sending the :ACQuire:COUNt command followed by the number of averages. + In this mode, the value for averages is an integer from 1 to 65536. + The COUNt value determines the number of averages that must be acquired. + * HRESolution : reduce noise at slower sweep speeds where + the digitizer samples faster than needed to fill memory for the displayed time range. + * PEAK : PEAK + ''' + self.dev.write(":ACQuire:TYPE "+ type) + + + # ----------------------------------- Waveform + def set_waveform_source(self,channel): self.dev.write(':WAVeform:SOURce ' + channel) # set the location of the data transferred by WAVeform? - if int16: - self.dev.write(':WAVeform:FORMat WORD') # use 16-bit integers - # To TEST: - # --- Tekscope : but only return every second pt , KEysight too ?? - # --- gpt sagt das ist besser aslbinary - else: - self.dev.write(':WAVeform:FORMat BYTE') # use 8 -bit integers + ####################################################################################### + # Reading # + ####################################################################################### + def get_xIncrement(self): # (in progress) + return float(self.dev.query("waveform:xincrement?")) + + def get_xOrigin(self): # (in progress) + return float(self.dev.query("waveform:xincrement?")) + + def get_yIncrement(self): # (in progress) + return float(self.dev.query("waveform:xincrement?")) + def get_yOrigin(self): # (in progress) + return float(self.dev.query("waveform:xincrement?")) + - record_length = int(self.dev.query(':WAVeform:POINts?')) # determine how many points exist + def waveform(self, channel='CHANnel1', int16=False): + """ + returns: dict + * Waveform preample : List, as set by the 'Record length' setting in the 'Acquisition' menu. + * Times: List of acquired times + * Values: List of acquired voltages + """ + # configure the data type transfer + self.set_waveform_source(self,channel) # set the location of the data transferred by WAVeform? + # transfer the data and format into a sequence of strings - raw = self.dev.query_binary_values(':WAVeform:DATA?', # TO TEST INT 16 ---> WORD - datatype='i' if int16 else 'b', - is_big_endian=True, + raw = self.dev.query_binary_values(':WAVeform:DATA?', + datatype='H' if int16 else 'B', # 'B' and 'H' are for unassigned , if you want signed use h and b + #is_big_endian=True, # In case we shift to signed container=np.array ) # Create a dictionary for the preamble keys = [ - " format", # for BYTE format, 1 for WORD format, 4 for ASCii format; an integer in NR1 format (format set by :WAVeform:FORMat) - " type", # 2 for AVERage type, 0 for NORMal type, 1 for PEAK detect type; an integer in NR1 format (type set by :ACQuire:TYPE). - " points", # points 32-bit NR1 - " count", # Average count or 1 if PEAK or NORMal; an integer in NR1 format (count set by :ACQuire:COUNt) - " xincrement", # 64-bit floating point NR3>, - " xorigin" , # 64-bit floating point NR3>, - " xreference", # 32-bit NR1>, - " yincrement", # 32-bit floating point NR3>, - " yorigin" , # 32-bit floating point NR3>, - " yreference", # 32-bit NR1. + "format", # for BYTE format, 1 for WORD format, 4 for ASCii format; an integer in NR1 format (format set by :WAVeform:FORMat) + "type", # 2 for AVERage type, 0 for NORMal type, 1 for PEAK detect type; an integer in NR1 format (type set by :ACQuire:TYPE). + "points", # points 32-bit NR1 + "count", # Average count or 1 if PEAK or NORMal; an integer in NR1 format (count set by :ACQuire:COUNt) + "xincrement", # 64-bit floating point NR3>, + "xorigin" , # 64-bit floating point NR3>, + "xreference", # 32-bit NR1>, + "yincrement", # 32-bit floating point NR3>, + "yorigin" , # 32-bit floating point NR3>, + "yreference", # 32-bit NR1. ] - # Get the Preamble - preamble = scope.query(":WAVeform:PREamble?") - wfstr = [float(i) for i in preamble.split(",")] + preamble = self.dev.query(":WAVeform:PREamble?") + preamble_val = [float(i) for i in preamble.split(",")] # create a dictionary of the waveform preamble - wfmp = dict(zip(keys, wfstr)) + wfmp = dict(zip(keys, preamble_val)) + + # (see Page 667 , Keysight manual for programmer ) + n = np.arange(wfmp['points'] ) + t = ( n - wfmp['xreference']) * wfmp['xincrement'] + wfmp['xorigin'] # time = [( data point number - xreference) * xincrement] + xorigin + y = ( raw - wfmp['yreference']) * wfmp['yincrement'] + wfmp['yorigin'] # voltage = [( data value - yreference) * yincrement] + yorigin - # return the times and voltages - n = np.arange(0, wfmp['NR_PT'] / wfmp['BYT_NR']) - t = wfmp['BYT_NR'] * wfmp['XINCR'] * (n - wfmp['PT_OFF']) + wfmp['XZERO'] # time = [(data point number - xreference) * xincrement] + xorigin - y = wfmp['YMULT'] * (raw - wfmp['YOFF']) + wfmp['YZERO'] # voltage = [(data value - yreference) * yincrement] + yorigin (see Page 667 , Keysight manual for programmer ) + print(y,t) return wfmp, t, y - - -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # - def get_screenshot(self, verbose=False): - if verbose: - print('Downloading screen image...') - self.dev.write('SAVE:IMAG:FILEF PNG') - self.dev.write('HARDCOPY START') - return self.dev.read_raw(None) - def save_screenshot(self, filepath, verbose=False): - if verbose: - print('Saving screen image...') - data = self.get_screenshot() - with open(filepath, 'wb') as f: - f.write(data) + ####################################################################################### + # Misc # + ####################################################################################### + # Works fine def set_date_time(self, verbose=False): if verbose: print('Setting date and time...') self.sendrecv('DATE "' + time.strftime('%Y-%m-%d',time.localtime()) + '"') # set the date self.sendrecv('TIME "' + time.strftime('%H:%M:%S',time.localtime()) + '"') # set the time + + def close(self): + self.dev.close() + def lock(self, verbose=False): if verbose: print('Locking front panel') - self.dev.write('LOCk ALL') + self.dev.write(':SYSTem:LOCK 1') def unlock(self, verbose=False): if verbose: print('Unlocking front panel') - self.dev.write('LOCk NONE') + self.dev.write(':SYSTem:LOCK 0') - def get_acquire_state(self): - reponse = self.dev.query('ACQ:STATE?') - return int(response) + ####################################################################################### + # Wave Generator # + ####################################################################################### + + def wgen_on(self, on = True): + ''' Wave generator''' + if on: + self.dev.write(":WGEN:OUTPut 1") # 1 is on + else: + self.dev.write(":WGEN:OUTPut 0") # 0 is off - def set_acquire_state(self, running=True): - self.dev.write('ACQ:STATE ' + 'START' if running else 'STOP') + def set_wgen_freq(self, freq = 1): + """ + in Hz + """ + self.dev(f":WGEN:FREQuency {freq}") - def close(self): - self.dev.close() + def set_wgen_form(self, form = "SQUare" ): + """ + Possible forms: + {SINusoid | SQUare | RAMP | PULSe | NOISe | DC} + """ + self.dev(f":WGEN:FUNCtion {form}") + def set_wgen_voltage(self, voltage= 1): + self.dev(f":WGEN:VOLTage {voltage}") + def set_wgen_high(self, voltage_high= 1): + """ + in V : High level of the signal + """ + self.dev(f":WGEN:VOLTage:HIGH {voltage_high}") + + def set_wgen_high(self, voltage_low= 0): + """ + in V : Low level of the signal + """ + self.dev(f":WGEN:VOLTage:LOW {voltage_low}") -if __name__ == '__main__': - # scope = KeysightScope(addr='TCP?*::INSTR', timeout=10) - scope = KeysightScope(addr='USB?*::INSTR', timeout=10) - - print( scope.channels() ) - # Testings - # print("channels ", scope.channels()) +##################################################################################################### +##################################################################################################### +##################################################################################################### +##################################################################################################### + # Not Sure we will use the png option + def get_screenshot(self, verbose=False): + pass + # if verbose: + # print('Downloading screen image...') + + # self.dev.write('SAVE:IMAG:FILEF PNG') + # self.dev.write('HARDCOPY START') + # return self.dev.read_raw(None) + + def save_screenshot(self, filepath, verbose=False): + pass + # if verbose: + # print('Saving screen image...') + # data = self.get_screenshot() + # with open(filepath, 'wb') as f: + # f.write(data) + + + +## uncomment to test +if __name__ == '__main__': + + scope = KeysightScope(addr='USB?*::INSTR', timeout=5) + + + # Works perfect def transition_to_manual(): - chans = scope.channels() - wfmp = {} + channels = scope.channels() + data_dict = {} # Create Dict chanel - data vals = {} - wtype = [('t', 'float')] - + wtype = [('t', 'float')] print('Downloading...') - for ch, enabled in channs.items(): + for ch, enabled in channels.items(): if enabled: - wfmp[ch], t, vals[ch] = self.scope.waveform( + data_dict[ch], t, vals[ch] = scope.waveform( ch, - int16=self.scope_params.get('int16', False), - preamble_string=self.preamble_string, + int16= False # THis was : self.scope_params.get('int16', False), ) wtype.append((ch, 'float')) - print(wfmp[ch]['WFID']) - # Collate all data in a structured array + # Collect all data in a structured array data = np.empty(len(t), dtype=wtype) data['t'] = t for ch in vals: data[ch] = vals[ch] + print(data) + + def transition_to_buffered(): + scope.unlock() + scope.write(':ACQuire:TYPE AVERage') + scope.set_acquire_state(True) + return {} + + + + transition_to_manual() + #transition_to_buffered() + + + + + # to improve first connection + # manufacturer, model, sn, revision = self.scope.idn.split(',') + # #assert manufacturer.lower() == 'tektronix' + # #"Device is made by {:s}, not by Tektronix, and is actually a {:s}".format( + # # manufacturer, model + # #) + # print('Connected to {} (SN: {})'.format(model, sn)) \ No newline at end of file diff --git a/labscript_devices/KeysightScope/__init__.py b/labscript_devices/KeysightScope/__init__.py index e69de29b..174d82a2 100644 --- a/labscript_devices/KeysightScope/__init__.py +++ b/labscript_devices/KeysightScope/__init__.py @@ -0,0 +1,29 @@ + +from labscript import Device, LabscriptError, set_passed_properties ,LabscriptError, AnalogIn + +class ScopeChannel(AnalogIn): + """Subclass of labscript.AnalogIn that marks an acquiring scope channel. + """ + description = 'Scope Acquisition Channel Class' + + def __init__(self, name, parent_device, connection): + """This instantiates a scope channel to acquire during a buffered shot. + + Args: + name (str): Name to assign channel + parent_device (obj): Handle to parent device + connection (str): Which physical scope channel is acquiring. + Generally of the form \'Channel n\' where n is + the channel label. + """ + Device.__init__(self,name,parent_device,connection) + self.acquisitions = [] + + def acquire(self): + """Inform BLACS to save data from this channel. + Note that the parent_device controls when the acquisition trigger is sent. + """ + if self.acquisitions: + raise LabscriptError('Scope Channel {0:s}:{1:s} can only have one acquisition!'.format(self.parent_device.name,self.name)) + else: + self.acquisitions.append({'label': self.name}) \ No newline at end of file diff --git a/labscript_devices/KeysightScope/blacs_tabs.py b/labscript_devices/KeysightScope/blacs_tabs.py index d3290c72..b5cd4c0f 100644 --- a/labscript_devices/KeysightScope/blacs_tabs.py +++ b/labscript_devices/KeysightScope/blacs_tabs.py @@ -1,15 +1,72 @@ +# from blacs.device_base_class import DeviceTab + +# from labscript import LabscriptError + +# from blacs.tab_base_classes import define_state +# from blacs.tab_base_classes import MODE_MANUAL, MODE_TRANSITION_TO_BUFFERED, MODE_TRANSITION_TO_MANUAL, MODE_BUFFERED +# from blacs.device_base_class import DeviceTab +# from qtutils import UiLoader +# import os +# # Imports for handling icons in STBstatus.ui +# from qtutils.qt import QtCore +# from qtutils.qt import QtGui + +# class KeysightScopeTab(DeviceTab): +# def initialise_GUI(self): +# print("Hello World") + +# def initialise_workers(self): +# worker_initialisation_kwargs = self.connection_table.find_by_name(self.device_name).properties +# worker_initialisation_kwargs['addr'] = self.BLACS_connection # vermutung : remote +# self.create_worker( +# 'main_worker', +# 'labscript_devices.KeysightScope.blacs_workers.KeysightScopeWorker', +# worker_initialisation_kwargs, +# ) +# self.primary_worker = 'main_worker' + +####################################################################### NEW + from blacs.device_base_class import DeviceTab -class KeysightScopeTab(DeviceTab): +from labscript import LabscriptError + +from blacs.tab_base_classes import define_state,Worker +from blacs.tab_base_classes import MODE_MANUAL, MODE_TRANSITION_TO_BUFFERED, MODE_TRANSITION_TO_MANUAL, MODE_BUFFERED +from blacs.device_base_class import DeviceTab +from qtutils import UiLoader +# from PyQt5.QtWidgets import QPushButton +import os + + +from qtutils.qt import QtCore +from qtutils.qt import QtGui + + +""" +The Device class: handles the creation of the GUI + interaction GUI ~ QueueManager + + These are run in order : + - self.initialise_GUI() + - self.restore_save_data(settings_dictionary) + - self.initialise_workers() +""" +class KeysightScopeTab(DeviceTab): def initialise_GUI(self): - pass + + # Get capabilities from connection table properties: + connection_table = self.settings['connection_table'] + properties = connection_table.find_by_name(self.device_name).properties + # create a GUI based on these properties + return + def initialise_workers(self): worker_initialisation_kwargs = self.connection_table.find_by_name(self.device_name).properties - worker_initialisation_kwargs['addr'] = self.BLACS_connection + worker_initialisation_kwargs['addr'] = self.BLACS_connection self.create_worker( 'main_worker', 'labscript_devices.KeysightScope.blacs_workers.KeysightScopeWorker', worker_initialisation_kwargs, ) - self.primary_worker = 'main_worker' \ No newline at end of file + self.primary_worker = 'main_worker' diff --git a/labscript_devices/KeysightScope/blacs_workers.py b/labscript_devices/KeysightScope/blacs_workers.py index 4fb6b919..d072cb65 100644 --- a/labscript_devices/KeysightScope/blacs_workers.py +++ b/labscript_devices/KeysightScope/blacs_workers.py @@ -1,85 +1,154 @@ import numpy as np +import os import labscript_utils.h5_lock import h5py +from zprocess import rich_print from blacs.tab_base_classes import Worker import labscript_utils.properties +import matplotlib.pyplot as plt +BLUE = '#66D9EF' +PURPLE = '#AE81FF' +GREEN = '#A6E22E' +GREY = '#75715E' class KeysightScopeWorker(Worker): def init(self): + + # we migrate osci related functions to a separate class global KeysightScope from .KeysightScope import KeysightScope + self.scope = KeysightScope() + + # Buffered/ Manuel relevant flags + self.buffered_mode = False + self.acquired_data = None + self.h5_file = None + + # (FUTUR) Goal: continuous data aquisation, Example: NI_DAQmxAcquisitionWorker(Worker): + self.buffered_chans = None + self.buffered_rate = None - self.scope = KeysightScope(self.addr, termination=self.termination) - manufacturer, model, sn, revision = self.scope.idn.split(',') - #assert manufacturer.lower() == 'tektronix' - #"Device is made by {:s}, not by Tektronix, and is actually a {:s}".format( - # manufacturer, model - #) - print('Connected to {} (SN: {})'.format(model, sn)) + - def transition_to_buffered(self, device_name, h5file, front_panel_values, refresh): - self.h5file = h5file # We'll need this in transition_to_manual + def transition_to_buffered( self, device_name, h5file, front_panel_values, refresh): + self.logger.debug('transition_to_buffered') + + self.h5file = h5file self.device_name = device_name + + # Store the initial values in case we have to abort and restore them: + self.initial_values = front_panel_values + + # Store the final values to for use during transition_to_static: + self.final_values = {} + # Store some parameters for saving data later + self.h5_file = h5file # We'll need this in transition_to_manual + self.device_name = device_name + + + with h5py.File(h5file, 'r') as hdf5_file: - print('\n' + h5file) self.scope_params = labscript_utils.properties.get( hdf5_file, device_name, 'device_properties' ) - self.scope.dev.timeout = 1000 * self.scope_params.get('timeout', 5) + + self.scope.dev.timeout = 1000 * self.scope_params.get('timeout', 5) # This line -- Why ? + + # Locking the front Buttons of the osci during buffered mode + #self.scope.lock() - self.scope.unlock() - self.scope.set_acquire_state(True) + # Run : True // Stop: : False + #self.scope.set_acquire_state(True) + + #self.scope.query(":TRIGger:SWEep NORMal") + #self.scope.query(':TRIGger:LEVel:HIGH 1,CHANnel 1') + self.scope.query(":TRIGger:MODE EDGE") + self.scope.query(":TRIGger:EDGE:LEVel 1") + self.scope.query(":TIMebase:SCALe 5e-8") + + #self.scope.single() # TODO: Make per-shot acquisition parameters and channels configurable here - self.scope.write('ACQUIRE:MODE SAMPLE') - self.scope.write('ACQUIRE:STOPAFTER SEQUENCE') - self.scope.write('ACQUIRE:STATE RUN') + + # Unlocking the front Buttons of the osci after buffered mode + #self.scope.unlock() + + self.buffered_mode = True # confirm that we buffered return {} + + def transition_to_manual(self, abort = False): + """ + Transition to manual mode after buffered execution completion. + + Returns: + bool: `True` if transition to manual is successful. + """ + self.logger.debug('Transition_to_manual Keysight') + rich_print(f"====== transition_to_manual Keysight: {os.path.basename(self.h5file)} ======", color=GREEN) + + if not self.buffered_mode: # In case we didnt take a shot + return True + self.buffered_mode = False # reset the Flag to False + + if abort: # If we aborted we dont want an acquisation + self.acquired_data = None + self.h5_file = None + return True + - def transition_to_manual(self): channels = self.scope.channels() - wfmp = {} + data_dict = {} # Create Dict channel - data vals = {} - wtype = [('t', 'float')] - print('Downloading...') + wtype = [('t', 'float')] + for ch, enabled in channels.items(): if enabled: - wfmp[ch], t, vals[ch] = self.scope.waveform( + data_dict[ch], t, vals[ch] = self.scope.waveform( ch, - int16=self.scope_params.get('int16', False), - preamble_string=self.preamble_string, + int16= False ) wtype.append((ch, 'float')) - print(wfmp[ch]['WFID']) - # Collate all data in a structured array + # Collect all data in a structured array data = np.empty(len(t), dtype=wtype) data['t'] = t for ch in vals: data[ch] = vals[ch] + + print(data) # Open the file after download so as not to hog the file lock - with h5py.File(self.h5file, 'r+') as hdf_file: + # The Blacs worker of the Ni-CArd is responsible for creating the h5file for a shot ( From what i understood , can be wrong ) + with h5py.File(self.h5file, 'r+') as hdf_file: # r+ : Read/write, file must exist grp = hdf_file.create_group('/data/traces') print('Saving traces...') - dset = grp.create_dataset(self.device_name, data=data) - dset.attrs.update(wfmp[ch]) - print('Done!') + dset = grp.create_dataset(self.device_name, data=data) + dset.attrs.update(data_dict[ch]) # This saves the preamble of the waveform + print('Saving Done!') return True - def program_manual(self, values): - return values + # ----------------------------------------- DONE + def abort_transition_to_buffered(self): + """Special abort shot configuration code belongs here. + """ + return self.transition_to_manual(True) + + def abort_buffered(self): + """Special abort shot code belongs here. + """ + return self.transition_to_manual(True) - def abort(self): - print('aborting!') - # self.scope.write('*RST') - return True + # ----------------------------------------- (Futur) Override for remote + def program_manual(self,front_panel_values): + """Over-ride this method if remote programming is supported. + + Returns: + :obj:`check_remote_values()` + """ - def abort_buffered(self): - print('abort_buffered: ...') - return self.abort() + return self.check_remote_values() - def abort_transition_to_buffered(self): - print('abort_transition_to_buffered: ...') - return self.abort() + def check_remote_values(self): + # over-ride this method if remote value check is supported + return {} \ No newline at end of file diff --git a/labscript_devices/KeysightScope/labscript_devices.py b/labscript_devices/KeysightScope/labscript_devices.py index 7176157f..d01f9b0a 100644 --- a/labscript_devices/KeysightScope/labscript_devices.py +++ b/labscript_devices/KeysightScope/labscript_devices.py @@ -1,34 +1,44 @@ -from labscript import Device, LabscriptError, set_passed_properties +from labscript import Device, LabscriptError, set_passed_properties ,LabscriptError, AnalogIn + + class KeysightScope(Device): """A labscript_device for Keysight oscilloscopes (DSOX1202G) using a visa interface. - connection_table_properties (set once) - termination: character signalling end of response - preamble_string: base command for waveform preamble ('WFMO' or 'WFMP') - - device_properties (set per shot) - timeout: in seconds for response to queries over visa interface - int16: download waveform pts as 16 bit integers (returns 1/2 as many pts) + - connection_table_properties (set once) + - device_properties (set per shot) + * timeout : in seconds for response to queries over visa interface + * int16 : download waveform pts as 16 bit integers """ - #description = 'Tekstronix oscilloscope' - description = "KeysightScope" + description = 'Keysight' + #allowed_children = [ScopeChannel] + + @set_passed_properties( property_names = { - 'connection_table_properties': ['termination', 'preamble_string'], - 'device_properties': ['timeout', 'int16']} + 'device_properties': ['timeout', 'int16'] + } ) def __init__(self, name, addr, - termination='\n', preamble_string='WFMP', timeout=5, int16=False, **kwargs): Device.__init__(self, name, None, addr, **kwargs) self.name = name self.BLACS_connection = addr - self.termination = termination - self.preamble_string = preamble_string - assert preamble_string in ['WFMO', 'WFMP'], "preamble_string must be one of 'WFMO' or 'WFMP'" + self.acquisitions = [] # already defined in the class ÁnalogIn + - def generate_code(self, hdf5_file): - # group = self.init_device_name(hdf5_file) + # ----------------------------------------------- TO DOs + def _check_AI_not_too_fast(self, AI_table): # TO DO + pass + + def _make_analog_input_table(self, inputs): # TO DO + pass + + def generate_code(self, hdf5_file, *args): # To improve + # group = self.init_device_name(hdf5_file) Device.generate_code(self, hdf5_file) + # save self.acquisitions in hdf5 + + + diff --git a/labscript_devices/KeysightScope/playground.py b/labscript_devices/KeysightScope/playground.py index 56ade2ef..c153e98e 100644 --- a/labscript_devices/KeysightScope/playground.py +++ b/labscript_devices/KeysightScope/playground.py @@ -1,8 +1,18 @@ -import pyvisa -rm = pyvisa.ResourceManager() +class A: + def a(self): + self.aa = 11 + +class B(A): + def a(self): + self.bb=2 + + +var =B() +var.a() +print(var.aa) + + +aaa = [B] -a = rm.list_resources('USB?*::INSTR') -scope = rm.open_resource(a[0]) -print(scope.read('*IDN?')) \ No newline at end of file diff --git a/labscript_devices/NI_DAQmx/blacs_workers.py b/labscript_devices/NI_DAQmx/blacs_workers.py index 44740d8c..3b2270af 100644 --- a/labscript_devices/NI_DAQmx/blacs_workers.py +++ b/labscript_devices/NI_DAQmx/blacs_workers.py @@ -602,7 +602,7 @@ def transition_to_manual(self, abort=False): data_group.create_group(self.device_name) waits_in_use = len(hdf5_file['waits']) > 0 - if self.buffered_chans is not None and not self.acquired_data: + if self.buffered_chans is not None and not self.acquired_data: msg = """No data was acquired. Perhaps the acquisition task was not triggered to start, is the device connected to a pseudoclock?""" raise RuntimeError(dedent(msg)) @@ -692,7 +692,7 @@ def abort_transition_to_buffered(self): return self.transition_to_manual(True) def program_manual(self, values): - return {} + return {} # class NI_DAQmxWaitMonitorWorker(Worker): diff --git a/labscript_devices/naqslab_devices/KeysightXSeries/blacs_worker.py b/labscript_devices/naqslab_devices/KeysightXSeries/blacs_worker.py index 0617d838..5ddcd1ea 100644 --- a/labscript_devices/naqslab_devices/KeysightXSeries/blacs_worker.py +++ b/labscript_devices/naqslab_devices/KeysightXSeries/blacs_worker.py @@ -279,18 +279,4 @@ def check_status(self): return self.convert_register(esr) - # Added this from Tekcscope - def abort(self): - print('aborting!') - self.scope.write('*RST') - return True - - def abort_buffered(self): - print('abort_buffered: ...') - return self.abort() - - def abort_transition_to_buffered(self): - print('abort_transition_to_buffered: ...') - return self.abort() - diff --git a/labscript_devices/naqslab_devices/VISA/blacs_tab.py b/labscript_devices/naqslab_devices/VISA/blacs_tab.py index 1a4211f6..1e93967c 100644 --- a/labscript_devices/naqslab_devices/VISA/blacs_tab.py +++ b/labscript_devices/naqslab_devices/VISA/blacs_tab.py @@ -70,6 +70,8 @@ def initialise_GUI(self): self.status_ui.clear_button.clicked.connect(self.send_clear) + ################################ Initalize worker + # Store the VISA name to be used self.address = str(self.settings['connection_table'].find_by_name(self.settings["device_name"]).BLACS_connection) #self.device_name = str(self.settings['device_name']) diff --git a/labscript_devices/naqslab_devices/VISA/blacs_worker.py b/labscript_devices/naqslab_devices/VISA/blacs_worker.py index 513a54a1..bd4af3c6 100644 --- a/labscript_devices/naqslab_devices/VISA/blacs_worker.py +++ b/labscript_devices/naqslab_devices/VISA/blacs_worker.py @@ -35,9 +35,7 @@ def init(self): raise LabscriptError(dedent(msg)) from None self.connection.timeout = 2000 - def check_remote_values(self): - # over-ride this method if remote value check is supported - return None + def convert_register(self,register): """Converts returned register value to dict of bools @@ -74,14 +72,6 @@ def check_status(self): return self.convert_register(stb) - def program_manual(self,front_panel_values): - """Over-ride this method if remote programming is supported. - - Returns: - :obj:`VISAWorker.check_remote_values()` - """ - - return self.check_remote_values() def clear(self,value): """Sends standard \*CLR to clear registers of device. diff --git a/labscript_devices/naqslab_devices/VISA/tests.py b/labscript_devices/naqslab_devices/VISA/tests.py new file mode 100644 index 00000000..e69de29b diff --git a/labscript_devices/naqslab_devices/__init__.py b/labscript_devices/naqslab_devices/__init__.py index 5ed9b672..53396482 100644 --- a/labscript_devices/naqslab_devices/__init__.py +++ b/labscript_devices/naqslab_devices/__init__.py @@ -14,14 +14,14 @@ # defines a version and author -# import sys -# import os +import sys +import os -# sys.path -# sys.path.append(os.getcwd()) +sys.path +sys.path.append(os.getcwd()) -# import sys -# import os +import sys +import os @@ -144,5 +144,3 @@ def setphase(self,value,units=None): """ raise LabscriptError('StaticFreqAmp does not support phase control') -def pleasework(): - print("I am working chill !!!") From 6344ccb200b164a1a88756d4f552a5779bd28254 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Wed, 19 Feb 2025 20:56:02 +0100 Subject: [PATCH 04/20] working --- .../KeysightScope/KeysightScope.py | 759 ++++++++++++------ labscript_devices/KeysightScope/README.md | 27 + .../KeysightScope/blacs_workers.py | 88 +- .../KeysightScope/connection_manager.py | 117 +++ .../KeysightScope/labscript_devices.py | 125 ++- .../models/Keysight_dsox1202g.py | 91 +++ .../KeysightScope/models/example_to_copy.py | 89 ++ labscript_devices/KeysightScope/playground.py | 18 - 8 files changed, 957 insertions(+), 357 deletions(-) create mode 100644 labscript_devices/KeysightScope/README.md create mode 100644 labscript_devices/KeysightScope/connection_manager.py create mode 100644 labscript_devices/KeysightScope/models/Keysight_dsox1202g.py create mode 100644 labscript_devices/KeysightScope/models/example_to_copy.py delete mode 100644 labscript_devices/KeysightScope/playground.py diff --git a/labscript_devices/KeysightScope/KeysightScope.py b/labscript_devices/KeysightScope/KeysightScope.py index 6472e501..4fb19822 100644 --- a/labscript_devices/KeysightScope/KeysightScope.py +++ b/labscript_devices/KeysightScope/KeysightScope.py @@ -1,82 +1,132 @@ import pyvisa import numpy as np import time +#from keysight_dsox1202g import osci_capabilities, osci_shot_configuration +from labscript.labscript import LabscriptError +#from labscript_devices.KeysightScope.models.Keysight_dsox1202g import osci_capabilities, osci_shot_configuration +from re import sub -""" -Using the Oscilloscope requires 3 important steps +from labscript_devices.KeysightScope.connection_manager import * + +# -------------------- Change me +description = "Example Osci" +# ------------------------------ - * Initialsiation : which is setting up the osci for the desired measure - * Acquiring : the osci aquires the measurement and saves them in its memory - * Analysing : after finishing the measurement, we can display or transfer the data to the Pc - ===== > This code is therfore organized after the above mentionned three blocks +adress = get_address_from_description(description) +osci_capabilities = get_capabilities_from_description(description) +osci_shot_configuration = get_configuration_from_description(description) +unit_conversion = { + 's' : 1 , + 'ns': 1e-9, # nanoseconds to seconds + 'us': 1e-6, # microseconds to seconds + 'ms': 1e-3 # milliseconds to seconds + } + +""" +Keysight Scopes + + Using the Oscilloscope requires 3 important steps + * Initialsiation : which is setting up the osci for the desired measure + * Acquiring : the osci aquires the measurement and saves them in its memory + * Analysing : after finishing the measurement, we can display or transfer the data to the Pc + To Improve: - - connecting to the oscilloscope should not be implemented here - - passing the properties should be more flexible (example NI_DAQmx) - - Implemente other aquiring modes -- Average . Normal , Peak - - Investigate what is better signed or unsigned bits + ** PRIO + - Currently only data within the displayed time range is captured + - implement triggered bool + - implement second channel possi + - write docu and example + + ** NOT PRIO + - Implemente other aquiring modes - Peak HRESolution + - Configuration possibility for other trigger types other then EDGE """ -# Model DS01202G class KeysightScope: - def __init__(self, addr='USB?*::INSTR', - timeout =5): - # Connecting to the osci + def __init__(self, + osci_capabilities=osci_capabilities , + osci_shot_configuration=osci_shot_configuration, + adress = adress + ): + + self.verbose = False + self.osci_capabilities = osci_capabilities + + # --------------------------------- device capabilities + for key, value in osci_capabilities.items(): + setattr(self, key, value) + + # --------------------------------- Shot configurations + for key, value in osci_shot_configuration.items(): + setattr(self, key, value) + + # --------------------------------- Connecting to device + + # Based on the serial number in osci_capabilities + # rm = pyvisa.ResourceManager() + # devs = rm.list_resources() + # for idx, item in enumerate(devs): + # try: + # scope = rm.open_resource(devs[idx], timeout=200) + # scopename = scope.query("*IDN?") + # scope_serial_number = sub(r'\s+', '', scope.query(":SERial?")) # To get rid of white spaces + # if scope_serial_number == self.serial_number: + # self.dev = scope + # print(f"Initialized: {scopename}") + # except: + # continue + rm = pyvisa.ResourceManager() - devs = rm.list_resources(addr) - assert len(devs), "PyVisa didn't find any connected devices matching " + addr - self.dev = rm.open_resource(devs[0]) - self.idn = self.dev.query('*IDN?') - print(f"The scope {self.idn} was successfully initialized") - - # Basic Visa commands (if Visa works on the osci, then these will work) - self.read = self.dev.read # class method - self.write = self.dev.write # class method - self.query = self.dev.query # class method - - # Setting the osci properties - # --------------------------------- Device properties (Fix) - self.band_width = 70e6 # 70 MHz - self.sampling_rate = 2*10e9 # 2GSa/s - self.max_memory = 1e6 # 1Mpts - self.max_update_rate = 5e4 # 50,000 waveforms/second update rate. - - # Setting the osci configurations - self.dev.timeout = 1000 * timeout # convert in seconds - - # INIT: Preset and wait for operations to complete - self.dev.write("*RST") # An instrument control script should start with a *RST command. - self.dev.query("*OPC?") # Synchronization: Waits until previous commands is done before moving forward in the script - self.autoscale() - - # ############################################################# in progress - # Measurement setup variablees - vRange = 2 - tRange = 500e-9 - trigerLevel = 0 - ch = 1 - - GENERAL_TIMEOUT = 5000 # General I/O timeout (ms) - TRIGGER_TIMEOUT = 60000 # Max time to wait for a trigger (ms) for *OPC? method - - # Prevent excessive queries by adding a delay in seconds: - POLLING_INTERVAL = 0.1 # (seconds) - - + self.dev = rm.open_resource(adress) + scopename = self.dev.query("*IDN?") + print(f"Initialized: {scopename}") + + + + # --------------------------------- Initialize device + self.reset_device() + self.dev.timeout = float(self.timeout)*1e3 + self.set_acquire_state(running=True) + + # set_waveform_format better in the beggining because some other configuration + # is influecing yincrement and yorigin, which yields wrong voltage values + self.set_waveform_format(format=self.waveform_format) + + #self.set_trigger_source(source= self.trigger_source) + self.set_trigger_source(source="CHANnel1") + self.set_trigger_level(level= self.trigger_level, unit=self.trigger_level_unit ) + self.set_trigger_edge_slope(slope = self.trigger_edge_slope) + self.set_acquire_type(type=self.acquire_type) + self.set_acquire_count(count=self.acquire_count) + + self.set_time_reference(reference=self.time_reference) + self.set_time_division(division= self.time_division, unit= self.time_division_unit) + self.set_time_delay(delay=self.time_delay, unit= self.time_delay_unit) + + # Channel specific + + # --- Channel 1 + self.set_channel_display(channel="1",display=self.channel_display_1 ) + self.set_voltage_division(division=self.voltage_division_1, unit= self.voltage_division_unit_1) + self.set_voltage_offset(offset=self.voltage_offset_1, unit=self.voltage_offset_unit_1) + self.set_probe_attenuation(attenuation=self.probe_attenuation_1) + + # --- Channel 1 + self.set_channel_display(channel="2",display=self.channel_display_2 ) + self.set_voltage_division(division=self.voltage_division_2, unit= self.voltage_division_unit_2) + self.set_voltage_offset(offset=self.voltage_offset_2, unit=self.voltage_offset_unit_2) + self.set_probe_attenuation(attenuation=self.probe_attenuation_2) + + ####################################################################################### - # Initialisation # + # Basic Commands # ####################################################################################### - def set_acquire_state(self, running=True): - '''RUN / STOP ''' - self.dev.write(':RUN' if running else 'STOP') - - def abort(self): - self.dev.write(':STOP') - return True + # ----------------------------------------------- Running or not Running, that is the question! def get_acquire_state(self): # In other words , is it running ? """Determine if the oscilloscope is running. Returns: ``True`` if running, ``False`` otherwise @@ -84,6 +134,22 @@ def get_acquire_state(self): # In other words , is it running ? reg = int(self.dev.query(':OPERegister:CONDition?')) # The third bit of the operation register is 1 if the instrument is running return int((reg & 8) == 8) + def set_acquire_state(self, running=True): + '''RUN / STOP ''' + self.dev.write(':RUN' if running else 'STOP') + if self.verbose: + print("Done running") + + def reset_device(self): + self.dev.write(":RST*") + if self.verbose: + print("Done reset") + + # ----------------------------------------------- Other stuff + def abort(self): # brauchen wir das ? + self.dev.write(':STOP') + return True + def digitize(self): ''' Specialized RUN command. acquires a single waveforms according to the settings of the :ACQuire commands subsystem. @@ -94,42 +160,10 @@ def digitize(self): def autoscale(self): self.dev.write(":AUToscale") - def channels(self, all=True): - ''' - Returns: dictionary {str supported channels : bool currently displayed } - If "all" is False, only visible channels are returned - ''' - - # List with all Channels - all_channels = self.dev.query(":MEASure:SOURce?").rstrip().split(",") - - # We have to change all_channels a little bit for the oscii (e.g CHAN1 -> CHANnel1) - all_channels = [ch.replace("CHAN", "CHANnel") for ch in all_channels] - - # Create a dictionary {channel : visibility} - vals = {} - for index , chan in enumerate(all_channels): - try: - visible = bool(int(self.dev.query(f":CHANnel{index + 1 }:DISPlay?"))) - except: - continue - if all or visible: - vals[chan] = visible - return vals - def shutdown(self): """Closes VISA connection to device.""" self.dev.close() - def get_trigger_event(self): - """ - whether the osci was triggered or not - return: - 0 : No trigger event was registred - 1 : trigger event was registred - """ - return int(self.dev.query(':TER?')) - def clear_status(self): """ clears: the status data structures, @@ -138,109 +172,352 @@ def clear_status(self): """ self.dev.write("*CLS") - # ------------------------------------- TRiggering (IN PROGRESS) - - def single(self): - ''' Single Button ''' - self.dev.query(":SINGle") - - def set_trigger_mode(self): # (FUTUR) add more trigger types - self.dev.write("trigger:mode edge") # change capitalizations for commands for the next 2 functions + def close(self): + self.dev.close() - def set_trigger_level(self,channel, triggerLevel): - self.dev.write(f"trigger:level channel{channel}, {triggerLevel}") + def lock(self): + self.dev.write(':SYSTem:LOCK 1') - # ----------------------------------------------- Voltage # (TDOO) Here Error Hanedling + def unlock(self): + self.dev.write(':SYSTem:LOCK 0') - def set_t_range(self,channel,tRange): - """ for all 10 div """ - self.dev.write(f"timebase:range{tRange}") + def set_date_time(self): + self.sendrecv('DATE "' + time.strftime('%Y-%m-%d',time.localtime()) + '"') # set the date + self.sendrecv('TIME "' + time.strftime('%H:%M:%S',time.localtime()) + '"') # set the time + ####################################################################################### + # Setting Axes (Voltage & Time) # + ####################################################################################### - def set_v_square(self,channel, volt_square, unit="V"): + # ----------------------------------------------- Voltage + def set_voltage_range(self, range, channel=1, unit="V"): + """ unit : V or mV """ if unit =="V": - self.dev.write(f":CHANnel{channel}:RANGe {volt_square*8}") + self.dev.write(f":CHANnel{channel}:RANGe {range}") elif unit =="mV": - self.dev.write(f":CHANnel{channel}:RANGe {volt_square*8}mV") + self.dev.write(f":CHANnel{channel}:RANGe {range}mV") + + def set_voltage_division(self, division, channel=1, unit="V"): + """ unit : V or mV """ + if unit in ["V","mV"]: + self.dev.write(f":CHANnel{channel}:SCALe {division}{unit}") + if self.verbose: + print("Done voltage division") + + def set_voltage_offset(self,offset,channel=1,unit="V"): + """ unit : V or mV """ + if unit in ["V","mV"]: + self.dev.write(f":CHANnel{channel}:OFFSet {offset}{unit}") + if self.verbose: + print("Done voltage offset") + + # ----------------------------------------------- Time + def set_time_range(self, range, unit): + """Set the time range for the oscilloscope. + Args: + time_range: The time range value. (50ns - 500s) + unit: The unit for the time range, 'ms', 'us', 'ns'. + + Raises: + LabscriptError: If the time range is outside the valid range or if the unit is invalid. + """ - def set_v_scale(self, scale_value): - """ scale_value ::= voltage/div in volt in NR3 format """ - self.dev.write(f":CHANnel1:SCALe {scale_value}") + # Validate unit + if unit not in unit_conversion: + raise LabscriptError(f"Invalid unit '{unit}'. Supported units are 'ns', 'us', 'ms'.") + # Convert to seconds + try: + converted_time_range = float(range) * unit_conversion[unit] + + # Check if the converted time range is within the allowed bounds + if not (50e-9 <= converted_time_range <= 500): + raise LabscriptError(f"Range not supported. Valid range is between 50 ns and 500 s.") + + except Exception as e: + raise LabscriptError(f"Invalid time range or unit: {e}") + + # Send the command to the oscilloscope + self.dev.write(f":TIMebase:RANGe {range}") + + def set_time_division(self,division,unit): + """Set the time division for the oscilloscope. + Args: + time_division: The time division value. (min 5ns - max 50s) + unit: The unit for the time division, 'ms', 'us', 'ns'. + + Raises: + LabscriptError: If the time division is outside the valid range or if the unit is invalid. + """ + # Validate unit + if unit not in unit_conversion: + raise LabscriptError(f"Invalid unit '{unit}'. Supported units are 'ns', 'us', 'ms'.") + + # Convert to seconds + try: + converted_time_range = float(division) * unit_conversion[unit] + + # Check if the converted time range is within the allowed bounds + if not (5e-9 <= converted_time_range <= 50): + raise LabscriptError(f"Time division not supported. Valid division is between 50 ns and 500 s.") + + except Exception as e: + raise LabscriptError(f"Invalid time division or unit: {e}") + + self.dev.write(f":TIMebase:SCALe {converted_time_range}") + if self.verbose: + print("Done time division") + + def set_time_delay(self,delay,unit="us"): + """Set the time delay. + Args: + time_delay: The time delay value. + unit: The unit for the time delay, 'ms', 'us', 'ns'. + + Raises: + LabscriptError: If the time delay is outside the valid range or if the unit is invalid. + """ - # ----------------------------------------------- Time # (TDOO) Here Error Hanedling - - def set_t_square(self, time_square): - """in seconds """ - self.dev.write(f":TIMebase:RANGe {time_square*10}") + # Validate unit + if unit not in unit_conversion: + raise LabscriptError(f"Invalid unit '{unit}'. Supported units are 'ns', 'us', 'ms'.") + + # Convert to seconds + try: + converted_time_delay = float(delay) * unit_conversion[unit] + + # Check if the converted time range is within the allowed bounds + if converted_time_delay >= 500: + raise LabscriptError(f"Time delay not supported. Valid division is between 100ps and 500 s.") + + except Exception as e: + raise LabscriptError(f"Invalid time delay or unit: {e}") + + self.dev.write(f":TIMebase:DELay {converted_time_delay}") + if self.verbose: + print("Done time delay") + + def set_time_reference(self,reference = "CENTer"): + """ accepted args: LEFT , CENTer , RIGHt """ + self.dev.write(f":TIMebase:REFerence {reference}") + if self.verbose: + print("Done time reference") + ####################################################################################### + # Triggering # + ####################################################################################### - def get_t_scale(self): - self.dev.write(":TIMebase:SCALe?") + def single(self): + ''' Single Button ''' + self.dev.write(":SINGle") + + def get_trigger_event(self): # how to make use of this ? + """ + whether the osci was triggered or not + return: + 0 : No trigger event was registred + 1 : trigger event was registred + """ + return int(self.dev.query(':TER?')) + + # ----------------------------------------------- Trigger Type + def get_trigger_type(self): + """Get the current trigger type.""" + return self.dev.query(":TRIGger:MODE?") + + def set_trigger_type(self, type): + """ valid types : EDGE, GLITch, PATTern, SHOLd, TRANsition, TV, SBUS1 """ + valid_types = {"EDGE", "GLITch", "PATTern", "SHOLd", "TRANsition", "TV", "SBUS1"} + + if type not in valid_types: + raise LabscriptError(f"Invalid trigger mode. Valid modes are: {', '.join(valid_types)}") + + self.dev.write(f":TRIGger:MODE {type}") - def set_t_scale(self,scale_value): + # ----------------------------------------------- Trigger source + def get_trigger_source(self): + return self.dev.query(":TRIGger:SOURce?") + + def set_trigger_source(self, source = "EXTernal"): """ - scale_value ::= time/div in seconds in NR3 format + Valid source : CHANnel , EXTernal , LINE" , WGEN} + with n = channel number """ - self.dev.write(f":TIMebase:SCALe {scale_value}") + try: + self.dev.write(f":TRIGger:SOURce {source} ") + if self.verbose: + print("Done trigger source") + except Exception as e: + raise LabscriptError("trigger_source: "+ e) + + # ----------------------------------------------- Trigger Level + def get_trigger_level(self): + """Get the current trigger level.""" + if self.trigger_source == "EXTernal": + return self.dev.query(":EXTernal:LEVel?") + else: + return self.dev.query(":TRIGger:LEVel?") + + def set_trigger_level(self, level,unit="V"): + """ unit : V or mV """ + assert unit in ["V","mV"], LabscriptError("unit must be V or mV") + """Set the trigger level in V""" + if self.trigger_source == "EXTernal": + self.dev.write(f":EXTernal:LEVel {level}{unit}") + if self.verbose: + print("Done trigger level EXternal") + else: + self.dev.write(f":TRIGger:LEVel {level}{unit}") + if self.verbose: + print("Done trigger level") + + # ----------------------------------------------- Trigger Edge slope + def set_trigger_edge_slope(self,slope): + """ + slope : POSitive, NEGative , EITHer , ALTernate + """ + if self.trigger_type != "EDGE": + raise LabscriptError("Trigger type must be \"EDGE\" ") + self.dev.write(f":TRIGger:EDGE:SLOPe {slope}") + if self.verbose: + print("Done trigger slope") ####################################################################################### + # Channel Configurations # + ####################################################################################### + + # ----------------------------------------------- Probe Attenuation + def set_probe_attenuation(self,attenuation, channel=1): + """ + Sets the probe attenuation factor for the selected channel. + Allowed range: 0.1 - 10000 + """ + try: + assert ( 0.1<= float(attenuation) <= 1e4) + self.dev.write(f":CHANnel{channel}:PROBe {attenuation}") + if self.verbose: + print("Done probe attenuation") + + except Exception as e: + raise LabscriptError("Probe attenuation ration not in range 0.1 - 10000") + + # ----------------------------------------------- Display a channel + def set_channel_display(self,channel,display): + """"display a channel + args: + channel: str the channel number + display: str 0: OFF, 1:ON + """ + self.dev.write(f":CHANnel{channel}:DISPlay {display}") + + # ----------------------------------------------- Displayed channels + def channels(self, all=True): + ''' + Returns: dictionary {str supported channels : bool currently displayed } + If "all" is False, only visible channels are returned + ''' + + # List with all Channels + all_channels = self.dev.query(":MEASure:SOURce?").rstrip().split(",") + + # We have to change all_channels a little bit for the oscii (e.g CHAN1 -> CHANnel1) + all_channels = [ch.replace("CHAN", "CHANnel") for ch in all_channels] + + # Create a dictionary {channel : visibility} + vals = {} + for index , chan in enumerate(all_channels): + try: + visible = bool(int(self.dev.query(f":CHANnel{index + 1 }:DISPlay?"))) + except: + continue + if all or visible: + vals[chan] = visible + return vals + ####################################################################################### # Acquiring # ####################################################################################### - # - def set_aquire_type(self,type="NORMal"): + + # ----------------------------------------------- Acquire type + def set_acquire_type(self,type="NORMal"): ''' - There are 4 aquire types for this: - * NORMal : - * AVERage : You can set the count by sending the :ACQuire:COUNt command followed by the number of averages. - In this mode, the value for averages is an integer from 1 to 65536. - The COUNt value determines the number of averages that must be acquired. - * HRESolution : reduce noise at slower sweep speeds where - the digitizer samples faster than needed to fill memory for the displayed time range. - * PEAK : PEAK + The :ACQuire:TYPE command selects the type of data acquisition that is to take + place. The acquisition types are: + + • NORMal — sets the oscilloscope in the normal mode. + + • AVERage — sets the oscilloscope in the averaging mode. You can set the count + by sending the :ACQuire:COUNt command followed by the number of averages. + In this mode, the value for averages is an integer from 1 to 65536. The COUNt + value determines the number of averages that must be acquired. + The AVERage type is not available when in segmented memory mode + (:ACQuire:MODE SEGMented). + + • HRESolution — sets the oscilloscope in the high-resolution mode (also known + as smoothing). This mode is used to reduce noise at slower sweep speeds + where the digitizer samples faster than needed to fill memory for the displayed + time range. + For example, if the digitizer samples at 200 MSa/s, but the effective sample + rate is 1 MSa/s (because of a slower sweep speed), only 1 out of every 200 + samples needs to be stored. Instead of storing one sample (and throwing others + away), the 200 samples are averaged together to provide the value for one + display point. The slower the sweep speed, the greater the number of samples + that are averaged together for each display point. + + • PEAK — sets the oscilloscope in the peak detect mode. In this mode, + :ACQuire:COUNt has no meaning. + + The AVERage and HRESolution types can give you extra bits of vertical resolution. + See the User's Guide for an explanation. When getting waveform data acquired + using the AVERage and HRESolution types, be sure to use the WORD or ASCii + waveform data formats to get the extra bits of vertical resolution. ''' self.dev.write(":ACQuire:TYPE "+ type) + if self.verbose: + print("Done acquire type") + + # ----------------------------------------------- Acquire count + def set_acquire_count(self,count): + ''' In averaging and Normal mode, specifies the number of values + to be averaged for each time bucket before the acquisition is considered to be + complete for that time bucket. + - count: 2 - 65536. + ''' + if self.acquire_type not in ["HRESolution","PEAK","NORMal" ]: + self.dev.write(f":ACQuire:COUNT {count}") + if self.verbose: + print("Done trigger count") - - # ----------------------------------- Waveform + # ----------------------------------------------- Acquire source def set_waveform_source(self,channel): - self.dev.write(':WAVeform:SOURce ' + channel) # set the location of the data transferred by WAVeform? + ''' Set the location of the data transferred by WAVeform ''' + self.dev.write(':WAVeform:SOURce ' + channel) ####################################################################################### # Reading # ####################################################################################### - def get_xIncrement(self): # (in progress) - return float(self.dev.query("waveform:xincrement?")) - - def get_xOrigin(self): # (in progress) - return float(self.dev.query("waveform:xincrement?")) - - def get_yIncrement(self): # (in progress) - return float(self.dev.query("waveform:xincrement?")) - - def get_yOrigin(self): # (in progress) - return float(self.dev.query("waveform:xincrement?")) - - - - def waveform(self, channel='CHANnel1', int16=False): - """ - returns: dict - * Waveform preample : List, as set by the 'Record length' setting in the 'Acquisition' menu. - * Times: List of acquired times - * Values: List of acquired voltages + # ----------------------------------------------- Waveform format + def set_waveform_format(self, format): + ''' Sets the data transmission mode for waveform data points. + WORD: formatted data transfers 16-bit data as two bytes. + BYTE: formatted data is transferred as 8-bit bytes. + ''' + if format == "WORD": + self.dev.write(f":WAVeform:FORMat {format}") + #self.dev.write(':WAVeform:BYTeorder LSBFirst') # MSBF is default, must be overridden for WORD to work + self.datatype = "H" + if self.verbose: + print("Done Waveform Word") + + if format == "BYTE": + self.dev.write(f":WAVeform:FORMat {format}") + self.datatype = "B" + if self.verbose: + print("Done Waveform Byte") + + # ----------------------------------------------- Waveform Preample + def get_preample_as_dict(self): """ - # configure the data type transfer - self.set_waveform_source(self,channel) # set the location of the data transferred by WAVeform? - - # transfer the data and format into a sequence of strings - raw = self.dev.query_binary_values(':WAVeform:DATA?', - datatype='H' if int16 else 'B', # 'B' and 'H' are for unassigned , if you want signed use h and b - #is_big_endian=True, # In case we shift to signed - container=np.array - ) - - # Create a dictionary for the preamble + return dict with the following keys keys = [ "format", # for BYTE format, 1 for WORD format, 4 for ASCii format; an integer in NR1 format (format set by :WAVeform:FORMat) "type", # 2 for AVERage type, 0 for NORMal type, 1 for PEAK detect type; an integer in NR1 format (type set by :ACQuire:TYPE). @@ -253,48 +530,42 @@ def waveform(self, channel='CHANnel1', int16=False): "yorigin" , # 32-bit floating point NR3>, "yreference", # 32-bit NR1. ] - - # Get the Preamble + """ + keys = ["format","type","points","count","xincrement","xorigin","xreference","yincrement","yorigin","yreference"] preamble = self.dev.query(":WAVeform:PREamble?") preamble_val = [float(i) for i in preamble.split(",")] + return dict(zip(keys, preamble_val)) + # ----------------------------------------------- Waveform function + def waveform(self, channel='CHANnel1'): + """ + returns: dict + * Waveform preample : List, as set by the 'Record length' setting in the 'Acquisition' menu. + * Times: List of acquired times + * Values: List of acquired voltages + """ + # configure the data type transfer + self.set_waveform_source(channel) + + # transfer the data and format into a sequence of strings + raw = self.dev.query_binary_values( + ':WAVeform:DATA?', + datatype=self.datatype, # 'B' and 'H' are for unassigned , if you want signed use h and b + #is_big_endian=True, # In case we shift to signed + container=np.array + ) + # create a dictionary of the waveform preamble - wfmp = dict(zip(keys, preamble_val)) + wfmp = self.get_preample_as_dict() # (see Page 667 , Keysight manual for programmer ) n = np.arange(wfmp['points'] ) t = ( n - wfmp['xreference']) * wfmp['xincrement'] + wfmp['xorigin'] # time = [( data point number - xreference) * xincrement] + xorigin y = ( raw - wfmp['yreference']) * wfmp['yincrement'] + wfmp['yorigin'] # voltage = [( data value - yreference) * yincrement] + yorigin - print(y,t) return wfmp, t, y - - ####################################################################################### - # Misc # - ####################################################################################### - # Works fine - def set_date_time(self, verbose=False): - if verbose: - print('Setting date and time...') - self.sendrecv('DATE "' + time.strftime('%Y-%m-%d',time.localtime()) + '"') # set the date - self.sendrecv('TIME "' + time.strftime('%H:%M:%S',time.localtime()) + '"') # set the time - - - def close(self): - self.dev.close() - - def lock(self, verbose=False): - if verbose: - print('Locking front panel') - self.dev.write(':SYSTem:LOCK 1') - - def unlock(self, verbose=False): - if verbose: - print('Unlocking front panel') - self.dev.write(':SYSTem:LOCK 0') - ####################################################################################### # Wave Generator # ####################################################################################### @@ -307,9 +578,7 @@ def wgen_on(self, on = True): self.dev.write(":WGEN:OUTPut 0") # 0 is off def set_wgen_freq(self, freq = 1): - """ - in Hz - """ + """ in Hz """ self.dev(f":WGEN:FREQuency {freq}") def set_wgen_form(self, form = "SQUare" ): @@ -320,6 +589,7 @@ def set_wgen_form(self, form = "SQUare" ): self.dev(f":WGEN:FUNCtion {form}") def set_wgen_voltage(self, voltage= 1): + "in V , possible 1mv" self.dev(f":WGEN:VOLTage {voltage}") def set_wgen_high(self, voltage_high= 1): @@ -335,76 +605,53 @@ def set_wgen_high(self, voltage_low= 0): self.dev(f":WGEN:VOLTage:LOW {voltage_low}") - -##################################################################################################### ##################################################################################################### ##################################################################################################### -##################################################################################################### - # Not Sure we will use the png option - def get_screenshot(self, verbose=False): - pass - # if verbose: - # print('Downloading screen image...') - - # self.dev.write('SAVE:IMAG:FILEF PNG') - # self.dev.write('HARDCOPY START') - # return self.dev.read_raw(None) - - def save_screenshot(self, filepath, verbose=False): - pass - # if verbose: - # print('Saving screen image...') - # data = self.get_screenshot() - # with open(filepath, 'wb') as f: - # f.write(data) - - - ## uncomment to test if __name__ == '__main__': scope = KeysightScope(addr='USB?*::INSTR', timeout=5) - - - # Works perfect - def transition_to_manual(): - - channels = scope.channels() - data_dict = {} # Create Dict chanel - data - vals = {} - wtype = [('t', 'float')] - print('Downloading...') - - for ch, enabled in channels.items(): - if enabled: - data_dict[ch], t, vals[ch] = scope.waveform( - ch, - int16= False # THis was : self.scope_params.get('int16', False), - ) - wtype.append((ch, 'float')) - - # Collect all data in a structured array - data = np.empty(len(t), dtype=wtype) - data['t'] = t - for ch in vals: - data[ch] = vals[ch] - print(data) - - def transition_to_buffered(): - scope.unlock() - scope.write(':ACQuire:TYPE AVERage') - scope.set_acquire_state(True) - return {} + print(scope.trigger_source) + + + # # Works perfect + # def transition_to_manual(): + + # channels = scope.channels() + # data_dict = {} # Create Dict chanel - data + # vals = {} + # wtype = [('t', 'float')] + # print('Downloading...') + + # for ch, enabled in channels.items(): + # if enabled: + # data_dict[ch], t, vals[ch] = scope.waveform( + # ch, + # int16= False # THis was : self.scope_params.get('int16', False), + # ) + # wtype.append((ch, 'float')) + + # # Collect all data in a structured array + # data = np.empty(len(t), dtype=wtype) + # data['t'] = t + # for ch in vals: + # data[ch] = vals[ch] + # print(data) + + # def transition_to_buffered(): + # scope.unlock() + # scope.write(':ACQuire:TYPE AVERage') + # scope.set_acquire_state(True) + # return {} - transition_to_manual() + # transition_to_manual() #transition_to_buffered() - # to improve first connection # manufacturer, model, sn, revision = self.scope.idn.split(',') # #assert manufacturer.lower() == 'tektronix' diff --git a/labscript_devices/KeysightScope/README.md b/labscript_devices/KeysightScope/README.md new file mode 100644 index 00000000..f7834da8 --- /dev/null +++ b/labscript_devices/KeysightScope/README.md @@ -0,0 +1,27 @@ +Implementation + + +# ------------------------- To Add a new Device +currenlty 19.02.2025 +to add a new device you need to: +1. copy this folder +2. add a new sheet for the osci as shown in the folder +3. change the description in the files KeysightScope and labscript_devices + + +# ------------------------- In the connection table file + +# Methode 1 : Triggering on the channels +KeysightScope(name="Keysight", parentless=True, description="important description") + + +# Methode 2: Triggering on the external trigger +KeysightScope(name="Keysight", parent_device=p00, description="important description") + + + + # ------------------------- In the experimental file + For Methode 1 : No Need for change + +For Methode 2 : You need to manually request the trigger by going high +In our case -> p00.go_high(t) \ No newline at end of file diff --git a/labscript_devices/KeysightScope/blacs_workers.py b/labscript_devices/KeysightScope/blacs_workers.py index d072cb65..78969d95 100644 --- a/labscript_devices/KeysightScope/blacs_workers.py +++ b/labscript_devices/KeysightScope/blacs_workers.py @@ -7,6 +7,8 @@ from blacs.tab_base_classes import Worker import labscript_utils.properties import matplotlib.pyplot as plt +from matplotlib import pyplot as plt +from labscript_devices.KeysightScope.connection_manager import * BLUE = '#66D9EF' PURPLE = '#AE81FF' @@ -14,65 +16,37 @@ GREY = '#75715E' class KeysightScopeWorker(Worker): + """ + Defines the software control interface to the hardware. + The BLACS_tab spawns a process that uses this class to send and receive commands with the hardware. + """ def init(self): - # we migrate osci related functions to a separate class global KeysightScope from .KeysightScope import KeysightScope self.scope = KeysightScope() # Buffered/ Manuel relevant flags self.buffered_mode = False - self.acquired_data = None - self.h5_file = None - - # (FUTUR) Goal: continuous data aquisation, Example: NI_DAQmxAcquisitionWorker(Worker): - self.buffered_chans = None - self.buffered_rate = None - + self.acquired_data = None + self.h5file = None def transition_to_buffered( self, device_name, h5file, front_panel_values, refresh): - self.logger.debug('transition_to_buffered') + rich_print(f"====== transition to Buffered: ======", color=BLUE) # os.path.basename(self.h5file) + self.scope.single() self.h5file = h5file self.device_name = device_name - # Store the initial values in case we have to abort and restore them: - self.initial_values = front_panel_values - - # Store the final values to for use during transition_to_static: - self.final_values = {} - # Store some parameters for saving data later - self.h5_file = h5file # We'll need this in transition_to_manual - self.device_name = device_name - - + # These two are not used yet + self.initial_values = front_panel_values # Store the initial values in case we have to abort and restore them: + self.final_values = {} # Store the final values to for use during transition_to_static: - with h5py.File(h5file, 'r') as hdf5_file: - self.scope_params = labscript_utils.properties.get( - hdf5_file, device_name, 'device_properties' - ) - - self.scope.dev.timeout = 1000 * self.scope_params.get('timeout', 5) # This line -- Why ? - # Locking the front Buttons of the osci during buffered mode - #self.scope.lock() - - # Run : True // Stop: : False - #self.scope.set_acquire_state(True) - - #self.scope.query(":TRIGger:SWEep NORMal") - #self.scope.query(':TRIGger:LEVel:HIGH 1,CHANnel 1') - self.scope.query(":TRIGger:MODE EDGE") - self.scope.query(":TRIGger:EDGE:LEVel 1") - self.scope.query(":TIMebase:SCALe 5e-8") - - #self.scope.single() - # TODO: Make per-shot acquisition parameters and channels configurable here - - # Unlocking the front Buttons of the osci after buffered mode - #self.scope.unlock() + with h5py.File(h5file, 'r') as hdf5file: + # Dictionary of properties + self.scope_params = labscript_utils.properties.get(hdf5file, device_name, 'device_properties') self.buffered_mode = True # confirm that we buffered return {} @@ -84,8 +58,7 @@ def transition_to_manual(self, abort = False): Returns: bool: `True` if transition to manual is successful. """ - self.logger.debug('Transition_to_manual Keysight') - rich_print(f"====== transition_to_manual Keysight: {os.path.basename(self.h5file)} ======", color=GREEN) + rich_print(f"====== transition to manual: ======", color=GREEN) if not self.buffered_mode: # In case we didnt take a shot return True @@ -93,38 +66,35 @@ def transition_to_manual(self, abort = False): if abort: # If we aborted we dont want an acquisation self.acquired_data = None - self.h5_file = None + self.h5file = None return True - channels = self.scope.channels() data_dict = {} # Create Dict channel - data vals = {} wtype = [('t', 'float')] - for ch, enabled in channels.items(): if enabled: - data_dict[ch], t, vals[ch] = self.scope.waveform( - ch, - int16= False - ) + data_dict[ch], t, vals[ch] = self.scope.waveform(ch) wtype.append((ch, 'float')) # Collect all data in a structured array data = np.empty(len(t), dtype=wtype) - data['t'] = t + data['t'] = t for ch in vals: - data[ch] = vals[ch] - - print(data) + data[ch] = vals[ch] + # plt.xlabel('Time in s') + # plt.ylabel('Voltage(2V)') + # plt.plot(data['t'],vals[ch]) + # plt.show() - # Open the file after download so as not to hog the file lock + # The Blacs worker of the Ni-CArd is responsible for creating the h5file for a shot ( From what i understood , can be wrong ) with h5py.File(self.h5file, 'r+') as hdf_file: # r+ : Read/write, file must exist grp = hdf_file.create_group('/data/traces') - print('Saving traces...') - dset = grp.create_dataset(self.device_name, data=data) - dset.attrs.update(data_dict[ch]) # This saves the preamble of the waveform + dset = grp.create_dataset(f"{self.device_name } {self.scope.description}" , data=data) + dset.attrs.update(self.scope.osci_capabilities) + #dset.attrs.update(data_dict[ch]) # This saves the preamble of the waveform print('Saving Done!') return True diff --git a/labscript_devices/KeysightScope/connection_manager.py b/labscript_devices/KeysightScope/connection_manager.py new file mode 100644 index 00000000..4e388bab --- /dev/null +++ b/labscript_devices/KeysightScope/connection_manager.py @@ -0,0 +1,117 @@ +import os +import importlib.util +import pyvisa +from re import sub + +if __name__ =="__main__": + import models +else : + import labscript_devices.KeysightScope.models as models + + +def get_address_from_description(description): + # List to store the imported dictionaries + osci_shot_configuration = [] + osci_capabilities = [] + + # List of decives detected by pyvisa + rm = pyvisa.ResourceManager() + devs = rm.list_resources() + + # Loop through all modules in the models package + for filename in os.listdir(models.__path__[0]): + # Check if the file starts with "Keysight" and is a .py file + if filename.startswith("Keysight") and filename.endswith(".py"): + # Construct the module name (without the .py extension) + module_name = filename[:-3] + + # Dynamically import the module from the models package + if __name__ =="__main__": + module = importlib.import_module(f"models.{module_name}") + else : module = importlib.import_module(f"labscript_devices.KeysightScope.models.{module_name}") + + # Try to access the dictionaries if they exist in the module + if hasattr(module, 'osci_shot_configuration'): + osci_shot_configuration = module.osci_shot_configuration + + if hasattr(module, 'osci_capabilities'): + osci_capabilities = module.osci_capabilities + + if description == osci_shot_configuration["description"]: + for idx, item in enumerate(devs): + try: + scope = rm.open_resource(devs[idx], timeout=200) + scope_serial_number = sub(r'\s+', '', scope.query(":SERial?")) + if scope_serial_number == osci_capabilities['serial_number']: + return item + except: + continue + + +def get_configuration_from_description(description): + # List to store the imported dictionaries + osci_shot_configuration = [] + osci_capabilities = [] + # Loop through all modules in the models package + for filename in os.listdir(models.__path__[0]): + # Check if the file starts with "Keysight" and is a .py file + if filename.startswith("Keysight") and filename.endswith(".py"): + # Construct the module name (without the .py extension) + module_name = filename[:-3] + + # Dynamically import the module from the models package + if __name__ =="__main__": + module = importlib.import_module(f"models.{module_name}") + else : module = importlib.import_module(f"labscript_devices.KeysightScope.models.{module_name}") + + # Try to access the dictionaries if they exist in the module + if hasattr(module, 'osci_shot_configuration'): + osci_shot_configuration = module.osci_shot_configuration + + if hasattr(module, 'osci_capabilities'): + osci_capabilities = module.osci_capabilities + + if description == osci_shot_configuration["description"]: + return osci_shot_configuration + + +def get_capabilities_from_description(description): + # Loop through all modules in the models package + for filename in os.listdir(models.__path__[0]): + # Check if the file starts with "Keysight" and is a .py file + if filename.startswith("Keysight") and filename.endswith(".py"): + # Construct the module name (without the .py extension) + module_name = filename[:-3] + + # Dynamically import the module from the models package + if __name__ =="__main__": + module = importlib.import_module(f"models.{module_name}") + else : module = importlib.import_module(f"labscript_devices.KeysightScope.models.{module_name}") + + # Try to access the dictionaries if they exist in the module + if hasattr(module, 'osci_shot_configuration'): + osci_shot_configuration = module.osci_shot_configuration + + if hasattr(module, 'osci_capabilities'): + osci_capabilities = module.osci_capabilities + + if description == osci_shot_configuration["description"]: + return osci_capabilities + + + + + +# ----------------------------------- tests +if __name__ == "__main__": + + # # get_address_from_description + # adrr = get_address_from_description('Example Osci') + # rm = pyvisa.ResourceManager() + # devs = rm.list_resources() + # scope = rm.open_resource(adrr) + # print(scope.query("*IDN?")) + + print(get_capabilities_from_description('Example Osci')) + print(get_configuration_from_description('Example Osci')) + diff --git a/labscript_devices/KeysightScope/labscript_devices.py b/labscript_devices/KeysightScope/labscript_devices.py index d01f9b0a..31eb277d 100644 --- a/labscript_devices/KeysightScope/labscript_devices.py +++ b/labscript_devices/KeysightScope/labscript_devices.py @@ -1,44 +1,121 @@ -from labscript import Device, LabscriptError, set_passed_properties ,LabscriptError, AnalogIn +from labscript import TriggerableDevice, LabscriptError, set_passed_properties ,LabscriptError, AnalogIn +#from labscript_devices.KeysightScope.models.Keysight_dsox1202g import osci_capabilities, osci_shot_configuration +from labscript_devices.KeysightScope.connection_manager import * +# -------------------- Change me +description = "Example Osci" +# ------------------------------ -class KeysightScope(Device): - """A labscript_device for Keysight oscilloscopes (DSOX1202G) using a visa interface. +adress = get_address_from_description(description) +osci_capabilities = get_capabilities_from_description(description) +osci_shot_configuration = get_configuration_from_description(description) +connection_table_properties = list(osci_capabilities.keys()) +device_properties = list(osci_shot_configuration.keys()) + + +class KeysightScope(TriggerableDevice): + """ + Defines the interface between + the labscript API and generates hardware instructions that can be saved to the shot h5 file. + A labscript_device for Keysight oscilloscopes (DSOX1202G) using a visa interface. - connection_table_properties (set once) - device_properties (set per shot) - * timeout : in seconds for response to queries over visa interface - * int16 : download waveform pts as 16 bit integers """ - description = 'Keysight' - #allowed_children = [ScopeChannel] - - @set_passed_properties( property_names = { - 'device_properties': ['timeout', 'int16'] + 'device_properties': device_properties } ) - def __init__(self, name, addr, - timeout=5, int16=False, + def __init__(self, + name, + parent_device, + description, **kwargs): - Device.__init__(self, name, None, addr, **kwargs) + TriggerableDevice.__init__(self, name, parent_device, "trigger", **kwargs) # parentless=False self.name = name - self.BLACS_connection = addr - self.acquisitions = [] # already defined in the class ÁnalogIn + self.description = description + self.BLACS_connection = get_address_from_description(self.description) + + osci_capabilities = get_capabilities_from_description(self.description) + osci_shot_configuration = get_configuration_from_description(self.description) + #set_passed_properties(property_names={"device_properties": list(osci_shot_configuration.keys())})(self) # maybe this way + + # --------------------------------- Device properties + for key,value in osci_capabilities.items(): + setattr(self,key,value) + # --------------------------------- Shot configurations + for key, value in osci_shot_configuration.items(): + setattr(self, key, value) + + # Device can only be triggered zero or one time + self.triggered = False + + + def trigger_at(self, t, duration ): + if self.triggered: + raise LabscriptError("Cannot trigger Keysight Oscilloscope twice") + self.triggered = True + self.trigger(t, duration) + + + def generate_code(self, hdf5_file, *args): + TriggerableDevice.generate_code(self, hdf5_file) + + +# Another Methode for adding prop +""" + Another way + # 1 in class KeysightScope(TriggerableDevice): we passed the args with the init values + init + acquisation_rate=10e6, + max_amplitude = 5, + v_div = 2, + t_div=1e-3, + + # 2 of cource then + self.acquisation_rate = acquisation_rate + self.max_amplitude = max_amplitude + self.t_div = t_div + self.v_div = v_div + + oder so + def set_parameters(self, + acquisation_rate=None, + max_amplitude=None, + t_div=None, + v_div=None): + + if acquisation_rate is not None: + self.acquisation_rate = acquisation_rate + if max_amplitude is not None: + self.max_amplitude = max_amplitude + if v_div is not None: + self.v_div = v_div + if t_div is not None: + self.t_div = t_div + + # Last in generate code + group = self.init_device_group(hdf5_file) + + # Setup device properties + group.attrs["triggered"] = self.triggered + group.attrs["acquisation_rate"] = self.acquisation_rate + + # trigger types + group.attrs["max_amplitude"] = self.max_amplitude + group.attrs["t_div"] = self.t_div + group.attrs["v_div"] = self.v_div + +""" + + + - # ----------------------------------------------- TO DOs - def _check_AI_not_too_fast(self, AI_table): # TO DO - pass - def _make_analog_input_table(self, inputs): # TO DO - pass - def generate_code(self, hdf5_file, *args): # To improve - # group = self.init_device_name(hdf5_file) - Device.generate_code(self, hdf5_file) - # save self.acquisitions in hdf5 diff --git a/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py b/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py new file mode 100644 index 00000000..1ac03456 --- /dev/null +++ b/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py @@ -0,0 +1,91 @@ +""" +Keysight DSOX1202G +Two types of properties: + * Osci specific properties + * Shot-specific configurations + +""" + +# ----------------------------------- Keysight DSOX1202G +osci_shot_configuration = { + "description" : "Example Osci", + + # Channel unrelated + "trigger_source" : "CHANnel1", # CHANnel1, CHANnel2 , EXTernal , LINE , WGEN + "trigger_level" : "0.5", # + "trigger_level_unit" : "V", # V or mV + "trigger_type" : "EDGE", # + "trigger_edge_slope" : "POSitive", # Only for trigger type is Edge + + "triggered" : False, # Flag to keep track of triggers (TO DO) + + "acquire_type" : "NORMal", # NORMal , AVERage , HRESolution , PEAK (TO DO HRESOLUTION and PEAK) + "acquire_count" : "8", # AVERage=2-65536 ,HRESolution=1 ,NORMal=8 , PEAK=None + + "waveform_format" : "WORD", # WORD , BYTE # WORD doesnt work + + "time_reference" : "LEFT", # LEFT , CENT , RIGH + "time_division" : "50", # + "time_division_unit" : "us", # s, ms , us , ns + "time_delay" : "0", # + "time_delay_unit" : "us", # s, ms , us , ns + + "timeout" : "5", # In seconds + + + # Channel related + # ------------------------ Channel 1 + "channel_display_1" : "1", # 1 ON , 0 = OFF + + "voltage_division_1" : "1", # + "voltage_division_unit_1" : "V", # V or mV + "voltage_offset_1" : "0", # + "voltage_offset_unit_1" : "V", # V or mV + "probe_attenuation_1" : "1", # + + # ------------------------ Channel 2 + "channel_display_2" : "0", # 0,1,2 or 3 = 3+1 + + "voltage_division_2" : "2", # + "voltage_division_unit_2" : "V", # V or mV + "voltage_offset_2" : "0", # + "voltage_offset_unit_2" : "V", # V or mV + "probe_attenuation_2" : "1" # + +} + + +# ----------------------------------- Keysight DSOX1202G +osci_capabilities = { + "serial_number" : "CN61364200", + "band_width" : 70e6, # 70 MHz + "sampling_rate" : 2*10e9, # 2GSa/s + "max_memory" : 1e6, # 1Mpts + "max_update_rate" : 5e4 # 50,000 waveforms/second update rate. +} + + + +# ----------------------------------- Tests +if __name__ == "__main__": + class Osci: + def __init__(self, + osci_capabilities, + osci_shot_configuration): + + for key, value in osci_capabilities.items(): + setattr(self, key, value) + + for key, value in osci_shot_configuration.items(): + setattr(self, key, value) + + + spec = Osci( + osci_capabilities = osci_capabilities, + osci_shot_configuration = osci_shot_configuration) + + print(spec.sampling_rate) + print(spec.timeout) + + + diff --git a/labscript_devices/KeysightScope/models/example_to_copy.py b/labscript_devices/KeysightScope/models/example_to_copy.py new file mode 100644 index 00000000..12c2f1a2 --- /dev/null +++ b/labscript_devices/KeysightScope/models/example_to_copy.py @@ -0,0 +1,89 @@ +""" +1. File name has to start with Keysight +2. File must contain two dictionnaries with the following names + - osci_shot_configuration + - osci_capabilities + + This example was written for Keysight DSOX1202G +""" + +# ----------------------------------- Keysight DSOX1202G +osci_shot_configuration = { + "description" : "Example Osci", + + # Channel unrelated + "trigger_source" : "CHANnel1", # CHANnel1, CHANnel2 , EXTernal , LINE , WGEN + "trigger_level" : "0.5", # + "trigger_level_unit" : "V", # V or mV + "trigger_type" : "EDGE", # + "trigger_edge_slope" : "POSitive", # Only for trigger type is Edge + + "triggered" : False, # Flag to keep track of triggers (TO DO) + + "acquire_type" : "NORMal", # NORMal , AVERage , HRESolution , PEAK (TO DO HRESOLUTION and PEAK) + "acquire_count" : "8", # AVERage=2-65536 ,HRESolution=1 ,NORMal=8 , PEAK=None + + "waveform_format" : "WORD", # WORD , BYTE # WORD doesnt work + + "time_reference" : "LEFT", # LEFT , CENT , RIGH + "time_division" : "50", # + "time_division_unit" : "us", # s, ms , us , ns + "time_delay" : "0", # + "time_delay_unit" : "us", # s, ms , us , ns + + "timeout" : "5", # In seconds + + # Channel related + # ------------------------ Channel 1 + "channel_display_1" : "1", # 1 ON , 0 = OFF + + "voltage_division_1" : "1", # + "voltage_division_unit_1" : "V", # V or mV + "voltage_offset_1" : "0", # + "voltage_offset_unit_1" : "V", # V or mV + "probe_attenuation_1" : "1", # + + # ------------------------ Channel 2 + "channel_display_2" : "0", # 0,1,2 or 3 = 3+1 + + "voltage_division_2" : "2", # + "voltage_division_unit_2" : "V", # V or mV + "voltage_offset_2" : "0", # + "voltage_offset_unit_2" : "V", # V or mV + "probe_attenuation_2" : "1" # +} + +# ----------------------------------- Keysight DSOX1202G +osci_capabilities = { + "serial_number" : "CN61364200", + "band_width" : 70e6, # 70 MHz + "sampling_rate" : 2*10e9, # 2GSa/s + "max_memory" : 1e6, # 1Mpts + "max_update_rate" : 5e4 # 50,000 waveforms/second update rate. +} + + + +# ----------------------------------- Tests +if __name__ == "__main__": + class Osci: + def __init__(self, + osci_capabilities, + osci_shot_configuration): + + for key, value in osci_capabilities.items(): + setattr(self, key, value) + + for key, value in osci_shot_configuration.items(): + setattr(self, key, value) + + + spec = Osci( + osci_capabilities = osci_capabilities, + osci_shot_configuration = osci_shot_configuration) + + print(spec.sampling_rate) + print(spec.timeout) + + + diff --git a/labscript_devices/KeysightScope/playground.py b/labscript_devices/KeysightScope/playground.py deleted file mode 100644 index c153e98e..00000000 --- a/labscript_devices/KeysightScope/playground.py +++ /dev/null @@ -1,18 +0,0 @@ - - -class A: - def a(self): - self.aa = 11 - -class B(A): - def a(self): - self.bb=2 - - -var =B() -var.a() -print(var.aa) - - -aaa = [B] - From 9bef6a1c8c28b00bbe3b1ad1becb5366f51123e9 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Fri, 7 Mar 2025 17:29:53 +0100 Subject: [PATCH 05/20] working implementation --- .../KeysightScope/KeysightScope.py | 327 +++++++----- labscript_devices/KeysightScope/README.md | 96 +++- .../VISA => KeysightScope}/STBstatus.ui | 16 +- labscript_devices/KeysightScope/blacs_tabs.py | 120 +++-- .../KeysightScope/blacs_workers.py | 117 +++-- .../KeysightScope/connection_manager.py | 261 ++++++---- .../KeysightScope/labscript_devices.py | 89 +--- .../models/Keysight_dsox1202g.py | 21 +- .../models/default_properties.py | 78 +++ .../KeysightScope/models/example_to_copy.py | 9 +- .../KeysightDCSupply/__init__.py | 13 - .../KeysightDCSupply/blacs_tab.py | 71 --- .../KeysightDCSupply/blacs_worker.py | 172 ------ .../KeysightDCSupply/labscript_device.py | 154 ------ .../KeysightDCSupply/register_classes.py | 18 - .../KeysightXSeries/__init__.py | 13 - .../KeysightXSeries/blacs_tab.py | 38 -- .../KeysightXSeries/blacs_worker.py | 282 ---------- .../KeysightXSeries/labscript_device.py | 112 ---- .../KeysightXSeries/register_classes.py | 18 - .../naqslab_devices/NovaTechDDS/__init__.py | 24 - .../naqslab_devices/NovaTechDDS/blacs_tab.py | 157 ------ .../NovaTechDDS/blacs_worker.py | 453 ---------------- .../NovaTechDDS/labscript_device.py | 492 ------------------ .../NovaTechDDS/register_classes.py | 30 -- .../NovaTechDDS/runviewer_parser.py | 85 --- .../PulseBlasterESRPro300/__init__.py | 12 - .../PulseBlasterESRPro300/blacs_tab.py | 32 -- .../PulseBlasterESRPro300/blacs_worker.py | 31 -- .../PulseBlasterESRPro300/labscript_device.py | 33 -- .../PulseBlasterESRPro300/register_classes.py | 13 - .../PulseBlasterESRPro300/runviewer_parser.py | 28 - .../PulseBlaster_No_DDS_200/__init__.py | 8 - .../PulseBlaster_No_DDS_200/blacs_tab.py | 20 - .../PulseBlaster_No_DDS_200/blacs_worker.py | 18 - .../labscript_device.py | 27 - .../register_classes.py | 13 - .../runviewer_parser.py | 16 - labscript_devices/naqslab_devices/README.md | 235 --------- .../naqslab_devices/SR865/__init__.py | 17 - .../naqslab_devices/SR865/blacs_tab.py | 88 ---- .../naqslab_devices/SR865/blacs_worker.py | 136 ----- .../naqslab_devices/SR865/labscript_device.py | 107 ---- .../naqslab_devices/SR865/register_classes.py | 18 - .../SignalGenerator/BLACS/HP_8642A.py | 94 ---- .../SignalGenerator/BLACS/HP_8643A.py | 91 ---- .../SignalGenerator/BLACS/HP_8648.py | 115 ---- .../SignalGenerator/BLACS/KeysightSigGens.py | 123 ----- .../SignalGenerator/BLACS/RS_SMA100B.py | 70 --- .../SignalGenerator/BLACS/RS_SMF100A.py | 68 --- .../SignalGenerator/BLACS/RS_SMHU.py | 101 ---- .../SignalGenerator/BLACS/__init__.py | 13 - .../naqslab_devices/SignalGenerator/Models.py | 113 ---- .../SignalGenerator/__init__.py | 22 - .../SignalGenerator/blacs_tab.py | 70 --- .../SignalGenerator/blacs_worker.py | 225 -------- .../SignalGenerator/labscript_device.py | 133 ----- .../SignalGenerator/register_classes.py | 65 --- .../naqslab_devices/TektronixTDS/__init__.py | 17 - .../naqslab_devices/TektronixTDS/blacs_tab.py | 40 -- .../TektronixTDS/blacs_worker.py | 105 ---- .../TektronixTDS/labscript_device.py | 64 --- .../TektronixTDS/register_classes.py | 18 - .../naqslab_devices/VISA/__init__.py | 18 - .../naqslab_devices/VISA/blacs_tab.py | 109 ---- .../naqslab_devices/VISA/blacs_worker.py | 127 ----- .../naqslab_devices/VISA/labscript_device.py | 47 -- .../naqslab_devices/VISA/register_classes.py | 23 - .../naqslab_devices/VISA/tests.py | 0 labscript_devices/naqslab_devices/__init__.py | 146 ------ .../naqslab_devices/doc/KeysightDCSupply.rst | 21 - .../naqslab_devices/doc/KeysightXSeries.rst | 11 - .../naqslab_devices/doc/Makefile | 26 - .../naqslab_devices/doc/NovaTechDDS.rst | 11 - .../doc/PulseBlasterESRPro300.rst | 10 - .../doc/PulseBlaster_No_DDS_200.rst | 10 - .../naqslab_devices/doc/SR865.rst | 11 - .../naqslab_devices/doc/SignalGenerator.rst | 116 ----- .../naqslab_devices/doc/TektronixTDS.rst | 9 - .../naqslab_devices/doc/VISA.rst | 11 - .../doc/_build/latex/naqslab_devices.pdf | Bin 1411612 -> 0 bytes .../doc/_inv/pyvisa-objects.inv | Bin 6530 -> 0 bytes .../doc/_inv/sphinx-objects.inv | Bin 11632 -> 0 bytes .../doc/_templates/package.rst_t | 53 -- labscript_devices/naqslab_devices/doc/conf.py | 162 ------ .../naqslab_devices/doc/devices.rst | 29 -- .../naqslab_devices/doc/doc_build.rst | 65 --- .../naqslab_devices/doc/index.rst | 36 -- .../naqslab_devices/doc/make.bat | 45 -- .../naqslab_devices/doc/primitives.rst | 25 - .../naqslab_devices/doc/usage.rst | 25 - 91 files changed, 720 insertions(+), 6091 deletions(-) rename labscript_devices/{naqslab_devices/VISA => KeysightScope}/STBstatus.ui (97%) create mode 100644 labscript_devices/KeysightScope/models/default_properties.py delete mode 100644 labscript_devices/naqslab_devices/KeysightDCSupply/__init__.py delete mode 100644 labscript_devices/naqslab_devices/KeysightDCSupply/blacs_tab.py delete mode 100644 labscript_devices/naqslab_devices/KeysightDCSupply/blacs_worker.py delete mode 100644 labscript_devices/naqslab_devices/KeysightDCSupply/labscript_device.py delete mode 100644 labscript_devices/naqslab_devices/KeysightDCSupply/register_classes.py delete mode 100644 labscript_devices/naqslab_devices/KeysightXSeries/__init__.py delete mode 100644 labscript_devices/naqslab_devices/KeysightXSeries/blacs_tab.py delete mode 100644 labscript_devices/naqslab_devices/KeysightXSeries/blacs_worker.py delete mode 100644 labscript_devices/naqslab_devices/KeysightXSeries/labscript_device.py delete mode 100644 labscript_devices/naqslab_devices/KeysightXSeries/register_classes.py delete mode 100644 labscript_devices/naqslab_devices/NovaTechDDS/__init__.py delete mode 100644 labscript_devices/naqslab_devices/NovaTechDDS/blacs_tab.py delete mode 100644 labscript_devices/naqslab_devices/NovaTechDDS/blacs_worker.py delete mode 100644 labscript_devices/naqslab_devices/NovaTechDDS/labscript_device.py delete mode 100644 labscript_devices/naqslab_devices/NovaTechDDS/register_classes.py delete mode 100644 labscript_devices/naqslab_devices/NovaTechDDS/runviewer_parser.py delete mode 100644 labscript_devices/naqslab_devices/PulseBlasterESRPro300/__init__.py delete mode 100644 labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_tab.py delete mode 100644 labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_worker.py delete mode 100644 labscript_devices/naqslab_devices/PulseBlasterESRPro300/labscript_device.py delete mode 100644 labscript_devices/naqslab_devices/PulseBlasterESRPro300/register_classes.py delete mode 100644 labscript_devices/naqslab_devices/PulseBlasterESRPro300/runviewer_parser.py delete mode 100644 labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/__init__.py delete mode 100644 labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_tab.py delete mode 100644 labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_worker.py delete mode 100644 labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/labscript_device.py delete mode 100644 labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/register_classes.py delete mode 100644 labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/runviewer_parser.py delete mode 100644 labscript_devices/naqslab_devices/README.md delete mode 100644 labscript_devices/naqslab_devices/SR865/__init__.py delete mode 100644 labscript_devices/naqslab_devices/SR865/blacs_tab.py delete mode 100644 labscript_devices/naqslab_devices/SR865/blacs_worker.py delete mode 100644 labscript_devices/naqslab_devices/SR865/labscript_device.py delete mode 100644 labscript_devices/naqslab_devices/SR865/register_classes.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8642A.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8643A.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8648.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/KeysightSigGens.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMA100B.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMF100A.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMHU.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/BLACS/__init__.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/Models.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/__init__.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/blacs_tab.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/blacs_worker.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/labscript_device.py delete mode 100644 labscript_devices/naqslab_devices/SignalGenerator/register_classes.py delete mode 100644 labscript_devices/naqslab_devices/TektronixTDS/__init__.py delete mode 100644 labscript_devices/naqslab_devices/TektronixTDS/blacs_tab.py delete mode 100644 labscript_devices/naqslab_devices/TektronixTDS/blacs_worker.py delete mode 100644 labscript_devices/naqslab_devices/TektronixTDS/labscript_device.py delete mode 100644 labscript_devices/naqslab_devices/TektronixTDS/register_classes.py delete mode 100644 labscript_devices/naqslab_devices/VISA/__init__.py delete mode 100644 labscript_devices/naqslab_devices/VISA/blacs_tab.py delete mode 100644 labscript_devices/naqslab_devices/VISA/blacs_worker.py delete mode 100644 labscript_devices/naqslab_devices/VISA/labscript_device.py delete mode 100644 labscript_devices/naqslab_devices/VISA/register_classes.py delete mode 100644 labscript_devices/naqslab_devices/VISA/tests.py delete mode 100644 labscript_devices/naqslab_devices/__init__.py delete mode 100644 labscript_devices/naqslab_devices/doc/KeysightDCSupply.rst delete mode 100644 labscript_devices/naqslab_devices/doc/KeysightXSeries.rst delete mode 100644 labscript_devices/naqslab_devices/doc/Makefile delete mode 100644 labscript_devices/naqslab_devices/doc/NovaTechDDS.rst delete mode 100644 labscript_devices/naqslab_devices/doc/PulseBlasterESRPro300.rst delete mode 100644 labscript_devices/naqslab_devices/doc/PulseBlaster_No_DDS_200.rst delete mode 100644 labscript_devices/naqslab_devices/doc/SR865.rst delete mode 100644 labscript_devices/naqslab_devices/doc/SignalGenerator.rst delete mode 100644 labscript_devices/naqslab_devices/doc/TektronixTDS.rst delete mode 100644 labscript_devices/naqslab_devices/doc/VISA.rst delete mode 100644 labscript_devices/naqslab_devices/doc/_build/latex/naqslab_devices.pdf delete mode 100644 labscript_devices/naqslab_devices/doc/_inv/pyvisa-objects.inv delete mode 100644 labscript_devices/naqslab_devices/doc/_inv/sphinx-objects.inv delete mode 100644 labscript_devices/naqslab_devices/doc/_templates/package.rst_t delete mode 100644 labscript_devices/naqslab_devices/doc/conf.py delete mode 100644 labscript_devices/naqslab_devices/doc/devices.rst delete mode 100644 labscript_devices/naqslab_devices/doc/doc_build.rst delete mode 100644 labscript_devices/naqslab_devices/doc/index.rst delete mode 100644 labscript_devices/naqslab_devices/doc/make.bat delete mode 100644 labscript_devices/naqslab_devices/doc/primitives.rst delete mode 100644 labscript_devices/naqslab_devices/doc/usage.rst diff --git a/labscript_devices/KeysightScope/KeysightScope.py b/labscript_devices/KeysightScope/KeysightScope.py index 4fb19822..ce0104a3 100644 --- a/labscript_devices/KeysightScope/KeysightScope.py +++ b/labscript_devices/KeysightScope/KeysightScope.py @@ -1,102 +1,88 @@ import pyvisa import numpy as np import time -#from keysight_dsox1202g import osci_capabilities, osci_shot_configuration from labscript.labscript import LabscriptError -#from labscript_devices.KeysightScope.models.Keysight_dsox1202g import osci_capabilities, osci_shot_configuration -from re import sub +from re import sub from labscript_devices.KeysightScope.connection_manager import * - -# -------------------- Change me description = "Example Osci" -# ------------------------------ - - -adress = get_address_from_description(description) -osci_capabilities = get_capabilities_from_description(description) -osci_shot_configuration = get_configuration_from_description(description) - - -unit_conversion = { - 's' : 1 , - 'ns': 1e-9, # nanoseconds to seconds - 'us': 1e-6, # microseconds to seconds - 'ms': 1e-3 # milliseconds to seconds - } """ Keysight Scopes Using the Oscilloscope requires 3 important steps * Initialsiation : which is setting up the osci for the desired measure - * Acquiring : the osci aquires the measurement and saves them in its memory + * Acquiring : the osci acquires the measurement and saves them in its memory * Analysing : after finishing the measurement, we can display or transfer the data to the Pc To Improve: ** PRIO - - Currently only data within the displayed time range is captured - - implement triggered bool - - implement second channel possi - - write docu and example + - what is the best time_range + - saving (dabei) + - segmented memory ? + - HResultion + - Keysight() KEysight in ct build + - over serial number + - set property + - other ni card ** NOT PRIO - - Implemente other aquiring modes - Peak HRESolution - Configuration possibility for other trigger types other then EDGE + + ** Ask Marcel + - Problem with DO , NiCard won't transtion to buffered + - subclasses marcel fragen , """ + class KeysightScope: - def __init__(self, - osci_capabilities=osci_capabilities , - osci_shot_configuration=osci_shot_configuration, - adress = adress + def __init__(self, + address, + verbose = False ): - self.verbose = False - self.osci_capabilities = osci_capabilities - - # --------------------------------- device capabilities - for key, value in osci_capabilities.items(): + # --------------------------------- Connecting to device + rm = pyvisa.ResourceManager() + self.dev = rm.open_resource(address) + print(f'Initialized: {self.dev.query("*IDN?")}') + + # --------------------------------- Get device capabilities & Shot configurations + cm = connectionManager(address=address) + self.osci_capabilities = cm.osci_capabilities # needed for the blacs worker + self.osci_shot_configuration = cm.osci_shot_configuration + self.verbose = verbose + + # --------------------------------- Device capabilities + for key, value in self.osci_capabilities.items(): setattr(self, key, value) # --------------------------------- Shot configurations - for key, value in osci_shot_configuration.items(): + for key, value in self.osci_shot_configuration.items(): setattr(self, key, value) - # --------------------------------- Connecting to device + # --------------------------------- Initialize device + self.reset_device() + self.dev.timeout = float(self.timeout)*1e3 - # Based on the serial number in osci_capabilities - # rm = pyvisa.ResourceManager() - # devs = rm.list_resources() - # for idx, item in enumerate(devs): - # try: - # scope = rm.open_resource(devs[idx], timeout=200) - # scopename = scope.query("*IDN?") - # scope_serial_number = sub(r'\s+', '', scope.query(":SERial?")) # To get rid of white spaces - # if scope_serial_number == self.serial_number: - # self.dev = scope - # print(f"Initialized: {scopename}") - # except: - # continue - rm = pyvisa.ResourceManager() - self.dev = rm.open_resource(adress) - scopename = self.dev.query("*IDN?") - print(f"Initialized: {scopename}") + ####################################################################################### + # The configuration function # + ####################################################################################### + def set_configuration(self, configuration : dict): + """ The purpose of this function is to configure the oscilloscope. + it will be called in transition to buffered in the blacs worker""" + # --------------------------------- Shot configurations + # By promoting the entries of the configuration dictionary to class attributs, + # we gain some flexibility later on + for key, value in configuration.items(): + setattr(self, key, value) - # --------------------------------- Initialize device - self.reset_device() - self.dev.timeout = float(self.timeout)*1e3 self.set_acquire_state(running=True) - - # set_waveform_format better in the beggining because some other configuration - # is influecing yincrement and yorigin, which yields wrong voltage values self.set_waveform_format(format=self.waveform_format) - - #self.set_trigger_source(source= self.trigger_source) - self.set_trigger_source(source="CHANnel1") + + self.set_trigger_source(source= self.trigger_source) self.set_trigger_level(level= self.trigger_level, unit=self.trigger_level_unit ) self.set_trigger_edge_slope(slope = self.trigger_edge_slope) @@ -113,15 +99,15 @@ def __init__(self, self.set_channel_display(channel="1",display=self.channel_display_1 ) self.set_voltage_division(division=self.voltage_division_1, unit= self.voltage_division_unit_1) self.set_voltage_offset(offset=self.voltage_offset_1, unit=self.voltage_offset_unit_1) - self.set_probe_attenuation(attenuation=self.probe_attenuation_1) + self.set_probe_attenuation(attenuation=self.probe_attenuation_1,channel=1) - # --- Channel 1 + # --- Channel 2 self.set_channel_display(channel="2",display=self.channel_display_2 ) - self.set_voltage_division(division=self.voltage_division_2, unit= self.voltage_division_unit_2) - self.set_voltage_offset(offset=self.voltage_offset_2, unit=self.voltage_offset_unit_2) - self.set_probe_attenuation(attenuation=self.probe_attenuation_2) + self.set_probe_attenuation(channel=2, attenuation=self.probe_attenuation_2) + self.set_voltage_division(channel=2, division=self.voltage_division_2, unit= self.voltage_division_unit_2) + self.set_voltage_offset(channel=2, offset=self.voltage_offset_2, unit=self.voltage_offset_unit_2) + - ####################################################################################### # Basic Commands # ####################################################################################### @@ -188,7 +174,7 @@ def set_date_time(self): # Setting Axes (Voltage & Time) # ####################################################################################### - # ----------------------------------------------- Voltage + # ----------------------------------------------- Set Voltage def set_voltage_range(self, range, channel=1, unit="V"): """ unit : V or mV """ if unit =="V": @@ -210,11 +196,29 @@ def set_voltage_offset(self,offset,channel=1,unit="V"): if self.verbose: print("Done voltage offset") - # ----------------------------------------------- Time + # ----------------------------------------------- Get Voltage + def get_voltage_range(self, channel=1): + """ + Retrieves the voltage range of the channel in volts (V). + + Returns: + str: The voltage range in volts (V). + """ + return self.dev.query(f":CHANnel{channel}:RANGe?") + + def get_voltage_division(self, channel=1): + """ Get Voltage division of channel in V. """ + return float(self.dev.query(f":CHANnel{channel}:SCALe?")) + + def get_voltage_offset(self,channel=1): + """ Get Voltage offset of channel in V. """ + return float(self.dev.query(f":CHANnel{channel}:OFFSet?")) + + # ----------------------------------------------- Set Time def set_time_range(self, range, unit): - """Set the time range for the oscilloscope. + """Set the time range of the oscilloscope. Args: - time_range: The time range value. (50ns - 500s) + time_range (str or float):: The time range value. (50ns - 500s) unit: The unit for the time range, 'ms', 'us', 'ns'. Raises: @@ -237,16 +241,16 @@ def set_time_range(self, range, unit): raise LabscriptError(f"Invalid time range or unit: {e}") # Send the command to the oscilloscope - self.dev.write(f":TIMebase:RANGe {range}") + self.dev.write(f":TIMebase:RANGe {converted_time_range}") def set_time_division(self,division,unit): - """Set the time division for the oscilloscope. + """ Set the time per division of the oscilloscope. Args: - time_division: The time division value. (min 5ns - max 50s) + time_division (str or float): The time division value. (min 5ns - max 50s) unit: The unit for the time division, 'ms', 'us', 'ns'. Raises: - LabscriptError: If the time division is outside the valid range or if the unit is invalid. + LabscriptError: If the time division is outside the valid division or if the unit is invalid. """ # Validate unit if unit not in unit_conversion: @@ -254,23 +258,23 @@ def set_time_division(self,division,unit): # Convert to seconds try: - converted_time_range = float(division) * unit_conversion[unit] + converted_time_division = float(division) * unit_conversion[unit] - # Check if the converted time range is within the allowed bounds - if not (5e-9 <= converted_time_range <= 50): + # Check if the converted time division is within the allowed bounds + if not (5e-9 <= converted_time_division <= 50): raise LabscriptError(f"Time division not supported. Valid division is between 50 ns and 500 s.") except Exception as e: raise LabscriptError(f"Invalid time division or unit: {e}") - self.dev.write(f":TIMebase:SCALe {converted_time_range}") + self.dev.write(f":TIMebase:SCALe {converted_time_division}") if self.verbose: print("Done time division") def set_time_delay(self,delay,unit="us"): - """Set the time delay. + """ Set the time delay. Args: - time_delay: The time delay value. + time_delay (str or foat): The time delay value. unit: The unit for the time delay, 'ms', 'us', 'ns'. Raises: @@ -301,6 +305,53 @@ def set_time_reference(self,reference = "CENTer"): self.dev.write(f":TIMebase:REFerence {reference}") if self.verbose: print("Done time reference") + + def set_time_mode(self,mode= "MAIN"): + """ Set the time mode of the oscilloscope. + Args: + mode (str): + - MAIN : This is the primary mode used in an oscilloscope, + delivering a real-time graph of voltage (Y-axis) versus time (X-axis). + + - WINDow : In the WINDow (zoomed or delayed) time base mode, + measurements are made in the zoomed time base if possible; otherwise, the + measurements are made in the main time base. + If chosen, we still need to set : position, Range, scale + (Not adequate for retrieving data.) + + - XY: The X-Y mode plots one voltage against another. + Therefore :TIMebase:RANGe, :TIMebase:POSition, and :TIMebase:REFerence commands are not available in this mode + + - Roll : Idea for low frequeny signals. In this mode, the waveform scrolls from right to left across the display + + """ + self.dev.write(f":TIMebase:MODE {mode}") + + # ----------------------------------------------- Get Time + def get_time_range(self): + """ Retrieves the global time range in s""" + return self.dev.query(":TIMebase:RANGe?") + + def get_time_division(self): + """ Retrieves the time division in s. """ + return self.dev.query(":TIMebase:SCALe?") + + def get_time_delay(self): + """ Retrieves the time delay in s. """ + return self.dev.query(":TIMebase:DELay?") + + def get_time_reference(self): + """ + Retrieves the time reference. + + Returns: + str: One of the following time reference positions: + - 'LEFT' + - 'CENTER' + - 'RIGHT' + """ + return self.dev.query(":TIMebase:REFerence?") + ####################################################################################### # Triggering # ####################################################################################### @@ -319,10 +370,6 @@ def get_trigger_event(self): # how to make use of this ? return int(self.dev.query(':TER?')) # ----------------------------------------------- Trigger Type - def get_trigger_type(self): - """Get the current trigger type.""" - return self.dev.query(":TRIGger:MODE?") - def set_trigger_type(self, type): """ valid types : EDGE, GLITch, PATTern, SHOLd, TRANsition, TV, SBUS1 """ valid_types = {"EDGE", "GLITch", "PATTern", "SHOLd", "TRANsition", "TV", "SBUS1"} @@ -332,11 +379,12 @@ def set_trigger_type(self, type): self.dev.write(f":TRIGger:MODE {type}") + def get_trigger_type(self): + """Get the current trigger type.""" + return self.dev.query(":TRIGger:MODE?") + # ----------------------------------------------- Trigger source - def get_trigger_source(self): - return self.dev.query(":TRIGger:SOURce?") - - def set_trigger_source(self, source = "EXTernal"): + def set_trigger_source(self, source): """ Valid source : CHANnel , EXTernal , LINE" , WGEN} with n = channel number @@ -348,14 +396,10 @@ def set_trigger_source(self, source = "EXTernal"): except Exception as e: raise LabscriptError("trigger_source: "+ e) + def get_trigger_source(self): + return self.dev.query(":TRIGger:SOURce?") + # ----------------------------------------------- Trigger Level - def get_trigger_level(self): - """Get the current trigger level.""" - if self.trigger_source == "EXTernal": - return self.dev.query(":EXTernal:LEVel?") - else: - return self.dev.query(":TRIGger:LEVel?") - def set_trigger_level(self, level,unit="V"): """ unit : V or mV """ assert unit in ["V","mV"], LabscriptError("unit must be V or mV") @@ -370,10 +414,18 @@ def set_trigger_level(self, level,unit="V"): if self.verbose: print("Done trigger level") + def get_trigger_level(self): + """Get the current trigger level.""" + if self.trigger_source == "EXTernal": + return self.dev.query(":EXTernal:LEVel?") + else: + return self.dev.query(":TRIGger:LEVel?") + # ----------------------------------------------- Trigger Edge slope def set_trigger_edge_slope(self,slope): """ - slope : POSitive, NEGative , EITHer , ALTernate + Args: + slope : POSitive, NEGative , EITHer , ALTernate """ if self.trigger_type != "EDGE": raise LabscriptError("Trigger type must be \"EDGE\" ") @@ -381,12 +433,19 @@ def set_trigger_edge_slope(self,slope): if self.verbose: print("Done trigger slope") + def get_trigger_edge_slope(self): + """ + Returns: + slope : POSitive, NEGative , EITHer , ALTernate + """ + return self.dev.query(":TRIGger:EDGE:SLOPe?") + ####################################################################################### # Channel Configurations # ####################################################################################### # ----------------------------------------------- Probe Attenuation - def set_probe_attenuation(self,attenuation, channel=1): + def set_probe_attenuation(self,attenuation, channel): """ Sets the probe attenuation factor for the selected channel. Allowed range: 0.1 - 10000 @@ -400,6 +459,9 @@ def set_probe_attenuation(self,attenuation, channel=1): except Exception as e: raise LabscriptError("Probe attenuation ration not in range 0.1 - 10000") + def get_probe_attenuation(self,channel): + return self.dev.query(f":CHANnel{channel}:PROBe?") + # ----------------------------------------------- Display a channel def set_channel_display(self,channel,display): """"display a channel @@ -409,13 +471,15 @@ def set_channel_display(self,channel,display): """ self.dev.write(f":CHANnel{channel}:DISPlay {display}") + def get_channel_display(self,channel): + return self.dev.query(f":CHANnel{channel}:DISPlay?") + # ----------------------------------------------- Displayed channels def channels(self, all=True): ''' Returns: dictionary {str supported channels : bool currently displayed } If "all" is False, only visible channels are returned ''' - # List with all Channels all_channels = self.dev.query(":MEASure:SOURce?").rstrip().split(",") @@ -432,6 +496,7 @@ def channels(self, all=True): if all or visible: vals[chan] = visible return vals + ####################################################################################### # Acquiring # ####################################################################################### @@ -474,6 +539,8 @@ def set_acquire_type(self,type="NORMal"): if self.verbose: print("Done acquire type") + def get_acquire_type(self): + return self.dev.query(":ACQuire:TYPE?") # ----------------------------------------------- Acquire count def set_acquire_count(self,count): ''' In averaging and Normal mode, specifies the number of values @@ -486,10 +553,18 @@ def set_acquire_count(self,count): if self.verbose: print("Done trigger count") + def get_acquire_count(self): + return self.dev.query(":ACQuire:COUNT?") # ----------------------------------------------- Acquire source def set_waveform_source(self,channel): - ''' Set the location of the data transferred by WAVeform ''' - self.dev.write(':WAVeform:SOURce ' + channel) + ''' Set the location of the data transferred by WAVeform + ARGS: + channel (str or int): the channel number + ''' + self.dev.write(f":WAVeform:SOURce {channel}") + + def get_waveform_source(self): + return self.dev.query(":WAVeform:SOURce?") ####################################################################################### # Reading # @@ -501,19 +576,16 @@ def set_waveform_format(self, format): WORD: formatted data transfers 16-bit data as two bytes. BYTE: formatted data is transferred as 8-bit bytes. ''' - if format == "WORD": + if format in ["WORD", "BYTE"]: self.dev.write(f":WAVeform:FORMat {format}") - #self.dev.write(':WAVeform:BYTeorder LSBFirst') # MSBF is default, must be overridden for WORD to work - self.datatype = "H" - if self.verbose: - print("Done Waveform Word") - - if format == "BYTE": - self.dev.write(f":WAVeform:FORMat {format}") - self.datatype = "B" + self.datatype = "H" if format == "WORD" else "B" + if self.verbose: - print("Done Waveform Byte") + print(f"Done Waveform {format}") + def get_waveform_format(self): + return self.dev.query(":WAVeform:FORMat?") + # ----------------------------------------------- Waveform Preample def get_preample_as_dict(self): """ @@ -546,6 +618,7 @@ def waveform(self, channel='CHANnel1'): """ # configure the data type transfer self.set_waveform_source(channel) + self.set_waveform_format(format=self.waveform_format) # transfer the data and format into a sequence of strings raw = self.dev.query_binary_values( @@ -555,8 +628,10 @@ def waveform(self, channel='CHANnel1'): container=np.array ) - # create a dictionary of the waveform preamble + # Create a dictionary of the waveform preamble wfmp = self.get_preample_as_dict() + # print(raw) + # print(wfmp) # (see Page 667 , Keysight manual for programmer ) n = np.arange(wfmp['points'] ) @@ -565,7 +640,6 @@ def waveform(self, channel='CHANnel1'): return wfmp, t, y - ####################################################################################### # Wave Generator # ####################################################################################### @@ -604,15 +678,15 @@ def set_wgen_high(self, voltage_low= 0): """ self.dev(f":WGEN:VOLTage:LOW {voltage_low}") - ##################################################################################################### ##################################################################################################### ## uncomment to test if __name__ == '__main__': + from models.Keysight_dsox1202g import osci_capabilities, osci_shot_configuration - scope = KeysightScope(addr='USB?*::INSTR', timeout=5) - print(scope.trigger_source) + # Testing on Keysigt + scope = KeysightScope() # to complete # # Works perfect @@ -658,4 +732,21 @@ def set_wgen_high(self, voltage_low= 0): # #"Device is made by {:s}, not by Tektronix, and is actually a {:s}".format( # # manufacturer, model # #) - # print('Connected to {} (SN: {})'.format(model, sn)) \ No newline at end of file + # print('Connected to {} (SN: {})'.format(model, sn)) + + + + # Old Code + # Based on the serial number in osci_capabilities + # rm = pyvisa.ResourceManager() + # devs = rm.list_resources() + # for idx, item in enumerate(devs): + # try: + # scope = rm.open_resource(devs[idx], timeout=200) + # scopename = scope.query("*IDN?") + # scope_serial_number = sub(r'\s+', '', scope.query(":SERial?")) # To get rid of white spaces + # if scope_serial_number == self.serial_number: + # self.dev = scope + # print(f"Initialized: {scopename}") + # except: + # continue \ No newline at end of file diff --git a/labscript_devices/KeysightScope/README.md b/labscript_devices/KeysightScope/README.md index f7834da8..5fc0efeb 100644 --- a/labscript_devices/KeysightScope/README.md +++ b/labscript_devices/KeysightScope/README.md @@ -1,27 +1,93 @@ -Implementation -# ------------------------- To Add a new Device -currenlty 19.02.2025 -to add a new device you need to: -1. copy this folder -2. add a new sheet for the osci as shown in the folder -3. change the description in the files KeysightScope and labscript_devices +# ------------------------- How to use the oscilloscope implementation ------------------------- + +# ------------------------- First settings +In the file Keysightscope/models/example_to_copy you can find a file containing two dictionaries: +* osci_shot_configuration : contains the configuration that the oscilloscope will use for every shot +* osci_capabilities : contains device specific capabilities -# ------------------------- In the connection table file +Copy-paste this file in the same folder and change it according to your goal. +------------------------- !!! Important !!! ------------------------- +1. The name of the new file must start with "Keysight", or the program will not detect it, +e.g. Keysightscope/models/Keysight_dsox1202g +2. Don't change the name of the dictionaries: osci_shot_configuration and osci_capabilities +3. In the dictionary osci_capabilities you can give any description to the osci. +The description will then be used across the program to interact with the osci -# Methode 1 : Triggering on the channels -KeysightScope(name="Keysight", parentless=True, description="important description") +# ------------------------- In the connection table file +There are two ways with which we can trigger the oscilloscope. -# Methode 2: Triggering on the external trigger -KeysightScope(name="Keysight", parent_device=p00, description="important description") +# Method 1 : Triggering on the channels +KeysightScope(name="Keysight", + parent_device = None, + parentless=True, + description="Example Osci") +* Advantages : We can trigger on AnalogOut devices +* Disadvantages : We can not manually trigger. +------------------------- !!! Important !!! ------------------------- +KeysightScope is a Triggerable device and accroding to Labscript we can use it parentless. +However, the Labscript code showed (class TriggerableDevice), that this is not true and we have to make some minor case handling before beeing able to use our scope as in methode 1. + +Following two changes are required to the class TriggerableDevice in the file labscript.labscript.labscript.py +You dont have to understand the code, just add the marked lines + +### First change +class TriggerableDevice(Device): + def __init__(...): + if None in [parent_device, connection] and not parentless: + raise LabscriptError('No parent specified. If this device does not require a parent, set parentless=True') + if isinstance(parent_device, Trigger): + if self.trigger_edge_type != parent_device.trigger_edge_type: + raise LabscriptError('Trigger edge type for %s is \'%s\', ' % (name, self.trigger_edge_type) + + 'but existing Trigger object %s ' % parent_device.name + + 'has edge type \'%s\'' % parent_device.trigger_edge_type) + self.trigger_device = parent_device + elif parent_device is not None: + # Instantiate a trigger object to be our parent: + self.trigger_device = Trigger(name + '_trigger', parent_device, connection, self.trigger_edge_type) + parent_device = self.trigger_device + connection = 'trigger' + elif parent_device is None: ######################### -> These two lines are new + self.trigger_device = parent_device ######################### -> Add the last two lines + +### second change +In the same class in the function do_checks + +def do_checks(self): + if self.trigger_device is not None: ######################### -> Add only the first line + for device in self.trigger_device.child_devices: + if device is not self: + ...... + + +# Method 2: Triggering on the external trigger +KeysightScope(name="Keysight", parent_device=p00,connectin = ""trigger, description="Example Osci") + +* Advantages : We can manually trigger +* Disadvantages : We need to reserve a DigitalOut for the trigger functionality in the experiment + + + # ------------------------- In the experimental file - For Methode 1 : No Need for change + # Method 1 : Triggering on the channels +No Need for change + +# Method 2: Triggering on the external trigger +You need to manually request the trigger by going high. +In our case -> p00.go_high(t) + +# ------------------------- To Add a new Device +Currenlty 19.02.2025 +To add a new device, you need to: +1. Copy this folder +2. Add a new sheet for the osci as shown above +3. Change the description in the files KeysightScope and labscript_devices +4. Minor adjustments to some import headers -For Methode 2 : You need to manually request the trigger by going high -In our case -> p00.go_high(t) \ No newline at end of file +(Goal in the future : Implementation that resembles the Ni-CArds., where we would need only one folder for all the scopes) diff --git a/labscript_devices/naqslab_devices/VISA/STBstatus.ui b/labscript_devices/KeysightScope/STBstatus.ui similarity index 97% rename from labscript_devices/naqslab_devices/VISA/STBstatus.ui rename to labscript_devices/KeysightScope/STBstatus.ui index 1e52973f..ef4e1116 100644 --- a/labscript_devices/naqslab_devices/VISA/STBstatus.ui +++ b/labscript_devices/KeysightScope/STBstatus.ui @@ -6,14 +6,21 @@ 0 0 - 307 - 218 + 895 + 617 Form + + + + GroupBox + + + @@ -69,7 +76,7 @@ - + :/qtutils/fugue/arrow-circle.png:/qtutils/fugue/arrow-circle.png @@ -406,6 +413,9 @@ Qt::Vertical + + QSizePolicy::Preferred + 268 diff --git a/labscript_devices/KeysightScope/blacs_tabs.py b/labscript_devices/KeysightScope/blacs_tabs.py index b5cd4c0f..3a68a82e 100644 --- a/labscript_devices/KeysightScope/blacs_tabs.py +++ b/labscript_devices/KeysightScope/blacs_tabs.py @@ -1,44 +1,11 @@ -# from blacs.device_base_class import DeviceTab - -# from labscript import LabscriptError - -# from blacs.tab_base_classes import define_state -# from blacs.tab_base_classes import MODE_MANUAL, MODE_TRANSITION_TO_BUFFERED, MODE_TRANSITION_TO_MANUAL, MODE_BUFFERED -# from blacs.device_base_class import DeviceTab -# from qtutils import UiLoader -# import os -# # Imports for handling icons in STBstatus.ui -# from qtutils.qt import QtCore -# from qtutils.qt import QtGui - -# class KeysightScopeTab(DeviceTab): -# def initialise_GUI(self): -# print("Hello World") - -# def initialise_workers(self): -# worker_initialisation_kwargs = self.connection_table.find_by_name(self.device_name).properties -# worker_initialisation_kwargs['addr'] = self.BLACS_connection # vermutung : remote -# self.create_worker( -# 'main_worker', -# 'labscript_devices.KeysightScope.blacs_workers.KeysightScopeWorker', -# worker_initialisation_kwargs, -# ) -# self.primary_worker = 'main_worker' - -####################################################################### NEW - from blacs.device_base_class import DeviceTab - -from labscript import LabscriptError - +from labscript import LabscriptError from blacs.tab_base_classes import define_state,Worker from blacs.tab_base_classes import MODE_MANUAL, MODE_TRANSITION_TO_BUFFERED, MODE_TRANSITION_TO_MANUAL, MODE_BUFFERED from blacs.device_base_class import DeviceTab from qtutils import UiLoader # from PyQt5.QtWidgets import QPushButton import os - - from qtutils.qt import QtCore from qtutils.qt import QtGui @@ -52,21 +19,88 @@ - self.initialise_workers() """ class KeysightScopeTab(DeviceTab): - def initialise_GUI(self): - - # Get capabilities from connection table properties: - connection_table = self.settings['connection_table'] - properties = connection_table.find_by_name(self.device_name).properties - # create a GUI based on these properties - return - + status_byte_labels = {'bit 7':'Powered On', + 'bit 6':'Button Pressed', + 'bit 5':'Command Error', + 'bit 4':'Execution Error', + 'bit 3':'Device Error', + 'bit 2':'Query Error', + 'bit 1':'Unused', + 'bit 0':'Operation Complete'} + + status_widget = 'STBstatus.ui' + STBui_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),status_widget) + def initialise_workers(self): + # Here we can change can initialisation properties in the connection table worker_initialisation_kwargs = self.connection_table.find_by_name(self.device_name).properties - worker_initialisation_kwargs['addr'] = self.BLACS_connection + + # Note that adding porperties as follows allows the blacs worker to access them + # This comes in handy for the device initialisation + worker_initialisation_kwargs['address'] = self.BLACS_connection # important to get the right connection in blacs + + + # Create the device worker self.create_worker( 'main_worker', 'labscript_devices.KeysightScope.blacs_workers.KeysightScopeWorker', worker_initialisation_kwargs, ) self.primary_worker = 'main_worker' + + + def initialise_GUI(self): + self.status_ui = UiLoader().load(self.STBui_path) + self.get_tab_layout().addWidget(self.status_ui) + + # Get capabilities from connection table properties: + # reminder connection_table is an instance of ConnectionTable + #properties = self.connection_table.find_by_name(self.device_name).properties + + + # create a GUI based on these properties + # generate the dictionaries + self.status_bits = ['bit 0', 'bit 1', 'bit 2', 'bit 3', 'bit 4', 'bit 5', 'bit 6', 'bit 7'] + self.bit_labels_widgets = {} + self.bit_values_widgets = {} + self.status = {} + for bit in self.status_bits: + self.status[bit] = False + self.bit_values_widgets[bit] = getattr(self.status_ui, 'status_{0:s}'.format(bit.split()[1])) + self.bit_labels_widgets[bit] = getattr(self.status_ui, 'status_label_{0:s}'.format(bit.split()[1])) + + for key in self.status_bits: + self.bit_labels_widgets[key].setText(self.status_byte_labels[key]) + self.status_ui.clear_button.clicked.connect(self.test_func) + + return + + # This function gets the status, + # and updates the front panel widgets! + @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True) + def status_monitor(self): + # When called with a queue, this function writes to the queue + # when the pulseblaster is waiting. This indicates the end of + # an experimental run. + self.status = yield(self.queue_work(self._primary_worker,'check_status')) + + for key in self.status_bits: + if self.status[key]: + icon = QtGui.QIcon(':/qtutils/fugue/tick') + else: + icon = QtGui.QIcon(':/qtutils/fugue/cross') + pixmap = icon.pixmap(QtCore.QSize(16,16)) + self.bit_values_widgets[key].setPixmap(pixmap) + + + @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) + def send_clear(self,widget=None): + value = self.status_ui.clear_button.isChecked() + yield(self.queue_work(self._primary_worker,'clear',value)) + + + @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) + def test_func(self,widget=None): + value = self.status_ui.clear_button.isChecked() + yield(self.queue_work(self._primary_worker,'clear',value)) \ No newline at end of file diff --git a/labscript_devices/KeysightScope/blacs_workers.py b/labscript_devices/KeysightScope/blacs_workers.py index 78969d95..56464689 100644 --- a/labscript_devices/KeysightScope/blacs_workers.py +++ b/labscript_devices/KeysightScope/blacs_workers.py @@ -3,38 +3,37 @@ import labscript_utils.h5_lock import h5py from zprocess import rich_print - from blacs.tab_base_classes import Worker import labscript_utils.properties import matplotlib.pyplot as plt from matplotlib import pyplot as plt -from labscript_devices.KeysightScope.connection_manager import * +from labscript_devices.KeysightScope.connection_manager import BLUE,GREEN + -BLUE = '#66D9EF' -PURPLE = '#AE81FF' -GREEN = '#A6E22E' -GREY = '#75715E' class KeysightScopeWorker(Worker): """ Defines the software control interface to the hardware. - The BLACS_tab spawns a process that uses this class to send and receive commands with the hardware. + The BLACS_tab spawns a process that uses this class to communicate with the hardware. """ def init(self): - + # ----------------------------------------- Initialize osci global KeysightScope from .KeysightScope import KeysightScope - self.scope = KeysightScope() + self.scope = KeysightScope( + address= self.address, + verbose = False + ) - # Buffered/ Manuel relevant flags + # ----------------------------------------- Buffered/Manuel flags self.buffered_mode = False self.acquired_data = None self.h5file = None - + # ----------------------------------------- Buffered/Mabuel transitions def transition_to_buffered( self, device_name, h5file, front_panel_values, refresh): rich_print(f"====== transition to Buffered: ======", color=BLUE) # os.path.basename(self.h5file) - self.scope.single() + self.h5file = h5file self.device_name = device_name @@ -48,57 +47,58 @@ def transition_to_buffered( self, device_name, h5file, front_panel_values, refre # Dictionary of properties self.scope_params = labscript_utils.properties.get(hdf5file, device_name, 'device_properties') + if self.scope_params is not None: + print(self.scope_params) + else : print("scope params is none") + + self.scope.single() self.buffered_mode = True # confirm that we buffered return {} def transition_to_manual(self, abort = False): - """ - Transition to manual mode after buffered execution completion. - - Returns: - bool: `True` if transition to manual is successful. - """ rich_print(f"====== transition to manual: ======", color=GREEN) - if not self.buffered_mode: # In case we didnt take a shot - return True - self.buffered_mode = False # reset the Flag to False - - if abort: # If we aborted we dont want an acquisation - self.acquired_data = None - self.h5file = None - return True - - channels = self.scope.channels() - data_dict = {} # Create Dict channel - data - vals = {} - wtype = [('t', 'float')] - for ch, enabled in channels.items(): - if enabled: - data_dict[ch], t, vals[ch] = self.scope.waveform(ch) - wtype.append((ch, 'float')) - - # Collect all data in a structured array - data = np.empty(len(t), dtype=wtype) - data['t'] = t - for ch in vals: - data[ch] = vals[ch] - # plt.xlabel('Time in s') - # plt.ylabel('Voltage(2V)') - # plt.plot(data['t'],vals[ch]) - # plt.show() + # if not self.buffered_mode: # In case we didn't take a shot + # return True + # self.buffered_mode = False # reset the Flag to False + + # if abort: # If we aborted we dont want an acquisation + # self.acquired_data = None + # self.h5file = None + # return True + + # channels = self.scope.channels() + # print(channels) + # data_dict = {} # Create Dict channel - data + # vals = {} + # wtype = [('t', 'float')] + # for ch, enabled in channels.items(): + # print(ch , enabled) + # if enabled: + # data_dict[ch], t, vals[ch] = self.scope.waveform(ch) + # wtype.append((ch, 'float')) + + # # Collect all data in a structured array + # data = np.empty(len(t), dtype=wtype) + # data['t'] = t + # for ch in vals: + # data[ch] = vals[ch] + # # plt.xlabel('Time in s') + # # plt.ylabel('Voltage(2V)') + # # plt.plot(data['t'],vals[ch]) + # # plt.show() - # The Blacs worker of the Ni-CArd is responsible for creating the h5file for a shot ( From what i understood , can be wrong ) - with h5py.File(self.h5file, 'r+') as hdf_file: # r+ : Read/write, file must exist - grp = hdf_file.create_group('/data/traces') - dset = grp.create_dataset(f"{self.device_name } {self.scope.description}" , data=data) - dset.attrs.update(self.scope.osci_capabilities) - #dset.attrs.update(data_dict[ch]) # This saves the preamble of the waveform - print('Saving Done!') + # # The Blacs worker of the Ni-CArd is responsible for creating the h5file for a shot ( From what i understood , can be wrong ) + # with h5py.File(self.h5file, 'r+') as hdf_file: # r+ : Read/write, file must exist + # grp = hdf_file.create_group('/data/traces') + # dset = grp.create_dataset(f"{self.device_name } {self.scope.description}" , data=data) + # dset.attrs.update(self.scope.osci_capabilities) + # #dset.attrs.update(data_dict[ch]) # This saves the preamble of the waveform + # print('Saving Done!') return True - # ----------------------------------------- DONE + # ----------------------------------------- Aborting def abort_transition_to_buffered(self): """Special abort shot configuration code belongs here. """ @@ -121,4 +121,13 @@ def program_manual(self,front_panel_values): def check_remote_values(self): # over-ride this method if remote value check is supported - return {} \ No newline at end of file + return {} + + # ------------------------------------------ blacs functions + def clear(self,value): + """Sends standard \*CLR to clear registers of device. + + Args: + value (bool): value of Clear button in STBstatus.ui widget + """ + print("It works") \ No newline at end of file diff --git a/labscript_devices/KeysightScope/connection_manager.py b/labscript_devices/KeysightScope/connection_manager.py index 4e388bab..fd12a50b 100644 --- a/labscript_devices/KeysightScope/connection_manager.py +++ b/labscript_devices/KeysightScope/connection_manager.py @@ -1,117 +1,180 @@ import os -import importlib.util +import importlib import pyvisa from re import sub -if __name__ =="__main__": - import models -else : - import labscript_devices.KeysightScope.models as models +# ----------------------------------- Miscellaneous +BLUE = '#66D9EF' +PURPLE = '#AE81FF' +GREEN = '#A6E22E' +GREY = '#75715E' -def get_address_from_description(description): - # List to store the imported dictionaries - osci_shot_configuration = [] - osci_capabilities = [] +unit_conversion = { + 's' : 1 , + 'ns': 1e-9, # nanoseconds to seconds + 'us': 1e-6, # microseconds to seconds + 'ms': 1e-3 # milliseconds to seconds + } +# ----------------------------------- Miscellaneous - # List of decives detected by pyvisa - rm = pyvisa.ResourceManager() - devs = rm.list_resources() +class connectionManager: + def __init__(self, serial_number=None, address = None, folder_name="models"): - # Loop through all modules in the models package - for filename in os.listdir(models.__path__[0]): - # Check if the file starts with "Keysight" and is a .py file - if filename.startswith("Keysight") and filename.endswith(".py"): - # Construct the module name (without the .py extension) - module_name = filename[:-3] - - # Dynamically import the module from the models package - if __name__ =="__main__": - module = importlib.import_module(f"models.{module_name}") - else : module = importlib.import_module(f"labscript_devices.KeysightScope.models.{module_name}") - - # Try to access the dictionaries if they exist in the module - if hasattr(module, 'osci_shot_configuration'): - osci_shot_configuration = module.osci_shot_configuration - - if hasattr(module, 'osci_capabilities'): - osci_capabilities = module.osci_capabilities - - if description == osci_shot_configuration["description"]: - for idx, item in enumerate(devs): - try: - scope = rm.open_resource(devs[idx], timeout=200) - scope_serial_number = sub(r'\s+', '', scope.query(":SERial?")) - if scope_serial_number == osci_capabilities['serial_number']: - return item - except: - continue - - -def get_configuration_from_description(description): - # List to store the imported dictionaries - osci_shot_configuration = [] - osci_capabilities = [] - # Loop through all modules in the models package - for filename in os.listdir(models.__path__[0]): - # Check if the file starts with "Keysight" and is a .py file - if filename.startswith("Keysight") and filename.endswith(".py"): - # Construct the module name (without the .py extension) - module_name = filename[:-3] - - # Dynamically import the module from the models package - if __name__ =="__main__": - module = importlib.import_module(f"models.{module_name}") - else : module = importlib.import_module(f"labscript_devices.KeysightScope.models.{module_name}") - - # Try to access the dictionaries if they exist in the module - if hasattr(module, 'osci_shot_configuration'): - osci_shot_configuration = module.osci_shot_configuration - - if hasattr(module, 'osci_capabilities'): - osci_capabilities = module.osci_capabilities - - if description == osci_shot_configuration["description"]: - return osci_shot_configuration + self.serial_number = serial_number + self.address = address + self.folder_name = folder_name - -def get_capabilities_from_description(description): - # Loop through all modules in the models package - for filename in os.listdir(models.__path__[0]): - # Check if the file starts with "Keysight" and is a .py file - if filename.startswith("Keysight") and filename.endswith(".py"): - # Construct the module name (without the .py extension) - module_name = filename[:-3] - - # Dynamically import the module from the models package - if __name__ =="__main__": - module = importlib.import_module(f"models.{module_name}") - else : module = importlib.import_module(f"labscript_devices.KeysightScope.models.{module_name}") - - # Try to access the dictionaries if they exist in the module - if hasattr(module, 'osci_shot_configuration'): - osci_shot_configuration = module.osci_shot_configuration - - if hasattr(module, 'osci_capabilities'): - osci_capabilities = module.osci_capabilities + # List of the supported Keysight oscilloscopes + self.supported_models = ["EDUX1052A", "EDUX1052G", "DSOX1202A", "DSOX1202G", "DSOX1204A", "DSOX1204G"] + + # ----------------------------- Pyvisa ressources + self.rm = pyvisa.ResourceManager() + self.devs = self.rm.list_resources() - if description == osci_shot_configuration["description"]: - return osci_capabilities + # ----------------------------- serial_number initialization + if self.serial_number is not None: + self.current_file = self.pick_file_from_serial_number() # Dictionary containing all the module attributes + if self.current_file is None: + raise ValueError(f"File with serial number {self.serial_number} not found.") + + self.osci_shot_configuration = self.current_file["osci_shot_configuration"] + self.osci_capabilities = self.current_file["osci_capabilities"] + # ----------------------------- Address initialization + if self.address is not None: + self.current_file = self.pick_file_from_adress() # Dictionary containing all the module attributes + if self.current_file is None: + raise ValueError(f"File with serial number {self.serial_number} not found.") + + self.osci_shot_configuration = self.current_file["osci_shot_configuration"] + self.osci_capabilities = self.current_file["osci_capabilities"] + + + def _get_files_from_folder(self): + """ + Retrieves all files from the specified folder (default is "models"). + The folder is assumed to be part of the KeysightScope directory structure. + + Returns: + list: A list of file names in the specified folder. + + Raises: + FileNotFoundError: If the specified folder does not exist. + """ + file_path = os.path.abspath(__file__) # Absolute path of this file + containing_folder = os.path.dirname(file_path) # Absolute path of the containing folder + keysight_scope_dir = os.path.join(containing_folder, self.folder_name) # Absolute path to the desired folder (default is "models") + + # Check if the directory exists + if not os.path.exists(keysight_scope_dir): + raise FileNotFoundError(f"The folder '{self.folder_name}' does not exist in the KeysightScope directory.") + + # Get all files in the folder + #files = [f for f in os.listdir(keysight_scope_dir) if os.path.isfile(os.path.join(keysight_scope_dir, f))] + files = [os.path.abspath(os.path.join(keysight_scope_dir, f)) for f in os.listdir(keysight_scope_dir) if os.path.isfile(os.path.join(keysight_scope_dir, f))] + return files + + def pick_file_from_serial_number(self, serial_number = None): + """ + Selects the first file that contains the serial number in its name. + + Returns: + file: The initialization file that corresponds to the serial number, or None if no file is found. + """ + if serial_number is None: + serial_number = self.serial_number + + files = self._get_files_from_folder() + + for file_path in files: + with open(file_path, 'r') as f: # Open the file in read mode + content = f.read() + if serial_number in content: + module_name = os.path.basename(file_path)[:-3] + spec = importlib.util.spec_from_file_location(module_name, file_path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + # Create a dictionary to store the module's attributes + module_attributes = {} + + # Iterate over all attributes of the module + for attribute_name in dir(module): + if not attribute_name.startswith('__'): + # Get the attribute value + attribute_value = getattr(module, attribute_name) + + # Store the attribute and its value in the dictionary + module_attributes[attribute_name] = attribute_value + + #Return the dictionary of attributes + return module_attributes + + return None + + + +############################################################################ +# Done # +############################################################################ + + def get_address_from_serial_number(self, serial_number = None): + """ + Identifies to the oscilloscope with the given serial number and supported model. + + Iterates through the available devices, checks if their model and serial number match the expected ones, + and returns the correct connection resource string for the oscilloscope. + + Returns: + str: The connection resource string for the oscilloscope. + + Raises: + ValueError: If no oscilloscope with the matching serial number or model is found. + """ + if serial_number is None: + serial_number = self.serial_number -# ----------------------------------- tests + + isRightModel = False + isRightSerialNumber = False + + for idx, item in enumerate(self.devs): + try: + scope = self.rm.open_resource(self.devs[idx], timeout=500) # opens the device + osci_model = scope.query("*IDN?") # asks about the identity + + for supported_model in self.supported_models: # checks if it is a supported model + if supported_model in osci_model: + isRightModel = True + + # Check the serial number + scope_serial_number = sub(r'\s+', '', scope.query(":SERial?")) # gets the device serial number + isRightSerialNumber = (scope_serial_number == serial_number) # checks the conformity between the given and the read serial number + + if isRightSerialNumber and isRightModel: + return item + elif not isRightModel and isRightSerialNumber: + raise ValueError(f"The device model {osci_model} is not supported. Supported models are EDUX1052A, EDUX1052G, DSOX1202A, DSOX1202G, DSOX1204A, DSOX1204G.") + except: + continue + + if not isRightSerialNumber: + raise ValueError(f"No Device with the serial number {serial_number} was found.") + + def pick_file_from_adress(self): + scope = self.rm.open_resource(self.address, timeout=500) + scope_serial_number = sub(r'\s+', '', scope.query(":SERial?")) + return self.pick_file_from_serial_number(scope_serial_number) + + + +# ------------------------------------------------------------------------ Testing if __name__ == "__main__": + cm = connectionManager(serial_number="CN61364200") + print(cm.osci_capabilities) - # # get_address_from_description - # adrr = get_address_from_description('Example Osci') - # rm = pyvisa.ResourceManager() - # devs = rm.list_resources() - # scope = rm.open_resource(adrr) - # print(scope.query("*IDN?")) - - print(get_capabilities_from_description('Example Osci')) - print(get_configuration_from_description('Example Osci')) diff --git a/labscript_devices/KeysightScope/labscript_devices.py b/labscript_devices/KeysightScope/labscript_devices.py index 31eb277d..dbcdbe12 100644 --- a/labscript_devices/KeysightScope/labscript_devices.py +++ b/labscript_devices/KeysightScope/labscript_devices.py @@ -1,17 +1,9 @@ from labscript import TriggerableDevice, LabscriptError, set_passed_properties ,LabscriptError, AnalogIn -#from labscript_devices.KeysightScope.models.Keysight_dsox1202g import osci_capabilities, osci_shot_configuration -from labscript_devices.KeysightScope.connection_manager import * - -# -------------------- Change me -description = "Example Osci" -# ------------------------------ +## ---------------------------------------------------------------New imports +from labscript_devices.KeysightScope.connection_manager import * +from labscript_devices.KeysightScope.models.default_properties import default_osci_capabilities, default_osci_shot_configuration -adress = get_address_from_description(description) -osci_capabilities = get_capabilities_from_description(description) -osci_shot_configuration = get_configuration_from_description(description) -connection_table_properties = list(osci_capabilities.keys()) -device_properties = list(osci_shot_configuration.keys()) class KeysightScope(TriggerableDevice): @@ -25,22 +17,31 @@ class KeysightScope(TriggerableDevice): @set_passed_properties( property_names = { - 'device_properties': device_properties + 'connection_table_properties': list(default_osci_capabilities.keys()), + 'device_properties': list(default_osci_shot_configuration.keys()) } ) def __init__(self, name, parent_device, - description, + connection, + serial_number, **kwargs): - TriggerableDevice.__init__(self, name, parent_device, "trigger", **kwargs) # parentless=False + TriggerableDevice.__init__(self, name, parent_device, connection, **kwargs) # parentless=False # connetion = "trigger" + self.name = name - self.description = description - self.BLACS_connection = get_address_from_description(self.description) - osci_capabilities = get_capabilities_from_description(self.description) - osci_shot_configuration = get_configuration_from_description(self.description) - #set_passed_properties(property_names={"device_properties": list(osci_shot_configuration.keys())})(self) # maybe this way + cm = connectionManager(serial_number) + self.BLACS_connection = cm.get_address_from_serial_number() + osci_capabilities = cm.osci_capabilities + osci_shot_configuration = cm.osci_shot_configuration + + set_passed_properties( + property_names = { + 'connection_table_properties' : list(osci_capabilities.keys()) , + "device_properties": list(osci_shot_configuration.keys()) + } + ) # --------------------------------- Device properties for key,value in osci_capabilities.items(): @@ -64,56 +65,6 @@ def generate_code(self, hdf5_file, *args): TriggerableDevice.generate_code(self, hdf5_file) -# Another Methode for adding prop -""" - Another way - # 1 in class KeysightScope(TriggerableDevice): we passed the args with the init values - init - acquisation_rate=10e6, - max_amplitude = 5, - v_div = 2, - t_div=1e-3, - - # 2 of cource then - self.acquisation_rate = acquisation_rate - self.max_amplitude = max_amplitude - self.t_div = t_div - self.v_div = v_div - - oder so - def set_parameters(self, - acquisation_rate=None, - max_amplitude=None, - t_div=None, - v_div=None): - - if acquisation_rate is not None: - self.acquisation_rate = acquisation_rate - if max_amplitude is not None: - self.max_amplitude = max_amplitude - if v_div is not None: - self.v_div = v_div - if t_div is not None: - self.t_div = t_div - - # Last in generate code - group = self.init_device_group(hdf5_file) - - # Setup device properties - group.attrs["triggered"] = self.triggered - group.attrs["acquisation_rate"] = self.acquisation_rate - - # trigger types - group.attrs["max_amplitude"] = self.max_amplitude - group.attrs["t_div"] = self.t_div - group.attrs["v_div"] = self.v_div - -""" - - - - - diff --git a/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py b/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py index 1ac03456..0ffa775d 100644 --- a/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py +++ b/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py @@ -8,21 +8,19 @@ # ----------------------------------- Keysight DSOX1202G osci_shot_configuration = { - "description" : "Example Osci", - # Channel unrelated "trigger_source" : "CHANnel1", # CHANnel1, CHANnel2 , EXTernal , LINE , WGEN - "trigger_level" : "0.5", # + "trigger_level" : "1", # "trigger_level_unit" : "V", # V or mV "trigger_type" : "EDGE", # "trigger_edge_slope" : "POSitive", # Only for trigger type is Edge - "triggered" : False, # Flag to keep track of triggers (TO DO) + # "triggered" : False, # Flag to keep track of triggers (Onyl when Trigger is External) "acquire_type" : "NORMal", # NORMal , AVERage , HRESolution , PEAK (TO DO HRESOLUTION and PEAK) "acquire_count" : "8", # AVERage=2-65536 ,HRESolution=1 ,NORMal=8 , PEAK=None - "waveform_format" : "WORD", # WORD , BYTE # WORD doesnt work + "waveform_format" : "WORD", # WORD , BYTE # Sometimes: despite the format is Word , the osci still sends Byte data, unclear ? "time_reference" : "LEFT", # LEFT , CENT , RIGH "time_division" : "50", # @@ -44,9 +42,9 @@ "probe_attenuation_1" : "1", # # ------------------------ Channel 2 - "channel_display_2" : "0", # 0,1,2 or 3 = 3+1 + "channel_display_2" : "0", # 1 ON , 0 = OFF - "voltage_division_2" : "2", # + "voltage_division_2" : "1", # "voltage_division_unit_2" : "V", # V or mV "voltage_offset_2" : "0", # "voltage_offset_unit_2" : "V", # V or mV @@ -54,12 +52,19 @@ } +{ + 'added_properties': {}, + 'start_order': 0, + 'stop_order': 0, +} + # ----------------------------------- Keysight DSOX1202G osci_capabilities = { + "description" : "Example Osci", "serial_number" : "CN61364200", "band_width" : 70e6, # 70 MHz - "sampling_rate" : 2*10e9, # 2GSa/s + "sampling_rate" : 2*1e9, # 2GSa/s "max_memory" : 1e6, # 1Mpts "max_update_rate" : 5e4 # 50,000 waveforms/second update rate. } diff --git a/labscript_devices/KeysightScope/models/default_properties.py b/labscript_devices/KeysightScope/models/default_properties.py new file mode 100644 index 00000000..1e3d9407 --- /dev/null +++ b/labscript_devices/KeysightScope/models/default_properties.py @@ -0,0 +1,78 @@ +""" +*************************** DON't DELETE +Idea: + + - Initializing a device for experiments starts by adding it to the connection table file. + For example: KeysightScope(name="Keysight_Osci", ....) + + - To set the device in a specific state in the initialization, we pass a dictionary that contains the desired configuration for the device. + + - This dictionary will be passed to the labscript_device class. + + ********************* The purpose of this file ********************* + - For proper setup, we must first pass a default dictionary to the decorator responsible for configuring the device properties. + This is necessary because the labscript_device class needs to know the properties to be initialized before the device itself is initialized. + ********************************************************************* + + - These properties will be overridden when initializing the device. + + - This approach is made possible by the way labscript is designed (see labscript.set_passed_properties for more details). +""" + +# ----------------------------------- Keysight DSOX1202G +default_osci_shot_configuration = { + # Channel unrelated + "trigger_source" : None, # CHANnel1, CHANnel2 , EXTernal , LINE , WGEN + "trigger_level" : None, # + "trigger_level_unit" : None, # V or mV + "trigger_type" : None, # + "trigger_edge_slope" : None, # Only for trigger type is Edge + + "triggered" : None, # Flag to keep track of triggers (TO DO) + + "acquire_type" : None, # NORMal , AVERage , HRESolution , PEAK (TO DO HRESOLUTION and PEAK) + "acquire_count" : None, # AVERage=2-65536 ,HRESolution=1 ,NORMal=8 , PEAK=None + + "waveform_format" : None, # WORD , BYTE # WORD doesnt work + + "time_reference" : None, # LEFT , CENT , RIGH + "time_division" : None, # + "time_division_unit" : None, # s, ms , us , ns + "time_delay" : None, # + "time_delay_unit" : None, # s, ms , us , ns + + "timeout" : None, # In seconds + + # Channel related + # ------------------------ Channel 1 + "channel_display_1" : None, # 1 ON , 0 = OFF + + "voltage_division_1" : None, # + "voltage_division_unit_1" : None, # V or mV + "voltage_offset_1" : None, # + "voltage_offset_unit_1" : None, # V or mV + "probe_attenuation_1" : None, # + + # ------------------------ Channel 2 + "channel_display_2" : None, # 1 ON , 0 = OFF + + "voltage_division_2" : None, # + "voltage_division_unit_2" : None, # V or mV + "voltage_offset_2" : None, # + "voltage_offset_unit_2" : None, # V or mV + "probe_attenuation_2" : None # +} + +# ----------------------------------- Keysight DSOX1202G +default_osci_capabilities = { + "description" : None, # Importamnt to find this osci + "serial_number" : None, # important to write + "band_width" : None, # 70 MHz + "sampling_rate" : None, # 2GSa/s + "max_memory" : None, # 1Mpts + "max_update_rate" : None # 50,000 waveforms/second update rate. +} + + + + diff --git a/labscript_devices/KeysightScope/models/example_to_copy.py b/labscript_devices/KeysightScope/models/example_to_copy.py index 12c2f1a2..4e349f74 100644 --- a/labscript_devices/KeysightScope/models/example_to_copy.py +++ b/labscript_devices/KeysightScope/models/example_to_copy.py @@ -9,8 +9,6 @@ # ----------------------------------- Keysight DSOX1202G osci_shot_configuration = { - "description" : "Example Osci", - # Channel unrelated "trigger_source" : "CHANnel1", # CHANnel1, CHANnel2 , EXTernal , LINE , WGEN "trigger_level" : "0.5", # @@ -23,7 +21,7 @@ "acquire_type" : "NORMal", # NORMal , AVERage , HRESolution , PEAK (TO DO HRESOLUTION and PEAK) "acquire_count" : "8", # AVERage=2-65536 ,HRESolution=1 ,NORMal=8 , PEAK=None - "waveform_format" : "WORD", # WORD , BYTE # WORD doesnt work + "waveform_format" : "BYTE", # WORD , BYTE (For some reason, WORD doesnt work) "time_reference" : "LEFT", # LEFT , CENT , RIGH "time_division" : "50", # @@ -44,7 +42,7 @@ "probe_attenuation_1" : "1", # # ------------------------ Channel 2 - "channel_display_2" : "0", # 0,1,2 or 3 = 3+1 + "channel_display_2" : "0", # 1 ON , 0 = OFF "voltage_division_2" : "2", # "voltage_division_unit_2" : "V", # V or mV @@ -55,7 +53,8 @@ # ----------------------------------- Keysight DSOX1202G osci_capabilities = { - "serial_number" : "CN61364200", + "description" : "Example Osci", # Importamnt to find this osci + "serial_number" : "SerialNumber", # important to write "band_width" : 70e6, # 70 MHz "sampling_rate" : 2*10e9, # 2GSa/s "max_memory" : 1e6, # 1Mpts diff --git a/labscript_devices/naqslab_devices/KeysightDCSupply/__init__.py b/labscript_devices/naqslab_devices/KeysightDCSupply/__init__.py deleted file mode 100644 index d5abe5ef..00000000 --- a/labscript_devices/naqslab_devices/KeysightDCSupply/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/__init__.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### - diff --git a/labscript_devices/naqslab_devices/KeysightDCSupply/blacs_tab.py b/labscript_devices/naqslab_devices/KeysightDCSupply/blacs_tab.py deleted file mode 100644 index 93dce347..00000000 --- a/labscript_devices/naqslab_devices/KeysightDCSupply/blacs_tab.py +++ /dev/null @@ -1,71 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/KeysightDCSupply/blacs_tab.py # -# # -# Copyright 2020, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from naqslab_devices.VISA.blacs_tab import VISATab - -# note, when adding a new model, put the labscript_device inheritor class -# into Models.py and the BLACS classes into a file named for the device -# in the BLACS subfolder. Update register_classes.py and __init__.py -# accordingly. - -class KeysightDCSupplyTab(VISATab): - - status_byte_labels = {'bit 7':'Unregulated', - 'bit 6':'Over-Voltage', - 'bit 5':'Command Error', - 'bit 4':'Execution Error', - 'bit 3':'Device Error', - 'bit 2':'Query Error', - 'bit 1':'Constant Voltage Mode', - 'bit 0':'Constant Current Mode'} - - - def __init__(self,*args,**kwargs): - self.device_worker_class = 'naqslab_devices.KeysightDCSupply.blacs_worker.KeysightDCSupplyWorker' - VISATab.__init__(self,*args,**kwargs) - - def initialise_GUI(self): - # configure outputs based on output limiting type - properties = self.settings['connection_table'].find_by_name(self.device_name).properties - - if properties['limited'] == 'volt': - base_units = 'V' - base_min = properties['volt_limits'][0] - base_max = properties['volt_limits'][1] - else: - base_units = 'A' - base_min = properties['current_limits'][0] - base_max = properties['current_limits'][1] - - AO_prop = {} - for i in properties['allowed_outputs']: - AO_prop['channel %d'%i] = { - 'base_unit':base_units, - 'min':base_min, - 'max':base_max, - 'step':1, - 'decimals':5 - } - - # Create the output objects - self.create_analog_outputs(AO_prop) - # Create widgets for output objects - dds_widgets,ao_widgets,do_widgets = self.auto_create_widgets() - # and auto place the widgets in the UI - self.auto_place_widgets(("DC Outputs",ao_widgets)) - - # call VISATab.initialise to create STB widget - VISATab.initialise_GUI(self) - - # Set the capabilities of this device - self.supports_remote_value_check(True) - self.supports_smart_programming(True) - self.statemachine_timeout_add(10000, self.status_monitor) diff --git a/labscript_devices/naqslab_devices/KeysightDCSupply/blacs_worker.py b/labscript_devices/naqslab_devices/KeysightDCSupply/blacs_worker.py deleted file mode 100644 index 27391283..00000000 --- a/labscript_devices/naqslab_devices/KeysightDCSupply/blacs_worker.py +++ /dev/null @@ -1,172 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/KeysightDCSupply/blacs_worker.py # -# # -# Copyright 2020, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -import numpy as np - -from naqslab_devices.VISA.blacs_worker import VISAWorker -from labscript import LabscriptError - -import labscript_utils.h5_lock, h5py - -class KeysightDCSupplyWorker(VISAWorker): - - # define the status masks - esr_mask = 60 - qsr_mask = 1539 - - # define the initialisation string - init_string = f'*ESE {esr_mask};STAT:QUES:ENAB {qsr_mask};*CLS' - ident_string = 'E364' - - # define instrument specific read and write strings - write_both_string = 'APPL %.5f, %.5f' - write_volt_string = 'VOLT %.5f' - write_current_string = 'CURR %.5f' - read_string = 'APPL?' - - def read_parser(self,response): - '''Parses the Voltage & Amplitude response string - - Args: - response (str): Instrument response to current voltage/current query. - Has format of "d.ddddd, d.ddddd" - - Returns: - (tuple): containing - - V (float): Current Voltage Setting - A (float): Current Current Setting - ''' - V, A = response[1:-3].split(',') - return float(V), float(A) - - def init(self): - # Call the VISA init to initialise the VISA connection - VISAWorker.init(self) - - response = self.connection.query('*IDN?') - if self.ident_string not in response: - msg = f'''KeysightDCSupply does not support:\t{response}''' - raise LabscriptError(msg) - - self.connection.write(self.init_string) - - if self.limited == 'volt': - self.write_string = self.write_volt_string - else: - self.write_string = self.write_current_string - - # set voltage range - self.connection.write('VOLT:RANG '+self.range) - - # initialize the smart cache - self.smart_cache = {'CURRENT_DATA': - {'channel %d'%i:None for i in self.allowed_outputs} - } - - def check_remote_values(self): - # Get the currently output values: - results = {} - - # these query strings and parsers depend heavily on device - for i in self.allowed_outputs: - response = self.connection.query(self.read_string) - V, A = self.read_parser(response) - results['channel %d'%i] = V if self.limited == 'volt' else A - - return results - - def program_manual(self,front_panel_values): - - for output, val in front_panel_values.items(): - self.connection.write(self.write_string%(val)) - # invalidate smart cache after manual update - self.smart_cache['CURRENT_DATA'][output] = None - - return self.check_remote_values() - - def transition_to_buffered(self,device_name,h5file,initial_values,fresh): - # call parent method to do basic preamble - VISAWorker.transition_to_buffered(self,device_name,h5file,initial_values,fresh) - data = None - final_values = initial_values - # Program static values - with h5py.File(h5file,'r') as hdf5_file: - group = hdf5_file['/devices/'+device_name] - # If there are values to set the unbuffered outputs to, set them now: - if 'STATIC_DATA' in group: - data = group['STATIC_DATA'][:][0] - - if data is not None: - if fresh or data != self.smart_cache['CURRENT_DATA']: - - # only program channels as needed - channels = [int(name[-1]) for name in data.dtype.names] - for i in channels: - if data[i] != self.smart_cache['CURRENT_DATA']['channel %d'%i]: - self.connection.write(self.write_string%(data[i])) - final_values['channel %d'%i] = data[i] - self.smart_cache['CURRENT_DATA']['channel %d'%i] = data[i] - - else: - final_values = self.initial_values - - return final_values - - def check_status(self): - '''Customised check status for Keysight DC supplies. - - This method combines flags from the event status register and the - questionable status register.''' - - response = self.connection.query_ascii_values('*ESR?;STAT:QUES?;QUES:COND?',separator=';') - [esr, qsr, cond] = [int(i) for i in response] - - if (esr & self.esr_mask) != 0: - err_list = [] - while True: - err_string = self.connection.query('SYST:ERR?') - err,description = err_string.split(',') - if int(err) != 0: - err_list.append(err_string) - else: - break - msg = f'{self.VISA_name} has errors\n\t{err_list}' - raise LabscriptError(dedent(msg)) - - return self.merge_registers(esr,qsr,cond) - - def merge_registers(self, esr, qsr,cond): - '''Merges the ESR & QSR registers with the condition into a hybrid register - and converts to a dictionary for display on the BLACStab. - - Args: - esr (int): Value of the Event Status Register - qsr (int): Value of the Questionable Status Register - cond (int): Response of STATus:QUEStionable:CONDition? - - Returns: - return_vals (dict): Dictionary of values from the esr and qsr registers. - ''' - - return_vals = self.convert_register(esr) - # qsr register is more than 8 bits, so need to do convert_register by hand - qsr_status = f'{qsr:11b}'[::-1] - - # note cond == 0 is output off/unregulated and cond == 3 is supply failure - return_vals['bit 0'] = cond == 1 - return_vals['bit 1'] = cond == 2 - return_vals['bit 6'] = bool(int(qsr_status[9])) if qsr_status[9]!=' ' else False - current_unregulated = bool(int(qsr_status[1])) if qsr_status[1]!=' ' else False - volt_unregulated = bool(int(qsr_status[0])) if qsr_status[0]!=' ' else False - return_vals['bit 7'] = current_unregulated | volt_unregulated - - return return_vals \ No newline at end of file diff --git a/labscript_devices/naqslab_devices/KeysightDCSupply/labscript_device.py b/labscript_devices/naqslab_devices/KeysightDCSupply/labscript_device.py deleted file mode 100644 index 7eae4165..00000000 --- a/labscript_devices/naqslab_devices/KeysightDCSupply/labscript_device.py +++ /dev/null @@ -1,154 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/KeysightDCSupply/labscript_device.py # -# # -# Copyright 2020, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -import numpy as np - -from naqslab_devices.VISA.labscript_device import VISA -from labscript import StaticAnalogOut, LabscriptError, set_passed_properties, config - -__version__ = '0.1.0' -__author__ = ['dihm'] - -# note, when adding a new model, put the labscript_device inheritor class -# into Models.py and the BLACS classes into a file named for the device -# in the BLACS subfolder. Update register_classes.py and __init__.py -# accordingly. - -class KeysightDCSupply(VISA): - description = 'DC Power Supply' - allowed_children = [StaticAnalogOut] - allowed_outputs = [0] - - - @set_passed_properties(property_names = {'connection_table_properties': - ['volt_limits','current_limits','range','limited','allowed_outputs']}) - def __init__(self, name, VISA_name, - range='LOW', volt_limits=(0,1), current_limits=(0,1), limited='volt'): - '''Keysight DC Power Supply - - The labscript_device for Keysight DC Power supplies. Currently only tested - for E364xA single output series devices. - - Args: - name (str): labscript name to assign to device. Must be an allowed python variable name. - VISA_name (str): VISA connection string to device. Can be alias configured in NI-MAX. - range (str): configures which voltage range to use. Default is 'LOW'. - volt_limits (iterable): voltage limits, in volts - current_limits (iterable): current limits, in amps - limited (str): Sets whether output is configured to be voltage or current limited. Default is 'volt' - ''' - - # validate and save configuration parameters - if range in ('LOW','HIGH'): - self.range = range - else: - msg = f'''Invalid value {range} for range. - Must be either \'LOW\' or \'HIGH\'.''' - raise LabscriptError(msg) - - try: - iter(volt_limits) - except TypeError: - msg = f'''volt_limits must be of iterable type, not {str(type(volt_limits))}''' - raise LabscriptError(msg) - else: - if len(volt_limits) != 2: - msg = f'''volt_limits must have two elements: (lower,upper), not {volt_limits}''' - raise LabscriptError(msg) - - try: - iter(current_limits) - except TypeError: - msg = f'''current_limits must be of iterable type, not {str(type(current_limits))}''' - raise LabscriptError(msg) - else: - if len(current_limits) != 2: - msg = f'''current_limits must have two elements: (lower,upper), not {current_limits}''' - raise LabscriptError(msg) - - self.volt_limits = volt_limits - self.current_limits = current_limits - - if limited in ('volt','current'): - self.limited = limited - else: - msg = f'''Invalid value {limited} for limited. - Must be either \'volt\' or \'current\'.''' - raise LabscriptError(dedent(msg)) - # DC Power Supplies do not have a parent device - VISA.__init__(self,name,None,VISA_name) - - def quantise_volt(self,data,output): - '''Quantize the currents in units of V and check it's within bounds''' - - # Ensure that amplitudes are within bounds: - if data < self.volt_limits[0] or data > self.volt_limits[1]: - msg = '''{:s} {:s} can only have volts between - {:.5f} V and {:.5f} V, {} given'''.format(output.description, - output.name,*self.amp_limits, - data) - raise LabscriptError(dedent(msg)) - return data - - def quantise_current(self,data,output): - '''Quantize the currents in units of A and check it's within bounds''' - - # Ensure that amplitudes are within bounds: - if data < self.current_limits[0] or data > self.current_limits[1]: - msg = '''{:s} {:s} can only have currents between - {:.5f} A and {:.5f} A, {} given'''.format(output.description, - output.name,*self.current_limits, - data) - raise LabscriptError(dedent(msg)) - return data - - def generate_code(self, hdf5_file): - - chan_num = len(self.child_devices) - if not chan_num: - print(f'No outputs attached to {self.name:s}') - return - - outputs = {} - for output in self.child_devices: - try: - prefix, channel = output.connection.split(' ') - channel = int(channel) - outputs[channel] = output - except : - msg = '''{:s} {:s} has invalid connection string: \'{!s}\'. - Format must be \'channel n\' with n an integer.''' - raise LabscriptError(dedent(msg.format(output.description, - output.name,output.connection))) - - # create static table and populate - static_dtypes = np.dtype({'names':['channel %d'%i for i in outputs.keys()], - 'formats':[np.float16 for i in outputs.keys()]}) - static_table = np.zeros(1, dtype=static_dtypes) - for channel, output in outputs.items(): - if channel not in self.allowed_outputs: - msg = '''channel {} not in {}.''' - raise LabscriptError(dedent(msg.format(channel,self.allowed_outputs))) - - _ = output.get_change_times() - _ = output.make_timeseries([]) - _ = output.expand_timeseries() - - if self.limited == 'volt': - raw_output = self.quantise_volt(output.static_value,output) - else: - raw_output = self.quantise_current(output.static_value,output) - - static_table['channel %d'%channel] = raw_output - - grp = hdf5_file.create_group('/devices/'+self.name) - grp.create_dataset('STATIC_DATA',compression=config.compression,data=static_table) - diff --git a/labscript_devices/naqslab_devices/KeysightDCSupply/register_classes.py b/labscript_devices/naqslab_devices/KeysightDCSupply/register_classes.py deleted file mode 100644 index e2da213d..00000000 --- a/labscript_devices/naqslab_devices/KeysightDCSupply/register_classes.py +++ /dev/null @@ -1,18 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/KeysightDCSupply/register_classes.py # -# # -# Copyright 2020, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -import labscript_devices - -labscript_devices.register_classes( - 'KeysightDCSupply', - BLACS_tab='naqslab_devices.KeysightDCSupply.blacs_tab.KeysightDCSupplyTab', - runviewer_parser='') \ No newline at end of file diff --git a/labscript_devices/naqslab_devices/KeysightXSeries/__init__.py b/labscript_devices/naqslab_devices/KeysightXSeries/__init__.py deleted file mode 100644 index f6e386cd..00000000 --- a/labscript_devices/naqslab_devices/KeysightXSeries/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/KeysightXSeries/__init__.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### - diff --git a/labscript_devices/naqslab_devices/KeysightXSeries/blacs_tab.py b/labscript_devices/naqslab_devices/KeysightXSeries/blacs_tab.py deleted file mode 100644 index b99c621b..00000000 --- a/labscript_devices/naqslab_devices/KeysightXSeries/blacs_tab.py +++ /dev/null @@ -1,38 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/KeysightXSeries/blacs_tab.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from naqslab_devices.VISA.blacs_tab import VISATab - -class KeysightXScopeTab(VISATab): - # Event Byte Label Definitions for X series scopes - # Used bits set by '*ESE' command in setup string of worker class - status_byte_labels = {'bit 7':'Powered On', - 'bit 6':'Button Pressed', - 'bit 5':'Command Error', - 'bit 4':'Execution Error', - 'bit 3':'Device Error', - 'bit 2':'Query Error', - 'bit 1':'Unused', - 'bit 0':'Operation Complete'} - - def __init__(self,*args,**kwargs): - if not hasattr(self,'device_worker_class'): - self.device_worker_class = 'naqslab_devices.KeysightXSeries.blacs_worker.KeysightXScopeWorker' - VISATab.__init__(self,*args,**kwargs) - - def initialise_GUI(self): - # Call the VISATab parent to initialise the STB ui and set the worker - VISATab.initialise_GUI(self) - - # Set the capabilities of this device - self.supports_remote_value_check(False) - self.supports_smart_programming(True) - self.statemachine_timeout_add(5000, self.status_monitor) diff --git a/labscript_devices/naqslab_devices/KeysightXSeries/blacs_worker.py b/labscript_devices/naqslab_devices/KeysightXSeries/blacs_worker.py deleted file mode 100644 index 5ddcd1ea..00000000 --- a/labscript_devices/naqslab_devices/KeysightXSeries/blacs_worker.py +++ /dev/null @@ -1,282 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/KeysightXSeries/blacs_worker.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -import numpy as np -from naqslab_devices.VISA.blacs_worker import VISAWorker -from labscript import LabscriptError -import labscript_utils.properties - -import labscript_utils.h5_lock, h5py - -class KeysightXScopeWorker(VISAWorker): - # define instrument specific read and write strings - setup_string = '*ESE 60;*SRE 32;*CLS;:WAV:BYT MSBF;UNS ON;POIN:MODE RAW' - # *ESE does not disable bits in ESR, just their reporting to STB - # need to use our own mask - esr_mask = 60 - # note that analog & digital channels require different :WAV:FORM commands - read_analog_parameters_string = ':WAV:FORM WORD;SOUR CHAN{0:d};PRE?' - read_dig_parameters_string = ':WAV:FORM BYTE;SOUR POD{0:d};PRE?' - read_waveform_string = ':WAV:DATA?' - read_counter_string = ':MEAS:{0:s}{1:s}? CHAN{2:d}' - model_ident = ['SO-X','SOX'] - # some devices need the alternative :SING command, checked for in init() - dig_command = ':DIG' - - def analog_waveform_parser(self,raw_waveform_array,y0,dy,yoffset): - '''Parses the numpy array from the analog waveform query.''' - return (raw_waveform_array - yoffset)*dy + y0 - - def digital_pod_parser(self,raw_pod_array): - '''Unpacks the bits for a pod array - Columns returned are in bit order [7,6,5,4,3,2,1,0]''' - return np.unpackbits(raw_pod_array.astype(np.uint8),axis=0).reshape((-1,8),order='C') - - def error_parser(self,error_return_string): - '''Parses the strings returned by :SYST:ERR? - Returns int_code, err_string''' - return int(error_return_string.split(',')[0]), error_return_string - - def init(self): - # Call the VISA init to initialise the VISA connection - VISAWorker.init(self) - # Override the timeout for longer scope waits - self.connection.timeout = 10000 - - # Query device name to ensure supported scope - ident_string = self.connection.query('*IDN?') - if ('KEYSIGHT' in ident_string) and any(sub in ident_string for sub in self.model_ident): - # Scope supported! - # If scope is a DSO-X 1000 series, need to use alternate digitize_command for some reason - if 'DSO-X 1' in ident_string: - self.dig_command = ':SING' - else: - raise LabscriptError('Device {0:s} with VISA name {0:s} not supported!'.format(ident_string,self.VISA_name)) - - # initialization stuff - self.connection.write(self.setup_string) - # initialize smart cache - self.smart_cache = {'COUNTERS': None} - - def transition_to_buffered(self,device_name,h5file,initial_values,fresh): - '''This configures counters, if any are defined, - as well as optional compression options for saved data traces.''' - VISAWorker.transition_to_buffered(self,device_name,h5file,initial_values,fresh) - - data = None - refresh = False - send_trigger = False - with h5py.File(h5file,'r') as hdf5_file: - group = hdf5_file['/devices/'+device_name] - device_props = labscript_utils.properties.get(hdf5_file,device_name,'device_properties') - if 'COUNTERS' in group: - data = group['COUNTERS'][:] - if len(group): - send_trigger = True - # get trace compression options - self.comp_settings = {'compression':device_props['compression'], - 'compression_opts':device_props['compression_opts'], - 'shuffle':device_props['shuffle']} - - if data is not None: - #check if refresh needed - if not fresh: - try: - refresh = not np.all(np.equal(data,self.smart_cache['COUNTERS'])) - except ValueError: - # arrays not of same size - refresh = True - if fresh or refresh: - for connection,typ,pol in data: - chan_num = int(connection.split(' ')[-1]) - self.connection.write(':MEAS:{0:s}{1:s} CHAN{2:d}'.format(pol,typ,chan_num)) - - self.smart_cache['COUNTERS'] = data - - if send_trigger: - # put scope into single mode - # necessary since :WAV:DATA? clears data and wait for fresh data - # when in continuous run mode - self.connection.write(self.dig_command) - - return self.final_values - - def transition_to_manual(self,abort = False): - if not abort: - with h5py.File(self.h5_file,'r') as hdf5_file: - # get acquisitions table values so we can close the file - try: - location = '/devices/'+self.device_name+'/ANALOG_ACQUISITIONS' - analog_acquisitions = hdf5_file[location][()] - trigger_time = hdf5_file[location].attrs['trigger_time'] - except: - # No analog acquisitions! - analog_acquisitions = np.empty(0) - try: - location = '/devices/'+self.device_name+'/POD1_ACQUISITIONS' - pod1_acquisitions = hdf5_file[location][()] - trigger_time = hdf5_file[location].attrs['trigger_time'] - except: - # No acquisitions in first digital Pod - pod1_acquisitions = np.empty(0) - try: - location = '/devices/'+self.device_name+'/POD2_ACQUISITIONS' - pod2_acquisitions = hdf5_file[location][()] - trigger_time = hdf5_file[location].attrs['trigger_time'] - except: - # No acquisitions in second digital Pod - pod2_acquisitions = np.empty(0) - try: - location = '/devices/'+self.device_name+'/COUNTERS' - counters = hdf5_file[location][()] - trigger_time = hdf5_file[location].attrs['trigger_time'] - except: - # no counters - counters = np.empty(0) - # return if no acquisitions at all - if not len(analog_acquisitions) and not len(pod1_acquisitions) and not len(pod2_acquisitions) and not len(counters): - return True - # close lock on h5 to read from scope, it takes a while - - data = {} - # read analog channels if they exist - if len(analog_acquisitions): - for connection,label in analog_acquisitions: - channel_num = int(connection.decode('UTF-8').split(' ')[-1]) - # read an analog channel - # use larger chunk size for faster large data reads - [form,typ,Apts,cnt,Axinc,Axor,Axref,yinc,yor,yref] = self.connection.query_ascii_values(self.read_analog_parameters_string.format(channel_num)) - if Apts*2+11 >= 400000: # Note that +11 accounts for IEEE488.2 waveform header, not true in unicode (ie Python 3+) - default_chunk = self.connection.chunk_size - self.connection.chunk_size = int(Apts*2+11) - raw_data = self.connection.query_binary_values(self.read_waveform_string,datatype='H', is_big_endian=True, container=np.array) - if Apts*2+11 >= 400000: - self.connection.chunk_size = default_chunk - data[connection] = self.analog_waveform_parser(raw_data,yor,yinc,yref) - # create the time array - data['Analog Time'] = np.arange(Axref,Axref+Apts,1,dtype=np.float64)*Axinc + Axor - - # read pod 1 channels if necessary - if len(pod1_acquisitions): - # use larger chunk size for faster large data reads - [form,typ,Dpts,cnt,Dxinc,Dxor,Dxref,yinc,yor,yref] = self.connection.query_ascii_values(self.read_dig_parameters_string.format(1)) - if Dpts+11 >= 400000: - default_chunk = self.connection.chunk_size - self.connection.chunk_size = int(Dpts+11) - raw_data = self.connection.query_binary_values(self.read_waveform_string,datatype='B',is_big_endian=True,container=np.array) - if Dpts+11 >= 400000: - self.connection.chunk_size = default_chunk - conv_data = self.digital_pod_parser(raw_data) - # parse out desired channels - for connection,label in pod1_acquisitions: - channel_num = int(connection.split(' ')[-1]) - data[connection] = conv_data[:,(7-channel_num)%8] - - # read pod 2 channels if necessary - if len(pod2_acquisitions): - # use larger chunk size for faster large data reads - [form,typ,Dpts,cnt,Dxinc,Dxor,Dxref,yinc,yor,yref] = self.connection.query_ascii_values(self.read_dig_parameters_string.format(2)) - if Dpts+11 >= 400000: - default_chunk = self.connection.chunk_size - self.connection.chunk_size = int(Dpts+11) - raw_data = self.connection.query_binary_values(self.read_waveform_string,datatype='B',is_big_endian=True,container=np.array) - if Dpts+11 >= 400000: - self.connection.chunk_size = default_chunk - conv_data = self.digital_pod_parser(raw_data) - # parse out desired channels - for connection,label in pod2_acquisitions: - channel_num = int(connection.split(' ')[-1]) - data[connection] = conv_data[:,(15-channel_num)%8] - - if len(pod1_acquisitions) or len(pod2_acquisitions): - # create the digital time array if needed - # Note that digital traces always have fewer pts than analog - data['Digital Time'] = np.arange(Dxref,Dxref+Dpts,1,dtype=np.float64)*Dxinc + Dxor - - # read counters if necesary - count_data = {} - if len(counters): - for connection,typ,pol in counters: - chan_num = int(connection.decode('UTF-8').split(' ')[-1]) - count_data[connection] = float(self.connection.query(self.read_counter_string.format(pol,typ,chan_num))) - - # define the dtypes for the h5 arrays - dtypes_analog = np.dtype({'names':['t','values'],'formats':[np.float64,np.float32]}) - dtypes_digital = np.dtype({'names':['t','values'],'formats':[np.float64,np.uint8]}) - - # re-open lock on h5file to save data - with h5py.File(self.h5_file,'r+') as hdf5_file: - try: - measurements = hdf5_file['/data/traces'] - except: - # Group doesn't exist yet, create it - measurements = hdf5_file.create_group('/data/traces') - # write out the data to the h5file - for connection,label in analog_acquisitions: - values = np.empty(len(data[connection]),dtype=dtypes_analog) - values['t'] = data['Analog Time'] - values['values'] = data[connection] - measurements.create_dataset(label, data=values, - **self.comp_settings) - # and save some timing info for reference to labscript time - measurements[label].attrs['trigger_time'] = trigger_time - for connection,label in pod1_acquisitions: - values = np.empty(len(data[connection]),dtype=dtypes_digital) - values['t'] = data['Digital Time'] - values['values'] = data[connection] - measurements.create_dataset(label, data=values, - **self.comp_settings) - # and save some timing info for reference to labscript time - measurements[label].attrs['trigger_time'] = trigger_time - for connection,label in pod2_acquisitions: - values = np.empty(len(data[connection]),dtype=dtypes_digital) - values['t'] = data['Digital Time'] - values['values'] = data[connection] - measurements.create_dataset(label, data=values, - **self.comp_settings) - # and save some timing info for reference to labscript time - measurements[label].attrs['trigger_time'] = trigger_time - - # Now read out the counters if they exist - if len(counters): - try: - counts = hdf5_file['/data/'+self.device_name] - except: - counts = hdf5_file.create_group('/data/'+self.device_name) - - for connection,typ,pol in counters: - counts.attrs['{0:s}:{1:s}{2:s}'.format(connection,pol,typ)] = count_data[connection] - counts.attrs['trigger_time'] = trigger_time - - return True - - def check_status(self): - '''Periodically called by BLACS to check to status of the scope.''' - # Scope don't say anything useful in the stb, - # using the event register instead - esr = int(self.connection.query('*ESR?')) - - # if esr is non-zero, read out the error message and report - if (esr & self.esr_mask) != 0: - # read out errors from queue until response == 0 - err_string = '' - while True: - code, return_string = self.error_parser(self.connection.query(':SYST:ERR?')) - if code != 0: - err_string += return_string - else: - break - - raise LabscriptError('Keysight Scope VISA device {0:s} has Errors in Queue: \n{1:s}'.format(self.VISA_name,err_string)) - return self.convert_register(esr) - - - diff --git a/labscript_devices/naqslab_devices/KeysightXSeries/labscript_device.py b/labscript_devices/naqslab_devices/KeysightXSeries/labscript_device.py deleted file mode 100644 index 66888f35..00000000 --- a/labscript_devices/naqslab_devices/KeysightXSeries/labscript_device.py +++ /dev/null @@ -1,112 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/KeysightXSeries/labscript_device.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -import numpy as np - -from labscript_devices.naqslab_devices import ScopeChannel, CounterScopeChannel -from labscript import Device, TriggerableDevice, config, LabscriptError, set_passed_properties - -__version__ = '0.1.0' -__author__ = ['dihm'] - -class KeysightXScope(TriggerableDevice): - description = 'Keysight X Series Digital Oscilliscope' - allowed_children = [ScopeChannel] - - @set_passed_properties(property_names = { - "device_properties":["VISA_name", - "compression","compression_opts","shuffle"]} - ) - def __init__(self, name, VISA_name, trigger_device, trigger_connection, - num_AI=4, DI=True, trigger_duration=1e-3, - compression=None, compression_opts=None, shuffle=False, **kwargs): - '''VISA_name can be full VISA connection string or NI-MAX alias. - Trigger Device should be fast clocked device. - num_AI sets number of analog input channels, default 4 - DI sets if DI are present, default True - trigger_duration set scope trigger duration, default 1ms - Compression of traces in h5 file controlled by: - compression: \'lzf\', \'gzip\', None - compression_opts: 0-9 for gzip - shuffle: True/False ''' - self.VISA_name = VISA_name - self.BLACS_connection = VISA_name - TriggerableDevice.__init__(self,name,trigger_device,trigger_connection,**kwargs) - - self.compression = compression - if (compression == 'gzip') and (compression_opts == None): - # set default compression level if needed - self.compression_opts = 4 - else: - self.compression_opts = compression_opts - self.shuffle = shuffle - - self.trigger_duration = trigger_duration - self.allowed_analog_chan = ['Channel {0:d}'.format(i) for i in range(1,num_AI+1)] - if DI: - self.allowed_pod1_chan = ['Digital {0:d}'.format(i) for i in range(0,8)] - self.allowed_pod2_chan = ['Digital {0:d}'.format(i) for i in range(8,16)] - - def generate_code(self, hdf5_file): - '''Automatically called by compiler to write acquisition instructions - to h5 file. Configures counters, analog and digital acquisitions.''' - Device.generate_code(self, hdf5_file) - trans = {'pulse':'PUL','edge':'EDG','pos':'P','neg':'N'} - - acqs = {'ANALOG':[],'POD1':[],'POD2':[]} - for channel in self.child_devices: - if channel.acquisitions: - # make sure channel is allowed - if channel.connection in self.allowed_analog_chan: - acqs['ANALOG'].append((channel.connection,channel.acquisitions[0]['label'])) - elif channel.connection in self.allowed_pod1_chan: - acqs['POD1'].append((channel.connection,channel.acquisitions[0]['label'])) - elif channel.connection in self.allowed_pod2_chan: - acqs['POD2'].append((channel.connection,channel.acquisitions[0]['label'])) - else: - raise LabscriptError('{0:s} is not a valid channel.'.format(channel.connection)) - - acquisition_table_dtypes = np.dtype({'names':['connection','label'],'formats':['a256','a256']}) - - grp = self.init_device_group(hdf5_file) - # write tables if non-empty to h5_file - for acq_group, acq_chan in acqs.items(): - if len(acq_chan): - table = np.empty(len(acq_chan),dtype=acquisition_table_dtypes) - for i, acq in enumerate(acq_chan): - table[i] = acq - grp.create_dataset(acq_group+'_ACQUISITIONS',compression=config.compression, - data=table) - grp[acq_group+'_ACQUISITIONS'].attrs['trigger_time'] = self.trigger_time - - # now do the counters - counts = [] - for channel in self.child_devices: - if hasattr(channel, 'counts'): - for counter in channel.counts: - counts.append((channel.connection, - trans[counter['type']], - trans[counter['polarity']])) - counts_table_dtypes = np.dtype({'names':['connection','type','polarity'],'formats':['a256','a256','a256']}) - counts_table = np.empty(len(counts),dtype=counts_table_dtypes) - for i,count in enumerate(counts): - counts_table[i] = count - if len(counts_table): - grp.create_dataset('COUNTERS',compression=config.compression,data=counts_table) - grp['COUNTERS'].attrs['trigger_time'] = self.trigger_time - - def acquire(self,start_time): - '''Call to define time when trigger will happen for scope.''' - if not self.child_devices: - raise LabscriptError('No channels acquiring for trigger {0:s}'.format(self.name)) - else: - self.parent_device.trigger(start_time,self.trigger_duration) - self.trigger_time = start_time diff --git a/labscript_devices/naqslab_devices/KeysightXSeries/register_classes.py b/labscript_devices/naqslab_devices/KeysightXSeries/register_classes.py deleted file mode 100644 index 7a3ea4f9..00000000 --- a/labscript_devices/naqslab_devices/KeysightXSeries/register_classes.py +++ /dev/null @@ -1,18 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/KeysightXSeries/register_classes.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -import labscript_devices - -labscript_devices.register_classes( - 'KeysightXScope', - BLACS_tab='naqslab_devices.KeysightXSeries.blacs_tab.KeysightXScopeTab', - runviewer_parser='') diff --git a/labscript_devices/naqslab_devices/NovaTechDDS/__init__.py b/labscript_devices/naqslab_devices/NovaTechDDS/__init__.py deleted file mode 100644 index cece8fad..00000000 --- a/labscript_devices/naqslab_devices/NovaTechDDS/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/NovaTechDDS/__init__.py # -# # -# Copyright 2017, Christopher Billington, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -from labscript_devices import deprecated_import_alias - - -# For backwards compatibility with old experiment scripts: -NovaTech409B = deprecated_import_alias( - "naqslab_devices.NovaTechDDS.labscript_device.NovaTech409B") - -NovaTech409B_AC = deprecated_import_alias( - "naqslab_devices.NovaTechDDS.labscript_device.NovaTech409B_AC") - -NovaTech440A = deprecated_import_alias( - "naqslab_devices.NovaTechDDS.labscript_device.NovaTech440A") diff --git a/labscript_devices/naqslab_devices/NovaTechDDS/blacs_tab.py b/labscript_devices/naqslab_devices/NovaTechDDS/blacs_tab.py deleted file mode 100644 index e0a2abfa..00000000 --- a/labscript_devices/naqslab_devices/NovaTechDDS/blacs_tab.py +++ /dev/null @@ -1,157 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/NovaTechDDS/blacs_tab.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# Source borrows heavily from labscript_devices/NovaTechDDS9m # -# # -##################################################################### -from blacs.device_base_class import DeviceTab - -class NovaTech409B_ACTab(DeviceTab): - - def __init__(self,*args,**kwargs): - if not hasattr(self,'device_worker_class'): - self.device_worker_class = "naqslab_devices.NovaTechDDS.blacs_worker.NovaTech409B_ACWorker" - DeviceTab.__init__(self,*args,**kwargs) - - def initialise_GUI(self): - # Capabilities - self.base_units = {'freq':'Hz', 'amp':'Arb', 'phase':'Degrees'} - self.base_min = {'freq':0.0, 'amp':0, 'phase':0} - self.base_max = {'freq':170.0*10.0**6, 'amp':1, 'phase':360} - self.base_step = {'freq':10**6, 'amp':1/1023., 'phase':1} - self.base_decimals = {'freq':1, 'amp':4, 'phase':3} # TODO: find out what the phase precision is! - self.num_DDS = 4 - - # Create DDS Output objects - dds_prop = {} - for i in range(self.num_DDS): # 4 is the number of DDS outputs on this device - dds_prop['channel %d' % i] = {} - for subchnl in ['freq', 'amp', 'phase']: - dds_prop['channel %d' % i][subchnl] = {'base_unit':self.base_units[subchnl], - 'min':self.base_min[subchnl], - 'max':self.base_max[subchnl], - 'step':self.base_step[subchnl], - 'decimals':self.base_decimals[subchnl] - } - # Create the output objects - self.create_dds_outputs(dds_prop) - # Create widgets for output objects - dds_widgets,ao_widgets,do_widgets = self.auto_create_widgets() - # and auto place the widgets in the UI - self.auto_place_widgets(("DDS Outputs",dds_widgets)) - - connection_object = self.settings['connection_table'].find_by_name(self.device_name) - conn_properties = connection_object.properties - - # Store the COM port to be used - blacs_connection = str(connection_object.BLACS_connection) - if ',' in blacs_connection: - self.com_port, baud_rate = blacs_connection.split(',') - self.baud_rate = int(baud_rate) - else: - self.com_port = blacs_connection - self.baud_rate = 19200 - - self.update_mode = conn_properties.get('update_mode', 'synchronous') - self.phase_mode = conn_properties.get('phase_mode', 'default') - # clocking properties - self.R_option = conn_properties.get('R_option',False) - self.ext_clk = conn_properties.get('ext_clk',False) - self.kp = conn_properties.get('kp',None) - self.clk_scale = conn_properties.get('clk_scale',1) - - # Create and set the primary worker - worker_init_kwargs = {'com_port': self.com_port, - 'baud_rate': self.baud_rate, - 'update_mode': self.update_mode, - 'phase_mode': self.phase_mode, - 'R_option': self.R_option, - 'ext_clk': self.ext_clk, - 'kp': self.kp, - 'clk_scale': self.clk_scale} - self.create_worker("main_worker", - self.device_worker_class, - worker_init_kwargs) - self.primary_worker = "main_worker" - - # Set the capabilities of this device - self.supports_remote_value_check(True) - self.supports_smart_programming(True) - - -class NovaTech409BTab(NovaTech409B_ACTab): - - def __init__(self,*args,**kwargs): - self.device_worker_class = "naqslab_devices.NovaTechDDS.blacs_worker.NovaTech409BWorker" - NovaTech409B_ACTab.__init__(self,*args,**kwargs) - -class NovaTech440ATab(NovaTech409B_ACTab): - - def __init__(self,*args,**kwargs): - if not hasattr(self,'device_worker_class'): - self.device_worker_class = "naqslab_devices.NovaTechDDS.blacs_worker.NovaTech440AWorker" - DeviceTab.__init__(self,*args,**kwargs) - - def initialise_GUI(self): - # Capabilities - self.base_units = {'freq':'Hz', 'phase':'Degrees'} - self.base_min = {'freq':200e3, 'phase':0} - self.base_max = {'freq':402.653183*10.0**6, 'phase':360} - self.base_step = {'freq':10**6, 'phase':1} - self.base_decimals = {'freq':0, 'phase':3} # TODO: find out what the phase precision is! - self.num_DDS = 1 - - # Create DDS Output objects - dds_prop = {} - for i in range(self.num_DDS): # only 1 DDS output - dds_prop['channel %d' % i] = {} - for subchnl in ['freq', 'phase']: - dds_prop['channel %d' % i][subchnl] = {'base_unit':self.base_units[subchnl], - 'min':self.base_min[subchnl], - 'max':self.base_max[subchnl], - 'step':self.base_step[subchnl], - 'decimals':self.base_decimals[subchnl] - } - # Create the output objects - self.create_dds_outputs(dds_prop) - # Create widgets for output objects - dds_widgets,ao_widgets,do_widgets = self.auto_create_widgets() - # and auto place the widgets in the UI - self.auto_place_widgets(("DDS Outputs",dds_widgets)) - - connection_object = self.settings['connection_table'].find_by_name(self.device_name) - conn_properties = connection_object.properties - - # Store the COM port to be used - blacs_connection = str(connection_object.BLACS_connection) - if ',' in blacs_connection: - self.com_port, baud_rate = blacs_connection.split(',') - self.baud_rate = int(baud_rate) - else: - self.com_port = blacs_connection - self.baud_rate = 19200 - - self.ext_clk = conn_properties.get('ext_clk',False) - self.clk_freq = conn_properties.get('clk_freq', None) - self.clk_scale = conn_properties.get('clk_scale',1) - - # Create and set the primary worker - self.create_worker("main_worker",self.device_worker_class, - {'com_port':self.com_port, - 'baud_rate': self.baud_rate, - 'ext_clk': self.ext_clk, - 'clk_freq': self.clk_freq, - 'clk_scale': self.clk_scale - }) - self.primary_worker = "main_worker" - - # Set the capabilities of this device - self.supports_remote_value_check(True) - self.supports_smart_programming(True) diff --git a/labscript_devices/naqslab_devices/NovaTechDDS/blacs_worker.py b/labscript_devices/naqslab_devices/NovaTechDDS/blacs_worker.py deleted file mode 100644 index 1515ca3b..00000000 --- a/labscript_devices/naqslab_devices/NovaTechDDS/blacs_worker.py +++ /dev/null @@ -1,453 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/NovaTechDDS/blacs_worker.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# Source borrows heavily from labscript_devices/NovaTechDDS9m # -# # -##################################################################### -from labscript import LabscriptError -from blacs.tab_base_classes import Worker - -import time -import numpy as np -import serial -import socket -import labscript_utils.h5_lock, h5py - - -class NovaTech409B_ACWorker(Worker): - def init(self): - """Initialization command run automatically by the BLACS tab on - startup. It establishes communication and sends initial default - configuration commands""" - self.smart_cache = {'STATIC_DATA': None, 'TABLE_DATA': '', - 'CURRENT_DATA':None} - self.baud_dict = {9600:b'78', 19200:b'3c', 38400:b'1e',57600:b'14',115200:b'0a'} - - self.err_codes = {b'?0':'Unrecognized Command', - b'?1':'Bad Frequency', - b'?2':'Bad AM Command', - b'?3':'Input Line Too Long', - b'?4':'Bad Phase', - b'?5':'Bad Time', - b'?6':'Bad Mode', - b'?7':'Bad Amp', - b'?8':'Bad Constant', - b'?f':'Bad Byte'} - - # total number of DDS channels on device & channel properties - self.N_chan = 4 - self.subchnls = ['freq','amp','phase'] - - # conversion dictionaries for program_static from - # program_manual - self.conv = {'freq':self.clk_scale*10**(-6),'amp':1023.0,'phase':16384.0/360.0}## check if things break 2019-02-22 - # and from transition_to_buffered - self.conv_buffered = {'freq':10**(-7),'amp':1,'phase':1} - # read from device conversion, basically conv_buffered/conv - self.read_conv = {'freq':1/(self.clk_scale*10.0),'amp':1/1023.0,'phase':360.0/16384.0} ## check if things break 2019-02-22 - - # set phase mode method - phase_mode_commands = { - 'aligned': b'm a', - 'continuous': b'm n'} - self.phase_mode_command = phase_mode_commands[self.phase_mode] - - self.connection = serial.Serial(self.com_port, baudrate = self.baud_rate, timeout=0.1) - self.connection.readlines() - - # to configure baud rate, must determine current device baud rate - # first check desired, since it's most likely - connected, response = self.check_connection() - if not connected: - # not already set - bauds = list(self.baud_dict) - if self.baud_rate in bauds: - bauds.remove(self.baud_rate) - else: - raise LabscriptError('%d baud rate not supported by Novatech 409B' % self.baud_rate) - - # iterate through other baud-rates to find current - for rate in bauds: - self.connection.baudrate = rate - connected, response = self.check_connection() - if connected: - # found it! - break - else: - raise LabscriptError('Error: Baud rate not found! Is Novatech DDS connected?') - - # now we can set the desired baud rate - baud_string = b'Kb %s\r\n' % (self.baud_dict[self.baud_rate]) - self.connection.write(baud_string) - # ensure command finishes before switching rates in pyserial - time.sleep(0.1) - self.connection.baudrate = self.baud_rate - connected, response = self.check_connection() - if not connected: - raise LabscriptError('Error: Failed to execute command "%s"' % baud_string.decode('utf8')) - - self.connection.write(b'e d\r\n') - response = self.connection.readline() - if response == b'e d\r\n': - # if echo was enabled, then the command to disable it echos back at us! - response = self.connection.readline() - if response != b'OK\r\n': - raise Exception('Error: Failed to execute command: "e d". Cannot connect to the device.') - - # set automatic updates and phase mode - self.write_check(b'M 0\r\n') - self.write_check(b'I a\r\n') - self.write_check(b'%s\r\n'%self.phase_mode_command) - - # Set clock parameters - if self.R_option: - # Using R option. Do not send C or Kp serial commands - pass - else: - # Pass kp value - self.write_check(b'Kp %02x\r\n'%self.kp) - # Pass clock setting - if self.ext_clk: - # Enable external clock - clk_command = b'C E\r\n' - else: - # Or enable internal clock - clk_command = b'C I\r\n' - self.write_check(clk_command) - - # populate the 'CURRENT_DATA' dictionary - self.check_remote_values() - - def check_connection(self): - '''Sends non-command and tests for correct response - returns tuple of connection state and reponse string''' - # check twice since false positive possible on first check - # use readlines in case echo is on - self.connection.write(b'\r\n') - self.connection.readlines() - self.connection.write(b'\r\n') - try: - response = self.connection.readlines()[-1] - connected = response == b'OK\r\n' - except IndexError: - # empty response, probably not connected - connected = False - response = b'' - - return connected, response - - def write_check(self,command): - '''Sends command and checks and confirms proper execution - by reading 'OK' from device.''' - self.connection.write(command) - response = self.check_error(self.connection.readline()) - if response != b'OK\r\n': - msg = '''Command "%s" did not execute properly.'''%command.decode('utf8') - raise Exception(dedent(msg)) - - def check_error(self,response): - '''Parse response for errors and raise appropriate error. - If no error, returns response unaltered.''' - if b'?' in response: - # there is an error in the response, - # get code number after ? - code = response.split(b'?',1)[-1][0] - try: - msg = 'NovaTech DDS at %s has error %s\n'%( - self.com_port,self.err_codes[b'?'+code]) - except KeyError: - msg = 'NovaTech DDS at %s has unrecognized error %s\n'%( - self.com_port,response.decode('utf8')) - # clear the read buffer before breaking - self.connection.readlines() - raise Exception(dedent(msg)) - - # if we didn't break, no error so return response - return response - - def check_remote_values(self): - """Queries device for current output settings. Return results as a - dictionary to update the BLACS tab.""" - self.connection.write(b'QUE\r\n') - try: - response = [self.connection.readline() for i in range(self.N_chan+1)] - except socket.timeout: - raise Exception('Failed to execute command "QUE". Cannot connect to device.') - results = {} - for i, line in enumerate(response[:self.N_chan]): - results['channel %d' % i] = {} - freq, phase, amp, ignore, ignore, ignore, ignore = line.split() - # Convert hex multiple of 0.1 Hz to Hz: - # Limit precision after converstion to 0.1 Hz - results['channel %d' % i]['freq'] = round(float(int(freq,16))*self.read_conv['freq'],1) - # Convert hex to int: - results['channel %d' % i]['amp'] = int(amp,16)*self.read_conv['amp'] - # Convert hex fraction of 16384 to degrees: - results['channel %d' % i]['phase'] = int(phase,16)*self.read_conv['phase'] - - self.smart_cache['CURRENT_DATA'] = results - return results - - def program_manual(self,front_panel_values): - """Called within the BLACS worker during transitions. This calls - program_static for each setting if it isn't already set.""" - for i in range(self.N_chan): - # and for each subchnl in the DDS, - for subchnl in self.subchnls: - # don't program if setting is the same - if self.smart_cache['CURRENT_DATA']['channel %d' % i][subchnl] == front_panel_values['channel %d' % i][subchnl]: - continue - # Program the sub channel - self.program_static(i,subchnl, - front_panel_values['channel %d' % i][subchnl]*self.conv[subchnl]) - # Now that a static update has been done, - # we'd better invalidate the saved STATIC_DATA for the channel: - self.smart_cache['STATIC_DATA'] = None - return self.check_remote_values() - - def program_static(self,channel,type,value): - """General output parameter programming function. - Only sends one command per use.""" - if type == 'freq': - command = b'F%d %.7f\r\n' % (channel,value) - elif type == 'amp': - command = b'V%d %d\r\n' % (channel,int(value)) - elif type == 'phase': - command = b'P%d %d\r\n' % (channel,int(value)) - else: - raise TypeError(type) - - self.write_check(command) - - def transition_to_buffered(self,device_name,h5file,initial_values,fresh): - - # Store the initial values in case we have to abort and restore them: - self.initial_values = initial_values - # Store the final values for use during transition_to_static: - self.final_values = initial_values - static_data = None - table_data = None - with h5py.File(h5file,'r') as hdf5_file: - group = hdf5_file['/devices/'+device_name] - # If there are values to set the unbuffered outputs to, set them now: - if 'STATIC_DATA' in group: - static_data = group['STATIC_DATA'][:][0] - # Now program the buffered outputs: - if 'TABLE_DATA' in group: - table_data = group['TABLE_DATA'][:] - # using table mode, need to reset memory pointer to zero - # Transition to table mode: - self.connection.write(b'M t\r\n') - self.connection.readline() - # And back to manual mode - self.connection.write(b'M 0\r\n') - if self.connection.readline() != b"OK\r\n": - raise Exception('Error: Failed to execute command: "%s"' % self.phase_mode_command.decode('utf8')) - - if static_data is not None: - data = static_data - if fresh or data != self.smart_cache['STATIC_DATA']: - self.smart_cache['STATIC_DATA'] = data - - # need to infer which channels to program - num_chan = len(data)//len(self.subchnls) - channels = [int(name[-1]) for name in data.dtype.names[0:num_chan]] - - for i in channels: - for subchnl in self.subchnls: - curr_value = self.smart_cache['CURRENT_DATA']['channel %d' % i][subchnl]*self.conv[subchnl] - value = data[subchnl+str(i)]*self.conv_buffered[subchnl] - if value == curr_value: - continue - else: - self.program_static(i,subchnl,value) - if subchnl == 'freq': - self.final_values['channel %d'%i][subchnl] = round(value/self.conv[subchnl],1) - self.smart_cache['CURRENT_DATA']['channel %d'%i][subchnl] = round(value*self.read_conv[subchnl],1) - else: - self.final_values['channel %d'%i][subchnl] = value/self.conv[subchnl] - self.smart_cache['CURRENT_DATA']['channel %d'%i][subchnl] = value*self.read_conv[subchnl] - - # Now program the buffered outputs: - if table_data is not None: - data = table_data - for i, line in enumerate(data): - st = time.time() - oldtable = self.smart_cache['TABLE_DATA'] - for ddsno in range(2): - if fresh or i >= len(oldtable) or (line['freq%d'%ddsno],line['phase%d'%ddsno],line['amp%d'%ddsno]) != (oldtable[i]['freq%d'%ddsno],oldtable[i]['phase%d'%ddsno],oldtable[i]['amp%d'%ddsno]): - self.connection.write(b't%d %04x %08x,%04x,%04x,ff\r\n'%(ddsno, i,line['freq%d'%ddsno],line['phase%d'%ddsno],line['amp%d'%ddsno])) - self.check_error(self.connection.readline()) # speed this up by block writing and reading and don't check errors - et = time.time() - tt=et-st - self.logger.debug('Time spent on line %s: %s' % (i,tt)) - # Store the table for future smart programming comparisons: - try: - self.smart_cache['TABLE_DATA'][:len(data)] = data - self.logger.debug('Stored new table as subset of old table') - except: # new table is longer than old table - self.smart_cache['TABLE_DATA'] = data - self.logger.debug('New table is longer than old table and has replaced it.') - - # Get the final values of table mode so that the GUI can - # reflect them after the run: - self.final_values['channel 0'] = {} - self.final_values['channel 1'] = {} - self.final_values['channel 0']['freq'] = round(data[-1]['freq0']*self.read_conv['freq'],1) - self.final_values['channel 1']['freq'] = round(data[-1]['freq1']*self.read_conv['freq'],1) - self.final_values['channel 0']['amp'] = data[-1]['amp0']*self.read_conv['amp'] - self.final_values['channel 1']['amp'] = data[-1]['amp1']*self.read_conv['amp'] - self.final_values['channel 0']['phase'] = data[-1]['phase0']*self.read_conv['phase'] - self.final_values['channel 1']['phase'] = data[-1]['phase1']*self.read_conv['phase'] - - # Transition to table mode: - self.write_check(b'm t\r\n') - if self.update_mode == 'synchronous': - # Transition to hardware synchronous updates: - self.write_check(b'I e\r\n') - # We are now waiting for a rising edge to trigger the output - # of the second table pair (first of the experiment) - elif self.update_mode == 'asynchronous': - # Output will now be updated on falling edges. - pass - else: - raise ValueError('invalid update mode %s'%self.update_mode.decode('utf8')) - - - return self.final_values - - def abort_transition_to_buffered(self): - return self.transition_to_manual(True) - - def abort_buffered(self): - # TODO: untested - return self.transition_to_manual(True) - - def transition_to_manual(self,abort = False): - self.write_check(b'M 0\r\n') - self.write_check(b'I a\r\n') - - if abort: - # If we're aborting the run, then we need to reset DDSs 2 and 3 to their initial values. - # 0 and 1 will already be in their initial values. We also need to invalidate the smart - # programming cache for them. - values = self.initial_values - DDSs = [2,3] - self.smart_cache['STATIC_DATA'] = None - else: - # If we're not aborting the run, then we need to set DDSs 0 and 1 to their final values. - # 2 and 3 will already be in their final values. - values = self.final_values - DDSs = [0,1] - - # only program the channels that we need to - for channel in values: - ddsnum = int(channel.split(' ')[-1]) - if ddsnum not in DDSs: - continue - for subchnl in self.subchnls: - self.program_static(ddsnum,subchnl,values[channel][subchnl]*self.conv[subchnl]) - - # return True to indicate we successfully transitioned back to manual mode - return True - - def shutdown(self): - self.connection.close() - -class NovaTech409BWorker(NovaTech409B_ACWorker): - - def transition_to_manual(self,abort = False): - if abort: - # If we're aborting the run, then we need to reset DDSs to their initial values. - # We also need to invalidate the smart programming cache for them. - self.smart_cache['STATIC_DATA'] = None - for channel in self.initial_values: - ddsnum = int(channel.split(' ')[-1]) - for subchnl in self.subchnls: - self.program_static(ddsnum,subchnl,self.initial_values[channel][subchnl]*self.conv[subchnl]) - else: - # if not aborting, final values already set so do nothing - pass - # return True to indicate we successfully transitioned back to manual mode - return True - -class NovaTech440AWorker(NovaTech409BWorker): - - def init(self): - """Modified init from 409B-AC. The 440A only supports one baud rate - and does not support output mode commands.""" - self.smart_cache = {'STATIC_DATA': None,'CURRENT_DATA':None} - - self.N_chan = 1 - self.subchnls = ['freq','phase'] - - # conversion dictionaries for program_static from - # program_manual - self.conv = {'freq':10**(-6),'phase':16384.0/360.0} - # and from transition_to_buffered - self.conv_buffered = {'freq':10**(-6),'phase':1} - # read from device conversion, nominally conv_buffered/conv - self.read_conv = {'freq':1/4.0,'phase':360.0/16384.0} - - self.connection = serial.Serial(self.com_port, baudrate = self.baud_rate, timeout=0.1) - self.connection.readlines() - - self.connection.write(b'e d\r\n') - response = self.connection.readline() - - if response == b'e d\r\n': - # if echo was enabled, then the command to disable it echos back at us! - response = self.connection.readline() - if response != b'OK\r\n': - raise Exception('Error: Failed to execute command: "e d". Cannot connect to the device.') - - # configure external clocking - if self.ext_clk: - self.write_check(b'Fr %.3f\r\n' % self.clk_freq) - self.write_check(b'C E\r\n') - else: - self.write_check(b'C D\r\n') - - # populate the 'CURRENT_DATA' dictionary - self.check_remote_values() - - def program_static(self,channel,type,value): - """General output parameter programming function. Only sends one command - per use.""" - if type == 'freq': - command = b'F%d %.6f\r\n' % (channel,value) #only 6 decimal places for 440A - elif type == 'phase': - command = b'P%d %d\r\n' % (channel,int(value)) - else: - raise TypeError(type) - self.write_check(command) - - def check_remote_values(self): - """The 440A Query command returns values in a different order and does - not tell the amplitude.""" - # Get the currently output values: - self.connection.write(b'QUE\r\n') - try: - response = self.check_error(self.connection.readline()) - except socket.timeout: - raise Exception('Failed to execute command "QUE". Cannot connect to device.') - - results = {} - results['channel 0'] = {} - phase, freq, ignore, ignore, ignore, ignore = response.split() - # Convert hex multiple in 0.25 Hz units to Hz: - results['channel 0']['freq'] = float(int(freq,16))*self.read_conv['freq'] - - # Convert hex fraction of 16384 to degrees: - results['channel 0']['phase'] = int(phase,16)*self.read_conv['phase'] - - self.smart_cache['CURRENT_DATA'] = results - - return results diff --git a/labscript_devices/naqslab_devices/NovaTechDDS/labscript_device.py b/labscript_devices/naqslab_devices/NovaTechDDS/labscript_device.py deleted file mode 100644 index 9ea81cca..00000000 --- a/labscript_devices/naqslab_devices/NovaTechDDS/labscript_device.py +++ /dev/null @@ -1,492 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/NovaTechDDS/labscript_device.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# Source borrows heavily from labscript_devices/NovaTechDDS9m # -# # -##################################################################### -from labscript import IntermediateDevice, DDS, StaticDDS, Device, config, LabscriptError, set_passed_properties -from labscript_utils.unitconversions import NovaTechDDS9mFreqConversion, NovaTechDDS9mAmpConversion - -import numpy as np -import warnings -import labscript_utils.h5_lock, h5py - -__version__ = '1.0.0' -__author__ = ['dihm'] - - -class NovaTech409B_AC(IntermediateDevice): - description = 'NT-DDS409B-AC' - allowed_children = [DDS, StaticDDS] - clock_limit = 9990 # This is a realistic estimate of the max clock rate - # (100us for TS/pin10 processing to load next value into buffer and - # 100ns pipeline delay on pin 14 edge to update output values) - - @set_passed_properties( - property_names = {'connection_table_properties': ['update_mode', - 'synchronous_first_line_repeat', - 'phase_mode', 'ext_clk', 'clk_freq', 'kp', - 'R_option', 'clk_scale']} - ) - def __init__(self, name, parent_device, - com_port = "", baud_rate=19200, - update_mode='synchronous', synchronous_first_line_repeat=False, - phase_mode='continuous', - ext_clk=False, clk_freq=None, clk_mult=None, - R_option=False, - **kwargs): - '''Labscript device class for NovaTech 409B-AC variant DDS. - This device has two dynamic channels (0,1) and two static - channels (2,3). If an external clock frequency is enabled, - and /R option is not being used, clk_freq (in MHz) - and clk_mult (int) must also be defined.''' - - IntermediateDevice.__init__(self, name, parent_device, **kwargs) - self.BLACS_connection = '%s,%s' % (com_port, str(baud_rate)) - if not update_mode in ['synchronous', 'asynchronous']: - raise LabscriptError('update_mode must be \'synchronous\' or \'asynchronous\'') - - if not phase_mode in ['aligned', 'continuous']: - raise LabscriptError('phase_mode must be \'aligned\' or \'continuous\'') - - self.update_mode = update_mode - self.phase_mode = phase_mode - self.synchronous_first_line_repeat = synchronous_first_line_repeat - self.ext_clk = ext_clk - self.clk_freq = clk_freq - self.R_option = R_option - self.clk_mult = clk_mult - - # validate clocking parameters and get frequency scaling factor - self.clk_scale = self.clock_check() - # save dds reference frequency, defined as clk_freq*clk_mult - self.set_property('reference_frequency', self.ref_freq, location='device_properties') - - def clock_check(self): - """Checks to make sure clk_mult and clk_freq have valid values, - as determined by the Novatech documentation. - Returns the correct frequency scaling factor to - account for different clocking options.""" - # hard-coded default values when using the internal clock - int_clock = 28.6331153067 - int_ref = 429.4967296 - - # Check R option. If true, then exit method - if self.R_option: - # Using 409b with /R option. Do nothing else - # Requires 10 MHz external clock. - clk_scale = 1 - return clk_scale - - # R option not used. Check external clock - if not self.ext_clk: - # using internal clock or R option - # set default values for kp, clk_freq, and clk_scale - self.clk_freq = int_clock - if self.clk_mult == None: - # use default value of kp - self.kp = 15 - self.ref_freq = int_ref - clk_scale = 1 - return clk_scale - else: - msg = '''Novatech DDS at %s is attempting to use the internal - clock with non-default clock multiplier %d. Are you sure?''' - msg = dedent(msg) % (self.BLACS_connection, self.clk_mult) - warnings.warn(msg, stacklevel=2) - - # Check that kp and clk_freq were supplied - try: - f = self.clk_mult*self.clk_freq - except TypeError: - msg = '''Must supply external clock frequency and clock - multiplier when using external clock!''' - raise LabscriptError(dedent(msg)) - - self.kp = self.clk_mult - self.ref_freq = f - - # Check that self.kp is valid, then frequency is valid. Also return modified clock multiplier - if self.clk_mult == 1: - # Check frequency range for kp = 1 - if f < 1 or 500 < f: - msg = '''Supplied clock frequency (%f MHz) - with clk_mult = 1 must be between 1 and 500 MHz.''' - msg = dedent(msg) % f - raise LabscriptError(msg) - # No need to change fre - elif self.clk_mult in range(4,21): - # Check if f is a good value and modify kp if so - if 100 <= f and f <= 160 : - # Must add 64 to decimal value. See 4.10 Range bit in the documentation - self.kp += 64 - elif 255 <= f and f <= 500: - # Must add 128 to decimal value. See 4.10 Range bit in the documentation - self.kp += 128 - else: - msg = '''Derived system clock frequency - (clk_mult*clk_freq = %f MHz) using the clock multiplier - must be between (100,160) or (255,500) MHz.''' - msg = dedent(msg) % f - raise LabscriptError(msg) - clk_scale = int_ref/(self.clk_mult*self.clk_freq) - return clk_scale - - def add_device(self, device): - Device.add_device(self, device) - # The Novatech doesn't support 0Hz output; set the default frequency of the DDS to 0.1 Hz: - device.frequency.default_value = 0.1 - - def get_default_unit_conversion_classes(self, device): - """Child devices call this during their __init__ (with themselves - as the argument) to check if there are certain unit calibration - classes that they should apply to their outputs, if the user has - not otherwise specified a calibration class""" - if device.connection in ['channel 0', 'channel 1', 'channel 2', 'channel 3']: - # Default calibration classes for the non-static channels: - return NovaTechDDS9mFreqConversion, NovaTechDDS9mAmpConversion, None - else: - return None, None, None - - - def quantise_freq(self, data, device): - """Provides bounds error checking and scales input values to instrument - units (0.1 Hz) before ensuring uint32 integer type.""" - if not isinstance(data, np.ndarray): - data = np.array(data) - # Ensure that frequencies are within bounds: - if np.any(data > 171.1276031e6 ) or np.any(data < 0.1 ): - raise LabscriptError('%s %s ' % (device.description, device.name) + - 'can only have frequencies between 0.1Hz and 171MHz, ' + - 'the limit imposed by %s.' % self.name) - # Factor of 10 is to convert to units of 0.1 Hz. - scale_factor = 10*self.clk_scale # Need to multiply by clk scale factor - - # It's faster to add 0.5 then typecast than to round to integers first: - data = np.array((scale_factor*data)+0.5,dtype=np.uint32) - return data, scale_factor - - def quantise_phase(self, data, device): - """Ensures phase is wrapped about 360 degrees and scales to instrument - units before type casting to uint16.""" - if not isinstance(data, np.ndarray): - data = np.array(data) - # ensure that phase wraps around: - data %= 360 - # It's faster to add 0.5 then typecast than to round to integers first: - scale_factor = 16384/360.0 - data = np.array((scale_factor*data)+0.5,dtype=np.uint16) - return data, scale_factor - - def quantise_amp(self,data,device): - """Ensures amplitude is within bounds and scales to instrument units - (between 0 and 1023) before typecasting to uint16""" - if not isinstance(data, np.ndarray): - data = np.array(data) - # ensure that amplitudes are within bounds: - if np.any(data > 1 ) or np.any(data < 0): - raise LabscriptError('%s %s ' % (device.description, device.name) + - 'can only have amplitudes between 0 and 1 (Volts peak to peak approx), ' + - 'the limit imposed by %s.' % self.name) - # It's faster to add 0.5 then typecast than to round to integers first: - data = np.array((1023*data)+0.5,dtype=np.uint16) - scale_factor = 1023 - return data, scale_factor - - def generate_code(self, hdf5_file): - DDSs = {} - for output in self.child_devices: - # Check that the instructions will fit into RAM: - if isinstance(output, DDS) and len(output.frequency.raw_output) > 16384 - 2: # -2 to include space for dummy instructions - raise LabscriptError('%s can only support 16383 instructions. ' % self.name + - 'Please decrease the sample rates of devices on the same clock, ' + - 'or connect %s to a different pseudoclock.' % self.name) - try: - prefix, channel = output.connection.split() - channel = int(channel) - except: - raise LabscriptError('%s %s has invalid connection string: \'%s\'. ' % (output.description,output.name,str(output.connection)) + - 'Format must be \'channel n\' with n from 0 to 4.') - DDSs[channel] = output - - if not DDSs: - # if no channels are being used, no need to continue - return - - for connection in DDSs: - if connection in range(4): - dds = DDSs[connection] - dds.frequency.raw_output, dds.frequency.scale_factor = self.quantise_freq(dds.frequency.raw_output, dds) - dds.phase.raw_output, dds.phase.scale_factor = self.quantise_phase(dds.phase.raw_output, dds) - dds.amplitude.raw_output, dds.amplitude.scale_factor = self.quantise_amp(dds.amplitude.raw_output, dds) - else: - raise LabscriptError('%s %s has invalid connection string: \'%s\'. ' % (dds.description,dds.name,str(dds.connection)) + - 'Format must be \'channel n\' with n from 0 to 4.') - - # determine what types of channels are needed - stat_DDSs = set(DDSs)&set(range(2,4)) - if set(DDSs)&set(range(2)): - dyn_DDSs = range(2) - else: - dyn_DDSs = [] - - if dyn_DDSs: - # only do dynamic channels if needed - dtypes = {'names':['freq%d' % i for i in dyn_DDSs] + - ['amp%d' % i for i in dyn_DDSs] + - ['phase%d' % i for i in dyn_DDSs], - 'formats':[np.uint32 for i in dyn_DDSs] + - [np.uint16 for i in dyn_DDSs] + - [np.uint16 for i in dyn_DDSs]} - - clockline = self.parent_clock_line - pseudoclock = clockline.parent_device - times = pseudoclock.times[clockline] - - out_table = np.zeros(len(times),dtype=dtypes) - out_table['freq0'].fill(1) - out_table['freq1'].fill(1) - - for connection in range(2): - if not connection in DDSs: - continue - dds = DDSs[connection] - # The last two instructions are left blank, for BLACS - # to fill in at program time. - out_table['freq%d' % connection][:] = dds.frequency.raw_output - out_table['amp%d' % connection][:] = dds.amplitude.raw_output - out_table['phase%d' % connection][:] = dds.phase.raw_output - - if self.update_mode == 'asynchronous' or self.synchronous_first_line_repeat: - # Duplicate the first line of the table. Otherwise, we are one step - # ahead in the table from the start of a run. In asynchronous - # updating mode, this is necessary since the first line of the - # table is already being output before the first trigger from - # the master clock. When using a simple delay line for synchronous - # output, this also seems to be required, in which case - # synchronous_first_line_repeat should be set to True. - # However, when a tristate driver is used as described at - # http://labscriptsuite.org/blog/implementation-of-the-novatech-dds9m/ - # then is is not neccesary to duplicate the first line. Use of a - # tristate driver in this way is the correct way to use - # the novatech DDS, as per its instruction manual, and so is likely - # to be the most reliable. However, through trial and error we've - # determined that duplicating the first line like this gives correct - # output in asynchronous mode and in synchronous mode when using a - # simple delay line, at least for the specific device we tested. - # Your milage may vary. - out_table = np.concatenate([out_table[0:1], out_table]) - - if stat_DDSs: - # only do static channels if needed - static_dtypes = {'names':['freq%d' % i for i in stat_DDSs] + - ['amp%d' % i for i in stat_DDSs] + - ['phase%d' % i for i in stat_DDSs], - 'formats':[np.uint32 for i in stat_DDSs] + - [np.uint16 for i in stat_DDSs] + - [np.uint16 for i in stat_DDSs]} - - static_table = np.zeros(1, dtype=static_dtypes) - - for connection in range(2,4): - if not connection in DDSs: - continue - dds = DDSs[connection] - static_table['freq%d' % connection] = dds.frequency.raw_output[0] - static_table['amp%d' % connection] = dds.amplitude.raw_output[0] - static_table['phase%d' % connection] = dds.phase.raw_output[0] - - # write out data tables - grp = self.init_device_group(hdf5_file) - if dyn_DDSs: - grp.create_dataset('TABLE_DATA',compression=config.compression,data=out_table) - if stat_DDSs: - grp.create_dataset('STATIC_DATA',compression=config.compression,data=static_table) - self.set_property('frequency_scale_factor', dds.frequency.scale_factor, location='device_properties') - self.set_property('amplitude_scale_factor', dds.amplitude.scale_factor, location='device_properties') - self.set_property('phase_scale_factor', dds.phase.scale_factor, location='device_properties') - - -class NovaTech409B(NovaTech409B_AC): - description = 'NT-DDS409B' - allowed_children = [StaticDDS] - clock_limit = 1 - # this is not a triggerable device - - @set_passed_properties( - property_names = {'connection_table_properties': ['phase_mode', - 'ext_clk', 'clk_freq', 'kp', - 'R_option', 'clk_scale']}) - def __init__(self, name, - com_port = "", baud_rate=19200, - phase_mode='default', R_option=False, - ext_clk=False, clk_freq=None, clk_mult=None, **kwargs): - '''Labscript class for NovaTech 409B DDS. - This device has four static DDS output channels.''' - - Device.__init__(self, name, None, com_port, **kwargs) - self.BLACS_connection = '{:s},{:s}'.format(com_port, str(baud_rate)) - - if not phase_mode in ['default', 'aligned', 'continuous']: - raise LabscriptError('phase_mode must be \'default\', \'aligned\' or \'continuous\'') - - self.phase_mode = phase_mode - self.R_option = R_option - self.ext_clk = ext_clk - self.clk_mult = clk_mult - self.clk_freq = clk_freq - - self.clk_scale = self.clock_check() - - def generate_code(self, hdf5_file): - """Modified version of 409B-AC generate_code that only handles static - DDS outputs""" - DDSs = {} - for output in self.child_devices: - try: - prefix, channel = output.connection.split() - channel = int(channel) - except: - raise LabscriptError('{:s} {:s} has invalid connection string: \'{:s}\'. '.format(output.description,output.name,str(output.connection)) + - 'Format must be \'channel n\' with n from 0 to 3.') - DDSs[channel] = output - - if not DDSs: - # if no channels are being used, no need to continue - return - - for connection in DDSs: - if connection in range(4): - # Static DDS - dds = DDSs[connection] - dds.frequency.raw_output, dds.frequency.scale_factor = self.quantise_freq(dds.frequency.static_value, dds) - dds.phase.raw_output, dds.phase.scale_factor = self.quantise_phase(dds.phase.static_value, dds) - dds.amplitude.raw_output, dds.amplitude.scale_factor = self.quantise_amp(dds.amplitude.static_value, dds) - else: - raise LabscriptError('{:s} {:s} has invalid connection string: \'{:s}\'. '.format(dds.description,dds.name,str(dds.connection)) + - 'Format must be \'channel n\' with n from 0 to 3.') - - static_dtypes = {'names':['freq{:d}'.format(i) for i in DDSs] + - ['amp{:d}'.format(i) for i in DDSs] + - ['phase{:d}'.format(i) for i in DDSs], - 'formats':[np.uint32 for i in DDSs] + - [np.uint16 for i in DDSs] + - [np.uint16 for i in DDSs]} - - static_table = np.zeros(1, dtype=static_dtypes) - - for connection in DDSs: - dds = DDSs[connection] - static_table['freq{:d}'.format(connection)] = dds.frequency.raw_output - static_table['amp{:d}'.format(connection)] = dds.amplitude.raw_output - static_table['phase{:d}'.format(connection)] = dds.phase.raw_output - - grp = self.init_device_group(hdf5_file) - grp.create_dataset('STATIC_DATA',compression=config.compression,data=static_table) - self.set_property('frequency_scale_factor', dds.frequency.scale_factor, location='device_properties') - self.set_property('amplitude_scale_factor', dds.amplitude.scale_factor, location='device_properties') - self.set_property('phase_scale_factor', dds.phase.scale_factor, location='device_properties') - -class NovaTech440A(NovaTech409B_AC): - description = 'NT-DDS440A' - allowed_children = [StaticDDS] - clock_limit = 1 - # this is not a triggerable device - @set_passed_properties( - property_names = {'connection_table_properties': [ - 'ext_clk', 'clk_freq','clk_scale']}) - def __init__(self, name, - com_port = "", baud_rate=19200, - ext_clk=False, clk_freq=None, **kwargs): - """Labscript class for Novatech 440A DDS. This is a high frequency - DDS with single channel output that does not support amplitude control""" - - Device.__init__(self, name, None, com_port, **kwargs) - self.BLACS_connection = '{:s},{:s}'.format(com_port, str(baud_rate)) - - if ext_clk and (clk_freq >= 1 and clk_freq <= 25): - msg = '''Must define clk_freq (in MHz) if using an external clock. - Supplied frequency must be between 1 and 25 MHz. Device - rounds down to nearest 8 kHz multiple.''' - raise LabscriptError(dedent(msg)) - self.ext_clk = ext_clk - self.clk_freq = clk_freq - - self.clk_scale = 1 - - def add_device(self, device): - Device.add_device(self, device) - # The Novatech doesn't support 0Hz output; - # set the default frequency of the DDS to 200 kHz: - device.frequency.default_value = 200e3 - - def quantise_freq(self, data, device): - if not isinstance(data, np.ndarray): - data = np.array(data) - # Ensure that frequencies are within bounds: - if np.any(data > 402.653183e6 ) or np.any(data < 0.2e3 ): - msg = """%s %s - can only have frequencies between 200kHz and 402MHz, - this limit imposed by %s.""" - msg = dedent(msg) % (device.description, device.name, self.name) - raise LabscriptError(msg) - # It's faster to add 0.5 then typecast than to round to integers first: - data = np.array((data)+0.5,dtype=np.uint32) - scale_factor = 1 - return data, scale_factor - - def generate_code(self, hdf5_file): - """Modified generate code from 409B to only accept one channel and - ignore amplitude commands which are not supported by the device.""" - DDSs = {} - for output in self.child_devices: - try: - prefix, channel = output.connection.split() - channel = int(channel) - except: - raise LabscriptError('{:s} {:s} has invalid connection string: \'{:s}\'. '.format(output.description,output.name,str(output.connection)) + - 'Format must be \'channel 0\'.') - DDSs[channel] = output - - if not DDSs: - # if no channels are being used, no need to continue - return - - for connection in DDSs: - if connection in range(1): - # Static DDS - dds = DDSs[connection] - dds.frequency.raw_output, dds.frequency.scale_factor = self.quantise_freq(dds.frequency.static_value, dds) - dds.phase.raw_output, dds.phase.scale_factor = self.quantise_phase(dds.phase.static_value, dds) - else: - raise LabscriptError('{:s} {:s} has invalid connection string: \'{:s}\'. '.format(dds.description,dds.name,str(dds.connection)) + - 'Format must be \'channel 0\'.') - - if dds.amplitude.static_value != 0.0: - # user has tried to set amplitude away from default - raise LabscriptError('{:s}:{:s} does not have controllable amplitude'.format(self.name, dds.name)) - - static_dtypes = {'names':['freq{:d}'.format(i) for i in DDSs] + - ['phase{:d}'.format(i) for i in DDSs], - 'formats':[np.uint32 for i in DDSs] + - [np.uint16 for i in DDSs] + - [np.uint16 for i in DDSs]} - - static_table = np.zeros(1, dtype=static_dtypes) - - for connection in DDSs: - dds = DDSs[connection] - static_table['freq{:d}'.format(connection)] = dds.frequency.raw_output - static_table['phase{:d}'.format(connection)] = dds.phase.raw_output - - grp = self.init_device_group(hdf5_file) - grp.create_dataset('STATIC_DATA',compression=config.compression,data=static_table) - self.set_property('frequency_scale_factor', dds.frequency.scale_factor, location='device_properties') - self.set_property('phase_scale_factor', dds.phase.scale_factor, location='device_properties') diff --git a/labscript_devices/naqslab_devices/NovaTechDDS/register_classes.py b/labscript_devices/naqslab_devices/NovaTechDDS/register_classes.py deleted file mode 100644 index c667fca9..00000000 --- a/labscript_devices/naqslab_devices/NovaTechDDS/register_classes.py +++ /dev/null @@ -1,30 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/NovaTechDDS/register_classes.py # -# # -# Copyright 2017, Christopher Billington, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -import labscript_devices - -labscript_devices.register_classes( - 'NovaTech409B', - BLACS_tab='naqslab_devices.NovaTechDDS.blacs_tab.NovaTech409BTab', - runviewer_parser='naqslab_devices.NovaTechDDS.runviewer_parser.NovaTech409BParser', -) - -labscript_devices.register_classes( - 'NovaTech409B_AC', - BLACS_tab='naqslab_devices.NovaTechDDS.blacs_tab.NovaTech409B_ACTab', - runviewer_parser='naqslab_devices.NovaTechDDS.runviewer_parser.NovaTech409B_ACParser', -) - -labscript_devices.register_classes( - 'NovaTech440A', - BLACS_tab='naqslab_devices.NovaTechDDS.blacs_tab.NovaTech440ATab', - runviewer_parser='naqslab_devices.NovaTechDDS.runviewer_parser.NovaTech440AParser') diff --git a/labscript_devices/naqslab_devices/NovaTechDDS/runviewer_parser.py b/labscript_devices/naqslab_devices/NovaTechDDS/runviewer_parser.py deleted file mode 100644 index 355404ad..00000000 --- a/labscript_devices/naqslab_devices/NovaTechDDS/runviewer_parser.py +++ /dev/null @@ -1,85 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/NovaTechDDS/runviewer_parser.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# Source borrows heavily from labscript_devices/NovaTechDDS9m # -# # -##################################################################### -import numpy as np -import labscript_utils.h5_lock, h5py - - -class NovaTech409B_ACParser(object): - def __init__(self, path, device): - self.path = path - self.name = device.name - self.device = device - self.dyn_chan = [0,1] - self.static_chan = [2,3] - - def get_traces(self, add_trace, clock=None): - if clock is None: - # we're the master pseudoclock, software triggered. So we don't have to worry about trigger delays, etc - raise Exception('No clock passed to %s. A NovaTechDDS must be clocked by another device.' % self.name) - - times, clock_value = clock[0], clock[1] - - clock_indices = np.where((clock_value[1:]-clock_value[:-1])==1)[0]+1 - # If initial clock value is 1, then this counts as a rising edge (clock should be 0 before experiment) - # but this is not picked up by the above code. So we insert it! - if clock_value[0] == 1: - clock_indices = np.insert(clock_indices, 0, 0) - clock_ticks = times[clock_indices] - - # get the data out of the H5 file - data = {} - with h5py.File(self.path, 'r') as hdf5_file: - if 'TABLE_DATA' in hdf5_file['devices/%s' % self.name]: - table_data = hdf5_file['devices/%s/TABLE_DATA' % self.name][:] - connection_table_properties = labscript_utils.properties.get(hdf5_file, self.name, 'connection_table_properties') - update_mode = getattr(connection_table_properties, 'update_mode', 'synchronous') - synchronous_first_line_repeat = getattr(connection_table_properties, 'synchronous_first_line_repeat', False) - if update_mode == 'asynchronous' or synchronous_first_line_repeat: - table_data = table_data[1:] - for i in self.dyn_chan: - for sub_chnl in ['freq', 'amp', 'phase']: - data['channel %d_%s' % (i,sub_chnl)] = table_data['%s%d' % (sub_chnl,i)][:] - - if 'STATIC_DATA' in hdf5_file['devices/%s' % self.name]: - static_data = hdf5_file['devices/%s/STATIC_DATA' % self.name][:] - num_chan = len(static_data)//3 - channels = [int(name[-1]) for name in static_data.dtype.names[0:num_chan]] - for i in channels: - for sub_chnl in ['freq', 'amp', 'phase']: - data['channel %d_%s' % (i,sub_chnl)] = np.empty((len(clock_ticks),)) - data['channel %d_%s' % (i,sub_chnl)].fill(static_data['%s%d' % (sub_chnl,i)][0]) - - - for channel, channel_data in data.items(): - data[channel] = (clock_ticks, channel_data) - - for channel_name, channel in self.device.child_list.items(): - for subchnl_name, subchnl in channel.child_list.items(): - connection = '%s_%s' % (channel.parent_port, subchnl.parent_port) - if connection in data: - add_trace(subchnl.name, data[connection], self.name, connection) - - return {} - -class NovaTech409BParser(NovaTech409B_ACParser): - def __init__(self, path, device): - NovaTech409B_ACParser.__init__(self,path,device) - self.dyn_chan = [] - self.static_chan = [0,1,2,3] - -class NovaTech440AParser(NovaTech409B_ACParser): - def __init__(self, path, device): - NovaTech409B_ACParser.__init__(self,path,device) - self.dyn_chan = [] - self.static_chan = [0] diff --git a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/__init__.py b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/__init__.py deleted file mode 100644 index f5726129..00000000 --- a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/PulseBlasterESRPro300/__init__.py # -# # -# # -##################################################################### -from labscript_devices import deprecated_import_alias - - -# For backwards compatibility with old experiment scripts: -PulseBlasterESRPro300 = deprecated_import_alias( - "naqslab_devices.PulseBlasterESRPro300.labscript_device.PulseBlasterESRPro300") diff --git a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_tab.py b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_tab.py deleted file mode 100644 index c6029353..00000000 --- a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_tab.py +++ /dev/null @@ -1,32 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/PulseblasterESRpro300/blacs_tab.py # -# # -# Copyright 2013, Monash University # -# # -# This file is part of labscript_devices, in the labscript suite # -# (see http://labscriptsuite.org), and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -from labscript_devices.PulseBlaster_No_DDS import Pulseblaster_No_DDS_Tab - -# note that ESR-Pro boards only have 21 channels -# bits 21-23 are short pulse control bits -# STATE | 23 22 21 -# OFF | 000 -# ONE_PERIOD | 001 -# TWO_PERIOD | 010 -# THREE_PERIOD | 011 -# FOUR_PERIOD | 100 -# FIVE_PERIOD | 101 -# SIX_PERIOD | 110 not defined in manual, defined in spinapi.h -# ON | 111 - -class PulseBlasterESRPro300Tab(Pulseblaster_No_DDS_Tab): - # Capabilities - num_DO = 24 - def __init__(self,*args,**kwargs): - self.device_worker_class = "naqslab_devices.PulseBlasterESRPro300.blacs_worker.PulseBlasterESRPro300Worker" - Pulseblaster_No_DDS_Tab.__init__(self,*args,**kwargs) diff --git a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_worker.py b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_worker.py deleted file mode 100644 index 695151da..00000000 --- a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/blacs_worker.py +++ /dev/null @@ -1,31 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/PulseblasterESRpro300/blacs_worker.py # -# # -# Copyright 2013, Monash University # -# # -# This file is part of labscript_devices, in the labscript suite # -# (see http://labscriptsuite.org), and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -from labscript_devices.PulseBlaster_No_DDS import PulseblasterNoDDSWorker - -# note that ESR-Pro boards only have 21 channels -# bits 21-23 are short pulse control bits -# STATE | 23 22 21 -# OFF | 000 -# ONE_PERIOD | 001 -# TWO_PERIOD | 010 -# THREE_PERIOD | 011 -# FOUR_PERIOD | 100 -# FIVE_PERIOD | 101 -# SIX_PERIOD | 110 not defined in manual, defined in spinapi.h -# ON | 111 - -class PulseBlasterESRPro300Worker(PulseblasterNoDDSWorker): - core_clock_freq = 300.0 - ESRPro = True - - diff --git a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/labscript_device.py b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/labscript_device.py deleted file mode 100644 index 538cc5eb..00000000 --- a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/labscript_device.py +++ /dev/null @@ -1,33 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/PulseblasterESRpro300/labscript_device.py # -# # -# Copyright 2013, Monash University # -# # -# This file is part of labscript_devices, in the labscript suite # -# (see http://labscriptsuite.org), and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -from labscript_devices.PulseBlaster_No_DDS import PulseBlaster_No_DDS - -# note that ESR-Pro boards only have 21 channels -# bits 21-23 are short pulse control bits -# STATE | 23 22 21 -# OFF | 000 -# ONE_PERIOD | 001 -# TWO_PERIOD | 010 -# THREE_PERIOD | 011 -# FOUR_PERIOD | 100 -# FIVE_PERIOD | 101 -# SIX_PERIOD | 110 not defined in manual, defined in spinapi.h -# ON | 111 - -class PulseBlasterESRPro300(PulseBlaster_No_DDS): - description = 'SpinCore PulseBlaster ESR-PRO-300' - clock_limit = 30.0e6 # can probably go faster - clock_resolution = 4e-9 - n_flags = 24 - - diff --git a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/register_classes.py b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/register_classes.py deleted file mode 100644 index b9a3f139..00000000 --- a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/register_classes.py +++ /dev/null @@ -1,13 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/PulseBlasterESRPro300/register_classes.py # -# # -# # -##################################################################### -import labscript_devices - -labscript_devices.register_classes( - 'PulseBlasterESRPro300', - BLACS_tab='naqslab_devices.PulseBlasterESRPro300.blacs_tab.PulseBlasterESRPro300Tab', - runviewer_parser='naqslab_devices.PulseBlasterESRPro300.runviewer_parser.PulseBlasterESRProParser', -) diff --git a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/runviewer_parser.py b/labscript_devices/naqslab_devices/PulseBlasterESRPro300/runviewer_parser.py deleted file mode 100644 index 257a53bc..00000000 --- a/labscript_devices/naqslab_devices/PulseBlasterESRPro300/runviewer_parser.py +++ /dev/null @@ -1,28 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/PulseblasterESRpro300/runviewer_parser.py # -# # -# Copyright 2013, Monash University # -# # -# This file is part of labscript_devices, in the labscript suite # -# (see http://labscriptsuite.org), and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -from labscript_devices.PulseBlaster_No_DDS import PulseBlaster_No_DDS_Parser - -# note that ESR-Pro boards only have 21 channels -# bits 21-23 are short pulse control bits -# STATE | 23 22 21 -# OFF | 000 -# ONE_PERIOD | 001 -# TWO_PERIOD | 010 -# THREE_PERIOD | 011 -# FOUR_PERIOD | 100 -# FIVE_PERIOD | 101 -# SIX_PERIOD | 110 not defined in manual, defined in spinapi.h -# ON | 111 - -class PulseBlasterESRPro300Parser(PulseBlaster_No_DDS_Parser): - num_flags = 24 # only 21 usable, flags 21-23 used for short pulses diff --git a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/__init__.py b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/__init__.py deleted file mode 100644 index a7ec61da..00000000 --- a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/PulseBlaster_No_DDS_200/__init__.py # -# # -# # -##################################################################### - - diff --git a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_tab.py b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_tab.py deleted file mode 100644 index 0004bb96..00000000 --- a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_tab.py +++ /dev/null @@ -1,20 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/Pulseblaster_No_DDS_200/blacs_tab.py # -# # -# Copyright 2013, Monash University # -# # -# This file is part of labscript_devices, in the labscript suite # -# (see http://labscriptsuite.org), and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -from labscript_devices.PulseBlaster_No_DDS import Pulseblaster_No_DDS_Tab - -class PulseBlaster_No_DDS_200_Tab(Pulseblaster_No_DDS_Tab): - # Capabilities - num_DO = 24 - def __init__(self,*args,**kwargs): - self.device_worker_class = "naqslab_devices.PulseBlaster_No_DDS_200.blacs_worker.PulseblasterNoDDS200Worker" - Pulseblaster_No_DDS_Tab.__init__(self,*args,**kwargs) diff --git a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_worker.py b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_worker.py deleted file mode 100644 index 02266d32..00000000 --- a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/blacs_worker.py +++ /dev/null @@ -1,18 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/Pulseblaster_No_DDS_200/blacs_worker.py # -# # -# Copyright 2013, Monash University # -# # -# This file is part of labscript_devices, in the labscript suite # -# (see http://labscriptsuite.org), and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -from labscript_devices.PulseBlaster_No_DDS import PulseblasterNoDDSWorker - -class PulseblasterNoDDS200Worker(PulseblasterNoDDSWorker): - core_clock_freq = 200.0 - - diff --git a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/labscript_device.py b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/labscript_device.py deleted file mode 100644 index c991790c..00000000 --- a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/labscript_device.py +++ /dev/null @@ -1,27 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/Pulseblaster_No_DDS_200/labscript_device.py # -# # -# Copyright 2013, Monash University # -# # -# This file is part of labscript_devices, in the labscript suite # -# (see http://labscriptsuite.org), and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -from labscript_devices.PulseBlaster_No_DDS import PulseBlaster_No_DDS - -class PulseBlaster_No_DDS_200(PulseBlaster_No_DDS): - """A thin subclass of labscript_devices.PulseBlaster_No_DDS. - - It's only purpose is to set the core clock frequency to 200 MHz for - our one custom USB pulseblaster device.""" - - description = 'SpinCore PulseBlaster USB with 200 MHz clock' - clock_limit = 17.2e6 # can probably go faster - clock_resolution = 10e-9 - core_clock_freq = 200 - n_flags = 24 - - diff --git a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/register_classes.py b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/register_classes.py deleted file mode 100644 index 2d94945a..00000000 --- a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/register_classes.py +++ /dev/null @@ -1,13 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/PulseBlaster_No_DDS_200/register_classes.py # -# # -# # -##################################################################### -import labscript_devices - -labscript_devices.register_classes( - 'PulseBlaster_No_DDS_200', - BLACS_tab='naqslab_devices.PulseBlaster_No_DDS_200.blacs_tab.PulseBlaster_No_DDS_200_Tab', - runviewer_parser='naqslab_devices.PulseBlaster_No_DDS_200.runviewer_parser.PulseBlaster_No_DDS_200_Parser', -) diff --git a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/runviewer_parser.py b/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/runviewer_parser.py deleted file mode 100644 index e71e5aa8..00000000 --- a/labscript_devices/naqslab_devices/PulseBlaster_No_DDS_200/runviewer_parser.py +++ /dev/null @@ -1,16 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/Pulseblaster_No_DDS_200/runviewer_parser.py # -# # -# Copyright 2013, Monash University # -# # -# This file is part of labscript_devices, in the labscript suite # -# (see http://labscriptsuite.org), and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -from labscript_devices.PulseBlaster_No_DDS import PulseBlaster_No_DDS_Parser - -class PulseBlaster_No_DDS_200_Parser(PulseBlaster_No_DDS_Parser): - num_flags = 24 diff --git a/labscript_devices/naqslab_devices/README.md b/labscript_devices/naqslab_devices/README.md deleted file mode 100644 index fb999653..00000000 --- a/labscript_devices/naqslab_devices/README.md +++ /dev/null @@ -1,235 +0,0 @@ -# README # - -This repository contains various 3rd-party device implementations for use with -the python-based [labscript suite](https://bitbucket.org/labscript_suite) -experiment control system. - -Devices include: - -* Novatech 409B, 409B-AC, & 440A DDS -* Stanford Research 865 Lockin Amplifier -* Tektronix TDS series oscilloscopes -* Keysight MSO/DSO X series oscilloscopes -* Various CW RF Signal Generators - * Rohde & Schwarz SMF 100A - * Rohde & Schwarz SMA 100B - * Rohde & Schwarz SMHU - * HP 8642A - * HP 8643A - * HP 8648A/B/C/D - * Keysight E8257N - * Keysight/Agilent DC Power Supplies - * E364x series tested - -The above code is designed to be modular allowing for easy addition of other -models, particularly oscilloscopes and CW Signal Generators. - -### How do I get set up? ### - -Clone this repository into the labscript suite directory. - -#### Valid since labscript\_devices version 2.6.0 #### - -Add the following line to the labconfig.ini file under the `[DEFAULT]` section. -``` -user_devices = naqslab_devices -``` - -#### For labscript\_devices post version 2.2.0. #### - -As of now BLACS will only look in the labscript\_devices repository for -device classes. -A quick workaround for this until a more permanant solution is implemented -is this diff applied to \_\_init\_\_.py in labscript\_devices - -```diff -@@ -68,6 +68,9 @@ - The old method may be deprecated in the future. - """ - -+lab_repo = 'naqslab_devices' -+lab_repo_dir = os.path.join(labscript_suite_install_dir,lab_repo) -+ - - class ClassRegister(object): - """A register for looking up classes by module name. Provides a -@@ -105,18 +108,21 @@ - # Ensure the module's code has run (this does not re-import it if it is already in sys.modules) - importlib.import_module('.' + name, __name__) - except ImportError: -- msg = """No %s registered for a device named %s. Ensure that there is a file -- 'register_classes.py' with a call to -- labscript_devices.register_classes() for this device, with the device -- name passed to register_classes() matching the name of the device class. -+ try: # hack to use local repo -+ importlib.import_module('.' + name, lab_repo) -+ except ImportError: -+ msg = """No %s registered for a device named %s. Ensure that there is a file -+ 'register_classes.py' with a call to -+ labscript_devices.register_classes() for this device, with the device -+ name passed to register_classes() matching the name of the device class. - -- Fallback method of looking for and importing a module in -- labscript_devices with the same name as the device also failed. If using -- this method, check that the module exists, has the same name as the -- device class, and can be imported with no errors. Import error -- was:\n\n""" -- msg = dedent(msg) % (self.instancename, name) + traceback.format_exc() -- raise ImportError(msg) -+ Fallback method of looking for and importing a module in -+ labscript_devices with the same name as the device also failed. If using -+ this method, check that the module exists, has the same name as the -+ device class, and can be imported with no errors. Import error -+ was:\n\n""" -+ msg = dedent(msg) % (self.instancename, name) + traceback.format_exc() -+ raise ImportError(msg) - # Class definitions in that module have executed now, check to see if class is in our register: - try: - return self.registered_classes[name] -@@ -250,6 +256,17 @@ - module_name = 'labscript_devices._register_classes_script_%d' % module_num - _ = imp.load_module(module_name, fp, pathname, desc) - module_num += 1 -+ -+ # hack for lab repo to use new arbitrary subfolders -+ for folder, _, filenames in os.walk(lab_repo_dir): -+ if 'register_classes.py' in filenames: -+ # The module name is the path to the file, relative to the labscript suite -+ # install directory: -+ # Open the file using the import machinery, and import it as module_name. -+ fp, pathname, desc = imp.find_module('register_classes', [folder]) -+ module_name = 'naqslab_devices._register_classes_script_%d' % module_num -+ _ = imp.load_module(module_name, fp, pathname, desc) -+ module_num += 1 - - - if __name__ == '__main__': - - -``` - -#### Usage #### - -Invoke in labscript scripts like other labscript\_devices -```python -from naqslab_devices import ScopeChannel -from naqslab_devices.KeysightXSeries.labscript_device import KeysightXScope -``` - -Usage of individual devices varies somewhat. -Here is an example connectiontable showing some of their instantiation with -labscript_devices > 2.2.0. -```python -from labscript import * -from naqslab_devices.PulseBlasterESRPro300.labscript_device import PulseBlasterESRPro300 -from naqslab_devices.NovaTechDDS.labscript_device import NovaTech409B, NovaTech409B_AC, NovaTech440A -from labscript_devices.NI_DAQmx import NI_DAQmx -from naqslab_devices.SignalGenerator.Models import RS_SMF100A, RS_SMHU -from naqslab_devices.SR865.labscript_device import SR865 -from naqslab_devices import ScopeChannel, StaticFreqAmp -from naqslab_devices.KeysightXSeries.labscript_device import KeysightXScope - -PulseBlasterESRPro300(name='pulseblaster_0', board_number=0, programming_scheme='pb_start/BRANCH') -ClockLine(name='pulseblaster_0_clockline_fast', pseudoclock=pulseblaster_0.pseudoclock, connection='flag 0') -ClockLine(name='pulseblaster_0_clockline_slow', pseudoclock=pulseblaster_0.pseudoclock, connection='flag 1') - -NI_DAQmx(name='ni_6343', parent_device=pulseblaster_0_clockline_fast, clock_terminal='/ni_usb_6343/PFI0', - MAX_name='ni_usb_6343', - num_AO = 4, - sample_rate_AO = 700e3, - num_DO = 32, - sample_rate_DO = 1e6, - num_AI = 32, - clock_terminal_AI = '/ni_usb_6343/PFI0', - mode_AI = 'labscript', - sample_rate_AI = 250e3, # 500 kS/s max aggregate - num_PFI=16, - DAQmx_waits_counter_bug_workaround=False) - -NovaTech409B(name='novatech_static', com_port="com4", baud_rate = 115200, phase_mode='aligned') -NovaTech409B_AC(name='novatech', parent_device=pulseblaster_0_clockline_slow, com_port="com3", update_mode='asynchronous', phase_mode='aligned', baud_rate = 115200) -NovaTech440A(name='HFnovatech', com_port='com6', baud_rate = 19200) -StaticDDS('HFDDS', HFnovatech, 'channel 0') - -# using NI-MAX alias instead of full VISA name -RS_SMHU(name='SMHU',VISA_name='SMHU58') -RS_SMF100A(name='SMF100A', VISA_name='SMF100A') - -# add Lock-In Amplifier -SR865(name='LockIn', VISA_name='SR865') - -# call the scope, use NI-MAX alias instead of full name -KeysightXScope(name='Scope',VISA_name='DSOX3024T', - trigger_device=pulseblaster_0.direct_outputs,trigger_connection='flag 3', - num_AI=4,DI=False) -ScopeChannel('Heterodyne',Scope,'Channel 1') -#ScopeChannel('Absorption',Scope,'Channel 2') -#ScopeChannel('Modulation',Scope,'Channel 4') - -# Define the Wait Monitor for the AC-Line Triggering -# note that connections used here cannot be used elsewhere -# 'connection' needs to be physically connected to 'acquisition_connection' -# for M-Series DAQs, ctr0 gate is on PFI9 -WaitMonitor(name='wait_monitor', parent_device=ni_6343, connection='port0/line0', acquisition_device=ni_6343, acquisition_connection='ctr0', timeout_device=ni_6343, timeout_connection='PFI1') - -DigitalOut( 'AC_trigger_arm', pulseblaster_0.direct_outputs, 'flag 2') - -# define the PB digital outputs -DigitalOut( 'probe_AOM', pulseblaster_0.direct_outputs, 'flag 4') -DigitalOut( 'blue_AOM', pulseblaster_0.direct_outputs, 'flag 5') -#DigitalOut( 'PB_6', pulseblaster_0.direct_outputs, 'flag 6') -#DigitalOut( 'PB_7', pulseblaster_0.direct_outputs, 'flag 7') -#DigitalOut( 'PB_8', pulseblaster_0.direct_outputs, 'flag 8') -DigitalOut( 'PB_9', pulseblaster_0.direct_outputs, 'flag 9') -DigitalOut( 'PB_10', pulseblaster_0.direct_outputs, 'flag 10') -DigitalOut( 'PB_11', pulseblaster_0.direct_outputs, 'flag 11') -DigitalOut( 'PB_12', pulseblaster_0.direct_outputs, 'flag 12') -DigitalOut( 'PB_13', pulseblaster_0.direct_outputs, 'flag 13') -DigitalOut( 'PB_14', pulseblaster_0.direct_outputs, 'flag 14') -DigitalOut( 'PB_15', pulseblaster_0.direct_outputs, 'flag 15') -DigitalOut( 'PB_16', pulseblaster_0.direct_outputs, 'flag 16') -DigitalOut( 'PB_17', pulseblaster_0.direct_outputs, 'flag 17') -DigitalOut( 'PB_18', pulseblaster_0.direct_outputs, 'flag 18') -DigitalOut( 'PB_19', pulseblaster_0.direct_outputs, 'flag 19') -DigitalOut( 'PB_20', pulseblaster_0.direct_outputs, 'flag 20') - -# short pulse control channels -DigitalOut( 'bit21', pulseblaster_0.direct_outputs, 'flag 21') -DigitalOut( 'bit22', pulseblaster_0.direct_outputs, 'flag 22') -DigitalOut( 'bit23', pulseblaster_0.direct_outputs, 'flag 23') - -AnalogOut( 'ProbeAmpLock', ni_6343, 'ao0') -AnalogOut( 'PSK', ni_6343, 'ao1') -AnalogOut( 'BlueAmpLock', ni_6343, 'ao2') -AnalogOut( 'ni_6343_ao3', ni_6343, 'ao3') - -AnalogIn( 'LockIn_X', ni_6343, 'ai0') -AnalogIn( 'LockIn_Y', ni_6343, 'ai1') -AnalogIn( 'PSK_Phase', ni_6343, 'ai2') -AnalogIn( 'AI3', ni_6343, 'ai3') - -# this dummy line necessary to balance the digital out for the wait monitor -DigitalOut( 'P0_1', ni_6343, 'port0/line1') - -StaticDDS( 'blueAOM', novatech_static, 'channel 0') -StaticDDS( 'ProbeBeatNote', novatech_static, 'channel 1') -StaticDDS( 'ProbeAOM', novatech_static, 'channel 2') -StaticDDS( 'LO', novatech_static, 'channel 3') - -DDS( 'dds0', novatech, 'channel 0') -DDS( 'dds1', novatech, 'channel 1') -StaticDDS( 'dds2', novatech, 'channel 2') -StaticDDS( 'dds3', novatech, 'channel 3') - -StaticFreqAmp( 'blueEOM', SMHU, 'channel 0', freq_limits=(0.1,4320), amp_limits=(-140,13)) -StaticFreqAmp( 'uWaves', SMF100A, 'channel 0', freq_limits=(100e-6,22), amp_limits=(-26,18)) - -start() - -stop(1) -``` - -### Contribution guidelines ### - -* Submitted code should follow labscript\_suite style and guidelines -* Submitted code should also be backwards compatible where possible diff --git a/labscript_devices/naqslab_devices/SR865/__init__.py b/labscript_devices/naqslab_devices/SR865/__init__.py deleted file mode 100644 index 79190854..00000000 --- a/labscript_devices/naqslab_devices/SR865/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SR865/__init__.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -from labscript_devices import deprecated_import_alias - - -# For backwards compatibility with old experiment scripts: -SR865 = deprecated_import_alias("naqslab_devices.SR865.labscript_device.SR865") diff --git a/labscript_devices/naqslab_devices/SR865/blacs_tab.py b/labscript_devices/naqslab_devices/SR865/blacs_tab.py deleted file mode 100644 index 9853e68a..00000000 --- a/labscript_devices/naqslab_devices/SR865/blacs_tab.py +++ /dev/null @@ -1,88 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SR865/blacs_tab.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from naqslab_devices.VISA.blacs_tab import VISATab - -from blacs.tab_base_classes import define_state -from blacs.tab_base_classes import MODE_MANUAL, MODE_TRANSITION_TO_BUFFERED, MODE_TRANSITION_TO_MANUAL, MODE_BUFFERED - -class SR865Tab(VISATab): - # Capabilities - - status_byte_labels = {'bit 7':'Power On', - 'bit 6':'Button Pressed', - 'bit 5':'Illegal Command', - 'bit 4':'Execution Error', - 'bit 3':'Query Queue Overflow', - 'bit 2':'unused', - 'bit 1':'Input Queue Overflow', - 'bit 0':'OPC'} - - def __init__(self,*args,**kwargs): - # set the worker - self.device_worker_class = 'naqslab_devices.SR865.blacs_worker.SR865Worker' - VISATab.__init__(self,*args,**kwargs) - - def initialise_GUI(self): - - # use AO widgets to mimick functionality - ao_prop = {'tau':{'base_unit':'s', - 'min':1e-6, - 'max':30e3, - 'step':1, - 'decimals':6}, - 'sens':{'base_unit':'V', - 'min':1e-9, - 'max':1, - 'step':1e-3, - 'decimals':9}, - 'phase':{'base_unit':'deg', - 'min':-180, - 'max':180, - 'step':1, - 'decimals':6}} - - self.create_analog_outputs(ao_prop) - ao_widgets = self.create_analog_widgets(ao_prop) - self.auto_place_widgets(('Settings',ao_widgets)) - - # call VISATab.initialise to create SR865 widget - VISATab.initialise_GUI(self) - - # Set the capabilities of this device - self.supports_remote_value_check(True) - self.supports_smart_programming(True) - self.statemachine_timeout_add(5000, self.status_monitor) - - @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) - def tau_changed(self,widget=None): - value = self.status_ui.tau_comboBox.currentIndex() - new_value = yield(self.queue_work(self._primary_worker,'set_tau',value)) - - # only update if value is different - if new_value != value: - # block signals for update - self.status_ui.tau_comboBox.blockSignals(True) - self.status_ui.tau_comboBox.setCurrentIndex(new_value) - self.status_ui.tau_comboBox.blockSignals(False) - - @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) - def sens_changed(self,widget=None): - value = self.status_ui.sens_comboBox.currentIndex() - new_value = yield(self.queue_work(self._primary_worker,'set_sens',value)) - - # only update if value is different - if new_value != value: - # block signals for update - self.status_ui.tau_comboBox.blockSignals(True) - self.status_ui.tau_comboBox.setCurrentIndex(new_value) - self.status_ui.tau_comboBox.blockSignals(False) - diff --git a/labscript_devices/naqslab_devices/SR865/blacs_worker.py b/labscript_devices/naqslab_devices/SR865/blacs_worker.py deleted file mode 100644 index 99fe0fbd..00000000 --- a/labscript_devices/naqslab_devices/SR865/blacs_worker.py +++ /dev/null @@ -1,136 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SR865/blacs_worker.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -import numpy as np -from naqslab_devices.VISA.blacs_worker import VISAWorker -from labscript import LabscriptError - -import labscript_utils.h5_lock, h5py - -# import sensitivity and tau settings from labscript device -from naqslab_devices.SR865.labscript_device import sens, tau - -class SR865Worker(VISAWorker): - program_string = 'OFLT {:d};SCAL {:d};PHAS {:.6f}' - read_string = 'OFLT?;SCAL?;PHAS?' - - def phase_parser(self,phase_string): - '''Phase Query string parser''' - phase = float(phase_string) - return phase - - def coerce_tau(self,tau_constant): - '''Returns coerced, valid integer setting. - Tau value rounds up. - Returns max or min valid setting if out of bound.''' - coerced_i = int(np.digitize(tau_constant,tau,right=True)) - if coerced_i >= len(tau): - coerced_i -= 1 - return coerced_i - - def coerce_sens(self,sensitivity): - '''Returns coerced, valid integer setting. - Sens value rounds down. - Returns max or min valid setting if out of bound.''' - coerced_i = int(np.digitize(sensitivity,sens)) - if coerced_i >= len(sens): - coerced_i -= 1 - return coerced_i - - def init(self): - # Call the VISA init to initialise the VISA connection - VISAWorker.init(self) - - # initial configure of the instrument - self.connection.write('*ESE 122;*CLS;') - - def check_remote_values(self): - '''Queries the current settings for all three parameters. - Parses results to actual numbers and returns.''' - results = {} - - [tau_i, sens_i, phase] = self.connection.query_ascii_values(self.read_string,separator=';') - - # convert to proper numbers - results['tau'] = tau[int(tau_i)] - results['sens'] = sens[int(sens_i)] - results['phase'] = self.phase_parser(phase) - - return results - - def program_manual(self,front_panel_values): - '''Performans manual updates from BLACS front panel. - Tau and Sensitivity settings are coerced to nearest allowed value''' - tau_i = self.coerce_tau(front_panel_values['tau']) - sens_i = self.coerce_sens(front_panel_values['sens']) - phase = front_panel_values['phase'] - - self.connection.write(self.program_string.format(tau_i,sens_i,phase)) - - return self.check_remote_values() - - def transition_to_buffered(self,device_name,h5file,initial_values,fresh): - # call parent method to do basic preamble - VISAWorker.transition_to_buffered(self,device_name,h5file,initial_values,fresh) - - data = None - with h5py.File(h5file,'r') as hdf5_file: - group = hdf5_file['/devices/'+device_name] - # If there are values to set the unbuffered outputs to, set them now: - if 'STATIC_DATA' in group: - data = group['STATIC_DATA'][:][0] - - # Save these values into final_values so the GUI can - # be updated at the end of the run to reflect them: - # assume initial values in case something isn't programmed - self.final_values = initial_values - - if data is not None: - # since static instrument, smart_cache replaced with initial vals - cur = self.initial_values - if (data['tau_i'] != -1) and (fresh or (data['tau'] != cur['tau'])): - self.connection.write('OFLT {:d}'.format(data['tau_i'])) - self.final_values['tau'] = tau[data['tau_i']] - else: - self.final_values['tau'] = initial_values['tau'] - if (data['sens_i'] != -1) and (fresh or (data['tau'] != cur['tau'])): - self.connection.write('SCAL {:d}'.format(data['sens_i'])) - self.final_values['sens'] = sens[data['sens_i']] - else: - self.final_values['sens'] = initial_values['sens'] - if not np.isnan(data['phase']) and (fresh or (data['phase'] != cur['phase'])): - self.connection.write('PHAS {:.6f}'.format(data['phase'])) - self.final_values['phase'] = data['phase'] - else: - self.final_values['phase'] = initial_values['phase'] - - # write the final_values to h5file for later lookup - with h5py.File(h5file, 'r+') as hdf5_file: - group = hdf5_file['/devices/'+device_name] - group.attrs.create('sensitivity',self.final_values['sens']) - group.attrs.create('tau',self.final_values['tau']) - group.attrs.create('phase',round(self.final_values['phase'],6)) - - return self.final_values - - def check_status(self): - '''Queries device state using the ESR register. - Bit definitions defined in blacs_tab''' - esr = int(self.connection.query('*ESR?')) - mask = 122 - error_code = esr & mask - - if error_code: - # error exists, but nothing to report beyond register value - print('{:s} has ESR = {:d}'.format(self.VISA_name,error_code)) - - return self.convert_register(esr) - diff --git a/labscript_devices/naqslab_devices/SR865/labscript_device.py b/labscript_devices/naqslab_devices/SR865/labscript_device.py deleted file mode 100644 index b5f544cc..00000000 --- a/labscript_devices/naqslab_devices/SR865/labscript_device.py +++ /dev/null @@ -1,107 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SR865/labscript_device.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -import numpy as np - -from naqslab_devices.VISA.labscript_device import VISA -from labscript import Device, AnalogOut, config, LabscriptError, set_passed_properties - -__version__ = '0.1.1' -__author__ = ['dihm'] - -sens = np.array([1,500e-3,200e-3,100e-3,50e-3,20e-3,10e-3,5e-3,2e-3,1e-3, - 500e-6,200e-6,100e-6,50e-6,20e-6,10e-6,5e-6,2e-6,1e-6, - 500e-9,200e-9,100e-9,50e-9,20e-9,10e-9,5e-9,2e-9,1e-9]) - -tau = np.array([1e-6,3e-6,10e-6,30e-6,100e-6,300e-6, - 1e-3,3e-3,10e-3,30e-3,100e-3,300e-3, - 1,3,10,30,100,300,1e3,3e3,10e3,30e3]) - -class SR865(VISA): - description = 'SR865 Lock-In Amplifier' - allowed_children = None - - # initialize these parameters to None - tau = None - sens = None - phase = None - - @set_passed_properties() - def __init__(self, name, VISA_name): - '''VISA_name can be full VISA connection string or NI-MAX alias''' - # does not have a parent device - VISA.__init__(self,name,None,VISA_name) - - def set_tau(self, tau_constant): - '''Set the time constant in seconds. - Uses numpy digitize to translate to int values. - Using digitize corrects for round-off errors and coerces input to - nearest allowed setting.''' - self.tau = tau_constant - # check that setting is valid - if tau_constant in tau: - self.tau_i = np.digitize(tau_constant,tau,right=True) - else: - raise LabscriptError('{:s}: tau cannot be set to {:f}'.format(self.VISA_name,self.tau)) - - def set_sens(self, sensitivity): - '''Set the sensitivity in Volts - Uses numpy digitize to translate to int values. - Using digitize corrects for round-off errors and coerces input to - nearest allowed setting.''' - self.sens = sensitivity - # check that setting is valid - if sensitivity in sens: - self.sens_i = np.digitize(sensitivity,sens) - else: - raise LabscriptError('{:s}: sensitivity cannot be set to {:f}'.format(self.VISA_name,self.sens)) - - def set_phase(self, phase): - '''Set the phase reference in degrees - Device auto-converts to -180,180 range''' - self.phase = phase - - - def generate_code(self, hdf5_file): - '''Generates the transition to buffered code in the h5 file. - If parameter is not specified in shot, NaN and -1 values are set - to tell worker not to change the value when programming.''' - # type the static_table - static_dtypes = np.dtype({'names':['tau','tau_i','sens','sens_i','phase'], - 'formats':[np.float16,np.int8,np.float16,np.int8,np.float32]}) - static_table = np.zeros(1,dtype=static_dtypes) - - # if tau is set, add tau value to table, else add NaN - if self.tau: - static_table['tau'] = self.tau - static_table['tau_i'] = self.tau_i - else: - static_table['tau'] = np.NaN - static_table['tau_i'] = -1 - # if sensitivity is set, add sens to table, else add NaN - if self.sens: - static_table['sens'] = self.sens - static_table['sens_i'] = self.sens_i - else: - static_table['sens'] = np.NaN - static_table['sens_i'] = -1 - # if phase set, add to table, else NaN - if self.phase: - static_table['phase'] = self.phase - else: - static_table['phase'] = np.NaN - - grp = hdf5_file.create_group('/devices/'+self.name) - grp.create_dataset('STATIC_DATA',compression=config.compression,data=static_table) - # add these values to device properties for easy lookup - if self.tau: self.set_property('tau', self.tau, location='device_properties') - if self.sens: self.set_property('sensitivity', self.sens, location='device_properties') - if self.phase: self.set_property('phase',self.phase,location='device_properties') diff --git a/labscript_devices/naqslab_devices/SR865/register_classes.py b/labscript_devices/naqslab_devices/SR865/register_classes.py deleted file mode 100644 index bab8be57..00000000 --- a/labscript_devices/naqslab_devices/SR865/register_classes.py +++ /dev/null @@ -1,18 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SR865/register_classes.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -import labscript_devices - -labscript_devices.register_classes( - 'SR865', - BLACS_tab='naqslab_devices.SR865.blacs_tab.SR865Tab', - runviewer_parser='') diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8642A.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8642A.py deleted file mode 100644 index 4598cd7a..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8642A.py +++ /dev/null @@ -1,94 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/BLACS/HP_8642A.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab -from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker -from labscript import LabscriptError -import numpy as np - - -class enable_on_off_formatter(str): - '''Class overload that converts input bools to ON or OFF string''' - - def format(self, state): - if state == 0: - s = 'OF' - elif state == 1: - s = 'ON' - else: - raise ValueError('Argument must be 0 or 1 equivalent.') - - return super().format(s) - -class HP_8642ATab(SignalGeneratorTab): - # Capabilities - base_units = {'freq':'MHz', 'amp':'dBm'} - base_min = {'freq':0.1, 'amp':-140} - base_max = {'freq':1057.5, 'amp':20} - base_step = {'freq':1, 'amp':0.1} - base_decimals = {'freq':6, 'amp':1} - # Status Byte Label Definitions for HP8642A - status_byte_labels = {'bit 7':'Parameter Changed', - 'bit 6':'RQS', - 'bit 5':'Error', - 'bit 4':'Ready', - 'bit 3':'Local/Remote', - 'bit 2':'Execution Error', - 'bit 1':'Hardware Error', - 'bit 0':'End of Sweep'} - - def __init__(self,*args,**kwargs): - self.device_worker_class = HP_8642AWorker - SignalGeneratorTab.__init__(self,*args,**kwargs) - -class HP_8642AWorker(SignalGeneratorWorker): - # define the scale factor - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e6 - amp_scale_factor = 1.0 - - # define instrument specific read and write strings for Freq & Amp control - freq_write_string = 'FR {:.0f} HZ' #HP8642A can only accept 10 digits, in Hz - freq_query_string = 'FROA' #HP8642A returns 'FR sdddddddddd.0 HZ', in Hz - def freq_parser(self,freq_string): - '''Frequency Query string parser for HP8642A - freq_string format is FR sdddddddddd.0 HZ - Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' - return float(freq_string.split()[1]) - amp_write_string = 'AP {:.1f} DM' #HP8642A accepts one decimal, in dBm - amp_query_string = 'APOA' #HP8642A returns 'AP sddd.d DM' - def amp_parser(self,amp_string): - '''Amplitude Query string parser for HP8642A - amp_string format is AP sddd.d DM - Returns float in instrument units, dBm''' - # values less than -200 indicate instrument errors - # -201: RF OFF - # -202: reverse power is tripped - amp = float(amp_string.split()[1]) - if amp == -201: - return np.nan - elif amp <= -200: - raise LabscriptError('HP8642A error code {:d} for VISA device: {:s}'.format(amp,self.VISA_name)) - else: - # No error on amp read - return amp - enable_write_string = enable_on_off_formatter('AP{:s}') - enable_query_string = 'APOA' - def enable_parser(self, enable_string): - '''Query output status by checking for error codes.''' - amp = float(enable_string.split()[1]) - if amp == -201: - return False - elif amp <= -200: - raise LabscriptError('HP8642A error code {:d} for VISA device: {:s}'.format(amp,self.VISA_name)) - else: - # No error on amp read, output enabled - return True \ No newline at end of file diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8643A.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8643A.py deleted file mode 100644 index b3f8248e..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8643A.py +++ /dev/null @@ -1,91 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/BLACS/HP_8643A.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab -from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker, enable_on_off_formatter -from labscript import LabscriptError - -class HP_8643ATab(SignalGeneratorTab): - # Capabilities - base_units = {'freq':'MHz', 'amp':'dBm'} - base_min = {'freq':0.26, 'amp':-137} - base_max = {'freq':1030, 'amp':13} - base_step = {'freq':1, 'amp':0.1} - base_decimals = {'freq':8, 'amp':2} - # Event Status Byte Label Definitions for HP8643A - status_byte_labels = {'bit 7':'Power On', - 'bit 6':'URQ', - 'bit 5':'Command Error', - 'bit 4':'Execution Error', - 'bit 3':'Device Error', - 'bit 2':'Query Error', - 'bit 1':'RQC', - 'bit 0':'Operation Complete'} - - def __init__(self,*args,**kwargs): - self.device_worker_class = HP_8643AWorker - SignalGeneratorTab.__init__(self,*args,**kwargs) - -class HP_8643AWorker(SignalGeneratorWorker): - # define the scale factor - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e6 - amp_scale_factor = 1.0 - - def init(self): - '''Calls parent init and sends device specific initialization commands''' - SignalGeneratorWorker.init(self) - - # enables ESR status reading - self.connection.write('*ESE 60;*SRE 32;*CLS') - self.esr_mask = 60 - - # define instrument specific read and write strings for Freq & Amp control - freq_write_string = 'FREQ:CW {:.2f} HZ' #HP8643A has 0.01 Hz resolution, in Hz - freq_query_string = 'FREQ:CW?' #HP8643A returns float, in Hz - def freq_parser(self,freq_string): - '''Frequency Query string parser for HP8643A - freq_string format is float, in Hz - Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' - return float(freq_string) - amp_write_string = 'AMPL:LEV {:.2f} DBM' #HP8643A accepts two decimal, in dBm - amp_query_string = 'AMPL:LEV?' #HP8643A returns float in dBm - def amp_parser(self,amp_string): - '''Amplitude Query string parser for HP8643A - amp_string format is float in configured units (dBm by default) - Returns float in instrument units, dBm''' - return float(amp_string) - enable_write_string = enable_on_off_formatter('AMPL:STAT {:s}') - enable_query_string = 'AMPL:STAT?' - def enable_parser(self,enable_string): - '''Output Enable Query for HP 8643.''' - return 'ON' in enable_string - - def check_status(self): - # no real info in stb in these older sig gens, use esr instead - esr = int(self.connection.query('*ESR?')) - - # if esr is non-zero, read out the error message and report - # use mask to ignore non-error messages - if (esr & self.esr_mask) != 0: - err_string = self.connection.query('SYST:ERR? STR') - # some error conditions do not persist to query - # Still need to inform user of issue - if err_string.endswith('0'): - err_string = 'Event Status Register: {0:d}'.format(esr) - - msg = 'HP 8643A device {0:s} has \n{1:s}' - raise LabscriptError(dedent(msg.format(self.VISA_name,err_string))) - - # note: HP 8643A has 16 bits in ESR, - # so need to ensure future use bits not present when passed - return self.convert_register(esr & 255) - diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8648.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8648.py deleted file mode 100644 index 596eeb03..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/HP_8648.py +++ /dev/null @@ -1,115 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/BLACS/HP_8648.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab -from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker, enable_on_off_formatter -from labscript import LabscriptError -from labscript_utils import dedent - -class HP_8648ATab(SignalGeneratorTab): - # Capabilities - base_units = {'freq':'MHz', 'amp':'dBm'} - base_min = {'freq':0.1, 'amp':-136} - base_max = {'freq':1000, 'amp':20}#max output depends on options/frequency - base_step = {'freq':1, 'amp':1} - base_decimals = {'freq':9, 'amp':1} - # Event Status Byte Label Definitions for HP8648 - status_byte_labels = {'bit 7':'Power On', - 'bit 6':'URQ', - 'bit 5':'Command Error', - 'bit 4':'Execution Error', - 'bit 3':'Device Error', - 'bit 2':'Query Error', - 'bit 1':'RQC', - 'bit 0':'Operation Complete'} - - def __init__(self,*args,**kwargs): - self.device_worker_class = HP_8648Worker - SignalGeneratorTab.__init__(self,*args,**kwargs) - -class HP_8648BTab(HP_8648ATab): - # Capabilities - base_min = {'freq':0.009, 'amp':-136} - base_max = {'freq':2000, 'amp':20}#max output depends on options/frequency - -class HP_8648CTab(HP_8648ATab): - # Capabilities - base_min = {'freq':0.009, 'amp':-136} - base_max = {'freq':3200, 'amp':20}#max output depends on options/frequency - -class HP_8648DTab(HP_8648ATab): - # Capabilities - base_min = {'freq':0.009, 'amp':-136} - base_max = {'freq':4000, 'amp':20}#max output depends on options/frequency - -class HP_8648Worker(SignalGeneratorWorker): - # define the scale factor - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e6 - amp_scale_factor = 1.0 - - def init(self): - '''Calls parent init and sends device specific initialization commands''' - SignalGeneratorWorker.init(self) - try: - ident_string = self.connection.query('*IDN?') - except: - msg = '\'*IDN?\' command did not complete. Is %s connected?' - raise LabscriptError(dedent(msg%self.VISA_name)) from None - - if '8648' not in ident_string: - msg = '%s is not supported by the HP_8648 class.' - raise LabscriptError(dedent(msg%ident_string)) - - # enables ESR status reading - self.connection.write('*ESE 60;*SRE 32;*CLS') - self.esr_mask = 60 - - # define instrument specific read and write strings for Freq & Amp control - # Note that insturment display does not have as much resolution as device - freq_write_string = 'FREQ:CW {:.3f} HZ' #HP8648 has 0.001 Hz resolution, in Hz - freq_query_string = 'FREQ:CW?' #HP8648 returns float, in Hz - def freq_parser(self,freq_string): - '''Frequency Query string parser for HP8648 - freq_string format is float, in Hz - Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' - return float(freq_string) - amp_write_string = 'POW:AMPL {:.1f} DBM' #HP8648 accepts one decimal, in dBm - amp_query_string = 'POW:AMPL?' #HP8648 returns float in dBm - def amp_parser(self,amp_string): - '''Amplitude Query string parser for HP8648 - amp_string format is float in configured units (dBm by default) - Returns float in instrument units, dBm''' - return float(amp_string) - enable_write_string = enable_on_off_formatter('OUTP:STAT {:s}') - enable_query_string = 'OUTP:STAT?' - def enable_parser(self,enable_string): - '''Output Enable Query for HP 8648.''' - return 'ON' in enable_string - - def check_status(self): - # no real info in stb in these older sig gens, use esr instead - esr = int(self.connection.query('*ESR?')) - - # if esr is non-zero, read out the error message and report - # use mask to ignore non-error messages - if (esr & self.esr_mask) != 0: - err_string = self.connection.query('SYST:ERR?') - # some error conditions do not persist to query - # Still need to inform user of issue - if 'No error' in err_string: - err_string = 'Event Status Register: {0:d}'.format(esr) - - msg = '{0:s} has \n{1:s}' - raise LabscriptError(dedent(msg.format(self.VISA_name,err_string))) - - return self.convert_register(esr) - diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/KeysightSigGens.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/KeysightSigGens.py deleted file mode 100644 index f0b42153..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/KeysightSigGens.py +++ /dev/null @@ -1,123 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/BLACS/KeysightSigGens.py # -# # -# Copyright 2019, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab -from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker - -from labscript_utils import check_version, dedent -from labscript import LabscriptError - -# need this version to ensure labscript device properties are auto-passed to worker -check_version('blacs','2.8.0','4') - - -class KeysightSigGenTab(SignalGeneratorTab): - """BLACS Tab for Modern Keysight/Agilent/HP CW Signal Generators - - Specific devices should subclass this class and define - `base_units` - `base_min` - `base_max` - `base_step` - `base_decimals` - for the frequency output 'channel 0'. Definitions are given is the base units. - """ - # Event Status Byte Label Definitions for Keysight Sig Gens - status_byte_labels = {'bit 7':'Power On', - 'bit 6':'URQ', - 'bit 5':'Command Error', - 'bit 4':'Execution Error', - 'bit 3':'Device Error', - 'bit 2':'Query Error', - 'bit 1':'RQC', - 'bit 0':'Operation Complete'} - - def __init__(self,*args,**kwargs): - self.device_worker_class = KeysightSigGenWorker - SignalGeneratorTab.__init__(self,*args,**kwargs) - - -class E8257NTab(KeysightSigGenTab): - # Capabilities - base_units = {'freq':'GHz', 'amp':'dBm'} - base_min = {'freq':0.010, 'amp':-105} - base_max = {'freq':40.0, 'amp':20}#max output depends on options/frequency - base_step = {'freq':1, 'amp':1} - base_decimals = {'freq':12, 'amp':1} - - -class KeysightSigGenWorker(SignalGeneratorWorker): - """Generic BLACS worker for Modern Keysight/Agilent/HP CW Signal Generators - - This class defines the common frequency/amplitude read/write commands as well - as general device configuration and communication. It uses the ESR byte - instead of the standard STB byte for intstrument communications. - - The `scale_factor` and `amp_scale_factor` are taken from the labscript - device specification. - - """ - # scale factors defined in labscript device specification - # Writing: scale*desired_freq // Reading:desired_freq/scale - - def init(self): - '''Calls parent init and sends device specific initialization commands''' - SignalGeneratorWorker.init(self) - try: - ident_string = self.connection.query('*IDN?') - except: - msg = '\'*IDN?\' command did not complete. Is %s connected?' - raise LabscriptError(dedent(msg%self.VISA_name)) from None - - # log which device connected to worker terminal - print('Connected to \n',ident_string) - - # enables ESR status reading - self.connection.write('*ESE 60;*SRE 32;*CLS') - self.esr_mask = 60 - - # define instrument specific read and write strings for Freq & Amp control - # Note that insturment display does not have as much resolution as device - freq_write_string = 'FREQ:CW {:.3f} HZ' #assume 0.001 Hz resolution, in Hz - freq_query_string = 'FREQ:CW?' # returns float, in Hz - def freq_parser(self,freq_string): - '''Frequency Query string parser for Keysight Sig Gens - freq_string format is float, in Hz - Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' - return float(freq_string) - amp_write_string = 'POW:AMPL {:.1f} DBM' #assume accepts one decimal, in dBm - amp_query_string = 'POW:AMPL?' #returns float in dBm - def amp_parser(self,amp_string): - '''Amplitude Query string parser for Keysight Sig Gens - amp_string format is float in configured units (dBm by default) - Returns float in instrument units, dBm''' - return float(amp_string) - enable_write_string = 'OUTP:STAT {:d}' - enable_query_string = 'OUTP:STAT?' - - def check_status(self): - # no real info in stb use esr instead - esr = int(self.connection.query('*ESR?')) - - # if esr is non-zero, read out the error message and report - # use mask to ignore non-error messages - if (esr & self.esr_mask) != 0: - err_string = self.connection.query('SYST:ERR?') - # some error conditions do not persist to query - # Still need to inform user of issue - if 'No error' in err_string: - err_string = 'Event Status Register: {0:d}'.format(esr) - - msg = '{0:s} has \n{1:s}' - raise LabscriptError(dedent(msg.format(self.VISA_name,err_string))) - - return self.convert_register(esr) - diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMA100B.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMA100B.py deleted file mode 100644 index 60e82c5c..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMA100B.py +++ /dev/null @@ -1,70 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/BLACS/RS_SMA100B.py # -# # -# Copyright 2019, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab -from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker -from labscript import LabscriptError - - -class RS_SMA100BTab(SignalGeneratorTab): - # Capabilities - base_units = {'freq':'GHz', 'amp':'dBm'} - base_min = {'freq':8e-6, 'amp':-145} - base_max = {'freq':20, 'amp':35} # only 30 if f<=1 MHz - base_step = {'freq':0.1, 'amp':1} - base_decimals = {'freq':9, 'amp':2} - # Status Byte Label Definitions for SMA100B - status_byte_labels = {'bit 7':'Operation', - 'bit 6':'SRQ', - 'bit 5':'ESB', - 'bit 4':'Message Available', - 'bit 3':'Questionable Status', - 'bit 2':'Error Queue Not Empty', - 'bit 1':'Unused', - 'bit 0':'Unused'} - - def __init__(self,*args,**kwargs): - self.device_worker_class = RS_SMA100BWorker - SignalGeneratorTab.__init__(self,*args,**kwargs) - - -class RS_SMA100BWorker(SignalGeneratorWorker): - # define the scale factor - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e9 - amp_scale_factor = 1.0 - - # define instrument specific read and write strings for Freq & Amp control - freq_write_string = 'FREQ:CW {:.0f}HZ' - freq_query_string = 'FREQ:CW?' # SMA100B returns 'ddddddddddd', in Hz - def freq_parser(self,freq_string): - '''Frequency Query string parser for SMF100B - freq_string format is ddddddddddd - Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' - return float(freq_string) - amp_write_string = 'POW:POW {:.2f}dBm' # SMA100B accepts two decimals, in dBm - amp_query_string = 'POW?' # SMA100B returns 'sdd.dd' - def amp_parser(self,amp_string): - '''Amplitude Query string parser for SMF100B - Returns float in instrument units, dBm''' - return float(amp_string) - enable_write_string = 'OUTP:STAT {:d}' # take a bool value - enable_query_string = 'OUTP:STAT?' # returns 0 or 1 - - def check_status(self): - # call parent method to read status byte register - results = SignalGeneratorWorker.check_status(self) - # do some device specific error handling with status byte information - if results['bit 2'] == True: - errors = self.connection.query('SYST:ERR:ALL?') - raise LabscriptError('SMA100B VISA device {:s} has Errors in Queue: \n{:s}'.format(self.VISA_name,errors)) - - return results diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMF100A.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMF100A.py deleted file mode 100644 index ab0685f0..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMF100A.py +++ /dev/null @@ -1,68 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/BLACS/RS_SMF100A.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab -from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker -from labscript import LabscriptError - -class RS_SMF100ATab(SignalGeneratorTab): - # Capabilities - base_units = {'freq':'GHz', 'amp':'dBm'} - base_min = {'freq':1e-6, 'amp':-26} - base_max = {'freq':22, 'amp':18} - base_step = {'freq':0.1, 'amp':1} - base_decimals = {'freq':6, 'amp':1} - # Status Byte Label Definitions for SMF100A - status_byte_labels = {'bit 7':'Operation', - 'bit 6':'SRQ', - 'bit 5':'ESB', - 'bit 4':'Message Available', - 'bit 3':'Questionable Status', - 'bit 2':'Error Queue Not Empty', - 'bit 1':'Unused', - 'bit 0':'Unused'} - - def __init__(self,*args,**kwargs): - self.device_worker_class = RS_SMF100AWorker - SignalGeneratorTab.__init__(self,*args,**kwargs) - -class RS_SMF100AWorker(SignalGeneratorWorker): - # define the scale factor - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e9 - amp_scale_factor = 1.0 - - # define instrument specific read and write strings for Freq & Amp control - freq_write_string = 'FREQ:CW {:.0f}HZ' - freq_query_string = 'FREQ?' #SMF100A returns 'ddddddddddd', in Hz - def freq_parser(self,freq_string): - '''Frequency Query string parser for SMF100A - freq_string format is ddddddddddd - Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' - return float(freq_string) - amp_write_string = 'POW:POW {:.2f}dBm' #SMF100A accepts two decimals, in dBm - amp_query_string = 'POW?' #SMF100A returns 'sdd.dd' - def amp_parser(self,amp_string): - '''Amplitude Query string parser for SMF100A - Returns float in instrument units, dBm''' - return float(amp_string) - enable_write_string = 'OUTP:STAT {:d}' # take a bool value - enable_query_string = 'OUTP:STAT?' # returns 0 or 1 - - def check_status(self): - # call parent method to read status byte register - results = SignalGeneratorWorker.check_status(self) - # do some device specific error handling with status byte information - if results['bit 2'] == True: - errors = self.connection.query('SYST:ERR:ALL?') - raise LabscriptError('SMF100A VISA device {:s} has Errors in Queue: \n{:s}'.format(self.VISA_name,errors)) - - return results diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMHU.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMHU.py deleted file mode 100644 index 78d55d0f..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/RS_SMHU.py +++ /dev/null @@ -1,101 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/BLACS/RS_SMHU.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from naqslab_devices.SignalGenerator.blacs_tab import SignalGeneratorTab -from naqslab_devices.SignalGenerator.blacs_worker import SignalGeneratorWorker, enable_on_off_formatter -from labscript import LabscriptError -from labscript_utils import dedent - - -class RS_SMHUTab(SignalGeneratorTab): - # Capabilities - base_units = {'freq':'MHz', 'amp':'dBm'} - base_min = {'freq':0.1, 'amp':-140} - base_max = {'freq':4320, 'amp':13} - base_step = {'freq':1, 'amp':0.1} - base_decimals = {'freq':7, 'amp':1} - # Event Byte Label Definitions for RS SMHU - status_byte_labels = {'bit 7':'Power On', - 'bit 6':'URQ', - 'bit 5':'Command Error', - 'bit 4':'Execution Error', - 'bit 3':'Device-Dependent Error', - 'bit 2':'Query Error', - 'bit 1':'SRQ', - 'bit 0':'OPC'} - - def __init__(self,*args,**kwargs): - self.device_worker_class = RS_SMHUWorker - SignalGeneratorTab.__init__(self,*args,**kwargs) - - -class RS_SMHUWorker(SignalGeneratorWorker): - # define the scale factor - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e6 - amp_scale_factor = 1.0 - - def init(self): - '''Calls parent init and sends device specific initialization commands''' - SignalGeneratorWorker.init(self) - - # enables ESR status reading - try: - # this is first command to device, - # if failure then it probably isn't connected - self.connection.write('HEADER:OFF;*ESE 60;*SRE 32;*CLS') - except: - msg = 'Initial command to %s did not succeed. Is it connected?' - raise LabscriptError(dedent(msg%self.VISA_name)) from None - self.esr_mask = 60 - - # define instrument specific read and write strings for Freq & Amp control - freq_write_string = 'RF {:.1f}HZ' - freq_query_string = 'RF?' - def freq_parser(self,freq_string): - '''Frequency Query string parser for RS SMHU - freq_string format is sdddddddddd.d - Returns float in instrument units, Hz (i.e. needs scaling to base_units)''' - return float(freq_string) - amp_write_string = 'LEVEL:RF {:.1f}DBM' - amp_query_string = 'LEVEL:RF?' - def amp_parser(self,amp_string): - '''Amplitude Query string parser for RS SMHU - amp_string format is sddd.d - Returns float in instrument units, dBm''' - if amp_string == '\n': - raise LabscriptError('RS SMHU device {0:s} has RF OFF!'.format(self.VISA_name)) - return float(amp_string) - enable_write_string = enable_on_off_formatter('LEV:RF {:s}') - enable_query_string = 'LEV:RF?' - def enable_parser(self,enable_string): - '''Output Enable Query for RS SMHU.''' - return 'ON' in enable_string - - def check_status(self): - # no real info in stb in these older sig gens, use esr instead - esr = int(self.connection.query('*ESR?')) - - # if esr is non-zero, read out the error message and report - # use mask to ignore non-error messages - if (esr & self.esr_mask) != 0: - err_string = self.connection.query('ERRORS?') - # some error conditions do not persist to ERRORS? query (ie query errors) - # Still need to inform user of issue - if err_string.endswith('0'): - err_string = 'Event Status Register: {0:d}'.format(esr) - else: - raise LabscriptError('RS SMHU device {0:s} has \n{1:s}'.format(self.VISA_name,err_string)) - - # note: SMHU has 9 bits in ESR, - # so need to ensure last bit (Sweep End) not present when passed - return self.convert_register(esr & 255) - diff --git a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/__init__.py b/labscript_devices/naqslab_devices/SignalGenerator/BLACS/__init__.py deleted file mode 100644 index 3648fd3d..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/BLACS/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/BLACS/__init__.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### - diff --git a/labscript_devices/naqslab_devices/SignalGenerator/Models.py b/labscript_devices/naqslab_devices/SignalGenerator/Models.py deleted file mode 100644 index 8535c3d2..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/Models.py +++ /dev/null @@ -1,113 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/Models.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from naqslab_devices.SignalGenerator.labscript_device import SignalGenerator - -__version__ = '0.1.0' -__author__ = ['dihm'] - -class RS_SMF100A(SignalGenerator): - description = 'Rhode & Schwarz SMF100A Signal Generator' - # define the scale factor - converts between BLACS front panel and - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e9 # ensure that the BLACS worker class has same scale_factor - freq_limits = (100e3, 22e9) # set in scaled unit (Hz) - amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor - amp_limits = (-26, 18) # set in scaled unit (dBm) - -class RS_SMA100B(SignalGenerator): - description = 'Rhode & Schwarz SMA100B Signal Generator' - # define the scale factor - converts between BLACS front panel and - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e9 # ensure that the BLACS worker class has same scale_factor - freq_limits = (8e3, 20e9) # set in scaled unit (Hz) - amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor - amp_limits = (-145, 35) # set in scaled unit (dBm) - -class RS_SMHU(SignalGenerator): - description = 'RS SMHU Signal Generator' - # define the scale factor - converts between BLACS front panel and - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor - freq_limits = (100e3, 4320e6) # set in scaled unit (Hz) - amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor - amp_limits = (-140, 13) # set in scaled unit (dBm) - # Output high can be adjusted up to 19dBm without spec guarantee - # above 13 will generate error warnings - -class HP_8643A(SignalGenerator): - description = 'HP 8643A Signal Generator' - # define the scale factor - converts between BLACS front panel and - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor - freq_limits = (260e3, 1030e6) # set in scaled unit (Hz) - amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor - amp_limits = (-137, 13) # set in scaled unit (dBm) - -class HP_8642A(SignalGenerator): - description = 'HP 8642A Signal Generator' - # define the scale factor - converts between BLACS front panel and - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor - freq_limits = (100e3, 1057.5e6) # set in scaled unit (Hz) - amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor - amp_limits = (-140, 20) # set in scaled unit (dBm) - # Output limits depend on frequency. Can be as low as 17 dBm - -class HP_8648A(SignalGenerator): - description = 'HP 8648A Signal Generator' - # define the scale factor - converts between BLACS front panel and - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor - freq_limits = (100e3, 1000e6) # set in scaled unit (Hz) - amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor - amp_limits = (-136, 20) # set in scaled unit (dBm) - # Output limits depend on frequency. Can be as low as 10 dBm - -class HP_8648B(SignalGenerator): - description = 'HP 8648B Signal Generator' - # define the scale factor - converts between BLACS front panel and - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor - freq_limits = (9e3, 2000e6) # set in scaled unit (Hz) - amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor - amp_limits = (-136, 20) # set in scaled unit (dBm) - # Output limits depend on frequency. Can be as low as 10 dBm - -class HP_8648C(SignalGenerator): - description = 'HP 8648C Signal Generator' - # define the scale factor - converts between BLACS front panel and - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor - freq_limits = (9e3, 3200e6) # set in scaled unit (Hz) - amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor - amp_limits = (-136, 20) # set in scaled unit (dBm) - # Output limits depend on frequency. Can be as low as 10 dBm - -class HP_8648D(SignalGenerator): - description = 'HP 8648D Signal Generator' - # define the scale factor - converts between BLACS front panel and - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor - freq_limits = (9e3, 4000e6) # set in scaled unit (Hz) - amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor - amp_limits = (-136, 20) # set in scaled unit (dBm) - # Output limits depend on frequency. Can be as low as 10 dBm - -class E8257N(SignalGenerator): - description = 'Keysight E8257N Signal Generator' - # define the scale factor - converts between BLACS front panel and - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e9 # ensure that the BLACS worker class has same scale_factor - freq_limits = (10e6, 40e9) # set in scaled unit (Hz) - amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor - amp_limits = (-105, 20) # set in scaled unit (dBm) - # Output limits depend heavily on frequency diff --git a/labscript_devices/naqslab_devices/SignalGenerator/__init__.py b/labscript_devices/naqslab_devices/SignalGenerator/__init__.py deleted file mode 100644 index a3771047..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/__init__.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -from labscript_devices import deprecated_import_alias - -# For backwards compatibility with old experiment scripts: -RS_SMF100A = deprecated_import_alias("naqslab_devices.SignalGenerator.Models.RS_SMF100A") - -RS_SMHU = deprecated_import_alias("naqslab_devices.SignalGenerator.Models.RS_SMHU") - -HP8643A = deprecated_import_alias("naqslab_devices.SignalGenerator.Models.HP8643A") - -HP8642A = deprecated_import_alias("naqslab_devices.SignalGenerator.Models.HP8642A") diff --git a/labscript_devices/naqslab_devices/SignalGenerator/blacs_tab.py b/labscript_devices/naqslab_devices/SignalGenerator/blacs_tab.py deleted file mode 100644 index b1b40a18..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/blacs_tab.py +++ /dev/null @@ -1,70 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/blacs_tab.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from naqslab_devices.VISA.blacs_tab import VISATab - -# note, when adding a new model, put the labscript_device inheritor class -# into Models.py and the BLACS classes into a file named for the device -# in the BLACS subfolder. Update register_classes.py and __init__.py -# accordingly. - - -class SignalGeneratorTab(VISATab): - # Capabilities - base_units = {'freq':'MHz', 'amp':'dBm'} - base_min = {'freq':0.1, 'amp':-140} - base_max = {'freq':1057.5, 'amp':20} - base_step = {'freq':1, 'amp':0.1} - base_decimals = {'freq':6, 'amp':1} - - status_byte_labels = {'bit 7':'bit 7 label', - 'bit 6':'bit 6 label', - 'bit 5':'bit 5 label', - 'bit 4':'bit 4 label', - 'bit 3':'bit 3 label', - 'bit 2':'bit 2 label', - 'bit 1':'bit 1 label', - 'bit 0':'bit 0 label'} - - def __init__(self,*args,**kwargs): - if not hasattr(self,'device_worker_class'): - #raise LabscriptError('%s __init__ method not overridden!'%self) - self.device_worker_class = 'naqslab_devices.SignalGenerator.blacs_worker.SignalGeneratorWorker' - VISATab.__init__(self,*args,**kwargs) - - def initialise_GUI(self): - # Create the dds channel - dds_prop = {} - dds_prop['channel 0'] = {} #HP signal generators only have one output - for subchnl in ['freq', 'amp']: - dds_prop['channel 0'][subchnl] = {'base_unit':self.base_units[subchnl], - 'min':self.base_min[subchnl], - 'max':self.base_max[subchnl], - 'step':self.base_step[subchnl], - 'decimals':self.base_decimals[subchnl] - } - dds_prop['channel 0']['gate'] = {} - - - # Create the output objects - self.create_dds_outputs(dds_prop) - # Create widgets for output objects - dds_widgets,ao_widgets,do_widgets = self.auto_create_widgets() - # and auto place the widgets in the UI - self.auto_place_widgets(("Frequency Output",dds_widgets)) - - # call VISATab.initialise to create STB widget - VISATab.initialise_GUI(self) - - # Set the capabilities of this device - self.supports_remote_value_check(True) - self.supports_smart_programming(True) - self.statemachine_timeout_add(10000, self.status_monitor) diff --git a/labscript_devices/naqslab_devices/SignalGenerator/blacs_worker.py b/labscript_devices/naqslab_devices/SignalGenerator/blacs_worker.py deleted file mode 100644 index b63e968b..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/blacs_worker.py +++ /dev/null @@ -1,225 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/blacs_worker.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -import numpy as np - -from naqslab_devices.VISA.blacs_worker import VISAWorker -from labscript import LabscriptError - -import labscript_utils.h5_lock, h5py - -# note, when adding a new model, put the labscript_device inheritor class -# into Models.py and the BLACS classes into a file named for the device -# in the BLACS subfolder. Update register_classes.py and __init__.py -# accordingly. - - -class enable_on_off_formatter(str): - '''Class overload that converts input bools to ON or OFF string''' - - def format(self, state): - if state == 0: - s = 'OFF' - elif state == 1: - s = 'ON' - else: - raise ValueError('Argument must be 0 or 1 equivalent.') - - return super().format(s) - - -class SignalGeneratorWorker(VISAWorker): - - # define instrument specific read and write strings for Freq & Amp control - freq_write_string = '' - freq_query_string = '' - def freq_parser(self,freq_string): - '''Frequency Query string parser - - Converts string to float; should be be over-ridden - if that is insufficient. - - Args: - freq_string (str): String result from query. - - Returns: - float: Frequency as a float. - ''' - freq = float(freq_string) - return freq - amp_write_string = '' - amp_query_string = '' - def amp_parser(self,amp_string): - '''Amplitude Query string parser - - Converts string to float; should be be over-ridden - if that is insufficient. - - Args: - amp_string (str): String result from query. - - Returns: - float: Amplitude as a float. - ''' - amp = float(amp_string) - return amp - enable_write_string = '' - enable_query_string = '' - def enable_parser(self,enable_string): - '''Output Enable Query string parser. - - Converts the string to bool; should be over-ridden - if that is insufficient. - - Args: - enable_string (str): String result from query. - - Returns: - bool: Boolean that indicates if output is enabled or not. - ''' - enable = bool(int(enable_string)) - return enable - - def update_cache_from_dict(self, front_panel): - '''Update the STATIC smart cache from a front_panel dictionary''' - - for chan, d in front_panel.items(): - chan_n = chan.split(' ')[-1] - self.smart_cache['STATIC_DATA']['freq'+chan_n] = d['freq']*self.scale_factor - self.smart_cache['STATIC_DATA']['amp'+chan_n] = d['amp']*self.amp_scale_factor - self.smart_cache['STATIC_DATA']['gate'+chan_n] = d['gate'] - - def init(self): - # Call the VISA init to initialise the VISA connection - VISAWorker.init(self) - - # initialize the smart cache - static_dtypes = np.dtype({'names':['freq0','amp0','gate0'], - 'formats':[np.uint64,np.float16,bool]}) - self.smart_cache = {'STATIC_DATA': np.zeros(1, dtype=static_dtypes)[0]} - - # set static smart cache to current state - current_state = self.check_remote_values() - self.update_cache_from_dict(current_state) - - def check_remote_values(self): - # Get the currently output values: - - results = {'channel 0':{}} - - # these query strings and parsers depend heavily on device - freq = self.connection.query(self.freq_query_string) - amp = self.connection.query(self.amp_query_string) - enable = self.connection.query(self.enable_query_string) - - # Convert string to MHz: - results['channel 0']['freq'] = self.freq_parser(freq)/self.scale_factor - - results['channel 0']['amp'] = self.amp_parser(amp)/self.amp_scale_factor - - results['channel 0']['gate'] = self.enable_parser(enable) - - return results - - def program_manual(self,front_panel_values): - freq = front_panel_values['channel 0']['freq'] - amp = front_panel_values['channel 0']['amp'] - enable = front_panel_values['channel 0']['gate'] - - # program with scale factor - fcommand = self.freq_write_string.format(freq*self.scale_factor) - self.connection.write(fcommand) - - # program with scale factor - acommand = self.amp_write_string.format(amp*self.amp_scale_factor) - self.connection.write(acommand) - - # set output state - ecommand = self.enable_write_string.format(enable) - self.connection.write(ecommand) - - # update smart_cache after manual update - updated_state = self.check_remote_values() - self.update_cache_from_dict(updated_state) - - return self.check_remote_values() - - def transition_to_buffered(self,device_name,h5file,initial_values,fresh): - # call parent method to do basic preamble - VISAWorker.transition_to_buffered(self,device_name,h5file,initial_values,fresh) - data = None - # Program static values - with h5py.File(h5file,'r') as hdf5_file: - group = hdf5_file['/devices/'+device_name] - # If there are values to set the unbuffered outputs to, set them now: - if 'STATIC_DATA' in group: - data = group['STATIC_DATA'][0] - - if data is not None: - - if fresh or data != self.smart_cache['STATIC_DATA']: - - # program freq and amplitude as necessary - if data['freq0'] != self.smart_cache['STATIC_DATA']['freq0']: - self.connection.write(self.freq_write_string.format(data['freq0'])) - if data['amp0'] != self.smart_cache['STATIC_DATA']['amp0']: - self.connection.write(self.amp_write_string.format(data['amp0'])) - if data['gate0'] != self.smart_cache['STATIC_DATA']['gate0']: - self.connection.write(self.enable_write_string.format(data['gate0'])) - - # update smart_cache - self.smart_cache['STATIC_DATA'] = data - - # Save these values into final_values so the GUI can - # be updated at the end of the run to reflect them: - final_values = {'channel 0':{}} - - final_values['channel 0']['freq'] = data['freq0']/self.scale_factor - final_values['channel 0']['amp'] = data['amp0']/self.amp_scale_factor - final_values['channel 0']['gate'] = data['gate0'] - - else: - final_values = self.initial_values - - return final_values - - -class MockSignalGeneratorWorker(SignalGeneratorWorker): - """Mock Signal Generator Class - - Mock class for testing Signal Generator Tab functionality. - It does not communicate with any hardware. - """ - - def init(self): - # initialize the smart cache - self.smart_cache = {'STATIC_DATA': {'freq0':0,'amp0':1,'gate0':False}} - - def check_remote_values(self): - return {'channel 0':self.smart_cache['STATIC_DATA']} - - def check_status(self): - stb = 128 - - return self.convert_register(stb) - - def program_manual(self,front_panel_values): - self.smart_cache['STATIC_DATA'] = front_panel_values['channel 0'] - return self.check_remote_values() - - def transition_to_buffered(self,device_name,h5file,initial_values,fresh): - VISAWorker.transition_to_buffered(self,device_name,h5file,initial_values,fresh) - - def clear(self,value): - pass - - def shutdown(self): - pass diff --git a/labscript_devices/naqslab_devices/SignalGenerator/labscript_device.py b/labscript_devices/naqslab_devices/SignalGenerator/labscript_device.py deleted file mode 100644 index 55b3da4b..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/labscript_device.py +++ /dev/null @@ -1,133 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/labscript_device.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -import numpy as np - -from naqslab_devices.VISA.labscript_device import VISA -from labscript import LabscriptError, set_passed_properties, config -from labscript_utils import dedent - -from naqslab_devices import StaticFreqAmp - -__version__ = '0.2.0' -__author__ = ['dihm'] - -# note, when adding a new model, put the labscript_device inheritor class -# into Models.py and the BLACS classes into a file named for the device -# in the BLACS subfolder. Update register_classes.py and __init__.py -# accordingly. - - -class SignalGenerator(VISA): - description = 'Signal Generator' - allowed_children = [StaticFreqAmp] - allowed_chans = [0] - enabled_chans = [] - # define the scale factor - converts between BLACS front panel and instr - # Writing: scale*desired_freq // Reading:desired_freq/scale - scale_factor = 1.0e6 # ensure that the BLACS worker class has same scale_factor - freq_limits = (0,1) # set in scaled unit - amp_scale_factor = 1.0 # ensure that the BLACS worker class has same amp_scale_factor - amp_limits = (0,1) # set in scaled unit - - @set_passed_properties() - def __init__(self, name, VISA_name): - '''VISA_name can be full VISA connection string or NI-MAX alias''' - # Signal Generators do not have a parent device - VISA.__init__(self,name,None,VISA_name) - - def quantise_freq(self,data, device): - '''Quantize the frequency in units of Hz and check it's within bounds''' - # It's faster to add 0.5 then typecast than to round to integers first (device is programmed in Hz): - data = np.array((self.scale_factor*data)+0.5, dtype=np.uint64) - - # Ensure that frequencies are within bounds: - if any(data < self.freq_limits[0] ) or any(data > self.freq_limits[1] ): - msg = '''{:s} {:s} can only have frequencies between - {:E}Hz and {:E}Hz, {} given'''.format(device.description, - device.name, *self.freq_limits, - data) - raise LabscriptError(dedent(msg)) - return data, self.scale_factor - - def quantise_amp(self,data, device): - '''Quantize the amplitude in units of dBm and check it's within bounds''' - # Keep as float since programming often done down to 0.1dBm (device is programmed in dBm): - data = np.array((self.amp_scale_factor*data), dtype=np.float16) - - # Ensure that amplitudes are within bounds: - if any(data < self.amp_limits[0] ) or any(data > self.amp_limits[1] ): - msg = '''{:s} {:s} can only have amplitudes between - {:.1f} dBm and {:.1f} dBm, {} given'''.format(device.description, - device.name,*self.amp_limits, - data) - raise LabscriptError(dedent(msg)) - return data, self.amp_scale_factor - - def enable_output(self, channel=0): - """Enable the output at the device level. - - This is a software enable only, it cannot be hardware timed. - - Args: - channel (int, optional): Channel to enable. Defaults to 0, which - is expected for single output devices. - """ - - if channel in self.allowed_chans: - if channel not in self.enabled_chans: - self.enabled_chans.append(channel) - else: - raise LabscriptError(f'Channel {channel} is not a valid option for {self.device.name}') - - def generate_code(self, hdf5_file): - if not len(self.child_devices): - print(f'No outputs attached to {self.name:s}') - return - for output in self.child_devices: - try: - prefix, channel = output.connection.split() - channel = int(channel) - except: - msg = '''{:s} {:s} has invalid connection string: \'{!s}\'. - Format must be \'channel n\' with n equal 0.''' - raise LabscriptError(dedent(msg.format(output.description, - output.name,output.connection))) - if channel != 0: - msg = '''{:s} {:s} has invalid connection string: \'{!s}\'. - Format must be \'channel n\' with n equal 0.''' - raise LabscriptError(dedent(msg.format(output.description, - output.name,output.connection))) - dds = output - # Call these functions to finalise stuff: - ignore = dds.frequency.get_change_times() - dds.frequency.make_timeseries([]) - dds.frequency.expand_timeseries() - - ignore = dds.amplitude.get_change_times() - dds.amplitude.make_timeseries([]) - dds.amplitude.expand_timeseries() - - dds.frequency.raw_output, dds.frequency.scale_factor = self.quantise_freq(dds.frequency.raw_output, dds) - dds.amplitude.raw_output, dds.amplitude.scale_factor = self.quantise_amp(dds.amplitude.raw_output, dds) - static_dtypes = np.dtype({'names':['freq0','amp0','gate0'],'formats':[np.uint64,np.float16,bool]}) - static_table = np.zeros(1, dtype=static_dtypes) - static_table['freq0'].fill(1) - static_table['freq0'] = dds.frequency.raw_output[0] - static_table['amp0'].fill(1) - static_table['amp0'] = dds.amplitude.raw_output[0] - static_table['gate0'].fill(0) - static_table['gate0'] = 0 in self.enabled_chans # returns True if channel 0 enabled - grp = hdf5_file.create_group('/devices/'+self.name) - grp.create_dataset('STATIC_DATA',compression=config.compression,data=static_table) - self.set_property('frequency_scale_factor', self.scale_factor, location='device_properties') - self.set_property('amplitude_scale_factor', self.amp_scale_factor, location='device_properties') - diff --git a/labscript_devices/naqslab_devices/SignalGenerator/register_classes.py b/labscript_devices/naqslab_devices/SignalGenerator/register_classes.py deleted file mode 100644 index 1655a75f..00000000 --- a/labscript_devices/naqslab_devices/SignalGenerator/register_classes.py +++ /dev/null @@ -1,65 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/SignalGenerator/register_classes.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -"""Configures which BLACS_tab goes to which labscript_device.""" - -import labscript_devices - -labscript_devices.register_classes( - 'RS_SMF100A', - BLACS_tab='naqslab_devices.SignalGenerator.BLACS.RS_SMF100A.RS_SMF100ATab', - runviewer_parser='') - -labscript_devices.register_classes( - 'RS_SMA100B', - BLACS_tab='naqslab_devices.SignalGenerator.BLACS.RS_SMA100B.RS_SMA100BTab', - runviewer_parser='') - -labscript_devices.register_classes( - 'RS_SMHU', - BLACS_tab='naqslab_devices.SignalGenerator.BLACS.RS_SMHU.RS_SMHUTab', - runviewer_parser='') - -labscript_devices.register_classes( - 'HP_8643A', - BLACS_tab='naqslab_devices.SignalGenerator.BLACS.HP_8643A.HP_8643ATab', - runviewer_parser='') - -labscript_devices.register_classes( - 'HP_8642A', - BLACS_tab='naqslab_devices.SignalGenerator.BLACS.HP_8642A.HP_8642ATab', - runviewer_parser='') - -labscript_devices.register_classes( - 'HP_8648A', - BLACS_tab='naqslab_devices.SignalGenerator.BLACS.HP_8648.HP_8648ATab', - runviewer_parser='') - -labscript_devices.register_classes( - 'HP_8648B', - BLACS_tab='naqslab_devices.SignalGenerator.BLACS.HP_8648.HP_8648BTab', - runviewer_parser='') - -labscript_devices.register_classes( - 'HP_8648C', - BLACS_tab='naqslab_devices.SignalGenerator.BLACS.HP_8648.HP_8648CTab', - runviewer_parser='') - -labscript_devices.register_classes( - 'HP_8648D', - BLACS_tab='naqslab_devices.SignalGenerator.BLACS.HP_8648.HP_8648DTab', - runviewer_parser='') - -labscript_devices.register_classes( - 'E8257N', - BLACS_tab='naqslab_devices.SignalGenerator.BLACS.KeysightSigGens.E8257NTab', - runviewer_parser='') diff --git a/labscript_devices/naqslab_devices/TektronixTDS/__init__.py b/labscript_devices/naqslab_devices/TektronixTDS/__init__.py deleted file mode 100644 index 6d734b18..00000000 --- a/labscript_devices/naqslab_devices/TektronixTDS/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/TektronixTDS/__init__.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -from labscript_devices import deprecated_import_alias - - -# For backwards compatibility with old experiment scripts: -TekScope = deprecated_import_alias("naqslab_devices.TektronixTDS.labscript_device.TDS_Scope") diff --git a/labscript_devices/naqslab_devices/TektronixTDS/blacs_tab.py b/labscript_devices/naqslab_devices/TektronixTDS/blacs_tab.py deleted file mode 100644 index a6f0573a..00000000 --- a/labscript_devices/naqslab_devices/TektronixTDS/blacs_tab.py +++ /dev/null @@ -1,40 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/TektronixTDS/blacs_tab.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from naqslab_devices.VISA.blacs_tab import VISATab - - -class TDS_ScopeTab(VISATab): - # Event Byte Label Definitions for TDS200/1000/2000 series scopes - # Used bits set by '*ESE' command in setup string of worker class - status_byte_labels = {'bit 7':'Unused', - 'bit 6':'Unused', - 'bit 5':'Command Error', - 'bit 4':'Execution Error', - 'bit 3':'Device Error', - 'bit 2':'Query Error', - 'bit 1':'Unused', - 'bit 0':'Unused'} - - def __init__(self,*args,**kwargs): - if not hasattr(self,'device_worker_class'): - self.device_worker_class = 'naqslab_devices.TektronixTDS.blacs_worker.TDS_ScopeWorker' - VISATab.__init__(self,*args,**kwargs) - - def initialise_GUI(self): - # Call the VISATab parent to initialise the STB ui and set the worker - VISATab.initialise_GUI(self) - - # Set the capabilities of this device - self.supports_remote_value_check(False) - self.supports_smart_programming(False) - self.statemachine_timeout_add(5000, self.status_monitor) - diff --git a/labscript_devices/naqslab_devices/TektronixTDS/blacs_worker.py b/labscript_devices/naqslab_devices/TektronixTDS/blacs_worker.py deleted file mode 100644 index 24ba1cfb..00000000 --- a/labscript_devices/naqslab_devices/TektronixTDS/blacs_worker.py +++ /dev/null @@ -1,105 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/TektronixTDS/blacs_worker.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -import numpy as np - -from naqslab_devices.VISA.blacs_worker import VISAWorker -from labscript import LabscriptError - -import labscript_utils.h5_lock, h5py - - -class TDS_ScopeWorker(VISAWorker): - # define instrument specific read and write strings - setup_string = ':HEADER OFF;*ESE 60;*SRE 32;*CLS;:DAT:ENC RIB;WID 2;' - read_y_parameters_string = ':DAT:SOU CH%d;:WFMPRE:YZE?;YMU?;YOFF?' - read_x_parameters_string = ':WFMPRE:XZE?;XIN?' - read_waveform_string = 'CURV?' - - def waveform_parser(self,raw_waveform_array,y0,dy,yoffset): - '''Parses the numpy array from the CURV? query.''' - return (raw_waveform_array - yoffset)*dy + y0 - - def init(self): - - # Call the VISA init to initialise the VISA connection - VISAWorker.init(self) - # Override the timeout for longer scope waits - self.connection.timeout = 10000 - - # Query device name to ensure supported scope - ident_string = self.connection.query('*IDN?') - if ('TEKTRONIX,TDS 2' in ident_string) or ('TEKTRONIX,TDS 1' in ident_string): - # Scope supported! - pass - else: - raise LabscriptError('Device {0:s} with VISA name {1:s} not supported!'.format(ident_string,self.VISA_name)) - - # initialization stuff - self.connection.write(self.setup_string) - - def transition_to_manual(self,abort = False): - if not abort: - with h5py.File(self.h5_file,'r') as hdf5_file: - try: - # get acquisitions table values so we can close the file - acquisitions = hdf5_file['/devices/'+self.device_name+'/ACQUISITIONS'].value - trigger_time = hdf5_file['/devices/'+self.device_name+'/ACQUISITIONS'].attrs['trigger_time'] - except: - # No acquisitions! - return True - # close lock on h5 to read from scope, it takes a while - data = {} - for connection,label in acquisitions: - channel_num = int(connection.split(' ')[-1]) - [y0,dy,yoffset] = self.connection.query_ascii_values(self.read_y_parameters_string % channel_num, container=np.array, separator=';') - raw_data = self.connection.query_binary_values(self.read_waveform_string, - datatype='h', is_big_endian=True, container=np.array) - data[connection] = self.waveform_parser(raw_data,y0,dy,yoffset) - # Need to calculate the time array - num_points = len(raw_data) - # read out the time parameters once outside the loop to save time - [t0, dt] = self.connection.query_ascii_values(self.read_x_parameters_string, - container=np.array, separator=';') - data['time'] = np.arange(0,num_points,1,dtype=np.float64)*dt + t0 - # define the dtypes for the h5 arrays - dtypes = np.dtype({'names':['t','values'],'formats':[np.float64,np.float32]}) - - # re-open lock on h5file to save data - with h5py.File(self.h5_file,'r+') as hdf5_file: - try: - measurements = hdf5_file['/data/traces'] - except: - # Group doesn't exist yet, create it - measurements = hdf5_file.create_group('/data/traces') - # write out the data to the h5file - for connection,label in acquisitions: - values = np.empty(num_points,dtype=dtypes) - values['t'] = data['time'] - values['values'] = data[connection] - measurements.create_dataset(label, data=values) - # and save some timing info for reference to labscript time - measurements[label].attrs['trigger_time'] = trigger_time - - - return True - - def check_status(self): - '''Uses the more informative ESR register.''' - esr = int(self.connection.query('*ESR?')) - - # if esr is non-zero, read out the error message and report - if esr != 0: - errors = self.connection.query('ALLEV?') - raise LabscriptError('Tek Scope VISA device {0:s} has Errors in Queue: \n{1:s}'.format(self.VISA_name,errors)) - - return self.convert_register(esr) - diff --git a/labscript_devices/naqslab_devices/TektronixTDS/labscript_device.py b/labscript_devices/naqslab_devices/TektronixTDS/labscript_device.py deleted file mode 100644 index 0b39c635..00000000 --- a/labscript_devices/naqslab_devices/TektronixTDS/labscript_device.py +++ /dev/null @@ -1,64 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/TektronixTDS/labscript_device.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -from labscript import TriggerableDevice, config, LabscriptError, set_passed_properties -from naqslab_devices import ScopeChannel - -__version__ = '0.1.0' -__author__ = ['dihm'] - -class TDS_Scope(TriggerableDevice): - description = 'Tektronics TDS Series Digital Oscilliscope' - allowed_children = [ScopeChannel] - trigger_duration = 1e-3 - - @set_passed_properties(property_names = { - "device_properties":["VISA_name"]} - ) - def __init__(self, name,VISA_name, trigger_device, trigger_connection, **kwargs): - '''VISA_name can be full VISA connection string or NI-MAX alias. - Trigger Device should be fast clocked device. ''' - self.VISA_name = VISA_name - self.BLACS_connection = VISA_name - TriggerableDevice.__init__(self,name,trigger_device,trigger_connection,**kwargs) - - # initialize start_time variable - self.trigger_time = None - - - def generate_code(self, hdf5_file): - - Device.generate_code(self, hdf5_file) - - acquisitions = [] - for channel in self.child_devices: - if channel.acquisitions: - acquisitions.append((channel.connection,channel.acquisitions[0]['label'])) - acquisition_table_dtypes = np.dtype({'names':['connection','label'],'formats':['a256','a256']}) - acquisition_table = np.empty(len(acquisitions),dtype=acquisition_table_dtypes) - for i, acq in enumerate(acquisitions): - acquisition_table[i] = acq - - grp = self.init_device_group(hdf5_file) - # write table to h5file if non-empty - if len(acquisition_table): - grp.create_dataset('ACQUISITIONS',compression=config.compression, - data=acquisition_table) - grp['ACQUISITIONS'].attrs['trigger_time'] = self.trigger_time - - def acquire(self,start_time): - '''Call to define time when trigger will happen for scope.''' - if not self.child_devices: - raise LabscriptError('No channels acquiring for trigger {0:s}'.format(self.name)) - else: - self.parent_device.trigger(start_time,self.trigger_duration) - self.trigger_time = start_time - diff --git a/labscript_devices/naqslab_devices/TektronixTDS/register_classes.py b/labscript_devices/naqslab_devices/TektronixTDS/register_classes.py deleted file mode 100644 index 3c97a928..00000000 --- a/labscript_devices/naqslab_devices/TektronixTDS/register_classes.py +++ /dev/null @@ -1,18 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/TektronixTDS/register_classes.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -import labscript_devices - -labscript_devices.register_classes( - 'TDS_Scope', - BLACS_tab='naqslab_devices.TektronixTDS.blacs_tab.TDS_ScopeTab', - runviewer_parser='') diff --git a/labscript_devices/naqslab_devices/VISA/__init__.py b/labscript_devices/naqslab_devices/VISA/__init__.py deleted file mode 100644 index 6eb29dca..00000000 --- a/labscript_devices/naqslab_devices/VISA/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/VISA/__init__.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### - -from labscript_devices import deprecated_import_alias - - -# For backwards compatibility with old experiment scripts: -VISA = deprecated_import_alias("naqslab_devices.VISA.labscript_device.VISA") diff --git a/labscript_devices/naqslab_devices/VISA/blacs_tab.py b/labscript_devices/naqslab_devices/VISA/blacs_tab.py deleted file mode 100644 index 1e93967c..00000000 --- a/labscript_devices/naqslab_devices/VISA/blacs_tab.py +++ /dev/null @@ -1,109 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/VISA/blacs_tab.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -""" -Boiler plate blacs_tab for VISA instruments. - -Defines the common STBstatus.ui widget all devices use to report their current status. -""" -from labscript import LabscriptError - -from blacs.tab_base_classes import define_state -from blacs.tab_base_classes import MODE_MANUAL, MODE_TRANSITION_TO_BUFFERED, MODE_TRANSITION_TO_MANUAL, MODE_BUFFERED -from blacs.device_base_class import DeviceTab -from qtutils import UiLoader -import os - -# Imports for handling icons in STBstatus.ui -from qtutils.qt import QtCore -from qtutils.qt import QtGui - -class VISATab(DeviceTab): - # Define the Status Byte labels with this dictionary structure - status_byte_labels = {'bit 7':'bit 7 label', - 'bit 6':'bit 6 label', - 'bit 5':'bit 5 label', - 'bit 4':'bit 4 label', - 'bit 3':'bit 3 label', - 'bit 2':'bit 2 label', - 'bit 1':'bit 1 label', - 'bit 0':'bit 0 label'} - status_widget = 'STBstatus.ui' - - STBui_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),status_widget) - - def __init__(self,*args,**kwargs): - """You MUST override this method in order to define the device worker. - You then call this parent method to finish initialization. - """ - if not hasattr(self,'device_worker_class'): - raise LabscriptError('BLACS worker not set for device: {0:s}'.format(self)) - DeviceTab.__init__(self,*args,**kwargs) - - def initialise_GUI(self): - """Loads the standard STBstatus.ui widget and sets the worker defined in __init__""" - # load the status_ui for the STB register - self.status_ui = UiLoader().load(self.STBui_path) - self.get_tab_layout().addWidget(self.status_ui) - - # generate the dictionaries - self.status_bits = ['bit 0', 'bit 1', 'bit 2', 'bit 3', 'bit 4', 'bit 5', 'bit 6', 'bit 7'] - self.bit_labels_widgets = {} - self.bit_values_widgets = {} - self.status = {} - for bit in self.status_bits: - self.status[bit] = False - self.bit_values_widgets[bit] = getattr(self.status_ui, 'status_{0:s}'.format(bit.split()[1])) - self.bit_labels_widgets[bit] = getattr(self.status_ui, 'status_label_{0:s}'.format(bit.split()[1])) - - # Dynamically update status bits with correct names - for key in self.status_bits: - self.bit_labels_widgets[key].setText(self.status_byte_labels[key]) - self.status_ui.clear_button.clicked.connect(self.send_clear) - - - ################################ Initalize worker - - # Store the VISA name to be used - self.address = str(self.settings['connection_table'].find_by_name(self.settings["device_name"]).BLACS_connection) - #self.device_name = str(self.settings['device_name']) - - # Create and set the primary worker - self.create_worker("main_worker", - self.device_worker_class, - {'address':self.address, - }) - self.primary_worker = "main_worker" - - - # This function gets the status, - # and updates the front panel widgets! - @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True) - def status_monitor(self): - # When called with a queue, this function writes to the queue - # when the pulseblaster is waiting. This indicates the end of - # an experimental run. - self.status = yield(self.queue_work(self._primary_worker,'check_status')) - - for key in self.status_bits: - if self.status[key]: - icon = QtGui.QIcon(':/qtutils/fugue/tick') - else: - icon = QtGui.QIcon(':/qtutils/fugue/cross') - pixmap = icon.pixmap(QtCore.QSize(16,16)) - self.bit_values_widgets[key].setPixmap(pixmap) - - - @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) - def send_clear(self,widget=None): - value = self.status_ui.clear_button.isChecked() - yield(self.queue_work(self._primary_worker,'clear',value)) - diff --git a/labscript_devices/naqslab_devices/VISA/blacs_worker.py b/labscript_devices/naqslab_devices/VISA/blacs_worker.py deleted file mode 100644 index bd4af3c6..00000000 --- a/labscript_devices/naqslab_devices/VISA/blacs_worker.py +++ /dev/null @@ -1,127 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/VISA/blacs_worker.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -""" -Boiler plate BLACS_worker for VISA instruments. - -Inheritors use the same communication protocol, but override the command syntax. -""" -from blacs.tab_base_classes import Worker - -from labscript import LabscriptError -from labscript_utils import dedent - -import pyvisa as visa - -class VISAWorker(Worker): - def init(self): - """Initializes basic worker and opens VISA connection to device. - - Default connection timeout is 2 seconds""" - self.VISA_name = self.address - self.resourceMan = visa.ResourceManager() - try: - self.connection = self.resourceMan.open_resource(self.VISA_name) - except visa.VisaIOError: - msg = '''{:s} not found! Is it connected?'''.format(self.VISA_name) - raise LabscriptError(dedent(msg)) from None - self.connection.timeout = 2000 - - - - def convert_register(self,register): - """Converts returned register value to dict of bools - - Args: - register (int): Status register value returned from - :obj:`read_stb ` - - Returns: - dict: Status byte dictionary as formatted in :obj:`VISATab` - """ - results = {} - #get the status and convert to binary, and take off the '0b' header: - status = bin(register)[2:] - # if the status is less than 8 bits long, pad the start with zeros! - while len(status)<8: - status = '0'+status - # reverse the status string so bit 0 is first indexed - status = status[::-1] - # fill the status byte dictionary - for i in range(0,8): - results['bit '+str(i)] = bool(int(status[i])) - - return results - - def check_status(self): - """Reads the Status Byte Register of the VISA device. - - Returns: - dict: Status byte dictionary as formatted in :obj:`VISATab` - """ - results = {} - stb = self.connection.read_stb() - - return self.convert_register(stb) - - - def clear(self,value): - """Sends standard \*CLR to clear registers of device. - - Args: - value (bool): value of Clear button in STBstatus.ui widget - """ - self.connection.clear() - - def transition_to_buffered(self,device_name,h5file,initial_values,fresh): - """Stores various device handles for use in transition_to_manual method. - - Automatically called by BLACS. Should be over-ridden by inheritors. - - Args: - device_name (str): Name of device from connectiontable - h5file (str): path to shot h5_file - initial_values (dict): Contains the start of shot values - fresh (bool): Indicates if smart_programming should be refreshed this shot - """ - # Store the initial values in case we have to abort and restore them: - self.initial_values = initial_values - # Store the final values to for use during transition_to_static: - self.final_values = {} - # Store some parameters for saving data later - self.h5_file = h5file - self.device_name = device_name - - return self.final_values - - def abort_transition_to_buffered(self): - """Special abort shot configuration code belongs here. - """ - return self.transition_to_manual(True) - - def abort_buffered(self): - """Special abort shot code belongs here. - """ - return self.transition_to_manual(True) - - def transition_to_manual(self,abort = False): - """Simple transition_to_manual method where no data is saved.""" - if abort: - # If we're aborting the run, reset to original value - self.program_manual(self.initial_values) - # If we're not aborting the run, stick with buffered value. Nothing to do really! - # return the current values in the device - return True - - def shutdown(self): - """Closes VISA connection to device.""" - self.connection.close() - diff --git a/labscript_devices/naqslab_devices/VISA/labscript_device.py b/labscript_devices/naqslab_devices/VISA/labscript_device.py deleted file mode 100644 index 6792a0b1..00000000 --- a/labscript_devices/naqslab_devices/VISA/labscript_device.py +++ /dev/null @@ -1,47 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/VISA/labscript_device.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### -""" -Boiler plate labscript_device for VISA instruments. -""" -from labscript import Device, LabscriptError, set_passed_properties - -__version__ = '0.1.1' -__author__ = ['dihm'] - -class VISA(Device): - description = 'VISA Compatible Instrument' - allowed_children = [] - - @set_passed_properties(property_names = { - "device_properties":["VISA_name"]} - ) - def __init__(self, name, parent_device, VISA_name, **kwargs): - """Base VISA labscript_device class. - - Inheritors should call VISA.__init__() in their own __init__() method. - Generate_code must be overridden. - - Args: - name (str): name of device in connectiontable - parent_device (obj): Handle to any parent device. - VISA_name (str): Can be full VISA connection string or NI-MAX alias. - """ - self.VISA_name = VISA_name - self.BLACS_connection = VISA_name - Device.__init__(self, name, parent_device, VISA_name) - - def generate_code(self, hdf5_file): - """Method to generate instructions for blacs_worker to program device. - - Must be over-ridden.""" - raise LabscriptError('generate_code() must be overridden for {0:s}'.format(self.name)) - diff --git a/labscript_devices/naqslab_devices/VISA/register_classes.py b/labscript_devices/naqslab_devices/VISA/register_classes.py deleted file mode 100644 index 6cdf5c78..00000000 --- a/labscript_devices/naqslab_devices/VISA/register_classes.py +++ /dev/null @@ -1,23 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/VISA/register_classes.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of naqslab_devices, # -# and is licensed under the # -# Simplified BSD License. See the license.txt file in the root of # -# the project for the full license. # -# # -##################################################################### -""" -Sets which BLACS_tab belongs to each labscript device. -""" - -import labscript_devices - -labscript_devices.register_classes( - 'VISA', - BLACS_tab='naqslab_devices.VISA.blacs_tab.VISATab', - runviewer_parser='' -) diff --git a/labscript_devices/naqslab_devices/VISA/tests.py b/labscript_devices/naqslab_devices/VISA/tests.py deleted file mode 100644 index e69de29b..00000000 diff --git a/labscript_devices/naqslab_devices/__init__.py b/labscript_devices/naqslab_devices/__init__.py deleted file mode 100644 index 53396482..00000000 --- a/labscript_devices/naqslab_devices/__init__.py +++ /dev/null @@ -1,146 +0,0 @@ -##################################################################### -# # -# /naqslab_devices/__init__.py # -# # -# Copyright 2018, David Meyer # -# # -# This file is part of the naqslab devices extension to the # -# labscript_suite. It is licensed under the Simplified BSD License. # -# # -# # -##################################################################### - -# basic init for naqslab_devices -# defines a version and author - - -import sys -import os - -sys.path -sys.path.append(os.getcwd()) - -import sys -import os - - - - -import labscript_devices - -__version__ = '0.4.0' -__author__ = ['dihm'] - -############################################# -# define helper sub-classes of labscript defined channels -# Working constellation from hier is labscript * 3 - -from labscript import Device, AnalogIn, StaticDDS, LabscriptError -#from labscript.labscript import * - - -class ScopeChannel(AnalogIn): - """Subclass of labscript.AnalogIn that marks an acquiring scope channel. - """ - description = 'Scope Acquisition Channel Class' - - def __init__(self, name, parent_device, connection): - """This instantiates a scope channel to acquire during a buffered shot. - - Args: - name (str): Name to assign channel - parent_device (obj): Handle to parent device - connection (str): Which physical scope channel is acquiring. - Generally of the form \'Channel n\' where n is - the channel label. - """ - Device.__init__(self,name,parent_device,connection) - self.acquisitions = [] - - def acquire(self): - """Inform BLACS to save data from this channel. - - Note that the parent_device controls when the acquisition trigger is sent. - """ - if self.acquisitions: - raise LabscriptError('Scope Channel {0:s}:{1:s} can only have one acquisition!'.format(self.parent_device.name,self.name)) - else: - self.acquisitions.append({'label': self.name}) - - -class CounterScopeChannel(ScopeChannel): - """Subclass of :obj:`ScopeChannel` that allows for pulse counting.""" - description = 'Scope Acquisition Channel Class with Pulse Counting' - - def __init__(self, name, parent_device, connection): - """This instantiates a counter scope channel to acquire during a buffered shot. - - Args: - name (str): Name to assign channel - parent_device (obj): Handle to parent device - connection (str): Which physical scope channel is acquiring. - Generally of the form \'Channel n\' where n is - the channel label. - """ - ScopeChannel.__init__(self,name,parent_device,connection) - self.counts = [] - - def count(self,typ,pol): - """Register a pulse counter operation for this channel. - - Args: - typ (str): count 'pulse' or 'edge' - pol (str): reference to 'pos' or 'neg' edges - """ - # guess we can allow multiple types of counters per channel - if (typ in ['pulse', 'edge']) and (pol in ['pos', 'neg']): - self.counts.append({'type':typ,'polarity':pol}) - else: - raise LabscriptError('Invalid counting parameters for {0:s}:{1:s}'.format(self.parent_name,self.name)) - - -class StaticFreqAmp(StaticDDS): - """A Static Frequency that supports frequency and amplitude control. - - If phase control is needed, use labscript.StaticDDS""" - description = 'Frequency Source class for Signal Generators' - - def __init__(self, *args, **kwargs): - """This instatiates a static frequency output channel. - - Frequency and amplitude limits set here will supercede those dictated - by the device class, but only when compiling a shot with runmanager. - Static update limits are enforced by the BLACS Tab for the parent device. - - Args: - *args: Passed to parent init. - **kwargs: Passed to parent init. - - Raises: - LabscriptError: If **kwargs contains phase settings, which are not supported. - """ - - if not {'phase_limits','phase_conv_class','phase_conv_params'}.isdisjoint(kwargs.keys()): - raise LabscriptError(f'{self.device.name} does not support any phase configurations.') - - super().__init__(*args,**kwargs) - # set default values within limits specified - # if not specified, use limits from parent device - parent_device = args[1] - freq_limits = kwargs.get('freq_limits') - amp_limits = kwargs.get('amp_limits') - if freq_limits is not None: - self.frequency.default_value = freq_limits[0] - else: - self.frequency.default_value = parent_device.freq_limits[0]/parent_device.scale_factor - if amp_limits is not None: - self.amplitude.default_value = amp_limits[0] - else: - self.amplitude.default_value = parent_device.amp_limits[0]/parent_device.amp_scale_factor - - def setphase(self,value,units=None): - """Overridden from StaticDDS so as not to provide phase control, which - is generally not supported by :obj:`SignalGenerator` devices. - """ - raise LabscriptError('StaticFreqAmp does not support phase control') - diff --git a/labscript_devices/naqslab_devices/doc/KeysightDCSupply.rst b/labscript_devices/naqslab_devices/doc/KeysightDCSupply.rst deleted file mode 100644 index 3866d176..00000000 --- a/labscript_devices/naqslab_devices/doc/KeysightDCSupply.rst +++ /dev/null @@ -1,21 +0,0 @@ -KeysightDCSupply -================ - -Overview --------- - -This device class controls Keysight/Agilent DC Power Supplies. - -The underlying implementation is to use the outputs as StaticAnalogOut. -The type of analog quantity (voltage or current source) is configured at the -device level based on whether the outputs are voltage limited or current limited. - -At present, this driver is fairly limited in its control. Most importantly, -the driver does not set both voltage and current limits (i.e. setting a max -current limit when in constant voltage mode). A modified StaticAnalogOut will -be necessary. -It is also only tested for the E364x series single output supplies. -It is written such that multiple outputs could be supported easily, -but that functionality is untested. - -.. include:: _apidoc\naqslab_devices.KeysightDCSupply.inc diff --git a/labscript_devices/naqslab_devices/doc/KeysightXSeries.rst b/labscript_devices/naqslab_devices/doc/KeysightXSeries.rst deleted file mode 100644 index c4969be3..00000000 --- a/labscript_devices/naqslab_devices/doc/KeysightXSeries.rst +++ /dev/null @@ -1,11 +0,0 @@ -KeysightXSeries -=============== - -Overview --------- - -This devices covers Keysight X-series oscilloscopes. It has been -explicitely tested with 1000 and 3000 series 'scopes. Other series -should be simple to implement. - -.. include:: _apidoc\naqslab_devices.KeysightXSeries.inc diff --git a/labscript_devices/naqslab_devices/doc/Makefile b/labscript_devices/naqslab_devices/doc/Makefile deleted file mode 100644 index 8d760f8c..00000000 --- a/labscript_devices/naqslab_devices/doc/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile apidoc - -apidoc: - sphinx-apidoc .. -TMEf --templatedir=_templates -s inc -o .\_apidoc - -clean: - rm -rf ./_build - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/labscript_devices/naqslab_devices/doc/NovaTechDDS.rst b/labscript_devices/naqslab_devices/doc/NovaTechDDS.rst deleted file mode 100644 index dfe0d2e9..00000000 --- a/labscript_devices/naqslab_devices/doc/NovaTechDDS.rst +++ /dev/null @@ -1,11 +0,0 @@ -NovaTechDDS -=========== - -Overview --------- - -This modules covers the 409B-AC, 409B, and 440A DDS frequency synthesizers from Novatech. - -Note that the 409B-AC class is largely interchangable with the DDS9m labscript_devices class. - -.. include:: _apidoc\naqslab_devices.NovaTechDDS.inc diff --git a/labscript_devices/naqslab_devices/doc/PulseBlasterESRPro300.rst b/labscript_devices/naqslab_devices/doc/PulseBlasterESRPro300.rst deleted file mode 100644 index 9affb560..00000000 --- a/labscript_devices/naqslab_devices/doc/PulseBlasterESRPro300.rst +++ /dev/null @@ -1,10 +0,0 @@ -PulseBlasterESRPro300 -===================== - -Overview --------- - -This is a thin subclass of the PulseBlaster_No_DDS labscript_device. It merely -configures the correct clock speed, digital output number, and clock resolution limits. - -.. include:: _apidoc\naqslab_devices.PulseBlasterESRPro300.inc diff --git a/labscript_devices/naqslab_devices/doc/PulseBlaster_No_DDS_200.rst b/labscript_devices/naqslab_devices/doc/PulseBlaster_No_DDS_200.rst deleted file mode 100644 index 4ee0f8c6..00000000 --- a/labscript_devices/naqslab_devices/doc/PulseBlaster_No_DDS_200.rst +++ /dev/null @@ -1,10 +0,0 @@ -PulseBlaster_No_DDS_200 -======================= - -Overview --------- - -This is a thin subclass of the PulseBlaster_No_DDS labscript_device. It merely -configures the correct clock speed and clock resolution limits for our custom 200 MHz clocked USB PulseBlaster board. - -.. include:: _apidoc\naqslab_devices.PulseBlaster_No_DDS_200.inc diff --git a/labscript_devices/naqslab_devices/doc/SR865.rst b/labscript_devices/naqslab_devices/doc/SR865.rst deleted file mode 100644 index 83917291..00000000 --- a/labscript_devices/naqslab_devices/doc/SR865.rst +++ /dev/null @@ -1,11 +0,0 @@ -SR865 -===== - -Overview --------- - -This device class controls the Stanford Research Systems 865 series Lock-in Amplifier. -It only implements control functions. Data acquisition is not directly supported at this time. -To get buffered data, please use a DAQ connected to the analog outputs of the 865. - -.. include:: _apidoc\naqslab_devices.SR865.inc diff --git a/labscript_devices/naqslab_devices/doc/SignalGenerator.rst b/labscript_devices/naqslab_devices/doc/SignalGenerator.rst deleted file mode 100644 index dde99d01..00000000 --- a/labscript_devices/naqslab_devices/doc/SignalGenerator.rst +++ /dev/null @@ -1,116 +0,0 @@ -SignalGenerator -=============== - -Overview --------- - -This is a parent class for static RF Signal Generators with frequency and amplitude control and -use the IEEE 488 or SCPI command protocols. Device communication is handled using the VISA -communication protocol. - -.. autosummary:: - naqslab_devices.SignalGenerator.Models - naqslab_devices.SignalGenerator.blacs_tab - naqslab_devices.SignalGenerator.blacs_worker - naqslab_devices.SignalGenerator.labscript_device - naqslab_devices.SignalGenerator.register_classes - -Models ------- - -Currently covered models include: - -.. currentmodule:: naqslab_devices.SignalGenerator.BLACS - -.. autosummary:: - HP_8642A - HP_8643A - HP_8648 - RS_SMA100B - RS_SMF100A - RS_SMHU - KeysightSigGens - -Adding a Signal Generator -------------------------- - -In order to add a new model of signal generator one must: - -#. Add a subclass :obj:`SignalGenerator.labscript_device` in :obj:`SignalGenerator.Models` - which provides the operational limits. -#. Subclass :obj:`SignalGenerator.blacs_tab` - and :obj:`SignalGenerator.blacs_worker` with the operational details for communicating - with the device (namely command syntax and status byte definitions). -#. Add an entry in :obj:`SignalGenerator.register_classes` that links the labscript_device to - the correct blacs_tab. Note that multiple labscript_devices can use the same blacs_tab/blacs_worker. - -Detailed Documentation ----------------------- - -.. automodule:: naqslab_devices.SignalGenerator.BLACS.HP_8642A - :members: - :undoc-members: - :show-inheritance: - - -.. automodule:: naqslab_devices.SignalGenerator.BLACS.HP_8643A - :members: - :undoc-members: - :show-inheritance: - - -.. automodule:: naqslab_devices.SignalGenerator.BLACS.HP_8648 - :members: - :undoc-members: - :show-inheritance: - -.. automodule:: naqslab_devices.SignalGenerator.BLACS.RS_SMA100B - :members: - :undoc-members: - :show-inheritance: - -.. automodule:: naqslab_devices.SignalGenerator.BLACS.RS_SMF100A - :members: - :undoc-members: - :show-inheritance: - - -.. automodule:: naqslab_devices.SignalGenerator.BLACS.RS_SMHU - :members: - :undoc-members: - :show-inheritance: - -.. automodule:: naqslab_devices.SignalGenerator.BLACS.KeysightSigGens - :members: - :undoc-members: - :show-inheritance: - - -.. automodule:: naqslab_devices.SignalGenerator.Models - :members: - :undoc-members: - :show-inheritance: - - -.. automodule:: naqslab_devices.SignalGenerator.blacs_tab - :members: - :undoc-members: - :show-inheritance: - - -.. automodule:: naqslab_devices.SignalGenerator.blacs_worker - :members: - :undoc-members: - :show-inheritance: - - -.. automodule:: naqslab_devices.SignalGenerator.labscript_device - :members: - :undoc-members: - :show-inheritance: - - -.. automodule:: naqslab_devices.SignalGenerator.register_classes - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/labscript_devices/naqslab_devices/doc/TektronixTDS.rst b/labscript_devices/naqslab_devices/doc/TektronixTDS.rst deleted file mode 100644 index 6110294e..00000000 --- a/labscript_devices/naqslab_devices/doc/TektronixTDS.rst +++ /dev/null @@ -1,9 +0,0 @@ -TektronixTDS -============ - -Overview --------- - -This covers the TDS series of Tektronix oscilloscopes. - -.. include:: _apidoc\naqslab_devices.TektronixTDS.inc diff --git a/labscript_devices/naqslab_devices/doc/VISA.rst b/labscript_devices/naqslab_devices/doc/VISA.rst deleted file mode 100644 index c464ed39..00000000 --- a/labscript_devices/naqslab_devices/doc/VISA.rst +++ /dev/null @@ -1,11 +0,0 @@ -VISA -==== - -Overview --------- - -This parent class establishes the standard communication protocol for -all devices that use the VISA communication library. It relies on the -:std:doc:`PyVISA python wrapper `. - -.. include:: _apidoc\naqslab_devices.VISA.inc diff --git a/labscript_devices/naqslab_devices/doc/_build/latex/naqslab_devices.pdf b/labscript_devices/naqslab_devices/doc/_build/latex/naqslab_devices.pdf deleted file mode 100644 index 97b70941f11be2293238800ebce151587ae2f749..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1411612 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


%9O5zap%;d_5}BF+>t-;X@K7pHocV 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 z

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�ZPNFAZO))Ks$xSCV-tQrGssz$O&9*>ctpOx z5;%LdL=SBo)QPOQLvgj}`_g+iLU2*yG!706VXNtesAC0H4i?U;1n;(zMXS>&sJi)?|X?g z1rwQ(zKP4w4nx>>oR!%Rj>PQ8B_*YAVx1*u_rA1kvBOc1awl`4<^C17R2p(^Wxc6U z23J=weCMp%L2$s&lszJsbd2)93w2o@D+fO`Boi-q=Gh6J<>hbO14(}C=Ws?Tgu8MW z^)h#Wsvo)Y9FN>@!kX7_AX`m>=-|)0U*RRRysnK0bI-@cUuDi`QQR?3;}5L1(zj3S zge0ll71GqhOD+_mbJ<*Ec&5~4F3JxDFY@k|*0_2@S2#)JU6BUe%X>_BaX>H*t#J!w zF3A(N4#HmWe8J8cV{2nv-|D8kIJwKP&aTZ6%U>>BKD43MWY(s%SM~^l?)S>;NJ!yz z)Uu5iV0=zII@s1+h689>9-*#5@%Kdc6E$31HO9sm4>{0Zzx?w1KY#u5^6uTM*MIx{ zzrVh^_o`lA|NQy$*Zb41zxw&*^-S`S;gfzI^@9mtTK-fdT39KfHYR-N(OvdifvV CN8jlH diff --git a/labscript_devices/naqslab_devices/doc/_inv/pyvisa-objects.inv b/labscript_devices/naqslab_devices/doc/_inv/pyvisa-objects.inv deleted file mode 100644 index 448cd9901880752218dc9fdc0c8a2e047bc099ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6530 zcmV-|8GYs>AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkVc~(hN zK?)-vR%LQ?X>V>iATcg6F)lDJWMy_R3L_v?Xk{RBWo=<;Ze(S0Aa78b#rNMXCQiPX<{x4c-pm{U5}(VnuYJ{SA;Zsn^D_6y`xfV zZ@NnARZ3m6sj8lyxkC!$W5~?dU%xikfQ?ON`aN8flobIF#u)pYgK;#sr(CdO zT34cDRVNP3?dP)2`hp++^T3+?{D~(;ojxiW>$)~S^&O8SRy7PIuB_!54VPuDiJdE~NBq#gWNvi6aPsOpLn5p|Xk38ImWHJ0(6w>c|* z=WUr+tjp^v=9;V^M+xYXQ{KUfMXKsGt(*T&PAzAT`=C>)PNT{4KI_F7sdA$($+Y*8 zw{6`f>{PcMy)1@SNX0$17Yx!s5_vtcq^^n^jD6}wGW-Q2rbR9C>XMvUUc~pOYiwOr zJRRDOJOJ)`onxC{+Y4Rlt`f^0 zZF52!WJ7ehNylG0I5*?6o#TtEL>IoW{H0M9^0^% zmAvCEp1cS(p16;Hmll;fwm5XUHxGr#FlI)Ux(AXsUDFR~e98 zaV0o=fve7vrB{VjrDadjcCb?cr1P@YRWUwNfsxh2p5dVgZv_(CD4&g$4OLy`WmE7{ z${a5HGIebdw`gPRTS&iF)_5E6e7u)wm|lPB2+57jId8LtFvJW>u=Wboka zVJC7#xKt(5M%YK$_m+K;>RbQ=%LBEr$npVtBHVoTc&F0jpYe+gE68Gd))XQ3ruJTsCl%5bd7>wocQ&Me1$c zlVZE0E-$(4NO8P2zg%>jU9zSDp1<^5>VePs3>-tA^D3*KrFc<&=M7zAO^4Qn=ur=Q zG%3mWQ?7e3mDgeIW>+#aMb{0G1(7{f2wixe-tJcc>~5L|JgRN*uU6OV@Z z{fS#kkJ9ofCQn&W2o;A&Ta;J81C1hSx~OFX>H2N@Ab7!KajVj{uIe6nf4cJySlSJb zD4?y;^xN>B@R_xha#rTq=6D|CxXUu=A^3~bV11QNM_6P&z{Bhu#&{0{8}=r8Ulh1U z1%?VYHwLU{r45x#xw-1*bKZ%#c{k&}N6K`i1tXDtXu@PyTAaza?)jbB`8B^>3psKY z$8Xxe+*jw?trlZ$N>(x1H@t!Jb=(pLI;zpYS3dAo)P386${Uq`r z`k{Tp^b;8DX{c9!(z=u#II@q>*x}iRyt>t1=$6CLjqH^TAI%nAirf600=YVK@XEG$ zsvL<_prLIBu(>_N(Fi5sbsOrhy1;P6H9zo(3YcLDi2Oj00a4 zMZ{heMZ{heMMPc|a5_3nHr!3z4fIjuqN$=gp^;rZyfY2Ou18Fq+Y>uQk%~J%sYXG^ z+%e-KZSw}~qs-h2WG(cS$r#+6LF{rAe26i#cS=e63Y-h{)jr9<$i-&^y_mCIsE1vG zvA*l+B{u=On&$!Sn4ekRC3OXVhJ$`~H_m?FZPXj_=e91<i5bvTKPyDQM`0eQ)?_~NPv_`{#CEI?)8V}uiz8Xp0e7G9PR8RYcfhDX# zBFV2j&WWX(X@uk4#V0wCzcNkay$5(@B#*}0Ys^4PY|x=~93sJQoS^kys!weYSj+WY zU`#a=910B1NR5Ps5_byDr%@t#-UKs}wdFsfkr(y0{5&}l1Jyop9D{M!dNs!m&6PT` zmmNsgx9V-7z)Bj_gMhhjm>~FW;$B0cXn4BAP_^;CSS0avBO47ycKh~K65|cWk+gyWZQv32Hve)|;!QcvigldNPY-u67&2qM`YIlT1RSC7F( zfntEsUTXzHo#Mu%JOZxe5FFhBu7Ond=Mc%x&(CXl!&zsdy1)zQ@%ZWY5Rl}w&Tu&Y zyy6HD$VNLHr+lL z$#6TsXgBL{Hm7;V@Y=jo)ASe5S^#J3f1nTxN|;FVJb7Y8&jpTp$}4r|Xl%v{c0<-9 zu!P=81Cbo~RT-f0i!xGg9gxU7$m024&x&FRpqv-Gcp5|& z>LR-nh(t_O9U3N0T|rSAe(b(CR+o)oVv|{iKBTheaa}h=4bW3w7wDbi5(|Qhw2=x| zX(JXStVS4K4UJs#N$cDoK6}@IWq>nddFK)JcWQB&@j11b+B<92DZ zh}+Om3HO4B3Ahaqly4gxHP$s8XsSCw+q!QO{=!qWQW^chl;Og{;t9AzRy?s`!e}NU zlj1d%9u!YZR8Bkr#bQZsy#!=?;V}4{mJNSD8J2EOK$5@HXPhKs2T5t1z#7&2O#nV6y(}+4$Int9Nm-Z;LnW-|Odn9Kwt` zFD`ywofij~4d>;Oy}g%8pBd-JMkfaW9Q35=UOj}RT6Qm&?A!xX+B7dOG(HvZ;y~em zmksdpelFC~`wsyamjYmn!G8r#@%dgfz~=h7v4eGxMl!u&YP9zaBT1Iki;Z@!URwMV zsxXfJG-!iOeS79RHvE!TI z_@0(JAu9l-W?TU*B9_`lQ_`tzGAyLpJ`9{p%v=J@{WLHlf$@Xmrwe&`#9+tE#N;~x zG*&r6rV;tc*c{1wjD6xH!bG4jZYME;niRAFhYtO)2|^omLNz@6>z?+Ct_7ga>9KL- zpw7m{M`7N zE)f%9g{YM5%4PyWD+d^>Io24GdGg?*^C=ID6inGX%V*@-4p554aIkg83wd2KC=Xe_ z_|=j;q}YX$Y*cjQXk)0$Be^uH<#%}quODDiOnv~l(+vW#^)`~|=Uvziqy2Q1ph66h z3)n=Wfwy58=k78=!zb8L+i<#-c6ij~k|gfyw0DFJ8+V3yCXFKbrHMf=2ihkYEW#tr zEPy}KFoZYKD4Z|SK#V6cFti^sTuh%f(O^DkMI?G4&BOQ~10!_a3k22oEKwBCv*b|y zj%E?{`I17=<{CrMTkMFBF~`qg6MkNkB!&fAs)7TbnzVIQiZf1OcvFC zEJ$Gc;Q+B607Hd$;23}oFGR)&^4I7TaqedWgn9rRI~s&>BmuvHjTZA8Op>tob15Q! zgBUCL{m5wX@5fP%K!{2;1tBiNAiTn+n1xr+FyrvbaqwuOp$I{D97z$jz)vPx1V0pG z7eZ|CU;(xf{)5mhMSx4U7ZgWPY+)+4UwIWI$q7@-j1fp~wSn46v-ClwYrs2NxHfIHG z#=6TOEP}B@#V>%dLXoG^2Z&wEDpBSg4ohF9W5qnNUcG`DKfJ7oRE51JwwygC1+OmM z6<5pwN*Y<$O!a!KT4?XopU?49YsIB6c(O)DyB7}%cBM1cvE-C@0(PEsf8;|_eNvEF z^+f?Ycd`ld5NYeLcz~I_Uz#4*NuE{LyI3O-1dUxHW`zRz*%cSyYu8Muzg^=2a?At8 z_}vXK#rLkU^i^M1On|3eGh@ZBmqhZ|eqyxO_T#Y1AliGcNDXWA?glGZ{E9Sw6#Zr7 z0GIwEasW(Pg(kp6mNI(v882yv>jPSKCcuqeamLS!edXLwi(P5PPXoNW{wf&T@lscp z@c^j_qX*d(YSdPXp98BE5nqO}lo&Hig~gfSLqMt2b&5Se0adVKCozx6PuI}+^=&+? zy1^QCV#>SXVbWd?7AJ%uE99)H*i3oF$7jogRdM{N9YhXlHJkt#CQD$e-~`CXQ-7(? zXY8>2QdcD4?_VD7A7~Ff90cK+hf9ioq5{%cJM#9wIe9cah|vdkv)J+%7LZKXyr=_}Ik)(&H5p8Xm9c0CBfwVxr?Pmy#U2 zR6xkPLdHs4ABdDRc!ALgua`y&cwJ(2zUzYG^H?v5u7v$qx)AnrNnxxX2`poD6zc=w zFAXS&^<$%RST8Qt?|5OcDXbR;uuiXWp*mzz!jjV95s*-7 zPP*m^q*fFAXjVi>x?;v>q%MjWXu3E|p1G#NG#@0*TtTs6ri-U%nJZ#+l<6hmMFJ|w z^m9?;IxNQYgQ@5JUEVZ2J{}x*r$&RCLW~791(o1w945WfFi>)5XtdOBq9D!;l&;M* zNV2AJm{e_o0TMOMBBp7Yf=tph5|yGE96muaWR#Scc);Xr#U!U@hDe`kxx}FYID;bz zu?2)~FPAV{=(Z%$12;{hg>4!_4BD0ykVvzTAc1Bv>EW7%1C@;ysx2Vc%YY2iEF>*R zTcSu}dkG>1XiE@Eum_m1o(&S3O)N-YHql^VnM))GWiAjKlDTvg5D{igD7a*Vg;<71 z46rl?5ngE&Fu0nC5Uqp@tPF66uu7vrL6xD=LaHSNJLp2gDT|31E3u)J1tpy8KfZsa z%~-Plgiy-n#K%%L2M|ozKyox?C=zWILa%Qv-oxIZ7d-AbAYjec8wvKWDhPn0Q9g(5unWj{S4v;lwv?#>`PwuWis3{ zZQpc2y+HqoMIR4$?$KebjfszIJsi4e@j>af#YZKDwmu-Ne9^(}8iT$dpzziQjgD_U zuvk;-LB&S69u&afZc~9H6g9|oY1Am!3z5wRW$l9M|~Y*KE+=~=nMi%!cu z9JJCwCFVXVMxMY@b03y=#^1&hj0nu-p0uP~0Z0+K0${RnMM8w)iUUc*2M{F&9|6Qu zf#ks&1PFo^36TJg9CGxlFr>^^0dQfjqG3|rfrO5C2Pj5`j3`*3YvYJX?f`>CxQc`c zSqBn9teO3(rgh>_^3(}J4N?^dm!Pg_M58zIz?ta)MTDg@2ymK|cvS6A%0(vtM3v4o zh#Z}9)ChDY(Mv=LJ7gab7EjzhYyDs4glfhhykRQBM1~% zS}HYNiDxfw?sPmvMa%p;uKAOE`l%+klEU{%!5c`o;-XIB<2K6r94 zkkZgYC>KYKqAVUckg{l?ILKlGLLr+6jfQMAU@UTgn3yO4rG!Nm5)ky*yx4JgMIovD zH7z>&S))h+kcEp*AS?>qgg7{a74ah}hQv>V*%Cho=5VnZ?dbhlSi95$u{+~L)f5S6G=v9G2$K-8-#HWnkM5wE7KF;qDXdo{(wq6%vK zt0@~$q9TO8KH}ry%13c0(3#yX59CkKGrI%Gomvmdq5x-hyEK6t{=^;vV7lf|Z3c2u zxH;K24CbXUbFys^-c3O#CrjQ}Ue@ERj|eL@?hLU}8ilY>8bz{C6N6q3v~4n2gk_pp z0K24N2&<$~IGdz_7>i_JXnSP1nEq^{!EDirNVG(nhp`z3M(DT~2&%nUqA1p4$)VZ` z%_{3B9=imKLy3LOXvR=9xke0ApUP<%Bar~geqw=Cy~`sidKZUO^DY~MqwDSo1RhO* zdfN~&T3gfTI$MKa8hhdax@o+&)?lEn*3(!%ZCkEjO8Xi_d1*iKUOyLyG{&d_6%9=T;4!(sfHE ze<=H+%cV>@nC(7zi!i{mI^8a#zl0yH61otpeD5gTP}5%Gd=1uDpvj$Tl2_TjW)Jsj ztB+D%$Qw$D?d2hsUyMiiGHqAZSzquE6VcsqSuA}J)4pUM&(uqO&K}O!fR{wQ_I@hi3#o^oUcdFAM(S)Z{w#5lGycS)vsM+e~};E&0G8G zFY(ojh4j_T0CxBE)mCEHmKQA6Na3x$#8-P3(pP^2*xl2r(=+?iM#&HCmilYU|LkQ4 zSlkXwJjymM|0k5u5o+hV;Z1YZ$0{GSA}zl)z%R=^y87^N`{VxmF9Xb58u`!c`c?W< zUZ`itwe$#fL8M1i#Jeh2C%ne!@00O+L;U;wojUsAejL{Z2RGo#{L(W2NljnP#WLH< zUZvD0bolSX56A!d;MT&j*?VhfqkcY``dRF6YG(o|*~P%ev388_X-s<)dA# z3xr*%n^k(@)m)0{%9u~b{qNPEA6A83Y%wB#9;>@94mWwv9r7tv6Nl%#yUMNPI9*AQ z+{QlM@KM&M>fG!*<{v`#2$w$3__&|EN6J!4r*xbr8>U#>&9}?+p{$LeP)<>&qg3bo z(zmNN>l|a+YH>qOJ9gJ;5Y$-RIyR7c3xl(o%*Zf(+nsU(VgogNZ$QH(H@hB&uN>YM zY9*>nw>m-eWaACQxWx=$!yC?0`X2r%^_=>9+(Hw@Ro;Lbyy1I8(@pxj`s_ov8Q86N zv$4Fnsd(DL#$oLCvfWzDUi^irP%KE*-y1O|Rk0lH)I)1|yXx;g_}W+yxNL)-7HHk4 zLCB(aaPMKOfd&C{^9?uNRr?Im0;0<0ESj;GvS`GwHesu!29a|+wp($jRsdLa%+2l2 ze4+dHL4oNmT3z}(ed+I(&BlKVEgR0@GQ3SkaOD|n%=p<@g74$^4^pbhZPTBJB_{3) zUR}ED+q)FG=bg3Z7xkaR_@9B>j@5lPzPfRjv5vj9yHRl8?&b=PpP7rN4yNA4NUy9F o?>mEex8D~pbEr>PD!&sSlqk4UPWnBa?a(S_Q~u%q0Strr3YxcT>i_@% diff --git a/labscript_devices/naqslab_devices/doc/_inv/sphinx-objects.inv b/labscript_devices/naqslab_devices/doc/_inv/sphinx-objects.inv deleted file mode 100644 index 93b32886aa7737282cfe05c6ddce629d367497ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11632 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. The second is the :doc:`SignalGenerator` class that uses the :doc:`VISA` class to template CW frequency generators. - -There are two thin subclasses of the labscript_devices.PulseBlaster_No_DDS class: :doc:`PulseBlasterESRPro300` and :doc:`PulseBlaster_No_DDS_200`. They exist simply to enforce the correct core clock frequency and clock limits without any other change in functionality from the parent. - -Other device classes control particular series of devices and implement functional control of their hardward to varying degrees. In general, the design philosophy is that if the device class does not set an option, it will not be interfered with when using the device class to control the instrument. This means that custom settings and configurations of each device can be used by setting them manually at the device front panel without the device class interfering. - -.. toctree:: - :maxdepth: 3 - - primitives - - VISA - SignalGenerator - - PulseBlasterESRPro300 - PulseBlaster_No_DDS_200 - - KeysightXSeries - NovaTechDDS - SR865 - TektronixTDS - KeysightDCSupply diff --git a/labscript_devices/naqslab_devices/doc/doc_build.rst b/labscript_devices/naqslab_devices/doc/doc_build.rst deleted file mode 100644 index d92e2ea5..00000000 --- a/labscript_devices/naqslab_devices/doc/doc_build.rst +++ /dev/null @@ -1,65 +0,0 @@ -Building Documentation -====================== - -The API documentation for this library leverages the -`Sphinx `_ automatic python documenation generator. -The general structure is to use the :std:doc:`Sphinx-apidoc` infrastucture to read -source code docstrings to automatically build the function/class reference documentation for each device. -Hand-written ReStructedText files (`quick syntax guide `_) -are then used to provide high-level documentation that imports -the auto-generated documentation. A makefile is provided to run the correct ``apidoc`` and -``sphinx-build`` commands. - -Sphinx Environment ------------------- - -In order to build the documentation from scratch, a functioning ``labscript`` -environment is needed with sphinx also installed. Because sphinx requires a large -amount of dependencies, it is recommended to copy your local ``labscript`` environment -then install and use sphinx from there. - -Sphinx can be installed into the ``labscript`` environment by installing the packages: -``sphinx>=2.2`` and ``sphinx_rtd_theme``. This will allow building of the html documentation. - -If you also wish to build the pdf documentation, you must also install ``perl`` -and a latex environment (such as MikTeX for windows). The latex build is controlled -using the ``latexmk`` latex package and requires a great many other latex packages. -A partial list of required latex packages is: cmap, fncychap, tabulary, parskip, capt-of. - -Sphinx Build ------------- - -The documentation build is automated through makefiles. All commands are run from -the :file:`doc` subfolder. - -The automated documentation build is perfomed using - -.. code-block:: bash - - make apidoc - -The auto-generated files are placed in the :file:`_apidoc` subfolder of :file:`doc` -and are given the import name of the module with the file suffix ``.inc``. - -The complete documentation is built using ``sphinx-build`` and currently supports -two targets: html and latexpdf. They are run using - -.. code-block:: bash - - make html - #or - make latexpdf - -Adding Documentation --------------------- - -The main documentation tree is found in :file:`index.rst`. New devices should be -added using :file:`devices.rst`. Each device should have it's own rst file that -provides some high-level documentation and includes the auto-generated apidoc file. -All modules and submodules in the top-level directory of the library will have -documentation auto-generated using apidoc. It is up to the user to include those -files where appropriate in the documenation. The include statement is of the form: - -.. code:: rst - - .. include:: _apidoc\naqslab_devices.NovaTechDDS.inc diff --git a/labscript_devices/naqslab_devices/doc/index.rst b/labscript_devices/naqslab_devices/doc/index.rst deleted file mode 100644 index a48cb05a..00000000 --- a/labscript_devices/naqslab_devices/doc/index.rst +++ /dev/null @@ -1,36 +0,0 @@ -.. naqslab_devices documentation master file, created by - sphinx-quickstart on Fri Sep 6 14:11:37 2019. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to naqslab_devices's documentation! -=========================================== - -This library is a collection of third-party devices for the labscript_suite experimental control system. - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - usage - devices - doc_build - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - -Credits -======= - -:Authors: - David Meyer - Zac Castillo - -:Licence: Simplified BSD License - -:Version: |release| diff --git a/labscript_devices/naqslab_devices/doc/make.bat b/labscript_devices/naqslab_devices/doc/make.bat deleted file mode 100644 index b8fcd4e1..00000000 --- a/labscript_devices/naqslab_devices/doc/make.bat +++ /dev/null @@ -1,45 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build - -if "%1" == "" goto help - -if "%1" == "apidoc" goto apidoc - -if "%1" == "clean" goto clean - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:apidoc -sphinx-apidoc .. -TMEf --templatedir=_templates -s inc -o .\_apidoc - -:clean -rmdir /s /q _build - -:end -popd diff --git a/labscript_devices/naqslab_devices/doc/primitives.rst b/labscript_devices/naqslab_devices/doc/primitives.rst deleted file mode 100644 index feec0b1c..00000000 --- a/labscript_devices/naqslab_devices/doc/primitives.rst +++ /dev/null @@ -1,25 +0,0 @@ -:code:`labscript` Primitive Subclasses -====================================== - -Overview --------- - -.. currentmodule:: naqslab_devices - -These are subclasses of labscript primitive objects for specific use with the devices in this module. - -:obj:`StaticFreqAmp` is used by the :obj:`NovaTechDDS` devices. :obj:`ScopeChannel` is used by the KeysightXSeries and TektronixTDS oscilloscope classes. :obj:`CounterScopeChannel` is used exclusively by the KeysightXSeries oscilloscopes. - -.. autosummary:: - :nosignatures: - - StaticFreqAmp - ScopeChannel - CounterScopeChannel - - -Detailed Documentation ----------------------- - -.. automodule:: naqslab_devices - :members: StaticFreqAmp, ScopeChannel, CounterScopeChannel diff --git a/labscript_devices/naqslab_devices/doc/usage.rst b/labscript_devices/naqslab_devices/doc/usage.rst deleted file mode 100644 index 5208fb94..00000000 --- a/labscript_devices/naqslab_devices/doc/usage.rst +++ /dev/null @@ -1,25 +0,0 @@ -Installation -============ - -Prerequiste: labscript_devices >= 2.2.0 - -Clone this repository into the labscript_suite directory. Typically into -:file:`userlib` or the main directory level. - -Next, modify your labconfig.ini file to recognize the module by adding the following entry to the :file:`[DEFAULT]` block:: - - user_devices = naqslab_devices - -If more than one module of 3rd party devices are used, put all module names -as a comma separated list. - - -Usage -===== - -Invoke in labscript scripts just like other labscript devices:: - - from naqslab_devices import ScopeChannel - from naqslab_devices.KeysightXSeries.labscript_device import KeysightXScope - -Details for how to use each device are contained in the :doc:`detailed documentation ` listings. \ No newline at end of file From 356272ee5b48a2001b4502670e3a4415a0e74768 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Fri, 28 Mar 2025 15:36:13 +0100 Subject: [PATCH 06/20] working version --- .../KeysightScope/KeysightScope.py | 316 +++++-------- labscript_devices/KeysightScope/STBstatus.ui | 433 ------------------ labscript_devices/KeysightScope/blacs_tabs.py | 261 ++++++++--- .../KeysightScope/blacs_workers.py | 179 +++++--- .../KeysightScope/connection_manager.py | 53 +-- .../KeysightScope/labscript_devices.py | 60 ++- .../models/Keysight_dsox1202g.py | 83 ++-- .../models/default_properties.py | 6 +- .../KeysightScope/models/example_to_copy.py | 3 +- .../KeysightScope/tab_template.ui | 78 ++++ labscript_devices/KeysightScope/tabs.ui | 127 +++++ 11 files changed, 710 insertions(+), 889 deletions(-) delete mode 100644 labscript_devices/KeysightScope/STBstatus.ui create mode 100644 labscript_devices/KeysightScope/tab_template.ui create mode 100644 labscript_devices/KeysightScope/tabs.ui diff --git a/labscript_devices/KeysightScope/KeysightScope.py b/labscript_devices/KeysightScope/KeysightScope.py index ce0104a3..e79e3bd0 100644 --- a/labscript_devices/KeysightScope/KeysightScope.py +++ b/labscript_devices/KeysightScope/KeysightScope.py @@ -1,39 +1,7 @@ import pyvisa import numpy as np -import time from labscript.labscript import LabscriptError -from re import sub -from labscript_devices.KeysightScope.connection_manager import * -description = "Example Osci" - -""" -Keysight Scopes - - Using the Oscilloscope requires 3 important steps - * Initialsiation : which is setting up the osci for the desired measure - * Acquiring : the osci acquires the measurement and saves them in its memory - * Analysing : after finishing the measurement, we can display or transfer the data to the Pc - - To Improve: - ** PRIO - - what is the best time_range - - saving (dabei) - - segmented memory ? - - HResultion - - Keysight() KEysight in ct build - - over serial number - - set property - - other ni card - - ** NOT PRIO - - Configuration possibility for other trigger types other then EDGE - - ** Ask Marcel - - Problem with DO , NiCard won't transtion to buffered - - subclasses marcel fragen , -""" - class KeysightScope: def __init__(self, @@ -41,80 +9,119 @@ def __init__(self, verbose = False ): - # --------------------------------- Connecting to device - rm = pyvisa.ResourceManager() - self.dev = rm.open_resource(address) + self.verbose = verbose + # --------------------------------- Connecting to device + self.dev = pyvisa.ResourceManager().open_resource(address) print(f'Initialized: {self.dev.query("*IDN?")}') - # --------------------------------- Get device capabilities & Shot configurations - cm = connectionManager(address=address) - self.osci_capabilities = cm.osci_capabilities # needed for the blacs worker - self.osci_shot_configuration = cm.osci_shot_configuration - self.verbose = verbose - - # --------------------------------- Device capabilities - for key, value in self.osci_capabilities.items(): - setattr(self, key, value) - - # --------------------------------- Shot configurations - for key, value in self.osci_shot_configuration.items(): - setattr(self, key, value) - # --------------------------------- Initialize device - self.reset_device() - self.dev.timeout = float(self.timeout)*1e3 - + self.reset_device() ####################################################################################### - # The configuration function # + # Saving and Recalling # ####################################################################################### + def get_settings_dict(self,value): + osci_shot_configuration = { + "configuration_number" : str(value) , + # Channel unrelated + "trigger_source" : str(self.get_trigger_source()).strip(), + "trigger_level" : str(self.get_trigger_level()).strip(), + "trigger_level_unit" : "V", + "trigger_type" : str(self.get_trigger_type()).strip(), + "trigger_edge_slope" : str(self.get_trigger_edge_slope()).strip(), + "triggered" : False, + + "acquire_type" : str(self.get_acquire_type()).strip(), + "acquire_count" : str(self.get_acquire_count()).strip(), + "waveform_format" : str(self.get_waveform_format()).strip(), + + "time_reference" : str(self.get_time_reference()).strip(), + "time_division" : str(self.get_time_division()).strip(), + "time_division_unit" : "s", + "time_delay" : str(self.get_time_delay()).strip(), + "time_delay_unit" : "s", + "timeout" : "5", # In seconds + + # Channel related + # ------------------------ Channel 1 + "channel_display_1" : str(self.get_channel_display(channel=1)).strip(), + "voltage_division_1" : str(self.get_voltage_division()).strip(), + "voltage_division_unit_1" : "V", + "voltage_offset_1" : str(self.get_voltage_offset()).strip(), + "voltage_offset_unit_1" : "V", + "probe_attenuation_1" : str(self.get_probe_attenuation(channel=1)).strip(), + + # ------------------------ Channel 2 + "channel_display_2" : str(self.get_channel_display(channel=2)).strip(), + "voltage_division_2" : str(self.get_voltage_division(channel=2)).strip(), + "voltage_division_unit_2" : "V", + "voltage_offset_2" : str(self.get_voltage_offset(channel=2)).strip(), + "voltage_offset_unit_2" : "V", + "probe_attenuation_2" : str(self.get_probe_attenuation(channel=2)).strip() + } + return osci_shot_configuration + + def save_start_setup(self, location = 0): + """ + Saves the oscilloscope current configuration to a specified location. - def set_configuration(self, configuration : dict): - """ The purpose of this function is to configure the oscilloscope. - it will be called in transition to buffered in the blacs worker""" - - # --------------------------------- Shot configurations - # By promoting the entries of the configuration dictionary to class attributs, - # we gain some flexibility later on - for key, value in configuration.items(): - setattr(self, key, value) - - self.set_acquire_state(running=True) - self.set_waveform_format(format=self.waveform_format) - - self.set_trigger_source(source= self.trigger_source) - self.set_trigger_level(level= self.trigger_level, unit=self.trigger_level_unit ) - self.set_trigger_edge_slope(slope = self.trigger_edge_slope) - - self.set_acquire_type(type=self.acquire_type) - self.set_acquire_count(count=self.acquire_count) - - self.set_time_reference(reference=self.time_reference) - self.set_time_division(division= self.time_division, unit= self.time_division_unit) - self.set_time_delay(delay=self.time_delay, unit= self.time_delay_unit) + This method sends a command to the oscilloscope to save the current configuration + to the specified location. The default location is "0", but any valid location + index can be provided. - # Channel specific + Args: + location (str or int, optional): The index of the configuration location to recall. + Defaults to "0" if not provided. + """ + self.dev.write(f":SAVE:SETup:STARt {location}") - # --- Channel 1 - self.set_channel_display(channel="1",display=self.channel_display_1 ) - self.set_voltage_division(division=self.voltage_division_1, unit= self.voltage_division_unit_1) - self.set_voltage_offset(offset=self.voltage_offset_1, unit=self.voltage_offset_unit_1) - self.set_probe_attenuation(attenuation=self.probe_attenuation_1,channel=1) + def recall_start_setup(self, location = 0): + """ + Sets the oscilloscope configuration to a specified location. - # --- Channel 2 - self.set_channel_display(channel="2",display=self.channel_display_2 ) - self.set_probe_attenuation(channel=2, attenuation=self.probe_attenuation_2) - self.set_voltage_division(channel=2, division=self.voltage_division_2, unit= self.voltage_division_unit_2) - self.set_voltage_offset(channel=2, offset=self.voltage_offset_2, unit=self.voltage_offset_unit_2) + This method sends a command to the oscilloscope to recall and apply the configuration + stored at the specified location. The default location is "0", but any valid location + index can be provided. + Args: + location (str or int, optional): The index of the configuration location to recall. + Defaults to "0" if not provided. + """ + self.dev.write(f":RECall:SETup:STARt {location}") + def get_saving_register(self): + """ + Retrieves the configuration settings for all 10 available saving slots of the device. + + Returns: + dict: A dictionary containing the settings for each of the 10 saving slots. + The keys are the slot indices (0 to 9), and the values are dictionaries + with the configuration settings for the corresponding slot. If an error + occurs during the retrieval of a slot's settings, for example because the slot is empty, the value will be an + empty dictionary. + + Example: + saving_register = device.get_saving_register() + # saving_register will be a dictionary, e.g.: + # {0: {'setting1': value1, 'setting2': value2}, + # 1: {}, + # 2: {'setting1': value1}, + # ...} + """ + saving_register = {} + for i in range(10): + self.recall_start_setup(f"{i}") + if "250" in self.dev.query(":SYSTem:ERRor?"): + saving_register[i] = {} + else: saving_register[i] = self.get_settings_dict(i) + return saving_register + ####################################################################################### # Basic Commands # ####################################################################################### - # ----------------------------------------------- Running or not Running, that is the question! - def get_acquire_state(self): # In other words , is it running ? - """Determine if the oscilloscope is running. + def get_acquire_state(self): + """Determine wether the oscilloscope is running. Returns: ``True`` if running, ``False`` otherwise """ reg = int(self.dev.query(':OPERegister:CONDition?')) # The third bit of the operation register is 1 if the instrument is running @@ -127,29 +134,20 @@ def set_acquire_state(self, running=True): print("Done running") def reset_device(self): - self.dev.write(":RST*") + self.dev.write("*RST") if self.verbose: print("Done reset") - # ----------------------------------------------- Other stuff - def abort(self): # brauchen wir das ? - self.dev.write(':STOP') - return True - - def digitize(self): + def digitize(self): # Not used yet ''' Specialized RUN command. acquires a single waveforms according to the settings of the :ACQuire commands subsystem. When the acquisition is complete, the instrument is stopped. ''' - self.dev.query(":DIGitize") + self.dev.write(":DIG") def autoscale(self): self.dev.write(":AUToscale") - def shutdown(self): - """Closes VISA connection to device.""" - self.dev.close() - def clear_status(self): """ clears: the status data structures, @@ -167,9 +165,6 @@ def lock(self): def unlock(self): self.dev.write(':SYSTem:LOCK 0') - def set_date_time(self): - self.sendrecv('DATE "' + time.strftime('%Y-%m-%d',time.localtime()) + '"') # set the date - self.sendrecv('TIME "' + time.strftime('%H:%M:%S',time.localtime()) + '"') # set the time ####################################################################################### # Setting Axes (Voltage & Time) # ####################################################################################### @@ -360,7 +355,7 @@ def single(self): ''' Single Button ''' self.dev.write(":SINGle") - def get_trigger_event(self): # how to make use of this ? + def get_trigger_event(self): # Not used yet """ whether the osci was triggered or not return: @@ -397,7 +392,8 @@ def set_trigger_source(self, source): raise LabscriptError("trigger_source: "+ e) def get_trigger_source(self): - return self.dev.query(":TRIGger:SOURce?") + self.trigger_source = self.dev.query(":TRIGger:SOURce?") + return self.trigger_source # ----------------------------------------------- Trigger Level def set_trigger_level(self, level,unit="V"): @@ -416,6 +412,7 @@ def set_trigger_level(self, level,unit="V"): def get_trigger_level(self): """Get the current trigger level.""" + if self.trigger_source == "EXTernal": return self.dev.query(":EXTernal:LEVel?") else: @@ -570,19 +567,6 @@ def get_waveform_source(self): # Reading # ####################################################################################### - # ----------------------------------------------- Waveform format - def set_waveform_format(self, format): - ''' Sets the data transmission mode for waveform data points. - WORD: formatted data transfers 16-bit data as two bytes. - BYTE: formatted data is transferred as 8-bit bytes. - ''' - if format in ["WORD", "BYTE"]: - self.dev.write(f":WAVeform:FORMat {format}") - self.datatype = "H" if format == "WORD" else "B" - - if self.verbose: - print(f"Done Waveform {format}") - def get_waveform_format(self): return self.dev.query(":WAVeform:FORMat?") @@ -609,7 +593,7 @@ def get_preample_as_dict(self): return dict(zip(keys, preamble_val)) # ----------------------------------------------- Waveform function - def waveform(self, channel='CHANnel1'): + def waveform(self, waveform_format="BYTE" ,channel='CHANnel1' ): """ returns: dict * Waveform preample : List, as set by the 'Record length' setting in the 'Acquisition' menu. @@ -618,7 +602,19 @@ def waveform(self, channel='CHANnel1'): """ # configure the data type transfer self.set_waveform_source(channel) - self.set_waveform_format(format=self.waveform_format) + + # Sets the data transmission mode for waveform data points. + # WORD: formatted data transfers 16-bit data as two bytes. + # BYTE: formatted data is transferred as 8-bit bytes. + if waveform_format in ["WORD", "BYTE"]: + self.dev.write(f":WAVeform:FORMat {waveform_format}") + self.datatype = "H" if waveform_format == "WORD" else "B" + + if self.verbose: + print(f"Done Waveform {waveform_format}") + else : + raise KeyError("Waveform format must be WORD or BYTE") + # transfer the data and format into a sequence of strings raw = self.dev.query_binary_values( @@ -630,8 +626,6 @@ def waveform(self, channel='CHANnel1'): # Create a dictionary of the waveform preamble wfmp = self.get_preample_as_dict() - # print(raw) - # print(wfmp) # (see Page 667 , Keysight manual for programmer ) n = np.arange(wfmp['points'] ) @@ -672,81 +666,9 @@ def set_wgen_high(self, voltage_high= 1): """ self.dev(f":WGEN:VOLTage:HIGH {voltage_high}") - def set_wgen_high(self, voltage_low= 0): + def set_wgen_low(self, voltage_low= 0): """ in V : Low level of the signal """ self.dev(f":WGEN:VOLTage:LOW {voltage_low}") -##################################################################################################### -##################################################################################################### - -## uncomment to test -if __name__ == '__main__': - from models.Keysight_dsox1202g import osci_capabilities, osci_shot_configuration - - # Testing on Keysigt - scope = KeysightScope() # to complete - - - # # Works perfect - # def transition_to_manual(): - - # channels = scope.channels() - # data_dict = {} # Create Dict chanel - data - # vals = {} - # wtype = [('t', 'float')] - # print('Downloading...') - - # for ch, enabled in channels.items(): - # if enabled: - # data_dict[ch], t, vals[ch] = scope.waveform( - # ch, - # int16= False # THis was : self.scope_params.get('int16', False), - # ) - # wtype.append((ch, 'float')) - - # # Collect all data in a structured array - # data = np.empty(len(t), dtype=wtype) - # data['t'] = t - # for ch in vals: - # data[ch] = vals[ch] - # print(data) - - # def transition_to_buffered(): - # scope.unlock() - # scope.write(':ACQuire:TYPE AVERage') - # scope.set_acquire_state(True) - # return {} - - - - # transition_to_manual() - #transition_to_buffered() - - - - # to improve first connection - # manufacturer, model, sn, revision = self.scope.idn.split(',') - # #assert manufacturer.lower() == 'tektronix' - # #"Device is made by {:s}, not by Tektronix, and is actually a {:s}".format( - # # manufacturer, model - # #) - # print('Connected to {} (SN: {})'.format(model, sn)) - - - - # Old Code - # Based on the serial number in osci_capabilities - # rm = pyvisa.ResourceManager() - # devs = rm.list_resources() - # for idx, item in enumerate(devs): - # try: - # scope = rm.open_resource(devs[idx], timeout=200) - # scopename = scope.query("*IDN?") - # scope_serial_number = sub(r'\s+', '', scope.query(":SERial?")) # To get rid of white spaces - # if scope_serial_number == self.serial_number: - # self.dev = scope - # print(f"Initialized: {scopename}") - # except: - # continue \ No newline at end of file diff --git a/labscript_devices/KeysightScope/STBstatus.ui b/labscript_devices/KeysightScope/STBstatus.ui deleted file mode 100644 index ef4e1116..00000000 --- a/labscript_devices/KeysightScope/STBstatus.ui +++ /dev/null @@ -1,433 +0,0 @@ - - - Form - - - - 0 - 0 - 895 - 617 - - - - Form - - - - - - GroupBox - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 10 - 75 - true - true - - - - STATUS BYTE - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 40 - 20 - - - - - - - - Clear - - - - - - - :/qtutils/fugue/arrow-circle.png:/qtutils/fugue/arrow-circle.png - - - false - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Qt::Horizontal - - - - - - - - - - 75 - true - true - - - - false - - - Bit 7 - - - Qt::AlignCenter - - - - - - - - 75 - true - true - - - - false - - - Bit 6 - - - Qt::AlignCenter - - - - - - - - 75 - true - true - - - - false - - - Bit 5 - - - Qt::AlignCenter - - - - - - - - 75 - true - true - - - - false - - - Bit 4 - - - Qt::AlignCenter - - - - - - - false - - - ???? - - - Qt::AlignCenter - - - - - - - false - - - ???? - - - Qt::AlignCenter - - - - - - - false - - - ???? - - - Qt::AlignCenter - - - - - - - false - - - ???? - - - Qt::AlignCenter - - - - - - - - 75 - true - true - - - - false - - - Bit 3 - - - Qt::AlignCenter - - - - - - - - 75 - true - true - - - - false - - - Bit 2 - - - Qt::AlignCenter - - - - - - - - 75 - true - true - - - - false - - - Bit 1 - - - Qt::AlignCenter - - - - - - - - 75 - true - true - - - - false - - - Bit 0 - - - Qt::AlignCenter - - - - - - - false - - - ???? - - - Qt::AlignCenter - - - - - - - false - - - ???? - - - Qt::AlignCenter - - - - - - - false - - - ???? - - - Qt::AlignCenter - - - - - - - false - - - ???? - - - Qt::AlignCenter - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Preferred - - - - 268 - 75 - - - - - - - - - - - diff --git a/labscript_devices/KeysightScope/blacs_tabs.py b/labscript_devices/KeysightScope/blacs_tabs.py index 3a68a82e..b584d656 100644 --- a/labscript_devices/KeysightScope/blacs_tabs.py +++ b/labscript_devices/KeysightScope/blacs_tabs.py @@ -3,43 +3,28 @@ from blacs.tab_base_classes import define_state,Worker from blacs.tab_base_classes import MODE_MANUAL, MODE_TRANSITION_TO_BUFFERED, MODE_TRANSITION_TO_MANUAL, MODE_BUFFERED from blacs.device_base_class import DeviceTab -from qtutils import UiLoader -# from PyQt5.QtWidgets import QPushButton -import os -from qtutils.qt import QtCore -from qtutils.qt import QtGui +import os +import sys +from PyQt5.QtWidgets import * +from PyQt5.QtGui import QIcon, QPixmap, QPainter, QColor, QFont +from PyQt5.QtCore import QSize +from PyQt5 import uic """ -The Device class: handles the creation of the GUI + interaction GUI ~ QueueManager +The device class handles the creation of the GUI + interaction GUI ~ QueueManager - These are run in order : - - self.initialise_GUI() - - self.restore_save_data(settings_dictionary) - - self.initialise_workers() """ -class KeysightScopeTab(DeviceTab): - status_byte_labels = {'bit 7':'Powered On', - 'bit 6':'Button Pressed', - 'bit 5':'Command Error', - 'bit 4':'Execution Error', - 'bit 3':'Device Error', - 'bit 2':'Query Error', - 'bit 1':'Unused', - 'bit 0':'Operation Complete'} - - status_widget = 'STBstatus.ui' - STBui_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),status_widget) +class KeysightScopeTab(DeviceTab): def initialise_workers(self): - # Here we can change can initialisation properties in the connection table + # Here we can change the initialization properties in the connection table worker_initialisation_kwargs = self.connection_table.find_by_name(self.device_name).properties - # Note that adding porperties as follows allows the blacs worker to access them - # This comes in handy for the device initialisation - worker_initialisation_kwargs['address'] = self.BLACS_connection # important to get the right connection in blacs - + # Adding porperties as follows allows the blacs worker to access them + # This comes in handy for the device initialization + worker_initialisation_kwargs['address'] = self.BLACS_connection # Create the device worker self.create_worker( @@ -51,56 +36,186 @@ def initialise_workers(self): def initialise_GUI(self): - self.status_ui = UiLoader().load(self.STBui_path) - self.get_tab_layout().addWidget(self.status_ui) - - # Get capabilities from connection table properties: - # reminder connection_table is an instance of ConnectionTable - #properties = self.connection_table.find_by_name(self.device_name).properties - - - # create a GUI based on these properties - # generate the dictionaries - self.status_bits = ['bit 0', 'bit 1', 'bit 2', 'bit 3', 'bit 4', 'bit 5', 'bit 6', 'bit 7'] - self.bit_labels_widgets = {} - self.bit_values_widgets = {} - self.status = {} - for bit in self.status_bits: - self.status[bit] = False - self.bit_values_widgets[bit] = getattr(self.status_ui, 'status_{0:s}'.format(bit.split()[1])) - self.bit_labels_widgets[bit] = getattr(self.status_ui, 'status_label_{0:s}'.format(bit.split()[1])) - - for key in self.status_bits: - self.bit_labels_widgets[key].setText(self.status_byte_labels[key]) - self.status_ui.clear_button.clicked.connect(self.test_func) + + # The Osci Widget + self.osci_widget = OsciTab() + self.get_tab_layout().addWidget(self.osci_widget) + # Connect radio buttons (activate slot) + for i in range(10): + self.radio_button = self.osci_widget.findChild(QRadioButton, f"activeRadioButton_{i}") + self.radio_button.clicked.connect(lambda checked, i=i: self.activate_radio_button(i)) + + # Connect load buttons (load current) + self.load_button = self.osci_widget.findChild(QPushButton, f"loadButton_{i}") + self.load_button.clicked.connect(lambda clicked, i=i: self.load_current_config(i)) + + # Connect load buttons slot (load slot) + self.load_button = self.osci_widget.findChild(QPushButton, f"loadButtonSlot_{i}") + self.load_button.clicked.connect(lambda clicked, i=i: self.load_slot_config(i)) + + # connect reset buttons (default buttons) + self.default_button = self.osci_widget.findChild(QPushButton, f"defaultButton_{i}") + self.default_button.clicked.connect(lambda clicked, i=i: self.default_config(i)) + + # Loads the Osci Configurations + self.init_osci() + return - # This function gets the status, - # and updates the front panel widgets! - @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True) - def status_monitor(self): - # When called with a queue, this function writes to the queue - # when the pulseblaster is waiting. This indicates the end of - # an experimental run. - self.status = yield(self.queue_work(self._primary_worker,'check_status')) - - for key in self.status_bits: - if self.status[key]: - icon = QtGui.QIcon(':/qtutils/fugue/tick') + @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) + def init_osci(self,widget=None ): + list_dict_config = yield(self.queue_work(self._primary_worker,'init_osci')) + + for key,value in list_dict_config.items(): + if value: + self.osci_widget.load_parameters(current_dict=value , table_index= key) else: - icon = QtGui.QIcon(':/qtutils/fugue/cross') - pixmap = icon.pixmap(QtCore.QSize(16,16)) - self.bit_values_widgets[key].setPixmap(pixmap) - - + self.default_config( button_id=key) + @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) - def send_clear(self,widget=None): - value = self.status_ui.clear_button.isChecked() - yield(self.queue_work(self._primary_worker,'clear',value)) + def activate_radio_button(self,buttton_id, widget=None ): + yield(self.queue_work(self._primary_worker,'activate_radio_button',buttton_id)) - @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) - def test_func(self,widget=None): - value = self.status_ui.clear_button.isChecked() - yield(self.queue_work(self._primary_worker,'clear',value)) \ No newline at end of file + def load_current_config(self,button_id, widget=None ): + dict_config = yield(self.queue_work(self._primary_worker,'load_current_config',button_id)) + self.osci_widget.load_parameters(current_dict=dict_config , table_index= button_id) + + # @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) + # def load_slot_config(self,button_id, widget=None ): + # dict_config = yield(self.queue_work(self._primary_worker,'load_slot_config',button_id)) + # self.osci_widget.load_parameters(current_dict=dict_config , table_index= button_id) + + @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) + def default_config(self,button_id, widget=None ): + dict_config = yield(self.queue_work(self._primary_worker,'default_config',button_id)) + self.osci_widget.load_parameters(current_dict=dict_config , table_index= button_id) + + +class TabTemplate(QWidget): + """ A Tab template class that defines the oscilloscope configuration in a table format, + designed to describe the most important settings for the ten available storage slots of the oscilloscope.""" + def __init__(self,parent=None): + super().__init__(parent) + tab_template_name = 'tab_template.ui' + tab_template_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),tab_template_name) + uic.loadUi(tab_template_path,self) + + +class OsciTab(QWidget): + """ The oscilloscope Widget """ + def __init__(self, parent=None): + super().__init__(parent) + + tabs_name = 'tabs.ui' + tabs_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),tabs_name) + uic.loadUi(tabs_path,self) + + # --- Children + self.tabWidget = self.findChild(QTabWidget,"tabWidget") + self.previous_checked_index = None + + self.label_active_setup = self.findChild(QLabel,"label_active_setup") + self.button_group = QButtonGroup(self) + + # yes_icon = self.style().standardIcon(QStyle.SP_DialogApplyButton) + reset_icon = self.style().standardIcon(QStyle.SP_BrowserReload) + load_icon = self.style().standardIcon(QStyle.SP_DialogOpenButton) + + for i in range(self.tabWidget.count()): + + # --- Promote Tabs + self.tabWidget.removeTab(i) + self.tabWidget.insertTab(i, TabTemplate(), f"s{i}") # Add the new widget to the layout + tab = self.tabWidget.widget(i) + + # --- RadioButtons + radio_button = tab.findChild(QRadioButton, "activeRadioButton") + radio_button.setObjectName(f"activeRadioButton_{i}") + self.button_group.addButton(radio_button) + self.button_group.setId(radio_button, i ) + radio_button.toggled.connect(self.radio_toggled ) + + # --- ToolButtons + self.load_button = tab.findChild(QPushButton , "loadButton") + self.load_button.setObjectName(f"loadButton_{i}") + self.load_button.setIcon(load_icon) + self.load_button.setIconSize(QSize(16,16)) + + # self.load_button_slot = tab.findChild(QPushButton , "loadButtonSlot") + # self.load_button_slot.setObjectName(f"loadButtonSlot_{i}") + # self.load_button_slot.setIcon(load_icon) + # self.load_button.setIconSize(QSize(16,16)) + + self.default_button = tab.findChild(QPushButton , "defaultButton") + self.default_button.setObjectName(f"defaultButton_{i}") + self.default_button.setIcon(reset_icon) + self.default_button.setIconSize(QSize(16,16)) + + # --- TableWidgets + self.tableWidget = tab.findChild(QTableWidget, "tableWidget") + self.tableWidget.setObjectName(f"table_{i}") + self.tableWidget.setRowCount(30) + self.tableWidget.setColumnCount(2) + self.tableWidget.setHorizontalHeaderLabels(["Parameter", "Value"]) + self.tableWidget.setEditTriggers(QTableWidget.NoEditTriggers) + header = self.tableWidget.horizontalHeader() + header.setSectionResizeMode(QHeaderView.Stretch) # Stretch all columns to fill the space + + # --- Style Sheet + self.sh_tab = """ + QTabBar::tab { + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 #ffffff, stop:1 #dddddd); + border: 1px solid #aaa; + border-top-left-radius: 8px; + border-top-right-radius: 8px; + padding: 10px 20px; + color: #333; + font-weight: bold; + } + """ + self.sh_selected_tab = """ + QTabBar::tab:selected { + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 #7BD77B, stop:1 #68C068); + color: white; + border-bottom: 2px solid #339933; + } + """ + self.tabWidget.setStyleSheet(self.sh_tab + self.sh_selected_tab) + + # --- init + self.button_group.button(0).setChecked(True) + self.tabWidget.setCurrentIndex(0) + + # --- Connecting the radio buttons + def radio_toggled (self): + selected_button = self.sender() + + if self.previous_checked_index is not None: + self.tabWidget.setTabText(self.previous_checked_index, f"s{self.previous_checked_index}" ) + + if selected_button.isChecked(): + index = self.button_group.id(selected_button) + self.label_active_setup.setText("Active setup : " + self.tabWidget.tabText(index) ) + self.tabWidget.setTabText(index,f"🔴") + self.previous_checked_index = index + + # --- Fill TableWidget + def load_parameters(self, current_dict , table_index): + for i, (key, value) in enumerate(current_dict.items()): + self.tableWidget= self.findChild(QTableWidget, f"table_{table_index}") + self.tableWidget.setItem(i, 0, QTableWidgetItem(str(key))) + self.tableWidget.setItem(i, 1, QTableWidgetItem(str(value))) + + +# ------------------------------------------------- Tests +if __name__ == "__main__": + app = QApplication(sys.argv) + window = OsciTab() + window.show() + sys.exit(app.exec()) + + diff --git a/labscript_devices/KeysightScope/blacs_workers.py b/labscript_devices/KeysightScope/blacs_workers.py index 56464689..a777e161 100644 --- a/labscript_devices/KeysightScope/blacs_workers.py +++ b/labscript_devices/KeysightScope/blacs_workers.py @@ -1,14 +1,12 @@ import numpy as np -import os import labscript_utils.h5_lock import h5py from zprocess import rich_print from blacs.tab_base_classes import Worker import labscript_utils.properties -import matplotlib.pyplot as plt -from matplotlib import pyplot as plt -from labscript_devices.KeysightScope.connection_manager import BLUE,GREEN +from matplotlib import pyplot as plt +from labscript_devices.KeysightScope.connection_manager import BLUE,GREEN,PURPLE class KeysightScopeWorker(Worker): @@ -22,80 +20,82 @@ def init(self): from .KeysightScope import KeysightScope self.scope = KeysightScope( address= self.address, - verbose = False - ) + verbose = False) + + # ----------------------------------------- Configurations attributes + self.configuration_register = {} # Docu : KeysightScope.get_saving_register() + self.activated_configuration = 0 # ----------------------------------------- Buffered/Manuel flags self.buffered_mode = False - self.acquired_data = None - self.h5file = None - # ----------------------------------------- Buffered/Mabuel transitions - def transition_to_buffered( self, device_name, h5file, front_panel_values, refresh): - rich_print(f"====== transition to Buffered: ======", color=BLUE) # os.path.basename(self.h5file) + def transition_to_buffered( self, device_name, h5file , front_panel_values, refresh): + rich_print(f"====== Begin transition to Buffered: ======", color=BLUE) - self.h5file = h5file self.device_name = device_name - # These two are not used yet - self.initial_values = front_panel_values # Store the initial values in case we have to abort and restore them: - self.final_values = {} # Store the final values to for use during transition_to_static: - - - with h5py.File(h5file, 'r') as hdf5file: - # Dictionary of properties - self.scope_params = labscript_utils.properties.get(hdf5file, device_name, 'device_properties') - - if self.scope_params is not None: - print(self.scope_params) - else : print("scope params is none") - + with h5py.File(self.h5file, 'r+') as f: + + self.activated_configuration = labscript_utils.properties.get(f, device_name, "device_properties")["configuration_number"] + self.current_configuration = self.configuration_register[int(self.activated_configuration)] + + # ----------------------------------------- Error handling + # --- Trigger source must be external + trigger_source = self.device_properties["trigger_source"] + if not (trigger_source == "EXT" or trigger_source == "EXTernal"): + raise KeyError("Trigger source must be an external trigger source (EXT), not channel") + + # ----------------------------------------- Making Sure + self.triggered = self.device_properties["triggered"] + print("================== Triggered ", self.triggered) + print("================== Current config ", self.current_configuration) + + + # ----------------------------------------- Setting the oscilloscope + self.scope.recall_start_setup(self.activated_configuration) + self.scope.dev.timeout = 1e3 *float( self.device_properties.get('timeout', 5)) # Set Timeout self.scope.single() + self.buffered_mode = True # confirm that we buffered + self.scope.lock() # Lock The oscilloscope + rich_print(f"====== End transition to Buffered: ======", color=BLUE) return {} def transition_to_manual(self, abort = False): - rich_print(f"====== transition to manual: ======", color=GREEN) - - # if not self.buffered_mode: # In case we didn't take a shot - # return True - # self.buffered_mode = False # reset the Flag to False - - # if abort: # If we aborted we dont want an acquisation - # self.acquired_data = None - # self.h5file = None - # return True - - # channels = self.scope.channels() - # print(channels) - # data_dict = {} # Create Dict channel - data - # vals = {} - # wtype = [('t', 'float')] - # for ch, enabled in channels.items(): - # print(ch , enabled) - # if enabled: - # data_dict[ch], t, vals[ch] = self.scope.waveform(ch) - # wtype.append((ch, 'float')) - - # # Collect all data in a structured array - # data = np.empty(len(t), dtype=wtype) - # data['t'] = t - # for ch in vals: - # data[ch] = vals[ch] - # # plt.xlabel('Time in s') - # # plt.ylabel('Voltage(2V)') - # # plt.plot(data['t'],vals[ch]) - # # plt.show() - - - # # The Blacs worker of the Ni-CArd is responsible for creating the h5file for a shot ( From what i understood , can be wrong ) - # with h5py.File(self.h5file, 'r+') as hdf_file: # r+ : Read/write, file must exist - # grp = hdf_file.create_group('/data/traces') - # dset = grp.create_dataset(f"{self.device_name } {self.scope.description}" , data=data) - # dset.attrs.update(self.scope.osci_capabilities) - # #dset.attrs.update(data_dict[ch]) # This saves the preamble of the waveform - # print('Saving Done!') + rich_print(f"====== Begin transition to manual: ======", color=GREEN) + self.scope.unlock() # Unlocks The oscilloscope + + if (not self.buffered_mode) or abort : # In case we didn't take a shot + return True + self.buffered_mode = False # reset the Flag to False + + channels = self.scope.channels() # Get the dispayed channels + data_dict = {} # Create Dict channel - data + vals = {} + wtype = [('t', 'float')] + for ch, enabled in channels.items(): + if enabled: + data_dict[ch], t, vals[ch] = self.scope.waveform(waveform_format= "BYTE", channel= ch ) + wtype.append((ch, 'float')) + + data = np.empty(len(t), dtype=wtype) # Collect all data in a structured array + data['t'] = t + for ch in vals: + data[ch] = vals[ch] + # plt.xlabel('Time') + # plt.ylabel('Voltage') + # plt.plot(data['t'],vals[ch]) + # plt.show() + + with h5py.File(self.h5file, 'r+') as hdf_file: # r+ : Read/write, file must already exist + grp = hdf_file.create_group('/data/traces') + dset = grp.create_dataset(self.device_name , data=data) + dset.attrs.update(data_dict[ch]) # This saves the preamble of the waveform + dset.attrs.update(self.current_configuration) + + self.scope.single() + rich_print(f"====== End transition to manual: ======", color=GREEN) return True # ----------------------------------------- Aborting @@ -109,25 +109,54 @@ def abort_buffered(self): """ return self.transition_to_manual(True) - # ----------------------------------------- (Futur) Override for remote + # ----------------------------------------- Override for remote def program_manual(self,front_panel_values): """Over-ride this method if remote programming is supported. Returns: :obj:`check_remote_values()` """ - return self.check_remote_values() def check_remote_values(self): # over-ride this method if remote value check is supported return {} - # ------------------------------------------ blacs functions - def clear(self,value): - """Sends standard \*CLR to clear registers of device. - - Args: - value (bool): value of Clear button in STBstatus.ui widget - """ - print("It works") \ No newline at end of file + # ------------------------------------------ blacs Tabs functions + def shutdown(self): + rich_print(f"====== transition to manual: ======", color= PURPLE) + return self.scope.close() + + # ------------------------------------------ New + def init_osci(self): + self.configuration_register = self.scope.get_saving_register() + self.scope.recall_start_setup() + return self.configuration_register + + def activate_radio_button(self,value): + self.scope.recall_start_setup(location= value) + + + def load_current_config(self,value): + self.scope.save_start_setup(value) + new_configuration = self.scope.get_settings_dict(value) + self._refresh_configuration_register(value , new_configuration) + return new_configuration + + # def load_slot_config(self,value): + # self.scope.recall_start_setup(location= value) + # new_configuration = self.scope.get_settings_dict(value) + # self._refresh_configuration_register(value , new_configuration) + # return new_configuration + + def default_config(self, value): + self.scope.reset_device() + self.scope.save_start_setup(value) + new_configuration = self.scope.get_settings_dict(value) + self._refresh_configuration_register(value , new_configuration) + return new_configuration + + def _refresh_configuration_register(self , slot , new_configuration): + self.configuration_register[slot] = new_configuration + + \ No newline at end of file diff --git a/labscript_devices/KeysightScope/connection_manager.py b/labscript_devices/KeysightScope/connection_manager.py index fd12a50b..2a098bdf 100644 --- a/labscript_devices/KeysightScope/connection_manager.py +++ b/labscript_devices/KeysightScope/connection_manager.py @@ -19,6 +19,10 @@ # ----------------------------------- Miscellaneous class connectionManager: + """ + This class manages the connection and initialization of supported Keysight oscilloscopes + using serial number or address for identifying and loading configuration files from the specified folder. + """ def __init__(self, serial_number=None, address = None, folder_name="models"): self.serial_number = serial_number @@ -39,7 +43,7 @@ def __init__(self, serial_number=None, address = None, folder_name="models"): if self.current_file is None: raise ValueError(f"File with serial number {self.serial_number} not found.") - self.osci_shot_configuration = self.current_file["osci_shot_configuration"] + #self.osci_shot_configuration = self.current_file["osci_shot_configuration"] self.osci_capabilities = self.current_file["osci_capabilities"] @@ -56,14 +60,8 @@ def __init__(self, serial_number=None, address = None, folder_name="models"): def _get_files_from_folder(self): """ - Retrieves all files from the specified folder (default is "models"). - The folder is assumed to be part of the KeysightScope directory structure. - - Returns: - list: A list of file names in the specified folder. - - Raises: - FileNotFoundError: If the specified folder does not exist. + Retrieves a list of all files in the specified folder (default is 'models') and returns their absolute paths. + Raises a FileNotFoundError if the folder does not exist. """ file_path = os.path.abspath(__file__) # Absolute path of this file containing_folder = os.path.dirname(file_path) # Absolute path of the containing folder @@ -74,16 +72,14 @@ def _get_files_from_folder(self): raise FileNotFoundError(f"The folder '{self.folder_name}' does not exist in the KeysightScope directory.") # Get all files in the folder - #files = [f for f in os.listdir(keysight_scope_dir) if os.path.isfile(os.path.join(keysight_scope_dir, f))] files = [os.path.abspath(os.path.join(keysight_scope_dir, f)) for f in os.listdir(keysight_scope_dir) if os.path.isfile(os.path.join(keysight_scope_dir, f))] return files def pick_file_from_serial_number(self, serial_number = None): """ - Selects the first file that contains the serial number in its name. - - Returns: - file: The initialization file that corresponds to the serial number, or None if no file is found. + Searches for a configuration file based on the provided serial number (or the object's serial number if not provided). + Loads the module and extracts its attributes, returning them as a dictionary. + Returns None if no file with the given serial number is found. """ if serial_number is None: serial_number = self.serial_number @@ -91,7 +87,7 @@ def pick_file_from_serial_number(self, serial_number = None): files = self._get_files_from_folder() for file_path in files: - with open(file_path, 'r') as f: # Open the file in read mode + with open(file_path, 'r') as f: content = f.read() if serial_number in content: module_name = os.path.basename(file_path)[:-3] @@ -99,29 +95,16 @@ def pick_file_from_serial_number(self, serial_number = None): module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) - # Create a dictionary to store the module's attributes module_attributes = {} - - # Iterate over all attributes of the module for attribute_name in dir(module): if not attribute_name.startswith('__'): - # Get the attribute value attribute_value = getattr(module, attribute_name) - - # Store the attribute and its value in the dictionary module_attributes[attribute_name] = attribute_value - #Return the dictionary of attributes return module_attributes return None - - -############################################################################ -# Done # -############################################################################ - def get_address_from_serial_number(self, serial_number = None): """ Identifies to the oscilloscope with the given serial number and supported model. @@ -139,8 +122,8 @@ def get_address_from_serial_number(self, serial_number = None): serial_number = self.serial_number - isRightModel = False - isRightSerialNumber = False + is_right_model= False + is_right_serial_number = False for idx, item in enumerate(self.devs): try: @@ -149,20 +132,20 @@ def get_address_from_serial_number(self, serial_number = None): for supported_model in self.supported_models: # checks if it is a supported model if supported_model in osci_model: - isRightModel = True + is_right_model= True # Check the serial number scope_serial_number = sub(r'\s+', '', scope.query(":SERial?")) # gets the device serial number - isRightSerialNumber = (scope_serial_number == serial_number) # checks the conformity between the given and the read serial number + is_right_serial_number = (scope_serial_number == serial_number) # checks the conformity between the given and the read serial number - if isRightSerialNumber and isRightModel: + if is_right_serial_number and is_right_model: return item - elif not isRightModel and isRightSerialNumber: + elif not is_right_model and is_right_serial_number: raise ValueError(f"The device model {osci_model} is not supported. Supported models are EDUX1052A, EDUX1052G, DSOX1202A, DSOX1202G, DSOX1204A, DSOX1204G.") except: continue - if not isRightSerialNumber: + if not is_right_serial_number: raise ValueError(f"No Device with the serial number {serial_number} was found.") def pick_file_from_adress(self): diff --git a/labscript_devices/KeysightScope/labscript_devices.py b/labscript_devices/KeysightScope/labscript_devices.py index dbcdbe12..d2927fb6 100644 --- a/labscript_devices/KeysightScope/labscript_devices.py +++ b/labscript_devices/KeysightScope/labscript_devices.py @@ -1,6 +1,6 @@ -from labscript import TriggerableDevice, LabscriptError, set_passed_properties ,LabscriptError, AnalogIn +from labscript import TriggerableDevice, LabscriptError, set_passed_properties ,LabscriptError,set_passed_properties -## ---------------------------------------------------------------New imports +# ---------------------------------------------------------------New imports from labscript_devices.KeysightScope.connection_manager import * from labscript_devices.KeysightScope.models.default_properties import default_osci_capabilities, default_osci_shot_configuration @@ -8,51 +8,57 @@ class KeysightScope(TriggerableDevice): """ - Defines the interface between - the labscript API and generates hardware instructions that can be saved to the shot h5 file. - A labscript_device for Keysight oscilloscopes (DSOX1202G) using a visa interface. + A labscript_device for Keysight oscilloscopes (1200 X-Series and EDUX1052A/G) using a visa interface. - connection_table_properties (set once) - device_properties (set per shot) """ @set_passed_properties( property_names = { - 'connection_table_properties': list(default_osci_capabilities.keys()), - 'device_properties': list(default_osci_shot_configuration.keys()) + 'connection_table_properties': list(default_osci_capabilities.keys()) , + 'device_properties' : ["configuration_number"] } ) def __init__(self, name, parent_device, - connection, serial_number, + connection = "trigger", **kwargs): - TriggerableDevice.__init__(self, name, parent_device, connection, **kwargs) # parentless=False # connetion = "trigger" + TriggerableDevice.__init__(self, name, parent_device, connection, **kwargs) self.name = name cm = connectionManager(serial_number) self.BLACS_connection = cm.get_address_from_serial_number() - osci_capabilities = cm.osci_capabilities - osci_shot_configuration = cm.osci_shot_configuration - - set_passed_properties( - property_names = { - 'connection_table_properties' : list(osci_capabilities.keys()) , - "device_properties": list(osci_shot_configuration.keys()) - } - ) - + + self.triggered = False # Device can only be triggered zero or one time + self.configuration_number = None # Sets the configuraton slot + # --------------------------------- Device properties - for key,value in osci_capabilities.items(): + self.osci_capabilities = cm.osci_capabilities + for key,value in self.osci_capabilities.items(): setattr(self,key,value) - # --------------------------------- Shot configurations - for key, value in osci_shot_configuration.items(): - setattr(self, key, value) - # Device can only be triggered zero or one time - self.triggered = False + + def set_config(self,configuration_number): + """ + Change the configuration of the oscilloscope to the specified configuration number. + + Args: + configuration_number (str or int): The number of the configuration to switch to (0-9). + + Raises: + LabscriptError: If the configuration number is not between 0 and 9. + """ + if not (0 <= configuration_number <= 9): + raise LabscriptError("Value must be between 0 and 9") + + self.configuration_number = configuration_number + #setattr(self,'configuration_number', configuration_number) + + def trigger_at(self, t, duration ): if self.triggered: @@ -63,6 +69,10 @@ def trigger_at(self, t, duration ): def generate_code(self, hdf5_file, *args): TriggerableDevice.generate_code(self, hdf5_file) + + hdf5_file[f'/devices/{self.name}'].attrs["configuration_number"] = self.configuration_number + + diff --git a/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py b/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py index 0ffa775d..006f1a76 100644 --- a/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py +++ b/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py @@ -6,71 +6,62 @@ """ -# ----------------------------------- Keysight DSOX1202G -osci_shot_configuration = { - # Channel unrelated - "trigger_source" : "CHANnel1", # CHANnel1, CHANnel2 , EXTernal , LINE , WGEN - "trigger_level" : "1", # - "trigger_level_unit" : "V", # V or mV - "trigger_type" : "EDGE", # - "trigger_edge_slope" : "POSitive", # Only for trigger type is Edge - - # "triggered" : False, # Flag to keep track of triggers (Onyl when Trigger is External) - - "acquire_type" : "NORMal", # NORMal , AVERage , HRESolution , PEAK (TO DO HRESOLUTION and PEAK) - "acquire_count" : "8", # AVERage=2-65536 ,HRESolution=1 ,NORMal=8 , PEAK=None +# # ----------------------------------- Keysight DSOX1202G +# osci_shot_configuration = { +# # Channel unrelated +# "trigger_source" : "EXT", # CHANnel1, CHANnel2 , EXTernal , LINE , WGEN +# "trigger_level" : "1", # +# "trigger_level_unit" : "V", # V or mV +# "trigger_type" : "EDGE", # +# "trigger_edge_slope" : "POSitive", # Only for trigger type is Edge - "waveform_format" : "WORD", # WORD , BYTE # Sometimes: despite the format is Word , the osci still sends Byte data, unclear ? +# "triggered" : False, # Flag to keep track of triggers (Onyl when Trigger is External) - "time_reference" : "LEFT", # LEFT , CENT , RIGH - "time_division" : "50", # - "time_division_unit" : "us", # s, ms , us , ns - "time_delay" : "0", # - "time_delay_unit" : "us", # s, ms , us , ns +# "acquire_type" : "NORMal", # NORMal , AVERage , HRESolution , PEAK +# "acquire_count" : "8", # AVERage=2-65536 ,HRESolution=1 ,NORMal=8 , PEAK=None - "timeout" : "5", # In seconds +# "waveform_format" : "BYTE", # WORD , BYTE # Sometimes: despite the format is Word , the osci still sends Byte data, unclear why ? +# "time_reference" : "LEFT", # LEFT , CENT , RIGH +# "time_division" : "50", # +# "time_division_unit" : "us", # s, ms , us , ns +# "time_delay" : "0", # +# "time_delay_unit" : "us", # s, ms , us , ns - # Channel related - # ------------------------ Channel 1 - "channel_display_1" : "1", # 1 ON , 0 = OFF +# "timeout" : "5", # In seconds - "voltage_division_1" : "1", # - "voltage_division_unit_1" : "V", # V or mV - "voltage_offset_1" : "0", # - "voltage_offset_unit_1" : "V", # V or mV - "probe_attenuation_1" : "1", # - # ------------------------ Channel 2 - "channel_display_2" : "0", # 1 ON , 0 = OFF +# # Channel related +# # ------------------------ Channel 1 +# "channel_display_1" : "1", # 1 ON , 0 = OFF - "voltage_division_2" : "1", # - "voltage_division_unit_2" : "V", # V or mV - "voltage_offset_2" : "0", # - "voltage_offset_unit_2" : "V", # V or mV - "probe_attenuation_2" : "1" # +# "voltage_division_1" : "1", # +# "voltage_division_unit_1" : "V", # V or mV +# "voltage_offset_1" : "0", # +# "voltage_offset_unit_1" : "V", # V or mV +# "probe_attenuation_1" : "1", # -} +# # ------------------------ Channel 2 +# "channel_display_2" : "0", # 1 ON , 0 = OFF -{ - 'added_properties': {}, - 'start_order': 0, - 'stop_order': 0, -} +# "voltage_division_2" : "1", # +# "voltage_division_unit_2" : "V", # V or mV +# "voltage_offset_2" : "0", # +# "voltage_offset_unit_2" : "V", # V or mV +# "probe_attenuation_2" : "1" # +# } # ----------------------------------- Keysight DSOX1202G osci_capabilities = { - "description" : "Example Osci", "serial_number" : "CN61364200", "band_width" : 70e6, # 70 MHz - "sampling_rate" : 2*1e9, # 2GSa/s + "sampling_rate" : 2*1e9, # 2GSa/s "max_memory" : 1e6, # 1Mpts "max_update_rate" : 5e4 # 50,000 waveforms/second update rate. } - # ----------------------------------- Tests if __name__ == "__main__": class Osci: @@ -89,8 +80,8 @@ def __init__(self, osci_capabilities = osci_capabilities, osci_shot_configuration = osci_shot_configuration) - print(spec.sampling_rate) - print(spec.timeout) + for item , val in osci_shot_configuration.items(): + print(eval(repr(val)) == val) diff --git a/labscript_devices/KeysightScope/models/default_properties.py b/labscript_devices/KeysightScope/models/default_properties.py index 1e3d9407..2d8e9cca 100644 --- a/labscript_devices/KeysightScope/models/default_properties.py +++ b/labscript_devices/KeysightScope/models/default_properties.py @@ -1,5 +1,5 @@ """ -*************************** DON't DELETE +*************************** DON't DELETE THIS FILE Idea: - Initializing a device for experiments starts by adding it to the connection table file. @@ -21,6 +21,7 @@ # ----------------------------------- Keysight DSOX1202G default_osci_shot_configuration = { + "configuration_number" : None, # General Setup Number # Channel unrelated "trigger_source" : None, # CHANnel1, CHANnel2 , EXTernal , LINE , WGEN "trigger_level" : None, # @@ -65,8 +66,7 @@ # ----------------------------------- Keysight DSOX1202G default_osci_capabilities = { - "description" : None, # Importamnt to find this osci - "serial_number" : None, # important to write + "serial_number" : None, # Important to write "band_width" : None, # 70 MHz "sampling_rate" : None, # 2GSa/s "max_memory" : None, # 1Mpts diff --git a/labscript_devices/KeysightScope/models/example_to_copy.py b/labscript_devices/KeysightScope/models/example_to_copy.py index 4e349f74..bb6ab3f9 100644 --- a/labscript_devices/KeysightScope/models/example_to_copy.py +++ b/labscript_devices/KeysightScope/models/example_to_copy.py @@ -48,12 +48,11 @@ "voltage_division_unit_2" : "V", # V or mV "voltage_offset_2" : "0", # "voltage_offset_unit_2" : "V", # V or mV - "probe_attenuation_2" : "1" # + "probe_attenuation_2" : "1" # } # ----------------------------------- Keysight DSOX1202G osci_capabilities = { - "description" : "Example Osci", # Importamnt to find this osci "serial_number" : "SerialNumber", # important to write "band_width" : 70e6, # 70 MHz "sampling_rate" : 2*10e9, # 2GSa/s diff --git a/labscript_devices/KeysightScope/tab_template.ui b/labscript_devices/KeysightScope/tab_template.ui new file mode 100644 index 00000000..b71d8b2a --- /dev/null +++ b/labscript_devices/KeysightScope/tab_template.ui @@ -0,0 +1,78 @@ + + + Form + + + + 0 + 0 + 642 + 370 + + + + Form + + + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + Activate + + + + + + + + + + Qt::Horizontal + + + + + + + reset to default + + + + + + + Load and save + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + diff --git a/labscript_devices/KeysightScope/tabs.ui b/labscript_devices/KeysightScope/tabs.ui new file mode 100644 index 00000000..25455f5e --- /dev/null +++ b/labscript_devices/KeysightScope/tabs.ui @@ -0,0 +1,127 @@ + + + Form + + + + 0 + 0 + 814 + 556 + + + + Form + + + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + + 7 + true + + + + <html><head/><body><p><span style=" font-size:12pt; font-weight:600;">Setup pages</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + 9 + 75 + true + + + + Active setup : + + + + + + + + 0 + 0 + + + + 0 + + + + s0 + + + + + s1 + + + + + s2 + + + + + s3 + + + + + s4 + + + + + s5 + + + + + s6 + + + + + s7 + + + + + s8 + + + + + s9 + + + + + + + + + + + From c11454158eacc0c99577007d6c5a89187121bc43 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Mon, 31 Mar 2025 15:40:59 +0200 Subject: [PATCH 07/20] Working implementation for KeysightScope --- .../KeysightScope/KeysightScope.py | 13 ++- labscript_devices/KeysightScope/blacs_tabs.py | 20 +---- .../KeysightScope/blacs_workers.py | 26 ++++-- .../KeysightScope/connection_manager.py | 66 ++++++-------- .../KeysightScope/labscript_devices.py | 42 +++++---- .../models/Keysight_dsox1202g.py | 69 --------------- .../models/default_properties.py | 78 ----------------- .../KeysightScope/models/example_to_copy.py | 87 ------------------- labscript_devices/KeysightScope/tabs.ui | 2 +- 9 files changed, 85 insertions(+), 318 deletions(-) delete mode 100644 labscript_devices/KeysightScope/models/default_properties.py delete mode 100644 labscript_devices/KeysightScope/models/example_to_copy.py diff --git a/labscript_devices/KeysightScope/KeysightScope.py b/labscript_devices/KeysightScope/KeysightScope.py index e79e3bd0..8c8b6303 100644 --- a/labscript_devices/KeysightScope/KeysightScope.py +++ b/labscript_devices/KeysightScope/KeysightScope.py @@ -1,15 +1,18 @@ import pyvisa import numpy as np from labscript.labscript import LabscriptError +from labscript_devices.KeysightScope.connection_manager import unit_conversion -class KeysightScope: + +class KeysightScope: def __init__(self, address, verbose = False ): self.verbose = verbose + # --------------------------------- Connecting to device self.dev = pyvisa.ResourceManager().open_resource(address) print(f'Initialized: {self.dev.query("*IDN?")}') @@ -21,6 +24,12 @@ def __init__(self, # Saving and Recalling # ####################################################################################### def get_settings_dict(self,value): + """ + Returns a configuration dictionary for the oscilloscope memory slot specified by 'value'. + Args: + value (int): The memory slot number of the oscilloscope from which to retrieve the configuration. + + """ osci_shot_configuration = { "configuration_number" : str(value) , # Channel unrelated @@ -138,7 +147,7 @@ def reset_device(self): if self.verbose: print("Done reset") - def digitize(self): # Not used yet + def digitize(self): ''' Specialized RUN command. acquires a single waveforms according to the settings of the :ACQuire commands subsystem. When the acquisition is complete, the instrument is stopped. diff --git a/labscript_devices/KeysightScope/blacs_tabs.py b/labscript_devices/KeysightScope/blacs_tabs.py index b584d656..7f8516c1 100644 --- a/labscript_devices/KeysightScope/blacs_tabs.py +++ b/labscript_devices/KeysightScope/blacs_tabs.py @@ -7,7 +7,6 @@ import os import sys from PyQt5.QtWidgets import * -from PyQt5.QtGui import QIcon, QPixmap, QPainter, QColor, QFont from PyQt5.QtCore import QSize from PyQt5 import uic @@ -50,11 +49,7 @@ def initialise_GUI(self): self.load_button = self.osci_widget.findChild(QPushButton, f"loadButton_{i}") self.load_button.clicked.connect(lambda clicked, i=i: self.load_current_config(i)) - # Connect load buttons slot (load slot) - self.load_button = self.osci_widget.findChild(QPushButton, f"loadButtonSlot_{i}") - self.load_button.clicked.connect(lambda clicked, i=i: self.load_slot_config(i)) - - # connect reset buttons (default buttons) + # Connect reset buttons (default buttons) self.default_button = self.osci_widget.findChild(QPushButton, f"defaultButton_{i}") self.default_button.clicked.connect(lambda clicked, i=i: self.default_config(i)) @@ -82,11 +77,6 @@ def load_current_config(self,button_id, widget=None ): dict_config = yield(self.queue_work(self._primary_worker,'load_current_config',button_id)) self.osci_widget.load_parameters(current_dict=dict_config , table_index= button_id) - # @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) - # def load_slot_config(self,button_id, widget=None ): - # dict_config = yield(self.queue_work(self._primary_worker,'load_slot_config',button_id)) - # self.osci_widget.load_parameters(current_dict=dict_config , table_index= button_id) - @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) def default_config(self,button_id, widget=None ): dict_config = yield(self.queue_work(self._primary_worker,'default_config',button_id)) @@ -118,8 +108,7 @@ def __init__(self, parent=None): self.label_active_setup = self.findChild(QLabel,"label_active_setup") self.button_group = QButtonGroup(self) - - # yes_icon = self.style().standardIcon(QStyle.SP_DialogApplyButton) + reset_icon = self.style().standardIcon(QStyle.SP_BrowserReload) load_icon = self.style().standardIcon(QStyle.SP_DialogOpenButton) @@ -142,11 +131,6 @@ def __init__(self, parent=None): self.load_button.setObjectName(f"loadButton_{i}") self.load_button.setIcon(load_icon) self.load_button.setIconSize(QSize(16,16)) - - # self.load_button_slot = tab.findChild(QPushButton , "loadButtonSlot") - # self.load_button_slot.setObjectName(f"loadButtonSlot_{i}") - # self.load_button_slot.setIcon(load_icon) - # self.load_button.setIconSize(QSize(16,16)) self.default_button = tab.findChild(QPushButton , "defaultButton") self.default_button.setObjectName(f"defaultButton_{i}") diff --git a/labscript_devices/KeysightScope/blacs_workers.py b/labscript_devices/KeysightScope/blacs_workers.py index a777e161..059c93d9 100644 --- a/labscript_devices/KeysightScope/blacs_workers.py +++ b/labscript_devices/KeysightScope/blacs_workers.py @@ -1,9 +1,10 @@ import numpy as np +import os import labscript_utils.h5_lock import h5py from zprocess import rich_print from blacs.tab_base_classes import Worker -import labscript_utils.properties +from labscript_utils import properties from matplotlib import pyplot as plt from labscript_devices.KeysightScope.connection_manager import BLUE,GREEN,PURPLE @@ -36,25 +37,32 @@ def transition_to_buffered( self, device_name, h5file , front_panel_values, refr self.device_name = device_name with h5py.File(self.h5file, 'r+') as f: + + # ----------------------------------------- Get device properties + self.activated_configuration = properties.get(f, device_name, 'device_properties')["configuration_number"] + self.triggered = properties.get(f, device_name, 'device_properties')["triggered"] + self.timeout = properties.get(f, device_name, 'device_properties')["timeout"] - self.activated_configuration = labscript_utils.properties.get(f, device_name, "device_properties")["configuration_number"] self.current_configuration = self.configuration_register[int(self.activated_configuration)] # ----------------------------------------- Error handling + # --- Finish if no trigger + if not self.triggered: + return {} + # --- Trigger source must be external - trigger_source = self.device_properties["trigger_source"] + trigger_source = self.current_configuration["trigger_source"] if not (trigger_source == "EXT" or trigger_source == "EXTernal"): raise KeyError("Trigger source must be an external trigger source (EXT), not channel") - # ----------------------------------------- Making Sure - self.triggered = self.device_properties["triggered"] - print("================== Triggered ", self.triggered) - print("================== Current config ", self.current_configuration) + # ----------------------------------------- Update configuration dictionary + self.current_configuration["triggered"] = self.triggered + self.current_configuration["timeout"] = self.timeout + - # ----------------------------------------- Setting the oscilloscope self.scope.recall_start_setup(self.activated_configuration) - self.scope.dev.timeout = 1e3 *float( self.device_properties.get('timeout', 5)) # Set Timeout + self.scope.dev.timeout = 1e3 *float(self.timeout) # Set Timeout self.scope.single() self.buffered_mode = True # confirm that we buffered diff --git a/labscript_devices/KeysightScope/connection_manager.py b/labscript_devices/KeysightScope/connection_manager.py index 2a098bdf..9f821d4b 100644 --- a/labscript_devices/KeysightScope/connection_manager.py +++ b/labscript_devices/KeysightScope/connection_manager.py @@ -3,66 +3,47 @@ import pyvisa from re import sub -# ----------------------------------- Miscellaneous -BLUE = '#66D9EF' -PURPLE = '#AE81FF' -GREEN = '#A6E22E' -GREY = '#75715E' - -unit_conversion = { - 's' : 1 , - 'ns': 1e-9, # nanoseconds to seconds - 'us': 1e-6, # microseconds to seconds - 'ms': 1e-3 # milliseconds to seconds - } -# ----------------------------------- Miscellaneous class connectionManager: """ This class manages the connection and initialization of supported Keysight oscilloscopes using serial number or address for identifying and loading configuration files from the specified folder. """ - def __init__(self, serial_number=None, address = None, folder_name="models"): + def __init__(self, + serial_number=None, + address = None, + folder_name="models" + ): + + # ----------------------------- Init self.serial_number = serial_number self.address = address self.folder_name = folder_name - # List of the supported Keysight oscilloscopes + # ----------------------------- List of the supported Keysight oscilloscopes self.supported_models = ["EDUX1052A", "EDUX1052G", "DSOX1202A", "DSOX1202G", "DSOX1204A", "DSOX1204G"] # ----------------------------- Pyvisa ressources self.rm = pyvisa.ResourceManager() self.devs = self.rm.list_resources() - # ----------------------------- serial_number initialization - if self.serial_number is not None: + # ----------------------------- Serial_number initialization + if self.serial_number is None: + raise ValueError("Serial number must be provided") + else: self.current_file = self.pick_file_from_serial_number() # Dictionary containing all the module attributes if self.current_file is None: raise ValueError(f"File with serial number {self.serial_number} not found.") - #self.osci_shot_configuration = self.current_file["osci_shot_configuration"] self.osci_capabilities = self.current_file["osci_capabilities"] - # ----------------------------- Address initialization - if self.address is not None: - self.current_file = self.pick_file_from_adress() # Dictionary containing all the module attributes - - if self.current_file is None: - raise ValueError(f"File with serial number {self.serial_number} not found.") - - self.osci_shot_configuration = self.current_file["osci_shot_configuration"] - self.osci_capabilities = self.current_file["osci_capabilities"] - def _get_files_from_folder(self): - """ - Retrieves a list of all files in the specified folder (default is 'models') and returns their absolute paths. - Raises a FileNotFoundError if the folder does not exist. - """ + """ Retrieves a list of all file paths in the specified folder (default is 'models') and returns their absolute paths. """ file_path = os.path.abspath(__file__) # Absolute path of this file containing_folder = os.path.dirname(file_path) # Absolute path of the containing folder keysight_scope_dir = os.path.join(containing_folder, self.folder_name) # Absolute path to the desired folder (default is "models") @@ -71,7 +52,7 @@ def _get_files_from_folder(self): if not os.path.exists(keysight_scope_dir): raise FileNotFoundError(f"The folder '{self.folder_name}' does not exist in the KeysightScope directory.") - # Get all files in the folder + # Get all file paths in the folder files = [os.path.abspath(os.path.join(keysight_scope_dir, f)) for f in os.listdir(keysight_scope_dir) if os.path.isfile(os.path.join(keysight_scope_dir, f))] return files @@ -121,7 +102,6 @@ def get_address_from_serial_number(self, serial_number = None): if serial_number is None: serial_number = self.serial_number - is_right_model= False is_right_serial_number = False @@ -148,11 +128,21 @@ def get_address_from_serial_number(self, serial_number = None): if not is_right_serial_number: raise ValueError(f"No Device with the serial number {serial_number} was found.") - def pick_file_from_adress(self): - scope = self.rm.open_resource(self.address, timeout=500) - scope_serial_number = sub(r'\s+', '', scope.query(":SERial?")) - return self.pick_file_from_serial_number(scope_serial_number) +# ----------------------------------- Miscellaneous + +BLUE = '#66D9EF' +PURPLE = '#AE81FF' +GREEN = '#A6E22E' +GREY = '#75715E' + +unit_conversion = { + 's' : 1 , + 'ns': 1e-9, # nanoseconds to seconds + 'us': 1e-6, # microseconds to seconds + 'ms': 1e-3 # milliseconds to seconds + } +# ----------------------------------- Miscellaneous # ------------------------------------------------------------------------ Testing diff --git a/labscript_devices/KeysightScope/labscript_devices.py b/labscript_devices/KeysightScope/labscript_devices.py index d2927fb6..66869bf7 100644 --- a/labscript_devices/KeysightScope/labscript_devices.py +++ b/labscript_devices/KeysightScope/labscript_devices.py @@ -1,10 +1,18 @@ from labscript import TriggerableDevice, LabscriptError, set_passed_properties ,LabscriptError,set_passed_properties +import h5py # ---------------------------------------------------------------New imports from labscript_devices.KeysightScope.connection_manager import * -from labscript_devices.KeysightScope.models.default_properties import default_osci_capabilities, default_osci_shot_configuration +default_osci_capabilities = [ # Example: Keysight DSOX1202G + "serial_number" , # Serial number Must be given when initializing the Oscilloscope + "band_width" , # 70 MHz + "sampling_rate" , # 2GSa/s + "max_memory" , # 1Mpts + "max_update_rate" # 50,000 waveforms/second update rate. + +] class KeysightScope(TriggerableDevice): """ @@ -15,8 +23,8 @@ class KeysightScope(TriggerableDevice): @set_passed_properties( property_names = { - 'connection_table_properties': list(default_osci_capabilities.keys()) , - 'device_properties' : ["configuration_number"] + 'connection_table_properties': default_osci_capabilities, + 'device_properties' : ["configuration_number","triggered", "timeout"] } ) def __init__(self, @@ -24,24 +32,26 @@ def __init__(self, parent_device, serial_number, connection = "trigger", + timeout = 5, **kwargs): TriggerableDevice.__init__(self, name, parent_device, connection, **kwargs) - self.name = name - + # --------------------------------- Connection Manager cm = connectionManager(serial_number) self.BLACS_connection = cm.get_address_from_serial_number() - self.triggered = False # Device can only be triggered zero or one time - self.configuration_number = None # Sets the configuraton slot - - # --------------------------------- Device properties + # --------------------------------- Device capabilities self.osci_capabilities = cm.osci_capabilities for key,value in self.osci_capabilities.items(): setattr(self,key,value) - + # --------------------------------- Class attributes + self.name = name + self.triggered = False # Device can only be triggered Zero or one time + self.configuration_number = None # Sets the configuraton slot + self.timeout = timeout + def set_config(self,configuration_number): """ Change the configuration of the oscilloscope to the specified configuration number. @@ -56,9 +66,7 @@ def set_config(self,configuration_number): raise LabscriptError("Value must be between 0 and 9") self.configuration_number = configuration_number - #setattr(self,'configuration_number', configuration_number) - def trigger_at(self, t, duration ): if self.triggered: @@ -67,14 +75,16 @@ def trigger_at(self, t, duration ): self.trigger(t, duration) - def generate_code(self, hdf5_file, *args): + def generate_code(self, hdf5_file, *args): TriggerableDevice.generate_code(self, hdf5_file) - hdf5_file[f'/devices/{self.name}'].attrs["configuration_number"] = self.configuration_number + if self.configuration_number is not None: + self.set_property('configuration_number', self.configuration_number, location='device_properties', overwrite=True) + + if self.triggered: + self.set_property('triggered', self.triggered , location='device_properties', overwrite=True) - - diff --git a/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py b/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py index 006f1a76..952ffc37 100644 --- a/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py +++ b/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py @@ -1,56 +1,8 @@ """ Keysight DSOX1202G -Two types of properties: - * Osci specific properties - * Shot-specific configurations """ -# # ----------------------------------- Keysight DSOX1202G -# osci_shot_configuration = { -# # Channel unrelated -# "trigger_source" : "EXT", # CHANnel1, CHANnel2 , EXTernal , LINE , WGEN -# "trigger_level" : "1", # -# "trigger_level_unit" : "V", # V or mV -# "trigger_type" : "EDGE", # -# "trigger_edge_slope" : "POSitive", # Only for trigger type is Edge - -# "triggered" : False, # Flag to keep track of triggers (Onyl when Trigger is External) - -# "acquire_type" : "NORMal", # NORMal , AVERage , HRESolution , PEAK -# "acquire_count" : "8", # AVERage=2-65536 ,HRESolution=1 ,NORMal=8 , PEAK=None - -# "waveform_format" : "BYTE", # WORD , BYTE # Sometimes: despite the format is Word , the osci still sends Byte data, unclear why ? - -# "time_reference" : "LEFT", # LEFT , CENT , RIGH -# "time_division" : "50", # -# "time_division_unit" : "us", # s, ms , us , ns -# "time_delay" : "0", # -# "time_delay_unit" : "us", # s, ms , us , ns - -# "timeout" : "5", # In seconds - - -# # Channel related -# # ------------------------ Channel 1 -# "channel_display_1" : "1", # 1 ON , 0 = OFF - -# "voltage_division_1" : "1", # -# "voltage_division_unit_1" : "V", # V or mV -# "voltage_offset_1" : "0", # -# "voltage_offset_unit_1" : "V", # V or mV -# "probe_attenuation_1" : "1", # - -# # ------------------------ Channel 2 -# "channel_display_2" : "0", # 1 ON , 0 = OFF - -# "voltage_division_2" : "1", # -# "voltage_division_unit_2" : "V", # V or mV -# "voltage_offset_2" : "0", # -# "voltage_offset_unit_2" : "V", # V or mV -# "probe_attenuation_2" : "1" # - -# } # ----------------------------------- Keysight DSOX1202G osci_capabilities = { @@ -62,26 +14,5 @@ } -# ----------------------------------- Tests -if __name__ == "__main__": - class Osci: - def __init__(self, - osci_capabilities, - osci_shot_configuration): - - for key, value in osci_capabilities.items(): - setattr(self, key, value) - - for key, value in osci_shot_configuration.items(): - setattr(self, key, value) - - - spec = Osci( - osci_capabilities = osci_capabilities, - osci_shot_configuration = osci_shot_configuration) - - for item , val in osci_shot_configuration.items(): - print(eval(repr(val)) == val) - diff --git a/labscript_devices/KeysightScope/models/default_properties.py b/labscript_devices/KeysightScope/models/default_properties.py deleted file mode 100644 index 2d8e9cca..00000000 --- a/labscript_devices/KeysightScope/models/default_properties.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -*************************** DON't DELETE THIS FILE -Idea: - - - Initializing a device for experiments starts by adding it to the connection table file. - For example: KeysightScope(name="Keysight_Osci", ....) - - - To set the device in a specific state in the initialization, we pass a dictionary that contains the desired configuration for the device. - - - This dictionary will be passed to the labscript_device class. - - ********************* The purpose of this file ********************* - - For proper setup, we must first pass a default dictionary to the decorator responsible for configuring the device properties. - This is necessary because the labscript_device class needs to know the properties to be initialized before the device itself is initialized. - ********************************************************************* - - - These properties will be overridden when initializing the device. - - - This approach is made possible by the way labscript is designed (see labscript.set_passed_properties for more details). -""" - -# ----------------------------------- Keysight DSOX1202G -default_osci_shot_configuration = { - "configuration_number" : None, # General Setup Number - # Channel unrelated - "trigger_source" : None, # CHANnel1, CHANnel2 , EXTernal , LINE , WGEN - "trigger_level" : None, # - "trigger_level_unit" : None, # V or mV - "trigger_type" : None, # - "trigger_edge_slope" : None, # Only for trigger type is Edge - - "triggered" : None, # Flag to keep track of triggers (TO DO) - - "acquire_type" : None, # NORMal , AVERage , HRESolution , PEAK (TO DO HRESOLUTION and PEAK) - "acquire_count" : None, # AVERage=2-65536 ,HRESolution=1 ,NORMal=8 , PEAK=None - - "waveform_format" : None, # WORD , BYTE # WORD doesnt work - - "time_reference" : None, # LEFT , CENT , RIGH - "time_division" : None, # - "time_division_unit" : None, # s, ms , us , ns - "time_delay" : None, # - "time_delay_unit" : None, # s, ms , us , ns - - "timeout" : None, # In seconds - - # Channel related - # ------------------------ Channel 1 - "channel_display_1" : None, # 1 ON , 0 = OFF - - "voltage_division_1" : None, # - "voltage_division_unit_1" : None, # V or mV - "voltage_offset_1" : None, # - "voltage_offset_unit_1" : None, # V or mV - "probe_attenuation_1" : None, # - - # ------------------------ Channel 2 - "channel_display_2" : None, # 1 ON , 0 = OFF - - "voltage_division_2" : None, # - "voltage_division_unit_2" : None, # V or mV - "voltage_offset_2" : None, # - "voltage_offset_unit_2" : None, # V or mV - "probe_attenuation_2" : None # -} - -# ----------------------------------- Keysight DSOX1202G -default_osci_capabilities = { - "serial_number" : None, # Important to write - "band_width" : None, # 70 MHz - "sampling_rate" : None, # 2GSa/s - "max_memory" : None, # 1Mpts - "max_update_rate" : None # 50,000 waveforms/second update rate. -} - - - - diff --git a/labscript_devices/KeysightScope/models/example_to_copy.py b/labscript_devices/KeysightScope/models/example_to_copy.py deleted file mode 100644 index bb6ab3f9..00000000 --- a/labscript_devices/KeysightScope/models/example_to_copy.py +++ /dev/null @@ -1,87 +0,0 @@ -""" -1. File name has to start with Keysight -2. File must contain two dictionnaries with the following names - - osci_shot_configuration - - osci_capabilities - - This example was written for Keysight DSOX1202G -""" - -# ----------------------------------- Keysight DSOX1202G -osci_shot_configuration = { - # Channel unrelated - "trigger_source" : "CHANnel1", # CHANnel1, CHANnel2 , EXTernal , LINE , WGEN - "trigger_level" : "0.5", # - "trigger_level_unit" : "V", # V or mV - "trigger_type" : "EDGE", # - "trigger_edge_slope" : "POSitive", # Only for trigger type is Edge - - "triggered" : False, # Flag to keep track of triggers (TO DO) - - "acquire_type" : "NORMal", # NORMal , AVERage , HRESolution , PEAK (TO DO HRESOLUTION and PEAK) - "acquire_count" : "8", # AVERage=2-65536 ,HRESolution=1 ,NORMal=8 , PEAK=None - - "waveform_format" : "BYTE", # WORD , BYTE (For some reason, WORD doesnt work) - - "time_reference" : "LEFT", # LEFT , CENT , RIGH - "time_division" : "50", # - "time_division_unit" : "us", # s, ms , us , ns - "time_delay" : "0", # - "time_delay_unit" : "us", # s, ms , us , ns - - "timeout" : "5", # In seconds - - # Channel related - # ------------------------ Channel 1 - "channel_display_1" : "1", # 1 ON , 0 = OFF - - "voltage_division_1" : "1", # - "voltage_division_unit_1" : "V", # V or mV - "voltage_offset_1" : "0", # - "voltage_offset_unit_1" : "V", # V or mV - "probe_attenuation_1" : "1", # - - # ------------------------ Channel 2 - "channel_display_2" : "0", # 1 ON , 0 = OFF - - "voltage_division_2" : "2", # - "voltage_division_unit_2" : "V", # V or mV - "voltage_offset_2" : "0", # - "voltage_offset_unit_2" : "V", # V or mV - "probe_attenuation_2" : "1" # -} - -# ----------------------------------- Keysight DSOX1202G -osci_capabilities = { - "serial_number" : "SerialNumber", # important to write - "band_width" : 70e6, # 70 MHz - "sampling_rate" : 2*10e9, # 2GSa/s - "max_memory" : 1e6, # 1Mpts - "max_update_rate" : 5e4 # 50,000 waveforms/second update rate. -} - - - -# ----------------------------------- Tests -if __name__ == "__main__": - class Osci: - def __init__(self, - osci_capabilities, - osci_shot_configuration): - - for key, value in osci_capabilities.items(): - setattr(self, key, value) - - for key, value in osci_shot_configuration.items(): - setattr(self, key, value) - - - spec = Osci( - osci_capabilities = osci_capabilities, - osci_shot_configuration = osci_shot_configuration) - - print(spec.sampling_rate) - print(spec.timeout) - - - diff --git a/labscript_devices/KeysightScope/tabs.ui b/labscript_devices/KeysightScope/tabs.ui index 25455f5e..aeaabc32 100644 --- a/labscript_devices/KeysightScope/tabs.ui +++ b/labscript_devices/KeysightScope/tabs.ui @@ -34,7 +34,7 @@ - <html><head/><body><p><span style=" font-size:12pt; font-weight:600;">Setup pages</span></p></body></html> + <html><head/><body><p><span style=" font-size:12pt; font-weight:600;">Setup tabs</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter From 88f462146a73ae9b4534f6ec4263870b45e2bf25 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Mon, 31 Mar 2025 15:59:01 +0200 Subject: [PATCH 08/20] Working implementation --- labscript_devices/KeysightScope/blacs_workers.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/labscript_devices/KeysightScope/blacs_workers.py b/labscript_devices/KeysightScope/blacs_workers.py index 059c93d9..08336d3f 100644 --- a/labscript_devices/KeysightScope/blacs_workers.py +++ b/labscript_devices/KeysightScope/blacs_workers.py @@ -130,7 +130,7 @@ def check_remote_values(self): # over-ride this method if remote value check is supported return {} - # ------------------------------------------ blacs Tabs functions + # ------------------------------------------ Blacs Tabs functions def shutdown(self): rich_print(f"====== transition to manual: ======", color= PURPLE) return self.scope.close() @@ -151,12 +151,6 @@ def load_current_config(self,value): self._refresh_configuration_register(value , new_configuration) return new_configuration - # def load_slot_config(self,value): - # self.scope.recall_start_setup(location= value) - # new_configuration = self.scope.get_settings_dict(value) - # self._refresh_configuration_register(value , new_configuration) - # return new_configuration - def default_config(self, value): self.scope.reset_device() self.scope.save_start_setup(value) From 04a1298f27a0fc9d70a6a82f1247a618a9e08951 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Tue, 29 Apr 2025 13:49:20 +0200 Subject: [PATCH 09/20] almsot wokring version --- .../KeysightScope/KeysightScope.py | 25 +++++++-- .../KeysightScope/blacs_workers.py | 55 +++++++++++++------ .../KeysightScope/connection_manager.py | 2 +- .../KeysightScope/labscript_devices.py | 2 +- .../KeysightScope/tab_template.ui | 4 +- 5 files changed, 61 insertions(+), 27 deletions(-) diff --git a/labscript_devices/KeysightScope/KeysightScope.py b/labscript_devices/KeysightScope/KeysightScope.py index 8c8b6303..69428163 100644 --- a/labscript_devices/KeysightScope/KeysightScope.py +++ b/labscript_devices/KeysightScope/KeysightScope.py @@ -601,7 +601,7 @@ def get_preample_as_dict(self): preamble_val = [float(i) for i in preamble.split(",")] return dict(zip(keys, preamble_val)) - # ----------------------------------------------- Waveform function + # ----------------------------------------------- Waveform function (BYTE or WORD(int16)) def waveform(self, waveform_format="BYTE" ,channel='CHANnel1' ): """ returns: dict @@ -617,7 +617,7 @@ def waveform(self, waveform_format="BYTE" ,channel='CHANnel1' ): # BYTE: formatted data is transferred as 8-bit bytes. if waveform_format in ["WORD", "BYTE"]: self.dev.write(f":WAVeform:FORMat {waveform_format}") - self.datatype = "H" if waveform_format == "WORD" else "B" + datatype = "H" if waveform_format == "WORD" else "B" if self.verbose: print(f"Done Waveform {waveform_format}") @@ -628,7 +628,7 @@ def waveform(self, waveform_format="BYTE" ,channel='CHANnel1' ): # transfer the data and format into a sequence of strings raw = self.dev.query_binary_values( ':WAVeform:DATA?', - datatype=self.datatype, # 'B' and 'H' are for unassigned , if you want signed use h and b + datatype=datatype, # 'B' and 'H' are for unassigned , if you want signed use h and b #is_big_endian=True, # In case we shift to signed container=np.array ) @@ -639,9 +639,24 @@ def waveform(self, waveform_format="BYTE" ,channel='CHANnel1' ): # (see Page 667 , Keysight manual for programmer ) n = np.arange(wfmp['points'] ) t = ( n - wfmp['xreference']) * wfmp['xincrement'] + wfmp['xorigin'] # time = [( data point number - xreference) * xincrement] + xorigin - y = ( raw - wfmp['yreference']) * wfmp['yincrement'] + wfmp['yorigin'] # voltage = [( data value - yreference) * yincrement] + yorigin + data = ( raw - wfmp['yreference']) * wfmp['yincrement'] + wfmp['yorigin'] # voltage = [( data value - yreference) * yincrement] + yorigin + + print("length time : " , len(t)) + return wfmp, t, data + + + def waveform_ascii(self): + self.dev.write(":WAVeform:FORMat ASCii") + data_ascii = self.dev.query(":WAVeform:DATA?") + + data = np.array([float(x) for x in data_ascii.split(", ")[1:]]) + len_data = len(data) + len_x_achse = 10*200*10**(-9) + t = np.linspace(0,len_x_achse , len_data) + wfmp = self.get_preample_as_dict() + + return wfmp, t, data - return wfmp, t, y ####################################################################################### # Wave Generator # diff --git a/labscript_devices/KeysightScope/blacs_workers.py b/labscript_devices/KeysightScope/blacs_workers.py index 08336d3f..6077fe2d 100644 --- a/labscript_devices/KeysightScope/blacs_workers.py +++ b/labscript_devices/KeysightScope/blacs_workers.py @@ -6,6 +6,13 @@ from blacs.tab_base_classes import Worker from labscript_utils import properties + +import random +import string +from matplotlib.ticker import MaxNLocator + + + from matplotlib import pyplot as plt from labscript_devices.KeysightScope.connection_manager import BLUE,GREEN,PURPLE @@ -40,15 +47,18 @@ def transition_to_buffered( self, device_name, h5file , front_panel_values, refr # ----------------------------------------- Get device properties self.activated_configuration = properties.get(f, device_name, 'device_properties')["configuration_number"] + + print("================= Activated configuration : " , self.activated_configuration , "============================") + self.triggered = properties.get(f, device_name, 'device_properties')["triggered"] self.timeout = properties.get(f, device_name, 'device_properties')["timeout"] self.current_configuration = self.configuration_register[int(self.activated_configuration)] # ----------------------------------------- Error handling - # --- Finish if no trigger - if not self.triggered: - return {} + # # --- Finish if no trigger + # if not self.triggered: + # return {} # --- Trigger source must be external trigger_source = self.current_configuration["trigger_source"] @@ -61,48 +71,57 @@ def transition_to_buffered( self, device_name, h5file , front_panel_values, refr # ----------------------------------------- Setting the oscilloscope - self.scope.recall_start_setup(self.activated_configuration) self.scope.dev.timeout = 1e3 *float(self.timeout) # Set Timeout - self.scope.single() - + self.scope.recall_start_setup(self.activated_configuration) self.buffered_mode = True # confirm that we buffered - self.scope.lock() # Lock The oscilloscope - rich_print(f"====== End transition to Buffered: ======", color=BLUE) + #self.scope.lock() # Lock The oscilloscope + + rich_print(f"====== End transition to Buffered: ======", color=BLUE) + self.scope.single() return {} + + def random_string(self,length): + return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) + + def transition_to_manual(self, abort = False): - rich_print(f"====== Begin transition to manual: ======", color=GREEN) - self.scope.unlock() # Unlocks The oscilloscope + + #self.scope.unlock() # Unlocks The oscilloscope if (not self.buffered_mode) or abort : # In case we didn't take a shot return True self.buffered_mode = False # reset the Flag to False channels = self.scope.channels() # Get the dispayed channels - data_dict = {} # Create Dict channel - data + preamble = {} # data_dict vals = {} wtype = [('t', 'float')] for ch, enabled in channels.items(): if enabled: - data_dict[ch], t, vals[ch] = self.scope.waveform(waveform_format= "BYTE", channel= ch ) + preamble[ch], t, vals[ch] = self.scope.waveform(waveform_format= "BYTE", channel= ch ) + # preamble[ch], t, vals[ch] = self.scope.waveform_ascii() # todo correct time achse wtype.append((ch, 'float')) data = np.empty(len(t), dtype=wtype) # Collect all data in a structured array data['t'] = t for ch in vals: data[ch] = vals[ch] - # plt.xlabel('Time') - # plt.ylabel('Voltage') - # plt.plot(data['t'],vals[ch]) - # plt.show() + plt.xlabel('Time') + plt.ylabel('Voltage') + plt.plot(data['t'],vals[ch]) + plt.gca().xaxis.set_major_locator(MaxNLocator(integer=True, prune='both')) + plt.xticks(rotation=45) + + plt.savefig(f"C:\\Users\\APQ\\Pictures\\{self.random_string(10)}.png") with h5py.File(self.h5file, 'r+') as hdf_file: # r+ : Read/write, file must already exist grp = hdf_file.create_group('/data/traces') dset = grp.create_dataset(self.device_name , data=data) - dset.attrs.update(data_dict[ch]) # This saves the preamble of the waveform + dset.attrs.update(preamble[ch]) # This saves the preamble of the waveform dset.attrs.update(self.current_configuration) - self.scope.single() + #self.scope.set_acquire_state(True) # run on rich_print(f"====== End transition to manual: ======", color=GREEN) return True diff --git a/labscript_devices/KeysightScope/connection_manager.py b/labscript_devices/KeysightScope/connection_manager.py index 9f821d4b..eecf4f67 100644 --- a/labscript_devices/KeysightScope/connection_manager.py +++ b/labscript_devices/KeysightScope/connection_manager.py @@ -126,7 +126,7 @@ def get_address_from_serial_number(self, serial_number = None): continue if not is_right_serial_number: - raise ValueError(f"No Device with the serial number {serial_number} was found.") + raise ValueError(f"No Device with the serial number {serial_number} was found. Please check connection") # ----------------------------------- Miscellaneous diff --git a/labscript_devices/KeysightScope/labscript_devices.py b/labscript_devices/KeysightScope/labscript_devices.py index 66869bf7..1ef1dcb1 100644 --- a/labscript_devices/KeysightScope/labscript_devices.py +++ b/labscript_devices/KeysightScope/labscript_devices.py @@ -32,7 +32,7 @@ def __init__(self, parent_device, serial_number, connection = "trigger", - timeout = 5, + timeout = 10, **kwargs): TriggerableDevice.__init__(self, name, parent_device, connection, **kwargs) diff --git a/labscript_devices/KeysightScope/tab_template.ui b/labscript_devices/KeysightScope/tab_template.ui index b71d8b2a..5a76453a 100644 --- a/labscript_devices/KeysightScope/tab_template.ui +++ b/labscript_devices/KeysightScope/tab_template.ui @@ -45,14 +45,14 @@ - reset to default + reset to default - Load and save + Load and save From 598002855733627a03f7e7ea319f6dc43d6f30d4 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Tue, 29 Apr 2025 14:50:17 +0200 Subject: [PATCH 10/20] Edited ReadMe File --- labscript_devices/KeysightScope/README.md | 127 ++++++++-------------- 1 file changed, 45 insertions(+), 82 deletions(-) diff --git a/labscript_devices/KeysightScope/README.md b/labscript_devices/KeysightScope/README.md index 5fc0efeb..f40e6bd9 100644 --- a/labscript_devices/KeysightScope/README.md +++ b/labscript_devices/KeysightScope/README.md @@ -1,93 +1,56 @@ +# ------------------------- How to use the oscilloscope implementation ------------------------- +# ------------------------- Supported models +* Currently supported models: EDUX1052A, EDUX1052G, DSOX1202A, DSOX1202G, DSOX1204A, DSOX1204G -# ------------------------- How to use the oscilloscope implementation ------------------------- +# ------------------------- Current possible utilization + +### Triggering +* Triggering must be performed via the external trigger input. +* Data is read from the channels currently displayed on the oscilloscope. + +### Oscilloscope shot configuration +* You can configure the oscilloscope manually and then upload the configuration to labscript using the BLACS GUI interface. + +# ------------------------- First settings for your Keysight oscilloscope +1. In the file `Keysightscope/models/Keysight_dsox1202g`, you’ll find an example containing the dictionary: + * `osci_capabilities`: defines device-specific capabilities. -# ------------------------- First settings -In the file Keysightscope/models/example_to_copy you can find a file containing two dictionaries: -* osci_shot_configuration : contains the configuration that the oscilloscope will use for every shot -* osci_capabilities : contains device specific capabilities +2. To support your specific oscilloscope model: + * Copy this example file into the same folder. + * Edit the `osci_capabilities` dictionary to match your oscilloscope’s specifications. -Copy-paste this file in the same folder and change it according to your goal. ------------------------- !!! Important !!! ------------------------- -1. The name of the new file must start with "Keysight", or the program will not detect it, -e.g. Keysightscope/models/Keysight_dsox1202g -2. Don't change the name of the dictionaries: osci_shot_configuration and osci_capabilities -3. In the dictionary osci_capabilities you can give any description to the osci. -The description will then be used across the program to interact with the osci +1. The filename **must** begin with `"Keysight"` to be detected properly, + e.g., `Keysightscope/models/Keysight_dsox1202g` +2. Do **not** rename the dictionary `osci_capabilities`. -# ------------------------- In the connection table file -There are two ways with which we can trigger the oscilloscope. +3. The serial number of your oscilloscope must be included in the `osci_capabilities` dictionary. -# Method 1 : Triggering on the channels -KeysightScope(name="Keysight", - parent_device = None, - parentless=True, - description="Example Osci") +# ------------------------- Example Script -* Advantages : We can trigger on AnalogOut devices -* Disadvantages : We can not manually trigger. - +### In the Python connection table -------------------------- !!! Important !!! ------------------------- -KeysightScope is a Triggerable device and accroding to Labscript we can use it parentless. -However, the Labscript code showed (class TriggerableDevice), that this is not true and we have to make some minor case handling before beeing able to use our scope as in methode 1. - -Following two changes are required to the class TriggerableDevice in the file labscript.labscript.labscript.py -You dont have to understand the code, just add the marked lines - -### First change -class TriggerableDevice(Device): - def __init__(...): - if None in [parent_device, connection] and not parentless: - raise LabscriptError('No parent specified. If this device does not require a parent, set parentless=True') - if isinstance(parent_device, Trigger): - if self.trigger_edge_type != parent_device.trigger_edge_type: - raise LabscriptError('Trigger edge type for %s is \'%s\', ' % (name, self.trigger_edge_type) + - 'but existing Trigger object %s ' % parent_device.name + - 'has edge type \'%s\'' % parent_device.trigger_edge_type) - self.trigger_device = parent_device - elif parent_device is not None: - # Instantiate a trigger object to be our parent: - self.trigger_device = Trigger(name + '_trigger', parent_device, connection, self.trigger_edge_type) - parent_device = self.trigger_device - connection = 'trigger' - elif parent_device is None: ######################### -> These two lines are new - self.trigger_device = parent_device ######################### -> Add the last two lines - -### second change -In the same class in the function do_checks - -def do_checks(self): - if self.trigger_device is not None: ######################### -> Add only the first line - for device in self.trigger_device.child_devices: - if device is not self: - ...... - - -# Method 2: Triggering on the external trigger -KeysightScope(name="Keysight", parent_device=p00,connectin = ""trigger, description="Example Osci") - -* Advantages : We can manually trigger -* Disadvantages : We need to reserve a DigitalOut for the trigger functionality in the experiment - - - - # ------------------------- In the experimental file - # Method 1 : Triggering on the channels -No Need for change - -# Method 2: Triggering on the external trigger -You need to manually request the trigger by going high. -In our case -> p00.go_high(t) - -# ------------------------- To Add a new Device -Currenlty 19.02.2025 -To add a new device, you need to: -1. Copy this folder -2. Add a new sheet for the osci as shown above -3. Change the description in the files KeysightScope and labscript_devices -4. Minor adjustments to some import headers - -(Goal in the future : Implementation that resembles the Ni-CArds., where we would need only one folder for all the scopes) +```python +KeysightScope( + name="osci_keysight", + serial_number="CN61364200", + parent_device=osci_Trigger # parent_device must be a digital output initialized as Trigger(...) +) +``` + +### In the python experiment file +```python +start() +t = 0 + +osci_keysight.set_config(3) # Must be called once at the start of each experiment shot + +trigger_duration = 1e-4 # Example trigger duration +osci_keysight.trigger_at(t=t, duration=trigger_duration) + +t += trigger_duration +stop(t) +``` \ No newline at end of file From 191f4bf404301b891a56d3211318f46b2d9cb7d6 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Tue, 29 Apr 2025 17:40:04 +0200 Subject: [PATCH 11/20] Ready to be revised for a pull request --- .../KeysightScope/KeysightScope.py | 20 +++--- labscript_devices/KeysightScope/README.md | 1 + labscript_devices/KeysightScope/blacs_tabs.py | 58 +++++++++++++---- .../KeysightScope/blacs_workers.py | 62 ++++++++----------- .../KeysightScope/labscript_devices.py | 19 +++--- 5 files changed, 91 insertions(+), 69 deletions(-) diff --git a/labscript_devices/KeysightScope/KeysightScope.py b/labscript_devices/KeysightScope/KeysightScope.py index 69428163..c9bc863c 100644 --- a/labscript_devices/KeysightScope/KeysightScope.py +++ b/labscript_devices/KeysightScope/KeysightScope.py @@ -27,18 +27,18 @@ def get_settings_dict(self,value): """ Returns a configuration dictionary for the oscilloscope memory slot specified by 'value'. Args: - value (int): The memory slot number of the oscilloscope from which to retrieve the configuration. + value (int or str): The memory slot number of the oscilloscope from which to retrieve the configuration. """ osci_shot_configuration = { "configuration_number" : str(value) , + # Channel unrelated "trigger_source" : str(self.get_trigger_source()).strip(), "trigger_level" : str(self.get_trigger_level()).strip(), "trigger_level_unit" : "V", "trigger_type" : str(self.get_trigger_type()).strip(), - "trigger_edge_slope" : str(self.get_trigger_edge_slope()).strip(), - "triggered" : False, + "trigger_edge_slope" : str(self.get_trigger_edge_slope()).strip(), "acquire_type" : str(self.get_acquire_type()).strip(), "acquire_count" : str(self.get_acquire_count()).strip(), @@ -49,8 +49,7 @@ def get_settings_dict(self,value): "time_division_unit" : "s", "time_delay" : str(self.get_time_delay()).strip(), "time_delay_unit" : "s", - "timeout" : "5", # In seconds - + # Channel related # ------------------------ Channel 1 "channel_display_1" : str(self.get_channel_display(channel=1)).strip(), @@ -84,6 +83,7 @@ def save_start_setup(self, location = 0): """ self.dev.write(f":SAVE:SETup:STARt {location}") + def recall_start_setup(self, location = 0): """ Sets the oscilloscope configuration to a specified location. @@ -96,7 +96,10 @@ def recall_start_setup(self, location = 0): location (str or int, optional): The index of the configuration location to recall. Defaults to "0" if not provided. """ - self.dev.write(f":RECall:SETup:STARt {location}") + return self.dev.query(f":RECall:SETup:STARt {location};*OPC?") + + + def get_saving_register(self): """ @@ -641,20 +644,17 @@ def waveform(self, waveform_format="BYTE" ,channel='CHANnel1' ): t = ( n - wfmp['xreference']) * wfmp['xincrement'] + wfmp['xorigin'] # time = [( data point number - xreference) * xincrement] + xorigin data = ( raw - wfmp['yreference']) * wfmp['yincrement'] + wfmp['yorigin'] # voltage = [( data value - yreference) * yincrement] + yorigin - print("length time : " , len(t)) return wfmp, t, data def waveform_ascii(self): self.dev.write(":WAVeform:FORMat ASCii") data_ascii = self.dev.query(":WAVeform:DATA?") - data = np.array([float(x) for x in data_ascii.split(", ")[1:]]) len_data = len(data) - len_x_achse = 10*200*10**(-9) + len_x_achse = self.get_time_range() t = np.linspace(0,len_x_achse , len_data) wfmp = self.get_preample_as_dict() - return wfmp, t, data diff --git a/labscript_devices/KeysightScope/README.md b/labscript_devices/KeysightScope/README.md index f40e6bd9..6b7e1330 100644 --- a/labscript_devices/KeysightScope/README.md +++ b/labscript_devices/KeysightScope/README.md @@ -47,6 +47,7 @@ start() t = 0 osci_keysight.set_config(3) # Must be called once at the start of each experiment shot +t+= 0.5 # We need to account for configuration time of the oscilloscope trigger_duration = 1e-4 # Example trigger duration osci_keysight.trigger_at(t=t, duration=trigger_duration) diff --git a/labscript_devices/KeysightScope/blacs_tabs.py b/labscript_devices/KeysightScope/blacs_tabs.py index 7f8516c1..22b00ecf 100644 --- a/labscript_devices/KeysightScope/blacs_tabs.py +++ b/labscript_devices/KeysightScope/blacs_tabs.py @@ -36,7 +36,7 @@ def initialise_workers(self): def initialise_GUI(self): - # The Osci Widget + # The osci widget self.osci_widget = OsciTab() self.get_tab_layout().addWidget(self.osci_widget) @@ -53,13 +53,14 @@ def initialise_GUI(self): self.default_button = self.osci_widget.findChild(QPushButton, f"defaultButton_{i}") self.default_button.clicked.connect(lambda clicked, i=i: self.default_config(i)) + # Loads the Osci Configurations self.init_osci() return @define_state(MODE_MANUAL|MODE_BUFFERED|MODE_TRANSITION_TO_BUFFERED|MODE_TRANSITION_TO_MANUAL,True,True) - def init_osci(self,widget=None ): + def init_osci(self, widget=None ): list_dict_config = yield(self.queue_work(self._primary_worker,'init_osci')) for key,value in list_dict_config.items(): @@ -118,24 +119,36 @@ def __init__(self, parent=None): self.tabWidget.removeTab(i) self.tabWidget.insertTab(i, TabTemplate(), f"s{i}") # Add the new widget to the layout tab = self.tabWidget.widget(i) - - # --- RadioButtons - radio_button = tab.findChild(QRadioButton, "activeRadioButton") - radio_button.setObjectName(f"activeRadioButton_{i}") - self.button_group.addButton(radio_button) - self.button_group.setId(radio_button, i ) - radio_button.toggled.connect(self.radio_toggled ) - # --- ToolButtons + # --- LoadButtons self.load_button = tab.findChild(QPushButton , "loadButton") self.load_button.setObjectName(f"loadButton_{i}") self.load_button.setIcon(load_icon) self.load_button.setIconSize(QSize(16,16)) - + if i !=0: + self.load_button.setEnabled(False) # init condition + + # --- resetButtons self.default_button = tab.findChild(QPushButton , "defaultButton") self.default_button.setObjectName(f"defaultButton_{i}") self.default_button.setIcon(reset_icon) self.default_button.setIconSize(QSize(16,16)) + if i !=0: + self.default_button.setEnabled(False) # init condition + + + for i in range(self.tabWidget.count()): + + tab = self.tabWidget.widget(i) + + # --- RadioButtons + radio_button = tab.findChild(QRadioButton, "activeRadioButton") + radio_button.setObjectName(f"activeRadioButton_{i}") + self.button_group.addButton(radio_button) + self.button_group.setId(radio_button, i ) + radio_button.toggled.connect(self.radio_toggled ) + + # --- TableWidgets self.tableWidget = tab.findChild(QTableWidget, "tableWidget") @@ -180,13 +193,36 @@ def radio_toggled (self): if self.previous_checked_index is not None: self.tabWidget.setTabText(self.previous_checked_index, f"s{self.previous_checked_index}" ) + + tab = self.tabWidget.widget(self.previous_checked_index) + self.load_button = tab.findChild(QPushButton, f"loadButton_{self.previous_checked_index}") + self.default_button = tab.findChild(QPushButton , f"defaultButton_{self.previous_checked_index}") + + if self.load_button: + self.load_button.setEnabled(False) + + if self.default_button: + self.default_button.setEnabled(False) + if selected_button.isChecked(): index = self.button_group.id(selected_button) self.label_active_setup.setText("Active setup : " + self.tabWidget.tabText(index) ) self.tabWidget.setTabText(index,f"🔴") + + tab = self.tabWidget.widget(index) + self.load_button = tab.findChild(QPushButton,f"loadButton_{index}") + self.default_button = tab.findChild(QPushButton , f"defaultButton_{index}") + + if self.load_button: + self.load_button.setEnabled(True) + + if self.default_button: + self.default_button.setEnabled(True) + self.previous_checked_index = index + # --- Fill TableWidget def load_parameters(self, current_dict , table_index): for i, (key, value) in enumerate(current_dict.items()): diff --git a/labscript_devices/KeysightScope/blacs_workers.py b/labscript_devices/KeysightScope/blacs_workers.py index 6077fe2d..6be5549a 100644 --- a/labscript_devices/KeysightScope/blacs_workers.py +++ b/labscript_devices/KeysightScope/blacs_workers.py @@ -1,19 +1,14 @@ import numpy as np -import os -import labscript_utils.h5_lock + +# import labscript_utils.h5_lock import h5py from zprocess import rich_print from blacs.tab_base_classes import Worker from labscript_utils import properties - -import random -import string -from matplotlib.ticker import MaxNLocator - - - -from matplotlib import pyplot as plt +# import os +# from matplotlib.ticker import MaxNLocator +# from matplotlib import pyplot as plt from labscript_devices.KeysightScope.connection_manager import BLUE,GREEN,PURPLE @@ -48,7 +43,7 @@ def transition_to_buffered( self, device_name, h5file , front_panel_values, refr # ----------------------------------------- Get device properties self.activated_configuration = properties.get(f, device_name, 'device_properties')["configuration_number"] - print("================= Activated configuration : " , self.activated_configuration , "============================") + print("====== Activated configuration : " , self.activated_configuration , "=======") self.triggered = properties.get(f, device_name, 'device_properties')["triggered"] self.timeout = properties.get(f, device_name, 'device_properties')["timeout"] @@ -57,8 +52,8 @@ def transition_to_buffered( self, device_name, h5file , front_panel_values, refr # ----------------------------------------- Error handling # # --- Finish if no trigger - # if not self.triggered: - # return {} + if not self.triggered: + return {} # --- Trigger source must be external trigger_source = self.current_configuration["trigger_source"] @@ -71,49 +66,44 @@ def transition_to_buffered( self, device_name, h5file , front_panel_values, refr # ----------------------------------------- Setting the oscilloscope - self.scope.dev.timeout = 1e3 *float(self.timeout) # Set Timeout - self.scope.recall_start_setup(self.activated_configuration) + self.scope.dev.timeout = 1e3 *float(self.timeout) # Set Timeout + self.scope.recall_start_setup(self.activated_configuration) # returns "1" when complete + self.buffered_mode = True # confirm that we buffered - #self.scope.lock() # Lock The oscilloscope + self.scope.lock() # Lock The oscilloscope - rich_print(f"====== End transition to Buffered: ======", color=BLUE) self.scope.single() + rich_print(f"====== End transition to Buffered: ======", color=BLUE) return {} - - - def random_string(self,length): - return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) - def transition_to_manual(self, abort = False): - - #self.scope.unlock() # Unlocks The oscilloscope + rich_print(f"====== Begin transition to manual: ======", color=GREEN) + self.scope.unlock() # Unlocks The oscilloscope - if (not self.buffered_mode) or abort : # In case we didn't take a shot + if (not self.buffered_mode) or (not self.triggered) or abort : # In case we didn't take a shot or we didn't trigger return True - self.buffered_mode = False # reset the Flag to False + self.buffered_mode = False # reset the Flag to False - channels = self.scope.channels() # Get the dispayed channels - preamble = {} # data_dict + channels = self.scope.channels() # Get the dispayed channels + preamble = {} # data_dict vals = {} wtype = [('t', 'float')] for ch, enabled in channels.items(): if enabled: preamble[ch], t, vals[ch] = self.scope.waveform(waveform_format= "BYTE", channel= ch ) - # preamble[ch], t, vals[ch] = self.scope.waveform_ascii() # todo correct time achse + # preamble[ch], t, vals[ch] = self.scope.waveform_ascii() wtype.append((ch, 'float')) data = np.empty(len(t), dtype=wtype) # Collect all data in a structured array data['t'] = t for ch in vals: data[ch] = vals[ch] - plt.xlabel('Time') - plt.ylabel('Voltage') - plt.plot(data['t'],vals[ch]) - plt.gca().xaxis.set_major_locator(MaxNLocator(integer=True, prune='both')) - plt.xticks(rotation=45) - - plt.savefig(f"C:\\Users\\APQ\\Pictures\\{self.random_string(10)}.png") + # plt.xlabel('Time') # For debugging purposes + # plt.ylabel('Voltage') + # plt.plot(data['t'],vals[ch]) + # plt.gca().xaxis.set_major_locator(MaxNLocator(integer=True, prune='both')) + # plt.xticks(rotation=45) + # plt.show(block=False) with h5py.File(self.h5file, 'r+') as hdf_file: # r+ : Read/write, file must already exist grp = hdf_file.create_group('/data/traces') diff --git a/labscript_devices/KeysightScope/labscript_devices.py b/labscript_devices/KeysightScope/labscript_devices.py index 1ef1dcb1..db67eeaa 100644 --- a/labscript_devices/KeysightScope/labscript_devices.py +++ b/labscript_devices/KeysightScope/labscript_devices.py @@ -1,5 +1,6 @@ from labscript import TriggerableDevice, LabscriptError, set_passed_properties ,LabscriptError,set_passed_properties import h5py +import time # ---------------------------------------------------------------New imports from labscript_devices.KeysightScope.connection_manager import * @@ -29,10 +30,10 @@ class KeysightScope(TriggerableDevice): ) def __init__(self, name, - parent_device, serial_number, + parent_device, connection = "trigger", - timeout = 10, + timeout = 5, **kwargs): TriggerableDevice.__init__(self, name, parent_device, connection, **kwargs) @@ -47,9 +48,10 @@ def __init__(self, # --------------------------------- Class attributes self.name = name - self.triggered = False # Device can only be triggered Zero or one time - self.configuration_number = None # Sets the configuraton slot self.timeout = timeout + self.triggered = False # Device can only be triggered zero or one time + self.configuration_number = None # Sets the configuraton slot + def set_config(self,configuration_number): @@ -82,11 +84,4 @@ def generate_code(self, hdf5_file, *args): self.set_property('configuration_number', self.configuration_number, location='device_properties', overwrite=True) if self.triggered: - self.set_property('triggered', self.triggered , location='device_properties', overwrite=True) - - - - - - - + self.set_property('triggered', self.triggered , location='device_properties', overwrite=True) \ No newline at end of file From 202673a879a7cd97bfcbb7adb21232e53aa6affd Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Wed, 30 Apr 2025 11:12:18 +0200 Subject: [PATCH 12/20] Ready for a pull request (minor corrected) --- labscript_devices/KeysightScope/README.md | 3 +-- labscript_devices/KeysightScope/blacs_workers.py | 12 +++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/labscript_devices/KeysightScope/README.md b/labscript_devices/KeysightScope/README.md index 6b7e1330..fd150735 100644 --- a/labscript_devices/KeysightScope/README.md +++ b/labscript_devices/KeysightScope/README.md @@ -46,8 +46,7 @@ KeysightScope( start() t = 0 -osci_keysight.set_config(3) # Must be called once at the start of each experiment shot -t+= 0.5 # We need to account for configuration time of the oscilloscope +osci_keysight.set_config(3) # Must be called once at the start of each experiment shot trigger_duration = 1e-4 # Example trigger duration osci_keysight.trigger_at(t=t, duration=trigger_duration) diff --git a/labscript_devices/KeysightScope/blacs_workers.py b/labscript_devices/KeysightScope/blacs_workers.py index 6be5549a..e7afe64b 100644 --- a/labscript_devices/KeysightScope/blacs_workers.py +++ b/labscript_devices/KeysightScope/blacs_workers.py @@ -1,14 +1,13 @@ import numpy as np - -# import labscript_utils.h5_lock import h5py from zprocess import rich_print from blacs.tab_base_classes import Worker from labscript_utils import properties +import time -# import os # from matplotlib.ticker import MaxNLocator # from matplotlib import pyplot as plt + from labscript_devices.KeysightScope.connection_manager import BLUE,GREEN,PURPLE @@ -31,7 +30,8 @@ def init(self): # ----------------------------------------- Buffered/Manuel flags self.buffered_mode = False - + + def transition_to_buffered( self, device_name, h5file , front_panel_values, refresh): rich_print(f"====== Begin transition to Buffered: ======", color=BLUE) @@ -67,12 +67,14 @@ def transition_to_buffered( self, device_name, h5file , front_panel_values, refr # ----------------------------------------- Setting the oscilloscope self.scope.dev.timeout = 1e3 *float(self.timeout) # Set Timeout - self.scope.recall_start_setup(self.activated_configuration) # returns "1" when complete + + self.scope.recall_start_setup(self.activated_configuration) self.buffered_mode = True # confirm that we buffered self.scope.lock() # Lock The oscilloscope self.scope.single() + rich_print(f"====== End transition to Buffered: ======", color=BLUE) return {} From 20a6cc0a69d433167f0e62e4fe7d5669c4459898 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Mon, 5 May 2025 13:34:05 +0200 Subject: [PATCH 13/20] Edited README file --- labscript_devices/KeysightScope/README.md | 38 +++++++++++++----- .../KeysightScope/Screenshot_BLACS_tab.png | Bin 0 -> 23328 bytes .../KeysightScope/connection_manager.py | 18 +-------- 3 files changed, 28 insertions(+), 28 deletions(-) create mode 100644 labscript_devices/KeysightScope/Screenshot_BLACS_tab.png diff --git a/labscript_devices/KeysightScope/README.md b/labscript_devices/KeysightScope/README.md index fd150735..9349ebaa 100644 --- a/labscript_devices/KeysightScope/README.md +++ b/labscript_devices/KeysightScope/README.md @@ -1,18 +1,29 @@ -# ------------------------- How to use the oscilloscope implementation ------------------------- +# Keysight oscilloscope implementation -# ------------------------- Supported models +## Supported models * Currently supported models: EDUX1052A, EDUX1052G, DSOX1202A, DSOX1202G, DSOX1204A, DSOX1204G -# ------------------------- Current possible utilization +## Current possible utilization ### Triggering +* The oscilloscope is to be used in trigger mode (Single mode). * Triggering must be performed via the external trigger input. * Data is read from the channels currently displayed on the oscilloscope. -### Oscilloscope shot configuration -* You can configure the oscilloscope manually and then upload the configuration to labscript using the BLACS GUI interface. +### Oscilloscope configuration +* You can configure the oscilloscope manually and then upload the configuration to labscript using the BLACS GUI interface, as shown in the following example: -# ------------------------- First settings for your Keysight oscilloscope +![alt text]() + +* **1** By pressing `activate` on a spot index (in this example, Spot 0), the oscilloscope loads the configuration state saved in that spot, and the tab number lights up red. + +* **2** Once a specific spot is activated,it becomes editable. You can either: + * Manually change the oscilloscope settings directly on the device, then click `load and save` in the BLACS tab to import and save the updated configuration for that spot. + * Or, click `reset to default` to load the default oscilloscope configuration. + +* **3** This zone gives an overview of the most important setting parameters for the currently selected (green highleted, not necessarly activated) tab. + +# First settings for your Keysight oscilloscope 1. In the file `Keysightscope/models/Keysight_dsox1202g`, you’ll find an example containing the dictionary: * `osci_capabilities`: defines device-specific capabilities. @@ -21,15 +32,13 @@ * Copy this example file into the same folder. * Edit the `osci_capabilities` dictionary to match your oscilloscope’s specifications. -------------------------- !!! Important !!! ------------------------- +**--------- !!! Important !!! ---------** 1. The filename **must** begin with `"Keysight"` to be detected properly, e.g., `Keysightscope/models/Keysight_dsox1202g` 2. Do **not** rename the dictionary `osci_capabilities`. -3. The serial number of your oscilloscope must be included in the `osci_capabilities` dictionary. - -# ------------------------- Example Script +## Example Script ### In the Python connection table @@ -37,11 +46,18 @@ KeysightScope( name="osci_keysight", serial_number="CN61364200", - parent_device=osci_Trigger # parent_device must be a digital output initialized as Trigger(...) + parent_device=osci_Trigger # parent_device must be a digital output initialized as Trigger(...) ) ``` ### In the python experiment file +There are two main function to use in the experiment scipt: + +* `set_config( spot_index : int or string )` : The oscilloscope has ten different spots where it saves its global settings. set_config(spot_index) must be called at the beginning of the experiment script with the desired spot_index to initialize the oscilloscope with the corresponding configuration for the shot. + + +* `trigger_at( t=t, duration=trigger_duration )` : This function allows the parent device (of type Trigger()) to trigger the oscilloscope for the specified trigger_duration. During this short period, data will be read from the displayed channels. + ```python start() t = 0 diff --git a/labscript_devices/KeysightScope/Screenshot_BLACS_tab.png b/labscript_devices/KeysightScope/Screenshot_BLACS_tab.png new file mode 100644 index 0000000000000000000000000000000000000000..715776e6ab26643688bf8782ed543840dc1a8d4e GIT binary patch literal 23328 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 LzGl(oUxWVv__`EY literal 0 HcmV?d00001 diff --git a/labscript_devices/KeysightScope/connection_manager.py b/labscript_devices/KeysightScope/connection_manager.py index eecf4f67..eab39087 100644 --- a/labscript_devices/KeysightScope/connection_manager.py +++ b/labscript_devices/KeysightScope/connection_manager.py @@ -2,7 +2,7 @@ import importlib import pyvisa from re import sub - +from datetime import datetime class connectionManager: @@ -41,7 +41,6 @@ def __init__(self, self.osci_capabilities = self.current_file["osci_capabilities"] - def _get_files_from_folder(self): """ Retrieves a list of all file paths in the specified folder (default is 'models') and returns their absolute paths. """ file_path = os.path.abspath(__file__) # Absolute path of this file @@ -136,18 +135,3 @@ def get_address_from_serial_number(self, serial_number = None): GREEN = '#A6E22E' GREY = '#75715E' -unit_conversion = { - 's' : 1 , - 'ns': 1e-9, # nanoseconds to seconds - 'us': 1e-6, # microseconds to seconds - 'ms': 1e-3 # milliseconds to seconds - } -# ----------------------------------- Miscellaneous - - -# ------------------------------------------------------------------------ Testing -if __name__ == "__main__": - cm = connectionManager(serial_number="CN61364200") - print(cm.osci_capabilities) - - From 5e0f2bc8cb606354aed67ac7fa0de984b6930234 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Mon, 5 May 2025 14:01:53 +0200 Subject: [PATCH 14/20] added draft for the pull request message --- labscript_devices/KeysightScope/connection_manager.py | 7 +++++++ .../KeysightScope/draft_pull_request_message.txt | 11 +++++++++++ 2 files changed, 18 insertions(+) create mode 100644 labscript_devices/KeysightScope/draft_pull_request_message.txt diff --git a/labscript_devices/KeysightScope/connection_manager.py b/labscript_devices/KeysightScope/connection_manager.py index eab39087..4f82aadd 100644 --- a/labscript_devices/KeysightScope/connection_manager.py +++ b/labscript_devices/KeysightScope/connection_manager.py @@ -135,3 +135,10 @@ def get_address_from_serial_number(self, serial_number = None): GREEN = '#A6E22E' GREY = '#75715E' +unit_conversion = { + 's' : 1 , + 'ns': 1e-9, # nanoseconds to seconds + 'us': 1e-6, # microseconds to seconds + 'ms': 1e-3 # milliseconds to seconds + } + diff --git a/labscript_devices/KeysightScope/draft_pull_request_message.txt b/labscript_devices/KeysightScope/draft_pull_request_message.txt new file mode 100644 index 00000000..1271a59b --- /dev/null +++ b/labscript_devices/KeysightScope/draft_pull_request_message.txt @@ -0,0 +1,11 @@ +DRAFT + +Author: +I am a physics student working with the APQ (Atoms-Photons-Quanta) group at the University of Darmstadt. +As part of my work, I integrated Keysight oscilloscopes into labscript. Please see the README file for further information. +I will be happy to answer any questions. + +best reagards +Kerim Takouti + + From 3e040913e617d228e1baddf31242f8e6d804f4ad Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Tue, 13 May 2025 13:40:54 +0200 Subject: [PATCH 15/20] cleanup --- .../KeysightScope/draft_pull_request_message.txt | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 labscript_devices/KeysightScope/draft_pull_request_message.txt diff --git a/labscript_devices/KeysightScope/draft_pull_request_message.txt b/labscript_devices/KeysightScope/draft_pull_request_message.txt deleted file mode 100644 index 1271a59b..00000000 --- a/labscript_devices/KeysightScope/draft_pull_request_message.txt +++ /dev/null @@ -1,11 +0,0 @@ -DRAFT - -Author: -I am a physics student working with the APQ (Atoms-Photons-Quanta) group at the University of Darmstadt. -As part of my work, I integrated Keysight oscilloscopes into labscript. Please see the README file for further information. -I will be happy to answer any questions. - -best reagards -Kerim Takouti - - From cc545f4a68f23008e242b5bf53c7ceca12b77832 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Tue, 13 May 2025 13:52:34 +0200 Subject: [PATCH 16/20] revert unwanted changes --- labscript_devices/NI_DAQmx/blacs_workers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/labscript_devices/NI_DAQmx/blacs_workers.py b/labscript_devices/NI_DAQmx/blacs_workers.py index 3b2270af..44740d8c 100644 --- a/labscript_devices/NI_DAQmx/blacs_workers.py +++ b/labscript_devices/NI_DAQmx/blacs_workers.py @@ -602,7 +602,7 @@ def transition_to_manual(self, abort=False): data_group.create_group(self.device_name) waits_in_use = len(hdf5_file['waits']) > 0 - if self.buffered_chans is not None and not self.acquired_data: + if self.buffered_chans is not None and not self.acquired_data: msg = """No data was acquired. Perhaps the acquisition task was not triggered to start, is the device connected to a pseudoclock?""" raise RuntimeError(dedent(msg)) @@ -692,7 +692,7 @@ def abort_transition_to_buffered(self): return self.transition_to_manual(True) def program_manual(self, values): - return {} # + return {} class NI_DAQmxWaitMonitorWorker(Worker): From 5e22ad4b0c28c579cc1aaa7e7c8cce61aac57ab6 Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Mon, 26 May 2025 12:53:42 +0200 Subject: [PATCH 17/20] changed name of Keysight device --- labscript_devices/KeysightScope/KeysightScope.py | 2 +- labscript_devices/KeysightScope/blacs_workers.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/labscript_devices/KeysightScope/KeysightScope.py b/labscript_devices/KeysightScope/KeysightScope.py index c9bc863c..04d97423 100644 --- a/labscript_devices/KeysightScope/KeysightScope.py +++ b/labscript_devices/KeysightScope/KeysightScope.py @@ -5,7 +5,7 @@ -class KeysightScope: +class KeysightScopeDevice: def __init__(self, address, verbose = False diff --git a/labscript_devices/KeysightScope/blacs_workers.py b/labscript_devices/KeysightScope/blacs_workers.py index e7afe64b..7153de01 100644 --- a/labscript_devices/KeysightScope/blacs_workers.py +++ b/labscript_devices/KeysightScope/blacs_workers.py @@ -19,8 +19,8 @@ class KeysightScopeWorker(Worker): def init(self): # ----------------------------------------- Initialize osci global KeysightScope - from .KeysightScope import KeysightScope - self.scope = KeysightScope( + from .KeysightScope import KeysightScopeDevice + self.scope = KeysightScopeDevice( address= self.address, verbose = False) From 6cfcfba45410dc0b86ecf45d67e9cc256edf5065 Mon Sep 17 00:00:00 2001 From: Kimu754 Date: Tue, 27 May 2025 11:25:18 +0200 Subject: [PATCH 18/20] testing version for KeysigtScope without the connection_manager class --- .../KeysightScope/KeysightScope.py | 23 ++- .../KeysightScope/blacs_workers.py | 16 +- .../KeysightScope/connection_manager.py | 144 ------------------ .../KeysightScope/labscript_devices.py | 63 ++++++-- .../models/Keysight_dsox1202g.py | 18 --- 5 files changed, 71 insertions(+), 193 deletions(-) delete mode 100644 labscript_devices/KeysightScope/connection_manager.py delete mode 100644 labscript_devices/KeysightScope/models/Keysight_dsox1202g.py diff --git a/labscript_devices/KeysightScope/KeysightScope.py b/labscript_devices/KeysightScope/KeysightScope.py index c9bc863c..4b66c899 100644 --- a/labscript_devices/KeysightScope/KeysightScope.py +++ b/labscript_devices/KeysightScope/KeysightScope.py @@ -1,11 +1,11 @@ import pyvisa import numpy as np from labscript.labscript import LabscriptError -from labscript_devices.KeysightScope.connection_manager import unit_conversion +# from labscript_devices.KeysightScope.connection_manager import self.unit_conversion -class KeysightScope: +class KeysightScopeDevice: def __init__(self, address, verbose = False @@ -13,6 +13,13 @@ def __init__(self, self.verbose = verbose + self.unit_conversion = { + 's' : 1 , + 'ns': 1e-9, # nanoseconds to seconds + 'us': 1e-6, # microseconds to seconds + 'ms': 1e-3 # milliseconds to seconds + } + # --------------------------------- Connecting to device self.dev = pyvisa.ResourceManager().open_resource(address) print(f'Initialized: {self.dev.query("*IDN?")}') @@ -233,12 +240,12 @@ def set_time_range(self, range, unit): """ # Validate unit - if unit not in unit_conversion: + if unit not in self.unit_conversion: raise LabscriptError(f"Invalid unit '{unit}'. Supported units are 'ns', 'us', 'ms'.") # Convert to seconds try: - converted_time_range = float(range) * unit_conversion[unit] + converted_time_range = float(range) * self.unit_conversion[unit] # Check if the converted time range is within the allowed bounds if not (50e-9 <= converted_time_range <= 500): @@ -260,12 +267,12 @@ def set_time_division(self,division,unit): LabscriptError: If the time division is outside the valid division or if the unit is invalid. """ # Validate unit - if unit not in unit_conversion: + if unit not in self.unit_conversion: raise LabscriptError(f"Invalid unit '{unit}'. Supported units are 'ns', 'us', 'ms'.") # Convert to seconds try: - converted_time_division = float(division) * unit_conversion[unit] + converted_time_division = float(division) * self.unit_conversion[unit] # Check if the converted time division is within the allowed bounds if not (5e-9 <= converted_time_division <= 50): @@ -289,12 +296,12 @@ def set_time_delay(self,delay,unit="us"): """ # Validate unit - if unit not in unit_conversion: + if unit not in self.unit_conversion: raise LabscriptError(f"Invalid unit '{unit}'. Supported units are 'ns', 'us', 'ms'.") # Convert to seconds try: - converted_time_delay = float(delay) * unit_conversion[unit] + converted_time_delay = float(delay) * self.unit_conversion[unit] # Check if the converted time range is within the allowed bounds if converted_time_delay >= 500: diff --git a/labscript_devices/KeysightScope/blacs_workers.py b/labscript_devices/KeysightScope/blacs_workers.py index e7afe64b..e157568b 100644 --- a/labscript_devices/KeysightScope/blacs_workers.py +++ b/labscript_devices/KeysightScope/blacs_workers.py @@ -1,3 +1,4 @@ +from labscript_devices.KeysightScope.KeysightScope import KeysightScopeDevice import numpy as np import h5py from zprocess import rich_print @@ -8,7 +9,8 @@ # from matplotlib.ticker import MaxNLocator # from matplotlib import pyplot as plt -from labscript_devices.KeysightScope.connection_manager import BLUE,GREEN,PURPLE +# from labscript_devices.KeysightScope.connection_manager import BLUE,GREEN,PURPLE +# ----------------------------------- Miscellaneous class KeysightScopeWorker(Worker): @@ -20,7 +22,7 @@ def init(self): # ----------------------------------------- Initialize osci global KeysightScope from .KeysightScope import KeysightScope - self.scope = KeysightScope( + self.scope = KeysightScopeDevice( address= self.address, verbose = False) @@ -33,7 +35,7 @@ def init(self): def transition_to_buffered( self, device_name, h5file , front_panel_values, refresh): - rich_print(f"====== Begin transition to Buffered: ======", color=BLUE) + rich_print(f"====== Begin transition to Buffered: ======", color='#66D9EF') self.h5file = h5file self.device_name = device_name @@ -75,11 +77,11 @@ def transition_to_buffered( self, device_name, h5file , front_panel_values, refr self.scope.single() - rich_print(f"====== End transition to Buffered: ======", color=BLUE) + rich_print(f"====== End transition to Buffered: ======", color='#66D9EF') return {} def transition_to_manual(self, abort = False): - rich_print(f"====== Begin transition to manual: ======", color=GREEN) + rich_print(f"====== Begin transition to manual: ======", color='#A6E22E') self.scope.unlock() # Unlocks The oscilloscope if (not self.buffered_mode) or (not self.triggered) or abort : # In case we didn't take a shot or we didn't trigger @@ -114,7 +116,7 @@ def transition_to_manual(self, abort = False): dset.attrs.update(self.current_configuration) #self.scope.set_acquire_state(True) # run on - rich_print(f"====== End transition to manual: ======", color=GREEN) + rich_print(f"====== End transition to manual: ======", color='#A6E22E') return True # ----------------------------------------- Aborting @@ -143,7 +145,7 @@ def check_remote_values(self): # ------------------------------------------ Blacs Tabs functions def shutdown(self): - rich_print(f"====== transition to manual: ======", color= PURPLE) + rich_print(f"====== transition to manual: ======", color= '#AE81FF') return self.scope.close() # ------------------------------------------ New diff --git a/labscript_devices/KeysightScope/connection_manager.py b/labscript_devices/KeysightScope/connection_manager.py deleted file mode 100644 index 4f82aadd..00000000 --- a/labscript_devices/KeysightScope/connection_manager.py +++ /dev/null @@ -1,144 +0,0 @@ -import os -import importlib -import pyvisa -from re import sub -from datetime import datetime - - -class connectionManager: - """ - This class manages the connection and initialization of supported Keysight oscilloscopes - using serial number or address for identifying and loading configuration files from the specified folder. - """ - - def __init__(self, - serial_number=None, - address = None, - folder_name="models" - ): - - # ----------------------------- Init - self.serial_number = serial_number - self.address = address - self.folder_name = folder_name - - # ----------------------------- List of the supported Keysight oscilloscopes - self.supported_models = ["EDUX1052A", "EDUX1052G", "DSOX1202A", "DSOX1202G", "DSOX1204A", "DSOX1204G"] - - # ----------------------------- Pyvisa ressources - self.rm = pyvisa.ResourceManager() - self.devs = self.rm.list_resources() - - # ----------------------------- Serial_number initialization - if self.serial_number is None: - raise ValueError("Serial number must be provided") - else: - self.current_file = self.pick_file_from_serial_number() # Dictionary containing all the module attributes - - if self.current_file is None: - raise ValueError(f"File with serial number {self.serial_number} not found.") - - self.osci_capabilities = self.current_file["osci_capabilities"] - - - def _get_files_from_folder(self): - """ Retrieves a list of all file paths in the specified folder (default is 'models') and returns their absolute paths. """ - file_path = os.path.abspath(__file__) # Absolute path of this file - containing_folder = os.path.dirname(file_path) # Absolute path of the containing folder - keysight_scope_dir = os.path.join(containing_folder, self.folder_name) # Absolute path to the desired folder (default is "models") - - # Check if the directory exists - if not os.path.exists(keysight_scope_dir): - raise FileNotFoundError(f"The folder '{self.folder_name}' does not exist in the KeysightScope directory.") - - # Get all file paths in the folder - files = [os.path.abspath(os.path.join(keysight_scope_dir, f)) for f in os.listdir(keysight_scope_dir) if os.path.isfile(os.path.join(keysight_scope_dir, f))] - return files - - def pick_file_from_serial_number(self, serial_number = None): - """ - Searches for a configuration file based on the provided serial number (or the object's serial number if not provided). - Loads the module and extracts its attributes, returning them as a dictionary. - Returns None if no file with the given serial number is found. - """ - if serial_number is None: - serial_number = self.serial_number - - files = self._get_files_from_folder() - - for file_path in files: - with open(file_path, 'r') as f: - content = f.read() - if serial_number in content: - module_name = os.path.basename(file_path)[:-3] - spec = importlib.util.spec_from_file_location(module_name, file_path) - module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) - - module_attributes = {} - for attribute_name in dir(module): - if not attribute_name.startswith('__'): - attribute_value = getattr(module, attribute_name) - module_attributes[attribute_name] = attribute_value - - return module_attributes - - return None - - def get_address_from_serial_number(self, serial_number = None): - """ - Identifies to the oscilloscope with the given serial number and supported model. - - Iterates through the available devices, checks if their model and serial number match the expected ones, - and returns the correct connection resource string for the oscilloscope. - - Returns: - str: The connection resource string for the oscilloscope. - - Raises: - ValueError: If no oscilloscope with the matching serial number or model is found. - """ - if serial_number is None: - serial_number = self.serial_number - - is_right_model= False - is_right_serial_number = False - - for idx, item in enumerate(self.devs): - try: - scope = self.rm.open_resource(self.devs[idx], timeout=500) # opens the device - osci_model = scope.query("*IDN?") # asks about the identity - - for supported_model in self.supported_models: # checks if it is a supported model - if supported_model in osci_model: - is_right_model= True - - # Check the serial number - scope_serial_number = sub(r'\s+', '', scope.query(":SERial?")) # gets the device serial number - is_right_serial_number = (scope_serial_number == serial_number) # checks the conformity between the given and the read serial number - - if is_right_serial_number and is_right_model: - return item - elif not is_right_model and is_right_serial_number: - raise ValueError(f"The device model {osci_model} is not supported. Supported models are EDUX1052A, EDUX1052G, DSOX1202A, DSOX1202G, DSOX1204A, DSOX1204G.") - except: - continue - - if not is_right_serial_number: - raise ValueError(f"No Device with the serial number {serial_number} was found. Please check connection") - - -# ----------------------------------- Miscellaneous - -BLUE = '#66D9EF' -PURPLE = '#AE81FF' -GREEN = '#A6E22E' -GREY = '#75715E' - -unit_conversion = { - 's' : 1 , - 'ns': 1e-9, # nanoseconds to seconds - 'us': 1e-6, # microseconds to seconds - 'ms': 1e-3 # milliseconds to seconds - } - diff --git a/labscript_devices/KeysightScope/labscript_devices.py b/labscript_devices/KeysightScope/labscript_devices.py index db67eeaa..12a5ee23 100644 --- a/labscript_devices/KeysightScope/labscript_devices.py +++ b/labscript_devices/KeysightScope/labscript_devices.py @@ -1,19 +1,20 @@ from labscript import TriggerableDevice, LabscriptError, set_passed_properties ,LabscriptError,set_passed_properties import h5py import time +from re import sub # ---------------------------------------------------------------New imports -from labscript_devices.KeysightScope.connection_manager import * +# from labscript_devices.KeysightScope.connection_manager import * -default_osci_capabilities = [ # Example: Keysight DSOX1202G - "serial_number" , # Serial number Must be given when initializing the Oscilloscope - "band_width" , # 70 MHz - "sampling_rate" , # 2GSa/s - "max_memory" , # 1Mpts - "max_update_rate" # 50,000 waveforms/second update rate. +# default_osci_capabilities = [ # Example: Keysight DSOX1202G +# "serial_number" , # Serial number Must be given when initializing the Oscilloscope +# "band_width" , # 70 MHz +# "sampling_rate" , # 2GSa/s +# "max_memory" , # 1Mpts +# "max_update_rate" # 50,000 waveforms/second update rate. -] +# ] class KeysightScope(TriggerableDevice): """ @@ -24,7 +25,7 @@ class KeysightScope(TriggerableDevice): @set_passed_properties( property_names = { - 'connection_table_properties': default_osci_capabilities, + # 'connection_table_properties': default_osci_capabilities, 'device_properties' : ["configuration_number","triggered", "timeout"] } ) @@ -38,13 +39,43 @@ def __init__(self, TriggerableDevice.__init__(self, name, parent_device, connection, **kwargs) # --------------------------------- Connection Manager - cm = connectionManager(serial_number) - self.BLACS_connection = cm.get_address_from_serial_number() - - # --------------------------------- Device capabilities - self.osci_capabilities = cm.osci_capabilities - for key,value in self.osci_capabilities.items(): - setattr(self,key,value) + # cm = connectionManager(serial_number) + # self.BLACS_connection = cm.get_address_from_serial_number() + + self.address = None + is_right_model= False + is_right_serial_number = False + + for idx, item in enumerate(self.devs): + try: + scope = self.rm.open_resource(self.devs[idx], timeout=500) # opens the device + osci_model = scope.query("*IDN?") # asks about the identity + + for supported_model in self.supported_models: # checks if it is a supported model + if supported_model in osci_model: + is_right_model= True + + # Check the serial number + scope_serial_number = sub(r'\s+', '', scope.query(":SERial?")) # gets the device serial number + is_right_serial_number = (scope_serial_number == serial_number) # checks the conformity between the given and the read serial number + + if is_right_serial_number and is_right_model: + self.address = item + elif not is_right_model and is_right_serial_number: + raise ValueError(f"The device model {osci_model} is not supported. Supported models are EDUX1052A, EDUX1052G, DSOX1202A, DSOX1202G, DSOX1204A, DSOX1204G.") + except: + continue + + if not is_right_serial_number: + raise ValueError(f"No Device with the serial number {serial_number} was found. Please check connection") + + + self.BLACS_connection = self.address + + # # --------------------------------- Device capabilities + # self.osci_capabilities = cm.osci_capabilities + # for key,value in self.osci_capabilities.items(): + # setattr(self,key,value) # --------------------------------- Class attributes self.name = name diff --git a/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py b/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py deleted file mode 100644 index 952ffc37..00000000 --- a/labscript_devices/KeysightScope/models/Keysight_dsox1202g.py +++ /dev/null @@ -1,18 +0,0 @@ -""" -Keysight DSOX1202G - -""" - - -# ----------------------------------- Keysight DSOX1202G -osci_capabilities = { - "serial_number" : "CN61364200", - "band_width" : 70e6, # 70 MHz - "sampling_rate" : 2*1e9, # 2GSa/s - "max_memory" : 1e6, # 1Mpts - "max_update_rate" : 5e4 # 50,000 waveforms/second update rate. -} - - - - From fd68288b67f31a3c57f1ef5f752070ee92407d5c Mon Sep 17 00:00:00 2001 From: Kerim Takouti Date: Tue, 27 May 2025 15:03:19 +0200 Subject: [PATCH 19/20] KeysightScope: Removed ConnectionManager class; integrated connection logic into LabscriptDevice Refactored connection logic: Removed the ConnectionManager class and implemented its core functionality directly in the LabscriptDevice class, enabling connection to the oscilloscope based on serial_number. Deprecated unused code: Removed oscilloscope capabilities since they are not currently in use. --- .../KeysightScope/KeysightScope.py | 4 +- labscript_devices/KeysightScope/blacs_tabs.py | 7 +-- .../KeysightScope/blacs_workers.py | 4 -- .../KeysightScope/labscript_devices.py | 57 ++++++------------- 4 files changed, 20 insertions(+), 52 deletions(-) diff --git a/labscript_devices/KeysightScope/KeysightScope.py b/labscript_devices/KeysightScope/KeysightScope.py index 4b66c899..f9433588 100644 --- a/labscript_devices/KeysightScope/KeysightScope.py +++ b/labscript_devices/KeysightScope/KeysightScope.py @@ -1,8 +1,6 @@ import pyvisa import numpy as np from labscript.labscript import LabscriptError -# from labscript_devices.KeysightScope.connection_manager import self.unit_conversion - class KeysightScopeDevice: @@ -639,7 +637,7 @@ def waveform(self, waveform_format="BYTE" ,channel='CHANnel1' ): raw = self.dev.query_binary_values( ':WAVeform:DATA?', datatype=datatype, # 'B' and 'H' are for unassigned , if you want signed use h and b - #is_big_endian=True, # In case we shift to signed + #is_big_endian=True, # In case we shift to signed container=np.array ) diff --git a/labscript_devices/KeysightScope/blacs_tabs.py b/labscript_devices/KeysightScope/blacs_tabs.py index 22b00ecf..41f6176a 100644 --- a/labscript_devices/KeysightScope/blacs_tabs.py +++ b/labscript_devices/KeysightScope/blacs_tabs.py @@ -10,12 +10,10 @@ from PyQt5.QtCore import QSize from PyQt5 import uic -""" -The device class handles the creation of the GUI + interaction GUI ~ QueueManager -""" class KeysightScopeTab(DeviceTab): + '''The device class handles the creation + interaction with the GUI ~ QueueManager''' def initialise_workers(self): # Here we can change the initialization properties in the connection table @@ -53,7 +51,6 @@ def initialise_GUI(self): self.default_button = self.osci_widget.findChild(QPushButton, f"defaultButton_{i}") self.default_button.clicked.connect(lambda clicked, i=i: self.default_config(i)) - # Loads the Osci Configurations self.init_osci() @@ -148,8 +145,6 @@ def __init__(self, parent=None): self.button_group.setId(radio_button, i ) radio_button.toggled.connect(self.radio_toggled ) - - # --- TableWidgets self.tableWidget = tab.findChild(QTableWidget, "tableWidget") self.tableWidget.setObjectName(f"table_{i}") diff --git a/labscript_devices/KeysightScope/blacs_workers.py b/labscript_devices/KeysightScope/blacs_workers.py index ed022de3..459df3d5 100644 --- a/labscript_devices/KeysightScope/blacs_workers.py +++ b/labscript_devices/KeysightScope/blacs_workers.py @@ -4,14 +4,10 @@ from zprocess import rich_print from blacs.tab_base_classes import Worker from labscript_utils import properties -import time # from matplotlib.ticker import MaxNLocator # from matplotlib import pyplot as plt -# from labscript_devices.KeysightScope.connection_manager import BLUE,GREEN,PURPLE -# ----------------------------------- Miscellaneous - class KeysightScopeWorker(Worker): """ diff --git a/labscript_devices/KeysightScope/labscript_devices.py b/labscript_devices/KeysightScope/labscript_devices.py index 12a5ee23..66c7ed44 100644 --- a/labscript_devices/KeysightScope/labscript_devices.py +++ b/labscript_devices/KeysightScope/labscript_devices.py @@ -1,20 +1,7 @@ from labscript import TriggerableDevice, LabscriptError, set_passed_properties ,LabscriptError,set_passed_properties -import h5py -import time from re import sub +from pyvisa import ResourceManager -# ---------------------------------------------------------------New imports -# from labscript_devices.KeysightScope.connection_manager import * - - -# default_osci_capabilities = [ # Example: Keysight DSOX1202G -# "serial_number" , # Serial number Must be given when initializing the Oscilloscope -# "band_width" , # 70 MHz -# "sampling_rate" , # 2GSa/s -# "max_memory" , # 1Mpts -# "max_update_rate" # 50,000 waveforms/second update rate. - -# ] class KeysightScope(TriggerableDevice): """ @@ -25,7 +12,6 @@ class KeysightScope(TriggerableDevice): @set_passed_properties( property_names = { - # 'connection_table_properties': default_osci_capabilities, 'device_properties' : ["configuration_number","triggered", "timeout"] } ) @@ -38,20 +24,28 @@ def __init__(self, **kwargs): TriggerableDevice.__init__(self, name, parent_device, connection, **kwargs) - # --------------------------------- Connection Manager - # cm = connectionManager(serial_number) - # self.BLACS_connection = cm.get_address_from_serial_number() + self.BLACS_connection = self.get_adress_from_serial_number(serial_number) + + # --------------------------------- Class attributes + self.name = name + self.timeout = timeout + self.triggered = False # Device can only be triggered zero or one time + self.configuration_number = None # Sets the configuraton slot + - self.address = None + def get_adress_from_serial_number(self,serial_number): + rm = ResourceManager() + devs = rm.list_resources() is_right_model= False is_right_serial_number = False + supported_models = ["EDUX1052A", "EDUX1052G" ,"DSOX1202A" , "DSOX1202G","DSOX1204A" , "DSOX1204G"] - for idx, item in enumerate(self.devs): + for idx, item in enumerate(devs): try: - scope = self.rm.open_resource(self.devs[idx], timeout=500) # opens the device + scope = rm.open_resource(devs[idx], timeout=500) # opens the device osci_model = scope.query("*IDN?") # asks about the identity - for supported_model in self.supported_models: # checks if it is a supported model + for supported_model in supported_models: # checks if it is a supported model if supported_model in osci_model: is_right_model= True @@ -59,8 +53,8 @@ def __init__(self, scope_serial_number = sub(r'\s+', '', scope.query(":SERial?")) # gets the device serial number is_right_serial_number = (scope_serial_number == serial_number) # checks the conformity between the given and the read serial number - if is_right_serial_number and is_right_model: - self.address = item + if is_right_serial_number and is_right_model: + return item elif not is_right_model and is_right_serial_number: raise ValueError(f"The device model {osci_model} is not supported. Supported models are EDUX1052A, EDUX1052G, DSOX1202A, DSOX1202G, DSOX1204A, DSOX1204G.") except: @@ -68,23 +62,8 @@ def __init__(self, if not is_right_serial_number: raise ValueError(f"No Device with the serial number {serial_number} was found. Please check connection") - - - self.BLACS_connection = self.address - - # # --------------------------------- Device capabilities - # self.osci_capabilities = cm.osci_capabilities - # for key,value in self.osci_capabilities.items(): - # setattr(self,key,value) - - # --------------------------------- Class attributes - self.name = name - self.timeout = timeout - self.triggered = False # Device can only be triggered zero or one time - self.configuration_number = None # Sets the configuraton slot - def set_config(self,configuration_number): """ Change the configuration of the oscilloscope to the specified configuration number. From ca6d093cf969c24ac5bce4e79a29ef6e46882b29 Mon Sep 17 00:00:00 2001 From: Kimu754 Date: Tue, 27 May 2025 22:30:19 +0200 Subject: [PATCH 20/20] updated README --- labscript_devices/KeysightScope/README.md | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/labscript_devices/KeysightScope/README.md b/labscript_devices/KeysightScope/README.md index 9349ebaa..9ffb8757 100644 --- a/labscript_devices/KeysightScope/README.md +++ b/labscript_devices/KeysightScope/README.md @@ -23,20 +23,6 @@ * **3** This zone gives an overview of the most important setting parameters for the currently selected (green highleted, not necessarly activated) tab. -# First settings for your Keysight oscilloscope - -1. In the file `Keysightscope/models/Keysight_dsox1202g`, you’ll find an example containing the dictionary: - * `osci_capabilities`: defines device-specific capabilities. - -2. To support your specific oscilloscope model: - * Copy this example file into the same folder. - * Edit the `osci_capabilities` dictionary to match your oscilloscope’s specifications. - -**--------- !!! Important !!! ---------** -1. The filename **must** begin with `"Keysight"` to be detected properly, - e.g., `Keysightscope/models/Keysight_dsox1202g` - -2. Do **not** rename the dictionary `osci_capabilities`. ## Example Script @@ -51,7 +37,7 @@ KeysightScope( ``` ### In the python experiment file -There are two main function to use in the experiment scipt: +There are two main functions to use in the experiment scipt: * `set_config( spot_index : int or string )` : The oscilloscope has ten different spots where it saves its global settings. set_config(spot_index) must be called at the beginning of the experiment script with the desired spot_index to initialize the oscilloscope with the corresponding configuration for the shot.

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 z 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%0A9_xk@sOI%c4KbE2>;CAfgQ>VACY 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%0DZ6y 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