From e49108ccea5f582e804545426714205819ec99c2 Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 11 Sep 2017 10:28:42 +0200 Subject: [PATCH 01/21] Add voltage range validation With no explicit voltage range validation, the instrument will silently do something not expected by the user. Breaking change: the keithley must now be initialised with a model name. --- .../tektronix/Keithley_2600.py | 35 ++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600.py b/qcodes/instrument_drivers/tektronix/Keithley_2600.py index 7b9128a5b10..719b3bf15e0 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600.py @@ -1,4 +1,5 @@ from qcodes import VisaInstrument +import qcodes.utils.validators as vals class Keithley_2600(VisaInstrument): @@ -15,8 +16,32 @@ class Keithley_2600(VisaInstrument): - add ramping and such stuff """ - def __init__(self, name, address, channel, **kwargs): + def __init__(self, name, address, channel, model=None, **kwargs): super().__init__(name, address, terminator='\n', **kwargs) + + if model is None: + raise ValueError('Please supply Keithley model name, e.g.' + '"2614B".') + knownmodels = ['2601B', '2602B', '2604B', '2611B', '2612B', + '2614B', '2635B', '2636B'] + if model not in knownmodels: + kmstring = ('{}, '*(len(knownmodels)-1)).format(*knownmodels[:-1]) + kmstring += 'and {}.'.format(knownmodels[-1]) + raise ValueError('Unknown model. Known model are: ' + + kmstring) + + self.model = model + + vranges = {'2601B': [0.1, 1, 6, 40], + '2602B': [0.1, 1, 6, 40], + '2604B': [0.1, 1, 6, 40], + '2611B': [0.2, 2, 20, 200], + '2612B': [0.2, 2, 20, 200], + '2614B': [0.2, 2, 20, 200], + '2635B': [0.2, 2, 20, 200], + '2636B': [0.2, 2, 20, 200] + } + self._channel = channel self.add_parameter('volt', @@ -41,14 +66,16 @@ def __init__(self, name, address, channel, **kwargs): get_parser=float, set_cmd='source.output={:d}', val_mapping={'on': 1, 'off': 0}) - # Source range + # volt range # needs get after set self.add_parameter('rangev', + label='voltage range', get_cmd='source.rangev', get_parser=float, set_cmd='source.rangev={:.4f}', - unit='V') - # Measure range + unit='V', + vals=vals.Enum(*vranges[self.model])) + # current range # needs get after set self.add_parameter('rangei', get_cmd='source.rangei', From a4c1a43aee2c3c01ecbd4117a78ef6f69beafcd4 Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 11 Sep 2017 13:17:54 +0200 Subject: [PATCH 02/21] Add hardcoded current ranges Nice to have. Breaking changes: voltage ranges and current ranges now have new parameter names. --- .../tektronix/Keithley_2600.py | 72 ++++++++++++++++--- 1 file changed, 62 insertions(+), 10 deletions(-) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600.py b/qcodes/instrument_drivers/tektronix/Keithley_2600.py index 719b3bf15e0..f35f89fc62a 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600.py @@ -4,19 +4,24 @@ class Keithley_2600(VisaInstrument): """ - channel: use channel 'a' or 'b' - This is the qcodes driver for the Keithley_2600 Source-Meter series, tested with Keithley_2614B Status: beta-version. TODO: - - Add all parameters that are in the manual - - range and limit should be set according to mode + - Make a channelised version for the two channels - add ramping and such stuff """ - def __init__(self, name, address, channel, model=None, **kwargs): + def __init__(self, name: str, address: str, channel: str, + model: str=None, **kwargs) -> None: + """ + Args: + name: Name to use internally in QCoDeS + address: VISA ressource address + channel: Either 'a' or 'b' + model: The model type, e.g. '2614B' + """ super().__init__(name, address, terminator='\n', **kwargs) if model is None: @@ -42,6 +47,27 @@ def __init__(self, name, address, channel, model=None, **kwargs): '2636B': [0.2, 2, 20, 200] } + # TODO: In pulsed mode, models 2611B, 2612B, and 2614B + # actually allow up to 10 A. + iranges = {'2601B': [100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 0.01, 0.1, 1, 3], + '2602B': [100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 0.01, 0.1, 1, 3], + '2604B': [100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 0.01, 0.1, 1, 3], + '2611B': [100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 0.01, 0.1, 1, 1.5], + '2612B': [100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 0.01, 0.1, 1, 1.5], + '2614B': [100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 0.01, 0.1, 1, 1.5], + '2634B': [1e-9, 10e-9, 100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 10e-6, 100e-3, 1, 1.5], + '2635B': [1e-9, 10e-9, 100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 10e-6, 100e-3, 1, 1.5], + '2636B': [1e-9, 10e-9, 100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 10e-6, 100e-3, 1, 1.5]} + self._channel = channel self.add_parameter('volt', @@ -66,22 +92,43 @@ def __init__(self, name, address, channel, model=None, **kwargs): get_parser=float, set_cmd='source.output={:d}', val_mapping={'on': 1, 'off': 0}) + self.add_parameter('nplc', + label='Number of power line cycles', + set_cmd='measure.nplc={:.4f}', + get_cmd='measure.nplc', + get_parser=float, + vals=vals.Numbers(0.001, 25)) # volt range - # needs get after set - self.add_parameter('rangev', - label='voltage range', + # needs get after set (WilliamHPNielsen): why? + self.add_parameter('sourcerange_v', + label='voltage source range', get_cmd='source.rangev', get_parser=float, set_cmd='source.rangev={:.4f}', unit='V', vals=vals.Enum(*vranges[self.model])) + self.add_parameter('measurerange_v', + label='voltage measure range', + get_cmd='measure.rangev', + set_cmd='measure.rangev={:.4f}', + unit='V', + vals=vals.Enum(*vranges[self.model])) # current range # needs get after set - self.add_parameter('rangei', + self.add_parameter('sourcerange_i', + label='current source range', get_cmd='source.rangei', get_parser=float, set_cmd='source.rangei={:.4f}', - unit='A') + unit='A', + vals=vals.Enum(*iranges[self.model])) + self.add_parameter('measurerange_i', + label='current measure range', + get_cmd='measure.rangei', + get_parser=float, + set_cmd='measure.rangei={:.4f}', + unit='A', + vals=vals.Enum(*iranges[self.model])) # Compliance limit self.add_parameter('limitv', get_cmd='source.limitv', @@ -107,7 +154,12 @@ def get_idn(self): return IDN def reset(self): + """ + Reset instrument to factory defaults + """ self.write('reset()') + # remember to update all the metadata + self.snapshot(update=True) def ask(self, cmd): return super().ask('print(smu{:s}.{:s})'.format(self._channel, cmd)) From b7ca781f84c29bbd401f14a637cf127e794a2562 Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 11 Sep 2017 16:56:09 +0200 Subject: [PATCH 03/21] add display control settings --- .../tektronix/Keithley_2600.py | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600.py b/qcodes/instrument_drivers/tektronix/Keithley_2600.py index f35f89fc62a..86f15055be8 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600.py @@ -86,7 +86,8 @@ def __init__(self, name: str, address: str, channel: str, get_cmd='source.func', get_parser=float, set_cmd='source.func={:d}', - val_mapping={'current': 0, 'voltage': 1}) + val_mapping={'current': 0, 'voltage': 1}, + docstring='Selects the output source.') self.add_parameter('output', get_cmd='source.output', get_parser=float, @@ -141,9 +142,16 @@ def __init__(self, name: str, address: str, channel: str, get_parser=float, set_cmd='source.limiti={:.4f}', unit='A') + # display + self.add_parameter('display_settext', + set_cmd=self._display_settext, + vals=vals.Strings()) self.connect_message() + def _display_settext(self, text): + self.visa_handle.write('display.settext("{}")'.format(text)) + def get_idn(self): IDN = self.ask_raw('*IDN?') vendor, model, serial, firmware = map(str.strip, IDN.split(',')) @@ -153,6 +161,19 @@ def get_idn(self): 'serial': serial, 'firmware': firmware} return IDN + def display_clear(self): + """ + This function clears the display, but also leaves it in user mode + """ + self.visa_handle.write('display.clear()') + + def display_normal(self): + """ + A bit of a hack to get the normal screen back after having used the + user mode: simple send an EXIT key press event + """ + self.visa_handle.write('display.sendkey(75)') + def reset(self): """ Reset instrument to factory defaults From d138f5b6dc8f61124403fee4ae2513a9ee762f9f Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 18 Sep 2017 10:55:09 +0200 Subject: [PATCH 04/21] update display_normal function --- qcodes/instrument_drivers/tektronix/Keithley_2600.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600.py b/qcodes/instrument_drivers/tektronix/Keithley_2600.py index 86f15055be8..22d7b991be6 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600.py @@ -123,6 +123,7 @@ def __init__(self, name: str, address: str, channel: str, set_cmd='source.rangei={:.4f}', unit='A', vals=vals.Enum(*iranges[self.model])) + self.add_parameter('measurerange_i', label='current measure range', get_cmd='measure.rangei', @@ -169,8 +170,14 @@ def display_clear(self): def display_normal(self): """ - A bit of a hack to get the normal screen back after having used the - user mode: simple send an EXIT key press event + Set the display to the default mode + """ + self.visa_handle.write('display.screen = SMUA_SMUB') + + def exit_key(self): + """ + Get back the normal screen after an error: + send an EXIT key press event """ self.visa_handle.write('display.sendkey(75)') From 129699f3b6f845f9e6daa77cb7e8a1dfdbe4ca35 Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 18 Sep 2017 13:22:08 +0200 Subject: [PATCH 05/21] correct normal display function --- .../tektronix/Keithley_2600.py | 24 +- .../tektronix/Keithley_2600_channels.py | 226 ++++++++++++++++++ 2 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600.py b/qcodes/instrument_drivers/tektronix/Keithley_2600.py index 22d7b991be6..faaac623360 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600.py @@ -1,7 +1,29 @@ from qcodes import VisaInstrument +from qcodes.instrument.channel import InstrumentChannel +from qcodes.instrument.base import Instrument import qcodes.utils.validators as vals +class KeithleyChannel(InstrumentChannel): + """ + Class to hold the two Keithley channels, i.e. + SMUA and SMUB. + """ + + def __init__(self, parent: Instrument, name: str, channel: str): + """ + Args: + parent: The Instrument instance to which the channel is + to be attached. + name: The 'colloquial' name of the channel + channel: The name used by the Keithley, i.e. either + 'smua' or 'smub' + """ + + super().__init__(parent, name) + + + class Keithley_2600(VisaInstrument): """ This is the qcodes driver for the Keithley_2600 Source-Meter series, @@ -172,7 +194,7 @@ def display_normal(self): """ Set the display to the default mode """ - self.visa_handle.write('display.screen = SMUA_SMUB') + self.visa_handle.write('display.screen = display.SMUA_SMUB') def exit_key(self): """ diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py new file mode 100644 index 00000000000..3ca69fe71ec --- /dev/null +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py @@ -0,0 +1,226 @@ +from qcodes import VisaInstrument +from qcodes.instrument.channel import InstrumentChannel +from qcodes.instrument.base import Instrument +import qcodes.utils.validators as vals + + +class KeithleyChannel(InstrumentChannel): + """ + Class to hold the two Keithley channels, i.e. + SMUA and SMUB. + """ + + def __init__(self, parent: Instrument, name: str, channel: str): + """ + Args: + parent: The Instrument instance to which the channel is + to be attached. + name: The 'colloquial' name of the channel + channel: The name used by the Keithley, i.e. either + 'smua' or 'smub' + """ + + super().__init__(parent, name) + self.model = self._parent.model + vranges = self._parent._vranges + iranges = self._parent._iranges + + self.add_parameter('volt', + get_cmd='measure.v()', + get_parser=float, + set_cmd='source.levelv={:.12f}', + label='Voltage', + unit='V') + self.add_parameter('curr', + get_cmd='measure.i()', + get_parser=float, + set_cmd='source.leveli={:.12f}', + label='Current', + unit='A') + self.add_parameter('mode', + get_cmd='source.func', + get_parser=float, + set_cmd='source.func={:d}', + val_mapping={'current': 0, 'voltage': 1}, + docstring='Selects the output source.') + self.add_parameter('output', + get_cmd='source.output', + get_parser=float, + set_cmd='source.output={:d}', + val_mapping={'on': 1, 'off': 0}) + self.add_parameter('nplc', + label='Number of power line cycles', + set_cmd='measure.nplc={:.4f}', + get_cmd='measure.nplc', + get_parser=float, + vals=vals.Numbers(0.001, 25)) + # volt range + # needs get after set (WilliamHPNielsen): why? + self.add_parameter('sourcerange_v', + label='voltage source range', + get_cmd='source.rangev', + get_parser=float, + set_cmd='source.rangev={:.4f}', + unit='V', + vals=vals.Enum(*vranges[self.model])) + self.add_parameter('measurerange_v', + label='voltage measure range', + get_cmd='measure.rangev', + set_cmd='measure.rangev={:.4f}', + unit='V', + vals=vals.Enum(*vranges[self.model])) + # current range + # needs get after set + self.add_parameter('sourcerange_i', + label='current source range', + get_cmd='source.rangei', + get_parser=float, + set_cmd='source.rangei={:.4f}', + unit='A', + vals=vals.Enum(*iranges[self.model])) + + self.add_parameter('measurerange_i', + label='current measure range', + get_cmd='measure.rangei', + get_parser=float, + set_cmd='measure.rangei={:.4f}', + unit='A', + vals=vals.Enum(*iranges[self.model])) + # Compliance limit + self.add_parameter('limitv', + get_cmd='source.limitv', + get_parser=float, + set_cmd='source.limitv={:.4f}', + unit='V') + # Compliance limit + self.add_parameter('limiti', + get_cmd='source.limiti', + get_parser=float, + set_cmd='source.limiti={:.4f}', + unit='A') + + def write(self, cmd): + """ + Prepend the channel name to all write commands. + """ + + return self._parent.write('{}.{}'.format(channel, cmd)) + + +class Keithley_2600(VisaInstrument): + """ + This is the qcodes driver for the Keithley_2600 Source-Meter series, + tested with Keithley_2614B + + Status: beta-version. + TODO: + - Make a channelised version for the two channels + - add ramping and such stuff + + """ + def __init__(self, name: str, address: str, + model: str=None, **kwargs) -> None: + """ + Args: + name: Name to use internally in QCoDeS + address: VISA ressource address + model: The model type, e.g. '2614B' + """ + super().__init__(name, address, terminator='\n', **kwargs) + + if model is None: + raise ValueError('Please supply Keithley model name, e.g.' + '"2614B".') + knownmodels = ['2601B', '2602B', '2604B', '2611B', '2612B', + '2614B', '2635B', '2636B'] + if model not in knownmodels: + kmstring = ('{}, '*(len(knownmodels)-1)).format(*knownmodels[:-1]) + kmstring += 'and {}.'.format(knownmodels[-1]) + raise ValueError('Unknown model. Known model are: ' + + kmstring) + + self.model = model + + self._vranges = {'2601B': [0.1, 1, 6, 40], + '2602B': [0.1, 1, 6, 40], + '2604B': [0.1, 1, 6, 40], + '2611B': [0.2, 2, 20, 200], + '2612B': [0.2, 2, 20, 200], + '2614B': [0.2, 2, 20, 200], + '2635B': [0.2, 2, 20, 200], + '2636B': [0.2, 2, 20, 200]} + + # TODO: In pulsed mode, models 2611B, 2612B, and 2614B + # actually allow up to 10 A. + self._iranges = {'2601B': [100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 0.01, 0.1, 1, 3], + '2602B': [100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 0.01, 0.1, 1, 3], + '2604B': [100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 0.01, 0.1, 1, 3], + '2611B': [100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 0.01, 0.1, 1, 1.5], + '2612B': [100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 0.01, 0.1, 1, 1.5], + '2614B': [100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 0.01, 0.1, 1, 1.5], + '2634B': [1e-9, 10e-9, 100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 10e-6, 100e-3, 1, 1.5], + '2635B': [1e-9, 10e-9, 100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 10e-6, 100e-3, 1, 1.5], + '2636B': [1e-9, 10e-9, 100e-9, 1e-6, 10e-6, 100e-6, + 1e-3, 10e-6, 100e-3, 1, 1.5]} + + self._channel = channel + + # display + self.add_parameter('display_settext', + set_cmd=self._display_settext, + vals=vals.Strings()) + + self.connect_message() + + def _display_settext(self, text): + self.visa_handle.write('display.settext("{}")'.format(text)) + + def get_idn(self): + IDN = self.ask_raw('*IDN?') + vendor, model, serial, firmware = map(str.strip, IDN.split(',')) + model = model[6:] + + IDN = {'vendor': vendor, 'model': model, + 'serial': serial, 'firmware': firmware} + return IDN + + def display_clear(self): + """ + This function clears the display, but also leaves it in user mode + """ + self.visa_handle.write('display.clear()') + + def display_normal(self): + """ + Set the display to the default mode + """ + self.visa_handle.write('display.screen = SMUA_SMUB') + + def exit_key(self): + """ + Get back the normal screen after an error: + send an EXIT key press event + """ + self.visa_handle.write('display.sendkey(75)') + + def reset(self): + """ + Reset instrument to factory defaults + """ + self.write('reset()') + # remember to update all the metadata + self.snapshot(update=True) + + def ask(self, cmd): + return super().ask('print(smu{:s}.{:s})'.format(self._channel, cmd)) + + def write(self, cmd): + super().write('smu{:s}.{:s}'.format(self._channel, cmd)) From af599cbc3919f3107e5dc445dc943e242f59a625 Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 18 Sep 2017 15:22:11 +0200 Subject: [PATCH 06/21] Add ArrayParameter to hold the sweep --- .../QDev/_qdacdrivertodolist | 14 ++ .../tektronix/Keithley_2600_channels.py | 175 ++++++++++++++---- 2 files changed, 154 insertions(+), 35 deletions(-) create mode 100644 qcodes/instrument_drivers/QDev/_qdacdrivertodolist diff --git a/qcodes/instrument_drivers/QDev/_qdacdrivertodolist b/qcodes/instrument_drivers/QDev/_qdacdrivertodolist new file mode 100644 index 00000000000..8b3949510e2 --- /dev/null +++ b/qcodes/instrument_drivers/QDev/_qdacdrivertodolist @@ -0,0 +1,14 @@ + +The instrument inherits from VisaInstrument (is this clever?), which implicitly assumes the instrument +to speak SCPI. + +Okay, so, *IDN? is a VISA string? And even Instrument assumes this... + +*IDN? is specified already in IEEE 488.2 + +This leads to broken functions in the API, unless we override all inherited SCPI-dependent +functions. + +* Get a list of all VisaInstrument methods + +* Override what we need. \ No newline at end of file diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py index 3ca69fe71ec..e4f89cc4d86 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py @@ -1,9 +1,79 @@ +import logging +import struct +import numpy as np + from qcodes import VisaInstrument -from qcodes.instrument.channel import InstrumentChannel +from qcodes.instrument.channel import InstrumentChannel, ChannelList from qcodes.instrument.base import Instrument import qcodes.utils.validators as vals +log = logging.getLogger(__name__) + + +class LuaSweepParameter(ArrayParameter): + """ + Parameter class to hold the data from a + deployed Lua script sweep. + """ + + def __init__(self, name: str, instrument: Instrument) -> None: + + super().__init__(name=name, + shape=(1,), + docstring='Holds a sweep') + + self._instrument = instrument + + def prepareSweep(self, start: float, stop: float, steps: int, + mode: str) -> None: + """ + Builds setpoints and labels + + Args: + start: Starting point of the sweep + stop: Endpoint of the sweep + steps: No. of sweep steps + mode: Type of sweep, either 'IV' (voltage sweep) + or 'VI' (current sweep) + """ + + if mode not in ['IV', 'VI']: + raise ValueError('mode must be either "VI" or "IV"') + + self.shape = (steps,) + + if mode == 'IV': + self.unit = 'A' + self.setpoint_names = ('Voltage',) + self.setpoint_units = ('V',) + self.label = 'current' + self.name = 'iv_sweep' + + if mode == 'VI': + self.unit = 'V' + self.setpoint_names = ('Current',) + self.setpoint_units = ('A',) + self.label = 'voltage' + self.name = 'vi_sweep' + + self.setpoints = (tuple(np.linspace(start, stop, steps)),) + + self.start = start + self.stop = stop + self.steps = steps + self.mode = mode + + def get(self) -> np.ndarray: + + data = self._instrument._fast_sweep(self.start, + self.stop, + self.steps, + self.mode) + + return data + + class KeithleyChannel(InstrumentChannel): """ Class to hold the two Keithley channels, i.e. @@ -20,91 +90,114 @@ def __init__(self, parent: Instrument, name: str, channel: str): 'smua' or 'smub' """ + if channel not in ['smua', 'smub']: + raise ValueError('channel must be either "smub" or "smua"') + super().__init__(parent, name) self.model = self._parent.model vranges = self._parent._vranges iranges = self._parent._iranges self.add_parameter('volt', - get_cmd='measure.v()', + get_cmd='{}.measure.v()'.format(channel), get_parser=float, - set_cmd='source.levelv={:.12f}', + set_cmd='{}.source.levelv={}'.format(channel, + '{:.12f}'), label='Voltage', unit='V') + self.add_parameter('curr', - get_cmd='measure.i()', + get_cmd='{}.measure.i()'.format(channel), get_parser=float, - set_cmd='source.leveli={:.12f}', + set_cmd='{}.source.leveli={}'.format(channel, + '{:.12f}'), label='Current', unit='A') + self.add_parameter('mode', - get_cmd='source.func', + get_cmd='{}.source.func'.format(channel), get_parser=float, - set_cmd='source.func={:d}', + set_cmd='{}.source.func={}'.format(channel, '{:d}'), val_mapping={'current': 0, 'voltage': 1}, docstring='Selects the output source.') + self.add_parameter('output', - get_cmd='source.output', + get_cmd='{}.source.output'.format(channel), get_parser=float, - set_cmd='source.output={:d}', + set_cmd='{}.source.output={}'.format(channel, + '{:d}'), val_mapping={'on': 1, 'off': 0}) + self.add_parameter('nplc', label='Number of power line cycles', - set_cmd='measure.nplc={:.4f}', - get_cmd='measure.nplc', + set_cmd='{}.measure.nplc={}'.format(channel, + '{:.4f}'), + get_cmd='{}.measure.nplc'.format(channel), get_parser=float, vals=vals.Numbers(0.001, 25)) # volt range # needs get after set (WilliamHPNielsen): why? self.add_parameter('sourcerange_v', label='voltage source range', - get_cmd='source.rangev', + get_cmd='{}.source.rangev'.format(channel), get_parser=float, - set_cmd='source.rangev={:.4f}', + set_cmd='{}.source.rangev={}'.format(channel, + '{:.4f}'), unit='V', vals=vals.Enum(*vranges[self.model])) self.add_parameter('measurerange_v', label='voltage measure range', - get_cmd='measure.rangev', - set_cmd='measure.rangev={:.4f}', + get_cmd='{}.measure.rangev'.format(channel), + set_cmd='{}.measure.rangev={}'.format(channel, + '{:.4f}'), unit='V', vals=vals.Enum(*vranges[self.model])) # current range # needs get after set self.add_parameter('sourcerange_i', label='current source range', - get_cmd='source.rangei', + get_cmd='{}.source.rangei'.format(channel), get_parser=float, - set_cmd='source.rangei={:.4f}', + set_cmd='{}.source.rangei={}'.format(channel, + '{:.4f}'), unit='A', vals=vals.Enum(*iranges[self.model])) self.add_parameter('measurerange_i', label='current measure range', - get_cmd='measure.rangei', + get_cmd='{}.measure.rangei'.format(channel), get_parser=float, - set_cmd='measure.rangei={:.4f}', + set_cmd='{}.measure.rangei={}'.format(channel, + '{:.4f}'), unit='A', vals=vals.Enum(*iranges[self.model])) # Compliance limit self.add_parameter('limitv', - get_cmd='source.limitv', + get_cmd='{}.source.limitv'.format(channel), get_parser=float, - set_cmd='source.limitv={:.4f}', + set_cmd='{}.source.limitv={}'.format(channel, + '{:.4f}'), unit='V') # Compliance limit self.add_parameter('limiti', - get_cmd='source.limiti', + get_cmd='{}.source.limiti'.format(channel), get_parser=float, - set_cmd='source.limiti={:.4f}', + set_cmd='{}.source.limiti={}'.format(channel, + '{:.4f}'), unit='A') - def write(self, cmd): - """ - Prepend the channel name to all write commands. - """ + self.channel = channel - return self._parent.write('{}.{}'.format(channel, cmd)) + def reset(self): + """ + Reset instrument to factory defaults. + This resets only the relevant channel. + """ + self.write('{}.reset()'.format(self.channel)) + # remember to update all the metadata + log.debug('Reset channel {}.'.format(self.channel) + + 'Updating settings...') + self.snapshot(update=True) class Keithley_2600(VisaInstrument): @@ -171,7 +264,16 @@ def __init__(self, name: str, address: str, '2636B': [1e-9, 10e-9, 100e-9, 1e-6, 10e-6, 100e-6, 1e-3, 10e-6, 100e-3, 1, 1.5]} - self._channel = channel + # Add the channel to the instrument + channels = ChannelList(self, "Channels", KeithleyChannel, + snapshotable=False) + for ch in ['a', 'b']: + ch_name = 'smu{}'.format(ch) + channel = KeithleyChannel(self, ch_name, ch_name) + channels.append(channel) + self.add_submodule(ch_name, channel) + channels.lock() + self.add_submodule("channels", channels) # display self.add_parameter('display_settext', @@ -202,7 +304,7 @@ def display_normal(self): """ Set the display to the default mode """ - self.visa_handle.write('display.screen = SMUA_SMUB') + self.visa_handle.write('display.screen = display.SMUA_SMUB') def exit_key(self): """ @@ -213,14 +315,17 @@ def exit_key(self): def reset(self): """ - Reset instrument to factory defaults + Reset instrument to factory defaults. + This resets both channels. """ self.write('reset()') # remember to update all the metadata + log.debug('Reset instrument. Re-querying settings...') self.snapshot(update=True) def ask(self, cmd): - return super().ask('print(smu{:s}.{:s})'.format(self._channel, cmd)) - - def write(self, cmd): - super().write('smu{:s}.{:s}'.format(self._channel, cmd)) + """ + Override of normal ask. This is important, since queries to the + instrument must be wrapped in 'print()' + """ + return super().ask('print({:s})'.format(cmd)) From 925d18b1f362f52f4369ca0915ee3c1686a8282b Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 18 Sep 2017 15:23:50 +0200 Subject: [PATCH 07/21] Add scriptwrapper helper function --- .../tektronix/Keithley_2600_channels.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py index e4f89cc4d86..ceec3f57562 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py @@ -323,9 +323,25 @@ def reset(self): log.debug('Reset instrument. Re-querying settings...') self.snapshot(update=True) - def ask(self, cmd): + def ask(self, cmd: str) -> str: """ Override of normal ask. This is important, since queries to the instrument must be wrapped in 'print()' """ return super().ask('print({:s})'.format(cmd)) + + def _scriptwrapper(program: List[str], debug: bool=False) -> str: + """ + wraps a program so that the output can be put into + visa_handle.write and run. + The script will run immediately as an anonymous script. + + Args: + program: A list of program instructions. One line per + list item, e.g. ['for ii = 1, 10 do', 'print(ii)', 'end' ] + """ + mainprog = '\r\n'.join(program) + '\r\n' + wrapped = 'loadandrunscript\r\n{}endscript\n'.format(mainprog) + if debug: + print(wrapped) + return wrapped From 0498527973a390ccaa7aaaccd14bf24d4c35d0f2 Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 18 Sep 2017 15:25:55 +0200 Subject: [PATCH 08/21] squash! Add scriptwrapper helper function --- .../tektronix/Keithley_2600_channels.py | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py index ceec3f57562..3db2912cca5 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py @@ -1,10 +1,12 @@ import logging import struct import numpy as np +from typing import List from qcodes import VisaInstrument from qcodes.instrument.channel import InstrumentChannel, ChannelList from qcodes.instrument.base import Instrument +from qcodes.instrument.parameter import ArrayParameter import qcodes.utils.validators as vals @@ -331,17 +333,17 @@ def ask(self, cmd: str) -> str: return super().ask('print({:s})'.format(cmd)) def _scriptwrapper(program: List[str], debug: bool=False) -> str: - """ - wraps a program so that the output can be put into - visa_handle.write and run. - The script will run immediately as an anonymous script. + """ + wraps a program so that the output can be put into + visa_handle.write and run. + The script will run immediately as an anonymous script. - Args: - program: A list of program instructions. One line per - list item, e.g. ['for ii = 1, 10 do', 'print(ii)', 'end' ] - """ - mainprog = '\r\n'.join(program) + '\r\n' - wrapped = 'loadandrunscript\r\n{}endscript\n'.format(mainprog) - if debug: - print(wrapped) - return wrapped + Args: + program: A list of program instructions. One line per + list item, e.g. ['for ii = 1, 10 do', 'print(ii)', 'end' ] + """ + mainprog = '\r\n'.join(program) + '\r\n' + wrapped = 'loadandrunscript\r\n{}endscript\n'.format(mainprog) + if debug: + log.debug(wrapped) + return wrapped From 843b4b3b0004cfd3ade2d5cdc693d05109d7de6d Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 18 Sep 2017 15:36:25 +0200 Subject: [PATCH 09/21] Add fast sweep function to instrument channel --- .../tektronix/Keithley_2600_channels.py | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py index 3db2912cca5..f490726c42e 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py @@ -201,6 +201,86 @@ def reset(self): 'Updating settings...') self.snapshot(update=True) + def _fast_sweep(self, start: float, stop: float, steps: int, + mode: str='IV') -> np.ndarray: + """ + Perform a fast sweep using a deployed Lua script. + This is the engine that forms the script, uploads it, + runs it, collects the data, and casts the data correctly. + + Args: + start: starting voltage + stop: end voltage + steps: number of steps + mode: What kind of sweep to make. + 'IV' (I versus V) or 'VI' (V versus I) + """ + + channel = self.channel + + # an extra visa query, a necessary precaution + # to avoid timing out when waiting for long + # measurements + nplc = self.nplc() + + dV = (stop-start)/(steps-1) + + if mode == 'IV': + meas = 'i' + sour = 'v' + func = '1' + + if mode == 'VI': + meas = 'v' + sour = 'i' + func = '0' + + script = ['{}.measure.nplc = {:.12f}'.format(channel, nplc), + '{}.source.output = 1'.format(channel), + 'startX = {:.12f}'.format(start), + 'dX = {:.12f}'.format(dV), + '{}.source.output = 1'.format(channel), + '{}.source.func = {}'.format(channel, func), + '{}.measure.count = 1'.format(channel), + '{}.nvbuffer1.clear()'.format(channel), + '{}.nvbuffer1.appendmode = 1'.format(channel), + 'for index = 1, {} do'.format(steps), + ' target = startX + (index-1)*dX', + ' {}.source.level{} = target'.format(channel, sour), + ' {}.measure.{}({}.nvbuffer1)'.format(channel, meas, + channel), + 'end', + 'format.data = format.REAL32', + 'format.byteorder = format.LITTLEENDIAN', + 'printbuffer(1, {}, {}.nvbuffer1.readings)'.format(steps, + channel)] + self.write(self.parent._scriptwrapper(script, debug=False)) + # we must wait for the script to execute + oldtimeout = self._parent.visa_handle.timeout + self.parent.visa_handle.timeout = 2*1000*steps*nplc/50 + 5000 + + # now poll all the data + # The problem is that a '\n' character might by chance be present in + # the data + fullsize = 4*steps + 3 + received = 0 + data = b'' + while received < fullsize: + data_temp = self.parent.visa_handle.read_raw() + received += len(data_temp) + data += data_temp + + # From the manual p. 7-94, we know that a b'#0' is prepended + # to the data and a b'\n' is appended + data = data[2:-1] + + outdata = np.array(list(struct.iter_unpack(' Date: Mon, 18 Sep 2017 15:40:28 +0200 Subject: [PATCH 10/21] Add the sweep parameter and a user-level method to use it --- .../tektronix/Keithley_2600_channels.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py index f490726c42e..f9f1949803a 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py @@ -188,6 +188,10 @@ def __init__(self, parent: Instrument, name: str, channel: str): '{:.4f}'), unit='A') + self.add_parameter('fastsweep', + parameter_class=LuaSweepParameter) + + self.channel = channel def reset(self): @@ -201,6 +205,26 @@ def reset(self): 'Updating settings...') self.snapshot(update=True) + def doFastSweep(self, start: float, stop: float, + steps: int, mode: str) -> DataSet: + """ + Perform a fast sweep using a deployed lua script and + return a QCoDeS DataSet with the sweep. + + Args: + start: starting voltage + stop: end voltage + steps: number of steps + mode: What kind of sweep to make. + 'IV' (I versus V) or 'VI' (V versus I) + """ + # prepare setpoints, units, name + self.fastsweep.prepareSweep(start, stop, steps, mode) + + data = qc.Measure(self.fastsweep).run() + + return data + def _fast_sweep(self, start: float, stop: float, steps: int, mode: str='IV') -> np.ndarray: """ From d44bd40bb7e1f1f8a8a3bc4b280f110b79891aa8 Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 18 Sep 2017 16:01:42 +0200 Subject: [PATCH 11/21] fix small things, add imports --- .../tektronix/Keithley_2600_channels.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py index f9f1949803a..2bb6d53781a 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py @@ -3,7 +3,8 @@ import numpy as np from typing import List -from qcodes import VisaInstrument +import qcodes as qc +from qcodes import VisaInstrument, DataSet from qcodes.instrument.channel import InstrumentChannel, ChannelList from qcodes.instrument.base import Instrument from qcodes.instrument.parameter import ArrayParameter @@ -82,7 +83,7 @@ class KeithleyChannel(InstrumentChannel): SMUA and SMUB. """ - def __init__(self, parent: Instrument, name: str, channel: str): + def __init__(self, parent: Instrument, name: str, channel: str) -> None: """ Args: parent: The Instrument instance to which the channel is @@ -191,7 +192,6 @@ def __init__(self, parent: Instrument, name: str, channel: str): self.add_parameter('fastsweep', parameter_class=LuaSweepParameter) - self.channel = channel def reset(self): @@ -278,10 +278,11 @@ def _fast_sweep(self, start: float, stop: float, steps: int, 'format.byteorder = format.LITTLEENDIAN', 'printbuffer(1, {}, {}.nvbuffer1.readings)'.format(steps, channel)] - self.write(self.parent._scriptwrapper(script, debug=False)) + + self.write(self._parent._scriptwrapper(program=script, debug=True)) # we must wait for the script to execute oldtimeout = self._parent.visa_handle.timeout - self.parent.visa_handle.timeout = 2*1000*steps*nplc/50 + 5000 + self._parent.visa_handle.timeout = 2*1000*steps*nplc/50 + 5000 # now poll all the data # The problem is that a '\n' character might by chance be present in @@ -290,7 +291,7 @@ def _fast_sweep(self, start: float, stop: float, steps: int, received = 0 data = b'' while received < fullsize: - data_temp = self.parent.visa_handle.read_raw() + data_temp = self._parent.visa_handle.read_raw() received += len(data_temp) data += data_temp @@ -301,7 +302,7 @@ def _fast_sweep(self, start: float, stop: float, steps: int, outdata = np.array(list(struct.iter_unpack(' str: """ return super().ask('print({:s})'.format(cmd)) + @staticmethod def _scriptwrapper(program: List[str], debug: bool=False) -> str: """ wraps a program so that the output can be put into @@ -449,5 +451,6 @@ def _scriptwrapper(program: List[str], debug: bool=False) -> str: mainprog = '\r\n'.join(program) + '\r\n' wrapped = 'loadandrunscript\r\n{}endscript\n'.format(mainprog) if debug: + log.debug('Wrapped the following script:') log.debug(wrapped) return wrapped From 34609c5ee94c47434a06cff7c13ed073a70ce7bc Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 18 Sep 2017 16:48:25 +0200 Subject: [PATCH 12/21] Fix: don't update the sweep parameter upon reset --- .../tektronix/Keithley_2600_channels.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py index 2bb6d53781a..20deb96e436 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py @@ -1,7 +1,7 @@ import logging import struct import numpy as np -from typing import List +from typing import List, Dict import qcodes as qc from qcodes import VisaInstrument, DataSet @@ -194,6 +194,12 @@ def __init__(self, parent: Instrument, name: str, channel: str) -> None: self.channel = channel + # We need to avoid updating the sweep parameter + def snapshot_base(self, update: bool=False) -> Dict: + params_to_skip_update = ['fastsweep'] + super().snapshot_base(update=update, + params_to_skip_update=params_to_skip_update) + def reset(self): """ Reset instrument to factory defaults. From 22e42b2180557f2dfbd91f305c8ae666496a4755 Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 18 Sep 2017 17:02:21 +0200 Subject: [PATCH 13/21] Add benchmarking notebook --- ...thley 2600 lua script versus set-get.ipynb | 1206 +++++++++++++++++ 1 file changed, 1206 insertions(+) create mode 100644 docs/examples/benchmarking/Benchmark of Keithley 2600 lua script versus set-get.ipynb diff --git a/docs/examples/benchmarking/Benchmark of Keithley 2600 lua script versus set-get.ipynb b/docs/examples/benchmarking/Benchmark of Keithley 2600 lua script versus set-get.ipynb new file mode 100644 index 00000000000..8940ad1f467 --- /dev/null +++ b/docs/examples/benchmarking/Benchmark of Keithley 2600 lua script versus set-get.ipynb @@ -0,0 +1,1206 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Benchmark\n", + "\n", + "Below we use two methods of the Keithley 2600 to make an IV-curve.\n", + "Plugged into the terminal is a 5 MOhm resistor. The voltage is swept from 1 V to 10 V.\n", + "\n", + "The two methods are normal \"naive\" QCoDeS set-get and deployed script mode. \n", + "In the former mode, a `set` command is send for each voltage set point and a `get` command is sent for each current value to be measured. In the latter mode, a Lua script is formed and uploaded to the SourceMeter. The script then runs locally on the machine and all data is polled in one go (in a binary format).\n", + "\n", + "## Results\n", + "\n", + "#### NPLC = 0.5 (10 ms ap. time), N = 100\n", + "\n", + "Set-get: 1.29 s\n", + "\n", + "Script: 1.08 s\n", + "\n", + "#### NPLC = 0.5 (10 ms ap. time), N = 1000\n", + "\n", + "Set-get: 12.6 s\n", + "\n", + "Script: 10.5 s\n", + "\n", + "#### NPLC = 0.05 (1ms ap. time), N = 100\n", + "\n", + "Set-get: 370 ms\n", + "\n", + "Script: 182 ms\n", + "\n", + "#### NPLC = 0.05 (1ms ap. time), N = 1000\n", + "\n", + "Set-get: 3.38 s\n", + "\n", + "Script: 1.44 s\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imports and initialisation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import qcodes as qc\n", + "from qcodes.instrument.base import Instrument\n", + "from qcodes.instrument_drivers.tektronix.Keithley_2600 import Keithley_2600\n", + "from qcodes.instrument_drivers.tektronix.Keithley_2600_channels import Keithley_2600 as Keithley_2600_channels\n", + "from typing import List\n", + "from qcodes import DataSet\n", + "from qcodes.instrument.parameter import ArrayParameter\n", + "import struct" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "% matplotlib notebook\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Connected to: Keithley Instruments Inc. 2614B (serial:4084407, firmware:3.2.1) in 0.15s\n" + ] + } + ], + "source": [ + "keith = Keithley_2600_channels('keith', 'TCPIP0::192.168.15.116::inst0::INSTR', model='2614B')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NPLC = 0.5, N = 100" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Preparation for a simple I-V curve with a 5 MOhm resistor\n", + "\n", + "keith.smua.reset()\n", + "keith.smua.nplc(0.5)\n", + "keith.smua.mode('voltage')\n", + "keith.smua.sourcerange_v(20)\n", + "keith.smua.measurerange_i(100e-6)\n", + "keith.smua.output('on')\n", + "\n", + "N = 100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SET-GET" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Started at 2017-09-18 16:49:59\n", + "DataSet:\n", + " location = 'data/2017-09-18/#076_N_100_setget_16-49-59'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:50:00\n", + "Started at 2017-09-18 16:50:00\n", + "DataSet:\n", + " location = 'data/2017-09-18/#077_N_100_setget_16-50-00'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:50:02\n", + "Started at 2017-09-18 16:50:02\n", + "DataSet:\n", + " location = 'data/2017-09-18/#078_N_100_setget_16-50-02'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:50:03\n", + "Started at 2017-09-18 16:50:03\n", + "DataSet:\n", + " location = 'data/2017-09-18/#079_N_100_setget_16-50-03'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:50:04\n", + "Started at 2017-09-18 16:50:04\n", + "DataSet:\n", + " location = 'data/2017-09-18/#080_N_100_setget_16-50-04'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:50:05\n", + "Started at 2017-09-18 16:50:05\n", + "DataSet:\n", + " location = 'data/2017-09-18/#081_N_100_setget_16-50-05'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:50:07\n", + "Started at 2017-09-18 16:50:07\n", + "DataSet:\n", + " location = 'data/2017-09-18/#082_N_100_setget_16-50-07'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:50:08\n", + "Started at 2017-09-18 16:50:08\n", + "DataSet:\n", + " location = 'data/2017-09-18/#083_N_100_setget_16-50-08'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:50:09\n", + "1.29 s ± 15.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "\n", + "loop = qc.Loop(keith.smua.volt.sweep(1, 10, num=N)).each(keith.smua.curr)\n", + "data = loop.get_data_set(name='N_{}_setget'.format(N))\n", + "_ = loop.run() # run the loop" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SCRIPT" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataSet:\n", + " location = 'data/2017-09-18/#084_{name}_16-50-18'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:50:19\n", + "DataSet:\n", + " location = 'data/2017-09-18/#085_{name}_16-50-19'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:50:20\n", + "DataSet:\n", + " location = 'data/2017-09-18/#086_{name}_16-50-20'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:50:21\n", + "DataSet:\n", + " location = 'data/2017-09-18/#087_{name}_16-50-21'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:50:22\n", + "DataSet:\n", + " location = 'data/2017-09-18/#088_{name}_16-50-22'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:50:23\n", + "DataSet:\n", + " location = 'data/2017-09-18/#089_{name}_16-50-23'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:50:24\n", + "DataSet:\n", + " location = 'data/2017-09-18/#090_{name}_16-50-24'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:50:26\n", + "DataSet:\n", + " location = 'data/2017-09-18/#091_{name}_16-50-26'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:50:27\n", + "1.08 s ± 4.67 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "\n", + "data = keith.smua.doFastSweep(1, 10, N, mode='IV')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NPLC = 0.5, N = 1000" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Preparation for a simple I-V curve with a 5 MOhm resistor\n", + "\n", + "keith.smua.reset()\n", + "keith.smua.nplc(0.5)\n", + "keith.smua.mode('voltage')\n", + "keith.smua.sourcerange_v(20)\n", + "keith.smua.measurerange_i(100e-6)\n", + "keith.smua.output('on')\n", + "\n", + "N = 1000" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SET-GET" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Started at 2017-09-18 16:51:20\n", + "DataSet:\n", + " location = 'data/2017-09-18/#092_N_1000_setget_16-51-20'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:51:32\n", + "Started at 2017-09-18 16:51:32\n", + "DataSet:\n", + " location = 'data/2017-09-18/#093_N_1000_setget_16-51-32'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:51:45\n", + "Started at 2017-09-18 16:51:45\n", + "DataSet:\n", + " location = 'data/2017-09-18/#094_N_1000_setget_16-51-45'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:51:58\n", + "Started at 2017-09-18 16:51:58\n", + "DataSet:\n", + " location = 'data/2017-09-18/#095_N_1000_setget_16-51-58'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:52:10\n", + "Started at 2017-09-18 16:52:10\n", + "DataSet:\n", + " location = 'data/2017-09-18/#096_N_1000_setget_16-52-10'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:52:23\n", + "Started at 2017-09-18 16:52:23\n", + "DataSet:\n", + " location = 'data/2017-09-18/#097_N_1000_setget_16-52-23'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:52:35\n", + "Started at 2017-09-18 16:52:35\n", + "DataSet:\n", + " location = 'data/2017-09-18/#098_N_1000_setget_16-52-35'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:52:48\n", + "Started at 2017-09-18 16:52:48\n", + "DataSet:\n", + " location = 'data/2017-09-18/#099_N_1000_setget_16-52-48'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:53:00\n", + "12.6 s ± 21.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "\n", + "loop = qc.Loop(keith.smua.volt.sweep(1, 10, num=N)).each(keith.smua.curr)\n", + "data = loop.get_data_set(name='N_{}_setget'.format(N))\n", + "_ = loop.run() # run the loop" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SCRIPT" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataSet:\n", + " location = 'data/2017-09-18/#100_{name}_16-53-14'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:53:24\n", + "DataSet:\n", + " location = 'data/2017-09-18/#101_{name}_16-53-24'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:53:35\n", + "DataSet:\n", + " location = 'data/2017-09-18/#102_{name}_16-53-35'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:53:45\n", + "DataSet:\n", + " location = 'data/2017-09-18/#103_{name}_16-53-45'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:53:56\n", + "DataSet:\n", + " location = 'data/2017-09-18/#104_{name}_16-53-56'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:54:06\n", + "DataSet:\n", + " location = 'data/2017-09-18/#105_{name}_16-54-06'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:54:17\n", + "DataSet:\n", + " location = 'data/2017-09-18/#106_{name}_16-54-17'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:54:27\n", + "DataSet:\n", + " location = 'data/2017-09-18/#107_{name}_16-54-27'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:54:38\n", + "10.5 s ± 12.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "\n", + "data = keith.smua.doFastSweep(1, 10, N, mode='IV')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Preparation for a simple I-V curve with a 5 MOhm resistor\n", + "\n", + "keith.smua.reset()\n", + "keith.smua.nplc(0.05)\n", + "keith.smua.mode('voltage')\n", + "keith.smua.sourcerange_v(20)\n", + "keith.smua.measurerange_i(100e-6)\n", + "keith.smua.output('on')\n", + "\n", + "N = 100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SET-GET" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Started at 2017-09-18 16:56:13\n", + "DataSet:\n", + " location = 'data/2017-09-18/#108_N_100_setget_16-56-13'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:56:14\n", + "Started at 2017-09-18 16:56:14\n", + "DataSet:\n", + " location = 'data/2017-09-18/#109_N_100_setget_16-56-14'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:56:14\n", + "Started at 2017-09-18 16:56:14\n", + "DataSet:\n", + " location = 'data/2017-09-18/#110_N_100_setget_16-56-14'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:56:14\n", + "Started at 2017-09-18 16:56:14\n", + "DataSet:\n", + " location = 'data/2017-09-18/#111_N_100_setget_16-56-14'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:56:15\n", + "Started at 2017-09-18 16:56:15\n", + "DataSet:\n", + " location = 'data/2017-09-18/#112_N_100_setget_16-56-15'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:56:15\n", + "Started at 2017-09-18 16:56:15\n", + "DataSet:\n", + " location = 'data/2017-09-18/#113_N_100_setget_16-56-15'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:56:15\n", + "Started at 2017-09-18 16:56:15\n", + "DataSet:\n", + " location = 'data/2017-09-18/#114_N_100_setget_16-56-15'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:56:16\n", + "Started at 2017-09-18 16:56:16\n", + "DataSet:\n", + " location = 'data/2017-09-18/#115_N_100_setget_16-56-16'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (100,)\n", + " Measured | keith_smua_curr | curr | (100,)\n", + "Finished at 2017-09-18 16:56:16\n", + "370 ms ± 15.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "\n", + "loop = qc.Loop(keith.smua.volt.sweep(1, 10, num=N)).each(keith.smua.curr)\n", + "data = loop.get_data_set(name='N_{}_setget'.format(N))\n", + "_ = loop.run() # run the loop" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SCRIPT" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataSet:\n", + " location = 'data/2017-09-18/#116_{name}_16-57-00'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:00\n", + "DataSet:\n", + " location = 'data/2017-09-18/#117_{name}_16-57-00'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:00\n", + "DataSet:\n", + " location = 'data/2017-09-18/#118_{name}_16-57-00'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:01\n", + "DataSet:\n", + " location = 'data/2017-09-18/#119_{name}_16-57-01'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:01\n", + "DataSet:\n", + " location = 'data/2017-09-18/#120_{name}_16-57-01'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:01\n", + "DataSet:\n", + " location = 'data/2017-09-18/#121_{name}_16-57-01'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:01\n", + "DataSet:\n", + " location = 'data/2017-09-18/#122_{name}_16-57-01'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:01\n", + "DataSet:\n", + " location = 'data/2017-09-18/#123_{name}_16-57-01'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:01\n", + "DataSet:\n", + " location = 'data/2017-09-18/#124_{name}_16-57-01'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:02\n", + "DataSet:\n", + " location = 'data/2017-09-18/#125_{name}_16-57-02'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:02\n", + "DataSet:\n", + " location = 'data/2017-09-18/#126_{name}_16-57-02'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:02\n", + "DataSet:\n", + " location = 'data/2017-09-18/#127_{name}_16-57-02'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:02\n", + "DataSet:\n", + " location = 'data/2017-09-18/#128_{name}_16-57-02'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:02\n", + "DataSet:\n", + " location = 'data/2017-09-18/#129_{name}_16-57-02'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:03\n", + "DataSet:\n", + " location = 'data/2017-09-18/#130_{name}_16-57-03'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:03\n", + "DataSet:\n", + " location = 'data/2017-09-18/#131_{name}_16-57-03'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:03\n", + "DataSet:\n", + " location = 'data/2017-09-18/#132_{name}_16-57-03'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:03\n", + "DataSet:\n", + " location = 'data/2017-09-18/#133_{name}_16-57-03'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:03\n", + "DataSet:\n", + " location = 'data/2017-09-18/#134_{name}_16-57-03'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:03\n", + "DataSet:\n", + " location = 'data/2017-09-18/#135_{name}_16-57-03'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:04\n", + "DataSet:\n", + " location = 'data/2017-09-18/#136_{name}_16-57-04'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:04\n", + "DataSet:\n", + " location = 'data/2017-09-18/#137_{name}_16-57-04'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:04\n", + "DataSet:\n", + " location = 'data/2017-09-18/#138_{name}_16-57-04'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:04\n", + "DataSet:\n", + " location = 'data/2017-09-18/#139_{name}_16-57-04'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:04\n", + "DataSet:\n", + " location = 'data/2017-09-18/#140_{name}_16-57-04'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:05\n", + "DataSet:\n", + " location = 'data/2017-09-18/#141_{name}_16-57-05'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:05\n", + "DataSet:\n", + " location = 'data/2017-09-18/#142_{name}_16-57-05'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:05\n", + "DataSet:\n", + " location = 'data/2017-09-18/#143_{name}_16-57-05'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:05\n", + "DataSet:\n", + " location = 'data/2017-09-18/#144_{name}_16-57-05'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:05\n", + "DataSet:\n", + " location = 'data/2017-09-18/#145_{name}_16-57-05'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:05\n", + "DataSet:\n", + " location = 'data/2017-09-18/#146_{name}_16-57-05'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:06\n", + "DataSet:\n", + " location = 'data/2017-09-18/#147_{name}_16-57-06'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:06\n", + "DataSet:\n", + " location = 'data/2017-09-18/#148_{name}_16-57-06'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:06\n", + "DataSet:\n", + " location = 'data/2017-09-18/#149_{name}_16-57-06'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:06\n", + "DataSet:\n", + " location = 'data/2017-09-18/#150_{name}_16-57-06'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:06\n", + "DataSet:\n", + " location = 'data/2017-09-18/#151_{name}_16-57-06'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:06\n", + "DataSet:\n", + " location = 'data/2017-09-18/#152_{name}_16-57-06'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:07\n", + "DataSet:\n", + " location = 'data/2017-09-18/#153_{name}_16-57-07'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:07\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataSet:\n", + " location = 'data/2017-09-18/#154_{name}_16-57-07'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:07\n", + "DataSet:\n", + " location = 'data/2017-09-18/#155_{name}_16-57-07'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:07\n", + "DataSet:\n", + " location = 'data/2017-09-18/#156_{name}_16-57-07'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:07\n", + "DataSet:\n", + " location = 'data/2017-09-18/#157_{name}_16-57-07'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:08\n", + "DataSet:\n", + " location = 'data/2017-09-18/#158_{name}_16-57-08'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:08\n", + "DataSet:\n", + " location = 'data/2017-09-18/#159_{name}_16-57-08'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:08\n", + "DataSet:\n", + " location = 'data/2017-09-18/#160_{name}_16-57-08'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:08\n", + "DataSet:\n", + " location = 'data/2017-09-18/#161_{name}_16-57-08'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:08\n", + "DataSet:\n", + " location = 'data/2017-09-18/#162_{name}_16-57-08'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:08\n", + "DataSet:\n", + " location = 'data/2017-09-18/#163_{name}_16-57-08'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:09\n", + "DataSet:\n", + " location = 'data/2017-09-18/#164_{name}_16-57-09'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:09\n", + "DataSet:\n", + " location = 'data/2017-09-18/#165_{name}_16-57-09'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:09\n", + "DataSet:\n", + " location = 'data/2017-09-18/#166_{name}_16-57-09'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:09\n", + "DataSet:\n", + " location = 'data/2017-09-18/#167_{name}_16-57-09'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:09\n", + "DataSet:\n", + " location = 'data/2017-09-18/#168_{name}_16-57-09'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:10\n", + "DataSet:\n", + " location = 'data/2017-09-18/#169_{name}_16-57-10'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:10\n", + "DataSet:\n", + " location = 'data/2017-09-18/#170_{name}_16-57-10'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:10\n", + "DataSet:\n", + " location = 'data/2017-09-18/#171_{name}_16-57-10'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:10\n", + "DataSet:\n", + " location = 'data/2017-09-18/#172_{name}_16-57-10'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:10\n", + "DataSet:\n", + " location = 'data/2017-09-18/#173_{name}_16-57-10'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:11\n", + "DataSet:\n", + " location = 'data/2017-09-18/#174_{name}_16-57-11'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:11\n", + "DataSet:\n", + " location = 'data/2017-09-18/#175_{name}_16-57-11'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:11\n", + "DataSet:\n", + " location = 'data/2017-09-18/#176_{name}_16-57-11'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:11\n", + "DataSet:\n", + " location = 'data/2017-09-18/#177_{name}_16-57-11'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:11\n", + "DataSet:\n", + " location = 'data/2017-09-18/#178_{name}_16-57-11'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:11\n", + "DataSet:\n", + " location = 'data/2017-09-18/#179_{name}_16-57-11'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:12\n", + "DataSet:\n", + " location = 'data/2017-09-18/#180_{name}_16-57-12'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:12\n", + "DataSet:\n", + " location = 'data/2017-09-18/#181_{name}_16-57-12'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:12\n", + "DataSet:\n", + " location = 'data/2017-09-18/#182_{name}_16-57-12'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:12\n", + "DataSet:\n", + " location = 'data/2017-09-18/#183_{name}_16-57-12'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:12\n", + "DataSet:\n", + " location = 'data/2017-09-18/#184_{name}_16-57-12'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:13\n", + "DataSet:\n", + " location = 'data/2017-09-18/#185_{name}_16-57-13'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:13\n", + "DataSet:\n", + " location = 'data/2017-09-18/#186_{name}_16-57-13'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:13\n", + "DataSet:\n", + " location = 'data/2017-09-18/#187_{name}_16-57-13'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:13\n", + "DataSet:\n", + " location = 'data/2017-09-18/#188_{name}_16-57-13'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:13\n", + "DataSet:\n", + " location = 'data/2017-09-18/#189_{name}_16-57-13'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:13\n", + "DataSet:\n", + " location = 'data/2017-09-18/#190_{name}_16-57-13'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:14\n", + "DataSet:\n", + " location = 'data/2017-09-18/#191_{name}_16-57-14'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:14\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataSet:\n", + " location = 'data/2017-09-18/#192_{name}_16-57-14'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:14\n", + "DataSet:\n", + " location = 'data/2017-09-18/#193_{name}_16-57-14'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:14\n", + "DataSet:\n", + " location = 'data/2017-09-18/#194_{name}_16-57-14'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:14\n", + "DataSet:\n", + " location = 'data/2017-09-18/#195_{name}_16-57-14'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:15\n", + "DataSet:\n", + " location = 'data/2017-09-18/#196_{name}_16-57-15'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (100,)\n", + "acquired at 2017-09-18 16:57:15\n", + "182 ms ± 6.48 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "\n", + "data = keith.smua.doFastSweep(1, 10, N, mode='IV')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NPLC = 0.05, N = 1000" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Preparation for a simple I-V curve with a 5 MOhm resistor\n", + "\n", + "keith.smua.reset()\n", + "keith.smua.nplc(0.05)\n", + "keith.smua.mode('voltage')\n", + "keith.smua.sourcerange_v(20)\n", + "keith.smua.measurerange_i(100e-6)\n", + "keith.smua.output('on')\n", + "\n", + "N = 1000" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SET-GET" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Started at 2017-09-18 16:59:06\n", + "DataSet:\n", + " location = 'data/2017-09-18/#197_N_1000_setget_16-59-06'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:59:10\n", + "Started at 2017-09-18 16:59:10\n", + "DataSet:\n", + " location = 'data/2017-09-18/#198_N_1000_setget_16-59-10'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:59:13\n", + "Started at 2017-09-18 16:59:13\n", + "DataSet:\n", + " location = 'data/2017-09-18/#199_N_1000_setget_16-59-13'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:59:16\n", + "Started at 2017-09-18 16:59:16\n", + "DataSet:\n", + " location = 'data/2017-09-18/#200_N_1000_setget_16-59-16'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:59:20\n", + "Started at 2017-09-18 16:59:20\n", + "DataSet:\n", + " location = 'data/2017-09-18/#201_N_1000_setget_16-59-20'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:59:23\n", + "Started at 2017-09-18 16:59:23\n", + "DataSet:\n", + " location = 'data/2017-09-18/#202_N_1000_setget_16-59-23'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:59:27\n", + "Started at 2017-09-18 16:59:27\n", + "DataSet:\n", + " location = 'data/2017-09-18/#203_N_1000_setget_16-59-27'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:59:30\n", + "Started at 2017-09-18 16:59:30\n", + "DataSet:\n", + " location = 'data/2017-09-18/#204_N_1000_setget_16-59-30'\n", + " | | | \n", + " Setpoint | keith_smua_volt_set | volt | (1000,)\n", + " Measured | keith_smua_curr | curr | (1000,)\n", + "Finished at 2017-09-18 16:59:33\n", + "3.38 s ± 39.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "\n", + "loop = qc.Loop(keith.smua.volt.sweep(1, 10, num=N)).each(keith.smua.curr)\n", + "data = loop.get_data_set(name='N_{}_setget'.format(N))\n", + "_ = loop.run() # run the loop" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SCRIPT" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataSet:\n", + " location = 'data/2017-09-18/#205_{name}_16-59-38'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:59:39\n", + "DataSet:\n", + " location = 'data/2017-09-18/#206_{name}_16-59-39'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:59:41\n", + "DataSet:\n", + " location = 'data/2017-09-18/#207_{name}_16-59-41'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:59:42\n", + "DataSet:\n", + " location = 'data/2017-09-18/#208_{name}_16-59-42'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:59:43\n", + "DataSet:\n", + " location = 'data/2017-09-18/#209_{name}_16-59-43'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:59:45\n", + "DataSet:\n", + " location = 'data/2017-09-18/#210_{name}_16-59-45'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:59:46\n", + "DataSet:\n", + " location = 'data/2017-09-18/#211_{name}_16-59-46'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:59:48\n", + "DataSet:\n", + " location = 'data/2017-09-18/#212_{name}_16-59-48'\n", + " | | | \n", + " Measured | keith_smua_iv_sweep | iv_sweep | (1000,)\n", + "acquired at 2017-09-18 16:59:49\n", + "1.44 s ± 13.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "\n", + "data = keith.smua.doFastSweep(1, 10, N, mode='IV')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From a3c9ed766146b5f93e96a1fba39cbc311e47e768 Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 18 Sep 2017 17:16:58 +0200 Subject: [PATCH 14/21] remote file that somehow snuck into this PR --- qcodes/instrument_drivers/QDev/_qdacdrivertodolist | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 qcodes/instrument_drivers/QDev/_qdacdrivertodolist diff --git a/qcodes/instrument_drivers/QDev/_qdacdrivertodolist b/qcodes/instrument_drivers/QDev/_qdacdrivertodolist deleted file mode 100644 index 8b3949510e2..00000000000 --- a/qcodes/instrument_drivers/QDev/_qdacdrivertodolist +++ /dev/null @@ -1,14 +0,0 @@ - -The instrument inherits from VisaInstrument (is this clever?), which implicitly assumes the instrument -to speak SCPI. - -Okay, so, *IDN? is a VISA string? And even Instrument assumes this... - -*IDN? is specified already in IEEE 488.2 - -This leads to broken functions in the API, unless we override all inherited SCPI-dependent -functions. - -* Get a list of all VisaInstrument methods - -* Override what we need. \ No newline at end of file From 4b2a4944cee672c333dc4a7acd689d74dd2c5cea Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Mon, 18 Sep 2017 17:31:09 +0200 Subject: [PATCH 15/21] Add deprecation warning to un-channelised driver --- qcodes/instrument_drivers/tektronix/Keithley_2600.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600.py b/qcodes/instrument_drivers/tektronix/Keithley_2600.py index faaac623360..a30b68eca57 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600.py @@ -1,3 +1,5 @@ +import warnings + from qcodes import VisaInstrument from qcodes.instrument.channel import InstrumentChannel from qcodes.instrument.base import Instrument @@ -23,7 +25,6 @@ def __init__(self, parent: Instrument, name: str, channel: str): super().__init__(parent, name) - class Keithley_2600(VisaInstrument): """ This is the qcodes driver for the Keithley_2600 Source-Meter series, @@ -44,6 +45,11 @@ def __init__(self, name: str, address: str, channel: str, channel: Either 'a' or 'b' model: The model type, e.g. '2614B' """ + + warnings.warn("This Keithley driver is old and will be removed " + "from QCoDeS soon. Use Keithley_2600_channels " + "instead, it is MUCH better.", UserWarning) + super().__init__(name, address, terminator='\n', **kwargs) if model is None: From 5e7decd4af75b7d0e3a9ac52ad68b33d397ba34f Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Thu, 28 Sep 2017 13:20:06 +0200 Subject: [PATCH 16/21] fix: internalise the model query --- .../tektronix/Keithley_2600.py | 24 ++----------------- .../tektronix/Keithley_2600_channels.py | 19 +++------------ 2 files changed, 5 insertions(+), 38 deletions(-) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600.py b/qcodes/instrument_drivers/tektronix/Keithley_2600.py index a30b68eca57..b4554599d40 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600.py @@ -6,25 +6,6 @@ import qcodes.utils.validators as vals -class KeithleyChannel(InstrumentChannel): - """ - Class to hold the two Keithley channels, i.e. - SMUA and SMUB. - """ - - def __init__(self, parent: Instrument, name: str, channel: str): - """ - Args: - parent: The Instrument instance to which the channel is - to be attached. - name: The 'colloquial' name of the channel - channel: The name used by the Keithley, i.e. either - 'smua' or 'smub' - """ - - super().__init__(parent, name) - - class Keithley_2600(VisaInstrument): """ This is the qcodes driver for the Keithley_2600 Source-Meter series, @@ -52,9 +33,8 @@ def __init__(self, name: str, address: str, channel: str, super().__init__(name, address, terminator='\n', **kwargs) - if model is None: - raise ValueError('Please supply Keithley model name, e.g.' - '"2614B".') + model = self.ask('localnode.model') + knownmodels = ['2601B', '2602B', '2604B', '2611B', '2612B', '2614B', '2635B', '2636B'] if model not in knownmodels: diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py index 20deb96e436..f15e8056ac5 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py @@ -318,25 +318,17 @@ class Keithley_2600(VisaInstrument): This is the qcodes driver for the Keithley_2600 Source-Meter series, tested with Keithley_2614B - Status: beta-version. - TODO: - - Make a channelised version for the two channels - - add ramping and such stuff - """ - def __init__(self, name: str, address: str, - model: str=None, **kwargs) -> None: + def __init__(self, name: str, address: str, **kwargs) -> None: """ Args: name: Name to use internally in QCoDeS address: VISA ressource address - model: The model type, e.g. '2614B' """ super().__init__(name, address, terminator='\n', **kwargs) - if model is None: - raise ValueError('Please supply Keithley model name, e.g.' - '"2614B".') + model = self.ask('localnode.model') + knownmodels = ['2601B', '2602B', '2604B', '2611B', '2612B', '2614B', '2635B', '2636B'] if model not in knownmodels: @@ -378,15 +370,10 @@ def __init__(self, name: str, address: str, 1e-3, 10e-6, 100e-3, 1, 1.5]} # Add the channel to the instrument - channels = ChannelList(self, "Channels", KeithleyChannel, - snapshotable=False) for ch in ['a', 'b']: ch_name = 'smu{}'.format(ch) channel = KeithleyChannel(self, ch_name, ch_name) - channels.append(channel) self.add_submodule(ch_name, channel) - channels.lock() - self.add_submodule("channels", channels) # display self.add_parameter('display_settext', From 1b6cd2d63c0843c20780f031e80ffa3f5c6d5932 Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Thu, 28 Sep 2017 14:11:52 +0200 Subject: [PATCH 17/21] fix snapshot and a misleading docstring --- .../tektronix/Keithley_2600_channels.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py index f15e8056ac5..c122414ae62 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py @@ -197,8 +197,9 @@ def __init__(self, parent: Instrument, name: str, channel: str) -> None: # We need to avoid updating the sweep parameter def snapshot_base(self, update: bool=False) -> Dict: params_to_skip_update = ['fastsweep'] - super().snapshot_base(update=update, - params_to_skip_update=params_to_skip_update) + dct = super().snapshot_base(update=update, + params_to_skip_update=params_to_skip_update) + return dct def reset(self): """ @@ -218,8 +219,8 @@ def doFastSweep(self, start: float, stop: float, return a QCoDeS DataSet with the sweep. Args: - start: starting voltage - stop: end voltage + start: starting sweep value (V or A) + stop: end sweep value (V or A) steps: number of steps mode: What kind of sweep to make. 'IV' (I versus V) or 'VI' (V versus I) From 66097ace40f43359dcdff2d7ec9a0d276c48a1bb Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Thu, 28 Sep 2017 14:12:20 +0200 Subject: [PATCH 18/21] docs: Provide new driver example --- .../Qcodes example with Keithley 2600.ipynb | 1760 ++++++++++++----- 1 file changed, 1242 insertions(+), 518 deletions(-) diff --git a/docs/examples/driver_examples/Qcodes example with Keithley 2600.ipynb b/docs/examples/driver_examples/Qcodes example with Keithley 2600.ipynb index 45d545285dd..53317380b9f 100644 --- a/docs/examples/driver_examples/Qcodes example with Keithley 2600.ipynb +++ b/docs/examples/driver_examples/Qcodes example with Keithley 2600.ipynb @@ -7,279 +7,27 @@ "# Qcodes example with Keithley 2600" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**NOTE** This example is for the new (as of September 2017) channelised driver. If you are considering using the old driver, please reconsider. There is no functionality of the old driver that is not contained in the new one, but it might have a (slightly) different name." + ] + }, { "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "/*\r\n", - " * Qcodes Jupyter/IPython widgets\r\n", - " */\r\n", - "require([\r\n", - " 'nbextensions/widgets/widgets/js/widget',\r\n", - " 'nbextensions/widgets/widgets/js/manager'\r\n", - "], function (widget, manager) {\r\n", - "\r\n", - " var UpdateView = widget.DOMWidgetView.extend({\r\n", - " render: function() {\r\n", - " window.MYWIDGET = this;\r\n", - " this._interval = 0;\r\n", - " this.update();\r\n", - " },\r\n", - " update: function() {\r\n", - " this.display(this.model.get('_message'));\r\n", - " this.setInterval();\r\n", - " },\r\n", - " display: function(message) {\r\n", - " /*\r\n", - " * display method: override this for custom display logic\r\n", - " */\r\n", - " this.el.innerHTML = message;\r\n", - " },\r\n", - " remove: function() {\r\n", - " clearInterval(this._updater);\r\n", - " },\r\n", - " setInterval: function(newInterval) {\r\n", - " var me = this;\r\n", - " if(newInterval===undefined) newInterval = me.model.get('interval');\r\n", - " if(newInterval===me._interval) return;\r\n", - "\r\n", - " me._interval = newInterval;\r\n", - "\r\n", - " if(me._updater) clearInterval(me._updater);\r\n", - "\r\n", - " if(me._interval) {\r\n", - " me._updater = setInterval(function() {\r\n", - " me.send({myupdate: true});\r\n", - " if(!me.model.comm_live) {\r\n", - " console.log('missing comm, canceling widget updates', me);\r\n", - " clearInterval(me._updater);\r\n", - " }\r\n", - " }, me._interval * 1000);\r\n", - " }\r\n", - " }\r\n", - " });\r\n", - " manager.WidgetManager.register_widget_view('UpdateView', UpdateView);\r\n", - "\r\n", - " var HiddenUpdateView = UpdateView.extend({\r\n", - " display: function(message) {\r\n", - " this.$el.hide();\r\n", - " }\r\n", - " });\r\n", - " manager.WidgetManager.register_widget_view('HiddenUpdateView', HiddenUpdateView);\r\n", - "\r\n", - " var SubprocessView = UpdateView.extend({\r\n", - " render: function() {\r\n", - " var me = window.SPVIEW = this;\r\n", - " me._interval = 0;\r\n", - " me._minimize = '';\r\n", - " me._restore = '';\r\n", - "\r\n", - " // in case there is already an outputView present,\r\n", - " // like from before restarting the kernel\r\n", - " $('.qcodes-output-view').not(me.$el).remove();\r\n", - "\r\n", - " me.$el\r\n", - " .addClass('qcodes-output-view')\r\n", - " .attr('qcodes-state', 'docked')\r\n", - " .html(\r\n", - " '
' +\r\n", - " '' +\r\n", - " '' +\r\n", - " '' +\r\n", - " '' +\r\n", - " '' +\r\n", - " '' +\r\n", - " '
' +\r\n", - " '
'\r\n",
-       "                );\r\n",
-       "\r\n",
-       "            me.clearButton = me.$el.find('.qcodes-clear-output');\r\n",
-       "            me.minButton = me.$el.find('.qcodes-minimize');\r\n",
-       "            me.outputArea = me.$el.find('pre');\r\n",
-       "            me.subprocessList = me.$el.find('span');\r\n",
-       "            me.abortButton = me.$el.find('.qcodes-abort-loop');\r\n",
-       "\r\n",
-       "            me.clearButton.click(function() {\r\n",
-       "                me.outputArea.html('');\r\n",
-       "                me.clearButton.addClass('disabled');\r\n",
-       "            });\r\n",
-       "\r\n",
-       "            me.abortButton.click(function() {\r\n",
-       "                me.send({abort: true});\r\n",
-       "            });\r\n",
-       "\r\n",
-       "            me.$el.find('.js-state').click(function() {\r\n",
-       "                var oldState = me.$el.attr('qcodes-state'),\r\n",
-       "                    state = this.className.substr(this.className.indexOf('qcodes'))\r\n",
-       "                        .split('-')[1].split(' ')[0];\r\n",
-       "\r\n",
-       "                // not sure why I can't pop it out of the widgetarea in render, but it seems that\r\n",
-       "                // some other bit of code resets the parent after render if I do it there.\r\n",
-       "                // To be safe, just do it on every state click.\r\n",
-       "                me.$el.appendTo('body');\r\n",
-       "\r\n",
-       "                if(oldState === 'floated') {\r\n",
-       "                    me.$el.draggable('destroy').css({left:'', top: ''});\r\n",
-       "                }\r\n",
-       "\r\n",
-       "                me.$el.attr('qcodes-state', state);\r\n",
-       "\r\n",
-       "                if(state === 'floated') {\r\n",
-       "                    me.$el.draggable().css({\r\n",
-       "                        left: window.innerWidth - me.$el.width() - 15,\r\n",
-       "                        top: window.innerHeight - me.$el.height() - 10\r\n",
-       "                    });\r\n",
-       "                }\r\n",
-       "            });\r\n",
-       "\r\n",
-       "            $(window).resize(function() {\r\n",
-       "                if(me.$el.attr('qcodes-state') === 'floated') {\r\n",
-       "                    var position = me.$el.position(),\r\n",
-       "                        minVis = 20,\r\n",
-       "                        maxLeft = window.innerWidth - minVis,\r\n",
-       "                        maxTop = window.innerHeight - minVis;\r\n",
-       "\r\n",
-       "                    if(position.left > maxLeft) me.$el.css('left', maxLeft);\r\n",
-       "                    if(position.top > maxTop) me.$el.css('top', maxTop);\r\n",
-       "                }\r\n",
-       "            });\r\n",
-       "\r\n",
-       "            me.update();\r\n",
-       "        },\r\n",
-       "\r\n",
-       "        display: function(message) {\r\n",
-       "            if(message) {\r\n",
-       "                var initialScroll = this.outputArea.scrollTop();\r\n",
-       "                this.outputArea.scrollTop(this.outputArea.prop('scrollHeight'));\r\n",
-       "                var scrollBottom = this.outputArea.scrollTop();\r\n",
-       "\r\n",
-       "                if(this.$el.attr('qcodes-state') === 'minimized') {\r\n",
-       "                    this.$el.find('.qcodes-docked').click();\r\n",
-       "                    // always scroll to the bottom if we're restoring\r\n",
-       "                    // because of a new message\r\n",
-       "                    initialScroll = scrollBottom;\r\n",
-       "                }\r\n",
-       "\r\n",
-       "                this.outputArea.append(message);\r\n",
-       "                this.clearButton.removeClass('disabled');\r\n",
-       "\r\n",
-       "                // if we were scrolled to the bottom initially, make sure\r\n",
-       "                // we stay that way.\r\n",
-       "                this.outputArea.scrollTop(initialScroll === scrollBottom ?\r\n",
-       "                    this.outputArea.prop('scrollHeight') : initialScroll);\r\n",
-       "            }\r\n",
-       "\r\n",
-       "            var processes = this.model.get('_processes') || 'No subprocesses';\r\n",
-       "            this.abortButton.toggleClass('disabled', processes.indexOf('Measurement')===-1);\r\n",
-       "            this.subprocessList.text(processes);\r\n",
-       "        }\r\n",
-       "    });\r\n",
-       "    manager.WidgetManager.register_widget_view('SubprocessView', SubprocessView);\r\n",
-       "});\r\n"
-      ],
-      "text/plain": [
-       ""
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "data": {
-      "text/html": [
-       ""
-      ],
-      "text/plain": [
-       ""
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "No loop running\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
-    "%matplotlib nbagg\n",
+    "%matplotlib notebook\n",
     "import matplotlib.pyplot as plt\n",
     "import time\n",
     "import numpy as np\n",
     "\n",
-    "import qcodes as qc\n",
-    "\n",
-    "qc.halt_bg()\n",
-    "qc.set_mp_method('spawn')  # force Windows behavior on mac\n",
-    "\n",
-    "# this makes a widget in the corner of the window to show and control\n",
-    "# subprocesses and any output they would print to the terminal\n",
-    "qc.show_subprocess_widget()"
+    "import qcodes as qc"
    ]
   },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": []
-  },
   {
    "cell_type": "code",
    "execution_count": 2,
@@ -288,41 +36,20 @@
    },
    "outputs": [],
    "source": [
-    "import qcodes.instrument_drivers.tektronix.Keithley_2600 as keith"
+    "from qcodes.instrument_drivers.tektronix.Keithley_2600_channels import Keithley_2600"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": 3,
-   "metadata": {},
+   "metadata": {
+    "collapsed": true
+   },
    "outputs": [],
    "source": [
-    "# spawn doesn't like function or class definitions in the interpreter\n",
-    "# session - had to move them to a file.\n",
-    "\n",
-    "# now create this \"experiment\"\n",
-    "k1 = keith.Keithley_2600('Keithley1', 'GPIB0::15::INSTR',channel='a')#,server_name=None)\n",
-    "k2 = keith.Keithley_2600('Keithley2', 'GPIB0::15::INSTR',channel='b')#,server_name=None)\n",
-    "\n",
-    "station = qc.Station(k1,k2)\n",
-    "\n",
-    "# could measure any number of things by adding arguments to this\n",
-    "# function call, but here we're just measuring one, the meter amplitude\n",
-    "station.set_measurement(k1.curr,k2.curr)\n",
-    "\n",
-    "# it's nice to have the key parameters be part of the global namespace\n",
-    "# that way they're objects that we can easily set, get, and slice\n",
-    "# this could be simplified to a station method that gathers all parameters\n",
-    "# and adds them all as (disambiguated) globals, printing what it did\n",
-    "# something like:\n",
-    "#   station.gather_parameters(globals())\n",
-    "\n",
-    "vsd1, vsd2, curr1, curr2 = k1.volt, k2.volt, k1.curr, k2.curr\n",
+    "# Create a station to hold all the instruments\n",
     "\n",
-    "# once we have implemented a monitor, defining a station will start a\n",
-    "# DataServer process, and you would see it in the subprocess widget,\n",
-    "# or via active_children() as here:\n",
-    "# qc.active_children()"
+    "station = qc.Station()"
    ]
   },
   {
@@ -332,35 +59,17 @@
     "scrolled": false
    },
    "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Connected to: Keithley Instruments Inc. 2614B (serial:4084407, firmware:3.2.1) in 0.14s\n"
