diff --git a/README.md b/README.md index 9d63eb84..50380d8c 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ conda env update --file unilabos-[YOUR_OS].yml -n environment_name # Currently, you need to install the `unilabos_msgs` package # You can download the system-specific package from the Release page -conda install ros-humble-unilabos-msgs-0.9.1-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.9.2-xxxxx.tar.bz2 # Install PyLabRobot and other prerequisites git clone https://github.com/PyLabRobot/pylabrobot plr_repo diff --git a/README_zh.md b/README_zh.md index 28671ebd..2a82b435 100644 --- a/README_zh.md +++ b/README_zh.md @@ -49,7 +49,7 @@ conda env update --file unilabos-[YOUR_OS].yml -n 环境名 # 现阶段,需要安装 `unilabos_msgs` 包 # 可以前往 Release 页面下载系统对应的包进行安装 -conda install ros-humble-unilabos-msgs-0.9.1-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.9.2-xxxxx.tar.bz2 # 安装PyLabRobot等前置 git clone https://github.com/PyLabRobot/pylabrobot plr_repo diff --git a/recipes/ros-humble-unilabos-msgs/recipe.yaml b/recipes/ros-humble-unilabos-msgs/recipe.yaml index 2ee7f1f8..a7faf4c1 100644 --- a/recipes/ros-humble-unilabos-msgs/recipe.yaml +++ b/recipes/ros-humble-unilabos-msgs/recipe.yaml @@ -1,6 +1,6 @@ package: name: ros-humble-unilabos-msgs - version: 0.9.1 + version: 0.9.2 source: path: ../../unilabos_msgs folder: ros-humble-unilabos-msgs/src/work diff --git a/recipes/unilabos/recipe.yaml b/recipes/unilabos/recipe.yaml index 5b036306..b261d16b 100644 --- a/recipes/unilabos/recipe.yaml +++ b/recipes/unilabos/recipe.yaml @@ -1,6 +1,6 @@ package: name: unilabos - version: "0.9.1" + version: "0.9.2" source: path: ../.. diff --git a/setup.py b/setup.py index 847098a5..e3a86cdb 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ package_name = 'unilabos' setup( name=package_name, - version='0.9.1', + version='0.9.2', packages=find_packages(), include_package_data=True, install_requires=['setuptools'], diff --git a/test/experiments/biomek.json b/test/experiments/biomek.json new file mode 100644 index 00000000..604adccc --- /dev/null +++ b/test/experiments/biomek.json @@ -0,0 +1,22 @@ +{ + "nodes": [ + { + "id": "BIOMEK", + "name": "BIOMEK", + "parent": null, + "type": "device", + "class": "liquid_handler.biomek", + "position": { + "x": 620.6111111111111, + "y": 171, + "z": 0 + }, + "config": { + }, + "data": {}, + "children": [ + ] + } + ], + "links": [] +} \ No newline at end of file diff --git a/test/experiments/plr_test_converted_slim.json b/test/experiments/plr_test_converted_slim.json new file mode 100644 index 00000000..43e05e7c --- /dev/null +++ b/test/experiments/plr_test_converted_slim.json @@ -0,0 +1,1710 @@ +{ + "nodes": [ + { + "id": "PLR_STATION", + "name": "PLR_LH_TEST", + "parent": null, + "type": "device", + "class": "liquid_handler", + "position": { + "x": 620.6111111111111, + "y": 171, + "z": 0 + }, + "config": { + "data": { + "children": [ + { + "_resource_child_name": "deck", + "_resource_type": "pylabrobot.resources.opentrons.deck:OTDeck" + } + ], + "backend": { + "type": "LiquidHandlerChatterboxBackend" + } + } + }, + "data": {}, + "children": [ + "deck" + ] + }, + { + "id": "deck", + "name": "deck", + "sample_id": null, + "children": [ + "tip_rack", + "plate_well" + ], + "parent": "PLR_STATION", + "type": "deck", + "class": "OTDeck", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "OTDeck", + "with_trash": false, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + } + }, + "data": {} + }, + { + "id": "tip_rack", + "name": "tip_rack", + "sample_id": null, + "children": [ + "tip_rack_A1", + "tip_rack_B1", + "tip_rack_C1", + "tip_rack_D1", + "tip_rack_E1", + "tip_rack_F1", + "tip_rack_G1", + "tip_rack_H1", + "tip_rack_A2", + "tip_rack_B2", + "tip_rack_C2", + "tip_rack_D2", + "tip_rack_E2", + "tip_rack_F2", + "tip_rack_G2", + "tip_rack_H2" + ], + "parent": "deck", + "type": "plate", + "class": "opentrons_96_filtertiprack_1000ul", + "position": { + "x": 0, + "y": 0, + "z": 69 + }, + "config": { + "type": "TipRack", + "size_x": 122.4, + "size_y": 82.6, + "size_z": 20.0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_rack", + "model": "HTF", + "ordering": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ] + }, + "data": {} + }, + { + "id": "tip_rack_A1", + "name": "tip_rack_A1", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 7.2, + "y": 68.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_B1", + "name": "tip_rack_B1", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 7.2, + "y": 59.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_C1", + "name": "tip_rack_C1", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 7.2, + "y": 50.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_D1", + "name": "tip_rack_D1", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 7.2, + "y": 41.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_E1", + "name": "tip_rack_E1", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 7.2, + "y": 32.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_F1", + "name": "tip_rack_F1", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 7.2, + "y": 23.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_G1", + "name": "tip_rack_G1", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 7.2, + "y": 14.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_H1", + "name": "tip_rack_H1", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 7.2, + "y": 5.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_A2", + "name": "tip_rack_A2", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 16.2, + "y": 68.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_B2", + "name": "tip_rack_B2", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 16.2, + "y": 59.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_C2", + "name": "tip_rack_C2", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 16.2, + "y": 50.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_D2", + "name": "tip_rack_D2", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 16.2, + "y": 41.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_E2", + "name": "tip_rack_E2", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 16.2, + "y": 32.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_F2", + "name": "tip_rack_F2", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 16.2, + "y": 23.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_G2", + "name": "tip_rack_G2", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 16.2, + "y": 14.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "tip_rack_H2", + "name": "tip_rack_H2", + "sample_id": null, + "children": [], + "parent": "tip_rack", + "type": "device", + "class": "", + "position": { + "x": 16.2, + "y": 5.3, + "z": 9.47 + }, + "config": { + "type": "TipSpot", + "size_x": 9.0, + "size_y": 9.0, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": true, + "maximal_volume": 20.0, + "fitting_depth": 3.29 + } + } + }, + { + "id": "plate_well", + "name": "plate_well", + "sample_id": null, + "children": [ + "plate_well_A1", + "plate_well_B1", + "plate_well_C1", + "plate_well_D1", + "plate_well_E1", + "plate_well_F1", + "plate_well_G1", + "plate_well_H1", + "plate_well_A11", + "plate_well_B11", + "plate_well_C11", + "plate_well_D11", + "plate_well_E11", + "plate_well_F11", + "plate_well_G11", + "plate_well_H11" + ], + "parent": "deck", + "type": "plate", + "class": "nest_96_wellplate_2ml_deep", + "position": { + "x": 265.0, + "y": 0, + "z": 69 + }, + "config": { + "type": "Plate", + "size_x": 127.76, + "size_y": 85.48, + "size_z": 14.2, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": "Cor_96_wellplate_360ul_Fb", + "ordering": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ] + }, + "data": {} + }, + { + "id": "plate_well_A1", + "name": "plate_well_A1", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 10.87, + "y": 70.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_B1", + "name": "plate_well_B1", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 10.87, + "y": 61.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_C1", + "name": "plate_well_C1", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 10.87, + "y": 52.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_D1", + "name": "plate_well_D1", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 10.87, + "y": 43.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_E1", + "name": "plate_well_E1", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 10.87, + "y": 34.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_F1", + "name": "plate_well_F1", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 10.87, + "y": 25.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_G1", + "name": "plate_well_G1", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 10.87, + "y": 16.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_H1", + "name": "plate_well_H1", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 10.87, + "y": 7.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_A11", + "name": "plate_well_A11", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 100.87, + "y": 70.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_B11", + "name": "plate_well_B11", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 100.87, + "y": 61.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_C11", + "name": "plate_well_C11", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 100.87, + "y": 52.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_D11", + "name": "plate_well_D11", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 100.87, + "y": 43.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_E11", + "name": "plate_well_E11", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 100.87, + "y": 34.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_F11", + "name": "plate_well_F11", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 100.87, + "y": 25.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_G11", + "name": "plate_well_G11", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 100.87, + "y": 16.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "plate_well_H11", + "name": "plate_well_H11", + "sample_id": null, + "children": [], + "parent": "plate_well", + "type": "device", + "class": "", + "position": { + "x": 100.87, + "y": 7.77, + "z": 3.03 + }, + "config": { + "type": "Well", + "size_x": 6.86, + "size_y": 6.86, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "max_volume": 360, + "material_z_thickness": 0.5, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "flat", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + } + ], + "links": [] +} \ No newline at end of file diff --git a/unilabos/app/main.py b/unilabos/app/main.py index 0db290a0..0f6b2f42 100644 --- a/unilabos/app/main.py +++ b/unilabos/app/main.py @@ -10,6 +10,8 @@ from copy import deepcopy import yaml +from unilabos.resources.graphio import tree_to_list + # 首先添加项目根目录到路径 current_dir = os.path.dirname(os.path.abspath(__file__)) unilabos_dir = os.path.dirname(os.path.dirname(current_dir)) @@ -144,19 +146,19 @@ def main(): else read_graphml(args_dict["graph"]) ) devices_and_resources = dict_from_graph(graph_res.physical_setup_graph) - args_dict["resources_config"] = initialize_resources(list(deepcopy(devices_and_resources).values())) + # args_dict["resources_config"] = initialize_resources(list(deepcopy(devices_and_resources).values())) + args_dict["resources_config"] = list(devices_and_resources.values()) args_dict["devices_config"] = dict_to_nested_dict(deepcopy(devices_and_resources), devices_only=False) - # args_dict["resources_config"] = dict_to_tree(devices_and_resources, devices_only=False) - args_dict["graph"] = graph_res.physical_setup_graph else: if args_dict["devices"] is None or args_dict["resources"] is None: print_status("Either graph or devices and resources must be provided.", "error") sys.exit(1) args_dict["devices_config"] = json.load(open(args_dict["devices"], encoding="utf-8")) - args_dict["resources_config"] = initialize_resources( - list(json.load(open(args_dict["resources"], encoding="utf-8")).values()) - ) + # args_dict["resources_config"] = initialize_resources( + # list(json.load(open(args_dict["resources"], encoding="utf-8")).values()) + # ) + args_dict["resources_config"] = list(json.load(open(args_dict["resources"], encoding="utf-8")).values()) print_status(f"{len(args_dict['resources_config'])} Resources loaded:", "info") for i in args_dict["resources_config"]: diff --git a/unilabos/app/mq.py b/unilabos/app/mq.py index 9f870691..dbaa57cd 100644 --- a/unilabos/app/mq.py +++ b/unilabos/app/mq.py @@ -1,6 +1,7 @@ import json import time import traceback +from typing import Optional import uuid import paho.mqtt.client as mqtt @@ -163,10 +164,12 @@ class MQTTClient: self.client.publish(address, json.dumps(status), qos=2) logger.critical(f"Device status published: address: {address}, {status}") - def publish_job_status(self, feedback_data: dict, job_id: str, status: str): + def publish_job_status(self, feedback_data: dict, job_id: str, status: str, return_info: Optional[str] = None): if self.mqtt_disable: return - jobdata = {"job_id": job_id, "data": feedback_data, "status": status} + if return_info is None: + return_info = "{}" + jobdata = {"job_id": job_id, "data": feedback_data, "status": status, "return_info": return_info} self.client.publish(f"labs/{MQConfig.lab_id}/job/list/", json.dumps(jobdata), qos=2) def publish_registry(self, device_id: str, device_info: dict): diff --git a/unilabos/app/web/client.py b/unilabos/app/web/client.py index da5d0696..648859f6 100644 --- a/unilabos/app/web/client.py +++ b/unilabos/app/web/client.py @@ -30,18 +30,18 @@ class HTTPClient: self.auth = MQConfig.lab_id info(f"HTTPClient 初始化完成: remote_addr={self.remote_addr}") - def resource_add(self, resources: List[Dict[str, Any]]) -> requests.Response: + def resource_add(self, resources: List[Dict[str, Any]], database_process_later:bool) -> requests.Response: """ 添加资源 Args: resources: 要添加的资源列表 - + database_process_later: 后台处理资源 Returns: Response: API响应对象 """ response = requests.post( - f"{self.remote_addr}/lab/resource/", + f"{self.remote_addr}/lab/resource/?database_process_later={1 if database_process_later else 0}", json=resources, headers={"Authorization": f"lab {self.auth}"}, timeout=5, diff --git a/unilabos/devices/liquid_handling/biomek.py b/unilabos/devices/liquid_handling/biomek.py new file mode 100644 index 00000000..ea71c6dd --- /dev/null +++ b/unilabos/devices/liquid_handling/biomek.py @@ -0,0 +1,1106 @@ +import json +import pathlib +from typing import Sequence, Optional, List, Union, Literal + +import requests +from geometry_msgs.msg import Point +from pylabrobot.liquid_handling import LiquidHandler +from pylabrobot.resources import ( + TipRack, + Container, + Coordinate, +) +from unilabos_msgs.msg import Resource + +from unilabos.ros.nodes.resource_tracker import DeviceNodeResourceTracker # type: ignore + + +class LiquidHandlerBiomek: + """ + Biomek液体处理器的实现类,继承自LiquidHandlerAbstract。 + 该类用于处理Biomek液体处理器的特定操作。 + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._status = "Idle" # 初始状态为 Idle + self._success = False # 初始成功状态为 False + self._status_queue = kwargs.get("status_queue", None) # 状态队列 + self.temp_protocol = {} + self.py32_path = "/opt/py32" # Biomek的Python 3.2路径 + + # 预定义的仪器分类 + self.tip_racks = [ + "BC230", "BC1025F", "BC50", "TipRack200", "TipRack1000", + "tip", "tips", "Tip", "Tips" + ] + + self.reservoirs = [ + "AgilentReservoir", "nest_12_reservoir_15ml", "nest_1_reservoir_195ml", + "reservoir", "Reservoir", "waste", "Waste" + ] + + self.plates_96 = [ + "BCDeep96Round", "Matrix96_750uL", "NEST 2ml Deep Well Plate", "nest_96_wellplate_100ul_pcr_full_skirt", + "nest_96_wellplate_200ul_flat", "Matrix96", "96", "plate", "Plate" + ] + + self.aspirate_techniques = { + 'MC P300 high':{ + 'Position': 'P1', + 'Height': -2.0, + 'Volume': '50', + 'liquidtype': 'Well Contents', + 'WellsX': 12, + 'LabwareClass': 'Matrix96_750uL', + 'AutoSelectPrototype': True, + 'ColsFirst': True, + 'CustomHeight': False, + 'DataSetPattern': False, + 'HeightFrom': 0, + 'LocalPattern': True, + 'Operation': 'Aspirate', + 'OverrideHeight': False, + 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), + 'Prototype': 'MC P300 High', + 'ReferencedPattern': '', + 'RowsFirst': False, + 'SectionExpression': '', + 'SelectionInfo': (1,), + 'SetMark': True, + 'Source': True, + 'StartAtMark': False, + 'StartAtSelection': True, + 'UseExpression': False}, + } + + self.dispense_techniques = { + 'MC P300 high':{ + 'Position': 'P11', + 'Height': -2.0, + 'Volume': '50', + 'liquidtype': 'Tip Contents', + 'WellsX': 12, + 'LabwareClass': 'Matrix96_750uL', + 'AutoSelectPrototype': True, + 'ColsFirst': True, + 'CustomHeight': False, + 'DataSetPattern': False, + 'HeightFrom': 0, + 'LocalPattern': True, + 'Operation': 'Dispense', + 'OverrideHeight': False, + 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), + 'Prototype': 'MC P300 High', + 'ReferencedPattern': '', + 'RowsFirst': False, + 'SectionExpression': '', + 'SelectionInfo': (1,), + 'SetMark': True, + 'Source': False, + 'StartAtMark': False, + 'StartAtSelection': True, + 'UseExpression': False} + } + + def _get_instrument_type(self, class_name: str) -> str: + """ + 根据class_name判断仪器类型 + + Returns: + str: "tip_rack", "reservoir", "plate_96", 或 "unknown" + """ + # 检查是否是枪头架 + for tip_name in self.tip_racks: + if tip_name in class_name: + return "tip_rack" + + # 检查是否是储液槽 + for reservoir_name in self.reservoirs: + if reservoir_name in class_name: + return "reservoir" + + # 检查是否是96孔板 + for plate_name in self.plates_96: + if plate_name in class_name: + return "plate_96" + + return "unknown" + + @classmethod + def deserialize(cls, data: dict, allow_marshal: bool = False) -> LiquidHandler: + return LiquidHandler.deserialize(data, allow_marshal) + + @property + def success(self): + """ + 获取操作是否成功的状态。 + + Returns: + bool: 如果操作成功,返回True;否则返回False。 + """ + return self._success + + def create_protocol( + self, + protocol_name: str, + protocol_description: str, + protocol_version: str, + protocol_author: str, + protocol_date: str, + protocol_type: str, + none_keys: List[str] = [], + ): + """ + 创建一个新的协议。 + + Args: + protocol_name (str): 协议名称 + protocol_description (str): 协议描述 + protocol_version (str): 协议版本 + protocol_author (str): 协议作者 + protocol_date (str): 协议日期 + protocol_type (str): 协议类型 + none_keys (List[str]): 需要设置为None的键列表 + + Returns: + dict: 创建的协议字典 + """ + self.temp_protocol = { + "meta": { + "name": protocol_name, + "description": protocol_description, + "version": protocol_version, + "author": protocol_author, + "date": protocol_date, + "type": protocol_type, + }, + "labwares": {}, + "steps": [], + } + return self.temp_protocol + + def run_protocol(self): + """ + 执行创建的实验流程。 + 工作站的完整执行流程是, + 从 create_protocol 开始,创建新的 method, + 随后执行 transfer_liquid 等操作向实验流程添加步骤, + 最后 run_protocol 执行整个方法。 + + Returns: + dict: 执行结果 + """ + #use popen or subprocess to create py32 process and communicate send the temp protocol to it + if not self.temp_protocol: + raise ValueError("No protocol created. Please create a protocol first.") + + # 模拟执行协议 + self._status = "Running" + self._success = True + # 在这里可以添加实际执行协议的逻辑 + + response = requests.post("localhost:5000/api/protocols", json=self.temp_protocol) + + def create_resource( + self, + resource_tracker: DeviceNodeResourceTracker, + resources: list[Resource], + bind_parent_id: str, + bind_location: dict[str, float], + liquid_input_slot: list[int], + liquid_type: list[str], + liquid_volume: list[int], + slot_on_deck: int, + ): + """ + 创建一个新的资源。 + + Args: + device_id (str): 设备ID + res_id (str): 资源ID + class_name (str): 资源类名 + parent (str): 父级ID + bind_locations (Point): 绑定位置 + liquid_input_slot (list[int]): 液体输入槽列表 + liquid_type (list[str]): 液体类型列表 + liquid_volume (list[int]): 液体体积列表 + slot_on_deck (int): 甲板上的槽位 + + Returns: + dict: 创建的资源字典 + """ + # TODO:需要对好接口,下面这个是临时的 + for resource in resources: + res_id = resource.id + class_name = resource.name + parent = bind_parent_id + liquid_input_slot = liquid_input_slot + liquid_type = liquid_type + liquid_volume = liquid_volume + slot_on_deck = slot_on_deck + + resource = { + "id": res_id, + "class": class_name, + "parent": parent, + "bind_locations": bind_location, + "liquid_input_slot": liquid_input_slot, + "liquid_type": liquid_type, + "liquid_volume": liquid_volume, + "slot_on_deck": slot_on_deck, + } + self.temp_protocol["labwares"].append(resource) + return resources + + def transfer_liquid( + self, + sources: Sequence[Container], + targets: Sequence[Container], + tip_racks: Sequence[TipRack], + *, + use_channels: Optional[List[int]] = None, + asp_vols: Union[List[float], float], + dis_vols: Union[List[float], float], + asp_flow_rates: Optional[List[Optional[float]]] = None, + dis_flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + touch_tip: bool = False, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Literal["wide", "tight", "custom"] = "wide", + is_96_well: bool = False, + mix_stage: Optional[Literal["none", "before", "after", "both"]] = "none", + mix_times: Optional[int] = None, + mix_vol: Optional[int] = None, + mix_rate: Optional[int] = None, + mix_liquid_height: Optional[float] = None, + delays: Optional[List[int]] = None, + none_keys: List[str] = [] + ): + + transfer_params = { + "Span8": False, + "Pod": "Pod1", + "items": {}, + "Wash": False, + "Dynamic?": True, + "AutoSelectActiveWashTechnique": False, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": False, + "ChangeTipsBetweenSources": False, + "DefaultCaption": "", + "UseExpression": False, + "LeaveTipsOn": False, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": False, + "Replicates": "1", + "ShowTipHandlingDetails": False, + "ShowTransferDetails": True, + "Solvent": "Well Content", + "Span8Wash": False, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": False, + "SplitVolumeCleaning": False, + "Stop": "Destinations", + "TipLocation": "BC1025F", + "UseCurrentTips": False, + "UseDisposableTips": True, + "UseFixedTips": False, + "UseJIT": True, + "UseMandrelSelection": True, + "UseProbes": [True, True, True, True, True, True, True, True], + "WashCycles": "1", + "WashVolume": "110%", + "Wizard": False + } + + items: dict = {} + for idx, (src, dst) in enumerate(zip(sources, targets)): + items[str(idx)] = { + "Source": str(src), + "Destination": str(dst), + "Volume": dis_vols[idx] + } + transfer_params["items"] = items + + transfer_params["Solvent"] = "Water" + TipLocation = tip_racks[0].name + transfer_params["TipLocation"] = TipLocation + + if len(tip_racks) == 1: + transfer_params['UseCurrentTips'] = True + elif len(tip_racks) > 1: + transfer_params["ChangeTipsBetweenDests"] = True + + self.temp_protocol["steps"].append(transfer_params) + + return + + def instrument_setup_biomek( + self, + id: str, + parent: str, + slot_on_deck: str, + class_name: str, + liquid_type: list[str], + liquid_volume: list[int], + liquid_input_wells: list[str], + ): + """ + 设置Biomek仪器的参数配置,按照DeckItems格式 + + 根据不同的仪器类型(容器、tip rack等)设置相应的参数结构 + 位置作为键,配置列表作为值 + """ + + # 判断仪器类型 + instrument_type = self._get_instrument_type(class_name) + + config = None # 初始化为None + + if instrument_type == "reservoir": + # 储液槽类型配置 + config = { + "Properties": { + "Name": id, # 使用id作为名称 + "Device": "", + "liquidtype": liquid_type[0] if liquid_type else "Water", + "BarCode": "", + "SenseEveryTime": False + }, + "Known": True, + "Class": f"LabwareClasses\\{class_name}", + "DataSets": {"Volume": {}}, + "RuntimeDataSets": {"Volume": {}}, + "EvalAmounts": (float(liquid_volume[0]),) if liquid_volume else (0,), + "Nominal": False, + "EvalLiquids": (liquid_type[0],) if liquid_type else ("Water",) + } + + elif instrument_type == "plate_96": + # 96孔板类型配置 + volume_per_well = float(liquid_volume[0]) if liquid_volume else 0 + liquid_per_well = liquid_type[0] if liquid_type else "Water" + + config = { + "Properties": { + "Name": id, # 使用id作为名称 + "Device": "", + "liquidtype": liquid_per_well, + "BarCode": "", + "SenseEveryTime": False + }, + "Known": True, + "Class": f"LabwareClasses\\{class_name}", + "DataSets": {"Volume": {}}, + "RuntimeDataSets": {"Volume": {}}, + "EvalAmounts": tuple([volume_per_well] * 96), + "Nominal": False, + "EvalLiquids": tuple([liquid_per_well] * 96) + } + + elif instrument_type == "tip_rack": + # 枪头架类型配置 + tip_config = { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": False, + "RT_Used": False, + "Dirty": False, + "RT_Dirty": False, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + } + + config = { + "Tips": tip_config, + "RT_Tips": tip_config.copy(), + "Properties": {}, + "Known": False, + "Class": f"LabwareClasses\\{class_name}", + "DataSets": {"Volume": {}}, + "RuntimeDataSets": {"Volume": {}} + } + + # 按照DeckItems格式存储:位置作为键,配置列表作为值 + if config is not None: + self.temp_protocol["labwares"][slot_on_deck] = [config] + else: + # 空位置 + self.temp_protocol["labwares"][slot_on_deck] = [] + + return + + def transfer_biomek( + self, + source: str, + target: str, + tip_rack: str, + volume: float, + aspirate_techniques: str, + dispense_techniques: str, + ): + """ + 处理Biomek的液体转移操作。 + + """ + items = [] + + asp_params = self.aspirate_techniques.get(aspirate_techniques, {}) + dis_params = self.dispense_techniques.get(dispense_techniques, {}) + + asp_params['Position'] = source + dis_params['Position'] = target + asp_params['Volume'] = str(volume) + dis_params['Volume'] = str(volume) + + items.append(asp_params) + items.append(dis_params) + + transfer_params = { + "Span8": False, + "Pod": "Pod1", + "items": [], + "Wash": False, + "Dynamic?": True, + "AutoSelectActiveWashTechnique": False, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": True, + "ChangeTipsBetweenSources": False, + "DefaultCaption": "", + "UseExpression": False, + "LeaveTipsOn": False, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": False, + "Replicates": "1", + "ShowTipHandlingDetails": False, + "ShowTransferDetails": True, + "Solvent": "Water", + "Span8Wash": False, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": False, + "SplitVolumeCleaning": False, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": False, + "UseDisposableTips": False, + "UseFixedTips": False, + "UseJIT": True, + "UseMandrelSelection": True, + "UseProbes": [True, True, True, True, True, True, True, True], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": False + } + transfer_params["items"] = items + transfer_params["Solvent"] = 'Water' + transfer_params["TipLocation"] = tip_rack + tmp={'transfer': transfer_params} + self.temp_protocol["steps"].append(tmp) + + return + + + def move_biomek( + self, + source: str, + target: str, + ): + """ + 处理Biomek移动板子的操作。 + + """ + + move_params = { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": source, + "Target": target, + "LeaveBottomLabware": False, + } + self.temp_protocol["steps"].append(move_params) + + return + + def incubation_biomek( + self, + time: int, + ): + """ + 处理Biomek的孵育操作。 + """ + incubation_params = { + "Message": "Paused", + "Location": "the whole system", + "Time": time, + "Mode": "TimedResource" + } + self.temp_protocol["steps"].append(incubation_params) + + return + + def oscillation_biomek( + self, + rpm: int, + time: int, + ): + """ + 处理Biomek的振荡操作。 + """ + oscillation_params = { + 'Device': 'OrbitalShaker0', + 'Parameters': (str(rpm), '2', str(time), 'CounterClockwise'), + 'Command': 'Timed Shake' + } + self.temp_protocol["steps"].append(oscillation_params) + + return + + +if __name__ == "__main__": + + print("=== Biomek完整流程测试 ===") + print("包含: 仪器设置 + 完整实验步骤") + + # 完整的步骤信息(从biomek.py复制) + steps_info = ''' + { + "steps": [ + { + "step_number": 1, + "operation": "transfer", + "description": "转移PCR产物或酶促反应液至0.5ml 96孔板中", + "parameters": { + "source": "P1", + "target": "P11", + "tip_rack": "BC230", + "volume": 50 + } + }, + { + "step_number": 2, + "operation": "transfer", + "description": "加入2倍体积的Bind Beads BC至产物中", + "parameters": { + "source": "P2", + "target": "P11", + "tip_rack": "BC230", + "volume": 100 + } + }, + { + "step_number": 3, + "operation": "oscillation", + "description": "振荡混匀300秒", + "parameters": { + "rpm": 800, + "time": 300 + } + }, + { + "step_number": 4, + "operation": "move_labware", + "description": "转移至96孔磁力架上吸附3分钟", + "parameters": { + "source": "P11", + "target": "P12" + } + }, + { + "step_number": 5, + "operation": "incubation", + "description": "吸附3分钟", + "parameters": { + "time": 180 + } + }, + { + "step_number": 6, + "operation": "transfer", + "description": "吸弃或倒除上清液", + "parameters": { + "source": "P12", + "target": "P22", + "tip_rack": "BC230", + "volume": 150 + } + }, + { + "step_number": 7, + "operation": "transfer", + "description": "加入300-500μl 75%乙醇", + "parameters": { + "source": "P3", + "target": "P12", + "tip_rack": "BC230", + "volume": 400 + } + }, + { + "step_number": 8, + "operation": "move_labware", + "description": "移动至振荡器进行振荡混匀", + "parameters": { + "source": "P12", + "target": "Orbital1" + } + }, + { + "step_number": 9, + "operation": "oscillation", + "description": "振荡混匀60秒", + "parameters": { + "rpm": 800, + "time": 60 + } + }, + { + "step_number": 10, + "operation": "move_labware", + "description": "转移至96孔磁力架上吸附3分钟", + "parameters": { + "source": "Orbital1", + "target": "P12" + } + }, + { + "step_number": 11, + "operation": "incubation", + "description": "吸附3分钟", + "parameters": { + "time": 180 + } + }, + { + "step_number": 12, + "operation": "transfer", + "description": "吸弃或倒弃废液", + "parameters": { + "source": "P12", + "target": "P22", + "tip_rack": "BC230", + "volume": 400 + } + }, + { + "step_number": 13, + "operation": "transfer", + "description": "重复加入75%乙醇", + "parameters": { + "source": "P3", + "target": "P12", + "tip_rack": "BC230", + "volume": 400 + } + }, + { + "step_number": 14, + "operation": "move_labware", + "description": "移动至振荡器进行振荡混匀", + "parameters": { + "source": "P12", + "target": "Orbital1" + } + }, + { + "step_number": 15, + "operation": "oscillation", + "description": "振荡混匀60秒", + "parameters": { + "rpm": 800, + "time": 60 + } + }, + { + "step_number": 16, + "operation": "move_labware", + "description": "转移至96孔磁力架上吸附3分钟", + "parameters": { + "source": "Orbital1", + "target": "P12" + } + }, + { + "step_number": 17, + "operation": "incubation", + "description": "吸附3分钟", + "parameters": { + "time": 180 + } + }, + { + "step_number": 18, + "operation": "transfer", + "description": "吸弃或倒弃废液", + "parameters": { + "source": "P12", + "target": "P22", + "tip_rack": "BC230", + "volume": 400 + } + }, + { + "step_number": 19, + "operation": "move_labware", + "description": "正放96孔板,空气干燥15分钟", + "parameters": { + "source": "P12", + "target": "P13" + } + }, + { + "step_number": 20, + "operation": "incubation", + "description": "空气干燥15分钟", + "parameters": { + "time": 900 + } + }, + { + "step_number": 21, + "operation": "transfer", + "description": "加入30-50μl Elution Buffer", + "parameters": { + "source": "P4", + "target": "P13", + "tip_rack": "BC230", + "volume": 40 + } + }, + { + "step_number": 22, + "operation": "move_labware", + "description": "移动至振荡器进行振荡混匀", + "parameters": { + "source": "P13", + "target": "Orbital1" + } + }, + { + "step_number": 23, + "operation": "oscillation", + "description": "振荡混匀60秒", + "parameters": { + "rpm": 800, + "time": 60 + } + }, + { + "step_number": 24, + "operation": "move_labware", + "description": "室温静置3分钟", + "parameters": { + "source": "Orbital1", + "target": "P13" + } + }, + { + "step_number": 25, + "operation": "incubation", + "description": "室温静置3分钟", + "parameters": { + "time": 180 + } + }, + { + "step_number": 26, + "operation": "move_labware", + "description": "转移至96孔磁力架上吸附2分钟", + "parameters": { + "source": "P13", + "target": "P12" + } + }, + { + "step_number": 27, + "operation": "incubation", + "description": "吸附2分钟", + "parameters": { + "time": 120 + } + }, + { + "step_number": 28, + "operation": "transfer", + "description": "将DNA转移至新的板中", + "parameters": { + "source": "P12", + "target": "P14", + "tip_rack": "BC230", + "volume": 40 + } + } + ] + } +''' + # 完整的labware配置信息 + labware_with_liquid = ''' + [ + { + "id": "Tip Rack BC230 TL1", + "parent": "deck", + "slot_on_deck": "TL1", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 TL2", + "parent": "deck", + "slot_on_deck": "TL2", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 TL3", + "parent": "deck", + "slot_on_deck": "TL3", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 TL4", + "parent": "deck", + "slot_on_deck": "TL4", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 TL5", + "parent": "deck", + "slot_on_deck": "TL5", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 P5", + "parent": "deck", + "slot_on_deck": "P5", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 P6", + "parent": "deck", + "slot_on_deck": "P6", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 P15", + "parent": "deck", + "slot_on_deck": "P15", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 P16", + "parent": "deck", + "slot_on_deck": "P16", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "stock plate on P1", + "parent": "deck", + "slot_on_deck": "P1", + "class_name": "AgilentReservoir", + "liquid_type": ["PCR product"], + "liquid_volume": [5000], + "liquid_input_wells": ["A1"] + }, + { + "id": "stock plate on P2", + "parent": "deck", + "slot_on_deck": "P2", + "class_name": "AgilentReservoir", + "liquid_type": ["bind beads"], + "liquid_volume": [100000], + "liquid_input_wells": ["A1"] + }, + { + "id": "stock plate on P3", + "parent": "deck", + "slot_on_deck": "P3", + "class_name": "AgilentReservoir", + "liquid_type": ["75% ethanol"], + "liquid_volume": [100000], + "liquid_input_wells": ["A1"] + }, + { + "id": "stock plate on P4", + "parent": "deck", + "slot_on_deck": "P4", + "class_name": "AgilentReservoir", + "liquid_type": ["Elution Buffer"], + "liquid_volume": [5000], + "liquid_input_wells": ["A1"] + }, + { + "id": "working plate on P11", + "parent": "deck", + "slot_on_deck": "P11", + "class_name": "BCDeep96Round", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "working plate on P12", + "parent": "deck", + "slot_on_deck": "P12", + "class_name": "BCDeep96Round", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "working plate on P13", + "parent": "deck", + "slot_on_deck": "P13", + "class_name": "BCDeep96Round", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "working plate on P14", + "parent": "deck", + "slot_on_deck": "P14", + "class_name": "BCDeep96Round", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "waste on P22", + "parent": "deck", + "slot_on_deck": "P22", + "class_name": "AgilentReservoir", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "oscillation", + "parent": "deck", + "slot_on_deck": "Orbital1", + "class_name": "Orbital", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + } + ] + ''' + + # 创建handler实例 + handler = LiquidHandlerBiomek() + + # 创建协议 + protocol = handler.create_protocol( + protocol_name="DNA纯化完整流程", + protocol_description="使用磁珠进行DNA纯化的完整自动化流程", + protocol_version="1.0", + protocol_author="Biomek系统", + protocol_date="2024-01-01", + protocol_type="DNA_purification" + ) + + print("\n=== 第一步:设置所有仪器 ===") + # 解析labware配置 + labwares = json.loads(labware_with_liquid) + + # 设置所有仪器 + instrument_count = 0 + for labware in labwares: + print(f"设置仪器: {labware['id']} ({labware['class_name']}) 在位置 {labware['slot_on_deck']}") + handler.instrument_setup_biomek( + id=labware['id'], + parent=labware['parent'], + slot_on_deck=labware['slot_on_deck'], + class_name=labware['class_name'], + liquid_type=labware['liquid_type'], + liquid_volume=labware['liquid_volume'], + liquid_input_wells=labware['liquid_input_wells'] + ) + instrument_count += 1 + + print(f"总共设置了 {instrument_count} 个仪器位置") + + print("\n=== 第二步:执行实验步骤 ===") + # 解析步骤信息 + input_steps = json.loads(steps_info) + + # 执行所有步骤 + step_count = 0 + for step in input_steps['steps']: + operation = step['operation'] + parameters = step['parameters'] + description = step['description'] + + print(f"步骤 {step['step_number']}: {description}") + + if operation == 'transfer': + handler.transfer_biomek( + source=parameters['source'], + target=parameters['target'], + volume=parameters['volume'], + tip_rack=parameters['tip_rack'], + aspirate_techniques='MC P300 high', + dispense_techniques='MC P300 high' + ) + elif operation == 'move_labware': + handler.move_biomek( + source=parameters['source'], + target=parameters['target'] + ) + elif operation == 'oscillation': + handler.oscillation_biomek( + rpm=parameters['rpm'], + time=parameters['time'] + ) + elif operation == 'incubation': + handler.incubation_biomek( + time=parameters['time'] + ) + + step_count += 1 + + print(f"总共执行了 {step_count} 个步骤") + + print("\n=== 第三步:保存完整协议 ===") + # 获取脚本目录 + script_dir = pathlib.Path(__file__).parent + + # 保存完整协议 + complete_output_path = script_dir / "complete_biomek_protocol_0608.json" + with open(complete_output_path, 'w', encoding='utf-8') as f: + json.dump(handler.temp_protocol, f, indent=4, ensure_ascii=False) + + print(f"完整协议已保存到: {complete_output_path}") + + print("\n=== 测试完成 ===") + print("完整的DNA纯化流程已成功转换为Biomek格式!") diff --git a/unilabos/devices/liquid_handling/biomek.txt b/unilabos/devices/liquid_handling/biomek.txt new file mode 100644 index 00000000..2d830a6d --- /dev/null +++ b/unilabos/devices/liquid_handling/biomek.txt @@ -0,0 +1,642 @@ + + 当前方法 Method0530 包含 36 个步骤 + + 步骤 0: + Bitmap: OStepUI.ocx,START + Let: {} + Weak: {} + Prompt: {} + + 步骤 1: + BarcodeInput?: False + DeckItems: {'P1': [{'Properties': {'Name': '', 'Device': '', 'liquidtype': 'Water', 'BarCode': '', 'SenseEveryTime': False}, 'Known': True, 'Class': 'LabwareClasses\\Matrix96_750uL', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}, 'EvalAmounts': (500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0), 'Nominal': False, 'EvalLiquids': ('Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water')}], 'P10': [{'Tips': {'Class': 'TipClasses\\T50F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'RT_Tips': {'Class': 'TipClasses\\T50F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'Properties': {}, 'Known': False, 'Class': 'LabwareClasses\\BC50F', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}}], 'P8': [], 'P9': [{'Tips': {'Class': 'TipClasses\\T50F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'RT_Tips': {'Class': 'TipClasses\\T50F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'Properties': {}, 'Known': False, 'Class': 'LabwareClasses\\BC50F', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}}], 'P11': [{'Properties': {'Name': '', 'Device': '', 'liquidtype': 'Water', 'BarCode': '', 'SenseEveryTime': False}, 'Known': True, 'Class': 'LabwareClasses\\BCDeep96Round', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}, 'EvalAmounts': (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), 'Nominal': False, 'EvalLiquids': ('Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water')}], 'P12': [], 'P13': [{'Properties': {'Name': '', 'Device': '', 'liquidtype': 'Water', 'BarCode': '', 'SenseEveryTime': False}, 'Known': True, 'Class': 'LabwareClasses\\BCDeep96Round', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}, 'EvalAmounts': (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), 'Nominal': False, 'EvalLiquids': ('Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water')}], 'P14': [], 'P15': [], 'P16': [{'Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'RT_Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'Properties': {}, 'Known': False, 'Class': 'LabwareClasses\\BC1025F', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}}], 'P17': [{'Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'RT_Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'Properties': {}, 'Known': False, 'Class': 'LabwareClasses\\BC1025F', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}}], 'P18': [{'Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'RT_Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'Properties': {}, 'Known': False, 'Class': 'LabwareClasses\\BC1025F', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}}], 'P19': [{'Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'RT_Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'Properties': {}, 'Known': False, 'Class': 'LabwareClasses\\BC1025F', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}}], 'P20': [], 'P2': [{'Properties': {'Name': '', 'Device': '', 'liquidtype': 'Water', 'BarCode': '', 'SenseEveryTime': False}, 'Known': True, 'Class': 'LabwareClasses\\Matrix96_750uL', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}, 'EvalAmounts': (500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0), 'Nominal': False, 'EvalLiquids': ('Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water')}], 'P21': [], 'P22': [{'Properties': {'Name': '', 'Device': '', 'liquidtype': 'Water', 'BarCode': '', 'SenseEveryTime': False}, 'Known': True, 'Class': 'LabwareClasses\\AgilentReservoir', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}, 'EvalAmounts': (0.0,), 'Nominal': False, 'EvalLiquids': ('Water',)}], 'P23': [], 'P24': [], 'P25': [], 'P26': [], 'P27': [], 'P28': [{'Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'RT_Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'Properties': {}, 'Known': False, 'Class': 'LabwareClasses\\BC1025F', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}}], 'P29': [{'Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'RT_Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'Properties': {}, 'Known': False, 'Class': 'LabwareClasses\\BC1025F', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}}], 'P30': [], 'P3': [{'Properties': {'Name': '', 'Device': '', 'liquidtype': 'Water', 'BarCode': '', 'SenseEveryTime': False}, 'Known': True, 'Class': 'LabwareClasses\\AgilentReservoir', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}, 'EvalAmounts': (300000.0,), 'Nominal': False, 'EvalLiquids': ('Water',)}], 'P4': [{'Properties': {'Name': '', 'Device': '', 'liquidtype': 'Water', 'BarCode': '', 'SenseEveryTime': False}, 'Known': True, 'Class': 'LabwareClasses\\Matrix96_750uL', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}, 'EvalAmounts': (500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0), 'Nominal': False, 'EvalLiquids': ('Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water', 'Water')}], 'P5': [], 'P6': [], 'P7': [], 'TL1': [{'Tips': {'Class': 'TipClasses\\T230', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'RT_Tips': {'Class': 'TipClasses\\T230', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'Properties': {}, 'Known': False, 'Class': 'LabwareClasses\\BC230', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}}], 'TL2': [{'Tips': {'Class': 'TipClasses\\T230', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'RT_Tips': {'Class': 'TipClasses\\T230', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'Properties': {}, 'Known': False, 'Class': 'LabwareClasses\\BC230', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}}], 'TL3': [{'Tips': {'Class': 'TipClasses\\T230', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'RT_Tips': {'Class': 'TipClasses\\T230', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'Properties': {}, 'Known': False, 'Class': 'LabwareClasses\\BC230', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}}], 'TL4': [{'Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'RT_Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'Properties': {}, 'Known': False, 'Class': 'LabwareClasses\\BC1025F', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}}], 'TL5': [{'Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'RT_Tips': {'Class': 'TipClasses\\T1025F', 'Contents': [], '_RT_Contents': [], 'Used': False, 'RT_Used': False, 'Dirty': False, 'RT_Dirty': False, 'MaxVolumeUsed': 0.0, 'RT_MaxVolumeUsed': 0.0}, 'Properties': {}, 'Known': False, 'Class': 'LabwareClasses\\BC1025F', 'DataSets': {'Volume': {}}, 'RuntimeDataSets': {'Volume': {}}}], 'TR1': [], 'WS1': 'Water'} + Layout: Multichannel + Pause?: True + PodSetup: {'LeftHasTips': False, 'LeftTipType': '', 'RightHasTips': False, 'RightTipType': ''} + SplitterPosition: 206 + VerifyPodSetup?: True + + 步骤 2: + Span8: False + Pod: Pod1 + Wash: False + items: [{'Position': 'P1', 'Height': -2.0, 'Volume': '50', 'liquidtype': 'Well Contents', 'WellsX': 12, 'LabwareClass': 'Matrix96_750uL', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Aspirate', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': True, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}, {'Position': 'P11', 'Height': -2.0, 'Volume': '50', 'liquidtype': 'Tip Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Dispense', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': False, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}] + Dynamic?: True + AutoSelectActiveWashTechnique: False + ActiveWashTechnique: + ChangeTipsBetweenDests: True + ChangeTipsBetweenSources: False + DefaultCaption: Transfer 50 µL from P1 to P11 + UseExpression: False + LeaveTipsOn: False + MandrelExpression: + Repeats: 1 + RepeatsByVolume: False + Replicates: 1 + ShowTipHandlingDetails: True + ShowTransferDetails: True + Solvent: Water + Span8Wash: False + Span8WashVolume: 2 + Span8WasteVolume: 1 + SplitVolume: False + SplitVolumeCleaning: False + Stop: Destinations + TipLocation: BC230 + UseCurrentTips: False + UseDisposableTips: False + UseFixedTips: False + UseJIT: True + UseMandrelSelection: True + UseProbes: (True, True, True, True, True, True, True, True) + WashCycles: 4 + WashVolume: 110% + Wizard: False + + 步骤 3: + Span8: False + Pod: Pod1 + Wash: False + items: [{'Position': 'P2', 'Height': -2.0, 'Volume': '100', 'liquidtype': 'Well Contents', 'WellsX': 12, 'LabwareClass': 'Matrix96_750uL', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Aspirate', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': True, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}, {'Position': 'P11', 'Height': -2.0, 'Volume': '100', 'liquidtype': 'Tip Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Dispense', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': False, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}] + Dynamic?: True + AutoSelectActiveWashTechnique: False + ActiveWashTechnique: + ChangeTipsBetweenDests: True + ChangeTipsBetweenSources: False + DefaultCaption: Transfer 100 µL from P2 to P11 + UseExpression: False + LeaveTipsOn: False + MandrelExpression: + Repeats: 1 + RepeatsByVolume: False + Replicates: 1 + ShowTipHandlingDetails: True + ShowTransferDetails: True + Solvent: Water + Span8Wash: False + Span8WashVolume: 2 + Span8WasteVolume: 1 + SplitVolume: False + SplitVolumeCleaning: False + Stop: Destinations + TipLocation: BC230 + UseCurrentTips: False + UseDisposableTips: False + UseFixedTips: False + UseJIT: True + UseMandrelSelection: True + UseProbes: (True, True, True, True, True, True, True, True) + WashCycles: 4 + WashVolume: 110% + Wizard: False + + 步骤 4: + Pod: Pod1 + GripSide: A1 near + Source: P11 + Target: Orbital1 + LeaveBottomLabware: False + + 步骤 5: + Device: + Parameters: () + Command: + + 步骤 6: + Device: + Parameters: () + Command: + + 步骤 7: + Pod: Pod1 + GripSide: A1 near + Source: Orbital1 + Target: P11 + LeaveBottomLabware: False + + 步骤 8: + Pod: Pod1 + GripSide: A1 near + Source: P11 + Target: P12 + LeaveBottomLabware: False + + 步骤 9: + Message: Paused + Location: the whole system + Time: 180 + Mode: TimedResource + + 步骤 10: + Span8: False + Pod: Pod1 + Wash: False + items: [{'Position': 'P12', 'Height': -2.0, 'Volume': '150', 'liquidtype': 'Well Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Aspirate', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': True, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}, {'Position': 'P22', 'Height': -2.0, 'Volume': '150', 'liquidtype': 'Tip Contents', 'LabwareClass': 'AgilentReservoir', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Dispense', 'OverrideHeight': False, 'Pattern': (True,), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': False, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}] + Dynamic?: True + AutoSelectActiveWashTechnique: False + ActiveWashTechnique: + ChangeTipsBetweenDests: True + ChangeTipsBetweenSources: False + DefaultCaption: Transfer 150 µL from P12 to P22 + UseExpression: False + LeaveTipsOn: False + MandrelExpression: + Repeats: 1 + RepeatsByVolume: False + Replicates: 1 + ShowTipHandlingDetails: True + ShowTransferDetails: True + Solvent: Water + Span8Wash: False + Span8WashVolume: 2 + Span8WasteVolume: 1 + SplitVolume: False + SplitVolumeCleaning: False + Stop: Destinations + TipLocation: BC230 + UseCurrentTips: False + UseDisposableTips: False + UseFixedTips: False + UseJIT: True + UseMandrelSelection: True + UseProbes: (True, True, True, True, True, True, True, True) + WashCycles: 4 + WashVolume: 110% + Wizard: False + + 步骤 11: + Span8: False + Pod: Pod1 + Wash: False + items: [{'Position': 'P3', 'Height': -2.0, 'Volume': '400', 'liquidtype': 'Well Contents', 'LabwareClass': 'AgilentReservoir', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Aspirate', 'OverrideHeight': False, 'Pattern': (True,), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': True, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}, {'Position': 'P12', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Tip Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Dispense', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': False, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}] + Dynamic?: True + AutoSelectActiveWashTechnique: False + ActiveWashTechnique: + ChangeTipsBetweenDests: True + ChangeTipsBetweenSources: False + DefaultCaption: Transfer 200 µL from P3 to P12 + UseExpression: False + LeaveTipsOn: False + MandrelExpression: + Repeats: 1 + RepeatsByVolume: False + Replicates: 1 + ShowTipHandlingDetails: True + ShowTransferDetails: True + Solvent: Water + Span8Wash: False + Span8WashVolume: 2 + Span8WasteVolume: 1 + SplitVolume: False + SplitVolumeCleaning: False + Stop: Destinations + TipLocation: BC1025F + UseCurrentTips: False + UseDisposableTips: False + UseFixedTips: False + UseJIT: True + UseMandrelSelection: True + UseProbes: (True, True, True, True, True, True, True, True) + WashCycles: 4 + WashVolume: 110% + Wizard: False + + 步骤 12: + Span8: False + Pod: Pod1 + Wash: False + items: [{'Position': 'P3', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Well Contents', 'LabwareClass': 'AgilentReservoir', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Aspirate', 'OverrideHeight': False, 'Pattern': (True,), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': True, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}, {'Position': 'P12', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Tip Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Dispense', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': False, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}] + Dynamic?: True + AutoSelectActiveWashTechnique: False + ActiveWashTechnique: + ChangeTipsBetweenDests: True + ChangeTipsBetweenSources: False + DefaultCaption: Transfer 200 µL from P3 to P12 + UseExpression: False + LeaveTipsOn: False + MandrelExpression: + Repeats: 1 + RepeatsByVolume: False + Replicates: 1 + ShowTipHandlingDetails: True + ShowTransferDetails: True + Solvent: Water + Span8Wash: False + Span8WashVolume: 2 + Span8WasteVolume: 1 + SplitVolume: False + SplitVolumeCleaning: False + Stop: Destinations + TipLocation: BC1025F + UseCurrentTips: False + UseDisposableTips: False + UseFixedTips: False + UseJIT: True + UseMandrelSelection: True + UseProbes: (True, True, True, True, True, True, True, True) + WashCycles: 4 + WashVolume: 110% + Wizard: False + + 步骤 13: + Pod: Pod1 + GripSide: A1 near + Source: P12 + Target: Orbital1 + LeaveBottomLabware: False + + 步骤 14: + Device: + Parameters: () + Command: + + 步骤 15: + Pod: Pod1 + GripSide: A1 near + Source: Orbital1 + Target: P12 + LeaveBottomLabware: False + + 步骤 16: + Message: Paused + Location: the whole system + Time: 180 + Mode: TimedResource + + 步骤 17: + Span8: False + Pod: Pod1 + Wash: False + items: [{'Position': 'P12', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Well Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Aspirate', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': True, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}, {'Position': 'P22', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Tip Contents', 'LabwareClass': 'AgilentReservoir', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Dispense', 'OverrideHeight': False, 'Pattern': (True,), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': False, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}] + Dynamic?: True + AutoSelectActiveWashTechnique: False + ActiveWashTechnique: + ChangeTipsBetweenDests: True + ChangeTipsBetweenSources: False + DefaultCaption: Transfer 200 µL from P12 to P22 + UseExpression: False + LeaveTipsOn: False + MandrelExpression: + Repeats: 1 + RepeatsByVolume: False + Replicates: 1 + ShowTipHandlingDetails: True + ShowTransferDetails: True + Solvent: Water + Span8Wash: False + Span8WashVolume: 2 + Span8WasteVolume: 1 + SplitVolume: False + SplitVolumeCleaning: False + Stop: Destinations + TipLocation: BC1025F + UseCurrentTips: False + UseDisposableTips: False + UseFixedTips: False + UseJIT: True + UseMandrelSelection: True + UseProbes: (True, True, True, True, True, True, True, True) + WashCycles: 4 + WashVolume: 110% + Wizard: False + + 步骤 18: + Span8: False + Pod: Pod1 + Wash: False + items: [{'Position': 'P12', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Well Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Aspirate', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': True, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}, {'Position': 'P22', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Tip Contents', 'LabwareClass': 'AgilentReservoir', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Dispense', 'OverrideHeight': False, 'Pattern': (True,), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': False, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}] + Dynamic?: True + AutoSelectActiveWashTechnique: False + ActiveWashTechnique: + ChangeTipsBetweenDests: True + ChangeTipsBetweenSources: False + DefaultCaption: Transfer 200 µL from P12 to P22 + UseExpression: False + LeaveTipsOn: False + MandrelExpression: + Repeats: 1 + RepeatsByVolume: False + Replicates: 1 + ShowTipHandlingDetails: True + ShowTransferDetails: True + Solvent: Water + Span8Wash: False + Span8WashVolume: 2 + Span8WasteVolume: 1 + SplitVolume: False + SplitVolumeCleaning: False + Stop: Destinations + TipLocation: BC1025F + UseCurrentTips: False + UseDisposableTips: False + UseFixedTips: False + UseJIT: True + UseMandrelSelection: True + UseProbes: (True, True, True, True, True, True, True, True) + WashCycles: 4 + WashVolume: 110% + Wizard: False + + 步骤 19: + Span8: False + Pod: Pod1 + Wash: False + items: [{'Position': 'P3', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Well Contents', 'LabwareClass': 'AgilentReservoir', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Aspirate', 'OverrideHeight': False, 'Pattern': (True,), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': True, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}, {'Position': 'P12', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Tip Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Dispense', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': False, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}] + Dynamic?: True + AutoSelectActiveWashTechnique: False + ActiveWashTechnique: + ChangeTipsBetweenDests: True + ChangeTipsBetweenSources: False + DefaultCaption: Transfer 200 µL from P3 to P12 + UseExpression: False + LeaveTipsOn: False + MandrelExpression: + Repeats: 1 + RepeatsByVolume: False + Replicates: 1 + ShowTipHandlingDetails: True + ShowTransferDetails: True + Solvent: Water + Span8Wash: False + Span8WashVolume: 2 + Span8WasteVolume: 1 + SplitVolume: False + SplitVolumeCleaning: False + Stop: Destinations + TipLocation: BC1025F + UseCurrentTips: False + UseDisposableTips: False + UseFixedTips: False + UseJIT: True + UseMandrelSelection: True + UseProbes: (True, True, True, True, True, True, True, True) + WashCycles: 4 + WashVolume: 110% + Wizard: False + + 步骤 20: + Span8: False + Pod: Pod1 + Wash: False + items: [{'Position': 'P3', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Well Contents', 'LabwareClass': 'AgilentReservoir', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Aspirate', 'OverrideHeight': False, 'Pattern': (True,), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': True, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}, {'Position': 'P12', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Tip Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Dispense', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': False, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}] + Dynamic?: True + AutoSelectActiveWashTechnique: False + ActiveWashTechnique: + ChangeTipsBetweenDests: True + ChangeTipsBetweenSources: False + DefaultCaption: Transfer 200 µL from P3 to P12 + UseExpression: False + LeaveTipsOn: False + MandrelExpression: + Repeats: 1 + RepeatsByVolume: False + Replicates: 1 + ShowTipHandlingDetails: True + ShowTransferDetails: True + Solvent: Water + Span8Wash: False + Span8WashVolume: 2 + Span8WasteVolume: 1 + SplitVolume: False + SplitVolumeCleaning: False + Stop: Destinations + TipLocation: BC1025F + UseCurrentTips: False + UseDisposableTips: False + UseFixedTips: False + UseJIT: True + UseMandrelSelection: True + UseProbes: (True, True, True, True, True, True, True, True) + WashCycles: 4 + WashVolume: 110% + Wizard: False + + 步骤 21: + Pod: Pod1 + GripSide: A1 near + Source: P12 + Target: Orbital1 + LeaveBottomLabware: False + + 步骤 22: + Device: OrbitalShaker0 + Parameters: ('800', '3', '45', 'CounterClockwise', None) + Command: Timed Shake + + 步骤 23: + Pod: Pod1 + GripSide: A1 near + Source: Orbital1 + Target: P12 + LeaveBottomLabware: False + + 步骤 24: + Message: Paused + Location: the whole system + Time: 180 + Mode: TimedResource + + 步骤 25: + Span8: False + Pod: Pod1 + Wash: False + items: [{'Position': 'P12', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Well Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Aspirate', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': True, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}, {'Position': 'P22', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Tip Contents', 'LabwareClass': 'AgilentReservoir', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Dispense', 'OverrideHeight': False, 'Pattern': (True,), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': False, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}] + Dynamic?: True + AutoSelectActiveWashTechnique: False + ActiveWashTechnique: + ChangeTipsBetweenDests: True + ChangeTipsBetweenSources: False + DefaultCaption: Transfer 200 µL from P12 to P22 + UseExpression: False + LeaveTipsOn: False + MandrelExpression: + Repeats: 1 + RepeatsByVolume: False + Replicates: 1 + ShowTipHandlingDetails: True + ShowTransferDetails: True + Solvent: Water + Span8Wash: False + Span8WashVolume: 2 + Span8WasteVolume: 1 + SplitVolume: False + SplitVolumeCleaning: False + Stop: Destinations + TipLocation: BC1025F + UseCurrentTips: False + UseDisposableTips: False + UseFixedTips: False + UseJIT: True + UseMandrelSelection: True + UseProbes: (True, True, True, True, True, True, True, True) + WashCycles: 4 + WashVolume: 110% + Wizard: False + + 步骤 26: + Span8: False + Pod: Pod1 + Wash: False + items: [{'Position': 'P12', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Well Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Aspirate', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': True, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}, {'Position': 'P22', 'Height': -2.0, 'Volume': '200', 'liquidtype': 'Tip Contents', 'LabwareClass': 'AgilentReservoir', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Dispense', 'OverrideHeight': False, 'Pattern': (True,), 'Prototype': 'MC P300 High', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': False, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}] + Dynamic?: True + AutoSelectActiveWashTechnique: False + ActiveWashTechnique: + ChangeTipsBetweenDests: True + ChangeTipsBetweenSources: False + DefaultCaption: Transfer 200 µL from P12 to P22 + UseExpression: False + LeaveTipsOn: False + MandrelExpression: + Repeats: 1 + RepeatsByVolume: False + Replicates: 1 + ShowTipHandlingDetails: True + ShowTransferDetails: True + Solvent: Water + Span8Wash: False + Span8WashVolume: 2 + Span8WasteVolume: 1 + SplitVolume: False + SplitVolumeCleaning: False + Stop: Destinations + TipLocation: BC1025F + UseCurrentTips: False + UseDisposableTips: False + UseFixedTips: False + UseJIT: True + UseMandrelSelection: True + UseProbes: (True, True, True, True, True, True, True, True) + WashCycles: 4 + WashVolume: 110% + Wizard: False + + 步骤 27: + Message: Paused + Location: the whole system + Time: 900 + Mode: TimedResource + + 步骤 28: + Span8: False + Pod: Pod1 + Wash: False + items: [{'Position': 'P4', 'Height': -2.0, 'Volume': '40', 'liquidtype': 'Well Contents', 'WellsX': 12, 'LabwareClass': 'Matrix96_750uL', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Aspirate', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': True, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}, {'Position': 'P12', 'Height': -2.0, 'Volume': '40', 'liquidtype': 'Tip Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Dispense', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': False, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}] + Dynamic?: True + AutoSelectActiveWashTechnique: False + ActiveWashTechnique: + ChangeTipsBetweenDests: True + ChangeTipsBetweenSources: False + DefaultCaption: Transfer 40 µL from P4 to P12 + UseExpression: False + LeaveTipsOn: False + MandrelExpression: + Repeats: 1 + RepeatsByVolume: False + Replicates: 1 + ShowTipHandlingDetails: True + ShowTransferDetails: True + Solvent: Water + Span8Wash: False + Span8WashVolume: 2 + Span8WasteVolume: 1 + SplitVolume: False + SplitVolumeCleaning: False + Stop: Destinations + TipLocation: BC50F + UseCurrentTips: False + UseDisposableTips: False + UseFixedTips: False + UseJIT: True + UseMandrelSelection: True + UseProbes: (True, True, True, True, True, True, True, True) + WashCycles: 4 + WashVolume: 110% + Wizard: False + + 步骤 29: + Pod: Pod1 + GripSide: A1 near + Source: P12 + Target: Orbital1 + LeaveBottomLabware: False + + 步骤 30: + Device: OrbitalShaker0 + Parameters: ('800', '3', '60', 'CounterClockwise', None) + Command: Timed Shake + + 步骤 31: + Message: Paused + Location: the whole system + Time: 180 + Mode: TimedResource + + 步骤 32: + Pod: Pod1 + GripSide: A1 near + Source: Orbital1 + Target: P12 + LeaveBottomLabware: False + + 步骤 33: + Message: Paused + Location: the whole system + Time: 120 + Mode: TimedResource + + 步骤 34: + Span8: False + Pod: Pod1 + Wash: False + items: [{'Position': 'P12', 'Height': -2.0, 'Volume': '40', 'liquidtype': 'Well Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Aspirate', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': True, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}, {'Position': 'P13', 'Height': -2.0, 'Volume': '40', 'liquidtype': 'Tip Contents', 'WellsX': 12, 'LabwareClass': 'BCDeep96Round', 'AutoSelectPrototype': True, 'ColsFirst': True, 'CustomHeight': False, 'DataSetPattern': False, 'HeightFrom': 0, 'LocalPattern': True, 'Operation': 'Dispense', 'OverrideHeight': False, 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Prototype': 'MC', 'ReferencedPattern': '', 'RowsFirst': False, 'SectionExpression': '', 'SelectionInfo': (1,), 'SetMark': True, 'Source': False, 'StartAtMark': False, 'StartAtSelection': True, 'UseExpression': False}] + Dynamic?: True + AutoSelectActiveWashTechnique: False + ActiveWashTechnique: + ChangeTipsBetweenDests: True + ChangeTipsBetweenSources: False + DefaultCaption: Transfer 40 µL from P12 to P13 + UseExpression: False + LeaveTipsOn: False + MandrelExpression: + Repeats: 1 + RepeatsByVolume: False + Replicates: 1 + ShowTipHandlingDetails: True + ShowTransferDetails: True + Solvent: Water + Span8Wash: False + Span8WashVolume: 2 + Span8WasteVolume: 1 + SplitVolume: False + SplitVolumeCleaning: False + Stop: Destinations + TipLocation: BC50F + UseCurrentTips: False + UseDisposableTips: False + UseFixedTips: False + UseJIT: True + UseMandrelSelection: True + UseProbes: (True, True, True, True, True, True, True, True) + WashCycles: 4 + WashVolume: 110% + Wizard: False + + 步骤 35: + Type: + Bitmap: OStepUI.ocx,FINISH + cleardeck: True + cleardevices: True + cleanuppods: True + PodsToMaxZ: True + ClearGlobals: True + ParkPods: True + Authent: False + Collapsed: True + ConnectionString: + Password: + Path: + Report: False + Server: + TableName: + UserName: + Catalog: diff --git a/unilabos/devices/liquid_handling/biomek_temporary_protocol.json b/unilabos/devices/liquid_handling/biomek_temporary_protocol.json new file mode 100644 index 00000000..129c3ba2 --- /dev/null +++ b/unilabos/devices/liquid_handling/biomek_temporary_protocol.json @@ -0,0 +1,2697 @@ +{ + "meta": {}, + "labwares": [], + "steps": [ + { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + }, + { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + }, + { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + }, + { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + }, + { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + }, + { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + }, + { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + }, + { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + }, + { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + ] +} \ No newline at end of file diff --git a/unilabos/devices/liquid_handling/biomek_test.py b/unilabos/devices/liquid_handling/biomek_test.py new file mode 100644 index 00000000..1e56f18e --- /dev/null +++ b/unilabos/devices/liquid_handling/biomek_test.py @@ -0,0 +1,1010 @@ +# import requests +from typing import List, Sequence, Optional, Union, Literal +# from geometry_msgs.msg import Point +# from unilabos_msgs.msg import Resource +# from pylabrobot.resources import ( +# Resource, +# TipRack, +# Container, +# Coordinate, +# Well +# ) +# from unilabos.ros.nodes.resource_tracker import DeviceNodeResourceTracker # type: ignore +# from .liquid_handler_abstract import LiquidHandlerAbstract + +import json +import pathlib +from typing import Sequence, Optional, List, Union, Literal + + + +#class LiquidHandlerBiomek(LiquidHandlerAbstract): + + +class LiquidHandlerBiomek: + """ + Biomek液体处理器的实现类,继承自LiquidHandlerAbstract。 + 该类用于处理Biomek液体处理器的特定操作。 + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._status = "Idle" # 初始状态为 Idle + self._success = False # 初始成功状态为 False + self._status_queue = kwargs.get("status_queue", None) # 状态队列 + self.temp_protocol = {} + self.py32_path = "/opt/py32" # Biomek的Python 3.2路径 + + # 预定义的仪器分类 + self.tip_racks = [ + "BC230", "BC1025F", "BC50", "TipRack200", "TipRack1000", + "tip", "tips", "Tip", "Tips" + ] + + self.reservoirs = [ + "AgilentReservoir", "nest_12_reservoir_15ml", "nest_1_reservoir_195ml", + "reservoir", "Reservoir", "waste", "Waste" + ] + + self.plates_96 = [ + "BCDeep96Round", "Matrix96_750uL", "NEST 2ml Deep Well Plate", "nest_96_wellplate_100ul_pcr_full_skirt", + "nest_96_wellplate_200ul_flat", "Matrix96", "96", "plate", "Plate" + ] + + self.aspirate_techniques = { + 'MC P300 high':{ + 'Position': 'P1', + 'Height': -2.0, + 'Volume': '50', + 'liquidtype': 'Well Contents', + 'WellsX': 12, + 'LabwareClass': 'Matrix96_750uL', + 'AutoSelectPrototype': True, + 'ColsFirst': True, + 'CustomHeight': False, + 'DataSetPattern': False, + 'HeightFrom': 0, + 'LocalPattern': True, + 'Operation': 'Aspirate', + 'OverrideHeight': False, + 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), + 'Prototype': 'MC P300 High', + 'ReferencedPattern': '', + 'RowsFirst': False, + 'SectionExpression': '', + 'SelectionInfo': (1,), + 'SetMark': True, + 'Source': True, + 'StartAtMark': False, + 'StartAtSelection': True, + 'UseExpression': False}, + } + + self.dispense_techniques = { + 'MC P300 high':{ + 'Position': 'P11', + 'Height': -2.0, + 'Volume': '50', + 'liquidtype': 'Tip Contents', + 'WellsX': 12, + 'LabwareClass': 'Matrix96_750uL', + 'AutoSelectPrototype': True, + 'ColsFirst': True, + 'CustomHeight': False, + 'DataSetPattern': False, + 'HeightFrom': 0, + 'LocalPattern': True, + 'Operation': 'Dispense', + 'OverrideHeight': False, + 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), + 'Prototype': 'MC P300 High', + 'ReferencedPattern': '', + 'RowsFirst': False, + 'SectionExpression': '', + 'SelectionInfo': (1,), + 'SetMark': True, + 'Source': False, + 'StartAtMark': False, + 'StartAtSelection': True, + 'UseExpression': False} + } + + + def _get_instrument_type(self, class_name: str) -> str: + """ + 根据class_name判断仪器类型 + + Returns: + str: "tip_rack", "reservoir", "plate_96", 或 "unknown" + """ + # 检查是否是枪头架 + for tip_name in self.tip_racks: + if tip_name in class_name: + return "tip_rack" + + # 检查是否是储液槽 + for reservoir_name in self.reservoirs: + if reservoir_name in class_name: + return "reservoir" + + # 检查是否是96孔板 + for plate_name in self.plates_96: + if plate_name in class_name: + return "plate_96" + + return "unknown" + + def create_protocol( + self, + protocol_name: str, + protocol_description: str, + protocol_version: str, + protocol_author: str, + protocol_date: str, + protocol_type: str, + none_keys: List[str] = [], + ): + """ + 创建一个新的协议。 + + Args: + protocol_name (str): 协议名称 + protocol_description (str): 协议描述 + protocol_version (str): 协议版本 + protocol_author (str): 协议作者 + protocol_date (str): 协议日期 + protocol_type (str): 协议类型 + none_keys (List[str]): 需要设置为None的键列表 + + Returns: + dict: 创建的协议字典 + """ + self.temp_protocol = { + "meta": { + "name": protocol_name, + "description": protocol_description, + "version": protocol_version, + "author": protocol_author, + "date": protocol_date, + "type": protocol_type, + }, + "labwares": {}, # 改为字典格式以匹配DeckItems + "steps": [], + } + return self.temp_protocol + +# def run_protocol(self): +# """ +# 执行创建的实验流程。 +# 工作站的完整执行流程是, +# 从 create_protocol 开始,创建新的 method, +# 随后执行 transfer_liquid 等操作向实验流程添加步骤, +# 最后 run_protocol 执行整个方法。 + +# Returns: +# dict: 执行结果 +# """ +# #use popen or subprocess to create py32 process and communicate send the temp protocol to it +# if not self.temp_protocol: +# raise ValueError("No protocol created. Please create a protocol first.") + +# # 模拟执行协议 +# self._status = "Running" +# self._success = True +# # 在这里可以添加实际执行协议的逻辑 + +# response = requests.post("localhost:5000/api/protocols", json=self.temp_protocol) + +# def create_resource( +# self, +# resource_tracker: DeviceNodeResourceTracker, +# resources: list[Resource], +# bind_parent_id: str, +# bind_location: dict[str, float], +# liquid_input_slot: list[int], +# liquid_type: list[str], +# liquid_volume: list[int], +# slot_on_deck: int, +# res_id, +# class_name, +# bind_locations, +# parent +# ): +# """ +# 创建一个新的资源。 + +# Args: +# device_id (str): 设备ID +# res_id (str): 资源ID +# class_name (str): 资源类名 +# parent (str): 父级ID +# bind_locations (Point): 绑定位置 +# liquid_input_slot (list[int]): 液体输入槽列表 +# liquid_type (list[str]): 液体类型列表 +# liquid_volume (list[int]): 液体体积列表 +# slot_on_deck (int): 甲板上的槽位 + +# Returns: +# dict: 创建的资源字典 +# """ +# # TODO:需要对好接口,下面这个是临时的 +# resource = { +# "id": res_id, +# "class": class_name, +# "parent": parent, +# "bind_locations": bind_locations.to_dict(), +# "liquid_input_slot": liquid_input_slot, +# "liquid_type": liquid_type, +# "liquid_volume": liquid_volume, +# "slot_on_deck": slot_on_deck, +# } +# self.temp_protocol["labwares"].append(resource) +# return resource + def instrument_setup_biomek( + self, + id: str, + parent: str, + slot_on_deck: str, + class_name: str, + liquid_type: list[str], + liquid_volume: list[int], + liquid_input_wells: list[str], + ): + """ + 设置Biomek仪器的参数配置,按照DeckItems格式 + + 根据不同的仪器类型(容器、tip rack等)设置相应的参数结构 + 位置作为键,配置列表作为值 + """ + + # 判断仪器类型 + instrument_type = self._get_instrument_type(class_name) + + config = None # 初始化为None + + if instrument_type == "reservoir": + # 储液槽类型配置 + config = { + "Properties": { + "Name": id, # 使用id作为名称 + "Device": "", + "liquidtype": liquid_type[0] if liquid_type else "Water", + "BarCode": "", + "SenseEveryTime": False + }, + "Known": True, + "Class": f"LabwareClasses\\{class_name}", + "DataSets": {"Volume": {}}, + "RuntimeDataSets": {"Volume": {}}, + "EvalAmounts": (float(liquid_volume[0]),) if liquid_volume else (0,), + "Nominal": False, + "EvalLiquids": (liquid_type[0],) if liquid_type else ("Water",) + } + + elif instrument_type == "plate_96": + # 96孔板类型配置 + volume_per_well = float(liquid_volume[0]) if liquid_volume else 0 + liquid_per_well = liquid_type[0] if liquid_type else "Water" + + config = { + "Properties": { + "Name": id, # 使用id作为名称 + "Device": "", + "liquidtype": liquid_per_well, + "BarCode": "", + "SenseEveryTime": False + }, + "Known": True, + "Class": f"LabwareClasses\\{class_name}", + "DataSets": {"Volume": {}}, + "RuntimeDataSets": {"Volume": {}}, + "EvalAmounts": tuple([volume_per_well] * 96), + "Nominal": False, + "EvalLiquids": tuple([liquid_per_well] * 96) + } + + elif instrument_type == "tip_rack": + # 枪头架类型配置 + tip_config = { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": False, + "RT_Used": False, + "Dirty": False, + "RT_Dirty": False, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + } + + config = { + "Tips": tip_config, + "RT_Tips": tip_config.copy(), + "Properties": {}, + "Known": False, + "Class": f"LabwareClasses\\{class_name}", + "DataSets": {"Volume": {}}, + "RuntimeDataSets": {"Volume": {}} + } + + # 按照DeckItems格式存储:位置作为键,配置列表作为值 + if config is not None: + self.temp_protocol["labwares"][slot_on_deck] = [config] + else: + # 空位置 + self.temp_protocol["labwares"][slot_on_deck] = [] + + return + + def transfer_biomek( + self, + source: str, + target: str, + tip_rack: str, + volume: float, + aspirate_techniques: str, + dispense_techniques: str, + ): + """ + 处理Biomek的液体转移操作。 + + """ + items = [] + + asp_params = self.aspirate_techniques.get(aspirate_techniques, {}) + dis_params = self.dispense_techniques.get(dispense_techniques, {}) + + asp_params['Position'] = source + dis_params['Position'] = target + asp_params['Volume'] = str(volume) + dis_params['Volume'] = str(volume) + + items.append(asp_params) + items.append(dis_params) + + transfer_params = { + "Span8": False, + "Pod": "Pod1", + "items": [], + "Wash": False, + "Dynamic?": True, + "AutoSelectActiveWashTechnique": False, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": True, + "ChangeTipsBetweenSources": False, + "DefaultCaption": "", + "UseExpression": False, + "LeaveTipsOn": False, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": False, + "Replicates": "1", + "ShowTipHandlingDetails": False, + "ShowTransferDetails": True, + "Solvent": "Water", + "Span8Wash": False, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": False, + "SplitVolumeCleaning": False, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": False, + "UseDisposableTips": False, + "UseFixedTips": False, + "UseJIT": True, + "UseMandrelSelection": True, + "UseProbes": [True, True, True, True, True, True, True, True], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": False + } + transfer_params["items"] = items + transfer_params["Solvent"] = 'Water' + transfer_params["TipLocation"] = tip_rack + tmp={'transfer': transfer_params} + self.temp_protocol["steps"].append(tmp) + + return + + def move_biomek( + self, + source: str, + target: str, + ): + """ + 处理Biomek移动板子的操作。 + + """ + + move_params = { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": source, + "Target": target, + "LeaveBottomLabware": False, + } + tmp={'move': move_params} + self.temp_protocol["steps"].append(tmp) + + return + + def incubation_biomek( + self, + time: int, + ): + """ + 处理Biomek的孵育操作。 + """ + incubation_params = { + "Message": "Paused", + "Location": "the whole system", + "Time": time, + "Mode": "TimedResource" + } + tmp={'incubation': incubation_params} + self.temp_protocol["steps"].append(tmp) + + return + + def oscillation_biomek( + self, + rpm: int, + time: int, + ): + """ + 处理Biomek的振荡操作。 + """ + oscillation_params = { + 'Device': 'OrbitalShaker0', + 'Parameters': (str(rpm), '2', str(time), 'CounterClockwise'), + 'Command': 'Timed Shake' + } + tmp={'oscillation': oscillation_params} + self.temp_protocol["steps"].append(tmp) + + return + + + +if __name__ == "__main__": + + print("=== Biomek完整流程测试 ===") + print("包含: 仪器设置 + 完整实验步骤") + + # 完整的步骤信息(从biomek.py复制) + steps_info = ''' + { + "steps": [ + { + "step_number": 1, + "operation": "transfer", + "description": "转移PCR产物或酶促反应液至0.5ml 96孔板中", + "parameters": { + "source": "P1", + "target": "P11", + "tip_rack": "BC230", + "volume": 50 + } + }, + { + "step_number": 2, + "operation": "transfer", + "description": "加入2倍体积的Bind Beads BC至产物中", + "parameters": { + "source": "P2", + "target": "P11", + "tip_rack": "BC230", + "volume": 100 + } + }, + { + "step_number": 3, + "operation": "oscillation", + "description": "振荡混匀300秒", + "parameters": { + "rpm": 800, + "time": 300 + } + }, + { + "step_number": 4, + "operation": "move_labware", + "description": "转移至96孔磁力架上吸附3分钟", + "parameters": { + "source": "P11", + "target": "P12" + } + }, + { + "step_number": 5, + "operation": "incubation", + "description": "吸附3分钟", + "parameters": { + "time": 180 + } + }, + { + "step_number": 6, + "operation": "transfer", + "description": "吸弃或倒除上清液", + "parameters": { + "source": "P12", + "target": "P22", + "tip_rack": "BC230", + "volume": 150 + } + }, + { + "step_number": 7, + "operation": "transfer", + "description": "加入300-500μl 75%乙醇", + "parameters": { + "source": "P3", + "target": "P12", + "tip_rack": "BC230", + "volume": 400 + } + }, + { + "step_number": 8, + "operation": "move_labware", + "description": "移动至振荡器进行振荡混匀", + "parameters": { + "source": "P12", + "target": "Orbital1" + } + }, + { + "step_number": 9, + "operation": "oscillation", + "description": "振荡混匀60秒", + "parameters": { + "rpm": 800, + "time": 60 + } + }, + { + "step_number": 10, + "operation": "move_labware", + "description": "转移至96孔磁力架上吸附3分钟", + "parameters": { + "source": "Orbital1", + "target": "P12" + } + }, + { + "step_number": 11, + "operation": "incubation", + "description": "吸附3分钟", + "parameters": { + "time": 180 + } + }, + { + "step_number": 12, + "operation": "transfer", + "description": "吸弃或倒弃废液", + "parameters": { + "source": "P12", + "target": "P22", + "tip_rack": "BC230", + "volume": 400 + } + }, + { + "step_number": 13, + "operation": "transfer", + "description": "重复加入75%乙醇", + "parameters": { + "source": "P3", + "target": "P12", + "tip_rack": "BC230", + "volume": 400 + } + }, + { + "step_number": 14, + "operation": "move_labware", + "description": "移动至振荡器进行振荡混匀", + "parameters": { + "source": "P12", + "target": "Orbital1" + } + }, + { + "step_number": 15, + "operation": "oscillation", + "description": "振荡混匀60秒", + "parameters": { + "rpm": 800, + "time": 60 + } + }, + { + "step_number": 16, + "operation": "move_labware", + "description": "转移至96孔磁力架上吸附3分钟", + "parameters": { + "source": "Orbital1", + "target": "P12" + } + }, + { + "step_number": 17, + "operation": "incubation", + "description": "吸附3分钟", + "parameters": { + "time": 180 + } + }, + { + "step_number": 18, + "operation": "transfer", + "description": "吸弃或倒弃废液", + "parameters": { + "source": "P12", + "target": "P22", + "tip_rack": "BC230", + "volume": 400 + } + }, + { + "step_number": 19, + "operation": "move_labware", + "description": "正放96孔板,空气干燥15分钟", + "parameters": { + "source": "P12", + "target": "P13" + } + }, + { + "step_number": 20, + "operation": "incubation", + "description": "空气干燥15分钟", + "parameters": { + "time": 900 + } + }, + { + "step_number": 21, + "operation": "transfer", + "description": "加入30-50μl Elution Buffer", + "parameters": { + "source": "P4", + "target": "P13", + "tip_rack": "BC230", + "volume": 40 + } + }, + { + "step_number": 22, + "operation": "move_labware", + "description": "移动至振荡器进行振荡混匀", + "parameters": { + "source": "P13", + "target": "Orbital1" + } + }, + { + "step_number": 23, + "operation": "oscillation", + "description": "振荡混匀60秒", + "parameters": { + "rpm": 800, + "time": 60 + } + }, + { + "step_number": 24, + "operation": "move_labware", + "description": "室温静置3分钟", + "parameters": { + "source": "Orbital1", + "target": "P13" + } + }, + { + "step_number": 25, + "operation": "incubation", + "description": "室温静置3分钟", + "parameters": { + "time": 180 + } + }, + { + "step_number": 26, + "operation": "move_labware", + "description": "转移至96孔磁力架上吸附2分钟", + "parameters": { + "source": "P13", + "target": "P12" + } + }, + { + "step_number": 27, + "operation": "incubation", + "description": "吸附2分钟", + "parameters": { + "time": 120 + } + }, + { + "step_number": 28, + "operation": "transfer", + "description": "将DNA转移至新的板中", + "parameters": { + "source": "P12", + "target": "P14", + "tip_rack": "BC230", + "volume": 40 + } + } + ] + } +''' + # 完整的labware配置信息 + labware_with_liquid = ''' + [ + { + "id": "Tip Rack BC230 TL1", + "parent": "deck", + "slot_on_deck": "TL1", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 TL2", + "parent": "deck", + "slot_on_deck": "TL2", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 TL3", + "parent": "deck", + "slot_on_deck": "TL3", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 TL4", + "parent": "deck", + "slot_on_deck": "TL4", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 TL5", + "parent": "deck", + "slot_on_deck": "TL5", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 P5", + "parent": "deck", + "slot_on_deck": "P5", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 P6", + "parent": "deck", + "slot_on_deck": "P6", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 P15", + "parent": "deck", + "slot_on_deck": "P15", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "Tip Rack BC230 P16", + "parent": "deck", + "slot_on_deck": "P16", + "class_name": "BC230", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "stock plate on P1", + "parent": "deck", + "slot_on_deck": "P1", + "class_name": "AgilentReservoir", + "liquid_type": ["PCR product"], + "liquid_volume": [5000], + "liquid_input_wells": ["A1"] + }, + { + "id": "stock plate on P2", + "parent": "deck", + "slot_on_deck": "P2", + "class_name": "AgilentReservoir", + "liquid_type": ["bind beads"], + "liquid_volume": [100000], + "liquid_input_wells": ["A1"] + }, + { + "id": "stock plate on P3", + "parent": "deck", + "slot_on_deck": "P3", + "class_name": "AgilentReservoir", + "liquid_type": ["75% ethanol"], + "liquid_volume": [100000], + "liquid_input_wells": ["A1"] + }, + { + "id": "stock plate on P4", + "parent": "deck", + "slot_on_deck": "P4", + "class_name": "AgilentReservoir", + "liquid_type": ["Elution Buffer"], + "liquid_volume": [5000], + "liquid_input_wells": ["A1"] + }, + { + "id": "working plate on P11", + "parent": "deck", + "slot_on_deck": "P11", + "class_name": "BCDeep96Round", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "working plate on P12", + "parent": "deck", + "slot_on_deck": "P12", + "class_name": "BCDeep96Round", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "working plate on P13", + "parent": "deck", + "slot_on_deck": "P13", + "class_name": "BCDeep96Round", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "working plate on P14", + "parent": "deck", + "slot_on_deck": "P14", + "class_name": "BCDeep96Round", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "waste on P22", + "parent": "deck", + "slot_on_deck": "P22", + "class_name": "AgilentReservoir", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + }, + { + "id": "oscillation", + "parent": "deck", + "slot_on_deck": "Orbital1", + "class_name": "Orbital", + "liquid_type": [], + "liquid_volume": [], + "liquid_input_wells": [] + } + ] + ''' + + # 创建handler实例 + handler = LiquidHandlerBiomek() + + # 创建协议 + protocol = handler.create_protocol( + protocol_name="DNA纯化完整流程", + protocol_description="使用磁珠进行DNA纯化的完整自动化流程", + protocol_version="1.0", + protocol_author="Biomek系统", + protocol_date="2024-01-01", + protocol_type="DNA_purification" + ) + + print("\n=== 第一步:设置所有仪器 ===") + # 解析labware配置 + labwares = json.loads(labware_with_liquid) + + # 设置所有仪器 + instrument_count = 0 + for labware in labwares: + print(f"设置仪器: {labware['id']} ({labware['class_name']}) 在位置 {labware['slot_on_deck']}") + handler.instrument_setup_biomek( + id=labware['id'], + parent=labware['parent'], + slot_on_deck=labware['slot_on_deck'], + class_name=labware['class_name'], + liquid_type=labware['liquid_type'], + liquid_volume=labware['liquid_volume'], + liquid_input_wells=labware['liquid_input_wells'] + ) + instrument_count += 1 + + print(f"总共设置了 {instrument_count} 个仪器位置") + + print("\n=== 第二步:执行实验步骤 ===") + # 解析步骤信息 + input_steps = json.loads(steps_info) + + # 执行所有步骤 + step_count = 0 + for step in input_steps['steps']: + operation = step['operation'] + parameters = step['parameters'] + description = step['description'] + + print(f"步骤 {step['step_number']}: {description}") + + if operation == 'transfer': + handler.transfer_biomek( + source=parameters['source'], + target=parameters['target'], + volume=parameters['volume'], + tip_rack=parameters['tip_rack'], + aspirate_techniques='MC P300 high', + dispense_techniques='MC P300 high' + ) + elif operation == 'move_labware': + handler.move_biomek( + source=parameters['source'], + target=parameters['target'] + ) + elif operation == 'oscillation': + handler.oscillation_biomek( + rpm=parameters['rpm'], + time=parameters['time'] + ) + elif operation == 'incubation': + handler.incubation_biomek( + time=parameters['time'] + ) + + step_count += 1 + + print(f"总共执行了 {step_count} 个步骤") + + print("\n=== 第三步:保存完整协议 ===") + # 获取脚本目录 + script_dir = pathlib.Path(__file__).parent + + # 保存完整协议 + complete_output_path = script_dir / "complete_biomek_protocol_0608.json" + with open(complete_output_path, 'w', encoding='utf-8') as f: + json.dump(handler.temp_protocol, f, indent=4, ensure_ascii=False) + + print(f"完整协议已保存到: {complete_output_path}") + + print("\n=== 测试完成 ===") + print("完整的DNA纯化流程已成功转换为Biomek格式!") diff --git a/unilabos/devices/liquid_handling/complete_biomek_protocol.json b/unilabos/devices/liquid_handling/complete_biomek_protocol.json new file mode 100644 index 00000000..2c0e95fd --- /dev/null +++ b/unilabos/devices/liquid_handling/complete_biomek_protocol.json @@ -0,0 +1,3760 @@ +{ + "meta": { + "name": "DNA纯化完整流程", + "description": "使用磁珠进行DNA纯化的完整自动化流程", + "version": "1.0", + "author": "Biomek系统", + "date": "2024-01-01", + "type": "DNA_purification" + }, + "labwares": [ + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "Name": "Tip Rack BC230 on TL1", + "Position": "TL1" + }, + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "Name": "Tip Rack BC230 on TL2", + "Position": "TL2" + }, + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "Name": "Tip Rack BC230 on TL3", + "Position": "TL3" + }, + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "Name": "Tip Rack BC230 on TL4", + "Position": "TL4" + }, + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "Name": "Tip Rack BC230 on TL5", + "Position": "TL5" + }, + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "Name": "Tip Rack BC230 on P5", + "Position": "P5" + }, + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "Name": "Tip Rack BC230 on P6", + "Position": "P6" + }, + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "Name": "Tip Rack BC230 on P15", + "Position": "P15" + }, + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "Name": "Tip Rack BC230 on P16", + "Position": "P16" + }, + { + "Properties": { + "Name": "stock plate on P1", + "Device": "", + "liquidtype": "master_mix", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\nest_12_reservoir_15ml", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 10000.0 + ], + "Nominal": false, + "EvalLiquids": [ + "master_mix" + ], + "Name": "stock plate on P1", + "Position": "P1" + }, + { + "Properties": { + "Name": "stock plate on P2", + "Device": "", + "liquidtype": "bind beads", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\nest_12_reservoir_15ml", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 10000.0 + ], + "Nominal": false, + "EvalLiquids": [ + "bind beads" + ], + "Name": "stock plate on P2", + "Position": "P2" + }, + { + "Properties": { + "Name": "stock plate on P3", + "Device": "", + "liquidtype": "ethyl alcohol", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\nest_12_reservoir_15ml", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 10000.0 + ], + "Nominal": false, + "EvalLiquids": [ + "ethyl alcohol" + ], + "Name": "stock plate on P3", + "Position": "P3" + }, + { + "Properties": { + "Name": "elution buffer on P4", + "Device": "", + "liquidtype": "elution buffer", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\nest_12_reservoir_15ml", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 5000.0 + ], + "Nominal": false, + "EvalLiquids": [ + "elution buffer" + ], + "Name": "elution buffer on P4", + "Position": "P4" + }, + { + "Properties": { + "Name": "working plate on P11", + "Device": "", + "liquidtype": "Water", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\NEST 2ml Deep Well Plate", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0 + ], + "Nominal": false, + "EvalLiquids": [ + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water" + ], + "Name": "working plate on P11", + "Position": "P11" + }, + { + "Properties": { + "Name": "working plate on P13", + "Device": "", + "liquidtype": "Water", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\NEST 2ml Deep Well Plate", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0 + ], + "Nominal": false, + "EvalLiquids": [ + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water" + ], + "Name": "working plate on P13", + "Position": "P13" + }, + { + "Properties": { + "Name": "waste on P22", + "Device": "", + "liquidtype": "Water", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\nest_1_reservoir_195ml", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 0.0 + ], + "Nominal": false, + "EvalLiquids": [ + "Water" + ], + "Name": "waste on P22", + "Position": "P22" + } + ], + "steps": [ + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "P11", + "Target": "Orbital1", + "LeaveBottomLabware": false + } + }, + { + "oscillation": { + "Device": "OrbitalShaker0", + "Parameters": [ + "800", + "2", + "300", + "CounterClockwise" + ], + "Command": "Timed Shake" + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "Orbital1", + "Target": "P11", + "LeaveBottomLabware": false + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "P11", + "Target": "P12", + "LeaveBottomLabware": false + } + }, + { + "incubation": { + "Message": "Paused", + "Location": "the whole system", + "Time": 180, + "Mode": "TimedResource" + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "P12", + "Target": "Orbital1", + "LeaveBottomLabware": false + } + }, + { + "oscillation": { + "Device": "OrbitalShaker0", + "Parameters": [ + "800", + "2", + "45", + "CounterClockwise" + ], + "Command": "Timed Shake" + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "Orbital1", + "Target": "P12", + "LeaveBottomLabware": false + } + }, + { + "incubation": { + "Message": "Paused", + "Location": "the whole system", + "Time": 180, + "Mode": "TimedResource" + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "P12", + "Target": "Orbital1", + "LeaveBottomLabware": false + } + }, + { + "oscillation": { + "Device": "OrbitalShaker0", + "Parameters": [ + "800", + "2", + "45", + "CounterClockwise" + ], + "Command": "Timed Shake" + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "Orbital1", + "Target": "P12", + "LeaveBottomLabware": false + } + }, + { + "incubation": { + "Message": "Paused", + "Location": "the whole system", + "Time": 180, + "Mode": "TimedResource" + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "incubation": { + "Message": "Paused", + "Location": "the whole system", + "Time": 900, + "Mode": "TimedResource" + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "P12", + "Target": "Orbital1", + "LeaveBottomLabware": false + } + }, + { + "oscillation": { + "Device": "OrbitalShaker0", + "Parameters": [ + "800", + "2", + "60", + "CounterClockwise" + ], + "Command": "Timed Shake" + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "Orbital1", + "Target": "P12", + "LeaveBottomLabware": false + } + }, + { + "incubation": { + "Message": "Paused", + "Location": "the whole system", + "Time": 180, + "Mode": "TimedResource" + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P13", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + } + ] +} \ No newline at end of file diff --git a/unilabos/devices/liquid_handling/complete_biomek_protocol_0608.json b/unilabos/devices/liquid_handling/complete_biomek_protocol_0608.json new file mode 100644 index 00000000..24b3d455 --- /dev/null +++ b/unilabos/devices/liquid_handling/complete_biomek_protocol_0608.json @@ -0,0 +1,4201 @@ +{ + "meta": { + "name": "DNA纯化完整流程", + "description": "使用磁珠进行DNA纯化的完整自动化流程", + "version": "1.0", + "author": "Biomek系统", + "date": "2024-01-01", + "type": "DNA_purification" + }, + "labwares": { + "TL1": [ + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + } + } + ], + "TL2": [ + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + } + } + ], + "TL3": [ + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + } + } + ], + "TL4": [ + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + } + } + ], + "TL5": [ + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + } + } + ], + "P5": [ + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + } + } + ], + "P6": [ + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + } + } + ], + "P15": [ + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + } + } + ], + "P16": [ + { + "Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "RT_Tips": { + "Class": "TipClasses\\T230", + "Contents": [], + "_RT_Contents": [], + "Used": false, + "RT_Used": false, + "Dirty": false, + "RT_Dirty": false, + "MaxVolumeUsed": 0.0, + "RT_MaxVolumeUsed": 0.0 + }, + "Properties": {}, + "Known": false, + "Class": "LabwareClasses\\BC230", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + } + } + ], + "P1": [ + { + "Properties": { + "Name": "stock plate on P1", + "Device": "", + "liquidtype": "PCR product", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\AgilentReservoir", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 5000.0 + ], + "Nominal": false, + "EvalLiquids": [ + "PCR product" + ] + } + ], + "P2": [ + { + "Properties": { + "Name": "stock plate on P2", + "Device": "", + "liquidtype": "bind beads", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\AgilentReservoir", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 100000.0 + ], + "Nominal": false, + "EvalLiquids": [ + "bind beads" + ] + } + ], + "P3": [ + { + "Properties": { + "Name": "stock plate on P3", + "Device": "", + "liquidtype": "75% ethanol", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\AgilentReservoir", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 100000.0 + ], + "Nominal": false, + "EvalLiquids": [ + "75% ethanol" + ] + } + ], + "P4": [ + { + "Properties": { + "Name": "stock plate on P4", + "Device": "", + "liquidtype": "Elution Buffer", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\AgilentReservoir", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 5000.0 + ], + "Nominal": false, + "EvalLiquids": [ + "Elution Buffer" + ] + } + ], + "P11": [ + { + "Properties": { + "Name": "working plate on P11", + "Device": "", + "liquidtype": "Water", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\BCDeep96Round", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "Nominal": false, + "EvalLiquids": [ + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water" + ] + } + ], + "P12": [ + { + "Properties": { + "Name": "working plate on P12", + "Device": "", + "liquidtype": "Water", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\BCDeep96Round", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "Nominal": false, + "EvalLiquids": [ + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water" + ] + } + ], + "P13": [ + { + "Properties": { + "Name": "working plate on P13", + "Device": "", + "liquidtype": "Water", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\BCDeep96Round", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "Nominal": false, + "EvalLiquids": [ + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water" + ] + } + ], + "P14": [ + { + "Properties": { + "Name": "working plate on P14", + "Device": "", + "liquidtype": "Water", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\BCDeep96Round", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "Nominal": false, + "EvalLiquids": [ + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water", + "Water" + ] + } + ], + "P22": [ + { + "Properties": { + "Name": "waste on P22", + "Device": "", + "liquidtype": "Water", + "BarCode": "", + "SenseEveryTime": false + }, + "Known": true, + "Class": "LabwareClasses\\AgilentReservoir", + "DataSets": { + "Volume": {} + }, + "RuntimeDataSets": { + "Volume": {} + }, + "EvalAmounts": [ + 0 + ], + "Nominal": false, + "EvalLiquids": [ + "Water" + ] + } + ], + "Orbital1": [] + }, + "steps": [ + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P14", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P14", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "oscillation": { + "Device": "OrbitalShaker0", + "Parameters": [ + "800", + "2", + "300", + "CounterClockwise" + ], + "Command": "Timed Shake" + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "P11", + "Target": "P12", + "LeaveBottomLabware": false + } + }, + { + "incubation": { + "Message": "Paused", + "Location": "the whole system", + "Time": 180, + "Mode": "TimedResource" + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P14", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P14", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "P12", + "Target": "Orbital1", + "LeaveBottomLabware": false + } + }, + { + "oscillation": { + "Device": "OrbitalShaker0", + "Parameters": [ + "800", + "2", + "60", + "CounterClockwise" + ], + "Command": "Timed Shake" + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "Orbital1", + "Target": "P12", + "LeaveBottomLabware": false + } + }, + { + "incubation": { + "Message": "Paused", + "Location": "the whole system", + "Time": 180, + "Mode": "TimedResource" + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P14", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P14", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "P12", + "Target": "Orbital1", + "LeaveBottomLabware": false + } + }, + { + "oscillation": { + "Device": "OrbitalShaker0", + "Parameters": [ + "800", + "2", + "60", + "CounterClockwise" + ], + "Command": "Timed Shake" + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "Orbital1", + "Target": "P12", + "LeaveBottomLabware": false + } + }, + { + "incubation": { + "Message": "Paused", + "Location": "the whole system", + "Time": 180, + "Mode": "TimedResource" + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P14", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "P12", + "Target": "P13", + "LeaveBottomLabware": false + } + }, + { + "incubation": { + "Message": "Paused", + "Location": "the whole system", + "Time": 900, + "Mode": "TimedResource" + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P14", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "P13", + "Target": "Orbital1", + "LeaveBottomLabware": false + } + }, + { + "oscillation": { + "Device": "OrbitalShaker0", + "Parameters": [ + "800", + "2", + "60", + "CounterClockwise" + ], + "Command": "Timed Shake" + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "Orbital1", + "Target": "P13", + "LeaveBottomLabware": false + } + }, + { + "incubation": { + "Message": "Paused", + "Location": "the whole system", + "Time": 180, + "Mode": "TimedResource" + } + }, + { + "move": { + "Pod": "Pod1", + "GripSide": "A1 near", + "Source": "P13", + "Target": "P12", + "LeaveBottomLabware": false + } + }, + { + "incubation": { + "Message": "Paused", + "Location": "the whole system", + "Time": 120, + "Mode": "TimedResource" + } + }, + { + "transfer": { + "Span8": false, + "Pod": "Pod1", + "items": [ + { + "Position": "P12", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Well Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Aspirate", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": true, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + }, + { + "Position": "P14", + "Height": -2.0, + "Volume": "40", + "liquidtype": "Tip Contents", + "WellsX": 12, + "LabwareClass": "Matrix96_750uL", + "AutoSelectPrototype": true, + "ColsFirst": true, + "CustomHeight": false, + "DataSetPattern": false, + "HeightFrom": 0, + "LocalPattern": true, + "Operation": "Dispense", + "OverrideHeight": false, + "Pattern": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "Prototype": "MC P300 High", + "ReferencedPattern": "", + "RowsFirst": false, + "SectionExpression": "", + "SelectionInfo": [ + 1 + ], + "SetMark": true, + "Source": false, + "StartAtMark": false, + "StartAtSelection": true, + "UseExpression": false + } + ], + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": false, + "ShowTransferDetails": true, + "Solvent": "Water", + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC230", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [ + true, + true, + true, + true, + true, + true, + true, + true + ], + "WashCycles": "4", + "WashVolume": "110%", + "Wizard": false + } + } + ] +} \ No newline at end of file diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index c349403e..4faa0427 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -6,13 +6,8 @@ import asyncio import time from pylabrobot.liquid_handling import LiquidHandler -from pylabrobot.resources import ( - Resource, - TipRack, - Container, - Coordinate, - Well -) +from pylabrobot.resources import Resource, TipRack, Container, Coordinate, Well + class LiquidHandlerAbstract(LiquidHandler): """Extended LiquidHandler with additional operations.""" @@ -21,6 +16,19 @@ class LiquidHandlerAbstract(LiquidHandler): # REMOVE LIQUID -------------------------------------------------- # --------------------------------------------------------------- + async def create_protocol( + self, + protocol_name: str, + protocol_description: str, + protocol_version: str, + protocol_author: str, + protocol_date: str, + protocol_type: str, + none_keys: List[str] = [], + ): + """Create a new protocol with the given metadata.""" + pass + async def remove_liquid( self, vols: List[float], @@ -35,26 +43,26 @@ class LiquidHandlerAbstract(LiquidHandler): spread: Optional[Literal["wide", "tight", "custom"]] = "wide", delays: Optional[List[int]] = None, is_96_well: Optional[bool] = False, - top: Optional[List(float)] = None, - none_keys: List[str] = [] + top: Optional[List[float]] = None, + none_keys: List[str] = [], ): """A complete *remove* (aspirate → waste) operation.""" trash = self.deck.get_trash_area() try: if is_96_well: - pass # This mode is not verified + pass # This mode is not verified else: if len(vols) != len(sources): raise ValueError("Length of `vols` must match `sources`.") for src, vol in zip(sources, vols): - self.move_to(src, dis_to_top=top[0] if top else 0) + await self.move_to(src, dis_to_top=top[0] if top else 0) tip = next(self.current_tip) await self.pick_up_tips(tip) await self.aspirate( resources=[src], vols=[vol], - use_channels=use_channels, # only aspirate96 used, default to None + use_channels=use_channels, # only aspirate96 used, default to None flow_rates=[flow_rates[0]] if flow_rates else None, offsets=[offsets[0]] if offsets else None, liquid_height=[liquid_height[0]] if liquid_height else None, @@ -64,15 +72,15 @@ class LiquidHandlerAbstract(LiquidHandler): await self.custom_delay(seconds=delays[0] if delays else 0) await self.dispense( resources=waste_liquid, - vols=[vol], - use_channels=use_channels, - flow_rates=[flow_rates[1]] if flow_rates else None, - offsets=[offsets[1]] if offsets else None, - liquid_height=[liquid_height[1]] if liquid_height else None, - blow_out_air_volume=blow_out_air_volume[1] if blow_out_air_volume else None, - spread=spread, - ) - await self.discard_tips() # For now, each of tips is discarded after use + vols=[vol], + use_channels=use_channels, + flow_rates=[flow_rates[1]] if flow_rates else None, + offsets=[offsets[1]] if offsets else None, + liquid_height=[liquid_height[1]] if liquid_height else None, + blow_out_air_volume=blow_out_air_volume[1] if blow_out_air_volume else None, + spread=spread, + ) + await self.discard_tips() # For now, each of tips is discarded after use except Exception as e: raise RuntimeError(f"Liquid removal failed: {e}") from e @@ -100,13 +108,13 @@ class LiquidHandlerAbstract(LiquidHandler): mix_vol: Optional[int] = None, mix_rate: Optional[int] = None, mix_liquid_height: Optional[float] = None, - none_keys: List[str] = [] + none_keys: List[str] = [], ): """A complete *add* (aspirate reagent → dispense into targets) operation.""" try: if is_96_well: - pass # This mode is not verified. + pass # This mode is not verified. else: if len(asp_vols) != len(targets): raise ValueError("Length of `vols` must match `targets`.") @@ -122,7 +130,7 @@ class LiquidHandlerAbstract(LiquidHandler): offsets=[offsets[0]] if offsets else None, liquid_height=[liquid_height[0]] if liquid_height else None, blow_out_air_volume=[blow_out_air_volume[0]] if blow_out_air_volume else None, - spread=spread + spread=spread, ) if delays is not None: await self.custom_delay(seconds=delays[0]) @@ -144,7 +152,8 @@ class LiquidHandlerAbstract(LiquidHandler): mix_vol=mix_vol, offsets=offsets if offsets else None, height_to_bottom=mix_liquid_height if mix_liquid_height else None, - mix_rate=mix_rate if mix_rate else None) + mix_rate=mix_rate if mix_rate else None, + ) if delays is not None: await self.custom_delay(seconds=delays[1]) await self.touch_tip(targets[_]) @@ -158,13 +167,13 @@ class LiquidHandlerAbstract(LiquidHandler): # --------------------------------------------------------------- async def transfer_liquid( self, - asp_vols: Union[List[float], float], - dis_vols: Union[List[float], float], sources: Sequence[Container], targets: Sequence[Container], tip_racks: Sequence[TipRack], *, use_channels: Optional[List[int]] = None, + asp_vols: Union[List[float], float], + dis_vols: Union[List[float], float], asp_flow_rates: Optional[List[Optional[float]]] = None, dis_flow_rates: Optional[List[Optional[float]]] = None, offsets: Optional[List[Coordinate]] = None, @@ -179,7 +188,7 @@ class LiquidHandlerAbstract(LiquidHandler): mix_rate: Optional[int] = None, mix_liquid_height: Optional[float] = None, delays: Optional[List[int]] = None, - none_keys: List[str] = [] + none_keys: List[str] = [], ): """Transfer liquid from each *source* well/plate to the corresponding *target*. @@ -201,14 +210,15 @@ class LiquidHandlerAbstract(LiquidHandler): # 96‑channel head mode # ------------------------------------------------------------------ if is_96_well: - pass # This mode is not verified + pass # This mode is not verified else: if not (len(asp_vols) == len(sources) and len(dis_vols) == len(targets)): raise ValueError("`sources`, `targets`, and `vols` must have the same length.") tip_iter = self.iter_tips(tip_racks) - for src, tgt, asp_vol, asp_flow_rate, dis_vol, dis_flow_rate in ( - zip(sources, targets, asp_vols, asp_flow_rates, dis_vols, dis_flow_rates)): + for src, tgt, asp_vol, asp_flow_rate, dis_vol, dis_flow_rate in zip( + sources, targets, asp_vols, asp_flow_rates, dis_vols, dis_flow_rates + ): tip = next(tip_iter) await self.pick_up_tips(tip) # Aspirate from source @@ -247,9 +257,9 @@ class LiquidHandlerAbstract(LiquidHandler): except Exception as exc: raise RuntimeError(f"Liquid transfer failed: {exc}") from exc -# --------------------------------------------------------------- -# Helper utilities -# --------------------------------------------------------------- + # --------------------------------------------------------------- + # Helper utilities + # --------------------------------------------------------------- async def custom_delay(self, seconds=0, msg=None): """ @@ -266,28 +276,26 @@ class LiquidHandlerAbstract(LiquidHandler): print(f"Done: {msg}") print(f"Current time: {time.strftime('%H:%M:%S')}") - async def touch_tip(self, - targets: Sequence[Container], - ): + async def touch_tip(self, targets: Sequence[Container]): """Touch the tip to the side of the well.""" await self.aspirate( resources=[targets], vols=[0], use_channels=None, flow_rates=None, - offsets=[Coordinate(x=-targets.get_size_x()/2,y=0,z=0)], + offsets=[Coordinate(x=-targets.get_size_x() / 2, y=0, z=0)], liquid_height=None, - blow_out_air_volume=None + blow_out_air_volume=None, ) - #await self.custom_delay(seconds=1) # In the simulation, we do not need to wait + # await self.custom_delay(seconds=1) # In the simulation, we do not need to wait await self.aspirate( resources=[targets], vols=[0], use_channels=None, flow_rates=None, - offsets=[Coordinate(x=targets.get_size_x()/2,y=0,z=0)], + offsets=[Coordinate(x=targets.get_size_x() / 2, y=0, z=0)], liquid_height=None, - blow_out_air_volume=None + blow_out_air_volume=None, ) async def mix( @@ -298,9 +306,9 @@ class LiquidHandlerAbstract(LiquidHandler): height_to_bottom: Optional[float] = None, offsets: Optional[Coordinate] = None, mix_rate: Optional[float] = None, - none_keys: List[str] = [] + none_keys: List[str] = [], ): - if mix_time is None: # No mixing required + if mix_time is None: # No mixing required return """Mix the liquid in the target wells.""" for _ in range(mix_time): @@ -333,7 +341,7 @@ class LiquidHandlerAbstract(LiquidHandler): tip_iter = self.iter_tips(tip_racks) self.current_tip = tip_iter - async def move_to(self, well: Well, dis_to_top: float = 0 , channel: int = 0): + async def move_to(self, well: Well, dis_to_top: float = 0, channel: int = 0): """ Move a single channel to a specific well with a given z-height. @@ -352,4 +360,3 @@ class LiquidHandlerAbstract(LiquidHandler): await self.move_channel_x(channel, abs_loc.x) await self.move_channel_y(channel, abs_loc.y) await self.move_channel_z(channel, abs_loc.z + well_height + dis_to_top) - diff --git a/unilabos/devices/liquid_handling/test liquid handler/convert_biomek.py b/unilabos/devices/liquid_handling/test liquid handler/convert_biomek.py new file mode 100644 index 00000000..712fdd9f --- /dev/null +++ b/unilabos/devices/liquid_handling/test liquid handler/convert_biomek.py @@ -0,0 +1,154 @@ + +import json +from typing import Sequence, Optional, List, Union, Literal +json_path = "/Users/guangxinzhang/Documents/Deep Potential/opentrons/convert/protocols/enriched_steps/sci-lucif-assay4.json" + +with open(json_path, "r") as f: + data = json.load(f) + +transfer_example = data[0] +#print(transfer_example) + + +temp_protocol = [] +TipLocation = "BC1025F" # Assuming this is a fixed tip location for the transfer +sources = transfer_example["sources"] # Assuming sources is a list of Container objects +targets = transfer_example["targets"] # Assuming targets is a list of Container objects +tip_racks = transfer_example["tip_racks"] # Assuming tip_racks is a list of TipRack objects +asp_vols = transfer_example["asp_vols"] # Assuming asp_vols is a list of volumes +solvent = "PBS" + +def transfer_liquid( + #self, + sources,#: Sequence[Container], + targets,#: Sequence[Container], + tip_racks,#: Sequence[TipRack], + TipLocation, + # *, + # use_channels: Optional[List[int]] = None, + asp_vols: Union[List[float], float], + solvent: Optional[str] = None, + # dis_vols: Union[List[float], float], + # asp_flow_rates: Optional[List[Optional[float]]] = None, + # dis_flow_rates: Optional[List[Optional[float]]] = None, + # offsets,#: Optional[List[]] = None, + # touch_tip: bool = False, + # liquid_height: Optional[List[Optional[float]]] = None, + # blow_out_air_volume: Optional[List[Optional[float]]] = None, + # spread: Literal["wide", "tight", "custom"] = "wide", + # is_96_well: bool = False, + # mix_stage: Optional[Literal["none", "before", "after", "both"]] = "none", + # mix_times,#: Optional[list() = None, + # mix_vol: Optional[int] = None, + # mix_rate: Optional[int] = None, + # mix_liquid_height: Optional[float] = None, + # delays: Optional[List[int]] = None, + # none_keys: List[str] = [] + ): + # -------- Build Biomek transfer step -------- + # 1) Construct default parameter scaffold (values mirror Biomek “Transfer” block). + + transfer_params = { + "Span8": False, + "Pod": "Pod1", + "items": {}, # to be filled below + "Wash": False, + "Dynamic?": True, + "AutoSelectActiveWashTechnique": False, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": False, + "ChangeTipsBetweenSources": False, + "DefaultCaption": "", # filled after we know first pair/vol + "UseExpression": False, + "LeaveTipsOn": False, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": False, + "Replicates": "1", + "ShowTipHandlingDetails": False, + "ShowTransferDetails": True, + "Solvent": "Water", + "Span8Wash": False, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": False, + "SplitVolumeCleaning": False, + "Stop": "Destinations", + "TipLocation": "BC1025F", + "UseCurrentTips": False, + "UseDisposableTips": True, + "UseFixedTips": False, + "UseJIT": True, + "UseMandrelSelection": True, + "UseProbes": [True, True, True, True, True, True, True, True], + "WashCycles": "1", + "WashVolume": "110%", + "Wizard": False + } + + items: dict = {} + for idx, (src, dst) in enumerate(zip(sources, targets)): + items[str(idx)] = { + "Source": str(src), + "Destination": str(dst), + "Volume": asp_vols[idx] + } + transfer_params["items"] = items + transfer_params["Solvent"] = solvent if solvent else "Water" + transfer_params["TipLocation"] = TipLocation + + if len(tip_racks) == 1: + transfer_params['UseCurrentTips'] = True + elif len(tip_racks) > 1: + transfer_params["ChangeTipsBetweenDests"] = True + + return transfer_params + +action = transfer_liquid(sources=sources,targets=targets,tip_racks=tip_racks, asp_vols=asp_vols,solvent = solvent, TipLocation=TipLocation) +print(json.dumps(action,indent=2)) +# print(action) + + + + +""" + "transfer": { + + "items": {}, + "Wash": false, + "Dynamic?": true, + "AutoSelectActiveWashTechnique": false, + "ActiveWashTechnique": "", + "ChangeTipsBetweenDests": true, + "ChangeTipsBetweenSources": false, + "DefaultCaption": "Transfer 100 µL from P13 to P3", + "UseExpression": false, + "LeaveTipsOn": false, + "MandrelExpression": "", + "Repeats": "1", + "RepeatsByVolume": false, + "Replicates": "1", + "ShowTipHandlingDetails": true, + "ShowTransferDetails": true, + + "Span8Wash": false, + "Span8WashVolume": "2", + "Span8WasteVolume": "1", + "SplitVolume": false, + "SplitVolumeCleaning": false, + "Stop": "Destinations", + "TipLocation": "BC1025F", + "UseCurrentTips": false, + "UseDisposableTips": false, + "UseFixedTips": false, + "UseJIT": true, + "UseMandrelSelection": true, + "UseProbes": [true, true, true, true, true, true, true, true], + "WashCycles": "3", + "WashVolume": "110%", + "Wizard": false +""" + + + + diff --git a/unilabos/devices/liquid_handling/test liquid handler/sci-lucif-assay4.json b/unilabos/devices/liquid_handling/test liquid handler/sci-lucif-assay4.json new file mode 100644 index 00000000..012a1606 --- /dev/null +++ b/unilabos/devices/liquid_handling/test liquid handler/sci-lucif-assay4.json @@ -0,0 +1,4033 @@ +[ + { + "template": "transfer", + "sources": [ + { + "well": "A1", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A2", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A4", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A5", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A6", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A7", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A8", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A9", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A10", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A11", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A12", + "labware": "working plate", + "slot": 6 + } + ], + "targets": [ + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + } + ], + "tip_racks": [ + { + "well": "A1", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 8 + }, + { + "well": "A2", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 8 + }, + { + "well": "A3", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 8 + }, + { + "well": "A4", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 8 + }, + { + "well": "A5", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 8 + }, + { + "well": "A6", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 8 + }, + { + "well": "A7", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 8 + }, + { + "well": "A8", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 8 + }, + { + "well": "A9", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 8 + }, + { + "well": "A10", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 8 + }, + { + "well": "A11", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 8 + }, + { + "well": "A12", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 8 + } + ], + "use_channels": null, + "asp_vols": [ + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0 + ], + "asp_flow_rates": [ + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8 + ], + "disp_vols": [ + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0, + 120.0 + ], + "dis_flow_rates": [ + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0 + ], + "offsets": null, + "touch_tip": false, + "liquid_height": null, + "blow_out_air_volume": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "is_96_well": false, + "mix_stage": "none", + "mix_times": 0, + "mix_vol": null, + "mix_rate": null, + "mix_liquid_height": null, + "delays": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "top": [ + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5 + ], + "bottom": [ + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null + ], + "move": [ + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null + ], + "center": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "move_to": [ + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + } + ], + "mix_detail": [ + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + } + ] + }, + { + "template": "transfer", + "sources": [ + { + "well": "A1", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A1", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A1", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A1", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A1", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A1", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A1", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A1", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A1", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A1", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A1", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A1", + "labware": "reagent stock", + "slot": 3 + } + ], + "targets": [ + { + "well": "A1", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A2", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A4", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A5", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A6", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A7", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A8", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A9", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A10", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A11", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A12", + "labware": "working plate", + "slot": 6 + } + ], + "tip_racks": [ + { + "well": "A1", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 11 + } + ], + "use_channels": null, + "asp_vols": [ + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0 + ], + "asp_flow_rates": [ + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0 + ], + "disp_vols": [ + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0, + 70.0 + ], + "dis_flow_rates": [ + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2 + ], + "offsets": null, + "touch_tip": true, + "liquid_height": null, + "blow_out_air_volume": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "is_96_well": false, + "mix_stage": "none", + "mix_times": 0, + "mix_vol": null, + "mix_rate": null, + "mix_liquid_height": null, + "delays": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "top": [ + null, + -2, + null, + -2, + null, + -2, + null, + -2, + null, + -2, + null, + -2, + null, + -2, + null, + -2, + null, + -2, + null, + -2, + null, + -2, + null, + -2 + ], + "bottom": [ + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null + ], + "move": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "center": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "move_to": [ + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + } + ], + "mix_detail": [ + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + } + ] + }, + { + "template": "transfer", + "sources": [ + { + "well": "A1", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A2", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A4", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A5", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A6", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A7", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A8", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A9", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A10", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A11", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A12", + "labware": "working plate", + "slot": 6 + } + ], + "targets": [ + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + }, + { + "well": "A1", + "labware": "waste", + "slot": 9 + } + ], + "tip_racks": [ + { + "well": "A2", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 11 + }, + { + "well": "A3", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 11 + }, + { + "well": "A4", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 11 + }, + { + "well": "A5", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 11 + }, + { + "well": "A6", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 11 + }, + { + "well": "A7", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 11 + }, + { + "well": "A8", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 11 + }, + { + "well": "A9", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 11 + }, + { + "well": "A10", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 11 + }, + { + "well": "A11", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 11 + }, + { + "well": "A12", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 11 + }, + { + "well": "A1", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 1 + } + ], + "use_channels": null, + "asp_vols": [ + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0 + ], + "asp_flow_rates": [ + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8, + 18.8 + ], + "disp_vols": [ + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0 + ], + "dis_flow_rates": [ + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0 + ], + "offsets": null, + "touch_tip": false, + "liquid_height": null, + "blow_out_air_volume": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "is_96_well": false, + "mix_stage": "none", + "mix_times": 0, + "mix_vol": null, + "mix_rate": null, + "mix_liquid_height": null, + "delays": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "top": [ + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5, + null, + -5 + ], + "bottom": [ + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null, + 0.2, + null + ], + "move": [ + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null, + [ + -2.5, + 0.0, + 0.0 + ], + null + ], + "center": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "move_to": [ + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + -0.2 + ], + "bottom": [ + null + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + } + ], + "mix_detail": [ + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + } + ] + }, + { + "template": "transfer", + "sources": [ + { + "well": "A2", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A2", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A2", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A2", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A2", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A2", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A2", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A2", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A2", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A2", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A2", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A2", + "labware": "reagent stock", + "slot": 3 + } + ], + "targets": [ + { + "well": "A1", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A2", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A4", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A5", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A6", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A7", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A8", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A9", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A10", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A11", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A12", + "labware": "working plate", + "slot": 6 + } + ], + "tip_racks": [ + { + "well": "A2", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 1 + } + ], + "use_channels": null, + "asp_vols": [ + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0 + ], + "asp_flow_rates": [ + 47.0, + 47.0, + 47.0, + 47.0, + 47.0, + 47.0, + 47.0, + 47.0, + 47.0, + 47.0, + 47.0, + 47.0 + ], + "disp_vols": [ + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0, + 30.0 + ], + "dis_flow_rates": [ + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2, + 28.2 + ], + "offsets": null, + "touch_tip": true, + "liquid_height": null, + "blow_out_air_volume": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "is_96_well": false, + "mix_stage": "none", + "mix_times": 0, + "mix_vol": null, + "mix_rate": null, + "mix_liquid_height": null, + "delays": [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 0 + ], + "top": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "bottom": [ + 0.5, + 5, + 0.5, + 5, + 0.5, + 5, + 0.5, + 5, + 0.5, + 5, + 0.5, + 5, + 0.5, + 5, + 0.5, + 5, + 0.5, + 5, + 0.5, + 5, + 0.5, + 5, + 0.5, + 5 + ], + "move": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "center": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "move_to": [ + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + } + ], + "mix_detail": [ + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + } + ] + }, + { + "template": "transfer", + "sources": [ + { + "well": "A3", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A1", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A1", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A1", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A2", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A2", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A2", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A3", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A4", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A4", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A4", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A5", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A5", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A5", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A6", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A6", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A6", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A7", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A7", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A7", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A8", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A8", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A8", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A9", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A9", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A9", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A10", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A10", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A10", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A11", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A11", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A11", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "reagent stock", + "slot": 3 + }, + { + "well": "A12", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A12", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A12", + "labware": "working plate", + "slot": 6 + } + ], + "targets": [ + { + "well": "A1", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A1", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A1", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A1", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A2", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A2", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A2", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A2", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A3", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A4", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A4", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A4", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A4", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A5", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A5", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A5", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A5", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A6", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A6", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A6", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A6", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A7", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A7", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A7", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A7", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A8", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A8", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A8", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A8", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A9", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A9", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A9", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A9", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A10", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A10", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A10", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A10", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A11", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A11", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A11", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A11", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A12", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A12", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A12", + "labware": "working plate", + "slot": 6 + }, + { + "well": "A12", + "labware": "working plate", + "slot": 6 + } + ], + "tip_racks": [ + { + "well": "A3", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 1 + }, + { + "well": "A4", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 1 + }, + { + "well": "A5", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 1 + }, + { + "well": "A6", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 1 + }, + { + "well": "A7", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 1 + }, + { + "well": "A8", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 1 + }, + { + "well": "A9", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 1 + }, + { + "well": "A10", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 1 + }, + { + "well": "A11", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 1 + }, + { + "well": "A12", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 1 + }, + { + "well": "A1", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 4 + }, + { + "well": "A2", + "type": "Opentrons OT-2 96 Tip Rack 300 \u00b5L", + "slot": 4 + } + ], + "use_channels": null, + "asp_vols": [ + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0 + ], + "asp_flow_rates": [ + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0 + ], + "disp_vols": [ + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0, + 75.0 + ], + "dis_flow_rates": [ + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0, + 282.0 + ], + "offsets": null, + "touch_tip": true, + "liquid_height": null, + "blow_out_air_volume": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "is_96_well": false, + "mix_stage": "after", + "mix_times": [ + 3 + ], + "mix_vol": 75.0, + "mix_rate": null, + "mix_liquid_height": null, + "delays": [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ], + "top": [ + null, + -0.5, + null, + -0.5, + null, + -0.5, + null, + -0.5, + null, + -0.5, + null, + -0.5, + null, + -0.5, + null, + -0.5, + null, + -0.5, + null, + -0.5, + null, + -0.5, + null, + -0.5 + ], + "bottom": [ + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null, + 0.5, + null + ], + "move": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "center": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "move_to": [ + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + } + ], + "mix_detail": [ + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + null + ], + "bottom": [ + 0.5 + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + null + ], + "bottom": [ + 0.5 + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + null + ], + "bottom": [ + 0.5 + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + null + ], + "bottom": [ + 0.5 + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + null + ], + "bottom": [ + 0.5 + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + null + ], + "bottom": [ + 0.5 + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + null + ], + "bottom": [ + 0.5 + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + null + ], + "bottom": [ + 0.5 + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + null + ], + "bottom": [ + 0.5 + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + null + ], + "bottom": [ + 0.5 + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + null + ], + "bottom": [ + 0.5 + ], + "move": [ + null + ], + "center": [ + false + ] + }, + { + "top": [], + "bottom": [], + "move": [], + "center": [] + }, + { + "top": [ + null + ], + "bottom": [ + 0.5 + ], + "move": [ + null + ], + "center": [ + false + ] + } + ] + } +] \ No newline at end of file diff --git a/unilabos/devices/pump_and_valve/solenoid_valve_mock.py b/unilabos/devices/pump_and_valve/solenoid_valve_mock.py index 08820ca0..b6735a3f 100644 --- a/unilabos/devices/pump_and_valve/solenoid_valve_mock.py +++ b/unilabos/devices/pump_and_valve/solenoid_valve_mock.py @@ -5,22 +5,22 @@ class SolenoidValveMock: def __init__(self, port: str = "COM6"): self._status = "Idle" self._valve_position = "OPEN" - + @property def status(self) -> str: return self._status - + @property def valve_position(self) -> str: return self._valve_position def get_valve_position(self) -> str: return self._valve_position - + def set_valve_position(self, position): self._status = "Busy" time.sleep(5) - + self._valve_position = position time.sleep(5) self._status = "Idle" diff --git a/unilabos/devices/pump_and_valve/vacuum_pump_mock.py b/unilabos/devices/pump_and_valve/vacuum_pump_mock.py index 3e330570..96a48426 100644 --- a/unilabos/devices/pump_and_valve/vacuum_pump_mock.py +++ b/unilabos/devices/pump_and_valve/vacuum_pump_mock.py @@ -4,17 +4,17 @@ import time class VacuumPumpMock: def __init__(self, port: str = "COM6"): self._status = "OPEN" - + @property def status(self) -> str: return self._status def get_status(self) -> str: return self._status - + def set_status(self, position): time.sleep(5) - + self._status = position time.sleep(5) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index bcddae55..eef04042 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -1,5 +1,6 @@ liquid_handler: description: Liquid handler device controlled by pylabrobot + icon: icon_yiyezhan.webp class: module: unilabos.devices.liquid_handling.liquid_handler_abstract:LiquidHandlerAbstract type: python @@ -22,8 +23,8 @@ liquid_handler: is_96_well: is_96_well top: top none_keys: none_keys - feedback: { } - result: { } + feedback: {} + result: {} add_liquid: type: LiquidHandlerAdd goal: @@ -43,8 +44,8 @@ liquid_handler: mix_rate: mix_rate mix_liquid_height: mix_liquid_height none_keys: none_keys - feedback: { } - result: { } + feedback: {} + result: {} transfer_liquid: type: LiquidHandlerTransfer goal: @@ -69,8 +70,8 @@ liquid_handler: mix_liquid_height: mix_liquid_height delays: delays none_keys: none_keys - feedback: { } - result: { } + feedback: {} + result: {} mix: type: LiquidHandlerMix goal: @@ -81,16 +82,16 @@ liquid_handler: offsets: offsets mix_rate: mix_rate none_keys: none_keys - feedback: { } - result: { } + feedback: {} + result: {} move_to: type: LiquidHandlerMoveTo goal: well: well dis_to_top: dis_to_top channel: channel - feedback: { } - result: { } + feedback: {} + result: {} aspirate: type: LiquidHandlerAspirate goal: @@ -245,6 +246,21 @@ liquid_handler: target_vols: target_vols aspiration_flow_rate: aspiration_flow_rate dispense_flow_rates: dispense_flow_rates + handles: + input: + - handler_key: liquid-input + label: Liquid Input + data_type: resource + io_type: target + data_source: handle + data_key: liquid + output: + - handler_key: liquid-output + label: Liquid Output + data_type: resource + io_type: source + data_source: executor + data_key: liquid schema: type: object properties: @@ -272,3 +288,174 @@ liquid_handler.revvity: status: status result: success: success + +liquid_handler.biomek: + description: Biomek液体处理器设备,基于pylabrobot控制 + icon: icon_yiyezhan.webp + class: + module: unilabos.devices.liquid_handling.biomek:LiquidHandlerBiomek + type: python + status_types: {} + action_value_mappings: + create_protocol: + type: LiquidHandlerProtocolCreation + goal: + protocol_name: protocol_name + protocol_description: protocol_description + protocol_version: protocol_version + protocol_author: protocol_author + protocol_date: protocol_date + protocol_type: protocol_type + none_keys: none_keys + feedback: {} + result: {} + run_protocol: + type: EmptyIn + goal: {} + feedback: {} + result: {} + transfer_liquid: + type: LiquidHandlerTransfer + goal: + asp_vols: asp_vols + dis_vols: dis_vols + sources: sources + targets: targets + tip_racks: tip_racks + use_channels: use_channels + asp_flow_rates: asp_flow_rates + dis_flow_rates: dis_flow_rates + offsets: offsets + touch_tip: touch_tip + liquid_height: liquid_height + blow_out_air_volume: blow_out_air_volume + spread: spread + is_96_well: is_96_well + mix_stage: mix_stage + mix_times: mix_times + mix_vol: mix_vol + mix_rate: mix_rate + mix_liquid_height: mix_liquid_height + delays: delays + none_keys: none_keys + feedback: {} + result: {} + handles: + input: + - handler_key: liquid-input + label: Liquid Input + data_type: resource + io_type: target + data_source: handle + data_key: liquid + output: + - handler_key: liquid-output + label: Liquid Output + data_type: resource + io_type: source + data_source: executor + data_key: liquid + transfer_biomek: + type: LiquidHandlerTransferBiomek + goal: + source: source + target: target + tip_rack: tip_rack + volume: volume + aspirate_techniques: aspirate_techniques + dispense_techniques: dispense_techniques + feedback: {} + result: {} + handles: + input: + - handler_key: sources + label: sources + data_type: resource + data_source: handle + data_key: liquid + - handler_key: targets + label: targets + data_type: resource + data_source: executor + data_key: liquid + - handler_key: tip_rack + label: tip_rack + data_type: resource + data_source: executor + data_key: liquid + output: + - handler_key: sources_out + label: sources + data_type: resource + data_source: handle + data_key: liquid + - handler_key: targets_out + label: targets + data_type: resource + data_source: executor + data_key: liquid + oscillation_biomek: + type: LiquidHandlerOscillateBiomek + goal: + rpm: rpm + time: time + feedback: {} + result: {} + handles: + input: + - handler_key: plate + label: plate + data_type: resource + data_source: handle + data_key: liquid + output: + - handler_key: plate_out + label: plate + data_type: resource + data_source: handle + data_key: liquid + move_biomek: + type: LiquidHandlerMoveBiomek + goal: + source: resource + target: target + feedback: {} + result: + name: name + handles: + input: + - handler_key: sources + label: sources + data_type: resource + data_source: handle + data_key: liquid + output: + - handler_key: targets + label: targets + data_type: resource + data_source: handle + data_key: liquid + incubation_biomek: + type: LiquidHandlerIncubateBiomek + goal: + time: time + feedback: {} + result: {} + handles: + input: + - handler_key: plate + label: plate + data_type: resource + data_source: handle + data_key: liquid + output: + - handler_key: plate_out + label: plate + data_type: resource + data_source: handle + data_key: liquid + schema: + type: object + properties: {} + required: [] + additionalProperties: false diff --git a/unilabos/registry/devices/pump_and_valve.yaml b/unilabos/registry/devices/pump_and_valve.yaml index 5fdd8606..fd5dd98e 100644 --- a/unilabos/registry/devices/pump_and_valve.yaml +++ b/unilabos/registry/devices/pump_and_valve.yaml @@ -23,20 +23,51 @@ syringe_pump_with_valve.runze: type: string description: The position of the valve required: - - status - - position - - valve_position + - status + - position + - valve_position additionalProperties: false - solenoid_valve.mock: description: Mock solenoid valve class: module: unilabos.devices.pump_and_valve.solenoid_valve_mock:SolenoidValveMock type: python + status_types: + status: String + valve_position: String + action_value_mappings: + open: + type: EmptyIn + goal: {} + feedback: {} + result: {} + close: + type: EmptyIn + goal: {} + feedback: {} + result: {} + handles: + input: + - handler_key: fluid-input + label: Fluid Input + data_type: fluid + output: + - handler_key: fluid-output + label: Fluid Output + data_type: fluid + init_param_schema: + type: object + properties: + port: + type: string + description: "通信端口" + default: "COM6" + required: + - port solenoid_valve: description: Solenoid valve class: module: unilabos.devices.pump_and_valve.solenoid_valve:SolenoidValve - type: python \ No newline at end of file + type: python diff --git a/unilabos/registry/devices/vacuum_and_purge.yaml b/unilabos/registry/devices/vacuum_and_purge.yaml index 236ceddc..b6108203 100644 --- a/unilabos/registry/devices/vacuum_and_purge.yaml +++ b/unilabos/registry/devices/vacuum_and_purge.yaml @@ -22,9 +22,76 @@ vacuum_pump.mock: string: string feedback: {} result: {} + handles: + input: + - handler_key: fluid-input + label: Fluid Input + data_type: fluid + io_type: target + data_source: handle + data_key: fluid_in + output: + - handler_key: fluid-output + label: Fluid Output + data_type: fluid + io_type: source + data_source: executor + data_key: fluid_out + init_param_schema: + type: object + properties: + port: + type: string + description: "通信端口" + default: "COM6" + required: + - port gas_source.mock: description: Mock gas source class: module: unilabos.devices.pump_and_valve.vacuum_pump_mock:VacuumPumpMock type: python + status_types: + status: String + action_value_mappings: + open: + type: EmptyIn + goal: {} + feedback: {} + result: {} + close: + type: EmptyIn + goal: {} + feedback: {} + result: {} + set_status: + type: StrSingleInput + goal: + string: string + feedback: {} + result: {} + handles: + input: + - handler_key: fluid-input + label: Fluid Input + data_type: fluid + io_type: target + data_source: handle + data_key: fluid_in + output: + - handler_key: fluid-output + label: Fluid Output + data_type: fluid + io_type: source + data_source: executor + data_key: fluid_out + init_param_schema: + type: object + properties: + port: + type: string + description: "通信端口" + default: "COM6" + required: + - port diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index fadfd5ec..d3a37338 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -4,4 +4,4 @@ workstation: module: unilabos.ros.nodes.presets.protocol_node:ROS2ProtocolNode type: ros2 schema: - properties: {} \ No newline at end of file + properties: {} diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index c68e0d8d..a1602727 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -25,9 +25,7 @@ class Registry: self.ResourceCreateFromOuterEasy = self._replace_type_with_class( "ResourceCreateFromOuterEasy", "host_node", f"动作 create_resource" ) - self.EmptyIn = self._replace_type_with_class( - "EmptyIn", "host_node", f"" - ) + self.EmptyIn = self._replace_type_with_class("EmptyIn", "host_node", f"") self.device_type_registry = {} self.resource_type_registry = {} self._setup_called = False # 跟踪setup是否已调用 @@ -66,6 +64,7 @@ class Registry: "goal_default": yaml.safe_load( io.StringIO(get_yaml_from_goal_type(self.ResourceCreateFromOuter.Goal)) ), + "handles": {}, }, "create_resource": { "type": self.ResourceCreateFromOuterEasy, @@ -86,6 +85,15 @@ class Registry: "goal_default": yaml.safe_load( io.StringIO(get_yaml_from_goal_type(self.ResourceCreateFromOuterEasy.Goal)) ), + "handles": { + "output": [{ + "handler_key": "Labware", + "label": "Labware", + "data_type": "resource", + "data_source": "handle", + "data_key": "liquid" + }] + }, }, "test_latency": { "type": self.EmptyIn, @@ -94,11 +102,14 @@ class Registry: "result": {"latency_ms": "latency_ms", "time_diff_ms": "time_diff_ms"}, "schema": ros_action_to_json_schema(self.EmptyIn), "goal_default": {}, + "handles": {}, }, }, }, "icon": "icon_device.webp", "registry_type": "device", + "handles": [], + "init_param_schema": {}, "schema": {"properties": {}, "additionalProperties": False, "type": "object"}, "file_path": "/", } @@ -132,6 +143,10 @@ class Registry: resource_info["description"] = "" if "icon" not in resource_info: resource_info["icon"] = "" + if "handles" not in resource_info: + resource_info["handles"] = [] + if "init_param_schema" not in resource_info: + resource_info["init_param_schema"] = {} resource_info["registry_type"] = "resource" self.resource_type_registry.update(data) logger.debug( @@ -194,6 +209,10 @@ class Registry: device_config["description"] = "" if "icon" not in device_config: device_config["icon"] = "" + if "handles" not in device_config: + device_config["handles"] = [] + if "init_param_schema" not in device_config: + device_config["init_param_schema"] = {} device_config["registry_type"] = "device" if "class" in device_config: # 处理状态类型 @@ -206,6 +225,8 @@ class Registry: # 处理动作值映射 if "action_value_mappings" in device_config["class"]: for action_name, action_config in device_config["class"]["action_value_mappings"].items(): + if "handles" not in action_config: + action_config["handles"] = [] if "type" in action_config: action_config["type"] = self._replace_type_with_class( action_config["type"], device_id, f"动作 {action_name}" diff --git a/unilabos/ros/msgs/message_converter.py b/unilabos/ros/msgs/message_converter.py index 11c7afd5..94b12cfe 100644 --- a/unilabos/ros/msgs/message_converter.py +++ b/unilabos/ros/msgs/message_converter.py @@ -131,7 +131,7 @@ _msg_converter: Dict[Type, Any] = { Bool: lambda x: Bool(data=bool(x)), str: str, String: lambda x: String(data=str(x)), - Point: lambda x: Point(x=x.x, y=x.y, z=x.z), + Point: lambda x: Point(x=x.x, y=x.y, z=x.z) if not isinstance(x, dict) else Point(x=x.get("x", 0), y=x.get("y", 0), z=x.get("z", 0)), Resource: lambda x: Resource( id=x.get("id", ""), name=x.get("name", ""), diff --git a/unilabos/ros/nodes/base_device_node.py b/unilabos/ros/nodes/base_device_node.py index 28b67aa4..67cdb6f9 100644 --- a/unilabos/ros/nodes/base_device_node.py +++ b/unilabos/ros/nodes/base_device_node.py @@ -1,5 +1,4 @@ import copy -import functools import json import threading import time @@ -20,16 +19,29 @@ from rclpy.service import Service from unilabos_msgs.action import SendCmd from unilabos_msgs.srv._serial_command import SerialCommand_Request, SerialCommand_Response -from unilabos.resources.graphio import convert_resources_to_type, convert_resources_from_type, resource_ulab_to_plr, \ - initialize_resources, list_to_nested_dict, dict_to_tree, resource_plr_to_ulab, tree_to_list +from unilabos.resources.graphio import ( + convert_resources_to_type, + convert_resources_from_type, + resource_ulab_to_plr, + initialize_resources, + dict_to_tree, + resource_plr_to_ulab, + tree_to_list, +) from unilabos.ros.msgs.message_converter import ( convert_to_ros_msg, convert_from_ros_msg, convert_from_ros_msg_with_mapping, - convert_to_ros_msg_with_mapping, ros_action_to_json_schema, + convert_to_ros_msg_with_mapping, ) -from unilabos_msgs.srv import ResourceAdd, ResourceGet, ResourceDelete, ResourceUpdate, ResourceList, \ - SerialCommand # type: ignore +from unilabos_msgs.srv import ( + ResourceAdd, + ResourceGet, + ResourceDelete, + ResourceUpdate, + ResourceList, + SerialCommand, +) # type: ignore from unilabos_msgs.msg import Resource # type: ignore from unilabos.ros.nodes.resource_tracker import DeviceNodeResourceTracker @@ -37,7 +49,7 @@ from unilabos.ros.x.rclpyx import get_event_loop from unilabos.ros.utils.driver_creator import ProtocolNodeCreator, PyLabRobotCreator, DeviceClassCreator from unilabos.utils.async_util import run_async_func from unilabos.utils.log import info, debug, warning, error, critical, logger -from unilabos.utils.type_check import get_type_class, TypeEncoder +from unilabos.utils.type_check import get_type_class, TypeEncoder, serialize_result_info T = TypeVar("T") @@ -292,7 +304,9 @@ class BaseROS2DeviceNode(Node, Generic[T]): self.create_ros_action_server(action_name, action_value_mapping) # 创建线程池执行器 - self._executor = ThreadPoolExecutor(max_workers=max(len(action_value_mappings), 1), thread_name_prefix=f"ROSDevice{self.device_id}") + self._executor = ThreadPoolExecutor( + max_workers=max(len(action_value_mappings), 1), thread_name_prefix=f"ROSDevice{self.device_id}" + ) # 创建资源管理客户端 self._resource_clients: Dict[str, Client] = { @@ -334,7 +348,9 @@ class BaseROS2DeviceNode(Node, Generic[T]): other_calling_param["slot"] = slot # 本地拿到这个物料,可能需要先做初始化? if isinstance(resources, list): - if len(resources) == 1 and isinstance(resources[0], list) and not initialize_full: # 取消,不存在的情况 + if ( + len(resources) == 1 and isinstance(resources[0], list) and not initialize_full + ): # 取消,不存在的情况 # 预先initialize过,以整组的形式传入 request.resources = [convert_to_ros_msg(Resource, resource_) for resource_ in resources[0]] elif initialize_full: @@ -349,6 +365,20 @@ class BaseROS2DeviceNode(Node, Generic[T]): response = rclient.call(request) # 应该先add_resource了 res.response = "OK" + # 如果driver自己就有assign的方法,那就使用driver自己的assign方法 + if hasattr(self.driver_instance, "create_resource"): + create_resource_func = getattr(self.driver_instance, "create_resource") + create_resource_func( + resource_tracker=self.resource_tracker, + resources=request.resources, + bind_parent_id=bind_parent_id, + bind_location=location, + liquid_input_slot=LIQUID_INPUT_SLOT, + liquid_type=ADD_LIQUID_TYPE, + liquid_volume=LIQUID_VOLUME, + slot_on_deck=slot, + ) + return res # 接下来该根据bind_parent_id进行assign了,目前只有plr可以进行assign,不然没有办法输入到物料系统中 resource = self.resource_tracker.figure_resource({"name": bind_parent_id}) # request.resources = [convert_to_ros_msg(Resource, resources)] @@ -359,6 +389,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): from pylabrobot.resources import Coordinate from pylabrobot.resources import OTDeck from pylabrobot.resources import Plate + contain_model = not isinstance(resource, Deck) if isinstance(resource, ResourcePLR): # resources.list() @@ -366,25 +397,38 @@ class BaseROS2DeviceNode(Node, Generic[T]): plr_instance = resource_ulab_to_plr(resources_tree[0], contain_model) if isinstance(plr_instance, Plate): empty_liquid_info_in = [(None, 0)] * plr_instance.num_items - for liquid_type, liquid_volume, liquid_input_slot in zip(ADD_LIQUID_TYPE, LIQUID_VOLUME, LIQUID_INPUT_SLOT): + for liquid_type, liquid_volume, liquid_input_slot in zip( + ADD_LIQUID_TYPE, LIQUID_VOLUME, LIQUID_INPUT_SLOT + ): empty_liquid_info_in[liquid_input_slot] = (liquid_type, liquid_volume) plr_instance.set_well_liquids(empty_liquid_info_in) if isinstance(resource, OTDeck) and "slot" in other_calling_param: resource.assign_child_at_slot(plr_instance, **other_calling_param) else: _discard_slot = other_calling_param.pop("slot", -1) - resource.assign_child_resource(plr_instance, Coordinate(location["x"], location["y"], location["z"]), **other_calling_param) - request2.resources = [convert_to_ros_msg(Resource, r) for r in tree_to_list([resource_plr_to_ulab(resource)])] + resource.assign_child_resource( + plr_instance, + Coordinate(location["x"], location["y"], location["z"]), + **other_calling_param, + ) + request2.resources = [ + convert_to_ros_msg(Resource, r) for r in tree_to_list([resource_plr_to_ulab(resource)]) + ] rclient2.call(request2) # 发送给ResourceMeshManager action_client = ActionClient( - self, SendCmd, "/devices/resource_mesh_manager/add_resource_mesh", callback_group=self.callback_group + self, + SendCmd, + "/devices/resource_mesh_manager/add_resource_mesh", + callback_group=self.callback_group, ) goal = SendCmd.Goal() - goal.command = json.dumps({ - "resources": resources, - "bind_parent_id": bind_parent_id, - }) + goal.command = json.dumps( + { + "resources": resources, + "bind_parent_id": bind_parent_id, + } + ) future = action_client.send_goal_async(goal, goal_uuid=uuid.uuid4()) def done_cb(*args): @@ -401,10 +445,16 @@ class BaseROS2DeviceNode(Node, Generic[T]): # noinspection PyTypeChecker self._service_server: Dict[str, Service] = { "query_host_name": self.create_service( - SerialCommand, f"/srv{self.namespace}/query_host_name", query_host_name_cb, callback_group=self.callback_group + SerialCommand, + f"/srv{self.namespace}/query_host_name", + query_host_name_cb, + callback_group=self.callback_group, ), "append_resource": self.create_service( - SerialCommand, f"/srv{self.namespace}/append_resource", append_resource, callback_group=self.callback_group + SerialCommand, + f"/srv{self.namespace}/append_resource", + append_resource, + callback_group=self.callback_group, ), } @@ -433,6 +483,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): registered_devices[self.device_id] = device_info from unilabos.config.config import BasicConfig from unilabos.ros.nodes.presets.host_node import HostNode + if not BasicConfig.is_host_mode: sclient = self.create_client(SerialCommand, "/node_info_update") # 启动线程执行发送任务 @@ -440,7 +491,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): target=self.send_slave_node_info, args=(sclient,), daemon=True, - name=f"ROSDevice{self.device_id}_send_slave_node_info" + name=f"ROSDevice{self.device_id}_send_slave_node_info", ).start() else: host_node = HostNode.get_instance(0) @@ -451,12 +502,18 @@ class BaseROS2DeviceNode(Node, Generic[T]): sclient.wait_for_service() request = SerialCommand.Request() from unilabos.config.config import BasicConfig - request.command = json.dumps({ - "SYNC_SLAVE_NODE_INFO": { - "machine_name": BasicConfig.machine_name, - "type": "slave", - "edge_device_id": self.device_id - }}, ensure_ascii=False, cls=TypeEncoder) + + request.command = json.dumps( + { + "SYNC_SLAVE_NODE_INFO": { + "machine_name": BasicConfig.machine_name, + "type": "slave", + "edge_device_id": self.device_id, + } + }, + ensure_ascii=False, + cls=TypeEncoder, + ) # 发送异步请求并等待结果 future = sclient.call_async(request) @@ -529,6 +586,11 @@ class BaseROS2DeviceNode(Node, Generic[T]): """创建动作执行回调函数""" async def execute_callback(goal_handle: ServerGoalHandle): + # 初始化结果信息变量 + execution_error = "" + execution_success = False + action_return_value = None + self.lab_logger().info(f"执行动作: {action_name}") goal = goal_handle.request @@ -568,7 +630,11 @@ class BaseROS2DeviceNode(Node, Generic[T]): current_resources.extend(response.resources) else: r = ResourceGet.Request() - r.id = action_kwargs[k]["id"] if v == "unilabos_msgs/Resource" else action_kwargs[k][0]["id"] + r.id = ( + action_kwargs[k]["id"] + if v == "unilabos_msgs/Resource" + else action_kwargs[k][0]["id"] + ) r.with_children = True response = await self._resource_clients["resource_get"].call_async(r) current_resources.extend(response.resources) @@ -591,7 +657,19 @@ class BaseROS2DeviceNode(Node, Generic[T]): if asyncio.iscoroutinefunction(ACTION): try: self.lab_logger().info(f"异步执行动作 {ACTION}") - future = ROS2DeviceNode.run_async_func(ACTION, **action_kwargs) + future = ROS2DeviceNode.run_async_func(ACTION, trace_error=False, **action_kwargs) + + def _handle_future_exception(fut): + nonlocal execution_error, execution_success, action_return_value + try: + action_return_value = fut.result() + execution_success = True + except Exception as e: + execution_error = traceback.format_exc() + error(f"异步任务 {ACTION.__name__} 报错了") + error(traceback.format_exc()) + + future.add_done_callback(_handle_future_exception) except Exception as e: self.lab_logger().error(f"创建异步任务失败: {traceback.format_exc()}") raise e @@ -600,9 +678,12 @@ class BaseROS2DeviceNode(Node, Generic[T]): future = self._executor.submit(ACTION, **action_kwargs) def _handle_future_exception(fut): + nonlocal execution_error, execution_success, action_return_value try: - fut.result() + action_return_value = fut.result() + execution_success = True except Exception as e: + execution_error = traceback.format_exc() error(f"同步任务 {ACTION.__name__} 报错了") error(traceback.format_exc()) @@ -693,6 +774,8 @@ class BaseROS2DeviceNode(Node, Generic[T]): for attr_name in result_msg_types.keys(): if attr_name in ["success", "reached_goal"]: setattr(result_msg, attr_name, True) + elif attr_name == "return_info": + setattr(result_msg, attr_name, serialize_result_info(execution_error, execution_success, action_return_value)) self.lab_logger().info(f"动作 {action_name} 完成并返回结果") return result_msg @@ -738,8 +821,8 @@ class ROS2DeviceNode: return cls._loop @classmethod - def run_async_func(cls, func, **kwargs): - return run_async_func(func, loop=cls._loop, **kwargs) + def run_async_func(cls, func, trace_error=True, **kwargs): + return run_async_func(func, loop=cls._loop, trace_error=trace_error, **kwargs) @property def driver_instance(self): @@ -791,7 +874,11 @@ class ROS2DeviceNode: self.resource_tracker = DeviceNodeResourceTracker() # use_pylabrobot_creator 使用 cls的包路径检测 - use_pylabrobot_creator = driver_class.__module__.startswith("pylabrobot") or driver_class.__name__ == "LiquidHandlerAbstract" + use_pylabrobot_creator = ( + driver_class.__module__.startswith("pylabrobot") + or driver_class.__name__ == "LiquidHandlerAbstract" + or driver_class.__name__ == "LiquidHandlerBiomek" + ) # TODO: 要在创建之前预先请求服务器是否有当前id的物料,放到resource_tracker中,让pylabrobot进行创建 # 创建设备类实例 diff --git a/unilabos/ros/nodes/presets/host_node.py b/unilabos/ros/nodes/presets/host_node.py index 732e8bbd..a869b13d 100644 --- a/unilabos/ros/nodes/presets/host_node.py +++ b/unilabos/ros/nodes/presets/host_node.py @@ -151,7 +151,7 @@ class HostNode(BaseROS2DeviceNode): mqtt_client.publish_registry(device_info["id"], device_info) for resource_info in lab_registry.obtain_registry_resource_info(): mqtt_client.publish_registry(resource_info["id"], resource_info) - + time.sleep(1) # 等待MQTT连接稳定 # 首次发现网络中的设备 self._discover_devices() @@ -203,8 +203,12 @@ class HostNode(BaseROS2DeviceNode): try: for bridge in self.bridges: if hasattr(bridge, "resource_add"): - self.lab_logger().info("[Host Node-Resource] Adding resources to bridge.") - resource_add_res = bridge.resource_add(add_schema(resource_with_parent_name)) + resource_start_time = time.time() + resource_add_res = bridge.resource_add(add_schema(resource_with_parent_name), True) + resource_end_time = time.time() + self.lab_logger().info( + f"[Host Node-Resource] 物料上传 {round(resource_end_time - resource_start_time, 5) * 1000} ms" + ) except Exception as ex: self.lab_logger().error("[Host Node-Resource] 添加物料出错!") self.lab_logger().error(traceback.format_exc()) @@ -610,13 +614,21 @@ class HostNode(BaseROS2DeviceNode): """获取结果回调""" result_msg = future.result().result result_data = convert_from_ros_msg(result_msg) + status = "success" + try: + ret = json.loads(result_data.get("return_info", "{}")) # 确保返回信息是有效的JSON + suc = ret.get("suc", False) + if not suc: + status = "failed" + except json.JSONDecodeError: + status = "failed" self.lab_logger().info(f"[Host Node] Result for {action_id} ({uuid_str}): success") self.lab_logger().debug(f"[Host Node] Result data: {result_data}") if uuid_str: for bridge in self.bridges: if hasattr(bridge, "publish_job_status"): - bridge.publish_job_status(result_data, uuid_str, "success") + bridge.publish_job_status(result_data, uuid_str, status, result_data.get("return_info", "{}")) def cancel_goal(self, goal_uuid: str) -> None: """取消目标""" @@ -856,7 +868,6 @@ class HostNode(BaseROS2DeviceNode): 测试网络延迟的action实现 通过5次ping-pong机制校对时间误差并计算实际延迟 """ - import time import uuid as uuid_module self.lab_logger().info("=" * 60) diff --git a/unilabos/utils/async_util.py b/unilabos/utils/async_util.py index ce97f5a1..0f50a730 100644 --- a/unilabos/utils/async_util.py +++ b/unilabos/utils/async_util.py @@ -5,7 +5,7 @@ from asyncio import get_event_loop from unilabos.utils.log import error -def run_async_func(func, *, loop=None, **kwargs): +def run_async_func(func, *, loop=None, trace_error=True, **kwargs): if loop is None: loop = get_event_loop() @@ -17,5 +17,6 @@ def run_async_func(func, *, loop=None, **kwargs): error(traceback.format_exc()) future = asyncio.run_coroutine_threadsafe(func(**kwargs), loop) - future.add_done_callback(_handle_future_exception) - return future \ No newline at end of file + if trace_error: + future.add_done_callback(_handle_future_exception) + return future diff --git a/unilabos/utils/type_check.py b/unilabos/utils/type_check.py index 7366652b..578eb93d 100644 --- a/unilabos/utils/type_check.py +++ b/unilabos/utils/type_check.py @@ -1,4 +1,4 @@ -import collections +import collections.abc import json from typing import get_origin, get_args @@ -21,3 +21,46 @@ class TypeEncoder(json.JSONEncoder): return str(obj)[8:-2] return super().default(obj) + +class ResultInfoEncoder(json.JSONEncoder): + """专门用于处理任务执行结果信息的JSON编码器""" + + def default(self, obj): + # 优先处理类型对象 + if isinstance(obj, type): + return str(obj)[8:-2] + + # 对于无法序列化的对象,统一转换为字符串 + try: + # 尝试调用 __dict__ 或者其他序列化方法 + if hasattr(obj, "__dict__"): + return obj.__dict__ + elif hasattr(obj, "_asdict"): # namedtuple + return obj._asdict() + elif hasattr(obj, "to_dict"): + return obj.to_dict() + elif hasattr(obj, "dict"): + return obj.dict() + else: + # 如果都不行,转换为字符串 + return str(obj) + except Exception: + # 如果转换失败,直接返回字符串表示 + return str(obj) + + +def serialize_result_info(error: str, suc: bool, return_value=None) -> str: + """ + 序列化任务执行结果信息 + + Args: + error: 错误信息字符串 + suc: 是否成功的布尔值 + return_value: 返回值,可以是任何类型 + + Returns: + JSON字符串格式的结果信息 + """ + result_info = {"error": error, "suc": suc, "return_value": return_value} + + return json.dumps(result_info, ensure_ascii=False, cls=ResultInfoEncoder) diff --git a/unilabos_msgs/CMakeLists.txt b/unilabos_msgs/CMakeLists.txt index 0cd6a1e3..3e98ce6e 100644 --- a/unilabos_msgs/CMakeLists.txt +++ b/unilabos_msgs/CMakeLists.txt @@ -29,6 +29,8 @@ set(action_files "action/HeatChillStart.action" "action/HeatChillStop.action" + "action/LiquidHandlerProtocolCreation.action" + "action/LiquidHandlerAspirate.action" "action/LiquidHandlerDiscardTips.action" "action/LiquidHandlerDispense.action" @@ -44,6 +46,11 @@ set(action_files "action/LiquidHandlerStamp.action" "action/LiquidHandlerTransfer.action" + "action/LiquidHandlerTransferBiomek.action" + "action/LiquidHandlerIncubateBiomek.action" + "action/LiquidHandlerMoveBiomek.action" + "action/LiquidHandlerOscillateBiomek.action" + "action/LiquidHandlerAdd.action" "action/LiquidHandlerMix.action" "action/LiquidHandlerMoveTo.action" diff --git a/unilabos_msgs/action/AGVTransfer.action b/unilabos_msgs/action/AGVTransfer.action index 06c8c8ef..0c301f47 100644 --- a/unilabos_msgs/action/AGVTransfer.action +++ b/unilabos_msgs/action/AGVTransfer.action @@ -4,6 +4,7 @@ string from_repo_position Resource to_repo string to_repo_position --- +string return_info bool success --- string status diff --git a/unilabos_msgs/action/Clean.action b/unilabos_msgs/action/Clean.action index 093a0dad..8fb9be1e 100644 --- a/unilabos_msgs/action/Clean.action +++ b/unilabos_msgs/action/Clean.action @@ -5,6 +5,7 @@ float64 volume # Optional. Volume of solvent to clean vessel with. float64 temp # Optional. Temperature to heat vessel to while cleaning. int32 repeats # Optional. Number of cleaning cycles to perform. --- +string return_info bool success --- string status diff --git a/unilabos_msgs/action/EmptyIn.action b/unilabos_msgs/action/EmptyIn.action index c44b70c0..e7f59d07 100644 --- a/unilabos_msgs/action/EmptyIn.action +++ b/unilabos_msgs/action/EmptyIn.action @@ -1,4 +1,4 @@ --- - +string return_info --- \ No newline at end of file diff --git a/unilabos_msgs/action/EvacuateAndRefill.action b/unilabos_msgs/action/EvacuateAndRefill.action index ed138dd5..22ffc659 100644 --- a/unilabos_msgs/action/EvacuateAndRefill.action +++ b/unilabos_msgs/action/EvacuateAndRefill.action @@ -3,6 +3,7 @@ string vessel string gas int32 repeats --- +string return_info bool success --- string status diff --git a/unilabos_msgs/action/Evaporate.action b/unilabos_msgs/action/Evaporate.action index 9638a9a8..45887f27 100644 --- a/unilabos_msgs/action/Evaporate.action +++ b/unilabos_msgs/action/Evaporate.action @@ -5,6 +5,7 @@ float64 temp float64 time float64 stir_speed --- +string return_info bool success --- string status diff --git a/unilabos_msgs/action/FloatSingleInput.action b/unilabos_msgs/action/FloatSingleInput.action index 2542d31f..52feed71 100644 --- a/unilabos_msgs/action/FloatSingleInput.action +++ b/unilabos_msgs/action/FloatSingleInput.action @@ -1,4 +1,5 @@ float64 float_in --- +string return_info bool success --- \ No newline at end of file diff --git a/unilabos_msgs/action/HeatChill.action b/unilabos_msgs/action/HeatChill.action index 1c7f8411..87ebf526 100644 --- a/unilabos_msgs/action/HeatChill.action +++ b/unilabos_msgs/action/HeatChill.action @@ -6,6 +6,7 @@ bool stir float64 stir_speed string purpose --- +string return_info bool success --- string status \ No newline at end of file diff --git a/unilabos_msgs/action/HeatChillStart.action b/unilabos_msgs/action/HeatChillStart.action index f9286937..565bad1e 100644 --- a/unilabos_msgs/action/HeatChillStart.action +++ b/unilabos_msgs/action/HeatChillStart.action @@ -3,6 +3,7 @@ string vessel float64 temp string purpose --- +string return_info bool success --- string status \ No newline at end of file diff --git a/unilabos_msgs/action/HeatChillStop.action b/unilabos_msgs/action/HeatChillStop.action index 88fc0293..280ca154 100644 --- a/unilabos_msgs/action/HeatChillStop.action +++ b/unilabos_msgs/action/HeatChillStop.action @@ -1,6 +1,7 @@ # Organic string vessel --- +string return_info bool success --- string status \ No newline at end of file diff --git a/unilabos_msgs/action/IntSingleInput.action b/unilabos_msgs/action/IntSingleInput.action index 0f8b7aaa..23aeec6f 100644 --- a/unilabos_msgs/action/IntSingleInput.action +++ b/unilabos_msgs/action/IntSingleInput.action @@ -1,4 +1,5 @@ int32 int_input --- +string return_info bool success --- \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerAdd.action b/unilabos_msgs/action/LiquidHandlerAdd.action index 0611b276..a17a61c4 100644 --- a/unilabos_msgs/action/LiquidHandlerAdd.action +++ b/unilabos_msgs/action/LiquidHandlerAdd.action @@ -15,6 +15,7 @@ int32 mix_rate float64 mix_liquid_height string[] none_keys --- +string return_info bool success --- # 反馈 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerAspirate.action b/unilabos_msgs/action/LiquidHandlerAspirate.action index 9ba17068..b8558617 100644 --- a/unilabos_msgs/action/LiquidHandlerAspirate.action +++ b/unilabos_msgs/action/LiquidHandlerAspirate.action @@ -7,5 +7,6 @@ float64[] liquid_height float64[] blow_out_air_volume string spread --- +string return_info bool success --- \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerDiscardTips.action b/unilabos_msgs/action/LiquidHandlerDiscardTips.action index a7c6f8ae..c2d290d0 100644 --- a/unilabos_msgs/action/LiquidHandlerDiscardTips.action +++ b/unilabos_msgs/action/LiquidHandlerDiscardTips.action @@ -3,6 +3,7 @@ int32[] use_channels --- # 结果字段 +string return_info bool success --- # 反馈字段 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerDispense.action b/unilabos_msgs/action/LiquidHandlerDispense.action index 73c4d0f4..e06e3753 100644 --- a/unilabos_msgs/action/LiquidHandlerDispense.action +++ b/unilabos_msgs/action/LiquidHandlerDispense.action @@ -8,6 +8,7 @@ int32[] blow_out_air_volume string spread --- # 结果字段 +string return_info bool success --- # 反馈字段 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerDropTips.action b/unilabos_msgs/action/LiquidHandlerDropTips.action index 76a5625b..46f7e493 100644 --- a/unilabos_msgs/action/LiquidHandlerDropTips.action +++ b/unilabos_msgs/action/LiquidHandlerDropTips.action @@ -6,6 +6,7 @@ geometry_msgs/Point[] offsets bool allow_nonzero_volume --- # 结果字段 +string return_info bool success --- # 反馈字段 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerDropTips96.action b/unilabos_msgs/action/LiquidHandlerDropTips96.action index b4b7dfcf..a32891f5 100644 --- a/unilabos_msgs/action/LiquidHandlerDropTips96.action +++ b/unilabos_msgs/action/LiquidHandlerDropTips96.action @@ -5,6 +5,7 @@ geometry_msgs/Point offset bool allow_nonzero_volume --- # 结果字段 +string return_info bool success --- # 反馈字段 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerIncubateBiomek.action b/unilabos_msgs/action/LiquidHandlerIncubateBiomek.action new file mode 100644 index 00000000..da9d7035 --- /dev/null +++ b/unilabos_msgs/action/LiquidHandlerIncubateBiomek.action @@ -0,0 +1,6 @@ +int32 time + +--- +string return_info +bool success +--- diff --git a/unilabos_msgs/action/LiquidHandlerMix.action b/unilabos_msgs/action/LiquidHandlerMix.action index 81d1b71c..99abe939 100644 --- a/unilabos_msgs/action/LiquidHandlerMix.action +++ b/unilabos_msgs/action/LiquidHandlerMix.action @@ -6,6 +6,7 @@ geometry_msgs/Point[] offsets float64 mix_rate string[] none_keys --- +string return_info bool success --- # 反馈 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerMoveBiomek.action b/unilabos_msgs/action/LiquidHandlerMoveBiomek.action new file mode 100644 index 00000000..b12feb1d --- /dev/null +++ b/unilabos_msgs/action/LiquidHandlerMoveBiomek.action @@ -0,0 +1,7 @@ +string source +string target + +--- +string return_info +bool success +--- diff --git a/unilabos_msgs/action/LiquidHandlerMoveLid.action b/unilabos_msgs/action/LiquidHandlerMoveLid.action index 41a51e58..0c5d7477 100644 --- a/unilabos_msgs/action/LiquidHandlerMoveLid.action +++ b/unilabos_msgs/action/LiquidHandlerMoveLid.action @@ -12,6 +12,7 @@ string put_direction float64 pickup_distance_from_top --- # 结果字段 +string return_info bool success --- # 反馈字段 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerMovePlate.action b/unilabos_msgs/action/LiquidHandlerMovePlate.action index ea7503a1..6ad283db 100644 --- a/unilabos_msgs/action/LiquidHandlerMovePlate.action +++ b/unilabos_msgs/action/LiquidHandlerMovePlate.action @@ -13,6 +13,7 @@ string put_direction float64 pickup_distance_from_top --- # 结果字段 +string return_info bool success --- # 反馈字段 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerMoveResource.action b/unilabos_msgs/action/LiquidHandlerMoveResource.action index aaffa968..776d6cee 100644 --- a/unilabos_msgs/action/LiquidHandlerMoveResource.action +++ b/unilabos_msgs/action/LiquidHandlerMoveResource.action @@ -12,6 +12,7 @@ string get_direction string put_direction --- # 结果字段 +string return_info bool success --- # 反馈字段 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerMoveTo.action b/unilabos_msgs/action/LiquidHandlerMoveTo.action index 740d0fc6..0a9e1fe2 100644 --- a/unilabos_msgs/action/LiquidHandlerMoveTo.action +++ b/unilabos_msgs/action/LiquidHandlerMoveTo.action @@ -2,6 +2,7 @@ Resource well float64 dis_to_top int32 channel --- +string return_info bool success --- # 反馈 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerOscillateBiomek.action b/unilabos_msgs/action/LiquidHandlerOscillateBiomek.action new file mode 100644 index 00000000..b07eb76d --- /dev/null +++ b/unilabos_msgs/action/LiquidHandlerOscillateBiomek.action @@ -0,0 +1,7 @@ +int32 rpm +int32 time + +--- +string return_info +bool success +--- diff --git a/unilabos_msgs/action/LiquidHandlerPickUpTips.action b/unilabos_msgs/action/LiquidHandlerPickUpTips.action index 096bf17e..89287d91 100644 --- a/unilabos_msgs/action/LiquidHandlerPickUpTips.action +++ b/unilabos_msgs/action/LiquidHandlerPickUpTips.action @@ -5,6 +5,7 @@ int32[] use_channels geometry_msgs/Point[] offsets --- # 结果字段 +string return_info bool success --- # 反馈字段 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerPickUpTips96.action b/unilabos_msgs/action/LiquidHandlerPickUpTips96.action index 761349a1..63a60b4a 100644 --- a/unilabos_msgs/action/LiquidHandlerPickUpTips96.action +++ b/unilabos_msgs/action/LiquidHandlerPickUpTips96.action @@ -4,6 +4,7 @@ Resource tip_rack geometry_msgs/Point offset --- # 结果字段 +string return_info bool success --- # 反馈字段 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerProtocolCreation.action b/unilabos_msgs/action/LiquidHandlerProtocolCreation.action new file mode 100644 index 00000000..c63525a5 --- /dev/null +++ b/unilabos_msgs/action/LiquidHandlerProtocolCreation.action @@ -0,0 +1,10 @@ +string protocol_name +string protocol_description +string protocol_version +string protocol_author +string protocol_date +string protocol_type +string[] none_keys +--- +string return_info +--- diff --git a/unilabos_msgs/action/LiquidHandlerRemove.action b/unilabos_msgs/action/LiquidHandlerRemove.action index e6b43c53..2b2656e5 100644 --- a/unilabos_msgs/action/LiquidHandlerRemove.action +++ b/unilabos_msgs/action/LiquidHandlerRemove.action @@ -12,6 +12,7 @@ bool is_96_well float64[] top string[] none_keys --- +string return_info bool success --- # 反馈 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerReturnTips.action b/unilabos_msgs/action/LiquidHandlerReturnTips.action index 25d15965..0c3b366c 100644 --- a/unilabos_msgs/action/LiquidHandlerReturnTips.action +++ b/unilabos_msgs/action/LiquidHandlerReturnTips.action @@ -4,6 +4,7 @@ int32[] use_channels bool allow_nonzero_volume --- # 结果字段 +string return_info bool success --- # 反馈字段 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerReturnTips96.action b/unilabos_msgs/action/LiquidHandlerReturnTips96.action index fd20d712..da670e5f 100644 --- a/unilabos_msgs/action/LiquidHandlerReturnTips96.action +++ b/unilabos_msgs/action/LiquidHandlerReturnTips96.action @@ -3,6 +3,7 @@ bool allow_nonzero_volume --- # 结果字段 +string return_info bool success --- # 反馈字段 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerStamp.action b/unilabos_msgs/action/LiquidHandlerStamp.action index a7db4bf2..383eee3e 100644 --- a/unilabos_msgs/action/LiquidHandlerStamp.action +++ b/unilabos_msgs/action/LiquidHandlerStamp.action @@ -7,6 +7,7 @@ float64 aspiration_flow_rate float64 dispense_flow_rate --- # 结果字段 +string return_info bool success --- # 反馈字段 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerTransfer.action b/unilabos_msgs/action/LiquidHandlerTransfer.action index 39df59bb..6130f20c 100644 --- a/unilabos_msgs/action/LiquidHandlerTransfer.action +++ b/unilabos_msgs/action/LiquidHandlerTransfer.action @@ -20,6 +20,7 @@ float64 mix_liquid_height int32[] delays string[] none_keys --- +string return_info bool success --- # 反馈 \ No newline at end of file diff --git a/unilabos_msgs/action/LiquidHandlerTransferBiomek.action b/unilabos_msgs/action/LiquidHandlerTransferBiomek.action new file mode 100644 index 00000000..cee47bc7 --- /dev/null +++ b/unilabos_msgs/action/LiquidHandlerTransferBiomek.action @@ -0,0 +1,11 @@ +string source +string target +string tip_rack +float64 volume +string aspirate_technique +string dispense_technique + +--- +string return_info +bool success +--- diff --git a/unilabos_msgs/action/Point3DSeparateInput.action b/unilabos_msgs/action/Point3DSeparateInput.action index 4e15e8f8..5d24125e 100644 --- a/unilabos_msgs/action/Point3DSeparateInput.action +++ b/unilabos_msgs/action/Point3DSeparateInput.action @@ -2,5 +2,6 @@ float64 x float64 y float64 z --- +string return_info bool success --- \ No newline at end of file diff --git a/unilabos_msgs/action/PumpTransfer.action b/unilabos_msgs/action/PumpTransfer.action index bbe6cb1e..69d22b6c 100644 --- a/unilabos_msgs/action/PumpTransfer.action +++ b/unilabos_msgs/action/PumpTransfer.action @@ -10,6 +10,7 @@ float64 rinsing_volume int32 rinsing_repeats bool solid --- +string return_info bool success --- string status diff --git a/unilabos_msgs/action/ResourceCreateFromOuter.action b/unilabos_msgs/action/ResourceCreateFromOuter.action index e0eeb1c7..57330758 100644 --- a/unilabos_msgs/action/ResourceCreateFromOuter.action +++ b/unilabos_msgs/action/ResourceCreateFromOuter.action @@ -4,5 +4,6 @@ string[] bind_parent_ids geometry_msgs/Point[] bind_locations string[] other_calling_params --- +string return_info bool success --- \ No newline at end of file diff --git a/unilabos_msgs/action/ResourceCreateFromOuterEasy.action b/unilabos_msgs/action/ResourceCreateFromOuterEasy.action index cc832a71..b4adaed9 100644 --- a/unilabos_msgs/action/ResourceCreateFromOuterEasy.action +++ b/unilabos_msgs/action/ResourceCreateFromOuterEasy.action @@ -8,5 +8,6 @@ string[] liquid_type float32[] liquid_volume int32 slot_on_deck --- +string return_info bool success --- diff --git a/unilabos_msgs/action/SendCmd.action b/unilabos_msgs/action/SendCmd.action index cc883204..6f453f6e 100644 --- a/unilabos_msgs/action/SendCmd.action +++ b/unilabos_msgs/action/SendCmd.action @@ -1,6 +1,7 @@ # Simple string command --- +string return_info bool success --- string status diff --git a/unilabos_msgs/action/Separate.action b/unilabos_msgs/action/Separate.action index 502b420c..fe8976a7 100644 --- a/unilabos_msgs/action/Separate.action +++ b/unilabos_msgs/action/Separate.action @@ -13,6 +13,7 @@ float64 stir_time # Optional. Time stir for after adding solvent, before separat float64 stir_speed # Optional. Speed to stir at after adding solvent, before separation of phases. float64 settling_time # Optional. Time --- +string return_info bool success --- string status diff --git a/unilabos_msgs/action/SolidDispenseAddPowderTube.action b/unilabos_msgs/action/SolidDispenseAddPowderTube.action index 674c4ffc..db0924e1 100644 --- a/unilabos_msgs/action/SolidDispenseAddPowderTube.action +++ b/unilabos_msgs/action/SolidDispenseAddPowderTube.action @@ -2,6 +2,7 @@ int32 powder_tube_number string target_tube_position float64 compound_mass --- +string return_info float64 actual_mass_mg bool success --- \ No newline at end of file diff --git a/unilabos_msgs/action/Stir.action b/unilabos_msgs/action/Stir.action index defbed34..9542f9dc 100644 --- a/unilabos_msgs/action/Stir.action +++ b/unilabos_msgs/action/Stir.action @@ -3,6 +3,7 @@ float64 stir_time float64 stir_speed float64 settling_time --- +string return_info bool success --- string status \ No newline at end of file diff --git a/unilabos_msgs/action/StrSingleInput.action b/unilabos_msgs/action/StrSingleInput.action index bb762a58..bac365bc 100644 --- a/unilabos_msgs/action/StrSingleInput.action +++ b/unilabos_msgs/action/StrSingleInput.action @@ -1,4 +1,5 @@ string string --- +string return_info bool success --- \ No newline at end of file diff --git a/unilabos_msgs/action/WorkStationRun.action b/unilabos_msgs/action/WorkStationRun.action index ea75668d..5ca9fd4e 100644 --- a/unilabos_msgs/action/WorkStationRun.action +++ b/unilabos_msgs/action/WorkStationRun.action @@ -3,6 +3,7 @@ string wf_name string params Resource resource --- +string return_info bool success --- string status