Biologic Potentiostat

class nupylab.drivers.biologic.BiologicPotentiostat(model: str, address: str, eclib_path: str | None = None)

Bases: object

Driver for BioLogic potentiostats that can be controlled by the EC-_lib DLL.

Raises:

ECLibError – All regular methods in this class use the EC-_lib DLL communications library to talk with the equipment, and they will raise this exception if this library reports an error. It will not be explicitly mentioned in every single method.

Initialize the potentiostat driver.

Parameters:
  • model – The device model e.g. ‘SP200’

  • address – The address of the instrument, either IP address or ‘USB0’, ‘USB1’, etc.

  • eclib_path – The path to the directory containing the EClib DLL. The default directory of the DLL is C:EC-Lab Development PackageEC-Lab Development Package. If no value is given the default location will be used. The 32/64 bit status is inferred for selecting the proper DLL file.

Raises:

WindowsError – If the EClib DLL cannot be found

check_blfind_return_code(error_code: int) None

Check a BLFind return code and raise the appropriate exception.

check_eclib_return_code(error_code: int) None

Check a ECLib return code and raise the appropriate exception.

connect(timeout: int = 5) dict | None

Connect to the instrument and return the device info.

Parameters:

timeout – The connect timeout

Returns:

The device information as a dict or None if the device is not connected.

Raises:

ECLibCustomException if this class does not match the device type

convert_numeric_into_single(numeric: int) float

Convert a numeric (integer) into a float.

The buffer used to get data out of the device consist only of uint32s. The EClib library stores floats as an uint32 with integer values whose bit-representation corresponds to the float that it should describe. This function is used to convert the integer back to the corresponding float.

NOTE: This trick can also be performed with ctypes along the lines of: c_float.from_buffer(c_uint32(numeric)), but in this driver the library version is used.

Parameters:

numeric – The integer that represents a float.

Returns:

The float value.

define_bool_parameter(label: str, value: bool, index: int, tecc_param: TECCParam) None

Define a boolean TECCParam for a technique.

This is a library convenience function to fill out the TECCParam struct in the correct way for a boolean value.

Parameters:
  • label – The label of the parameter.

  • value – The boolean value for the parameter.

  • index – The index of the parameter.

  • tecc_param – A TECCParam struct.

define_integer_parameter(label: str, value: int, index: int, tecc_param: TECCParam) None

Define an integer TECCParam for a technique.

This is a library convenience function to fill out the TECCParam struct in the correct way for an integer value.

Parameters:
  • label – The label of the parameter.

  • value – The integer value for the parameter.

  • index – The index of the parameter.

  • tecc_param – A TECCParam struct.

define_single_parameter(label: str, value: float, index: int, tecc_param: TECCParam) None

Define a single (float) TECCParam for a technique.

This is a library convenience function to fill out the TECCParam struct in the correct way for a single (float) value.

Parameters:
  • label – The label of the parameter.

  • value – The float value for the parameter.

  • index – The index of the parameter.

  • tecc_param – A TECCParam struct.

property device_info: dict | None

Return the device information.

Returns:

The device information as a dict or None if the device is not connected.

disconnect() None

Disconnect from the device.

find_echem_dev() List[dict]

Find Biologic devices connected by ethernet or USB.

Returns:

list of device dictionaries, the fields of which depend on whether the device is connected by USB or ethernet.

Raises:

ECLibCustomException for errors parsing serialized message.

find_echem_eth_dev() List[dict]

Find Biologic devices connected by ethernet.

Returns:

list of device dictionaries.

Raises:

ECLibCustomException for errors parsing serialized message.

find_echem_usb_dev() List[dict]

Find Biologic devices connected by USB.

Returns:

list of device dictionaries.

Raises:

ECLibCustomException for errors parsing serialized message.

get_blfind_error_message(error_code: int) bytes

Return the error message corresponding to error_code.

Parameters:

error_code – The error number to translate.

Returns:

The error message corresponding to error_code.

Raises:

ECLibError if error message could not be retrieved.

get_channel_infos(channel: int) dict

Get information about the specified channel.

Parameters:

channel – Selected channel, zero based (0-15 on most devices).

Returns:

Channel infos dict. The dict is created by conversion from ChannelInfos class (type ctypes.Structure). See the documentation for that class for a list of available dict items. Besides the items listed, there are extra items for all the original items whose value can be converted from an integer code to a string. The keys for those values are suffixed by (translated).

get_channels_plugged() List[bool]

Get information about which channels are plugged.

Returns:

A list of channel plugged statuses as booleans.

get_current_values(channel: int) dict

Get the current values for the specified channel.

Parameters:

channel – The number of the channel (zero-based).

Returns:

A dict of current values information.

get_data(channel: int) KBIOData | None

Get data for the specified channel.

Parameters:

channel – The number of the channel (zero based).

Returns:

A KBIOData object or None if no data was available.

get_error_message(error_code: int) bytes

Return the error message corresponding to error_code.

Parameters:

error_code – The error number to translate.

Returns:

The error message corresponding to error_code.

Raises:

ECLibError if error message could not be retrieved.

get_lib_version() bytes

Return the version of the EClib communications library.

Returns:

The version string for the library.

get_message(channel: int) bytes

