Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
# Default owners
* @PyLabRobot/core-team

# Agilent BioTek washers and dispensers
/docs/user_guide/agilent/405ts/ @stefanmaak
/docs/user_guide/agilent/el406/ @stefanmaak
/docs/user_guide/agilent/multiflo/ @stefanmaak
/docs/user_guide/agilent/multiflofx/ @stefanmaak
/pylabrobot/agilent/biotek/lhc/ @stefanmaak

# BMG CLARIOstar
/docs/user_guide/bmg_labtech/clariostar/ @BioCam
/pylabrobot/legacy/plate_reading/bmg_labtech/ @BioCam
Expand Down
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,24 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- `Resource.rotate`, `rotate_to` and `rotated` take an optional `pivot_coordinate`: a point in the resource's own frame that stays where it is, so a resource can turn about its centre, an edge, or any other point rather than only about its origin. `location` carries by however far the turn moved that point. Raises `NoLocationError` when the resource has no location, since there is nothing to carry. (#1249)
- `LinkBody` (`pylabrobot.resources.LinkBody`): one rigid member of a manipulator, an ordinary resource whose origin is a corner and which carries its `proximal_joint` and `distal_joint` as coordinates within it. The link is the line between the two joints and `length` is the distance, `None` on a member that ends the chain. A member turns about its proximal joint rather than its origin. (#1249)
- `MechanicalGripper` (`pylabrobot.resources.MechanicalGripper`): a `LinkBody` that ends the chain, holding what it takes between two fingers. Its far end is a `tool_center_point` rather than a joint, it is sized to its body because `jaw_width` moves the fingers, and the jaws straddle the grip centre. (#1249)
- Agilent BioTek 405 TS washer (`pylabrobot.agilent.biotek.lhc.Washer405TS`), MultiFlo (`MultiFlo`) and MultiFlo FX (`MultiFloFX`) dispensers, alongside the EL406 in one shared package: one device model, wire protocol and protocol-file format, with per-model differences expressed as configuration. Each model exposes the capability objects its fitted hardware supports (`PlateWasher`, `SyringeDispenser`, `PeristalticDispenser`) and reads the options the instrument has fitted on `setup()`.
- `.LHC` protocol files can be read, checked and run (`pylabrobot.agilent.biotek.lhc.Protocol`, `read`, `write`), including comparing the instrument settings a file records against the instrument in front of you (`compare_settings`).
- Serial transport for these instruments alongside FTDI, chosen by the port string.
- Strip washing, 1536-well washing and peristaltic wash dispense/aspirate operations, and a public `get_status()` reporting the instrument's run state and activity.
- User guide notebooks for the 405 TS, EL406, MultiFlo and MultiFlo FX (`docs/user_guide/agilent/`).

### Fixed

- Imported `unittest.mock` in `pylabrobot/centrifuge/centrifuge_tests.py` (pre-existing bug that prevented the test class from running).

### Changed

- Agilent BioTek EL406 moved from `pylabrobot.agilent.biotek.el406.EL406` to `pylabrobot.agilent.biotek.lhc.EL406`. Its operations take the step objects each operation is defined by (`...protocols.steps.steps`) and the parameter groups they are built from (`...steps.step_parts`) rather than long flat keyword lists -- `wash()` went from 39 keyword arguments to nine. Every step is checked against the settings read at `setup()` before anything moves, and plate geometry is resolved from the PyLabRobot `Plate` resource instead of being passed per command.

### Removed

- `pylabrobot.agilent.biotek.el406`, replaced by `pylabrobot.agilent.biotek.lhc`.

## 0.2.1

### Added
Expand Down
54 changes: 52 additions & 2 deletions docs/_static/devices.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,22 @@
"manager": "https://discuss.pylabrobot.org/u/rickwierenga",
"oem": "https://www.agilent.com/en/product/automated-liquid-handling/automated-microplate-management/microplate-centrifuge"
},
{
"id": "biotek-405-ts",
"vendor": "Agilent (BioTek)",
"name": "405 TS",
"kind": "plate washer",
"capabilities": [
"plate washing"
],
"status": "mostly",
"api": "pylabrobot.agilent.biotek.lhc.Washer405TS",
"api_version": "v1",
"code_slug": "agilent/biotek/lhc",
"doc_slug": "agilent/405ts/hello-world",
"manager": "https://discuss.pylabrobot.org/u/rickwierenga",
"oem": "https://www.agilent.com/en/product/microplate-instrumentation/automated-liquid-dispensing-handling/automated-microplate-washers-dispensers/biotek-405-ts-microplate-washer-1623261"
},
{
"id": "biotek-cytation-1",
"vendor": "Agilent (BioTek)",
Expand Down Expand Up @@ -118,12 +134,46 @@
"dispensing"
],
"status": "mostly",
"api": "pylabrobot.agilent.biotek.el406.EL406",
"api": "pylabrobot.agilent.biotek.lhc.EL406",
"api_version": "v1",
"code_slug": "agilent/biotek/el406",
"code_slug": "agilent/biotek/lhc",
"doc_slug": "agilent/el406/hello-world",
"manager": "https://discuss.pylabrobot.org/u/rickwierenga",
"oem": "https://www.agilent.com/en/product/cell-analysis/microplate-automation-detection/microplate-washers-dispensers/biotek-el406-washer-dispenser-1623255"
},
{
"id": "biotek-multiflo",
"vendor": "Agilent (BioTek)",
"name": "MultiFlo",
"kind": "bulk dispenser",
"capabilities": [
"dispensing"
],
"status": "mostly",
"api": "pylabrobot.agilent.biotek.lhc.MultiFlo",
"api_version": "v1",
"code_slug": "agilent/biotek/lhc",
"doc_slug": "agilent/multiflo/hello-world",
"manager": "https://discuss.pylabrobot.org/u/rickwierenga",
"oem": "https://www.agilent.com/en/product/microplate-instrumentation/automated-liquid-dispensing-handling/automated-microplate-dispensers/biotek-multiflo-microplate-dispenser-1623263"
},
{
"id": "biotek-multiflo-fx",
"vendor": "Agilent (BioTek)",
"name": "MultiFlo FX",
"kind": "bulk dispenser",
"capabilities": [
"dispensing",
"plate washing"
],
"status": "mostly",
"api": "pylabrobot.agilent.biotek.lhc.MultiFloFX",
"api_version": "v1",
"code_slug": "agilent/biotek/lhc",
"doc_slug": "agilent/multiflofx/hello-world",
"manager": "https://discuss.pylabrobot.org/u/rickwierenga",
"oem": "https://www.agilent.com/en/product/microplate-instrumentation/automated-liquid-dispensing-handling/automated-microplate-dispensers/biotek-multiflo-fx-multi-mode-dispenser-1623264"
},
{
"id": "biotek-synergy-h1",
"vendor": "Agilent (BioTek)",
Expand Down
125 changes: 117 additions & 8 deletions docs/api/pylabrobot.agilent.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,44 +18,153 @@ BenchCel 4R
PlateNotchSettings


BioTek EL406
------------
BioTek washers and dispensers
-----------------------------

.. currentmodule:: pylabrobot.agilent.biotek.el406
One class per model. Each exposes the capability objects its fitted hardware supports.

.. currentmodule:: pylabrobot.agilent.biotek.lhc

.. autosummary::
:toctree: _autosummary
:nosignatures:
:recursive:

EL406
MultiFlo
MultiFloFX
Washer405TS
Protocol
read
write

.. currentmodule:: pylabrobot.agilent.biotek.el406.plate_washer
.. currentmodule:: pylabrobot.agilent.biotek.lhc.devices.components

.. autosummary::
:toctree: _autosummary
:nosignatures:
:recursive:

PlateWasher
SyringeDispenser
PeristalticDispenser

.. currentmodule:: pylabrobot.agilent.biotek.el406.syringe_dispenser
.. currentmodule:: pylabrobot.agilent.biotek.lhc.devices

.. autosummary::
:toctree: _autosummary
:nosignatures:
:recursive:

SyringeDispenser
InstrumentSettings
SettingsComparison

.. currentmodule:: pylabrobot.agilent.biotek.el406.peristaltic_dispenser
Steps
~~~~~

One class per operation the instruments perform, holding everything that operation can be given.
A capability method takes these where it takes a step, and a protocol file stores them.

.. currentmodule:: pylabrobot.agilent.biotek.lhc.protocols.steps.steps

.. autosummary::
:toctree: _autosummary
:nosignatures:
:recursive:

PeristalticDispenser
ManifoldWash
ManifoldDispense
ManifoldAspirate
ManifoldPrime
ManifoldAutoClean
Wash1536
StripWash
StripDispense
StripAspirate
StripPrime
SyringeDispense
SyringePrime
PeriDispense
PeriRandomAccessDispense
PeriPrime
PeriPurge
PeriWashDispense
PeriWashAspirate
ShakeSoak

.. currentmodule:: pylabrobot.agilent.biotek.lhc.protocols.steps

.. autosummary::
:toctree: _autosummary
:nosignatures:
:recursive:

Step
step_from_definition

Step parts
~~~~~~~~~~

The groups of parameters the steps above are built from: where in the well a step works, which
stages of a wash run, and the optional behaviours a step can switch on.

.. currentmodule:: pylabrobot.agilent.biotek.lhc.protocols.steps.step_parts.positioning

.. autosummary::
:toctree: _autosummary
:nosignatures:
:recursive:

Positioning

.. currentmodule:: pylabrobot.agilent.biotek.lhc.protocols.steps.step_parts.groups

.. autosummary::
:toctree: _autosummary
:nosignatures:
:recursive:

WashStages
Sectors
PreDispense
SecondaryAspirate
VacuumDelay
Shake
Soak
Submerge
RandomAccess
WellVolumeMap

.. currentmodule:: pylabrobot.agilent.biotek.lhc.protocols.steps.step_parts.masks

.. autosummary::
:toctree: _autosummary
:nosignatures:
:recursive:

WellMask

.. currentmodule:: pylabrobot.agilent.biotek.lhc.protocols.validation

.. autosummary::
:toctree: _autosummary
:nosignatures:
:recursive:

ValidationReport
StepReport
Rejection

.. currentmodule:: pylabrobot.agilent.biotek.lhc.error_handling

.. autosummary::
:toctree: _autosummary
:nosignatures:
:recursive:

BiotekError
LinkError
RejectedError


BioTek Cytation
Expand Down
Loading