+     ]
+    },
     {
      "data": {
       "text/plain": [
-       "{'instruments': {'Keithley1': {'functions': {},\n",
-       "   'metadata': {'info': {'model': '2614B',\n",
-       "     'serial_number': '4083825',\n",
-       "     'software_revision': '3.2.1',\n",
-       "     'vendor': 'Keithley Instruments Inc.'}},\n",
-       "   'parameters': {'curr': {'ts': None, 'value': None},\n",
-       "    'limiti': {'ts': None, 'value': None},\n",
-       "    'limitv': {'ts': None, 'value': None},\n",
-       "    'mode': {'ts': None, 'value': None},\n",
-       "    'output': {'ts': None, 'value': None},\n",
-       "    'rangei': {'ts': None, 'value': None},\n",
-       "    'rangev': {'ts': None, 'value': None},\n",
-       "    'volt': {'ts': None, 'value': None}}},\n",
-       "  'Keithley2': {'functions': {},\n",
-       "   'metadata': {'info': {'model': '2614B',\n",
-       "     'serial_number': '4083825',\n",
-       "     'software_revision': '3.2.1',\n",
-       "     'vendor': 'Keithley Instruments Inc.'}},\n",
-       "   'parameters': {'curr': {'ts': None, 'value': None},\n",
-       "    'limiti': {'ts': None, 'value': None},\n",
-       "    'limitv': {'ts': None, 'value': None},\n",
-       "    'mode': {'ts': None, 'value': None},\n",
-       "    'output': {'ts': None, 'value': None},\n",
-       "    'rangei': {'ts': None, 'value': None},\n",
-       "    'rangev': {'ts': None, 'value': None},\n",
-       "    'volt': {'ts': None, 'value': None}}}}}"
+       "'keithley'"
       ]
      },
      "execution_count": 4,
@@ -369,7 +78,19 @@
     }
    ],
    "source": [
-    "station.snapshot()"
+    "# instantiate the Keithley and add it to the station\n",
+    "\n",
+    "keith = Keithley_2600('keithley', 'TCPIP0::192.168.15.116::inst0::INSTR')\n",
+    "station.add_component(keith)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The Keithley 2600 has two channels, here called `smua` and `smub` in agreement with the instrument manual.\n",
+    "\n",
+    "The two channels are basically two separate instruments with different integration times (`nplc`), operation modes (`mode`) etc."
    ]
   },
   {
@@ -378,19 +99,64 @@
    "metadata": {},
    "outputs": [
     {
-     "data": {
-      "text/plain": [
-       "[2.98023e-13, -9.41753e-13]"
-      ]
-     },
-     "execution_count": 5,
-     "metadata": {},
-     "output_type": "execute_result"
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "keithley:\n",
+      "\tparameter      value\n",
+      "--------------------------------------------------------------------------------\n",
+      "IDN             :\t{'vendor': 'Keithley Instruments Inc.', 'model': '2614B', '...\n",
+      "display_settext :\tNone \n",
+      "timeout         :\t5 (s)\n",
+      "keithley_smua:\n",
+      "\tparameter     value\n",
+      "--------------------------------------------------------------------------------\n",
+      "curr           :\t3.8147e-07 (A)\n",
+      "fastsweep      :\tNone \n",
+      "limiti         :\t0.1 (A)\n",
+      "limitv         :\t20 (V)\n",
+      "measurerange_i :\t0.1 (A)\n",
+      "measurerange_v :\t2.00000e+01 (V)\n",
+      "mode           :\tvoltage \n",
+      "nplc           :\t0.05 \n",
+      "output         :\ton \n",
+      "sourcerange_i  :\t1e-07 (A)\n",
+      "sourcerange_v  :\t20 (V)\n",
+      "volt           :\t1.9998 (V)\n",
+      "keithley_smub:\n",
+      "\tparameter     value\n",
+      "--------------------------------------------------------------------------------\n",
+      "curr           :\t-3.6955e-13 (A)\n",
+      "fastsweep      :\tNone \n",
+      "limiti         :\t0.1 (A)\n",
+      "limitv         :\t20 (V)\n",
+      "measurerange_i :\t1e-07 (A)\n",
+      "measurerange_v :\t2.00000e-01 (V)\n",
+      "mode           :\tvoltage \n",
+      "nplc           :\t1 \n",
+      "output         :\toff \n",
+      "sourcerange_i  :\t1e-07 (A)\n",
+      "sourcerange_v  :\t0.2 (V)\n",
+      "volt           :\t-4.22e-06 (V)\n"
+     ]
     }
    ],
    "source": [
-    "# we can get the measured quantities right now\n",
-    "station.measure()"
+    "# Get an overview of the settings\n",
+    "#\n",
+    "# You will notice that the two channels have identical parameters but\n",
+    "# potentially different values for them\n",
+    "#\n",
+    "keith.print_readable_snapshot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Basic operation\n",
+    "\n",
+    "Each channel operates in either `voltage` or `current` mode. The mode controls the _source_ behaviour of the instrument, i.e. `voltage` mode corresponds to an amp-meter (voltage source, current meter) and vice versa."
    ]
   },
   {
@@ -402,288 +168,1246 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "DataSet: DataMode.PULL_FROM_SERVER, location='testsweep'\n",
-      "   curr_0: curr\n",
-      "   curr_1: curr\n",
-      "   volt: volt\n",
-      "started at 2016-04-20 15:37:23\n"
+      "Measured one current value: -3.33786e-07 A\n"
      ]
     }
    ],
    "source": [
-    "# start a Loop (which by default runs in a seprarate process)\n",
-    "# the sweep values are defined by slicing the parameter object\n",
-    "# but more complicated sweeps (eg nonlinear, or adaptive) can\n",
-    "# easily be used instead\n",
+    "# Let's set up a single-shot current measurement\n",
+    "# on channel a\n",
     "\n",
-    "# Notice that I'm using an explicit location and `overwrite=True` here so that\n",
-    "# running this notebook over and over won't result in extra files.\n",
-    "# But if you leave these out, you get a new timestamped DataSet each time.\n",
-    "data = qc.Loop(vsd1[-5:5:0.5], 0.03).run(location='testsweep', overwrite=True)\n",
+    "keith.smua.mode('voltage')\n",
+    "keith.smua.nplc(0.05)  # 0.05 Power Line Cycles per measurement. At 50 Hz, this corresponds to 1 ms\n",
+    "keith.smua.sourcerange_v(20) \n",
+    "keith.smua.measurerange_i(0.1)\n",
+    "#\n",
+    "keith.smua.volt(1)  # set the source to output 1 V\n",
+    "keith.smua.output('on')  # turn output on\n",
+    "curr = keith.smua.curr()\n",
+    "keith.smua.output('off')\n",
     "\n",
-    "# now there should be two extra processes running, DataServer and a sweep\n",
-    "# I'll omit the active_children call now because you can see them in the\n",
-    "# subprocess widget"
+    "print('Measured one current value: {} A'.format(curr))"
    ]
   },
   {
-   "cell_type": "code",
-   "execution_count": 7,
-   "metadata": {
-    "scrolled": true
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "{'curr_0': DataArray[20]: curr_0\n",
-       " array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,\n",
-       "         nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan]),\n",
-       " 'curr_1': DataArray[20]: curr_1\n",
-       " array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,\n",
-       "         nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan]),\n",
-       " 'volt': DataArray[20]: volt\n",
-       " array([ -5.,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,\n",
-       "         nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan])}"
-      ]
-     },
-     "execution_count": 7,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "cell_type": "markdown",
+   "metadata": {},
    "source": [
-    "# manually bring the data into the main process and display it as numbers\n",
-    "data.sync()\n",
-    "data.arrays"
+    "## Fast IV curves\n",
+    "\n",
+    "Onboard the Keithley 2600 sits a small computer that can interpret `Lua` scripts. This can be used to make fast IV-curves and is supported by the QCoDeS driver."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 7,
    "metadata": {
-    "scrolled": false
+    "collapsed": true
    },
    "outputs": [],
    "source": [
-    "# live-updating plot, that syncs the data and stops updating when it's finished\n",
-    "# plot = qc.MatPlot(data.amplitude)\n",
-    "plotQ1 = qc.QtPlot(data.volt, data.curr_0)\n",
-    "plotQ2 = qc.QtPlot(data.volt, data.curr_1)"
+    "# Let's make a fast IV curve by sweeping the voltage from 1 V to 2 V in 500 steps\n",
+    "# (when making this notebook, nothing was connected to the instrument, so we just measure noise)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
-   "metadata": {
-    "scrolled": true
-   },
+   "execution_count": 8,
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "DataSet: DataMode.PULL_FROM_SERVER, location='test2d'\n",
-      "   curr_1: curr\n",
-      "   volt: volt\n",
-      "   curr_0: curr\n",
-      "   volt_0: volt\n",
-      "started at 2016-04-20 15:22:46\n"
+      "DataSet:\n",
+      "   location = 'data/2017-09-28/#002_{name}_14-10-48'\n",
+      "      |              |  | \n",
+      "   Measured | keithley_smua_iv_sweep | iv_sweep     | (500,)\n",
+      "acquired at 2017-09-28 14:10:49\n"
      ]
     }
    ],
    "source": [
-    "data2 = qc.Loop(vsd1[-5:5:0.1],0).each(\n",
-    "                qc.Loop(vsd2[-2:2:.2], 0)\n",
-    ").run(location='test2d', overwrite=True)\n",
-    "\n",
-    "# use the subplot and add features of qc.MatPlot\n",
-    "# plot2 = qc.MatPlot(data2.amplitude_0, cmap=plt.cm.hot, figsize=(12, 4.5), subplots=(1, 2))\n",
-    "# plot2.add(data2.amplitude_3, cmap=plt.cm.hot, subplot=2)\n",
-    "\n",
-    "# the equivalent in QtPlot\n",
-    "plot2Q = qc.QtPlot(data2.curr_1, figsize=(1200, 500))\n",
-    "# plot2Q.add(data2.curr_1, subplot=2)"
+    "# This function performs the fast sweep and returns a QCoDeS DataSet\n",
+    "data = keith.smua.doFastSweep(1, 2, 500, mode='IV')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [
     {
      "data": {
+      "application/javascript": [
+       "/* Put everything inside the global mpl namespace */\n",
+       "window.mpl = {};\n",
+       "\n",
+       "\n",
+       "mpl.get_websocket_type = function() {\n",
+       "    if (typeof(WebSocket) !== 'undefined') {\n",
+       "        return WebSocket;\n",
+       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
+       "        return MozWebSocket;\n",
+       "    } else {\n",
+       "        alert('Your browser does not have WebSocket support.' +\n",
+       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+       "              'Firefox 4 and 5 are also supported but you ' +\n",
+       "              'have to enable WebSockets in about:config.');\n",
+       "    };\n",
+       "}\n",
+       "\n",
+       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
+       "    this.id = figure_id;\n",
+       "\n",
+       "    this.ws = websocket;\n",
+       "\n",
+       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
+       "\n",
+       "    if (!this.supports_binary) {\n",
+       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
+       "        if (warnings) {\n",
+       "            warnings.style.display = 'block';\n",
+       "            warnings.textContent = (\n",
+       "                \"This browser does not support binary websocket messages. \" +\n",
+       "                    \"Performance may be slow.\");\n",
+       "        }\n",
+       "    }\n",
+       "\n",
+       "    this.imageObj = new Image();\n",
+       "\n",
+       "    this.context = undefined;\n",
+       "    this.message = undefined;\n",
+       "    this.canvas = undefined;\n",
+       "    this.rubberband_canvas = undefined;\n",
+       "    this.rubberband_context = undefined;\n",
+       "    this.format_dropdown = undefined;\n",
+       "\n",
+       "    this.image_mode = 'full';\n",
+       "\n",
+       "    this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('
');\n", - " var button = $('');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# The DataSet may be plotted\n", - "plot = qc.MatPlot()\n", - "plot.add(data.arrays['keithley_smua_iv_sweep'])" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# Tear down the instrument\n", - "keith.close()" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.0" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} -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\" width=\"891.099972557923\">" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "# The DataSet may be plotted\n", "plot = qc.MatPlot()\n", - "plot.add(data.arrays['keithley_smua_iv_sweep'])\n", - "plot.re" + "plot.add(data.arrays['keithley_smua_iv_sweep'])" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, + "execution_count": 8, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ + "# Finally, tear down the instrument\n", "keith.close()" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "keith.smua.nplc" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{\n", - " 'Voltage_set': DataArray[500]: Voltage_set\n", - " array([ 1. , 1.00200401, 1.00400802, 1.00601202, 1.00801603,\n", - " 1.01002004, 1.01202405, 1.01402806, 1.01603206, 1.01803607,\n", - " 1.02004008, 1.02204409, 1.0240481 , 1.0260521 , 1.02805611,\n", - " 1.03006012, 1.03206413, 1.03406814, 1.03607214, 1.03807615,\n", - " 1.04008016, 1.04208417, 1.04408818, 1.04609218, 1.04809619,\n", - " 1.0501002 , 1.05210421, 1.05410822, 1.05611222, 1.05811623,\n", - " 1.06012024, 1.06212425, 1.06412826, 1.06613226, 1.06813627,\n", - " 1.07014028, 1.07214429, 1.0741483 , 1.0761523 , 1.07815631,\n", - " 1.08016032, 1.08216433, 1.08416834, 1.08617234, 1.08817635,\n", - " 1.09018036, 1.09218437, 1.09418838, 1.09619238, 1.09819639,\n", - " 1.1002004 , 1.10220441, 1.10420842, 1.10621242, 1.10821643,\n", - " 1.11022044, 1.11222445, 1.11422846, 1.11623246, 1.11823647,\n", - " 1.12024048, 1.12224449, 1.1242485 , 1.12625251, 1.12825651,\n", - " 1.13026052, 1.13226453, 1.13426854, 1.13627255, 1.13827655,\n", - " 1.14028056, 1.14228457, 1.14428858, 1.14629259, 1.14829659,\n", - " 1.1503006 , 1.15230461, 1.15430862, 1.15631263, 1.15831663,\n", - " 1.16032064, 1.16232465, 1.16432866, 1.16633267, 1.16833667,\n", - " 1.17034068, 1.17234469, 1.1743487 , 1.17635271, 1.17835671,\n", - " 1.18036072, 1.18236473, 1.18436874, 1.18637275, 1.18837675,\n", - " 1.19038076, 1.19238477, 1.19438878, 1.19639279, 1.19839679,\n", - " 1.2004008 , 1.20240481, 1.20440882, 1.20641283, 1.20841683,\n", - " 1.21042084, 1.21242485, 1.21442886, 1.21643287, 1.21843687,\n", - " 1.22044088, 1.22244489, 1.2244489 , 1.22645291, 1.22845691,\n", - " 1.23046092, 1.23246493, 1.23446894, 1.23647295, 1.23847695,\n", - " 1.24048096, 1.24248497, 1.24448898, 1.24649299, 1.24849699,\n", - " 1.250501 , 1.25250501, 1.25450902, 1.25651303, 1.25851703,\n", - " 1.26052104, 1.26252505, 1.26452906, 1.26653307, 1.26853707,\n", - " 1.27054108, 1.27254509, 1.2745491 , 1.27655311, 1.27855711,\n", - " 1.28056112, 1.28256513, 1.28456914, 1.28657315, 1.28857715,\n", - " 1.29058116, 1.29258517, 1.29458918, 1.29659319, 1.29859719,\n", - " 1.3006012 , 1.30260521, 1.30460922, 1.30661323, 1.30861723,\n", - " 1.31062124, 1.31262525, 1.31462926, 1.31663327, 1.31863727,\n", - " 1.32064128, 1.32264529, 1.3246493 , 1.32665331, 1.32865731,\n", - " 1.33066132, 1.33266533, 1.33466934, 1.33667335, 1.33867735,\n", - " 1.34068136, 1.34268537, 1.34468938, 1.34669339, 1.34869739,\n", - " 1.3507014 , 1.35270541, 1.35470942, 1.35671343, 1.35871743,\n", - " 1.36072144, 1.36272545, 1.36472946, 1.36673347, 1.36873747,\n", - " 1.37074148, 1.37274549, 1.3747495 , 1.37675351, 1.37875752,\n", - " 1.38076152, 1.38276553, 1.38476954, 1.38677355, 1.38877756,\n", - " 1.39078156, 1.39278557, 1.39478958, 1.39679359, 1.3987976 ,\n", - " 1.4008016 , 1.40280561, 1.40480962, 1.40681363, 1.40881764,\n", - " 1.41082164, 1.41282565, 1.41482966, 1.41683367, 1.41883768,\n", - " 1.42084168, 1.42284569, 1.4248497 , 1.42685371, 1.42885772,\n", - " 1.43086172, 1.43286573, 1.43486974, 1.43687375, 1.43887776,\n", - " 1.44088176, 1.44288577, 1.44488978, 1.44689379, 1.4488978 ,\n", - " 1.4509018 , 1.45290581, 1.45490982, 1.45691383, 1.45891784,\n", - " 1.46092184, 1.46292585, 1.46492986, 1.46693387, 1.46893788,\n", - " 1.47094188, 1.47294589, 1.4749499 , 1.47695391, 1.47895792,\n", - " 1.48096192, 1.48296593, 1.48496994, 1.48697395, 1.48897796,\n", - " 1.49098196, 1.49298597, 1.49498998, 1.49699399, 1.498998 ,\n", - " 1.501002 , 1.50300601, 1.50501002, 1.50701403, 1.50901804,\n", - " 1.51102204, 1.51302605, 1.51503006, 1.51703407, 1.51903808,\n", - " 1.52104208, 1.52304609, 1.5250501 , 1.52705411, 1.52905812,\n", - " 1.53106212, 1.53306613, 1.53507014, 1.53707415, 1.53907816,\n", - " 1.54108216, 1.54308617, 1.54509018, 1.54709419, 1.5490982 ,\n", - " 1.5511022 , 1.55310621, 1.55511022, 1.55711423, 1.55911824,\n", - " 1.56112224, 1.56312625, 1.56513026, 1.56713427, 1.56913828,\n", - " 1.57114228, 1.57314629, 1.5751503 , 1.57715431, 1.57915832,\n", - " 1.58116232, 1.58316633, 1.58517034, 1.58717435, 1.58917836,\n", - " 1.59118236, 1.59318637, 1.59519038, 1.59719439, 1.5991984 ,\n", - " 1.6012024 , 1.60320641, 1.60521042, 1.60721443, 1.60921844,\n", - " 1.61122244, 1.61322645, 1.61523046, 1.61723447, 1.61923848,\n", - " 1.62124248, 1.62324649, 1.6252505 , 1.62725451, 1.62925852,\n", - " 1.63126253, 1.63326653, 1.63527054, 1.63727455, 1.63927856,\n", - " 1.64128257, 1.64328657, 1.64529058, 1.64729459, 1.6492986 ,\n", - " 1.65130261, 1.65330661, 1.65531062, 1.65731463, 1.65931864,\n", - " 1.66132265, 1.66332665, 1.66533066, 1.66733467, 1.66933868,\n", - " 1.67134269, 1.67334669, 1.6753507 , 1.67735471, 1.67935872,\n", - " 1.68136273, 1.68336673, 1.68537074, 1.68737475, 1.68937876,\n", - " 1.69138277, 1.69338677, 1.69539078, 1.69739479, 1.6993988 ,\n", - " 1.70140281, 1.70340681, 1.70541082, 1.70741483, 1.70941884,\n", - " 1.71142285, 1.71342685, 1.71543086, 1.71743487, 1.71943888,\n", - " 1.72144289, 1.72344689, 1.7254509 , 1.72745491, 1.72945892,\n", - " 1.73146293, 1.73346693, 1.73547094, 1.73747495, 1.73947896,\n", - " 1.74148297, 1.74348697, 1.74549098, 1.74749499, 1.749499 ,\n", - " 1.75150301, 1.75350701, 1.75551102, 1.75751503, 1.75951904,\n", - " 1.76152305, 1.76352705, 1.76553106, 1.76753507, 1.76953908,\n", - " 1.77154309, 1.77354709, 1.7755511 , 1.77755511, 1.77955912,\n", - " 1.78156313, 1.78356713, 1.78557114, 1.78757515, 1.78957916,\n", - " 1.79158317, 1.79358717, 1.79559118, 1.79759519, 1.7995992 ,\n", - " 1.80160321, 1.80360721, 1.80561122, 1.80761523, 1.80961924,\n", - " 1.81162325, 1.81362725, 1.81563126, 1.81763527, 1.81963928,\n", - " 1.82164329, 1.82364729, 1.8256513 , 1.82765531, 1.82965932,\n", - " 1.83166333, 1.83366733, 1.83567134, 1.83767535, 1.83967936,\n", - " 1.84168337, 1.84368737, 1.84569138, 1.84769539, 1.8496994 ,\n", - " 1.85170341, 1.85370741, 1.85571142, 1.85771543, 1.85971944,\n", - " 1.86172345, 1.86372745, 1.86573146, 1.86773547, 1.86973948,\n", - " 1.87174349, 1.87374749, 1.8757515 , 1.87775551, 1.87975952,\n", - " 1.88176353, 1.88376754, 1.88577154, 1.88777555, 1.88977956,\n", - " 1.89178357, 1.89378758, 1.89579158, 1.89779559, 1.8997996 ,\n", - " 1.90180361, 1.90380762, 1.90581162, 1.90781563, 1.90981964,\n", - " 1.91182365, 1.91382766, 1.91583166, 1.91783567, 1.91983968,\n", - " 1.92184369, 1.9238477 , 1.9258517 , 1.92785571, 1.92985972,\n", - " 1.93186373, 1.93386774, 1.93587174, 1.93787575, 1.93987976,\n", - " 1.94188377, 1.94388778, 1.94589178, 1.94789579, 1.9498998 ,\n", - " 1.95190381, 1.95390782, 1.95591182, 1.95791583, 1.95991984,\n", - " 1.96192385, 1.96392786, 1.96593186, 1.96793587, 1.96993988,\n", - " 1.97194389, 1.9739479 , 1.9759519 , 1.97795591, 1.97995992,\n", - " 1.98196393, 1.98396794, 1.98597194, 1.98797595, 1.98997996,\n", - " 1.99198397, 1.99398798, 1.99599198, 1.99799599, 2. ])\n", - " 'keithley_smua_iv_sweep': DataArray[500]: keithley_smua_iv_sweep\n", - " array([ 2.24113478e-06, 1.88350680e-06, 2.16960916e-06,\n", - " 2.09808354e-06, 2.88486490e-06, 3.17096715e-06,\n", - " 2.24113478e-06, 2.16960916e-06, 2.16960916e-06,\n", - " 2.38418579e-06, 1.59740455e-06, 1.16825106e-06,\n", - " 1.81198118e-06, 2.24113478e-06, 2.45571141e-06,\n", - " 2.59876265e-06, 2.67028804e-06, 2.52723703e-06,\n", - " 1.66893005e-06, 2.31266017e-06, 1.74045567e-06,\n", - " 2.67028804e-06, 1.81198118e-06, 1.23977668e-06,\n", - " 2.02655792e-06, 1.23977668e-06, 2.16960916e-06,\n", - " 1.66893005e-06, 1.31130219e-06, 1.59740455e-06,\n", - " 1.66893005e-06, 1.59740455e-06, 1.81198118e-06,\n", - " 1.09672544e-06, 1.16825106e-06, 1.23977668e-06,\n", - " 1.09672544e-06, 1.09672544e-06, 1.45435331e-06,\n", - " 2.02655792e-06, 1.23977668e-06, 1.59740455e-06,\n", - " 1.45435331e-06, 1.81198118e-06, 1.95503230e-06,\n", - " 1.74045567e-06, 1.59740455e-06, 5.24520885e-07,\n", - " 1.38282780e-06, 1.31130219e-06, 1.74045567e-06,\n", - " 1.52587893e-06, 1.81198118e-06, 1.81198118e-06,\n", - " 1.52587893e-06, 8.10623192e-07, 1.16825106e-06,\n", - " 1.09672544e-06, 6.67572010e-07, 1.59740455e-06,\n", - " 1.59740455e-06, 1.52587893e-06, 8.10623192e-07,\n", - " 1.02519994e-06, 1.45435331e-06, 1.59740455e-06,\n", - " 1.45435331e-06, 1.74045567e-06, 1.66893005e-06,\n", - " 1.66893005e-06, 1.16825106e-06, 1.52587893e-06,\n", - " 8.10623192e-07, 8.10623192e-07, 9.53674316e-07,\n", - " 1.66893005e-06, 1.52587893e-06, 3.81469732e-07,\n", - " 1.59740455e-06, 1.02519994e-06, 1.95503230e-06,\n", - " 9.53674316e-07, 1.66893005e-06, 1.74045567e-06,\n", - " 1.23977668e-06, 1.45435331e-06, 1.16825106e-06,\n", - " 1.38282780e-06, 7.39097629e-07, 1.02519994e-06,\n", - " 1.45435331e-06, 7.39097629e-07, 1.16825106e-06,\n", - " 1.02519994e-06, 1.52587893e-06, 6.67572010e-07,\n", - " 1.16825106e-06, 1.52587893e-06, 1.23977668e-06,\n", - " 1.52587893e-06, 8.10623192e-07, 8.10623192e-07,\n", - " 1.45435331e-06, 1.95503230e-06, 9.53674316e-07,\n", - " 1.31130219e-06, 8.82148754e-07, 4.52995295e-07,\n", - " 1.31130219e-06, 1.38282780e-06, 1.52587893e-06,\n", - " 9.53674316e-07, 8.10623192e-07, 1.88350680e-06,\n", - " 1.09672544e-06, 1.16825106e-06, 9.53674316e-07,\n", - " 8.10623192e-07, 6.67572010e-07, 1.31130219e-06,\n", - " 1.74045567e-06, 1.23977668e-06, 8.82148754e-07,\n", - " 1.09672544e-06, 1.38282780e-06, 1.45435331e-06,\n", - " 1.66893005e-06, 1.31130219e-06, 8.82148754e-07,\n", - " 1.23977668e-06, 1.52587893e-06, 2.38418579e-07,\n", - " 1.09672544e-06, 1.81198118e-06, 1.95503230e-06,\n", - " 8.82148754e-07, 1.02519994e-06, 8.82148754e-07,\n", - " 1.23977668e-06, 1.45435331e-06, 1.52587893e-06,\n", - " 1.09672544e-06, 1.74045567e-06, 1.31130219e-06,\n", - " 1.66893005e-06, 1.59740455e-06, 8.10623192e-07,\n", - " 1.09672544e-06, 1.31130219e-06, 1.74045567e-06,\n", - " 1.09672544e-06, 1.09672544e-06, 8.82148754e-07,\n", - " 1.02519994e-06, 1.02519994e-06, 1.66893005e-06,\n", - " 1.59740455e-06, 9.53674316e-07, 1.31130219e-06,\n", - " 1.52587893e-06, 8.82148754e-07, 9.53674316e-07,\n", - " 8.10623192e-07, 1.16825106e-06, 8.82148754e-07,\n", - " 1.59740455e-06, 1.09672544e-06, 1.59740455e-06,\n", - " 5.96046448e-07, 1.38282780e-06, 1.09672544e-06,\n", - " 1.59740455e-06, 8.10623192e-07, 8.82148754e-07,\n", - " 1.52587893e-06, 1.45435331e-06, 5.24520885e-07,\n", - " 1.74045567e-06, 8.82148754e-07, 5.24520885e-07,\n", - " 9.53674316e-07, 1.66893005e-06, 6.67572010e-07,\n", - " 1.09672544e-06, 1.02519994e-06, 8.82148754e-07,\n", - " 1.45435331e-06, 1.09672544e-06, 1.38282780e-06,\n", - " 1.16825106e-06, 1.45435331e-06, 1.16825106e-06,\n", - " 7.39097629e-07, 1.45435331e-06, 1.31130219e-06,\n", - " 1.31130219e-06, 7.39097629e-07, 1.02519994e-06,\n", - " 6.67572010e-07, 1.59740455e-06, 1.66893005e-06,\n", - " 1.45435331e-06, 1.81198118e-06, 1.16825106e-06,\n", - " 1.59740455e-06, 8.82148754e-07, 6.67572010e-07,\n", - " 1.59740455e-06, 1.31130219e-06, 1.59740455e-06,\n", - " 1.23977668e-06, 1.38282780e-06, 1.52587893e-06,\n", - " 9.53674316e-07, 1.52587893e-06, 6.67572010e-07,\n", - " 1.45435331e-06, 1.23977668e-06, 1.52587893e-06,\n", - " 8.82148754e-07, 6.67572010e-07, 1.09672544e-06,\n", - " 1.52587893e-06, 9.53674316e-07, 1.38282780e-06,\n", - " 1.59740455e-06, 1.52587893e-06, 1.59740455e-06,\n", - " 1.23977668e-06, 8.82148754e-07, 1.02519994e-06,\n", - " 1.74045567e-06, 1.09672544e-06, 1.66893005e-06,\n", - " 1.66893005e-06, 9.53674316e-07, 1.23977668e-06,\n", - " 1.52587893e-06, 1.45435331e-06, 1.16825106e-06,\n", - " 1.52587893e-06, 6.67572010e-07, 9.53674316e-07,\n", - " 1.16825106e-06, 1.45435331e-06, 7.39097629e-07,\n", - " 1.23977668e-06, 2.02655792e-06, 1.02519994e-06,\n", - " 9.53674316e-07, 1.45435331e-06, 1.09672544e-06,\n", - " 1.16825106e-06, 8.82148754e-07, 1.38282780e-06,\n", - " 1.16825106e-06, 1.16825106e-06, 1.59740455e-06,\n", - " 8.10623192e-07, 1.88350680e-06, 1.95503230e-06,\n", - " 1.52587893e-06, 1.52587893e-06, 1.59740455e-06,\n", - " 1.02519994e-06, 1.09672544e-06, 1.23977668e-06,\n", - " 1.45435331e-06, 1.16825106e-06, 1.31130219e-06,\n", - " 1.38282780e-06, 1.23977668e-06, 1.02519994e-06,\n", - " 1.38282780e-06, 1.81198118e-06, 1.59740455e-06,\n", - " 1.16825106e-06, 1.16825106e-06, 1.59740455e-06,\n", - " 1.59740455e-06, 1.38282780e-06, 6.67572010e-07,\n", - " 8.82148754e-07, 9.53674316e-07, 1.16825106e-06,\n", - " 1.52587893e-06, 8.82148754e-07, 1.23977668e-06,\n", - " 1.45435331e-06, 1.16825106e-06, 1.81198118e-06,\n", - " 1.02519994e-06, 1.38282780e-06, 1.23977668e-06,\n", - " 6.67572010e-07, 1.23977668e-06, 1.02519994e-06,\n", - " 1.09672544e-06, 6.67572010e-07, 6.67572010e-07,\n", - " 1.66893005e-06, 1.23977668e-06, 9.53674316e-07,\n", - " 1.31130219e-06, 1.31130219e-06, 1.52587893e-06,\n", - " 1.38282780e-06, 1.09672544e-06, 1.52587893e-06,\n", - " 1.31130219e-06, 7.39097629e-07, 7.39097629e-07,\n", - " 1.02519994e-06, 6.67572010e-07, 1.88350680e-06,\n", - " 1.31130219e-06, 1.02519994e-06, 8.82148754e-07,\n", - " 1.09672544e-06, 1.52587893e-06, 1.52587893e-06,\n", - " 6.67572010e-07, 1.52587893e-06, 1.52587893e-06,\n", - " 1.09672544e-06, 7.39097629e-07, 1.59740455e-06,\n", - " 1.45435331e-06, 1.59740455e-06, 1.59740455e-06,\n", - " 1.16825106e-06, 8.82148754e-07, 8.82148754e-07,\n", - " 6.67572010e-07, 1.31130219e-06, 2.09808354e-06,\n", - " 5.24520885e-07, 1.74045567e-06, 1.23977668e-06,\n", - " 1.02519994e-06, 1.31130219e-06, 1.02519994e-06,\n", - " 1.09672544e-06, 1.52587893e-06, 1.81198118e-06,\n", - " 1.09672544e-06, 5.96046448e-07, 1.16825106e-06,\n", - " 3.09944170e-07, 1.59740455e-06, 5.24520885e-07,\n", - " 1.09672544e-06, 1.88350680e-06, 1.38282780e-06,\n", - " 1.52587893e-06, 1.38282780e-06, 8.10623192e-07,\n", - " 1.38282780e-06, 5.96046448e-07, 1.31130219e-06,\n", - " 1.31130219e-06, 8.82148754e-07, 8.82148754e-07,\n", - " 1.16825106e-06, 1.02519994e-06, 1.38282780e-06,\n", - " 1.09672544e-06, 2.02655792e-06, 1.59740455e-06,\n", - " 1.59740455e-06, 1.52587893e-06, 1.74045567e-06,\n", - " 1.74045567e-06, 9.53674316e-07, 9.53674316e-07,\n", - " 1.38282780e-06, 1.31130219e-06, 1.59740455e-06,\n", - " 3.09944170e-07, 8.82148754e-07, 3.81469732e-07,\n", - " 2.02655792e-06, 1.74045567e-06, 1.09672544e-06,\n", - " 1.23977668e-06, 5.96046448e-07, 1.38282780e-06,\n", - " 9.53674316e-07, 1.52587893e-06, 1.31130219e-06,\n", - " 2.09808354e-06, 1.09672544e-06, 8.82148754e-07,\n", - " 8.10623192e-07, 1.02519994e-06, 1.81198118e-06,\n", - " 1.66893005e-06, 1.16825106e-06, 8.82148754e-07,\n", - " 1.09672544e-06, 1.09672544e-06, 1.16825106e-06,\n", - " 1.31130219e-06, 1.38282780e-06, 1.66893005e-06,\n", - " 1.52587893e-06, 8.82148754e-07, 3.09944170e-07,\n", - " 1.09672544e-06, 1.38282780e-06, 8.10623192e-07,\n", - " 1.81198118e-06, 1.59740455e-06, 1.52587893e-06,\n", - " 9.53674316e-07, 1.52587893e-06, 7.39097629e-07,\n", - " 1.52587893e-06, 2.09808354e-06, 1.66893005e-06,\n", - " 1.38282780e-06, 1.31130219e-06, 1.38282780e-06,\n", - " 1.31130219e-06, 1.45435331e-06, 9.53674316e-07,\n", - " 1.59740455e-06, 1.74045567e-06, 1.52587893e-06,\n", - " 5.24520885e-07, 1.16825106e-06, 9.53674316e-07,\n", - " 1.02519994e-06, 1.31130219e-06, 8.82148754e-07,\n", - " 9.53674316e-07, 5.96046448e-07, 1.45435331e-06,\n", - " 1.02519994e-06, 1.52587893e-06, 1.16825106e-06,\n", - " 1.23977668e-06, 1.38282780e-06, 1.52587893e-06,\n", - " 9.53674316e-07, 9.53674316e-07, 1.23977668e-06,\n", - " 5.96046448e-07, 1.02519994e-06, 1.09672544e-06,\n", - " 1.66893005e-06, 7.39097629e-07, 6.67572010e-07,\n", - " 7.39097629e-07, 1.38282780e-06, 2.31266017e-06,\n", - " 1.38282780e-06, 8.82148754e-07, 1.31130219e-06,\n", - " 1.52587893e-06, 1.31130219e-06, 5.96046448e-07,\n", - " 7.39097629e-07, 1.16825106e-06, 1.09672544e-06,\n", - " 9.53674316e-07, 6.67572010e-07, 1.31130219e-06,\n", - " 4.52995295e-07, 1.09672544e-06, 1.38282780e-06,\n", - " 1.81198118e-06, 9.53674316e-07, 1.66893005e-06,\n", - " 1.66893005e-06, 9.53674316e-07, 9.53674316e-07,\n", - " 7.39097629e-07, 1.02519994e-06, 1.31130219e-06,\n", - " 1.66893005e-06, 1.52587893e-06, 4.52995295e-07,\n", - " 8.10623192e-07, 9.53674316e-07, 5.24520885e-07,\n", - " 1.31130219e-06, 1.23977668e-06, 1.74045567e-06,\n", - " 1.52587893e-06, 9.53674316e-07, 1.31130219e-06,\n", - " 7.39097629e-07, 1.59740455e-06, 1.45435331e-06,\n", - " 1.66893005e-06, 7.39097629e-07, 9.53674316e-07,\n", - " 1.23977668e-06, 8.10623192e-07])\n", - "}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data.arrays" - ] - }, { "cell_type": "code", "execution_count": null, @@ -1430,5 +264,5 @@ bizWjo19cVzI8RiYUX5q3d7xDmcz0f1vbHvcumZZxkYd/Q3jo6biD/F8bjY+/Qxm6AwDCp9fDJcw6EMQ } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 2 } From 3198264e791d1d3ae313d4f217a2cd57360df65a Mon Sep 17 00:00:00 2001 From: WilliamHPNielsen Date: Thu, 28 Sep 2017 16:10:35 +0200 Subject: [PATCH 21/21] delete unused import --- qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py index c122414ae62..1c675245d4c 100644 --- a/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py +++ b/qcodes/instrument_drivers/tektronix/Keithley_2600_channels.py @@ -5,7 +5,7 @@ import qcodes as qc from qcodes import VisaInstrument, DataSet -from qcodes.instrument.channel import InstrumentChannel, ChannelList +from qcodes.instrument.channel import InstrumentChannel from qcodes.instrument.base import Instrument from qcodes.instrument.parameter import ArrayParameter import qcodes.utils.validators as vals