Return a message from the firmware of a channel.

property id_number: int | None

Return the device id as an integer.

is_channel_plugged(channel: int) bool

Test if the selected channel is plugged.

Parameters:

channel – Selected channel (0-15 on most devices).

Returns:

Whether the channel is plugged.

load_firmware(channels: Sequence[int], force_reload: bool = True) List[int]

Load the library firmware on the specified channels, if not already loaded.

Parameters:
  • channels – List with 1 integer per channel (usually 16) that indicates which channels the firmware should be loaded on (0=False and 1=True). NOTE: The length of the list corresponds to the number of channels supported by the equipment, not the number of channels installed.

  • force_reload – If True the firmware is forcefully reloaded, even if it was already loaded

Returns:

List of integers indicating the success of loading the firmware on the specified channel. 0 is success and negative values are errors, whose error message can be retrieved with the get_error_message method.

load_technique(channel: int, technique: Technique, first: bool = True, last: bool = True, display: bool = False) None

Load a technique on the specified channel.

Parameters:
  • channel – the number of the channel to load the technique onto, 0-15.

  • technique – the technique to load.

  • first – whether this technique is the first technique.

  • last – whether this technique is the last technique.

  • display – whether to display the loading progress.

Raises:

ECLibError – On errors from the EClib communications library.

set_ethernet_config(target_ip: str, new_ip: str | None = None, netmask: str | None = None, gateway: str | None = None) None

Set new TCP/IP parameters of selected instrument.

New parameters may be all or none of IP address, netmask, and gateway.

Parameters:
  • target_ip – current IP address of instrument to be configured.

  • new_ip – new IP address, optional.

  • netmask – new netmask, optional.

  • gateway – new gateway, optional.

start_channel(channel: int) None

Start the channel.

Parameters:

channel – The channel number, 0-15.

start_channels(channels: Sequence[int]) List[int]

Start the selected channels.

Parameters:

channels – Sequence with 1 integer per channel (usually 16) that indicates whether the channels will be started (0=False and 1=True). NOTE: The length of the list corresponds to the number of channels supported by the equipment, not the number of channels installed.

Returns:

List of integers indicating the success of starting the specified channel. 0 is success and negative values are errors, whose error message can be retrieved with the get_error_message method.

stop_channel(channel: int) None

Stop the channel.

Parameters:

channel – The channel number, 0-15.

stop_channels(channels: Sequence[int]) List[int]

Stop the selected channels.

Parameters:

channels – Sequence with 1 integer per channel (usually 16) that indicates whether the channels will be stopped (0=False and 1=True). NOTE: The length of the list corresponds to the number of channels supported by the equipment, not the number of channels installed.

Returns:

List of integers indicating the success of stopping the specified channel. 0 is success and negative values are errors, whose error message can be retrieved with the get_error_message method.

test_connection() None

Test the connection.

class nupylab.drivers.biologic.KBIOData(c_databuffer: Array[c_uint32], c_data_infos: DataInfos, c_current_values: CurrentValues, instrument: BiologicPotentiostat)

Bases: object

Class used to represent data obtained with a get_data call.

The data can be obtained as lists of floats through attributes on this class. The time is always available through the ‘time’ attribute. The attribute names for the rest of the data are the same as their names as listed in the field_names attribute. E.g:

  • kbio_data.Ewe

  • kbio_data.I

Provided that numpy is installed, the data can also be obtained as numpy arrays by appending ‘_numpy’ to the attribute name. E.g:

  • kbio_data.Ewe_numpy

  • kbio_data.I_numpy

Initialize the KBIOData object.

Parameters:
  • c_databuffer – ctypes array of ctypes.c_uint32 used as the data buffer.

  • c_data_infosDataInfos structure.

  • c_current_valuesCurrentValues structure.

  • instrument – Instrument instance of BiologicPotentiostat.

Raises:
  • ECLibCustomException – Where the error codes indicate the following:

  • * -20000 means that the technique has no entry inTECHNIQUE_IDENTIFIERS_TO_CLASS.

  • * -20001 means that the technique class has no data_fields class – variable.

  • * -20002 means that the data_fields class variables of the technique – does not contain the right information.

property data_field_names: List[str]

Return a list of data fields names (besides time).

class nupylab.drivers.biologic.Technique(args: tuple, technique_filename: str)

Bases: object

Base class for techniques.

All specific technique classes inherits from this class.

A specific technique that inherits from this class must define a data_fields class variable. It describes what the form of the data is that the technique can receive. The variable should be a dict or list of dicts:

  • Some techniques, like OCV, have different data fields depending on the series of the instrument. In these cases the dict must contain both a ‘vmp3’ and a ‘sp300’ key.

  • For cases where the instrument class distinction mentioned above does not exist, like e.g. for CV, one can simply define a ‘common’ key.

  • In most cases the first field of the returned data is a specially formatted time field, which must not be listed directly.

  • Some techniques, like e.g. PEIS returns data for two different processes. In this case data_fields is a list of dicts for each process. See the implementation of PEIS for details.

All entries in the dict must point to a list of DataField named tuples, where the two arguments are the name and the C type of the field, usually c_float or c_uint32. The list of fields must be in the order the data fields are specified in the EC-Lab Development package.

