Biologic Potentiostat
- class nupylab.drivers.biologic.BiologicPotentiostat(model: str, address: str, eclib_path: str | None = None)
Bases:
objectDriver 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
ChannelInfosclass (typectypes.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
KBIODataobject 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:
objectClass 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_uint32used as the data buffer.c_data_infos –
DataInfosstructure.c_current_values –
CurrentValuesstructure.instrument – Instrument instance of
BiologicPotentiostat.
- Raises:
ECLibCustomException – Where the error codes indicate the following:
* -20000 means that the technique has no entry in –
TECHNIQUE_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:
objectBase 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
timefield, which must not be listed directly.Some techniques, like e.g.
PEISreturns data for two different processes. In this case data_fields is a list of dicts for each process. See the implementation ofPEISfor details.
All entries in the dict must point to a list of
DataFieldnamed tuples, where the two arguments are the name and the C type of the field, usuallyc_floatorc_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
TechniqueArgumentfailed the ‘in’ test * -10001 means that aTechniqueArgumentfailed the ‘>=’ test * -10002 means that aTechniqueArgumentfailed the ‘in_float_range’ test * -10003 means that aTechniqueArgumenthad 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:
TechniqueOpen 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_RANGESvariable 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:
TechniqueCyclic 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_RANGESvariable for possible values.e_range – A string describing the E range to use, see the
E_RANGESvariable for possible values.bandwidth – A string describing the bandwidth setting, see the
BANDWIDTHSvariable 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:
TechniqueCyclic 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_RANGESvariable for possible values.e_range – A string describing the E range to use, see the
E_RANGESvariable for possible values.bandwidth – A string describing the bandwidth setting, see the
BANDWIDTHSvariable 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:
TechniqueChrono-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_RANGESvariable for possible values.e_range – A string describing the E range to use, see the
E_RANGESvariable for possible values.bandwidth – A string describing the bandwidth setting, see the
BANDWIDTHSvariable 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:
TechniqueChrono-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_RANGESmodule variable for possible valuese_range (str) – A string describing the E range to use, see the
E_RANGESmodule variable for possible valuesbandwidth (str) – A string describing the bandwidth setting, see the
BANDWIDTHSmodule 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:
TechniqueConstant 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_RANGESmodule variable for possible valuese_range (str) – A string describing the E range to use, see the
E_RANGESmodule variable for possible valuesbandwidth (str) – A string describing the bandwidth setting, see the
BANDWIDTHSmodule 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:
TechniquePotentio 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
processproperty on theKBIODataobject.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_RANGESmodule variable for possible valuese_range (str) – A string describing the E range to use, see the
E_RANGESmodule variable for possible valuesbandwidth (str) – A string describing the bandwidth setting, see the
BANDWIDTHSmodule 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:
TechniqueStaircase 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
processproperty on theKBIODataobject.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_RANGESmodule variable for possible valuese_range (str) – A string describing the E range to use, see the
E_RANGESmodule variable for possible valuesbandwidth (str) – A string describing the bandwidth setting, see the
BANDWIDTHSmodule 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:
TechniqueGalvano 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
processproperty on theKBIODataobject.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_RANGESmodule variable for possible valuese_range (str) – A string describing the E range to use, see the
E_RANGESmodule variable for possible valuesbandwidth (str) – A string describing the bandwidth setting, see the
BANDWIDTHSmodule 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:
TechniqueStaircase 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
processproperty on theKBIODataobject.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_RANGESmodule variable for possible values.e_range – A string describing the E range to use, see the
E_RANGESmodule variable for possible values.bandwidth – A string describing the bandwidth setting, see the
BANDWIDTHSmodule 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'>)]}