Name | easy-biologic JSON |
Version |
0.4.0
JSON |
| download |
home_page | None |
Summary | Controller class for communicating with BioLogic devices. |
upload_time | 2024-07-18 18:06:37 |
maintainer | None |
docs_url | None |
author | Brian Carlsen |
requires_python | >=3.7 |
license | None |
keywords |
biologic
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# Easy Biologic
A library allowing easy control over BioLogic devices.
High and low level control over Biologic devices are available.
Low level control is included in the `lib` subpackage, while high level control
is available in the main module.
> Install with `python -m pip install easy-biologic`
## High Level API
There are two high level API modules containing three classes, and two convenience modules.
### Biologic Device
Represents an instance of a Biologic Device.
#### Methods
+ **BiologicDevice( address, timeout = 5 ):** Creates a new Biologic Device representing the device conencted at `address`.
+ **connect( bin_file, xlx_file ):** Connects to the device, loading the bin and xlx file if provided.
+ **disconnect():** Disconnects from the device.
+ **is_connected():** Whether the device is connected or not.
+ **load_technique( ch, technique, params, index = 0, last = True, types = none ):** Loads a technique onto the given device channel.
+ **load_techniques( ch, techniques, parameters, types = None ):** Loads a series of techniques onto the given device channel.
+ **update_parameters( ch, technique, parameters, index = 0, types = None ):** Update the parameters of the given technqiue on the specified device channel.
+ **start_channel( ch ):** Starts the given channel.
+ **start_channels( chs = None ):** Starts multiple channels.
+ **stop_channel( ch ):** Stops the given channel.
+ **stop_channels( chs = None ):** Stops the given channels.
+ **channel_info( ch ):** Returns information about the given channel.
+ **channel_configuration( ch ):** Returns configuration information of the channel.
+ **set_channel_configuration( ch, mode, conneciton ):** Sets the channel's hardware configuration.
+ **get_values( ch ):** Returns current values of the given channel.
+ **get_data( ch ):** Returns buffered data of the given channel.
#### Properties
+ **address:** Connection address of the device.
+ **idn:** ID of the device.
+ **kind:** Device model.
+ **info:** DeviceInfo structure.
+ **plugged:** List of available channels.
+ **channels:** List of ChannelInfo structures.
+ **hardware_configuration:** Dictionary of HardwareConfiguration for each channel.
+ **techniques:** List of TechParams loaded on each channel.
### Biologic Program
`Abstract Class`
Represents a program to be run on a device.
#### Methods
+ **BiologicProgram( device, params, channels = None, autoconnect = True, barrier = None, stop_event = None, threaded = False ):** Creates a new program.
+ **channel_state( channels = None ):** Returns the state of the channels.
+ **on_data( callback, index = None ):** Registers a callback function to run when data is collected.
+ **run():** Runs the program.
+ **stop():** Sets the stop event flag.
+ **save_data( file, append = False, by_channel = False ):** Saves data to the given file.
+ **sync():** Waits for barrier, if set.
+ **_connect():** Connects to the device
#### Properties
+ **device:** BiologicDevice. <br>
+ **params:** Passed in parameters. <br>
+ **channels:** Device channels. <br>
+ **autoconnect:** Whether connection to the device should be automatic or + not. <br>
+ **barrier:** A threading.Barrier to use for channel syncronization. [See ProgramRummer] <br>
+ **field_titles:** Column names for saving data. <br>
+ **data:** Data collected during the program. <br>
+ **status:** Status of the program. <br>
+ **fields:** Data fields teh program returns. <br>
+ **technqiues:** List of techniques the program uses.
### Program Runner
Represents a program to be run on a device channel.
#### Methods
+ **ProgramRunner( programs, sync = False ):** Creates a new program runner.
+ **start():** Runs the programs.
+ **wait():** Wait for all threads to finish.
+ **stop():** Sets stop event.
#### Properties
+ **threads:** List of threads for each program. <br>
+ **sync:** Whether to sync the threads or not.
### Base Programs
Contains basic implementations of BiologicPrograms.
#### OCV
##### Params
+ **time:** Run time in seconds.
+ **time_interval:** Maximum time between readings.
[Default: 1]
+ **voltage_interval:** Maximum interval between voltage readings.
[Default: 0.01]
#### CA
##### Params
+ **voltages:** List of voltages.
+ **durations:** List of times in seconds.
+ **vs_initial:** If step is vs. initial or previous.
[Default: False]
+ **time_interval:** Maximum time interval between points.
[Default: 1]
+ **current_interval:** Maximum current change between points.
[Default: 0.001]
+ **current_range:** Current range. Use ec_lib.IRange.
[Default: IRange.m10 ]
##### Methods
+ **update_voltage( voltages, durations = None, vs_initial = None ):** Updates the voltage.
#### CALimit
##### Params
+ **voltages:** List of voltages.
+ **durations:** List of times in seconds.
+ **vs_initial:** If step is vs. initial or previous.
[Default: False]
+ **time_interval:** Maximum time interval between points.
[Default: 1]
+ **current_interval:** Maximum current change between points.
[Default: 0.001]
+ **current_range:** Current range. Use ec_lib.IRange.
[Default: IRange.m10 ]
##### Methods
+ **update_voltage( voltages, durations = None, vs_initial = None ):** Updates the voltage.
#### PEIS
##### Params
+ **voltage:** Initial potential in Volts.
+ **amplitude_voltage:** Sinus amplitude in Volts.
+ **initial_frequency**: Initial frequency in Hertz.
+ **final_frequency:** Final frequency in Hertz.
+ **frequency_number:** Number of frequencies.
+ **duration:** Overall duration in seconds.
+ **vs_initial:** If step is vs. initial or previous.
[Default: False]
+ **time_interval:** Maximum time interval between points in seconds.
[Default: 1]
+ **current_interval:** Maximum time interval between points in Amps.
[Default: 0.001]
+ **sweep:** Defines whether the spacing between frequencies is logarithmic ('log') or linear ('lin').
[Default: 'log']
+ **repeat:** Number of times to repeat the measurement and average the values for each frequency.
[Default: 1]
+ **correction:** Drift correction.
[Default: False]
+ **wait:** Adds a delay before the measurement at each frequency. The delay is expressed as a fraction of the period.
[Default: 0]
#### GEIS
Performs a Galvanostatic Electrochemical Impedance Spectroscopy
##### Params
+ **current:** Initial current in Ampere.
+ **amplitude_current:** Sinus amplitude in Ampere.
+ **initial_frequency**: Initial frequency in Hertz.
+ **final_frequency:** Final frequency in Hertz.
+ **frequency_number:** Number of frequencies.
+ **duration:** Overall duration in seconds.
+ **vs_initial:** If step is vs. initial or previous.
[Default: False]
+ **time_interval:** Maximum time interval between points in seconds.
[Default: 1]
+ **current_interval:** Maximum time interval between points in Amps.
[Default: 0.001]
+ **sweep:** Defines whether the spacing between frequencies is logarithmic ('log') or linear ('lin').
[Default: 'log']
+ **repeat:** Number of times to repeat the measurement and average the values for each frequency.
[Default: 1]
+ **correction:** Drift correction.
[Default: False]
+ **wait:** Adds a delay before the measurement at each frequency. The delay is expressed as a fraction of the period.
[Default: 0]
#### CV
Performs a CV scan.
##### Params
+ **start:** Start voltage.
[Default: 0]
+ **end:** End voltage. Boundary voltage in forward scan.
[Default: 0.5]
+ **E2** Boundary voltage in backward scan.
[Default: 0]
+ **Ef** End voltage in the final cycle scan
[Default: 0]
+ **step:** Voltage step. dEN/1000
[Default: 0.01]
+ **rate:** Scan rate in V/s.
[Default: 0.01]
+ **average:** Average over points.
[Default: False]
#### MPP_Tracking
Performs MPP tracking.
##### Params
+ **run_time:** Run time in seconds.
+ **init_vmpp:** Initial v_mpp.
+ **probe_step:** Voltage step for probe.
[Default: 0.01 V]
+ **probe_points:** Number of data points to collect for probe.
[Default: 5]
+ **probe_interval:** How often to probe in seconds.
[Default: 2]
+ **record_interval:** How often to record a data point in seconds.
[Default: 1]
#### MPP
Runs MPP tracking, finding the initial Vmpp by first measuring Voc, then performing a CV scan from 0 to Voc.
##### Params
+ **run_time:** Run time in seconds.
+ **probe_step:** Voltage step for probe.
[Default: 0.01 V]
+ **probe_points:** Number of data points to collect for probe.
[Default: 5]
+ **probe_interval:** How often to probe in seconds.
[Default: 2]
+ **record_interval:** How often to record a data point in seconds.
[Default: 1]
#### MPP Cycles
Runs multiple MPP cycles, performing Voc and CV scans at the beginning of each.
##### Params
+ **run_time:** Run time in seconds
+ **scan_interval:** How often to perform a CV scan.
+ **probe_step:** Voltage step for probe. [Default: 0.01 V]
+ **probe_points:** Number of data points to collect for probe. [Default: 5]
+ **probe_interval:** How often to probe in seconds. [Default: 2]
+ **record_interval:** How often to record a data point in seconds. [Default: 1]
### Find Devices
A convenience script for finding connected devices.
#### Use
From a terminal run `python -m easy_biologic.find_devices`.
## Low Level API
The low level API gives direct control of the Biologic device using the provided DLL libraries. The subpackage contains five modules.
### EC Lib
Contains methods converting the `BL_*` DLL functions for use, enumeration classes to encapsulate program and device states, and C Structures for sending and receiving data from th device.
#### Methods
+ **connect( address, timeout = 5 ):** Connects to the device at the given address.
+ **disconnect( idn ):** Disconnects given device.
+ **is_connected( address ):** Checks if the device at the given address is connected.
+ **is_channel_connected( idn, ch ):** Checks whether the given device channel is connected.
+ **get_channels( idn, length = 16 ):** Returns a list of booleans of whether the cahnnel at the index exists.
+ **channel_info( idn, ch ):** Returns a ChannelInfo struct of the given device channel.
+ **get_hardware_configuration( idn, ch ):** Returns a HarwareConf struct of the given device channel.
+ **set_hardware_configuration( idn, ch, mode, connection ):** Sets the hardware configuration of the given device channel.
+ **load_technique( idn, ch, technique, params, first = True, last = True, verbose = False ):**
Loads the technique with parameter on the given device channel.
+ **create_parameter( name, value, index, kind = None ):**
Creates an EccParam struct.
+ **update_paramters( idn, ch, technique, params, tech_index = 0 ):**
Updates the paramters of a technique on teh given device channel.
+ **cast_parameters( parameters, types ):** Cast parameters to given types.
+ **start_channel( idn, ch ):** Starts the given device channel.
+ **start_channels( idn, ch ):** Starts the given device channels.
+ **stop_channel( idn, ch ):** Stops the given device channel.
+ **stop_channels( idn, chs ):** Stops the given device channels.
+ **get_values( idn, ch ):** Gets the current values and states of the given device channel.
+ **raise_exception( err ):** Raises an exception based on a calls error code.
+ **is\_in\_SP300\_family( device_code ):** Determines if the given device is in the SP300 device family.
#### Enum Classes
+ **DeviceCodes:** Device code for identifying model.<br>
Values: [ KBIO_DEV_VMP, KBIO_DEV_VMP2, KBIO_DEV_MPG, KBIO_DEV_BISTAT, KBIO_DEV_MCS_200, KBIO_DEV_VMP3, KBIO_DEV_VSP, KBIO_DEV_HCP803, KBIO_DEV_EPP400, KBIO_DEV_EPP4000, KBIO_DEV_BISTAT2, KBIO_DEV_FCT150S, KBIO_DEV_VMP300, KBIO_DEV_SP50, KBIO_DEV_SP150, KBIO_DEV_FCT50S, KBIO_DEV_SP300, KBIO_DEV_CLB500, KBIO_DEV_HCP1005, KBIO_DEV_CLB2000, KBIO_DEV_VSP300, KBIO_DEV_SP200, KBIO_DEV_MPG2, KBIO_DEV_ND1, KBIO_DEV_ND2, KBIO_DEV_ND3, KBIO_DEV_ND4, KBIO_DEV_SP240, KBIO_DEV_MPG205, KBIO_DEV_MPG210, KBIO_DEV_MPG220, KBIO_DEV_MPG240, KBIO_DEV_UNKNOWN ]
+ **DeviceCodeDescriptions:** Description of DeviceCodes. <br>
Values: [ KBIO_DEV_VMP, KBIO_DEV_VMP2, KBIO_DEV_MPG, KBIO_DEV_BISTAT, KBIO_DEV_MCS_200, KBIO_DEV_VMP3, KBIO_DEV_VSP, KBIO_DEV_HCP803, KBIO_DEV_EPP400, KBIO_DEV_EPP4000, KBIO_DEV_BISTAT2, KBIO_DEV_FCT150S, KBIO_DEV_VMP300, KBIO_DEV_SP50, KBIO_DEV_SP150, KBIO_DEV_FCT50S, KBIO_DEV_SP300, KBIO_DEV_CLB500, KBIO_DEV_HCP1005, KBIO_DEV_CLB2000, KBIO_DEV_VSP300, KBIO_DEV_SP200, KBIO_DEV_MPG2, KBIO_DEV_ND1, KBIO_DEV_ND2, KBIO_DEV_ND3, KBIO_DEV_ND4, KBIO_DEV_SP240, KBIO_DEV_MPG205, KBIO_DEV_MPG210, KBIO_DEV_MPG220, KBIO_DEV_MPG240, KBIO_DEV_UNKNOWN ]
+ **IRange:** Current ranges. <br>
Values: [ p100, n1, n10, n100, u1, u10, u100, m1, m10, m100, a1, KEEP, BOOSTER, AUTO ]
+ **ERange:** Voltage ranges. <br>
Values: [ v2_5, v5, v10, AUTO ]
+ **ElectrodeConnection:** Whether the electrode is in standard or grounded mode.<br>
Values: [ STANDARD, GROUNDED ]
+ **ChannelMode:** Whether the device is floating or grounded. <br>
Values: [ GROUNDED, FLOATING ]
+ **TechniqueId:** ID of the technique. (Not fully implemented.) <br>
Values: [ NONE, OCV, CA, CP, CV, PEIS, CALIMIT ]
+ **ChannelState:** State of the channel. <br>
Values: [ STOP, RUN, PAUSE ]
+ **ParameterType:** Type of a parameter. <br>
Values: [ INT32, BOOLEAN, SINGLE, FLOAT ]
(FLOAT is an alias of SINGLE.)
#### Structures
+ **DeviceInfo:** Information representing the device. Used by `connect()`. <br>
Fields: [ DeviceCode, RAMSize, CPU, NumberOfChannles, NumberOfSlots, FirmwareVersion, FirmwareDate_yyyy, FirmwareDate_mm, FirmwareDate_dd, HTdisplayOn, NbOfConnectedPC ]
+ **ChannelInfo:** Information representing a device channel. Used by `channel_info()`. <br>
Fields: [ Channel, BoardVersion, BoardSerialNumber, FirmwareVersion, XilinxVersion, AmpCode, NbAmps, Lcboard, Zboard, RESERVED, MemSize, State, MaxIRange, MinIRange, MaxBandwidth, NbOfTechniques ]
+ **HardwareConf:** Hardware configuration information for a channel.<br>
Fields: [ Conn, Ground ]
+ **EccParam:** A technique parameter. <br>
Fields: [ ParamStr, ParamType, ParamVal, ParamIndex ]
+ **EccParams:** A bundle of technique parameters. <br>
Fields: [ len, pParams ]
+ **CurrentValues:** Values measured from and states of the device. <br>
Fields: [ State, MemFilled, TimeBase, Ewe, EweRangeMin, EweRangeMax, Ece, EceRangeMin, EceRangeMax, Eoverflow, I, IRange, Ioverflow, ElapsedTime, Freq, Rcomp, Saturation, OptErr, OptPos ]
+ **DataInfo:** Metadata of measured data. <br>
Fields: [ IRQskipped, NbRows, NbCols, TechniqueIndex, TechniqueID, processIndex, loop, StartTime, MuxPad ]
#### Constants
+ **VMP3_DEVICE_FAMILY:** Set of DeviceCodes in the VMP3 device family.<br>
{ DeviceCodes.KBIO_DEV_VMP2, DeviceCodes.KBIO_DEV_VMP3, DeviceCodes.KBIO_DEV_BISTAT, DeviceCodes.KBIO_DEV_BISTAT2, DeviceCodes.KBIO_DEV_MCS_200, DeviceCodes.KBIO_DEV_VSP, DeviceCodes.KBIO_DEV_SP50, DeviceCodes.KBIO_DEV_SP150, DeviceCodes.KBIO_DEV_FCT50S, DeviceCodes.KBIO_DEV_FCT150S, DeviceCodes.KBIO_DEV_CLB500, DeviceCodes.KBIO_DEV_CLB2000, DeviceCodes.KBIO_DEV_HCP803, DeviceCodes.KBIO_DEV_HCP1005, DeviceCodes.KBIO_DEV_MPG2, DeviceCodes.KBIO_DEV_MPG205, DeviceCodes.KBIO_DEV_MPG210, DeviceCodes.KBIO_DEV_MPG220, DeviceCodes.KBIO_DEV_MPG240 }
+ **SP300_DEVICE_FAMILY:** Set of DeviceCodes in the SP300 device family.<br>
{ DeviceCodes.KBIO_DEV_SP200, DeviceCodes.KBIO_DEV_SP300, DeviceCodes.KBIO_DEV_VSP300, DeviceCodes.KBIO_DEV_VMP300, DeviceCodes.KBIO_DEV_SP240 }
### Data Parser
Parses data received from a technique and contains technique fields for different device types.
#### Methods
+ **parse( data, info, fields = None, device = None ):** Parses data received from a technique.
+ **calculate_time( t_high, t_low, data_info, current_value ):** Calculates elapsed time from time data.
#### Classes
+ **VMP3_Fields:** Contains technqiue fields for VMP3 devices.
(Not all techniques are implemented)
Properties: [ OCV, CP, CA, CPLIMIT, CALIMIT, CV, PEIS ]
+ **SP300_Fields:** Contains technqiue fields for SP-300 devices.
(Not all techniques are implemented)
Properties: [ OCV, CP, CA, CPLIMIT, CALIMIT, CV, PEIS ]
### EC Find
Implements the BL Find DLL.
#### Methods
All BL Find DLL functions are implemented under the same name.
+ **find_devices( connection = None ):** Finds conencted devices.
### Technique Fields
Parameter types for techniques. (Not all techniques are implemented.)
#### Classes
+ OCV
+ CV
+ CA
+ CALIMIT
### EC Errors
Implements EC errors.
#### Classes
+ **EcError( value = None, code = None, message = None )**
## Example
A basic example running an MPP program on channels 0 - 7 for 10 minutes.
```python
import easy_biologic as ebl
import easy_biologic.base_programs as blp
# create device
bl = ebl.BiologicDevice( '192.168.1.2' )
# create mpp program
params = {
'run_time': 10* 60
}
mpp = blp.MPP(
bl,
params,
channels = [ 0, 1, 2, 3, 4, 5, 6 ]
)
# run program
mpp.run( 'data' )
```
Following is an example running a CV scan for three cycles at a scan rate of 50 mV/s in channel 0. The experiment begins at 0.5 V and forward scans to -0.25 V, then scans backward to 0.8 V. In the final cycles, it scans to 1.0 V and finish the experiment.
```python
import easy_biologic as ebl
import easy_biologic.base_programs as blp
bl = ebl.BiologicDevice( '192.168.1.2' )
save_path = '/save_path/CV.csv'
params = {
'start': 0.5,
'end': -0.25,
'E2': 0.8,
'Ef': 1.0,
'rate': 0.05,
'step': 0.001,
'N_Cycles': 2,
'begin_measuring_I': 0.5,
'End_measuring_I': 1.0,
}
CV = blp.CV(
bl,
params,
channels = [0] #channel is to be claimed.
)
#run program and save data into csv file.
CV.run( 'data' )
CV.save_data(save_path)
```
Following is an example that run the OCV and use the OCV as the voltage in PEIS test.
```python
import easy_biologic as ebl
import easy_biologic.base_programs as blp
bl = ebl.BiologicDevice( '192.168.1.2' )
save_path_ocv = '/save_path/OCV.csv'
# Run OCP test
params_ocv = {
'time': 2,
'time_interval': 1,
}
ocv = blp.OCV(
bl,
params_ocv,
channels=[0]
)
ocv.run('data')
ocv.save_data(save_path_ocv)
voc = {
ch: [datum.voltage for datum in data]
for ch, data in ocv.data.items()
}
voc = {
ch: sum(ch_voc) / len(ch_voc)
for ch, ch_voc in voc.items()
}
# Run PEIS test
save_path_peis = '/save_path/PEIS.csv'
params_peis = {
'voltage': list(voc.values())[0],
'final_frequency': 1000, # frequency unit: Hertz
'initial_frequency': 1000000, # frequency unit: Hertz
'amplitude_voltage': 0.1, # voltage unit: Volt
'frequency_number': 60,
'duration': 0, # time unit: second
'repeat': 10,
'wait': 0.1
}
peis = blp.PEIS(
bl,
params_peis,
channels=[0]
)
peis.run('data')
peis.save_data(save_path_peis)
```
Raw data
{
"_id": null,
"home_page": null,
"name": "easy-biologic",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "biologic",
"author": "Brian Carlsen",
"author_email": "carlsen.bri@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/44/03/889a33adf036477170cb7040804f89ee0a65a44b487786be944ba40160f9/easy-biologic-0.4.0.tar.gz",
"platform": null,
"description": "# Easy Biologic\r\nA library allowing easy control over BioLogic devices.\r\nHigh and low level control over Biologic devices are available. \r\nLow level control is included in the `lib` subpackage, while high level control\r\nis available in the main module. \r\n> Install with `python -m pip install easy-biologic`\r\n\r\n## High Level API\r\nThere are two high level API modules containing three classes, and two convenience modules.\r\n\r\n### Biologic Device\r\nRepresents an instance of a Biologic Device.\r\n\r\n#### Methods\r\n+ **BiologicDevice( address, timeout = 5 ):** Creates a new Biologic Device representing the device conencted at `address`.\r\n\r\n+ **connect( bin_file, xlx_file ):** Connects to the device, loading the bin and xlx file if provided.\r\n\r\n+ **disconnect():** Disconnects from the device.\r\n\r\n+ **is_connected():** Whether the device is connected or not.\r\n\r\n+ **load_technique( ch, technique, params, index = 0, last = True, types = none ):** Loads a technique onto the given device channel.\r\n\r\n+ **load_techniques( ch, techniques, parameters, types = None ):** Loads a series of techniques onto the given device channel.\r\n\r\n+ **update_parameters( ch, technique, parameters, index = 0, types = None ):** Update the parameters of the given technqiue on the specified device channel.\r\n\r\n+ **start_channel( ch ):** Starts the given channel.\r\n\r\n+ **start_channels( chs = None ):** Starts multiple channels.\r\n\r\n+ **stop_channel( ch ):** Stops the given channel.\r\n\r\n+ **stop_channels( chs = None ):** Stops the given channels.\r\n\r\n+ **channel_info( ch ):** Returns information about the given channel.\r\n\r\n+ **channel_configuration( ch ):** Returns configuration information of the channel.\r\n\r\n+ **set_channel_configuration( ch, mode, conneciton ):** Sets the channel's hardware configuration.\r\n\r\n+ **get_values( ch ):** Returns current values of the given channel.\r\n\r\n+ **get_data( ch ):** Returns buffered data of the given channel.\r\n\r\n\r\n#### Properties\r\n+ **address:** Connection address of the device.\r\n+ **idn:** ID of the device.\r\n+ **kind:** Device model.\r\n+ **info:** DeviceInfo structure.\r\n+ **plugged:** List of available channels. \r\n+ **channels:** List of ChannelInfo structures.\r\n+ **hardware_configuration:** Dictionary of HardwareConfiguration for each channel.\r\n+ **techniques:** List of TechParams loaded on each channel.\r\n\r\n### Biologic Program\r\n`Abstract Class`\r\nRepresents a program to be run on a device.\r\n\r\n#### Methods\r\n+ **BiologicProgram( device, params, channels = None, autoconnect = True, barrier = None, stop_event = None, threaded = False ):** Creates a new program.\r\n\r\n+ **channel_state( channels = None ):** Returns the state of the channels.\r\n\r\n+ **on_data( callback, index = None ):** Registers a callback function to run when data is collected.\r\n\r\n+ **run():** Runs the program.\r\n\r\n+ **stop():** Sets the stop event flag.\r\n\r\n+ **save_data( file, append = False, by_channel = False ):** Saves data to the given file.\r\n\r\n+ **sync():** Waits for barrier, if set.\r\n\r\n+ **_connect():** Connects to the device\r\n\r\n#### Properties\r\n+ **device:** BiologicDevice. <br>\r\n+ **params:** Passed in parameters. <br>\r\n+ **channels:** Device channels. <br>\r\n+ **autoconnect:** Whether connection to the device should be automatic or + not. <br>\r\n+ **barrier:** A threading.Barrier to use for channel syncronization. [See ProgramRummer] <br>\r\n+ **field_titles:** Column names for saving data. <br>\r\n+ **data:** Data collected during the program. <br>\r\n+ **status:** Status of the program. <br>\r\n+ **fields:** Data fields teh program returns. <br>\r\n+ **technqiues:** List of techniques the program uses.\r\n\r\n### Program Runner\r\nRepresents a program to be run on a device channel.\r\n\r\n#### Methods\r\n+ **ProgramRunner( programs, sync = False ):** Creates a new program runner.\r\n\r\n+ **start():** Runs the programs.\r\n\r\n+ **wait():** Wait for all threads to finish.\r\n\r\n+ **stop():** Sets stop event.\r\n\r\n#### Properties\r\n+ **threads:** List of threads for each program. <br>\r\n+ **sync:** Whether to sync the threads or not. \r\n\r\n### Base Programs\r\nContains basic implementations of BiologicPrograms.\r\n\r\n#### OCV\r\n##### Params\r\n+ **time:** Run time in seconds.\r\n\r\n+ **time_interval:** Maximum time between readings. \r\n[Default: 1]\r\n\r\n+ **voltage_interval:** Maximum interval between voltage readings.\r\n[Default: 0.01]\r\n \r\n#### CA\r\n##### Params\r\n+ **voltages:** List of voltages.\r\n\r\n+ **durations:** List of times in seconds.\r\n\r\n+ **vs_initial:** If step is vs. initial or previous. \r\n[Default: False] \r\n\r\n+ **time_interval:** Maximum time interval between points.\r\n[Default: 1]\r\n \r\n+ **current_interval:** Maximum current change between points.\r\n[Default: 0.001]\r\n \r\n+ **current_range:** Current range. Use ec_lib.IRange.\r\n[Default: IRange.m10 ]\r\n \r\n##### Methods\r\n+ **update_voltage( voltages, durations = None, vs_initial = None ):** Updates the voltage. \r\n\r\n#### CALimit\r\n##### Params\r\n+ **voltages:** List of voltages.\r\n\r\n+ **durations:** List of times in seconds.\r\n\r\n+ **vs_initial:** If step is vs. initial or previous. \r\n[Default: False] \r\n\r\n+ **time_interval:** Maximum time interval between points.\r\n[Default: 1]\r\n+ **current_interval:** Maximum current change between points.\r\n[Default: 0.001]\r\n \r\n+ **current_range:** Current range. Use ec_lib.IRange.\r\n[Default: IRange.m10 ]\r\n\r\n##### Methods\r\n+ **update_voltage( voltages, durations = None, vs_initial = None ):** Updates the voltage.\r\n\r\n#### PEIS\r\n##### Params\r\n+ **voltage:** Initial potential in Volts.\r\n\r\n+ **amplitude_voltage:** Sinus amplitude in Volts.\r\n\r\n+ **initial_frequency**: Initial frequency in Hertz.\r\n \r\n+ **final_frequency:** Final frequency in Hertz.\r\n\r\n+ **frequency_number:** Number of frequencies.\r\n\r\n+ **duration:** Overall duration in seconds.\r\n\r\n+ **vs_initial:** If step is vs. initial or previous. \r\n[Default: False]\r\n\r\n+ **time_interval:** Maximum time interval between points in seconds. \r\n[Default: 1]\r\n\r\n+ **current_interval:** Maximum time interval between points in Amps. \r\n[Default: 0.001]\r\n\r\n+ **sweep:** Defines whether the spacing between frequencies is logarithmic ('log') or linear ('lin'). \r\n[Default: 'log'] \r\n\r\n+ **repeat:** Number of times to repeat the measurement and average the values for each frequency. \r\n[Default: 1]\r\n\r\n+ **correction:** Drift correction. \r\n[Default: False]\r\n\r\n+ **wait:** Adds a delay before the measurement at each frequency. The delay is expressed as a fraction of the period. \r\n[Default: 0]\r\n \r\n#### GEIS\r\nPerforms a Galvanostatic Electrochemical Impedance Spectroscopy\r\n\r\n##### Params\r\n+ **current:** Initial current in Ampere.\r\n\r\n+ **amplitude_current:** Sinus amplitude in Ampere.\r\n\r\n+ **initial_frequency**: Initial frequency in Hertz.\r\n \r\n+ **final_frequency:** Final frequency in Hertz.\r\n\r\n+ **frequency_number:** Number of frequencies.\r\n\r\n+ **duration:** Overall duration in seconds.\r\n\r\n+ **vs_initial:** If step is vs. initial or previous. \r\n[Default: False]\r\n\r\n+ **time_interval:** Maximum time interval between points in seconds. \r\n[Default: 1]\r\n\r\n+ **current_interval:** Maximum time interval between points in Amps. \r\n[Default: 0.001]\r\n\r\n+ **sweep:** Defines whether the spacing between frequencies is logarithmic ('log') or linear ('lin'). \r\n[Default: 'log'] \r\n\r\n+ **repeat:** Number of times to repeat the measurement and average the values for each frequency. \r\n[Default: 1]\r\n\r\n+ **correction:** Drift correction. \r\n[Default: False]\r\n\r\n+ **wait:** Adds a delay before the measurement at each frequency. The delay is expressed as a fraction of the period. \r\n[Default: 0]\r\n \r\n#### CV\r\nPerforms a CV scan.\r\n\r\n##### Params\r\n+ **start:** Start voltage. \r\n[Default: 0]\r\n\r\n+ **end:** End voltage. Boundary voltage in forward scan. \r\n[Default: 0.5]\r\n\r\n+ **E2** Boundary voltage in backward scan. \r\n[Default: 0]\r\n\r\n+ **Ef** End voltage in the final cycle scan \r\n[Default: 0]\r\n\r\n+ **step:** Voltage step. dEN/1000\r\n[Default: 0.01]\r\n\r\n+ **rate:** Scan rate in V/s. \r\n[Default: 0.01]\r\n\r\n+ **average:** Average over points. \r\n[Default: False]\r\n\r\n\r\n#### MPP_Tracking\r\nPerforms MPP tracking.\r\n\r\n##### Params\r\n+ **run_time:** Run time in seconds.\r\n\r\n+ **init_vmpp:** Initial v_mpp.\r\n\r\n+ **probe_step:** Voltage step for probe. \r\n[Default: 0.01 V]\r\n\r\n+ **probe_points:** Number of data points to collect for probe. \r\n[Default: 5]\r\n\r\n+ **probe_interval:** How often to probe in seconds. \r\n[Default: 2]\r\n\r\n+ **record_interval:** How often to record a data point in seconds. \r\n[Default: 1]\r\n\r\n\r\n#### MPP\r\nRuns MPP tracking, finding the initial Vmpp by first measuring Voc, then performing a CV scan from 0 to Voc.\r\n\r\n##### Params\r\n+ **run_time:** Run time in seconds.\r\n\r\n+ **probe_step:** Voltage step for probe. \r\n[Default: 0.01 V]\r\n\r\n+ **probe_points:** Number of data points to collect for probe. \r\n[Default: 5]\r\n\r\n+ **probe_interval:** How often to probe in seconds. \r\n[Default: 2]\r\n\r\n+ **record_interval:** How often to record a data point in seconds. \r\n[Default: 1]\r\n\r\n\r\n#### MPP Cycles\r\nRuns multiple MPP cycles, performing Voc and CV scans at the beginning of each.\r\n\r\n##### Params\r\n+ **run_time:** Run time in seconds\r\n\r\n+ **scan_interval:** How often to perform a CV scan.\r\n\r\n+ **probe_step:** Voltage step for probe. [Default: 0.01 V]\r\n\r\n+ **probe_points:** Number of data points to collect for probe. [Default: 5]\r\n\r\n+ **probe_interval:** How often to probe in seconds. [Default: 2]\r\n\r\n+ **record_interval:** How often to record a data point in seconds. [Default: 1]\r\n\r\n### Find Devices\r\nA convenience script for finding connected devices.\r\n\r\n#### Use\r\nFrom a terminal run `python -m easy_biologic.find_devices`.\r\n\r\n## Low Level API\r\nThe low level API gives direct control of the Biologic device using the provided DLL libraries. The subpackage contains five modules.\r\n\r\n### EC Lib\r\nContains methods converting the `BL_*` DLL functions for use, enumeration classes to encapsulate program and device states, and C Structures for sending and receiving data from th device.\r\n\r\n#### Methods\r\n+ **connect( address, timeout = 5 ):** Connects to the device at the given address.\r\n\r\n+ **disconnect( idn ):** Disconnects given device.\r\n\r\n+ **is_connected( address ):** Checks if the device at the given address is connected.\r\n\r\n+ **is_channel_connected( idn, ch ):** Checks whether the given device channel is connected.\r\n\r\n+ **get_channels( idn, length = 16 ):** Returns a list of booleans of whether the cahnnel at the index exists.\r\n\r\n+ **channel_info( idn, ch ):** Returns a ChannelInfo struct of the given device channel.\r\n\r\n+ **get_hardware_configuration( idn, ch ):** Returns a HarwareConf struct of the given device channel.\r\n\r\n+ **set_hardware_configuration( idn, ch, mode, connection ):** Sets the hardware configuration of the given device channel.\r\n\r\n+ **load_technique( idn, ch, technique, params, first = True, last = True, verbose = False ):** \r\nLoads the technique with parameter on the given device channel.\r\n\r\n+ **create_parameter( name, value, index, kind = None ):** \r\nCreates an EccParam struct.\r\n\r\n+ **update_paramters( idn, ch, technique, params, tech_index = 0 ):** \r\nUpdates the paramters of a technique on teh given device channel.\r\n\r\n+ **cast_parameters( parameters, types ):** Cast parameters to given types.\r\n\r\n+ **start_channel( idn, ch ):** Starts the given device channel.\r\n\r\n+ **start_channels( idn, ch ):** Starts the given device channels.\r\n\r\n+ **stop_channel( idn, ch ):** Stops the given device channel.\r\n\r\n+ **stop_channels( idn, chs ):** Stops the given device channels.\r\n\r\n+ **get_values( idn, ch ):** Gets the current values and states of the given device channel.\r\n\r\n+ **raise_exception( err ):** Raises an exception based on a calls error code.\r\n\r\n+ **is\\_in\\_SP300\\_family( device_code ):** Determines if the given device is in the SP300 device family.\r\n\r\n#### Enum Classes\r\n+ **DeviceCodes:** Device code for identifying model.<br>\r\nValues: [ KBIO_DEV_VMP, KBIO_DEV_VMP2, KBIO_DEV_MPG, KBIO_DEV_BISTAT, KBIO_DEV_MCS_200, KBIO_DEV_VMP3, KBIO_DEV_VSP, KBIO_DEV_HCP803, KBIO_DEV_EPP400, KBIO_DEV_EPP4000, KBIO_DEV_BISTAT2, KBIO_DEV_FCT150S, KBIO_DEV_VMP300, KBIO_DEV_SP50, KBIO_DEV_SP150, KBIO_DEV_FCT50S, KBIO_DEV_SP300, KBIO_DEV_CLB500, KBIO_DEV_HCP1005, KBIO_DEV_CLB2000, KBIO_DEV_VSP300, KBIO_DEV_SP200, KBIO_DEV_MPG2, KBIO_DEV_ND1, KBIO_DEV_ND2, KBIO_DEV_ND3, KBIO_DEV_ND4, KBIO_DEV_SP240, KBIO_DEV_MPG205, KBIO_DEV_MPG210, KBIO_DEV_MPG220, KBIO_DEV_MPG240, KBIO_DEV_UNKNOWN ]\r\n\r\n+ **DeviceCodeDescriptions:** Description of DeviceCodes. <br>\r\nValues: [ KBIO_DEV_VMP, KBIO_DEV_VMP2, KBIO_DEV_MPG, KBIO_DEV_BISTAT, KBIO_DEV_MCS_200, KBIO_DEV_VMP3, KBIO_DEV_VSP, KBIO_DEV_HCP803, KBIO_DEV_EPP400, KBIO_DEV_EPP4000, KBIO_DEV_BISTAT2, KBIO_DEV_FCT150S, KBIO_DEV_VMP300, KBIO_DEV_SP50, KBIO_DEV_SP150, KBIO_DEV_FCT50S, KBIO_DEV_SP300, KBIO_DEV_CLB500, KBIO_DEV_HCP1005, KBIO_DEV_CLB2000, KBIO_DEV_VSP300, KBIO_DEV_SP200, KBIO_DEV_MPG2, KBIO_DEV_ND1, KBIO_DEV_ND2, KBIO_DEV_ND3, KBIO_DEV_ND4, KBIO_DEV_SP240, KBIO_DEV_MPG205, KBIO_DEV_MPG210, KBIO_DEV_MPG220, KBIO_DEV_MPG240, KBIO_DEV_UNKNOWN ]\r\n\r\n+ **IRange:** Current ranges. <br>\r\nValues: [ p100, n1, n10, n100, u1, u10, u100, m1, m10, m100, a1, KEEP, BOOSTER, AUTO ]\r\n\r\n+ **ERange:** Voltage ranges. <br>\r\nValues: [ v2_5, v5, v10, AUTO ]\r\n\r\n+ **ElectrodeConnection:** Whether the electrode is in standard or grounded mode.<br>\r\nValues: [ STANDARD, GROUNDED ]\r\n\r\n+ **ChannelMode:** Whether the device is floating or grounded. <br>\r\nValues: [ GROUNDED, FLOATING ]\r\n\r\n+ **TechniqueId:** ID of the technique. (Not fully implemented.) <br>\r\nValues: [ NONE, OCV, CA, CP, CV, PEIS, CALIMIT ]\r\n\r\n+ **ChannelState:** State of the channel. <br>\r\nValues: [ STOP, RUN, PAUSE ]\r\n\r\n+ **ParameterType:** Type of a parameter. <br>\r\nValues: [ INT32, BOOLEAN, SINGLE, FLOAT ]\r\n(FLOAT is an alias of SINGLE.)\r\n\r\n#### Structures\r\n+ **DeviceInfo:** Information representing the device. Used by `connect()`. <br>\r\nFields: [ DeviceCode, RAMSize, CPU, NumberOfChannles, NumberOfSlots, FirmwareVersion, FirmwareDate_yyyy, FirmwareDate_mm, FirmwareDate_dd, HTdisplayOn, NbOfConnectedPC ]\r\n\r\n+ **ChannelInfo:** Information representing a device channel. Used by `channel_info()`. <br>\r\nFields: [ Channel, BoardVersion, BoardSerialNumber, FirmwareVersion, XilinxVersion, AmpCode, NbAmps, Lcboard, Zboard, RESERVED, MemSize, State, MaxIRange, MinIRange, MaxBandwidth, NbOfTechniques ]\r\n\r\n+ **HardwareConf:** Hardware configuration information for a channel.<br>\r\nFields: [ Conn, Ground ]\r\n\r\n+ **EccParam:** A technique parameter. <br>\r\nFields: [ ParamStr, ParamType, ParamVal, ParamIndex ]\r\n\r\n+ **EccParams:** A bundle of technique parameters. <br>\r\nFields: [ len, pParams ]\r\n\r\n+ **CurrentValues:** Values measured from and states of the device. <br>\r\nFields: [ State, MemFilled, TimeBase, Ewe, EweRangeMin, EweRangeMax, Ece, EceRangeMin, EceRangeMax, Eoverflow, I, IRange, Ioverflow, ElapsedTime, Freq, Rcomp, Saturation, OptErr, OptPos ]\r\n\r\n+ **DataInfo:** Metadata of measured data. <br>\r\nFields: [ IRQskipped, NbRows, NbCols, TechniqueIndex, TechniqueID, processIndex, loop, StartTime, MuxPad ]\r\n\r\n#### Constants\r\n+ **VMP3_DEVICE_FAMILY:** Set of DeviceCodes in the VMP3 device family.<br>\r\n{ DeviceCodes.KBIO_DEV_VMP2, DeviceCodes.KBIO_DEV_VMP3, DeviceCodes.KBIO_DEV_BISTAT, DeviceCodes.KBIO_DEV_BISTAT2, DeviceCodes.KBIO_DEV_MCS_200, DeviceCodes.KBIO_DEV_VSP, DeviceCodes.KBIO_DEV_SP50, DeviceCodes.KBIO_DEV_SP150, DeviceCodes.KBIO_DEV_FCT50S, DeviceCodes.KBIO_DEV_FCT150S, DeviceCodes.KBIO_DEV_CLB500, DeviceCodes.KBIO_DEV_CLB2000, DeviceCodes.KBIO_DEV_HCP803, DeviceCodes.KBIO_DEV_HCP1005, DeviceCodes.KBIO_DEV_MPG2, DeviceCodes.KBIO_DEV_MPG205, DeviceCodes.KBIO_DEV_MPG210, DeviceCodes.KBIO_DEV_MPG220, DeviceCodes.KBIO_DEV_MPG240 }\r\n\r\n+ **SP300_DEVICE_FAMILY:** Set of DeviceCodes in the SP300 device family.<br>\r\n{ DeviceCodes.KBIO_DEV_SP200, DeviceCodes.KBIO_DEV_SP300, DeviceCodes.KBIO_DEV_VSP300, DeviceCodes.KBIO_DEV_VMP300, DeviceCodes.KBIO_DEV_SP240 }\r\n\r\n### Data Parser\r\nParses data received from a technique and contains technique fields for different device types.\r\n\r\n#### Methods\r\n+ **parse( data, info, fields = None, device = None ):** Parses data received from a technique.\r\n\r\n+ **calculate_time( t_high, t_low, data_info, current_value ):** Calculates elapsed time from time data.\r\n\r\n#### Classes\r\n+ **VMP3_Fields:** Contains technqiue fields for VMP3 devices. \r\n(Not all techniques are implemented)\r\nProperties: [ OCV, CP, CA, CPLIMIT, CALIMIT, CV, PEIS ]\r\n\r\n+ **SP300_Fields:** Contains technqiue fields for SP-300 devices. \r\n(Not all techniques are implemented)\r\nProperties: [ OCV, CP, CA, CPLIMIT, CALIMIT, CV, PEIS ]\r\n\r\n### EC Find\r\nImplements the BL Find DLL.\r\n\r\n#### Methods\r\nAll BL Find DLL functions are implemented under the same name.\r\n\r\n+ **find_devices( connection = None ):** Finds conencted devices.\r\n\r\n### Technique Fields\r\nParameter types for techniques. (Not all techniques are implemented.)\r\n\r\n#### Classes\r\n+ OCV\r\n+ CV\r\n+ CA\r\n+ CALIMIT\r\n\r\n### EC Errors\r\nImplements EC errors.\r\n\r\n#### Classes\r\n+ **EcError( value = None, code = None, message = None )** \r\n\r\n## Example\r\n\r\nA basic example running an MPP program on channels 0 - 7 for 10 minutes.\r\n```python\r\nimport easy_biologic as ebl\r\nimport easy_biologic.base_programs as blp\r\n\r\n\r\n# create device\r\nbl = ebl.BiologicDevice( '192.168.1.2' )\r\n\r\n# create mpp program\r\nparams = {\r\n\t'run_time': 10* 60\t\t\r\n}\r\n\r\nmpp = blp.MPP(\r\n bl,\r\n params, \t\r\n channels = [ 0, 1, 2, 3, 4, 5, 6 ] \r\n)\r\n\r\n# run program\r\nmpp.run( 'data' )\r\n```\r\n\r\nFollowing is an example running a CV scan for three cycles at a scan rate of 50 mV/s in channel 0. The experiment begins at 0.5 V and forward scans to -0.25 V, then scans backward to 0.8 V. In the final cycles, it scans to 1.0 V and finish the experiment.\r\n```python\r\nimport easy_biologic as ebl\r\nimport easy_biologic.base_programs as blp \r\n\r\nbl = ebl.BiologicDevice( '192.168.1.2' )\r\n\r\nsave_path = '/save_path/CV.csv'\r\n \r\nparams = {\r\n 'start': 0.5,\r\n 'end': -0.25,\r\n 'E2': 0.8,\r\n 'Ef': 1.0,\r\n 'rate': 0.05, \r\n 'step': 0.001, \r\n 'N_Cycles': 2,\r\n 'begin_measuring_I': 0.5,\r\n 'End_measuring_I': 1.0,\r\n} \r\n\r\nCV = blp.CV(\r\n bl,\r\n params, \r\n channels = [0] #channel is to be claimed.\r\n) \r\n\r\n#run program and save data into csv file.\r\nCV.run( 'data' )\r\nCV.save_data(save_path)\r\n```\r\n\r\nFollowing is an example that run the OCV and use the OCV as the voltage in PEIS test.\r\n```python\r\nimport easy_biologic as ebl\r\nimport easy_biologic.base_programs as blp \r\n\r\nbl = ebl.BiologicDevice( '192.168.1.2' )\r\n\r\nsave_path_ocv = '/save_path/OCV.csv'\r\n\r\n# Run OCP test\r\nparams_ocv = {\r\n 'time': 2,\r\n 'time_interval': 1,\r\n}\r\n\r\nocv = blp.OCV(\r\n bl,\r\n params_ocv,\r\n channels=[0]\r\n )\r\n\r\nocv.run('data')\r\nocv.save_data(save_path_ocv)\r\n\r\nvoc = {\r\n ch: [datum.voltage for datum in data]\r\n for ch, data in ocv.data.items()\r\n}\r\n\r\nvoc = {\r\n ch: sum(ch_voc) / len(ch_voc)\r\n for ch, ch_voc in voc.items()\r\n}\r\n\r\n# Run PEIS test\r\nsave_path_peis = '/save_path/PEIS.csv'\r\n\r\nparams_peis = {\r\n 'voltage': list(voc.values())[0],\r\n 'final_frequency': 1000, # frequency unit: Hertz\r\n 'initial_frequency': 1000000, # frequency unit: Hertz\r\n 'amplitude_voltage': 0.1, # voltage unit: Volt\r\n 'frequency_number': 60,\r\n 'duration': 0, # time unit: second\r\n 'repeat': 10,\r\n 'wait': 0.1\r\n}\r\n\r\npeis = blp.PEIS(\r\n bl,\r\n params_peis,\r\n channels=[0]\r\n)\r\n\r\npeis.run('data')\r\npeis.save_data(save_path_peis)\r\n```\r\n",
"bugtrack_url": null,
"license": null,
"summary": "Controller class for communicating with BioLogic devices.",
"version": "0.4.0",
"project_urls": {
"Bug Tracker": "https://github.com/bicarlsen/easy-biologic/issues",
"Source Code": "https://github.com/bicarlsen/easy-biologic"
},
"split_keywords": [
"biologic"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "926341ffa0eb2751f6ce7ca211230df6685dba04a04cd988f20acde1dd9ea9f7",
"md5": "9346405eb914767340f2fa1abfe054f2",
"sha256": "29692459daacbdd18229bbd5fb07891e75332a26cfab6194e04e0523af6a8ea3"
},
"downloads": -1,
"filename": "easy_biologic-0.4.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9346405eb914767340f2fa1abfe054f2",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 23718382,
"upload_time": "2024-07-18T18:06:27",
"upload_time_iso_8601": "2024-07-18T18:06:27.028240Z",
"url": "https://files.pythonhosted.org/packages/92/63/41ffa0eb2751f6ce7ca211230df6685dba04a04cd988f20acde1dd9ea9f7/easy_biologic-0.4.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4403889a33adf036477170cb7040804f89ee0a65a44b487786be944ba40160f9",
"md5": "626a7a2070bddfd8dbabb6997b5e9c3a",
"sha256": "9be95027aef2ce57a7c694c0c70023a4e00053982882dcb9c5acdd2a95fa9ca1"
},
"downloads": -1,
"filename": "easy-biologic-0.4.0.tar.gz",
"has_sig": false,
"md5_digest": "626a7a2070bddfd8dbabb6997b5e9c3a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 23411432,
"upload_time": "2024-07-18T18:06:37",
"upload_time_iso_8601": "2024-07-18T18:06:37.956357Z",
"url": "https://files.pythonhosted.org/packages/44/03/889a33adf036477170cb7040804f89ee0a65a44b487786be944ba40160f9/easy-biologic-0.4.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-07-18 18:06:37",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "bicarlsen",
"github_project": "easy-biologic",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "easy-biologic"
}