technique_filename

A string of the technique filename.

args

Tuple containing the Python version of the parameters, see __init__() for details.

Initialize a technique.

Parameters:
  • args – Tuple of technique arguments as TechniqueArgument instances.

  • technique_filename – The name of the technique filename. This must be the vmp3 series version, i.e. name.ecc NOT name4.ecc, the replacement of technique file names is taken care of in load technique

c_args(instrument: BiologicPotentiostat) Array[TECCParam]

Return the arguments struct.

Parameters:

instrument – Instrument instance of BiologicPotentiostat.

Returns:

A ctypes array of TECCParam

Raises:

ECLibCustomException – Where the error codes indicate the following: * -10000 means that a TechniqueArgument failed the ‘in’ test * -10001 means that a TechniqueArgument failed the ‘>=’ test * -10002 means that a TechniqueArgument failed the ‘in_float_range’ test * -10003 means that a TechniqueArgument had an unrecognized argument check * -10010 means that it was not possible to find a conversion function for the defined type * -10011 means that the value cannot be converted with the conversion function

data_fields: List[Dict[str, List[DataField]]]
class nupylab.drivers.biologic.OCV(duration: float = 10.0, record_every_de: float = 0.01, record_every_dt: float = 0.1, e_range: str = 'KBIO_ERANGE_AUTO')

Bases: Technique

Open Circuit Voltage (OCV) technique class.

The OCV technique returns data on fields (in order):

  • time (float)

  • Ewe (float)

  • Ece (float) (only VMP3 series hardware)

Initialize the OCV technique.

Parameters:
  • duration – The amount of time to rest (s).

  • record_every_de – Record every dE (V).

  • record_every_dt – Record evergy dt (s).

  • e_range – A string describing the E range to use, see the E_RANGES variable for possible values.

data_fields: List[Dict[str, List[DataField]]] = [{'vmp3': [DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='Ece', type=<class 'ctypes.c_float'>)], 'sp300': [DataField(name='Ewe', type=<class 'ctypes.c_float'>)]}]

Data fields definition

class nupylab.drivers.biologic.CV(voltage: Sequence = (0.0, 1.0, -1.0, 0.0), scan_rate: float = 10.0, vs_initial: bool = True, n_cycles: int = 0, record_every_de: float = 0.01, average_i_over_de: bool = True, begin_measuring_i: float = 0.5, end_measuring_i: float = 1.0, i_range: str = 'KBIO_IRANGE_AUTO', e_range: str = 'KBIO_ERANGE_2_5', bandwidth: str = 'KBIO_BW_5')

Bases: Technique

Cyclic Voltammetry (CV) technique class.

The CV technique returns data on fields (in order):

  • time (float)

  • Ec (float)

  • I (float)

  • Ewe (float)

  • cycle (int)

Initialize the CV technique:

E_we
^
|       E_1
|       /\
|      /  \
|     /    \      E_f
| E_i/      \    /
|            \  /
|             \/
|             E_2
+----------------------> t
Parameters:
  • voltage – Sequence of 4 floats (Ei, E1, E2, Ef) indicating the voltage steps (V), see diagram above.

  • scan_rate – Scan rate in mV/s.

  • vs_initial – Whether the current step is vs. the initial one.

  • n_cycles – The number of cycles.

  • record_every_de – Record every dE (V).

  • average_i_over_de – Whether averaging should be performed over dE.

  • begin_measuring_i – Begin step accumulation. 1 is 100% of step.

  • end_measuring_i – End step accumulation. 1 is 100% of step.

  • i_range – A string describing the I range, see the I_RANGES variable for possible values.

  • e_range – A string describing the E range to use, see the E_RANGES variable for possible values.

  • bandwidth – A string describing the bandwidth setting, see the BANDWIDTHS variable for possible values.

Raises:

ValueError – If voltage_step is not of length 4.

data_fields: List[Dict[str, List[DataField]]] = [{'common': [DataField(name='Ec', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='cycle', type=<class 'ctypes.c_uint'>)]}]
class nupylab.drivers.biologic.CVA(voltage: Sequence = (0.0, 1.0, -1.0, 0.0), scan_rate: float = 10.0, vs_initial: bool = True, n_cycles: int = 0, duration_step1: float = 10.0, duration_step2: float = 10.0, record_every_de: float = 0.01, record_every_dt: float = 0.1, record_every_di: float = 0.001, average_over_de: float = True, begin_measuring_i: float = 0.5, end_measuring_i: float = 1.0, trigger_on_off: bool = False, i_range: str = 'KBIO_IRANGE_AUTO', e_range: str = 'KBIO_ERANGE_2_5', bandwidth: str = 'KBIO_BW_5')

Bases: Technique

Cyclic Voltammetry Advanced (CVA) technique class.

The CVA technique returns data on fields (in order):

  • time (float)

  • Ec (float)

  • I (float)

  • Ewe (float)

  • cycle (int)

Initialize the CVA technique:

E_we
^
|    E_1 _______
|       /  t_1  \
|      /         \
|     /           \          E_f______________
| E_i/             \           /             |_______E_i
|                   \         /              |
|                    \__t_2__/               |
|                   E_2                      |
+--------------------------------------------+---------> t
                                             |
                                         trigger
Parameters:
  • voltage – Sequence of 4 floats (Ei, E1, E2, Ef) indicating the voltage steps (V), see diagram above.

  • scan_rate – Scan rate in mV/s.

  • vs_initial – Whether the current step is vs. the initial one.

  • n_cycles – The number of cycles.

  • duration_step1 – Duration to hold voltage at step 1 (s).

  • duration_step2 – Duration to hold voltage at step 2 (s).

  • record_every_de – Record every dE (V).

  • record_every_dt – Record every dt (s).

  • record_every_di – Record every dI (A).

  • average_over_de – Whether averaging should be performed over dE.

  • begin_measuring_i – Begin step accumulation, 1 is 100% of step.

  • end_measuring_i – Begin step accumulation, 1 is 100% of step.

  • trigger_on_off – A boolean indicating whether to use the trigger.

  • i_range – A string describing the I range, see the I_RANGES variable for possible values.

  • e_range – A string describing the E range to use, see the E_RANGES variable for possible values.

  • bandwidth – A string describing the bandwidth setting, see the BANDWIDTHS variable for possible values.

Raises:

ValueError – If voltage_step is not of length 4.

data_fields: List[Dict[str, List[DataField]]] = [{'common': [DataField(name='Ec', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='cycle', type=<class 'ctypes.c_uint'>)]}]
class nupylab.drivers.biologic.CP(current_step: Sequence = (0.005,), duration_step: Sequence = (10.0,), vs_initial: bool = False, n_cycles: int = 0, record_every_dt: float = 0.1, record_every_de: float = 0.001, i_range: str = 'KBIO_IRANGE_100uA', e_range: str = 'KBIO_ERANGE_2_5', bandwidth: str = 'KBIO_BW_5')

Bases: Technique

Chrono-Potentiometry (CP) technique class.

The CP technique returns data on fields (in order):

  • time (float)

  • Ewe (float)

  • I (float)

  • cycle (int)

Initialize the CP technique.

NOTE: The current_step and duration_step must be a sequence with the same length.

Parameters:
  • current_step – Sequence of floats indicating the current steps (A). See NOTE above.

  • duration_step – Sequence of floats indicating the duration of each step (s). See NOTE above.

  • vs_initial – Whether the current steps is vs. the initial one.

  • n_cycles – The number of times the technique is REPEATED. The default is 0 which means that the technique will be run once.

  • record_every_dt – Record every dt (s).

  • record_every_de – Record every dE (V).

  • i_range – A string describing the I range, see the I_RANGES variable for possible values.

  • e_range – A string describing the E range to use, see the E_RANGES variable for possible values.

  • bandwidth – A string describing the bandwidth setting, see the BANDWIDTHS variable for possible values.

Raises:

ValueError – On bad lengths for the list arguments

data_fields: List[Dict[str, List[DataField]]] = [{'common': [DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='cycle', type=<class 'ctypes.c_uint'>)]}]

Data fields definition

class nupylab.drivers.biologic.CA(voltage_step=(0.5,), duration_step=(10.0,), vs_initial=False, n_cycles=0, record_every_dt=0.1, record_every_di=5e-06, i_range='KBIO_IRANGE_AUTO', e_range='KBIO_ERANGE_2_5', bandwidth='KBIO_BW_5')

Bases: Technique

Chrono-Amperometry (CA) technique class.

The CA technique returns data on fields (in order):

  • time (float)

  • Ewe (float)

  • I (float)

  • cycle (int)

Initialize the CA technique.

NOTE: The voltage_step and duration_step must be a sequence with the same length.

Parameters:
  • voltage_step (list) – Sequence of floats indicating the voltage steps (V). See NOTE above.

  • duration_step (list) – Sequence of floats indicating the duration of each step (s). See NOTE above.

  • vs_initial (boolean) – Whether the current step is vs. the initial one.

  • n_cycles – The number of times the technique is REPEATED. NOTE: This means that the default value is 0 which means that the technique will be run once.

  • record_every_dt – Record every dt (s)

  • record_every_di – Record every dI (A)

  • i_range (str) – A string describing the I range, see the I_RANGES module variable for possible values

  • e_range (str) – A string describing the E range to use, see the E_RANGES module variable for possible values

  • bandwidth (str) – A string describing the bandwidth setting, see the BANDWIDTHS module variable for possible values

Raises:

ValueError – On bad lengths for the list arguments

data_fields: List[Dict[str, List[DataField]]] = [{'common': [DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='cycle', type=<class 'ctypes.c_uint'>)]}]
class nupylab.drivers.biologic.CPOWER(power_step=(0.1,), duration_step=(10.0,), vs_initial=False, n_cycles=0, record_every_dt=0.1, record_every_de=0.1, i_range='KBIO_IRANGE_1mA', e_range='KBIO_ERANGE_AUTO', bandwidth='KBIO_BW_5')

Bases: Technique

Constant Power (CPOWER) technique class. Only available on VMP3 series.

The CPOWER technique returns data on fields (in order):

  • time (float)

  • Ewe (float)

  • I (float)

  • P (float)

  • cycle (int)

Initialize the CPOWER technique.

NOTE: The power_step and duration_step must be a list or tuple with the same length.

Parameters:
  • power_step (list) – Sequence of floats indicating the power steps (W). See NOTE above.

  • duration_step (list) – Sequence of floats indicating the duration of each step (s). See NOTE above.

  • vs_initial (boolean) – Whether the current steps is vs. the initial one.

  • n_cycles – The number of times the technique is REPEATED. NOTE: This means that the default value is 0 which means that the technique will be run once.

  • record_every_dt – Record every dt (s)

  • record_every_de – Record every dE (V)

  • i_range (str) – A string describing the I range, see the I_RANGES module variable for possible values

  • e_range (str) – A string describing the E range to use, see the E_RANGES module variable for possible values

  • bandwidth (str) – A string describing the bandwidth setting, see the BANDWIDTHS module variable for possible values

Raises:

ValueError – On bad lengths for the list arguments

data_fields: List[Dict[str, List[DataField]]] = [{'common': [DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='P', type=<class 'ctypes.c_float'>), DataField(name='cycle', type=<class 'ctypes.c_uint'>)]}]
class nupylab.drivers.biologic.PEIS(initial_voltage_step=0, duration_step=5.0, vs_initial=False, initial_frequency=100000.0, final_frequency=1.0, logarithmic_spacing=True, amplitude_voltage=0.01, frequency_number=51, average_n_times=1, wait_for_steady=1.0, drift_correction=False, record_every_dt=0.1, record_every_di=0.1, i_range='KBIO_IRANGE_AUTO', e_range='KBIO_ERANGE_2_5', bandwidth='KBIO_BW_5')

Bases: Technique

Potentio Electrochemical Impedance Spectroscopy (PEIS) technique class.

The PEIS technique returns data with a different set of fields depending on which process steps it is in. If it is in process step 0 it returns data on the following fields (in order):

  • time (float)

  • Ewe (float)

  • I (float)

If it is in process 1 it returns data on the following fields:

  • freq (float)

  • abs_Ewe (float)

  • abs_I (float)

  • Phase_Zwe (float)

  • Ewe (float)

  • I (float)

  • abs_Ece (float)

  • abs_Ice (float)

  • Phase_Zce (float)

  • Ece (float)

  • t (float)

  • Irange (float) (VMP series only)

Which process it is in, can be checked with the process property on the KBIOData object.

Initialize the PEIS technique.

Parameters:
  • initial_voltage_step – Before eis, initial voltage step (V)

  • duration_step – Duration to hold voltage before eis (s)

  • vs_initial – Whether the voltage step is vs. the initial one

  • initial_frequency – The initial frequency (Hz)

  • final_frequency – The final frequency (Hz)

  • logarithmic_spacing – Logarithmic/linear frequency spacing (True for logarithmic points spacing)

  • amplitude_voltage – Amplitude of sinus (V)

  • frequency_number – The number of frequencies

  • average_n_times – The number of repeat times used for frequency averaging

  • wait_for_steady – The number of periods to wait before each frequency

  • drift_correction – Non-stationary drift correction

  • record_every_dt – Record every dt (s)

  • record_every_di – Record every dI (A)

  • i_range (str) – A string describing the I range, see the I_RANGES module variable for possible values

  • e_range (str) – A string describing the E range to use, see the E_RANGES module variable for possible values

  • bandwidth (str) – A string describing the bandwidth setting, see the BANDWIDTHS module variable for possible values

data_fields: List[Dict[str, List[DataField]]] = [{'common': [DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>)]}, {'vmp3': [DataField(name='freq', type=<class 'ctypes.c_float'>), DataField(name='abs_Ewe', type=<class 'ctypes.c_float'>), DataField(name='abs_I', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zwe', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Blank0', type=<class 'ctypes.c_float'>), DataField(name='abs_Ece', type=<class 'ctypes.c_float'>), DataField(name='abs_Ice', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zce', type=<class 'ctypes.c_float'>), DataField(name='Ece', type=<class 'ctypes.c_float'>), DataField(name='Blank1', type=<class 'ctypes.c_float'>), DataField(name='Blank2', type=<class 'ctypes.c_float'>), DataField(name='t', type=<class 'ctypes.c_float'>), DataField(name='Irange', type=<class 'ctypes.c_uint'>)], 'sp300': [DataField(name='freq', type=<class 'ctypes.c_float'>), DataField(name='abs_Ewe', type=<class 'ctypes.c_float'>), DataField(name='abs_I', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zwe', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Blank0', type=<class 'ctypes.c_float'>), DataField(name='abs_Ece', type=<class 'ctypes.c_float'>), DataField(name='abs_Ice', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zce', type=<class 'ctypes.c_float'>), DataField(name='Ece', type=<class 'ctypes.c_float'>), DataField(name='Blank1', type=<class 'ctypes.c_float'>), DataField(name='Blank2', type=<class 'ctypes.c_float'>), DataField(name='t', type=<class 'ctypes.c_float'>)]}]
process0_data_fields = {'common': [DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>)]}
process1_data_fields = {'sp300': [DataField(name='freq', type=<class 'ctypes.c_float'>), DataField(name='abs_Ewe', type=<class 'ctypes.c_float'>), DataField(name='abs_I', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zwe', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Blank0', type=<class 'ctypes.c_float'>), DataField(name='abs_Ece', type=<class 'ctypes.c_float'>), DataField(name='abs_Ice', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zce', type=<class 'ctypes.c_float'>), DataField(name='Ece', type=<class 'ctypes.c_float'>), DataField(name='Blank1', type=<class 'ctypes.c_float'>), DataField(name='Blank2', type=<class 'ctypes.c_float'>), DataField(name='t', type=<class 'ctypes.c_float'>)], 'vmp3': [DataField(name='freq', type=<class 'ctypes.c_float'>), DataField(name='abs_Ewe', type=<class 'ctypes.c_float'>), DataField(name='abs_I', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zwe', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Blank0', type=<class 'ctypes.c_float'>), DataField(name='abs_Ece', type=<class 'ctypes.c_float'>), DataField(name='abs_Ice', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zce', type=<class 'ctypes.c_float'>), DataField(name='Ece', type=<class 'ctypes.c_float'>), DataField(name='Blank1', type=<class 'ctypes.c_float'>), DataField(name='Blank2', type=<class 'ctypes.c_float'>), DataField(name='t', type=<class 'ctypes.c_float'>), DataField(name='Irange', type=<class 'ctypes.c_uint'>)]}
class nupylab.drivers.biologic.SPEIS(initial_voltage_step=0.0, duration_step=10.0, final_voltage_step=0.1, vs_initial=False, step_number=10, initial_frequency=100000.0, final_frequency=1.0, logarithmic_spacing=True, amplitude_voltage=0.01, frequency_number=51, average_n_times=1, wait_for_steady=1.0, drift_correction=False, record_every_dt=0.1, record_every_di=0.1, i_range='KBIO_IRANGE_AUTO', e_range='KBIO_ERANGE_2_5', bandwidth='KBIO_BW_5')

Bases: Technique

Staircase Potentio Electrochemical Impedance Spectroscopy (SPEIS) technique class.

The SPEIS technique returns data with a different set of fields depending on which process steps it is in. If it is in process step 0 it returns data on the following fields (in order):

  • time (float)

  • Ewe (float)

  • I (float)

  • step (int)

If it is in process 1 it returns data on the following fields:

  • freq (float)

  • abs_Ewe (float)

  • abs_I (float)

  • Phase_Zwe (float)

  • Ewe (float)

  • I (float)

  • abs_Ece (float)

  • abs_Ice (float)

  • Phase_Zce (float)

  • Ece (float)

  • t (float)

  • Irange (float) (VMP series only)

  • step (float)

Which process it is in, can be checked with the process property on the KBIOData object.

Initialize the SPEIS technique.

Parameters:
  • initial_voltage_step – Initial voltage step before eis (V)

  • duration_step – Duration of step (s)

  • final_voltage_step – Final voltage step after eis (V)

  • vs_initial – Whether the voltage step is vs. the initial one

  • step_number – The number of voltage steps

  • initial_frequency – The initial frequency (Hz)

  • final_frequency – The final frequency (Hz)

  • logarithmic_spacing – Logarithmic/linear frequency spacing (True for logarithmic points spacing)

  • amplitude_voltage – Amplitude of sinus (V)

  • frequency_number – The number of frequencies

  • average_n_times – The number of repeat times used for frequency averaging

  • wait_for_steady – The number of periods to wait before each frequency

  • drift_correction – Non-stationary drift correction

  • record_every_dt – Record every dt (s)

  • record_every_di – Record every dI (A)

  • i_range (str) – A string describing the I range, see the I_RANGES module variable for possible values

  • e_range (str) – A string describing the E range to use, see the E_RANGES module variable for possible values

  • bandwidth (str) – A string describing the bandwidth setting, see the BANDWIDTHS module variable for possible values

data_fields: List[Dict[str, List[DataField]]] = [{'common': [DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='step', type=<class 'ctypes.c_uint'>)]}, {'vmp3': [DataField(name='freq', type=<class 'ctypes.c_float'>), DataField(name='abs_Ewe', type=<class 'ctypes.c_float'>), DataField(name='abs_I', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zwe', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Blank0', type=<class 'ctypes.c_float'>), DataField(name='abs_Ece', type=<class 'ctypes.c_float'>), DataField(name='abs_Ice', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zce', type=<class 'ctypes.c_float'>), DataField(name='Ece', type=<class 'ctypes.c_float'>), DataField(name='Blank1', type=<class 'ctypes.c_float'>), DataField(name='Blank2', type=<class 'ctypes.c_float'>), DataField(name='t', type=<class 'ctypes.c_float'>), DataField(name='Irange', type=<class 'ctypes.c_uint'>), DataField(name='step', type=<class 'ctypes.c_uint'>)], 'sp300': [DataField(name='freq', type=<class 'ctypes.c_float'>), DataField(name='abs_Ewe', type=<class 'ctypes.c_float'>), DataField(name='abs_I', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zwe', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Blank0', type=<class 'ctypes.c_float'>), DataField(name='abs_Ece', type=<class 'ctypes.c_float'>), DataField(name='abs_Ice', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zce', type=<class 'ctypes.c_float'>), DataField(name='Ece', type=<class 'ctypes.c_float'>), DataField(name='Blank1', type=<class 'ctypes.c_float'>), DataField(name='Blank2', type=<class 'ctypes.c_float'>), DataField(name='t', type=<class 'ctypes.c_float'>), DataField(name='step', type=<class 'ctypes.c_uint'>)]}]
class nupylab.drivers.biologic.GEIS(initial_current_step=0.0, duration_step=5.0, vs_initial=False, initial_frequency=100000.0, final_frequency=1.0, logarithmic_spacing=True, amplitude_current=0.05, frequency_number=51, average_n_times=1, wait_for_steady=1.0, drift_correction=False, record_every_dt=0.1, record_every_de=0.1, i_range='KBIO_IRANGE_1mA', e_range='KBIO_ERANGE_AUTO', bandwidth='KBIO_BW_5')

Bases: Technique

Galvano Electrochemical Impedance Spectroscopy (GEIS) technique class.

The GEIS technique returns data with a different set of fields depending on which process steps it is in. If it is in process step 0 it returns data on the following fields (in order):

  • time (float)

  • Ewe (float)

  • I (float)

If it is in process 1 it returns data on the following fields:

  • freq (float)

  • abs_Ewe (float)

  • abs_I (float)

  • Phase_Zwe (float)

  • Ewe (float)

  • I (float)

  • abs_Ece (float)

  • abs_Ice (float)

  • Phase_Zce (float)

  • Ece (float)

  • t (float)

  • Irange (float) (VMP series only)

Which process it is in, can be checked with the process property on the KBIOData object.

Initialize the GEIS technique.

Parameters:
  • initial_current_step – Initial current step before eis (A)

  • duration_step – Duration of step (s)

  • vs_initial – Whether the voltage step is vs. the initial one

  • initial_frequency – The initial frequency (Hz)

  • final_frequency – The final frequency (Hz)

  • logarithmic_spacing – Logarithmic/linear frequency spacing (True for logarithmic points spacing)

  • amplitude_current – Amplitude of sinus (A)

  • frequency_number – The number of frequencies

  • average_n_times – The number of repeat times used for frequency averaging

  • wait_for_steady – The number of periods to wait before each frequency

  • drift_correction – Non-stationary drift correction

  • record_every_dt – Record every dt (s)

  • record_every_de – Record every dE (V)

  • i_range (str) – A string describing the I range, see the I_RANGES module variable for possible values

  • e_range (str) – A string describing the E range to use, see the E_RANGES module variable for possible values

  • bandwidth (str) – A string describing the bandwidth setting, see the BANDWIDTHS module variable for possible values

data_fields: List[Dict[str, List[DataField]]]
process0_data_fields = {'common': [DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>)]}
process1_data_fields = {'sp300': [DataField(name='freq', type=<class 'ctypes.c_float'>), DataField(name='abs_Ewe', type=<class 'ctypes.c_float'>), DataField(name='abs_I', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zwe', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Blank0', type=<class 'ctypes.c_float'>), DataField(name='abs_Ece', type=<class 'ctypes.c_float'>), DataField(name='abs_Ice', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zce', type=<class 'ctypes.c_float'>), DataField(name='Ece', type=<class 'ctypes.c_float'>), DataField(name='Blank1', type=<class 'ctypes.c_float'>), DataField(name='Blank2', type=<class 'ctypes.c_float'>), DataField(name='t', type=<class 'ctypes.c_float'>)], 'vmp3': [DataField(name='freq', type=<class 'ctypes.c_float'>), DataField(name='abs_Ewe', type=<class 'ctypes.c_float'>), DataField(name='abs_I', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zwe', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Blank0', type=<class 'ctypes.c_float'>), DataField(name='abs_Ece', type=<class 'ctypes.c_float'>), DataField(name='abs_Ice', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zce', type=<class 'ctypes.c_float'>), DataField(name='Ece', type=<class 'ctypes.c_float'>), DataField(name='Blank1', type=<class 'ctypes.c_float'>), DataField(name='Blank2', type=<class 'ctypes.c_float'>), DataField(name='t', type=<class 'ctypes.c_float'>), DataField(name='Irange', type=<class 'ctypes.c_uint'>)]}
class nupylab.drivers.biologic.SGEIS(initial_current_step: float = 0.0, duration_step: float = 10.0, final_current_step: float = 0.1, vs_initial: bool = False, step_number: int = 10, initial_frequency: float = 100000.0, final_frequency: float = 1.0, logarithmic_spacing: bool = True, amplitude_current: float = 0.01, frequency_number: int = 51, average_n_times: int = 1, wait_for_steady: float = 1.0, drift_correction: bool = False, record_every_dt: float = 0.1, record_every_de: float = 0.1, i_range: str = 'KBIO_IRANGE_1mA', e_range: str = 'KBIO_ERANGE_AUTO', bandwidth: str = 'KBIO_BW_5')

Bases: Technique

Staircase Galvano Electrochemical Impedance Spectroscopy (SGEIS) technique class.

The SGEIS technique returns data with a different set of fields depending on which process steps it is in. If it is in process step 0 it returns data on the following fields (in order):

  • time (float)

  • Ewe (float)

  • I (float)

  • step (int)

If it is in process 1 it returns data on the following fields:

  • freq (float)

  • abs_Ewe (float)

  • abs_I (float)

  • Phase_Zwe (float)

  • Ewe (float)

  • I (float)

  • abs_Ece (float)

  • abs_Ice (float)

  • Phase_Zce (float)

  • Ece (float)

  • t (float)

  • Irange (float) (VMP series only)

  • step (float)

Which process it is in, can be checked with the process property on the KBIOData object.

Initialize the SPEIS technique.

Parameters:
  • initial_current_step – Initial current step before eis (A)

  • duration_step – Duration of step (s).

  • final_current_step – Final current step after eis (V).

  • vs_initial – Whether the current step is vs. the initial one.

  • step_number – The number of current steps.

  • initial_frequency – The initial frequency (Hz).

  • final_frequency – The final frequency (Hz).

  • logarithmic_spacing – Logarithmic/linear frequency spacing. True for logarithmic points spacing.

  • amplitude_current – Amplitude of sinus (A).

  • frequency_number – The number of frequencies.

  • average_n_times – The number of repeat times used for frequency averaging.

  • wait_for_steady – The number of periods to wait before each frequency.

  • drift_correction – Non-stationary drift correction.

  • record_every_dt – Record every dt (s).

  • record_every_de – Record every dE (V).

  • i_range – A string describing the I range, see the I_RANGES module variable for possible values.

  • e_range – A string describing the E range to use, see the E_RANGES module variable for possible values.

  • bandwidth – A string describing the bandwidth setting, see the BANDWIDTHS module variable for possible values.

data_fields: List[Dict[str, List[DataField]]] = [{'common': [DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='step', type=<class 'ctypes.c_uint'>)]}, {'vmp3': [DataField(name='freq', type=<class 'ctypes.c_float'>), DataField(name='abs_Ewe', type=<class 'ctypes.c_float'>), DataField(name='abs_I', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zwe', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Blank0', type=<class 'ctypes.c_float'>), DataField(name='abs_Ece', type=<class 'ctypes.c_float'>), DataField(name='abs_Ice', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zce', type=<class 'ctypes.c_float'>), DataField(name='Ece', type=<class 'ctypes.c_float'>), DataField(name='Blank1', type=<class 'ctypes.c_float'>), DataField(name='Blank2', type=<class 'ctypes.c_float'>), DataField(name='t', type=<class 'ctypes.c_float'>), DataField(name='Irange', type=<class 'ctypes.c_uint'>), DataField(name='step', type=<class 'ctypes.c_uint'>)], 'sp300': [DataField(name='freq', type=<class 'ctypes.c_float'>), DataField(name='abs_Ewe', type=<class 'ctypes.c_float'>), DataField(name='abs_I', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zwe', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Blank0', type=<class 'ctypes.c_float'>), DataField(name='abs_Ece', type=<class 'ctypes.c_float'>), DataField(name='abs_Ice', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zce', type=<class 'ctypes.c_float'>), DataField(name='Ece', type=<class 'ctypes.c_float'>), DataField(name='Blank1', type=<class 'ctypes.c_float'>), DataField(name='Blank2', type=<class 'ctypes.c_float'>), DataField(name='t', type=<class 'ctypes.c_float'>), DataField(name='step', type=<class 'ctypes.c_uint'>)]}]
process0_data_fields = {'common': [DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='step', type=<class 'ctypes.c_uint'>)]}
process1_data_fields = {'sp300': [DataField(name='freq', type=<class 'ctypes.c_float'>), DataField(name='abs_Ewe', type=<class 'ctypes.c_float'>), DataField(name='abs_I', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zwe', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Blank0', type=<class 'ctypes.c_float'>), DataField(name='abs_Ece', type=<class 'ctypes.c_float'>), DataField(name='abs_Ice', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zce', type=<class 'ctypes.c_float'>), DataField(name='Ece', type=<class 'ctypes.c_float'>), DataField(name='Blank1', type=<class 'ctypes.c_float'>), DataField(name='Blank2', type=<class 'ctypes.c_float'>), DataField(name='t', type=<class 'ctypes.c_float'>), DataField(name='step', type=<class 'ctypes.c_uint'>)], 'vmp3': [DataField(name='freq', type=<class 'ctypes.c_float'>), DataField(name='abs_Ewe', type=<class 'ctypes.c_float'>), DataField(name='abs_I', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zwe', type=<class 'ctypes.c_float'>), DataField(name='Ewe', type=<class 'ctypes.c_float'>), DataField(name='I', type=<class 'ctypes.c_float'>), DataField(name='Blank0', type=<class 'ctypes.c_float'>), DataField(name='abs_Ece', type=<class 'ctypes.c_float'>), DataField(name='abs_Ice', type=<class 'ctypes.c_float'>), DataField(name='Phase_Zce', type=<class 'ctypes.c_float'>), DataField(name='Ece', type=<class 'ctypes.c_float'>), DataField(name='Blank1', type=<class 'ctypes.c_float'>), DataField(name='Blank2', type=<class 'ctypes.c_float'>), DataField(name='t', type=<class 'ctypes.c_float'>), DataField(name='Irange', type=<class 'ctypes.c_uint'>), DataField(name='step', type=<class 'ctypes.c_uint'>)]}